缘起
在前面应用连通过滤器vtk.vtkConnectivityFilter()时, 我只用了最近点连通SetExtractionModeToClosestPointRegion, 最大区域连通SetExtractionModeToLargestRegion 和全部连通SetExtractionModeToAllRegions3种方式, 其中还有细胞种子连通SetExtractionModeToCellSeededRegions, 这个方法可以连接多个cellID, 这就是下面的探索:
探索: 应用vtkCellLocator定位最近点的cellID
源代码:
# Get input nodes 输入节点的获取
modelNode = slicer.util.getNode("Segment_1") # select cells in this model 选模型
pointListNode = slicer.util.getNode("F") # points will be selected at positions specified by this markups point list node 定位点
# Create scalar array that will store selection state
# 创建数组以储存选择状态
cellScalars = modelNode.GetMesh().GetCellData()
selectionArray = cellScalars.GetArray("selection")
if not selectionArray:
selectionArray = vtk.vtkIntArray()
selectionArray.SetName("selection")
selectionArray.SetNumberOfValues(modelNode.GetMesh().GetNumberOfCells())
selectionArray.Fill(0)
cellScalars.AddArray(selectionArray)
# Set up coloring by selection array 设置颜色
modelNode.GetDisplayNode().SetActiveScalar("selection", vtk.vtkAssignAttribute.CELL_DATA)
modelNode.GetDisplayNode().SetAndObserveColorNodeID("vtkMRMLColorTableNodeWarm1")
modelNode.GetDisplayNode().SetScalarVisibility(True)
# Initialize cell locator 初始化细胞定位器
cell = vtk.vtkCellLocator()
cell.SetDataSet(modelNode.GetMesh())
cell.BuildLocator()
def onPointsModified(observer=None, eventid=None):
"""点调整函数
"""
global pointListNode, selectionArray
selectionArray.Fill(0) # set all cells to non-selected by default 设置细胞静默(默认)
markupPoints = slicer.util.arrayFromMarkupsControlPoints(pointListNode)
closestPoint = [0.0, 0.0, 0.0]
cellObj = vtk.vtkGenericCell()
cellId = vtk.mutable(0)
subId = vtk.mutable(0)
dist2 = vtk.mutable(0.0)
for markupPoint in markupPoints:
cell.FindClosestPoint(markupPoint, closestPoint, cellObj, cellId, subId, dist2)
closestCell = cellId.get()
if closestCell >=0:
selectionArray.SetValue(closestCell, 100) # set selected cell's scalar value to non-zero 激活细胞
selectionArray.Modified()
# Initial update 更新
onPointsModified()
# Automatic update each time when a markup point is modified
# 随马克点的变化自动更新
pointListNodeObserverTag = markupsNode.AddObserver(slicer.vtkMRMLMarkupsFiducialNode.PointModifiedEvent, onPointsModified)
# To stop updating selection, run this: 停止更新,👇润
# pointListNode.RemoveObserver(pointListNodeObserverTag),
- ✎✎✎ : 结果可以看到随着马克点位置的变化,cellID会自动更新, 可是模型的颜色却没有变化…👇
- ✎✎✎ : 发现这个方法对我没啥用…