Skip to main content

I am trying to extract getVertexIndices from a mesh and I have to implement a loop when I use the getVertexIndices() method. Also, I am getting different sizes of the list coming through the getVertexIndices() method. Is there a way to get the list of all vertex indices at once and of uniform size?  @daveatsafe​ @Takashi Iijima​ @Hans van der Maarel​ 

Hi @rishi1804​ ,

If you would like to get vertex indices iteratively for each part with FMEMeshPartIterator.getVertexIndices() in Python FME API, this code may be a template.

import fme
import fmeobjects
 
class FeatureProcessor(object):
    def __init__(self):
        pass
  
    def input(self, feature: fmeobjects.FMEFeature):
        # Assuming geometry type of the input feature is FMEMesh 
        mesh = feature.getGeometry()
        for part in mesh:
            indices = part.getVertexIndices()
            print(indices)
            
        self.pyoutput(feature)
 
    def close(self):
        pass

 


Hi @rishi1804​ ,

If you would like to get vertex indices iteratively for each part with FMEMeshPartIterator.getVertexIndices() in Python FME API, this code may be a template.

import fme
import fmeobjects
 
class FeatureProcessor(object):
    def __init__(self):
        pass
  
    def input(self, feature: fmeobjects.FMEFeature):
        # Assuming geometry type of the input feature is FMEMesh 
        mesh = feature.getGeometry()
        for part in mesh:
            indices = part.getVertexIndices()
            print(indices)
            
        self.pyoutput(feature)
 
    def close(self):
        pass

 

Thanks for your response @Takashi Iijima​  I am already extracting vertex Indices iteratively 

for part in mesh:
   indices = part.getVertexIndices()

and appending the indices to a list but for big elements it's taking a lot of time(15-20 minutes for some elements). So I am looking for an alternate option. Also getVertexIndices() method returns a list of different sizes for different elements, I mean it's not fixed ex: m0,2, 1, 0]  for one element and m 258955,258956, 258957,258958, 258959,258960,258961,258962,258963,258964,258955] so it's not an appropriate input for the Python code I use after getting a list of these indices. 


Thanks for your response @Takashi Iijima​  I am already extracting vertex Indices iteratively 

for part in mesh:
   indices = part.getVertexIndices()

and appending the indices to a list but for big elements it's taking a lot of time(15-20 minutes for some elements). So I am looking for an alternate option. Also getVertexIndices() method returns a list of different sizes for different elements, I mean it's not fixed ex: e0,2, 1, 0]  for one element and n 258955,258956, 258957,258958, 258959,258960,258961,258962,258963,258964,258955] so it's not an appropriate input for the Python code I use after getting a list of these indices. 

I think there is no way to get vertex indices lists of all parts in a mesh geometry other than iterating to perform the getVertexIndices method for every part.

Is it your final goal to get the vertex indices list of all parts? 

 

I think it's natual that the number of vertices could be different depending on the shape of each part. What is the appropriate geometry structure for your Python processing? Do you expect that all parts are triangular faces?


Thanks for your response @Takashi Iijima​  I am already extracting vertex Indices iteratively 

for part in mesh:
   indices = part.getVertexIndices()

and appending the indices to a list but for big elements it's taking a lot of time(15-20 minutes for some elements). So I am looking for an alternate option. Also getVertexIndices() method returns a list of different sizes for different elements, I mean it's not fixed ex: e0,2, 1, 0]  for one element and n 258955,258956, 258957,258958, 258959,258960,258961,258962,258963,258964,258955] so it's not an appropriate input for the Python code I use after getting a list of these indices. 

Thanks @Takashi Iijima​ for your responses. I was also not able to find any alternate option for the getVertexIndices method. I made changes on my part to use the vertex indices list created using MeshPartIterator and the getVertexIndices method.


Thanks for your response @Takashi Iijima​  I am already extracting vertex Indices iteratively 

for part in mesh:
   indices = part.getVertexIndices()

