• **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),
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • ✎✎✎ : 结果可以看到随着马克点位置的变化,cellID会自动更新, 可是模型的颜色却没有变化…👇
      在这里插入图片描述
    • ✎✎✎ : 发现这个方法对我没啥用…

    Slicer脚本存储库

  • 相关阅读:
    【异常错误】detected dubious ownership in repository ****** is owned by: ‘
    【aloam】ubuntu20.04 配置 aloam 环境,编译过程报错及成功解决方法
    【达梦数据库】数据库的方言问题导致的启动失败
    【ESP32】VScode + platformIO 环境搭建
    Fill(填充)和Polygon(覆铜)盖油问题
    论文4问O
    csv和excel文件操作
    java游戏制作-拼图游戏
    Linux学习(4)——Linux目录结构
    rk3588烧录记录
  • 原文地址:https://blog.csdn.net/sinat_21835983/article/details/126277114