def merge(self): merge_points = vtk.vtkMergePoints() merge_points.InitPointInsertion(self.points, self.points.GetBounds()) id = vtk.reference(0) for i in range(self.vertice_number): merge_points.InsertUniquePoint(self.points.GetPoint(i), id) with open(self.files[self.Count], 'r') as f: for line in f.readlines(): line = str.split(line, ' ') inserted = merge_points.InsertUniquePoint( [float(line[0]), float(line[1]), float(line[2])], id) if inserted == 1: self.vertice_number += 1 self.points = merge_points.GetPoints() self.Count += 1 renderers = self.interactor.GetRenderWindow().GetRenderers() renderers.InitTraversal() points_renderer = renderers.GetNextItem() points_renderer.RemoveActor(self.points_actor) self.points_actor = create_points_actor(points) points_renderer.AddActor(self.points_actor) surface_renderer = renderers.GetNextItem() surface_renderer.RemoveActor(self.surface_actor) self.surface_actor = create_surface_actor(points) surface_renderer.AddActor(self.surface_actor) self.interactor.GetRenderWindow().Render()
def merge(self): merge_points = vtk.vtkMergePoints() merge_points.InitPointInsertion(self.points, self.points.GetBounds()) id = vtk.reference(0) for i in range(self.vertice_number): merge_points.InsertUniquePoint(self.points.GetPoint(i), id) for i in range(self.Count, min(self.Count + self.interval, len(self.vertices))): inserted = merge_points.InsertUniquePoint(self.vertices[i], id) if inserted == 1: self.vertice_number += 1 if self.Count + self.interval < len(self.vertices): self.Count = self.Count + self.interval else: self.Count = len(self.vertices) self.points = merge_points.GetPoints() self.interactor.GetRenderWindow().GetRenderers().GetFirstRenderer( ).RemoveActor(self.actor) self.actor = create_points_actor(self.points) self.interactor.GetRenderWindow().GetRenderers().GetFirstRenderer( ).AddActor(self.actor) self.interactor.GetRenderWindow().Render()
def setVtkWidget(vtkWidget): colors = vtk.vtkNamedColors() # Create the RenderWindow, Renderer and Interactor. # ren1 = vtk.vtkRenderer() vtkWidget.GetRenderWindow().AddRenderer(ren1) iren = vtkWidget.GetRenderWindow().GetInteractor() reader = vtk.vtkMetaImageReader() reader.SetFileName('FullHead.mha') reader.Update() locator = vtk.vtkMergePoints() locator.SetDivisions(396, 396, 24) locator.SetNumberOfPointsPerBucket(1) locator.AutomaticOff() iso = vtk.vtkMarchingCubes() iso.SetInputConnection(reader.GetOutputPort()) iso.ComputeGradientsOn() iso.ComputeScalarsOff() iso.SetValue(0, 1) iso.SetLocator(locator) isoMapper = vtk.vtkPolyDataMapper() isoMapper.SetInputConnection(iso.GetOutputPort()) isoMapper.ScalarVisibilityOff() isoActor = vtk.vtkActor() isoActor.SetMapper(isoMapper) isoActor.GetProperty().SetColor(colors.GetColor3d("Wheat")) outline = vtk.vtkOutlineFilter() outline.SetInputConnection(reader.GetOutputPort()) outlineMapper = vtk.vtkPolyDataMapper() outlineMapper.SetInputConnection(outline.GetOutputPort()) outlineActor = vtk.vtkActor() outlineActor.SetMapper(outlineMapper) # Add the actors to the renderer, set the background and size. # ren1.AddActor(outlineActor) ren1.AddActor(isoActor) ren1.SetBackground(colors.GetColor3d("Black")) ren1.GetActiveCamera().SetFocalPoint(0, 0, 0) ren1.GetActiveCamera().SetPosition(0, -1, 0) ren1.GetActiveCamera().SetViewUp(0, 0, -1) ren1.ResetCamera() ren1.GetActiveCamera().Dolly(1.5) ren1.ResetCameraClippingRange() iren.Initialize()
def merge(feature_points_path, segment_points_path, merge_points_path): ''' feature_points_path:str, 特征点的文件路径 segment_points_path:str, 分割后网格的顶点的文件路径 merge_points_path:str, 合并后的顶点存储路径 ''' # 读取feature_points vertice_number = 0 feature_vertices = [] with open(feature_points_path, 'r') as f1: for line in f1.readlines(): line = str.split(line, ' ') vertice_number = vertice_number + 1 feature_vertices.append( [float(line[0]), float(line[1]), float(line[2])]) points = vtk.vtkPoints() points.SetNumberOfPoints(vertice_number) for i in range(vertice_number): points.SetPoint(i, feature_vertices[i]) # 初始化合并的顶点集 merge_points = vtk.vtkMergePoints() # merge_points.SetDataSet(points) merge_points.InitPointInsertion(points, points.GetBounds()) id = vtk.reference(0) for i in range(vertice_number): merge_points.InsertUniquePoint(points.GetPoint(i), id) vertice_number = 0 segment_points = [] with open(segment_points_path, 'r') as f2: for line in f2.readlines(): line = str.split(line, ' ') if line[0] == 'v': segment_points.append( [float(line[1]), float(line[2]), float(line[3])]) vertice_number = vertice_number + 1 else: break id = vtk.reference(0) replated_points_id = [] for i in range(vertice_number): inserted = merge_points.InsertUniquePoint(segment_points[i], id) if inserted == 0: replated_points_id.append([id, i]) result = merge_points.GetPoints() with open(merge_points_path, 'w') as f3: for i in range(result.GetNumberOfPoints()): pointTemp = result.GetPoint(i) f3.write("%f %f %f\n" % (pointTemp[0], pointTemp[1], pointTemp[2])) print("Replicated points number: %d" % len(replated_points_id)) return len(replated_points_id)
def create_merge_points(program_data): merge_points = vtk.vtkMergePoints() points = vtk.vtkPoints() top_level_box = program_data['grid_desc']['create_box'] bounds = [] bounds.append(top_level_box['xlo']) bounds.append(top_level_box['xhi']) bounds.append(top_level_box['ylo']) bounds.append(top_level_box['yhi']) bounds.append(top_level_box['zlo']) bounds.append(top_level_box['zhi']) merge_points.InitPointInsertion(points, bounds) return merge_points
def OnEndHeader(self): """Get ready to add blocks """ self.TotalFluidSites = self.Domain.BlockFluidSiteCounts.sum() # Efficiently add the voxel corner points self.Locator = vtk.vtkMergePoints() self.Points = vtk.vtkPoints() # Compute the bounds of the voxel corner points # Initially in a shape == (3,2) array [[0, nSites[x]], ... ] bounds = np.concatenate( (np.zeros(3, dtype=int), self.Domain.SiteCounts)).reshape( (2, 3)).transpose() # shift half a voxel down, scale and then translate bounds = self.Domain.VoxelSize*(bounds - 0.5) + \ self.Domain.Origin[:, np.newaxis] # Since we know how the points will be arranged, use that information # to tune the vtkMergePoints self.Locator.SetDivisions(*self.Domain.BlockCounts) self.Locator.InitPointInsertion(self.Points, bounds.flatten(), self.TotalFluidSites) # This is what we're trying to construct. Allocate data (we know how # many cells (= TotalFluidSites) but not how many points, as we don't # know the number of surface sites. self.Grid = vtk.vtkUnstructuredGrid() self.Grid.Allocate(self.TotalFluidSites, 1000) self.Grid.SetPoints(self.Points) # Array of offsets from a point to the corners of its cell. self.deltas = 0.5 * self.Domain.VoxelSize * \ np.array([[ 1, 1, 1], [ 1, 1,-1], [ 1,-1, 1], [ 1,-1,-1], [-1, 1, 1], [-1, 1,-1], [-1,-1, 1], [-1,-1,-1]], dtype=float) # Used as a working array. self.vox = vtk.vtkVoxel() return
def OnEndHeader(self): """Get ready to add blocks """ self.TotalFluidSites = self.Domain.BlockFluidSiteCounts.sum() # Efficiently add the voxel corner points self.Locator = vtk.vtkMergePoints() self.Points = vtk.vtkPoints() # Compute the bounds of the voxel corner points # Initially in a shape == (3,2) array [[0, nSites[x]], ... ] bounds = np.concatenate((np.zeros(3,dtype=int), self.Domain.SiteCounts)).reshape((2,3)).transpose() # shift half a voxel down, scale and then translate bounds = self.Domain.VoxelSize*(bounds - 0.5) + \ self.Domain.Origin[:, np.newaxis] # Since we know how the points will be arranged, use that information # to tune the vtkMergePoints self.Locator.SetDivisions(*self.Domain.BlockCounts) self.Locator.InitPointInsertion(self.Points, bounds.flatten(), self.TotalFluidSites) # This is what we're trying to construct. Allocate data (we know how # many cells (= TotalFluidSites) but not how many points, as we don't # know the number of surface sites. self.Grid = vtk.vtkUnstructuredGrid() self.Grid.Allocate(self.TotalFluidSites, 1000) self.Grid.SetPoints(self.Points) # Array of offsets from a point to the corners of its cell. self.deltas = 0.5 * self.Domain.VoxelSize * \ np.array([[ 1, 1, 1], [ 1, 1,-1], [ 1,-1, 1], [ 1,-1,-1], [-1, 1, 1], [-1, 1,-1], [-1,-1, 1], [-1,-1,-1]], dtype=float) # Used as a working array. self.vox = vtk.vtkVoxel() return
def clean_unstructured_grid(ugrid): """Collapse a vtu produced from a discontinuous grid back down to the continuous space. Args: ugrid (vtkUnstructuredGrid): the input discontinuous grid Results out_grid (vtkUnstructuredGrid): A continuous grid""" merge_points = vtk.vtkMergePoints() out_grid = vtk.vtkUnstructuredGrid() for i in range(ugrid.GetNumberOfPoints()): merge_points.InsertUniquePoint(ugrid.GetPoints().GetPoint(i)) merge_points.BuildLocator() pts = vtk.vtkPoints() pts.DeepCopy(merge_points.GetPoints()) out_grid.SetPoints(pts) for i in range(ugrid.GetNumberOfCells()): cell = ugrid.GetCell(i) cell_ids = cell.GetPointIds() for j in range(cell.GetNumberOfPoints()): original_point = cell.GetPoints().GetPoint(j) cell_ids.SetId(j, merge_points.FindClosestInsertedPoint(original_point)) out_grid.InsertNextCell(cell.GetCellType(), cell.GetPointIds()) out_grid.GetCellData().DeepCopy(ugrid.GetCellData()) return out_grid
def GenerateTetrInFile(self): self.PrintLog('Generating Tetr .in file.') f = open(self.OutputFileName, 'w') line = '$title' + '\n' f.write(line) line = self.OutputFileName + '\n' f.write(line) line = '\n' f.write(line) line = '$compress' + '\n' f.write(line) line = 'gzip -f' + '\n' f.write(line) line = '\n' f.write(line) self.NormalizationTransform.Identity() if (self.NormalizationEntity != ''): sectionBoundaryPointIds = self.GetSectionBoundaryPointIds( self.NormalizationEntity) sectionProperties = SectionProperties() sectionProperties.Mesh = self.Mesh sectionProperties.NormalizationTransform = self.NormalizationTransform sectionProperties.SectionBoundaryPointIds = sectionBoundaryPointIds sectionProperties.Execute() self.NormalizationRadius = sectionProperties.Radius if (self.NormalizationRadius != 0.0) & (self.NormalizationRadius != 1.0): self.NormalizationTransform.Scale(1.0 / self.NormalizationRadius, 1.0 / self.NormalizationRadius, 1.0 / self.NormalizationRadius) line = '$radius' + '\n' f.write(line) line = str(self.NormalizationRadius) + '\n' f.write(line) line = '\n' f.write(line) line = '$viscosity' + '\n' f.write(line) line = str(0.035) + '\n' f.write(line) line = '\n' f.write(line) line = '$density' + '\n' f.write(line) line = str(1.06) + '\n' f.write(line) line = '\n' f.write(line) line = '$red' + '\n' f.write(line) line = str(0) + '\n' f.write(line) line = '\n' f.write(line) line = '$alpha' + '\n' f.write(line) line = str(0) + '\n' f.write(line) line = '\n' f.write(line) line = '$nsolve' + '\n' f.write(line) line = '22' + '\n' f.write(line) line = '\n' f.write(line) line = '$Uzawa_PC' + '\n' f.write(line) line = '1' + '\n' f.write(line) line = '\n' f.write(line) line = '$node' + '\n' f.write(line) line = str(self.Mesh.GetNumberOfPoints()) + '\n' f.write(line) for i in range(self.Mesh.GetNumberOfPoints()): point = [0.0, 0.0, 0.0] self.NormalizationTransform.TransformPoint(self.Mesh.GetPoint(i), point) line = str(i + 1) + ' ' + str(point[0]) + ' ' + str( point[1]) + ' ' + str(point[2]) + '\n' f.write(line) line = '\n' f.write(line) line = '$elem' + '\n' f.write(line) quadratidTetraCellType = 24 quadraticTetraCellIds = vtk.vtkIdTypeArray() self.Mesh.GetIdsOfCellsOfType(quadratidTetraCellType, quadraticTetraCellIds) line = str(quadraticTetraCellIds.GetNumberOfTuples()) + '\n' f.write(line) for i in range(quadraticTetraCellIds.GetNumberOfTuples()): line = str(i + 1) + ' ' cell = self.Mesh.GetCell(quadraticTetraCellIds.GetValue(i)) line += str(cell.GetPointId(0) + 1) + ' ' line += str(cell.GetPointId(4) + 1) + ' ' line += str(cell.GetPointId(1) + 1) + ' ' line += str(cell.GetPointId(5) + 1) + ' ' line += str(cell.GetPointId(2) + 1) + ' ' line += str(cell.GetPointId(6) + 1) + ' ' line += str(cell.GetPointId(7) + 1) + ' ' line += str(cell.GetPointId(8) + 1) + ' ' line += str(cell.GetPointId(9) + 1) + ' ' line += str(cell.GetPointId(3) + 1) + ' ' line += '\n' f.write(line) # inletEntities = self.InletEntities # reversedInlets = self.ReverseInlets # inletEntitiesReversed = zip(inletEntities,reversedInlets) # for inletEntityReversed in inletEntitiesReversed: # inletEntity = inletEntityReversed[0] # reversedInlet = inletEntityReversed[1] # if (inletEntity == ''): # continue for inletEntity in self.InletEntities: reversedInlet = inletEntity in self.ReverseInletEntities line = '\n' f.write(line) line = '$binlet' + ' (' + inletEntity + ') ' + '\n' f.write(line) entityArray = self.Mesh.GetPointData().GetArray(inletEntity) numberOfEntityNodes = 0 for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i, 0) != 1.0): continue numberOfEntityNodes += 1 line = str(numberOfEntityNodes) + '\n' f.write(line) for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i, 0) != 1.0): continue line = str(i + 1) + '\n' f.write(line) sectionBoundaryPointIds = self.GetSectionBoundaryPointIds( inletEntity) sectionProperties = SectionProperties() sectionProperties.Mesh = self.Mesh sectionProperties.NormalizationTransform = self.NormalizationTransform sectionProperties.SectionBoundaryPointIds = sectionBoundaryPointIds if not reversedInlet: sectionProperties.FlipOutwardNormal = 1 else: sectionProperties.FlipOutwardNormal = 0 sectionProperties.Execute() line = str(sectionProperties.Radius) + '\n' f.write(line) line = str(sectionProperties.Origin[0]) + ' ' + str( sectionProperties.Origin[1]) + ' ' + str( sectionProperties.Origin[2]) + '\n' f.write(line) line = str(sectionProperties.Normal[0]) + ' ' + str( sectionProperties.Normal[1]) + ' ' + str( sectionProperties.Normal[2]) + '\n' f.write(line) #TODO: for every inlet insert fourier coefficients given points of waveform (spline-interpolate points beforehands to get them equispaced). if (self.OutletEntity != ''): line = '\n' f.write(line) line = '$boutlet' + ' (' + self.OutletEntity + ') ' + '\n' f.write(line) entityArray = self.Mesh.GetPointData().GetArray(self.OutletEntity) numberOfEntityNodes = 0 for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i, 0) != 1.0): continue numberOfEntityNodes += 1 line = str(numberOfEntityNodes) + '\n' f.write(line) for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i, 0) != 1.0): continue line = str(i + 1) + '\n' f.write(line) sectionBoundaryPointIds = self.GetSectionBoundaryPointIds( self.OutletEntity) sectionProperties = SectionProperties() sectionProperties.Mesh = self.Mesh sectionProperties.NormalizationTransform = self.NormalizationTransform sectionProperties.SectionBoundaryPointIds = sectionBoundaryPointIds sectionProperties.FlipOutwardNormal = 0 sectionProperties.Execute() line = str(sectionProperties.Radius) + '\n' f.write(line) line = str(sectionProperties.Origin[0]) + ' ' + str( sectionProperties.Origin[1]) + ' ' + str( sectionProperties.Origin[2]) + '\n' f.write(line) line = str(sectionProperties.Normal[0]) + ' ' + str( sectionProperties.Normal[1]) + ' ' + str( sectionProperties.Normal[2]) + '\n' f.write(line) if (self.WallEntity != ''): line = '\n' f.write(line) line = '$bwall' + '\n' f.write(line) entityArray = self.Mesh.GetPointData().GetArray(self.WallEntity) numberOfEntityNodes = 0 for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i, 0) != 1.0): continue numberOfEntityNodes += 1 line = str(numberOfEntityNodes) + '\n' f.write(line) for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i, 0) != 1.0): continue line = str(i + 1) + '\n' f.write(line) wallPointIdsMap = vtk.vtkIdList() if (self.WriteWNodeSection == 1): line = '\n' f.write(line) line = '$wnode' + '\n' f.write(line) line = str(numberOfEntityNodes) + '\n' f.write(line) count = 0 wallPointIdsMap.SetNumberOfIds(entityArray.GetNumberOfTuples()) extractSurface = vtk.vtkGeometryFilter() extractSurface.SetInputData(self.Mesh) extractSurface.Update() normalsFilter = vtk.vtkPolyDataNormals() normalsFilter.SetInputConnection( extractSurface.GetOutputPort()) normalsFilter.AutoOrientNormalsOn() normalsFilter.ConsistencyOn() normalsFilter.Update() normalsSurface = normalsFilter.GetOutput() locator = vtk.vtkMergePoints() locator.SetDataSet(normalsSurface) locator.BuildLocator() for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i, 0) != 1.0): wallPointIdsMap.SetId(i, -1) continue wallPointIdsMap.SetId(i, count) point = self.Mesh.GetPoint(i) surfacePointId = locator.FindClosestPoint(point) normal = normalsSurface.GetPointData().GetNormals( ).GetTuple3(surfacePointId) line = str(count + 1) + ' ' + str(i + 1) + ' ' + str( normal[0]) + ' ' + str(normal[1]) + ' ' + str( normal[2]) + '\n' f.write(line) count += 1 if (self.WriteWElemSection == 1): line = '\n' f.write(line) line = '$welem' + '\n' f.write(line) dataArray = vtk.vtkIntArray() dataArray.SetNumberOfComponents(8) for i in range(self.Mesh.GetNumberOfCells()): qtetra = self.Mesh.GetCell(i) for j in range(qtetra.GetNumberOfFaces()): face = qtetra.GetFace(j) isBoundaryFace = 1 for k in range(face.GetNumberOfPoints()): if (entityArray.GetComponent( face.GetPointId(k), 0) != 1.0): isBoundaryFace = 0 break if (isBoundaryFace == 0): continue dataArray.InsertNextValue(i) dataArray.InsertNextValue(j) for k in range(face.GetNumberOfPoints()): dataArray.InsertNextValue(face.GetPointId(k)) line = str(dataArray.GetNumberOfTuples()) + '\n' f.write(line) for i in range(dataArray.GetNumberOfTuples()): line = str(i + 1) + ' ' line += str(int(dataArray.GetComponent(i, 0)) + 1) + ' ' faceId = int(dataArray.GetComponent(i, 1)) newTetrFaceIdsMap = [2, 4, 3, 1] line += str(newTetrFaceIdsMap[faceId]) + ' ' for j in range(2, dataArray.GetNumberOfComponents()): line += str( wallPointIdsMap.GetId( int(dataArray.GetComponent(i, j))) + 1) + ' ' line += '\n' f.write(line) if (self.HistoryEntity != ''): line = '\n' f.write(line) line = '$history' + '\n' f.write(line) entityArray = self.Mesh.GetPointData().GetArray(self.HistoryEntity) numberOfEntityNodes = 0 for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i, 0) != 1.0): continue numberOfEntityNodes += 1 line = str(numberOfEntityNodes) + '\n' f.write(line) for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i, 0) != 1.0): continue line = str(i + 1) + '\n' f.write(line) self.WriteTimeSteps(f)
def GenerateTetrInFile(self): self.PrintLog('Generating Tetr .in file.') f=open(self.OutputFileName, 'w') line = '$title' + '\n' f.write(line) line = self.OutputFileName + '\n' f.write(line) line = '\n' f.write(line) line = '$compress' + '\n' f.write(line) line = 'gzip -f' + '\n' f.write(line) line = '\n' f.write(line) self.NormalizationTransform.Identity() if (self.NormalizationEntity != ''): sectionBoundaryPointIds = self.GetSectionBoundaryPointIds(self.NormalizationEntity) sectionProperties = SectionProperties() sectionProperties.Mesh = self.Mesh sectionProperties.NormalizationTransform = self.NormalizationTransform sectionProperties.SectionBoundaryPointIds = sectionBoundaryPointIds sectionProperties.Execute() self.NormalizationRadius = sectionProperties.Radius if (self.NormalizationRadius != 0.0) & (self.NormalizationRadius != 1.0): self.NormalizationTransform.Scale(1.0/self.NormalizationRadius,1.0/self.NormalizationRadius,1.0/self.NormalizationRadius) line = '$radius' + '\n' f.write(line) line = str(self.NormalizationRadius) + '\n' f.write(line) line = '\n' f.write(line) line = '$viscosity' + '\n' f.write(line) line = str(0.035) + '\n' f.write(line) line = '\n' f.write(line) line = '$density' + '\n' f.write(line) line = str(1.06) + '\n' f.write(line) line = '\n' f.write(line) line = '$red' + '\n' f.write(line) line = str(0) + '\n' f.write(line) line = '\n' f.write(line) line = '$alpha' + '\n' f.write(line) line = str(0) + '\n' f.write(line) line = '\n' f.write(line) line = '$nsolve' + '\n' f.write(line) line = '22' + '\n' f.write(line) line = '\n' f.write(line) line = '$Uzawa_PC' + '\n' f.write(line) line = '1' + '\n' f.write(line) line = '\n' f.write(line) line = '$node' + '\n' f.write(line) line = str(self.Mesh.GetNumberOfPoints()) + '\n' f.write(line) for i in range(self.Mesh.GetNumberOfPoints()): point = [0.0,0.0,0.0] self.NormalizationTransform.TransformPoint(self.Mesh.GetPoint(i),point) line = str(i+1) + ' ' + str(point[0]) + ' ' + str(point[1]) + ' ' + str(point[2]) + '\n' f.write(line) line = '\n' f.write(line) line = '$elem' + '\n' f.write(line) quadratidTetraCellType = 24 quadraticTetraCellIds = vtk.vtkIdTypeArray() self.Mesh.GetIdsOfCellsOfType(quadratidTetraCellType,quadraticTetraCellIds) line = str(quadraticTetraCellIds.GetNumberOfTuples()) + '\n' f.write(line) for i in range(quadraticTetraCellIds.GetNumberOfTuples()): line = str(i+1) + ' ' cell = self.Mesh.GetCell(quadraticTetraCellIds.GetValue(i)) line += str(cell.GetPointId(0)+1) + ' ' line += str(cell.GetPointId(4)+1) + ' ' line += str(cell.GetPointId(1)+1) + ' ' line += str(cell.GetPointId(5)+1) + ' ' line += str(cell.GetPointId(2)+1) + ' ' line += str(cell.GetPointId(6)+1) + ' ' line += str(cell.GetPointId(7)+1) + ' ' line += str(cell.GetPointId(8)+1) + ' ' line += str(cell.GetPointId(9)+1) + ' ' line += str(cell.GetPointId(3)+1) + ' ' line += '\n' f.write(line) # inletEntities = self.InletEntities # reversedInlets = self.ReverseInlets # inletEntitiesReversed = zip(inletEntities,reversedInlets) # for inletEntityReversed in inletEntitiesReversed: # inletEntity = inletEntityReversed[0] # reversedInlet = inletEntityReversed[1] # if (inletEntity == ''): # continue for inletEntity in self.InletEntities: reversedInlet = inletEntity in self.ReverseInletEntities line = '\n' f.write(line) line = '$binlet' + ' (' + inletEntity + ') ' + '\n' f.write(line) entityArray = self.Mesh.GetPointData().GetArray(inletEntity) numberOfEntityNodes = 0 for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i,0) != 1.0): continue numberOfEntityNodes += 1 line = str(numberOfEntityNodes) + '\n' f.write(line) for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i,0) != 1.0): continue line = str(i+1) + '\n' f.write(line) sectionBoundaryPointIds = self.GetSectionBoundaryPointIds(inletEntity) sectionProperties = SectionProperties() sectionProperties.Mesh = self.Mesh sectionProperties.NormalizationTransform = self.NormalizationTransform sectionProperties.SectionBoundaryPointIds = sectionBoundaryPointIds if not reversedInlet: sectionProperties.FlipOutwardNormal = 1 else: sectionProperties.FlipOutwardNormal = 0 sectionProperties.Execute() line = str(sectionProperties.Radius) + '\n' f.write(line) line = str(sectionProperties.Origin[0]) + ' ' + str(sectionProperties.Origin[1]) + ' ' + str(sectionProperties.Origin[2]) + '\n' f.write(line) line = str(sectionProperties.Normal[0]) + ' ' + str(sectionProperties.Normal[1]) + ' ' + str(sectionProperties.Normal[2]) + '\n' f.write(line) #TODO: for every inlet insert fourier coefficients given points of waveform (spline-interpolate points beforehands to get them equispaced). if (self.OutletEntity != ''): line = '\n' f.write(line) line = '$boutlet' + ' (' + self.OutletEntity + ') ' + '\n' f.write(line) entityArray = self.Mesh.GetPointData().GetArray(self.OutletEntity) numberOfEntityNodes = 0 for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i,0) != 1.0): continue numberOfEntityNodes += 1 line = str(numberOfEntityNodes) + '\n' f.write(line) for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i,0) != 1.0): continue line = str(i+1) + '\n' f.write(line) sectionBoundaryPointIds = self.GetSectionBoundaryPointIds(self.OutletEntity) sectionProperties = SectionProperties() sectionProperties.Mesh = self.Mesh sectionProperties.NormalizationTransform = self.NormalizationTransform sectionProperties.SectionBoundaryPointIds = sectionBoundaryPointIds sectionProperties.FlipOutwardNormal = 0 sectionProperties.Execute() line = str(sectionProperties.Radius) + '\n' f.write(line) line = str(sectionProperties.Origin[0]) + ' ' + str(sectionProperties.Origin[1]) + ' ' + str(sectionProperties.Origin[2]) + '\n' f.write(line) line = str(sectionProperties.Normal[0]) + ' ' + str(sectionProperties.Normal[1]) + ' ' + str(sectionProperties.Normal[2]) + '\n' f.write(line) if (self.WallEntity != ''): line = '\n' f.write(line) line = '$bwall' + '\n' f.write(line) entityArray = self.Mesh.GetPointData().GetArray(self.WallEntity) numberOfEntityNodes = 0 for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i,0) != 1.0): continue numberOfEntityNodes += 1 line = str(numberOfEntityNodes) + '\n' f.write(line) for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i,0) != 1.0): continue line = str(i+1) + '\n' f.write(line) wallPointIdsMap = vtk.vtkIdList() if (self.WriteWNodeSection == 1): line = '\n' f.write(line) line = '$wnode' + '\n' f.write(line) line = str(numberOfEntityNodes) + '\n' f.write(line) count = 0 wallPointIdsMap.SetNumberOfIds(entityArray.GetNumberOfTuples()) extractSurface = vtk.vtkGeometryFilter() extractSurface.SetInput(self.Mesh) extractSurface.Update() normalsFilter = vtk.vtkPolyDataNormals() normalsFilter.SetInput(extractSurface.GetOutput()) normalsFilter.AutoOrientNormalsOn() normalsFilter.ConsistencyOn() normalsFilter.Update() normalsSurface = normalsFilter.GetOutput() locator = vtk.vtkMergePoints() locator.SetDataSet(normalsSurface) locator.BuildLocator() for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i,0) != 1.0): wallPointIdsMap.SetId(i,-1) continue wallPointIdsMap.SetId(i,count) point = self.Mesh.GetPoint(i) surfacePointId = locator.FindClosestPoint(point) normal = normalsSurface.GetPointData().GetNormals().GetTuple3(surfacePointId) line = str(count+1) + ' ' + str(i+1) + ' ' + str(normal[0]) + ' ' + str(normal[1]) + ' ' + str(normal[2]) + '\n' f.write(line) count += 1 if (self.WriteWElemSection == 1): line = '\n' f.write(line) line = '$welem' + '\n' f.write(line) dataArray = vtk.vtkIntArray() dataArray.SetNumberOfComponents(8) for i in range(self.Mesh.GetNumberOfCells()): qtetra = self.Mesh.GetCell(i) for j in range(qtetra.GetNumberOfFaces()): face = qtetra.GetFace(j) isBoundaryFace = 1 for k in range(face.GetNumberOfPoints()): if (entityArray.GetComponent(face.GetPointId(k),0) != 1.0): isBoundaryFace = 0 break if (isBoundaryFace == 0): continue dataArray.InsertNextValue(i) dataArray.InsertNextValue(j) for k in range(face.GetNumberOfPoints()): dataArray.InsertNextValue(face.GetPointId(k)) line = str(dataArray.GetNumberOfTuples()) + '\n' f.write(line) for i in range(dataArray.GetNumberOfTuples()): line = str(i+1) + ' ' line += str(int(dataArray.GetComponent(i,0))+1) + ' ' faceId = int(dataArray.GetComponent(i,1)) newTetrFaceIdsMap = [2, 4, 3, 1] line += str(newTetrFaceIdsMap[faceId]) + ' ' for j in range(2,dataArray.GetNumberOfComponents()): line += str(wallPointIdsMap.GetId(int(dataArray.GetComponent(i,j)))+1) + ' ' line += '\n' f.write(line) if (self.HistoryEntity != ''): line = '\n' f.write(line) line = '$history' + '\n' f.write(line) entityArray = self.Mesh.GetPointData().GetArray(self.HistoryEntity) numberOfEntityNodes = 0 for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i,0) != 1.0): continue numberOfEntityNodes += 1 line = str(numberOfEntityNodes) + '\n' f.write(line) for i in range(entityArray.GetNumberOfTuples()): if (entityArray.GetComponent(i,0) != 1.0): continue line = str(i+1) + '\n' f.write(line) self.WriteTimeSteps(f)
ren1 = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren1) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) # create pipeline # v16 = vtk.vtkVolume16Reader() v16.SetDataDimensions(64,64) v16.GetOutput().SetOrigin(0.0,0.0,0.0) v16.SetDataByteOrderToLittleEndian() v16.SetFilePrefix("" + str(VTK_DATA_ROOT) + "/Data/headsq/quarter") v16.SetImageRange(1,93) v16.SetDataSpacing(3.2,3.2,1.5) v16.Update() myLocator = vtk.vtkMergePoints() isoXY = vtk.vtkMarchingSquares() isoXY.SetInputConnection(v16.GetOutputPort()) isoXY.GenerateValues(2,600,1200) isoXY.SetImageRange(0,32,32,63,45,45) isoXY.SetLocator(myLocator) isoXYMapper = vtk.vtkPolyDataMapper() isoXYMapper.SetInputConnection(isoXY.GetOutputPort()) isoXYMapper.SetScalarRange(600,1200) isoXYActor = vtk.vtkActor() isoXYActor.SetMapper(isoXYMapper) isoYZ = vtk.vtkMarchingSquares() isoYZ.SetInputConnection(v16.GetOutputPort()) isoYZ.GenerateValues(2,600,1200) isoYZ.SetImageRange(32,32,32,63,46,92) isoYZMapper = vtk.vtkPolyDataMapper()
def _shellSolidify(surfacePd, shellThickness, shellOffsetDirection): """Create a thick shell from a surface by extruding in surface normal direction""" # remove double vertices cleanPolyData = vtk.vtkCleanPolyData() cleanPolyData.SetInputData(surfacePd) # create normals normals = vtk.vtkPolyDataNormals() normals.SetComputeCellNormals(1) normals.SetInputConnection(cleanPolyData.GetOutputPort()) normals.SplittingOff() if shellOffsetDirection == SHELL_OFFSET_OUTSIDE: normals.FlipNormalsOn() normals.Update() surfacePd = vtk.vtkPolyData() surfacePd.DeepCopy(normals.GetOutput()) numberOfPoints = surfacePd.GetNumberOfPoints() # get boundary edges, used later featureEdges = vtk.vtkFeatureEdges() featureEdges.BoundaryEdgesOn() featureEdges.ColoringOff() featureEdges.FeatureEdgesOff() featureEdges.NonManifoldEdgesOff() featureEdges.ManifoldEdgesOff() featureEdges.SetInputData(normals.GetOutput()) featureEdges.Update() addingPoints = [] addingPolys = [] allNormalsArray = surfacePd.GetCellData().GetArray('Normals') for pointID in range(numberOfPoints): cellIDs = vtk.vtkIdList() surfacePd.GetPointCells(pointID, cellIDs) normalsArray = [] # ilterate through all cells/faces which contain point for i in range(cellIDs.GetNumberOfIds()): n = allNormalsArray.GetTuple3(cellIDs.GetId(i)) normalsArray.append(np.array(n)) # calculate position of new vert dir_vec = np.zeros(3) for n in normalsArray: dir_vec = dir_vec + np.array(n) dir_vec_norm = dir_vec / np.linalg.norm(dir_vec) proj_length = np.dot(dir_vec_norm, np.array(normalsArray[0])) dir_vec_finallenght = dir_vec_norm * proj_length vertex_neu = np.array(surfacePd.GetPoint(pointID)) + ( dir_vec_finallenght * shellThickness) # append point addingPoints.append(vertex_neu) for cellID in range(surfacePd.GetNumberOfCells()): pointIDs = vtk.vtkIdList() surfacePd.GetCellPoints(cellID, pointIDs) newPointIDs = vtk.vtkIdList() for i in reversed(range(pointIDs.GetNumberOfIds())): newPointIDs.InsertNextId( int(pointIDs.GetId(i) + numberOfPoints)) addingPolys.append(newPointIDs) doubleSurfacePoints = vtk.vtkPoints() doubleSurfacePolys = vtk.vtkCellArray() doubleSurfacePoints.DeepCopy(surfacePd.GetPoints()) doubleSurfacePolys.DeepCopy(surfacePd.GetPolys()) for p in addingPoints: doubleSurfacePoints.InsertNextPoint(p) for p in addingPolys: doubleSurfacePolys.InsertNextCell(p) doubleSurfacePD = vtk.vtkPolyData() doubleSurfacePD.SetPoints(doubleSurfacePoints) doubleSurfacePD.SetPolys(doubleSurfacePolys) # add faces to boundary edges mergePoints = vtk.vtkMergePoints() mergePoints.InitPointInsertion(doubleSurfacePD.GetPoints(), doubleSurfacePD.GetBounds()) mergePoints.SetDataSet(doubleSurfacePD) mergePoints.BuildLocator() manifoldPolys = vtk.vtkCellArray() manifoldPolys.DeepCopy(doubleSurfacePD.GetPolys()) manifoldPoints = vtk.vtkPoints() manifoldPoints.DeepCopy(doubleSurfacePD.GetPoints()) for e in range(featureEdges.GetOutput().GetNumberOfCells()): pointIDs = vtk.vtkIdList() featureEdges.GetOutput().GetCellPoints(e, pointIDs) if pointIDs.GetNumberOfIds() == 2: # -> Edge matchingPointIDs = [] newPointIDs = vtk.vtkIdList() for p in range(2): matchingPointIDs.append( mergePoints.IsInsertedPoint( featureEdges.GetOutput().GetPoint( pointIDs.GetId(p)))) if not ( -1 ) in matchingPointIDs: # edge vertex not found in original pd, should not happen newPointIDs.InsertNextId(matchingPointIDs[1]) newPointIDs.InsertNextId(matchingPointIDs[0]) newPointIDs.InsertNextId(matchingPointIDs[0] + numberOfPoints) newPointIDs.InsertNextId(matchingPointIDs[1] + numberOfPoints) manifoldPolys.InsertNextCell(newPointIDs) manifoldPD = vtk.vtkPolyData() manifoldPD.SetPoints(manifoldPoints) manifoldPD.SetPolys(manifoldPolys) triangleFilter = vtk.vtkTriangleFilter() triangleFilter.SetInputData(manifoldPD) # Compute normals to make the result look smooth normals = vtk.vtkPolyDataNormals() normals.SetInputConnection(triangleFilter.GetOutputPort()) normals.Update() return normals.GetOutput()
def main(): fileName = get_program_parameters() colors = vtk.vtkNamedColors() # Create the RenderWindow, Renderer and Interactor. # ren1 = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren1) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) # Create the pipeline. # reader = vtk.vtkMetaImageReader() reader.SetFileName(fileName) reader.Update() locator = vtk.vtkMergePoints() locator.SetDivisions(64, 64, 92) locator.SetNumberOfPointsPerBucket(2) locator.AutomaticOff() iso = vtk.vtkMarchingCubes() iso.SetInputConnection(reader.GetOutputPort()) iso.ComputeGradientsOn() iso.ComputeScalarsOff() iso.SetValue(0, 1150) iso.SetLocator(locator) isoMapper = vtk.vtkPolyDataMapper() isoMapper.SetInputConnection(iso.GetOutputPort()) isoMapper.ScalarVisibilityOff() isoActor = vtk.vtkActor() isoActor.SetMapper(isoMapper) isoActor.GetProperty().SetColor(colors.GetColor3d("Wheat")) outline = vtk.vtkOutlineFilter() outline.SetInputConnection(reader.GetOutputPort()) outlineMapper = vtk.vtkPolyDataMapper() outlineMapper.SetInputConnection(outline.GetOutputPort()) outlineActor = vtk.vtkActor() outlineActor.SetMapper(outlineMapper) # Add the actors to the renderer, set the background and size. # ren1.AddActor(outlineActor) ren1.AddActor(isoActor) ren1.SetBackground(colors.GetColor3d("SlateGray")) ren1.GetActiveCamera().SetFocalPoint(0, 0, 0) ren1.GetActiveCamera().SetPosition(0, -1, 0) ren1.GetActiveCamera().SetViewUp(0, 0, -1) ren1.ResetCamera() ren1.GetActiveCamera().Dolly(1.5) ren1.ResetCameraClippingRange() renWin.SetSize(640, 480) renWin.Render() iren.Start()
def main(): # vtkFlyingEdges3D was introduced in VTK >= 8.2 use_flying_edges = vtk_version_ok(8, 2, 0) file_name = get_program_parameters() colors = vtk.vtkNamedColors() # Create the RenderWindow, Renderer and Interactor. # ren = vtk.vtkRenderer() ren_win = vtk.vtkRenderWindow() ren_win.AddRenderer(ren) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(ren_win) # Create the pipeline. # reader = vtk.vtkMetaImageReader() reader.SetFileName(file_name) reader.Update() locator = vtk.vtkMergePoints() locator.SetDivisions(64, 64, 92) locator.SetNumberOfPointsPerBucket(2) locator.AutomaticOff() if use_flying_edges: try: using_marching_cubes = False iso = vtk.vtkDiscreteFlyingEdges3D() except AttributeError: using_marching_cubes = True iso = vtk.vtkDiscreteMarchingCubes() else: using_marching_cubes = True iso = vtk.vtkDiscreteMarchingCubes() iso.SetInputConnection(reader.GetOutputPort()) iso.ComputeGradientsOn() iso.ComputeScalarsOff() iso.SetValue(0, 1150) if using_marching_cubes: iso.SetLocator(locator) iso_mapper = vtk.vtkPolyDataMapper() iso_mapper.SetInputConnection(iso.GetOutputPort()) iso_mapper.ScalarVisibilityOff() iso_actor = vtk.vtkActor() iso_actor.SetMapper(iso_mapper) iso_actor.GetProperty().SetColor(colors.GetColor3d('Ivory')) outline = vtk.vtkOutlineFilter() outline.SetInputConnection(reader.GetOutputPort()) outline_mapper = vtk.vtkPolyDataMapper() outline_mapper.SetInputConnection(outline.GetOutputPort()) outline_actor = vtk.vtkActor() outline_actor.SetMapper(outline_mapper) # Add the actors to the renderer, set the background and size. # ren.AddActor(outline_actor) ren.AddActor(iso_actor) ren.SetBackground(colors.GetColor3d('SlateGray')) ren.GetActiveCamera().SetFocalPoint(0, 0, 0) ren.GetActiveCamera().SetPosition(0, -1, 0) ren.GetActiveCamera().SetViewUp(0, 0, -1) ren.ResetCamera() ren.GetActiveCamera().Dolly(1.5) ren.ResetCameraClippingRange() ren_win.SetSize(640, 480) ren_win.SetWindowName('HeadBone') ren_win.Render() iren.Start()