demo模块分享,拖动旋转、移动模型功能。


核心代码如下:
import functools
import numpy as np
def ApplyTransform(caller, event, TransFormID):
#首先将模型至原点的变化矩阵求出来
matrixOfModel=np.array([[1, 0, 0, -center[0]],
[0, 1, 0, -center[1]],
[0, 0, 1, -center[2]],
[0, 0, 0, 1]])
transNode=slicer.util.getNode(TransFormID)
#获取平面的变换矩阵
transNodeMatrix=vtk.vtkMatrix4x4()
caller.GetObjectToWorldMatrix(transNodeMatrix)
transNodeMatrixArray=slicer.util.arrayFromVTKMatrix(transNodeMatrix)
#将模型变换至原点,再赋予平面的变换矩阵
outMatrixArray=np.dot(transNodeMatrixArray,matrixOfModel)
matrix_new=slicer.util.vtkMatrixFromArray(outMatrixArray)
transNode.SetMatrixTransformToParent(matrix_new)

model=slicer.util.getNode(“model”)
#获取模型中心点,作为旋转中心
bounds=[0,0,0,0,0,0]
model.GetBounds(bounds)
center=[(bounds[0]+bounds[1])/2,(bounds[2]+bounds[3])/2,(bounds[4]+bounds[5])/2]
#将模型放在变换下
TransForm=slicer.mrmlScene.AddNewNodeByClass(‘vtkMRMLLinearTransformNode’)
model.SetAndObserveTransformNodeID(TransForm.GetID())
#添加平面
plane=slicer.mrmlScene.AddNewNodeByClass(‘vtkMRMLMarkupsPlaneNode’)
plane.SetName(‘PlaneUseForTransForm’)
plane.AddControlPoint(center)
plane.SetSize(0,0)
plane.SetSize(1,0)
plane.GetDisplayNode().SetGlyphScale(0)
plane.GetDisplayNode().SetGlyphSize(0)
plane.GetDisplayNode().RotationHandleVisibilityOn()
plane.GetDisplayNode().TranslationHandleVisibilityOn()
plane.GetDisplayNode().SetTextScale(0)
#添加观察者,将平面的变换矩阵赋值给模型
observer_func = functools.partial(ApplyTransform, TransFormID=TransForm.GetID())
plane.AddObserver(vtk.vtkCommand.ModifiedEvent, observer_func)

transformModel.zip (27.4 KB)

您好,我想请教一下,3DSlicer的插件开发如何进行/

https://slicer.readthedocs.io/en/latest/developer_guide/extensions.html#extensions 官方文档参考

transformModel.rar (28.0 KB)
版本更新,提供对旧版本支持及volume数据支持。