Importing and exporting coordinates for an array of points

Hello All,

I have created a number of points, let's say for example 50 or a hundred points. Is it possible to export the point data to a file format (text file for example) where it can be imported later to create a spline or any other geometry using the Python API?

A second part to the question, how can I obtain the coordinates (x,y,z) of a point I draw in the GUI using a Python script? For a line for example we can get the start and end values, but I'm not sure how to do that for a single point.

Thank you for your time and help 😊

Not sure if that will solve your problems. To export results, go to the 'analysis' page, in the 'output view' section, right-click on the one you want to export, choose 'Imp/Export----Text Exporter'. Then in the properties section, click the 'Refresh' button and you can find the file in the FIle path folder.

To get coordinates, go to the 'model' page, choose the model, then click 'tool---Geometry'.

hi @mkn
here is some example code that exports the currently selected points as a csv file:

def dump_selected_points(fname):
    sel = XCoreModeling.GetActiveModel().SelectedEntities
    sel = XCoreModeling.CollectEntities(sel)
    with open(fname, "w") as file:
        for e in sel:
            if isinstance(e, XCoreModeling.Vertex):
                x = e.Position
                file.write("%g, %g, %g\n" % (x[0], x[1], x[2]))

Thank you, @fanruifu!

Thank you very much for your reply @bryn! I appreciate the help.

@bryn I am wondering if it is possible to specify groups of points rather than having to select the points manually. I have a large number of groups with points that I want to export to separate files, and selecting each and executing the code can be quite time consuming.

Thanks again!

the code will dump all points in a single file. this will work also if you select multiple groups.

  • sel = XCoreModeling.CollectEntities(sel) will recursively add all children of selected entities
  • if isinstance(e, XCoreModeling.Vertex): will filter out any non-Vertex entities, like groups, meshes, etc.

Thanks @bryn! That will dump them all points in a single file and I want the points in each group to be saved in a separate file. What I would like to do is carry out the same operation but for a certain group name rather than through selection.

@mkn
this could be done in different ways, but how about the following:

import os

def dump_selected_points(dir):
    for e in XCoreModeling.GetActiveModel().SelectedEntities:
        dump_recursively(e, dir)

def dump_recursively(entity, dir):
    sel = XCoreModeling.CollectEntities([entity])
    with open(os.path.join(dir, entity.Name + ".txt"), "w") as file:
        for e in sel:
            if isinstance(e, XCoreModeling.Vertex):
                x = e.Position
                file.write("%g, %g, %g\n" % (x[0], x[1], x[2]))

Thanks @bryn! Just to confirm directory here would be a list of text file names, correct?

Also, would it be possible to add the points from each group to a list while saving them to file? Sometimes I would need to do this to create splines or polylines using those point groups.

Thanks again!

  1. os.path.join(dir, entity.Name + ".txt") is a file path inside the directory dir. since the file name is taken from the entity name (depending on selection a group or some other entity), you should take care to assign unique names to the entities.

  2. yes, just collect the points x and return them.

Thanks! This what I did when adding elements to a single list:

pts = []
for e in sel:
if isinstance(e, xcm.Vertex):
x = e.Position
pts.append(x)

I'm not sure how to append to different lists.

I appreciate the help!

if you return the pts from dump_recursively, you can collect a list of list of points like so:

list_of_pts = []

for e in XCoreModeling.GetActiveModel().SelectedEntities:
    pts = dump_recursively(e) # returns the points list from inside a group
    list_of_pts.append(pts)

The code runs and 'txt' files are saved with the point coordinate, but 'list_of_pts' comes back empty for some odd reason.

@mkn how about you post your code. maybe somebody will show you where the bug is