How to get the total length of an edge (from mesh) in Mechanical via Scripting?

Options
Rohith Patchigolla
Rohith Patchigolla Member, Moderator, Employee Posts: 115
First Answer First Anniversary Name Dropper Solution Developer Community of Practice Member

I would like to extract length of an edge. Not from Geometry but from Mesh, as geometric length and length based on summing up individual element edge lengths is different.

Best Answer

  • Rohith Patchigolla
    Rohith Patchigolla Member, Moderator, Employee Posts: 115
    First Answer First Anniversary Name Dropper Solution Developer Community of Practice Member
    Answer ✓
    Options

    Please use the below script to extract the total length of all element edges corresponding to edges in a selected named selection

    import math
    
    ################################################################
    #Input
    # Provide the name of the Edge Named Selection
    EdgeNamedSelection = DataModel.GetObjectsByName('Selection')[0]
    ################################################################
    
    #####################################################
    # Distance calculation function
    def CalculateDistance(i,j):
        Nodei_xyz = MeshDetails.NodeXYZById(i)
        Nodej_xyz = MeshDetails.NodeXYZById(j)
        dx = Nodei_xyz[0]-Nodej_xyz[0]
        dy = Nodei_xyz[1]-Nodej_xyz[1]
        dz = Nodei_xyz[2]-Nodej_xyz[2]
        d = dx **2 + dy ** 2 + dz**2
        return math.sqrt(d)*1000
    #####################################################
    
    
    MeshDetails=DataModel.MeshDataByName(DataModel.MeshDataNames[0])
    
    EdgeNodes=[]
    for edge in EdgeNamedSelection.Location:
        EdgeNodes.extend(MeshDetails.MeshRegionById(edge).NodeIds)
    
    EdgeElements = MeshDetails.ElementIdsFromNodeIds(EdgeNodes)
    EdgeElements = sorted(EdgeElements)
    
    EdgeLength = 0
    DistancePairs = []
    for E in EdgeElements:
        print('')
        print('')
        ElementNodes = sorted(MeshDetails.ElementById(E).NodeIds)
        NodesOnEdge = [N for N in ElementNodes if N in EdgeNodes]
        if NodesOnEdge in DistancePairs:
            # It means that this distance was calculated before ..
            continue
        if len(NodesOnEdge)==3:
            print('ELEMENT :',E)
            Node1 = NodesOnEdge[0]
            Node2 = NodesOnEdge[1]
            Node3= NodesOnEdge[2]
            D = [[CalculateDistance(Node1,Node2),Node1,Node2]]
            D += [[CalculateDistance(Node1,Node3),Node1,Node3]]
            D += [[CalculateDistance(Node2,Node3),Node2,Node3]]
            D = sorted(D)
            print(D)
            print(D[0][0]+D[1][0])
            EdgeLength +=D[0][0]+D[1][0]
            print(' .. Distance from',D[0][1],'to',D[0][2],'is',D[0][0])
            print(' .. Distance from',D[1][1],'to',D[1][2],'is',D[1][0])
            print('.. Total edge distance :',EdgeLength)
        elif len(NodesOnEdge)==2:
            print('ELEMENT :',E)
            Node1 = NodesOnEdge[0]
            Node2 = NodesOnEdge[1]
            D = CalculateDistance(Node1,Node2)
            EdgeLength +=D
            print(' .. Distance from',Node1,'to',Node2,'is',D)
        else:
            continue
        DistancePairs +=[NodesOnEdge]
    
    print('TOTAL EDGE LENGTH :',EdgeLength)