2017-12-08 32 views
1

私は*.pvd形式の巨大なグリッドを持っています。上記のグリッドを構築する際に、いくつかのセルサイズの仕様が尊重されていることを確認したいと思います。これを行うには、(dx、dy、dz)を持つセルデータ配列を取得する必要がありますVTK:グリッドセルの太さ、幅、高さを読み取る方法は?

私はまず、Paraviewでこれをチェックしてみました。次に、さまざまな形式(vtk、vtu、ex2)でメッシュをエクスポートし、vtkモジュールを使用して、以下のコードのように、Pythonにファイルをインポートすることを決めました。残念ながら、メッシュのサイズはそれを禁止し、「サイズxのn個のセルを割り当てることができません」というエラーメッセージが表示されます。私は、このリーダーオブジェクトのメソッドや属性を閲覧するにもかかわらず

>>> from paraview.simple import * 
>>> my_vtk = OpenDataFile("my_mesh.vtk") 
>>> print dir(my_vtk) 

import vtk 
reader = vtk.vtkXMLUnstructuredGridReader() 
reader.SetFileName("my_mesh.vtu") 
reader.Update() 

最後に、のParaviewで私がpvdまたはvtk形式のいずれかでグリッドファイルを開くことができますのpythonシェルがありますグリッド上のジオメトリ情報をどこで取得するかについてはわかりません。私もsimple module documentationを参照して、私は本当にそれの周りに私の頭を包むことはできません。

したがって、paraview.servermanager.LegacyVTKReaderオブジェクトのセルのジオメトリに関する情報を取得するにはどうすればよいですか?

メモリの問題にもかかわらず、paraview GUIやvtkオブジェクトをPython vtkにロードするためのクルーギーでこれを達成する方法についての手掛かりも大歓迎です。このような曖昧な質問を申し訳ありませんが、私は実際に始めるべきかわかりません...

答えて

1

GetClientSideObject()here参照)を使用すると、Paraview PythonシェルでVTKオブジェクトを取得できます。その後、すべての通常のVTK Python関数を使用することができます。たとえば、あなたが代わりに

>>> from paraview.simple import * 
>>> currentSelection = GetActiveSource() 
>>> readerObj = currentSelection.GetClientSideObject() 
>>> unstructgrid = readerObj.GetOutput() 
>>> firstCell = unstructgrid.GetCell(0) 
>>> cellPoints = firstCell.GetPoints() 

シェルのParaview Pythonで次のように書くことができ、あなたはあるParaViewでProgrammable Filterを使用することができます。これにより、完全なVTK pythonモジュールやNumPyや他のモジュールへのアクセスが可能になります。あなたは、プログラマブルフィルタのスクリプトウィンドウでスクリプトを次のように入力することができます

import vtk as v 
import numpy as np 

inp = self.GetUnstructuredGridInput() 
cells = inp.GetCells() 
cells.InitTraversal() 
cellPtIds = v.vtkIdList() 
lenArr = v.vtkDoubleArray() 
lenArr.SetNumberOfComponents(3) 
lenArr.SetName('CellSize') 
while cells.GetNextCell(cellPtIds): 
    pts = [] 
    for i in range(cellPtIds.GetNumberOfIds()): 
     ptCoords = inp.GetPoint(cellPtIds.GetId(i)) 
     pts.append(ptCoords)  
    pts = np.array(pts) 
    dx = np.max(pts[:,0]) - np.min(pts[:,0]) 
    dy = np.max(pts[:,1]) - np.min(pts[:,1]) 
    dz = np.max(pts[:,2]) - np.min(pts[:,2]) 
    lenArr.InsertNextTuple3(dx, dy, dz) 
out = self.GetUnstructuredGridOutput() 
out.ShallowCopy(inp) 
out.GetCellData().AddArray(lenArr) 

のParaviewでは、あなたのパイプラインの「ProgrammableFilter1」アイコンを選択すると、新しいセルのデータ配列は、ドロップダウンから、あなたに利用できるようになります下のスクリーンショットに示すように上のスクリプトを変更して、データをファイルに保存して外部から分析することができます。

Paraview Screenshot

1

この情報は、情報タブに表示されています。

+0

恐ろしい!多くのコードがとても簡単です:-) –

+0

元のOPがこの回答を見つけることを願っています。また、PythonでGetClientSideObjectを実行する必要はありません.InfoObjectにはこの情報が含まれています –

関連する問題