2017-12-08 29 views
1

나는 *.pvd 형식의 거대한 격자를 가지고있다. 그리드를 작성할 때 일부 셀 크기 사양이 존중되었는지 확인하고 싶습니다. 이렇게하려면 내가 먼저 약간의 성공을받은 Paraview에서이를 확인하려VTK : 표 셀의 lenth, 너비 및 높이를 읽는 방법?

(DX, DY, DZ)와 셀의 데이터 배열을 얻어야한다. 그럼 아래의 코드와 같이 vtk 모듈을 사용하여 파이썬으로 다양한 형식 (VTK, VTU, EX2) 및 가져 오기 일에 메쉬를 수출하기로 결심. 불행히도, 메쉬의 크기는 그것을 금지하고 "크기 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 포맷으로 그리드 파일을 열 수 있습니다 파이썬 쉘이있다 , 나는 그리드상의 어떤 기하학 정보를 가져올 지에 관해서는 단서가 없다. 나는 또한 simple module documentation을 통해 탐색했고, 나는 정말로 그 주위에 내 머리를 감쌀 수 없다.

는 어떻게 하나는 paraview.servermanager.LegacyVTKReader 개체에서 세포의 구조에 대한 정보를 검색 할 수 있습니다?

메모리 문제에도 불구하고 파이썬 VTK에 VTK 객체를로드받은 Paraview의 GUI, 또는 kludge을 통해 이것을 달성하는 방법에 대한 어떤 단서도 매우 환영합니다. 그런 불투명 한 질문에 대해 미안하지만 어디서부터 시작해야할지 모르겠다.

답변

1

GetClientSideObject() (here 참조)을 사용하면 Paraview Python 셸에서 VTK 객체를 얻을 수있다. 그런 다음 모든 일반 VTK Python 함수를 사용할 수 있습니다. 예를 들어, 당신은 당신이받은 Paraview에서 Programmable Filter을 사용할 수 있습니다하여받은 Paraview 파이썬에서 다음 또는

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

쉘 쓸 수 있습니다. 이것은 전체 VTK 파이썬 모듈 및 심지어 NumPy 또는 다른 모듈에 대한 액세스를 허용합니다. 당신이 당신의 파이프 라인의 'ProgrammableFilter1'아이콘을 선택하면

받은 Paraview에서
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 Screenshot

1

이 정보는 정보 탭에 표시됩니다.

+0

신난다! 너무 많은 코드를 너무 쉽게 :-) –

+0

원래 OP가이 대답을 찾길 바랍니다. 또한 파이썬에서 GetClientSideObject를 수행 할 필요가 없으며, InformationObject에이 정보가 포함되어 있습니다. –