Retrieving facets and point from VTK file in python

2024/10/14 12:26:24

I have a vtk file containing a 3d model,

I would like to extract the point coordinates and the facets.

Here is a minimal working example:

import vtk
import numpy
from vtk.util.numpy_support import vtk_to_numpyreader = vtk.vtkPolyDataReader()
reader.SetFileName('test.vtk')
reader.Update()polydata = reader.GetOutput()points = polydata.GetPoints()
array = points.GetData()
numpy_nodes = vtk_to_numpy(array)

This works as numpy_nodescontains the x,y,z coordinates of all points, but I am at loss to retrieve the list that relates the facets of this model to the corresponding points.

I tried:

facets= polydata.GetPolys()
array = facets.GetData()
numpy_nodes = vtk_to_numpy(array)

But then numpy_nodes is just a 1D array where I would expect a 2D array (size 3*number of facets) where the first dimension contains the number of the corresponding points to the facet (as in a .ply file).

Any advise on how to proceed would be welcome

Answer

You were almost there. To allow cells of different types (triangles, quads, etc.), the numpy array encodes the information with the following scheme:

numpyArray = [ n_0, id_0(0), id_0(1), ..., id_0(n0-1), n_1, id_1(0), id_1(1), ..., id_1(n1-1), ... n_i, id_i(0), id_i(1), ..., id_1(n1-1), ...]

If all polys are of the same kind, that is n_i==n for all i, simply reshape the 1D array to get something interpretable:

cells = polydata.GetPolys()
nCells = cells.GetNumberOfCells()
array = cells.GetData()
# This holds true if all polys are of the same kind, e.g. triangles.
assert(array.GetNumberOfValues()%nCells==0)
nCols = array.GetNumberOfValues()//nCells
numpy_cells = vtk_to_numpy(array)
numpy_cells = numpy_cells.reshape((-1,nCols))

The first column of numpy_cells can be dropped, because it contains just the number of points per cell. But the remaining columns contain the information you were looking for.

To be sure about the result, compare the output with the "traditional" way to collect the point ids:

def getCellIds(polydata):cells = polydata.GetPolys()ids = []idList = vtk.vtkIdList()cells.InitTraversal()while cells.GetNextCell(idList):for i in range(0, idList.GetNumberOfIds()):pId = idList.GetId(i)ids.append(pId)ids = np.array(ids)return idsnumpy_cells2 = getCellIds(polydata).reshape((-1,3))print(numpy_cells[:10,1:])
print(numpy_cells2[:10])
assert(np.array_equal(numpy_cells[:,1:], numpy_cells2))
https://en.xdnf.cn/q/69414.html

Related Q&A

Tensorflow: feed dict error: You must feed a value for placeholder tensor

I have one bug I cannot find out the reason. Here is the code:with tf.Graph().as_default():global_step = tf.Variable(0, trainable=False)images = tf.placeholder(tf.float32, shape = [FLAGS.batch_size,33,…

Pass many pieces of data from Python to C program

I have a Python script and a C program and I need to pass large quantities of data from Python script that call many times the C program. Right now I let the user choose between passing them with an AS…

Parse JavaScript to instrument code

I need to split a JavaScript file into single instructions. For examplea = 2; foo() function bar() {b = 5;print("spam"); }has to be separated into three instructions. (assignment, function ca…

Converting all files (.jpg to .png) from a directory in Python

Im trying to convert all files from a directory from .jpg to .png. The name should remain the same, just the format would change.Ive been doing some researches and came to this:from PIL import Image im…

AssertionError: Gaps in blk ref_locs when unstack() dataframe

I am trying to unstack() data in a Pandas dataframe, but I keep getting this error, and Im not sure why. Here is my code so far with a sample of my data. My attempt to fix it was to remove all rows whe…

Python does not consider distutils.cfg

I have tried everything given and the tutorials all point in the same direction about using mingw as a compiler in python instead of visual c++.I do have visual c++ and mingw both. Problem started comi…

Is it possible to dynamically generate commands in Python Click

Im trying to generate click commands from a configuration file. Essentially, this pattern:import click@click.group() def main():passcommands = [foo, bar, baz] for c in commands:def _f():print("I a…

Different accuracy between python keras and keras in R

I build a image classification model in R by keras for R.Got about 98% accuracy, while got terrible accuracy in python.Keras version for R is 2.1.3, and 2.1.5 in pythonfollowing is the R model code:mod…

Named Entity Recognition in aspect-opinion extraction using dependency rule matching

Using Spacy, I extract aspect-opinion pairs from a text, based on the grammar rules that I defined. Rules are based on POS tags and dependency tags, which is obtained by token.pos_ and token.dep_. Belo…

Python Socket : AttributeError: __exit__

I try to run example from : https://docs.python.org/3/library/socketserver.html#socketserver-tcpserver-example in my laptop but it didnt work.Server :import socketserverclass MyTCPHandler(socketserver.…