**3DSlicer**之Python脚本储存库代码实验: 应用vtkCellLocator定位最近点的cellID

缘起

在前面应用连通过滤器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会自动更新, 可是模型的颜色却没有变化…👇
    在这里插入图片描述
  • ✎✎✎ : 发现这个方法对我没啥用…

Slicer脚本存储库

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jumbo Jing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值