• 3Dslicer_DataModule


    一、模块简介

    Data模块是slicer中很重要也很实用的模块,它列出了当前场景中的所有对象,以节点形式表现,并且允许在模块的MRML树中对这些对象节点进行一些基本的操作,像搜索、重命名、删除移动等。

    Data模块在slicer中扮演着中央数据组织点的角色,它将加载到slicer的所有数据在不同的视图中表现出来。主题分层视图( Subject Hierarchy view)就是其中一个视图,它将数据以一种易于探索的方式显示出来,并且提供了对数据节点的操作。转换分层视图(Transform Hierarchy view)支持转换链的探索。全节点视图( All Nodes view)将所有数据节点以一种非结构化的方式显示出来。

    在主题分层视图( Subject Hierarchy view)中,DICOM数据会自动以一种 patient-study-series 的分层结构进行添加。非DICOM数据如果是从本地目录结构中加载的,那么它们能够被slicer自动解析并分层,也可以通过创建类似于DICOM文件的分层或文件夹手动将它们组织成一种树状结构。关于模型的存在的层次结构能够自动在主题分层视图映射出来,所以可以采用通常的方法来探索模型图集。

    主题分层视图( Subject Hierarchy view)中提供了对其下数据节点的特色操作,包括克隆(cloning)、群转换(bulk transforming)、群显示/隐藏(bulk show/hide)、指定类型的特色操作(type-specific features)。还提供了节点的基本操作像删除、重命名等。附加的插件(plugins)还可以提供一些其他的指定类型的特色操作和通常操作。

    二、应用方向

    主题分层视图( Subject Hierarchy view):

    • 用该视图可以在一个地方浏览加载到slicer中的数据对象,不同的类型用不同的图标来标识。
    • 用文件夹(folders)或者病人/主题的树状结构(patient/subject trees)来组织数据便于管理和群操作。
    • 对从磁盘中加载的数据节点进行可视化或者群操作处理。
    • 可以很简单的显示/隐藏由可显示节点组成的分支。
    • 可以很简单的对整个study(任何分支)进行转换。
    • 输出为DICOM数据(编辑DICOM标签)
    • 还有许多类型指定的功能可以由插件(plugins)来提供。

    转换分层视图(Transform Hierarchy view):

    • 管理转换链和转换分层

    全节点视图( All Nodes view):

    • 开发者可以将该视图作为工具来调试问题。

    三、界面面板

        1.Subject hierarchy

    包含了所有在Subject hierarchy中的对象,并将它们以一种树状结构展示。
    • 从DICOM中加载的数据会自动以正确的结构(patient, study, series)加入到树结构中。
    • 非DICOM数据也会自动出现在Subject hierarchy面板上,有两种方式来以分层形式组织它们:
    1.  执行'Create hierarchy from loaded directory structure'动作,这个动作在场景的关联菜单中(在面板的空白地方右击)。这将根据节点的加载位置所在的本地文件结构来组织它们。
    2. 手动拖放它们到分层节点下。
    • 再者,当你在创建model或者其它类型(如annotation)的分层后,这种分层结构也会在Subject hierarchy中显示。比如你手动创建一个ROI后,在annotationModule中同时你也自动创建了一个分层结构,这种分层以一种节点形式表示(vtkMRMLAnnotationHierarchyNode),那么在Subject hierarchy面板中也会看见这种分层组织结构
    • 在这个面板中,节点可以被拖放到其它节点下,重新排列树结构。
    • 基本操作(可以通过右击这些数据节点在关联菜单中获得):              
    1. 转换节点或者整个分支(Transform node or branch):双击节点或分支的转换列以在转换列中进行转换,然后设置想要的转换,转换列用TransformModule的图标来表示。如果转换列不可见,需要勾选树结构下方的'Show transforms'选择框。
    2. 显示/隐藏节点或分支(Show/hide node or branch):点击对应节点或分支的眼图标。
    3. 删除(Delete)
    4. 重命名(Rename)
    5. 克隆(Clone):创建选中节点的副本,副本与原来的节点在各方面都一样,但是它的命名加有 '_Copy'后缀。
    6. 编辑属性(Edit properties):如果某个节点的角色已经指定了(即它的图标没有问题),那么这个动作执行后将会打开对应的Module,并且该该节点也会被该模块选中(e.g. Volumes module for volumes)。
    7. 创建子。。(Create child...):创建一个指定类型的节点。
    • slicer刚打开的时候树中没有任何节点,可以通过右击空白区域来加入新节点,如果场景项目存在,也可以右击它来添加新节点。
    • 角色以及对应的功能(每个节点都有不同类型对应不同角色):
                1. Volumes:图标,编辑属性,以及额外的提示信息
    • 'Register this...':选择该图像为固定图像用于配准,右击相应的图像为移动图像初始化配准
    • 'Segment this...':允许分割该图像,例如转到Editor module中进行分割。
    • 'Toggle labelmap outline display':用于labelmaps类型的Volume

        2. Models: 图标,编辑属性,以及额外的提示信息

                3. SceneViews: 图标,编辑属性,以及恢复场景视图。

                4. Transforms: 图标,额外的提示信息,编辑属性,反转(Invert),重置为恒等(Reset to identity)。

                5. Many others, such as Markups, Charts, Annotations, Tables, etc.

    • 主题分层条目信息(Subject hierarchy item information):展示详细的关于选中的主题分层条目的信息

        2.Transform hierarchy

    • 节点:该视图列出了场景中所有可转换的节点,以一个分层树方式显示了节点之间的关系。对于是图形对象的节点,像volumes或者models,会控制它们在不同视图中(2D、3D)的显示。列表中左键双击任一条目,便可对该条目重命名(除了scene)。右键单击会弹出一个关联菜单包含不同的动作:"Insert Transform" 会创建一个身份标识的线性转换节点并将它应用于选中的节点上。"Edit properties"会打开一个特定模块,(e.g. "Volumes" for volume nodes, "Models" for model nodes, etc.)。"Rename"会打开一个对话框来重命名该节点。"Delete"会将该节点从场景中删除。在该视图中支持内部的拖放操作,在同一个父节点中移动一个节点的位置不会有什么影响,改变一个节点的父节点将会有不同的意义,取决于当前的场景模型。
    • Show MRML ID's:在树状视图中显示/隐藏第二列,包含了节点的节点ID。默认是隐藏的。
    • Show hidden nodes:显示/隐藏那些隐藏的节点。默认情况下只有主节点是显示的。

        3.All nodes

    以非结构化的方式展现场景中的所有节点,支持属性编辑、重命名和删除的操作。

        4.Common

    • Filter:隐藏所有与输入字符不匹配的节点,这对于快速搜索指定的节点是非常有用的。注意这里的搜索是区分大小写的。
    • MRML node information:包含着两部分,这两部分都只有在选中MRML数据节点时才会显示,第一部分“Node information”,会显示选中数据节点的详细数据信息。第二部分为属性Attribute区,显示当前选中节点的属性表单,属性可以编辑(双击"Attribute value"单元格),也可以添加(with the"Add" button)或移除(with the"Remove" button)。

    四、操作应用

    • 从头开始创建一个新主题(new Subject)
    右击空白区域,选择'Create new subject'

    • 创建新文件夹(new folder)

    右击存在的条目或者空白区域,选择'Create new folder'。文件夹类型(folder)的分层条目使用关联菜单能够被转换为主题(Subject)或者研究(Study )分层。

    • 重命名条目

    右击节点,选择'Rename',或者双击节点的名字部分。

    • 应用一个转换到节点或者分支上
    双击节点或者分支在转换列(该列的图标与转换模块的图标相同)上的单元格来进行转换,然后选择想要的转换,如果转换列不可见,选中树结构下方的 'Show transforms' 选择框。

    五、开发者必晓

        1.获取以及操控主题分层条目(subject hierarchy items)的代码片段

    • 获取伪单subject hierarchy节点
    它管理着整个分层结构并且提供了获取和操作分层条目的功能:
    shNode = slicer.vtkMRMLSubjectHierarchyNode.GetSubjectHierarchyNode(slicer.mrmlScene)
    • 创建主题分层条目:
    # If it is for a data node, it is automatically created, but the create function can be used to set parent:
    shNode.CreateItem(parentItemID, dataNode)
    
        
                        
    # If it is a hierarchy item without a data node, then the create function must be used:
    shNode.CreateSubjectItem(parentItemID, name)
    
                        
                        
    shNode.CreateFolderItem(parentItemID, name)
                              
                          
    shNode.CreateHierarchyItem(parentItemID, name, level)
    # Advanced method to set level attribute manually (usually subject, study, or folder, but it can be a virtual branch for example)
                    
                    
    • 获取主题分层条目(subject hierarchy item)
    在主题分层视图中的条目用整形的ID来唯一的标识。
    # Get scene item ID first because it is the root item:
    sceneItemID = shNode.GetSceneItemID()
    # Get direct child by name
    subjectItemID = shNode.GetItemChildWithName(sceneItemID, 'Subject_1')
    
                        
                        
    # Get item for data node
    itemID = shNode.GetItemByDataNode(dataNode)
                        
    # Get item by UID (such as DICOM)
    itemID = shNode.GetItemByUID(slicer.vtkMRMLSubjectHierarchyConstants.GetDICOMUIDName(), seriesInstanceUid)
    itemID = shNode.GetItemByUIDList(slicer.vtkMRMLSubjectHierarchyConstants.GetDICOMInstanceUIDName(), instanceUID)
    # Invalid item ID for checking validity of a given ID (most functions return the invalid ID when item is not found)
    invalidItemID = slicer.vtkMRMLSubjectHierarchyNode.GetInvalidItemID()
    
    • 遍历主题层次条目的子条目
    children = vtk.vtkIdList()
    shNode.GetItemChildren(parent, children)
    for i in xrange(children.GetNumberOfIds()):
      child = children.GetId(i)
    
                
    • 操作主题分层条目
    Instead of node operations on the individual subject hierarchy nodes, item operations are performed on the one subject hierarchy node.

    # Set item name
    shNode.SetItemName(itemID, 'NewName')
                    
    # Set item parent (reparent)
    shNode.SetItemParent(itemID, newParentItemID)
                    
                
    • Filter items in TreeView or ComboBox
    Displayed items can be filtered using setAttributeFilter method. An example of the usage can be found in the unit test. Modified version here:
    print shTreeView.displayedItemCount() # 5
    shTreeView.setAttributeFilter('DICOM.Modality') # Nodes must have this attribute
    print shTreeView.displayedItemCount() # 3
    shTreeView.setAttributeFilter('DICOM.Modality','CT') # Have attribute and equal 'CT'
    print shTreeView.displayedItemCount() # 1
    shTreeView.removeAttributeFilter()
    print shTreeView.displayedItemCount() # 5

        2.实现新插件(Implementing new plugins)

    插件(Plugins)才是主题分层的真正魅力,因为它们为新的数据节点类型提供了支持,并且可以通过数据节点的关联菜单条目添加各种功能。
    为了创建一个C++类型的插件,需要创建的插件类要作为qSlicerSubjectHierarchyAbstractPlugin的子类,对于python类型的插件,可以参看下面。在Slicer core (slicer核心模块)和SlicerRT extension中有很多实例,寻找这些模块下名为SubjectHierarchyPlugins的文件夹,在这些文件夹下有插件类的实现代码。
    • 用python来写插件(Writing plugins in Python:):
    用python写的插件类要作为AbstractScriptedSubjectHierarchyPlugin的子类,AbstractScriptedSubjectHierarchyPlugin类是C++中qSlicerSubjectHierarchyScriptedPlugin 类对应的python中的类。
    例子:  Annotations role plugin,  function plugin

    • Role plugins: 为新的数据节点类型添加支持

    需要定义:ownership, icon, tooltip, edit properties, help text (in the yellow question mark popup), visibility icon, set/get display visibility, displayed node name (if different than name of the node object)

    在当前slicer核心模块中存在的插件:Markups, Models, SceneViews, Charts, Folder, Tables, Transforms, LabelMaps, Volumes 

    • Function plugins:为特定类型的节点在右击关联菜单中添加特色功能

    需要定义:list of contect menu actions for nodes and the scene, types of nodes for which the action shows up, functions handling the defined action

    在当前slicer核心模块中存在的插件:CloneNode, ParseLocalData, Register, Segment, DICOM, Volumes, Markups, Models, Annotations, Segmentations, Segments, etc.























  • 相关阅读:
    Mesos源码分析(8): Mesos-Slave的初始化
    OpenStack(一)——OpenStack的相关概念
    awk(gawk)文本报告生成器
    echo的色彩处理
    bash命令检测Shell脚本中的语法错误和查看详细执行过程
    Linux命令之cut
    sed流编辑器
    shell中函数的使用
    shell中的shift左移参数命令
    shell中跳出循环语句break和continue
  • 原文地址:https://www.cnblogs.com/oneDongHua/p/14264096.html
Copyright © 2020-2023  润新知