2016-04-04 9 views
0

Python'da katı bir tetrahedrons ile bir xml vtk dosyası yazmam gerekiyor. Özellikle bir Polydata'da. Her kenarın x, y, z koordinatlarıyla bir dizi tetrahedronum var. Ben vtk.vtkXMLPolyDataWriter() kullanmayı deneyin ama bu (sadece 2D üçgenler) olsun:python vtk XMLPolyDataWriter yazma katı tetrahedronlar

enter image description here

Kodum:

Yani
#!/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() 

, nasıl bu dosyayı yazabilirim? Teşekkürler!

+0

PolyData katıları desteklemediğinden, çözüm PolyData yerine UnstructuredGrid kullanıyor muydu? – mululu

cevap

0

XML is information in tags. Bu bir serbest el jsonu. Yani işte başlıyoruz.

Şimdi, vtk veya özelliklerine aşina olmadığımı söyleyerek başlayayım, bu yüzden burada verdiğim kodun sizin amaçlarınıza hizmet etmesini umduğumda daha tatmin edici (önceden varolan bir vtk parçası) olmadığından emin değilim var olmak.

Bu küçük bir şey yazdığımı söyledi.

#!/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") 

Örneğiniz için böyle bir şeye benzeyen bir giriş dosyası yazar.

<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> 

Umarım bu yardımcı olur!

+1

Çok teşekkürler! Ama ben Mayavi openource projesinde çözüm buluyorum. Burada: http://docs.enthought.com/mayavi/mayavi/auto/example_unstructured_grid.html –

İlgili konular