• **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脚本存储库

  • 相关阅读:
    计控实验(三)——最少拍控制器
    2022“杭电杯”中国大学生算法设计超级联赛(6)签到题5题
    网页黑白代码将整个网站(包括子页)变为黑白色
    计算机毕业设计springboot+vue+elementUI校园志愿者管理系统
    python特殊函数之__call__函数的作用
    UGUI学习笔记(十)自制雷达图
    Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C语言)
    【数据结构】二叉树
    List分页
    华为配置VRRP原理
  • 原文地址:https://blog.csdn.net/sinat_21835983/article/details/126277114