3Dslicer_AnnotationsModule

摘要:
目前,本模块支持的注释包括标尺和ROI。基准的创建和应用已放在标记模块中。

一、模块简介

该模块作为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

                            3Dslicer_AnnotationsModule第1张

       主要包含一个Edit面板,用来编辑和管理当前场景中的所有注释(Annotation)的相关属性信息。在该面板上层中有各种方便操作控制按钮用来简化注释的管理,包括选择、可视化、上锁等关键操作。

       另外,场景中的所有注释都才采用一种注释分层树(Annotation Hierarchy tree)的管理模式来进行分层管理,Edit面板的下层便对这种管理进行了直观显示,可以直接用鼠标来进行信息的编辑和管理。

    2.Modify Annotation Properties panel

                        3Dslicer_AnnotationsModule第2张

       该面板显然是对注释信息属性的一些设置,包括颜色、位置、大小缩放、透明度等不同的属性,且对于不同的注释类型会有不同的属性供以设置。

    3.Modify Hierarchy Properties panel

                        3Dslicer_AnnotationsModule第3张

        该面板也是对注释属性进行设置的面板,不过在分层面板中设置的属性会对该分层下的所有注释有效。

    4.Annotation tool bar panel

                                                    3Dslicer_AnnotationsModule第4张

        可在该面板下选择将要放置的注释类型,标尺或ROIs,另外该可以在此选择是否连续放置

四、开发者必晓

  • 用Python编写代码在场景中添加标尺
rulerNode = slicer.vtkMRMLAnnotationRulerNode()
rulerNode.SetPosition1(-10,-10,-10)
rulerNode.SetPosition2(10,10,10)
rulerNode.Initialize(slicer.mrmlScene)

在slicer中用Python Interactor来完成给定端点的标尺的添加

3Dslicer_AnnotationsModule第5张

  • 通过注释分层节点的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

3Dslicer_AnnotationsModule第6张

  • 如果已知注释节点的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

3Dslicer_AnnotationsModule第7张

  • 通过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)

3Dslicer_AnnotationsModule第8张

在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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Flask基础知识(包含项目)selenium操作对象的text方法和智能等待时间下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Jboss

同时,为了扩大JBoss的企业市场,JBoss已经签署了许多渠道合作伙伴。2004年6月,JBoss宣布JBoss应用服务器已通过Sun公司的J2EE认证。这是JBoss应用服务器历史上最重要的里程碑。JBossAOP 1.0于2004年10月发布。这也证实了JBoss是一家创新型公司。JBoss应用服务器5.0于2008年12月6日正式发布。新版本的应用服...

C# AES的128位、192位、256位加密

这里将不解释C#AES的128位、192位和256位加密原理。这里我们主要讨论AES的CBC加密模式中128位、192位和256位加密之间的差异,并参考对称加密和块加密的四种模式。16位密钥对应128位加密,24位密钥对应192位加密,32位密钥对应256位加密,矢量必须为16位。“);ifthrownewException(”指定的密钥长度不能小于16位。...

差分方程的零输入响应与零状态响应

差分方程的迭代分析方法有以下缺点:没有闭合解,不利于数学分析。某个时间的输出只能从头开始计算。本文介绍了差分方程的零输入响应和零状态响应分析方法。对于系统,这种分析方法可以很好地表达系统响应的物理意义=Y[-1]=0$Input Y[n]。回顾零输入响应和零状态响应的迭代计算,我们发现以下规则:$egin{align*}y[0]&=-&qqu...

Excel数据透视表、高级筛选

目录:1.数据透视表:数据透视表格式和操作说明:多个表一起创建数据透视表创建组创建计算字段创建计算项值显示方法切片器2。高级过滤:高级过滤和或关系精确过滤和模糊过滤通配符过滤原则查询不重复值(使用高级过滤)高级过滤区分大小写使用高级过滤查找空数据使用高级过滤查询两个表中相同的记录或未使用的记录过滤记录1和数据透视表1.正确的数据透视表格式:① 数据源的第一行...

Selenium操作示例——鼠标悬停显示二级菜单,再点击二级菜单或下拉列表

这两天在python中玩selenium时,我遇到了一个问题,那就是鼠标移动到页面上的一个按钮或菜单,二级菜单或下拉菜单自动弹出,然后二级菜单或者下拉列表自动点击。...

sqlite3 数据类型 批量插入

SQLite3采用动态数据类型。存储值的数据类型与值本身相关,而不是由其字段类型决定。SQLite3的动态数据类型可以向后兼容其他数据库常用的静态类型,这意味着在使用静态数据类型的数据库中使用的数据表也可以在SQLite3中使用。在SQLite2数据库中,除了声明为主键的INTEGER列外,任何列都可以存储属于任何存储类型的值。...