Traversing the Geometry

The APIs for geometry data provide access to the underlying geometry that is attached in Mechanical. For example, the API could be used to determine the faces associated with an edge.

The basic hierarchy of the geometry is:

- Geometry
  - Assembly
    - Part
      - Body
        - Shell
        - Face
        - Edge
        - Vertex

An example Python function to traverse geometry data follows. Here, an object of type IGeoData is obtained from the object Analysis using the property GeoData. The object GeoData is then used to access the list of IGeoAssembly with the property Assembly. For each of the objects in this list, the property Parts is used to access the list of IGeoPart objects on the assembly. This pattern is repeated through the hierarchy of the geometry down to the vertices of each edge.

def traversegeometry(analysis):
    now = datetime.datetime.now()
    f = open("C:\\geoDump.txt",'w')    
    f.write("*.*.*.*.*.*.*.*\n")
    f.write(str(now)+"\n")
    # --- IGeometry Interface
    # +++ Properties and Methods
    # +++    Assemblies
    # +++    CellFromRefId
    # +++    SelectedRefIds
    geometry = analysis.GeoData
    assemblies = geometry.Assemblies
    assemblies_count = assemblies.Count
    # --- IGeoAssembly Interface
    # +++ Properties and Methods
    # +++    Name
    # +++    Parts
    for assembly in assemblies:
        assembly_name = assembly.Name
        parts = assembly.Parts
        parts_count = parts.Count
        # --- IGeoPart Interface
        # +++ Properties and Methods
        # +++    Name
        # +++    Bodies
        for part in parts:
            part_name = part.Name
            bodies = part.Bodies
            bodies_count = bodies.Count
            # --- IGeoBody Interface
            # +++ Properties and Methods
            # +++    Name
            # +++    Vertices
            # +++    Edges
            # +++    Faces
            # +++    Shells
            # +++    Material
            for body in bodies:
                faces = body.Faces
                faces_count = faces.Count
                # --- IGeoFace Interface
                # +++ Properties and Methods
                # +++    Body
                # +++    Shell
                # +++    Vertices
                # +++    Edges
                # +++    Loops
                # +++    Area
                # +++    SurfaceType
                # +++    PointAtParam
                # +++    PointsAtParams
                for face in faces:
                    edges = face.Edges
                    edges_count = edges.Count
                    # --- IGeoEdge Interface
                    # +++ Properties and Methods
                    # +++    Faces
                    # +++    Vertices
                    # +++    StartVertex
                    # +++    EndVertex
                    # +++    Length
                    # +++    CurveType
                    # +++    Extents
                    # +++    IsParamReversed
                    # +++    ParamAtPoint
                    # +++    PointAtParam
                    # +++    PointsAtParams
                    for edge in edges:
                        vertices = edge.Vertices
                        vertices_count = vertices.Count
                        # --- IGeoVertex Interface
                        # +++ Properties and Methods
                        # +++ Edges   
                        # +++ Faces   
                        # +++ Bodies   
                        # +++ X   
                        # +++ Y   
                        # +++ Z
                        for vertex in vertices:
                            xcoord = vertex.X
                            ycoord = vertex.Y
                            zcoord = vertex.Z
                            try:
                                f.write("      Vertex: "+vertex.ToString()+", X = "+xcoord.ToString()+", Y = "+ycoord.ToString()+", Z = "+zcoord.ToString()+"\n")
                            except:
                                continue
    f.close()
    return