2016-04-04 12 views
0

xsmlのvtkファイルをソリッド四面体でPythonで書く必要があります。特にPolydataで。私は各エッジのx、y、z座標を持つ四面体の集合を持っています。どのように私は、このファイルを書き込むことができ、そうpython vtk XMLPolyDataWriter固体四面体を書く

#!/usr/bin/env python 
import vtk 

points = vtk.vtkPoints() 
points.InsertNextPoint(0, 0, 0) 
points.InsertNextPoint(1, 0, 0) 
points.InsertNextPoint(1, 1, 0) 
points.InsertNextPoint(0, 1, 1) 

tetra = vtk.vtkTetra() 

tetra.GetPointIds().SetId(0, 0) 
tetra.GetPointIds().SetId(1, 1) 
tetra.GetPointIds().SetId(2, 2) 
tetra.GetPointIds().SetId(3, 3) 

cellArray = vtk.vtkCellArray() 
cellArray.InsertNextCell(tetra) 

polydata = vtk.vtkPolyData() 
polydata.SetPoints(points) 
polydata.SetPolys(cellArray) 
polydata.Modified() 
if vtk.VTK_MAJOR_VERSION <= 5: 
    polydata.Update() 

writer = vtk.vtkXMLPolyDataWriter() 
writer.SetFileName("Primal_geo.vtp"); 
if vtk.VTK_MAJOR_VERSION <= 5: 
    writer.SetInput(polydata) 
else: 
    writer.SetInputData(polydata) 
writer.Write() 

:私のコードを

enter image description here

:私は(vtk.vtkXMLPolyDataWriterを使用しよう)が、私はこの(2Dのみの三角形)を取得しますか? ありがとう!

+0

PolyDataはソリッドをサポートしていないので、ソリューションは、ポリデータの代わりにUnstructuredGridを使用していたと思いますか? – mululu

答えて

0

XML is information in tags。それは自由な手jsonのようなものです。 だからここに行くよ。

ここで私はvtkやその機能に精通していないと言って始めましょう。私がここで提供するコードがあなたの目的に役立つことを願っていますが、より満足できるもの(既存のvtk)存在する。

それは私がこの小さなものを書いたと言った。

#!/usr/bin/env python 
import vtk 

class vtkXMLparser: 
    points = None 
    scellArray = None 
    def tagSplit(self,line): 
     for n,k in enumerate(line): 
      go = none 
      fin = none 
      if(k == ">"): 
       if(go == none): 
        if(n>0): 
         if(line[n-1]!="\\"): 
          go = n+1 
      if(go != none): 
       if(k == "<"): 
        if(n>0): 
         if(line[n-1]!="\\"): 
          if(n<len(line)-1): 
           if(line[n+1]=="/"): 
            fin = n+1 
     tag = line[fin+2:len(line)-1] 
     content = line[go:fin] 
     return([tag,content]) 

    def addNice(self,di,key,cont): 
     try: 
      di[key].append(cont) 
     except(KeyError): 
      di[key]=[] 
      di[key].append(cont) 

    def parse(self,f): 
     input = open(f,"r") 
     xml = input.read() 
     xml = xml.split("\n") 
     data = {} 
     for lineNumber,line in enumerate(xml): 
      parsedXmlLine = self.tagSplit(line) 
      self.addNice(data,parsedXmlLine[0],parsedXmlLine[1]) 
     self.self.points(data) 
     self.tetra(data) 
     self.write() 

    def self.points(self,di): 
     self.points = vtk.vtkself.points() 
     for point in di["point"]: 
      self.points.InsertNextPoint(eval(point)) 

    def tetra(self,di): 
     tetra = vtk.vtkTetra() 
     for id in di["tetra"]: 
      tetra.GetPointIds().SetId(eval(id)) 
     self.cellArray = vtk.vtkself.cellArray() 
     self.cellArray.InsertNextCell(tetra) 

    def write(self): 
     polydata = vtk.vtkPolyData() 
     polydata.Setself.points(self.points) 
     polydata.SetPolys(self.cellArray) 
     polydata.Modified() 
     if vtk.VTK_MAJOR_VERSION <= 5: 
      polydata.Update() 
     writer = vtk.vtkXMLPolyDataWriter() 
     writer.SetFileName("Primal_geo.vtp"); 
     if vtk.VTK_MAJOR_VERSION <= 5: 
      writer.SetInput(polydata) 
     else: 
      writer.SetInputData(polydata) 
     writer.Write() 

i = vtkXMLparser() 
i.parse("input.xml") 

あなたの例では、このような入力ファイルを作成します。

<point>0, 0, 0</point> 
<point>1, 0, 0</point> 
<point>1, 1, 0</point> 
<point>0, 1, 1</point> 

<tetra>0, 0</tetra> 
<tetra>1, 1</tetra> 
<tetra>2, 2</tetra> 
<tetra>3, 3</tetra> 

私はこれが役立つことを願っています!

+1

ありがとう!しかし、私はMayaviのオープンソースプロジェクトの解決策を見つけました。ここ:http://docs.enthought.com/mayavi/mayavi/auto/example_unstructured_grid.html –

関連する問題