3Dslicer_AnnotationsModule
一、模块简介
该模块作为3Dslicer核心模块的中的一个,主要被用来在MRML scene场景中创建和编辑相关的注释(annotations)和补充信息。目前在该模块里支持的注释(annotations)有标尺(rulers)和ROIs(regions of interest ),关于基准点的相关创建和应用已经被放在了Markups模块中。
二、应用方向
该模块经常被应用在以下情形下:
- 用标尺俩测量肿瘤的大小
- 用ROIs切割原数据体(volume)来绘制
三、界面面板
与该模块相关的界面面板主要有四个:Annotations panel,Modify Annotation Properties panel,Modify Hierarchy Properties panel,和Annotation tool bar panel。
1.Annotations panel
主要包含一个Edit面板,用来编辑和管理当前场景中的所有注释(Annotation)的相关属性信息。在该面板上层中有各种方便操作控制按钮用来简化注释的管理,包括选择、可视化、上锁等关键操作。
另外,场景中的所有注释都才采用一种注释分层树(Annotation Hierarchy tree)的管理模式来进行分层管理,Edit面板的下层便对这种管理进行了直观显示,可以直接用鼠标来进行信息的编辑和管理。
2.Modify Annotation Properties panel
该面板显然是对注释信息属性的一些设置,包括颜色、位置、大小缩放、透明度等不同的属性,且对于不同的注释类型会有不同的属性供以设置。
3.Modify Hierarchy Properties panel
该面板也是对注释属性进行设置的面板,不过在分层面板中设置的属性会对该分层下的所有注释有效。
4.Annotation tool bar panel
可在该面板下选择将要放置的注释类型,标尺或ROIs,另外该可以在此选择是否连续放置
四、开发者必晓
- 用Python编写代码在场景中添加标尺
rulerNode = slicer.vtkMRMLAnnotationRulerNode()
rulerNode.SetPosition1(-10,-10,-10)
rulerNode.SetPosition2(10,10,10)
rulerNode.Initialize(slicer.mrmlScene)
在slicer中用Python Interactor来完成给定端点的标尺的添加
- 通过注释分层节点的ID来获取该分层下子注释的信息,例如获取标尺的位置
# get the first list of annotations
listNodeID = "vtkMRMLAnnotationHierarchyNode2"
annotationHierarchyNode = slicer.mrmlScene.GetNodeByID(listNodeID)# get the first in the list
listIndex = 0
annotation = annotationHierarchyNode.GetNthChildNode(listIndex).GetAssociatedNode()
coords1 = [0,0,0]
coords2 = [0,0,0]
annotation.GetPosition1(coords1)
annotation.GetPosition2(coords2)
print coords1, coords2
- 如果已知注释节点的ID,可以直接获取关于该注释的相关信息
rulerID = "vtkMRMLAnnotationRulerNode2"
ruler = slicer.mrmlScene.GetNodeByID(rulerID)
coords1 = [0,0,0]
coords2 = [0,0,0]
ruler.GetPosition1(coords1)
ruler.GetPosition2(coords2)
print coords1, coords2
- 通过Python编码来改变GUI的状态到注释放置状态
selectionNode = slicer.mrmlScene.GetNodeByID("vtkMRMLSelectionNodeSingleton")# place rulers
selectionNode.SetReferenceActivePlaceNodeClassName("vtkMRMLAnnotationRulerNode")# to place ROIs use the class name vtkMRMLAnnotationROINode
interactionNode = slicer.mrmlScene.GetNodeByID("vtkMRMLInteractionNodeSingleton")
placeModePersistence = 1
interactionNode.SetPlaceModePersistence(placeModePersistence)# mode 1 is Place, can also be accessed via slicer.vtkMRMLInteractionNode().Place
interactionNode.SetCurrentInteractionMode(1)
在slicer的2D和3D视图中已经转变为了标尺注释放置状态。
- 注释的变换应用
个人的注释是可进行变换的(能够将其放于一个变换节点下),分层List不能进行变换,所以想将变换应用于一组注释上,可通过Python Interactor来进行,代码如下:
1.获取变换节点的MRML ID(通过数据模块来获取)
transformNodeID = "vtkMRMLLinearTransformNode5"
2.获取想要进行变换的注释所在的注释分层表单ID
listNodeID = "vtkMRMLAnnotationHierarchyNode3"
3.将所有在此表单下的注释皆进行变换
annotationHierarchyNode = slicer.mrmlScene.GetNodeByID(listNodeID)
numNodes = annotationHierarchyNode.GetNumberOfChildrenNodes()
for i in range(numNodes):annotation = annotationHierarchyNode.GetNthChildNode(i).GetAssociatedNode()annotation.SetAndObserveTransformNodeID(transformNodeID)
- Selection and interaction
Selection表征了怎样在GUI中改变鼠标放置节点的放置模式。对于Selection 和 interaction节点,确保获取到了已经存在于场景中的相关单节点,获取方法:
vtkMRMLApplicationLogic *mrmlAppLogic = this->GetMRMLApplicationLogic();vtkMRMLInteractionNode *inode = mrmlAppLogic->GetInteractionNode();vtkMRMLSelectionNode *snode = mrmlAppLogic->GetSelectionNode();
如果在 mrml application logic中获取不到,可以从场景(scene)中获取:
vtkMRMLInteractionNode *interactionNode = vtkMRMLInteractionNode::SafeDownCast(this->GetMRMLScene()->GetNodeByID("vtkMRMLInteractionNodeSingleton"));
接下来便可以调用Selection and interaction节点中的方法来进行相关设置,或者添加你自己的场景事件观察者:
vtkSlicerAnnotationModuleLogic::ObserveMRMLScene
会监视场景中的节点变化,接下来可以在vtkSlicerMarkupsModuleLogic::ProcessMRMLNodesEvents中查看怎样对interaction node的改变做出反应。
Slicer4/Base/QTGUI/qSlicerMouseModeToolBar.cxx中也有一些代码采用简便的方式在 mrml app logic 中获取两类节点。
调用Selection and interaction节点中的方法来在GUI中切换交互模式到标尺的放置模式:
selectionNode->SetReferenceActivePlaceNodeClassName("vtkMRMLAnnotationRulerNode");
interactionNode->SetCurrentInteractionMode(vtkMRMLInteractionNode::Place);
如果你没有调用interaction节点中的方法SetPlaceModePersistence()来设置PlaceModePersistence,那么在你进行完一次放置后,当前的交互模式将返回到原来的view transform,你讲需要重新设置交互模式来进行下一步的放置(前面设置的PlaceNodeClassName不会改变)。简单来讲就是你并没有设置注释的连续放置,那么在防止玩一次之后还要重新将交互模式设置为放置模式,但放置的节点类型做了保留,不用重新设置。
参考:
https://www.slicer.org/wiki/Documentation/4.8/Modules/Annotations
3Dslicer_AnnotationsModule相关推荐
最新文章
- Java Calendar.add()方法的使用,参数含义。指定时间差。
- 电脑识别指令和代码的原理
- An Error Correction and DeNovo Assembly Approach for Nanopore Reads Using Short Reads
- OSPF详解(三):OSPF中的网络类型
- dht11 python mysql,自己动手实现智能家居之温湿度数据采集存储(DHT11,MySql)
- aptio setup utility怎么设置u盘启动_CentOS 7下载及系统U盘制作
- mysql四:数据操作
- JAVA的rotate怎么用,java如何利用rotate旋转图片_如何在Java中旋转图形
- 浅谈OpenCL之Platform API(2)
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志
- securecrt遇到一个致命的错误且必须关闭_淄博plc维修西门子plcs7-200致命错误7强制数据永久存储区错误...
- 使用gdb进行调试入门篇
- 一种HBase上Region级别的二级索引存储
- Python实现直角坐标系求两点间距离
- CAD画虚线怎么调比例?CAD画虚线教程
- Word文档打印技巧:如何将文档排版成双面对折打印
- 【IOI2020国家集训队作业 Part 1】CF505E Mr. Kitayuta vs. Bamboos
- 逆向某停车app(原创)
- java工具封装树形对象,常用于菜单 json树逆向生成list集合
- GoLang-4(switch)