and appending the indices to a list but for big elements it's taking a lot of time(15-20 minutes for some elements). So I am looking for an alternate option. Also getVertexIndices() method returns a list of different sizes for different elements, I mean it's not fixed ex: e0,2, 1, 0]  for one element and n 258955,258956, 258957,258958, 258959,258960,258961,258962,258963,258964,258955] so it's not an appropriate input for the Python code I use after getting a list of these indices. 

Hi @Takashi Iijima​ @daveatsafe​ For the FME Mesh type we have the getVertices method to fetch vertices and to get Vertex Indices, there is the getVertexIndices() method . Now I am dealing with fmeobjects.FMEAggregate class and I can't use these methods and I am not able to find suitable methods to do the same job in the documentation of this class. What are the possible ways to get the Vertices and Vertex Indices from this type of class? I tried typecasting but that doesn't seem to be working. 


Thanks for your response @Takashi Iijima​  I am already extracting vertex Indices iteratively 

for part in mesh:
   indices = part.getVertexIndices()

and appending the indices to a list but for big elements it's taking a lot of time(15-20 minutes for some elements). So I am looking for an alternate option. Also getVertexIndices() method returns a list of different sizes for different elements, I mean it's not fixed ex: e0,2, 1, 0]  for one element and n 258955,258956, 258957,258958, 258959,258960,258961,258962,258963,258964,258955] so it's not an appropriate input for the Python code I use after getting a list of these indices. 

I'm still not sure what is your goal, but if you just need to extract all the coordinates from geometry of a feature, try using FMEFeature.getAllCoordinates() method. 


Thanks for your response @Takashi Iijima​  I am already extracting vertex Indices iteratively 

for part in mesh:
   indices = part.getVertexIndices()

and appending the indices to a list but for big elements it's taking a lot of time(15-20 minutes for some elements). So I am looking for an alternate option. Also getVertexIndices() method returns a list of different sizes for different elements, I mean it's not fixed ex: e0,2, 1, 0]  for one element and n 258955,258956, 258957,258958, 258959,258960,258961,258962,258963,258964,258955] so it's not an appropriate input for the Python code I use after getting a list of these indices. 

My ultimate goal is to generate footprint of Models(dgn,rvt,dwg).In FME, there is a transformer SurfaceFootPrintReplacer for this purpose, but it fails to generate footprints for complex geometries. Therefore, I am using Python to generate footprints, and for that, I need the vertices and faces (vertex indices) of each element. If the feature is an FMEMesh, I can obtain the vertices and vertex indices using appropriate methods provided by FME. However, for Revit, I am receiving features of type FMEAggregate. Now, I am looking for a way to retrieve the vertices and vertex indices of the FME Aggregate type. I have explored the FME Aggregate feature, and it contains FME CompositeSurfaces. These FME CompositeSurfaces have FME Faces, but ultimately, I am unsure how to obtain the kind list that getVertexIndices generates for FME Mesh


Thanks for your response @Takashi Iijima​  I am already extracting vertex Indices iteratively 

for part in mesh:
   indices = part.getVertexIndices()

and appending the indices to a list but for big elements it's taking a lot of time(15-20 minutes for some elements). So I am looking for an alternate option. Also getVertexIndices() method returns a list of different sizes for different elements, I mean it's not fixed ex: e0,2, 1, 0]  for one element and n 258955,258956, 258957,258958, 258959,258960,258961,258962,258963,258964,258955] so it's not an appropriate input for the Python code I use after getting a list of these indices. 

The geometry data structure of CopmositeSurface is different from Mesh, it doesn't have a concept of vertex indices, so there is no Python method to retrieve such a list simply. A possible way is to use GeometryCoercer to transform a CompositeSurface to a Mesh geometry, before your Python script.

 

I'm not sure why SufaceFootPrintReplacer doesn't work for you, but if it cannot be used for any reason, how about using 2DForcer and Dissolver instead? If the input model contains vertical faces, those footprints will be rejected by the Dissolver, but you can just ignore them. 


Reply