スライサースタディノート(51)は、スライサーpython拡張機能の3Dビューに情報を表示します
1、3Dビューまたはスライスビューでテキストを表示する
ビューアにオーバーレイされた情報を表示する最も簡単な方法は、コーナー注釈を使用することです。
view=slicer.app.layoutManager().threeDWidget(0).threeDView()
# Set text to "Something"
view.cornerAnnotation().SetText(vtk.vtkCornerAnnotation.UpperRight,"Something")
# Set color to red
view.cornerAnnotation().GetTextProperty().SetColor(1,0,0)
# Update the view
view.forceRender()
表示効果:
右上隅に赤い文字列「何か」が表示されていることがわかります。
スライスビューでテキストを表示するには、最初の行をこの行に置き換えます(スライスビューの注釈を非表示にして、そこに配置したテキストが上書きされないようにすることを検討してください)。
view=slicer.app.layoutManager().sliceWidget("Red").sliceView()
2.ボリュームレンダリングの表示VolumeRendering
ボリュームがロードされたときにボリュームレンダリングを自動的に表示する
ボリュームがロードされたときにボリュームのボリュームレンダリングを自動的に表示するには、以下の行を.slicerrc.pyファイルに追加します。
@vtk.calldata_type(vtk.VTK_OBJECT)
def onNodeAdded(caller, event, calldata):
node = calldata
if isinstance(node, slicer.vtkMRMLVolumeNode):
# Call showVolumeRendering using a timer instead of calling it directly
# to allow the volume loading to fully complete.
qt.QTimer.singleShot(0, lambda: showVolumeRendering(node))
def showVolumeRendering(volumeNode):
print("Show volume rendering of node " + volumeNode.GetName())
volRenLogic = slicer.modules.volumerendering.logic()
displayNode = volRenLogic.CreateDefaultVolumeRenderingNodes(volumeNode)
displayNode.SetVisibility(True)
scalarRange = volumeNode.GetImageData().GetScalarRange()
if scalarRange[1]-scalarRange[0] < 1500:
# Small dynamic range, probably MRI
displayNode.GetVolumePropertyNode().Copy(volRenLogic.GetPresetByName("MR-Default"))
else:
# Larger dynamic range, probably CT
displayNode.GetVolumePropertyNode().Copy(volRenLogic.GetPresetByName("CT-Chest-Contrast-Enhanced"))
slicer.mrmlScene.AddObserver(slicer.vtkMRMLScene.NodeAddedEvent, onNodeAdded)
最大強度の投影を使用してボリュームレンダリングを表示する
def showVolumeRenderingMIP(volumeNode, useSliceViewColors=True):
"""Render volume using maximum intensity projection
:param useSliceViewColors: use the same colors as in slice views.
"""
# Get/create volume rendering display node
volRenLogic = slicer.modules.volumerendering.logic()
displayNode = volRenLogic.GetFirstVolumeRenderingDisplayNode(volumeNode)
if not displayNode:
displayNode = volRenLogic.CreateDefaultVolumeRenderingNodes(volumeNode)
# Choose MIP volume rendering preset
if useSliceViewColors:
volRenLogic.CopyDisplayToVolumeRenderingDisplayNode(displayNode)
else:
scalarRange = volumeNode.GetImageData().GetScalarRange()
if scalarRange[1]-scalarRange[0] < 1500:
# Small dynamic range, probably MRI
displayNode.GetVolumePropertyNode().Copy(volRenLogic.GetPresetByName("MR-MIP"))
else:
# Larger dynamic range, probably CT
displayNode.GetVolumePropertyNode().Copy(volRenLogic.GetPresetByName("CT-MIP"))
# Switch views to MIP mode
for viewNode in slicer.util.getNodesByClass("vtkMRMLViewNode"):
viewNode.SetRaycastTechnique(slicer.vtkMRMLViewNode.MaximumIntensityProjection)
# Show volume rendering
displayNode.SetVisibility(True)
volumeNode = slicer.mrmlScene.GetFirstNodeByClass("vtkMRMLScalarVolumeNode")
showVolumeRenderingMIP(volumeNode)
軟組織を透明にするボリュームレンダリングを表示する
def showTransparentRendering(volumeNode, maxOpacity=0.2, gradientThreshold=30.0):
"""Make constant regions transparent and the entire volume somewhat transparent
:param maxOpacity: lower value makes the volume more transparent overall
(value is between 0.0 and 1.0)
:param gradientThreshold: regions that has gradient value below this threshold will be made transparent
(minimum value is 0.0, higher values make more tissues transparent, starting with soft tissues)
"""
# Get/create volume rendering display node
volRenLogic = slicer.modules.volumerendering.logic()
displayNode = volRenLogic.GetFirstVolumeRenderingDisplayNode(volumeNode)
if not displayNode:
displayNode = volRenLogic.CreateDefaultVolumeRenderingNodes(volumeNode)
# Set up gradient vs opacity transfer function
gradientOpacityTransferFunction = displayNode.GetVolumePropertyNode().GetVolumeProperty().GetGradientOpacity()
gradientOpacityTransferFunction.RemoveAllPoints()
gradientOpacityTransferFunction.AddPoint(0, 0.0)
gradientOpacityTransferFunction.AddPoint(gradientThreshold-1, 0.0)
gradientOpacityTransferFunction.AddPoint(gradientThreshold+1, maxOpacity)
# Show volume rendering
displayNode.SetVisibility(True)
volumeNode = slicer.mrmlScene.GetFirstNodeByClass("vtkMRMLScalarVolumeNode")
showTransparentRendering(volumeNode, 0.2, 30.0)
ボリュームレンダリングを使用してボリュームを表示する
logic = slicer.modules.volumerendering.logic()
volumeNode = slicer.mrmlScene.GetNodeByID('vtkMRMLScalarVolumeNode1')
displayNode = logic.CreateVolumeRenderingDisplayNode()
displayNode.UnRegister(logic)
slicer.mrmlScene.AddNode(displayNode)
volumeNode.AddAndObserveDisplayNodeID(displayNode.GetID())
logic.UpdateDisplayNodeFromVolumeNode(displayNode, volumeNode)
3.ボリュームレンダリング効果をテストします
def showVolumeRendering(volumeNode):
print("Show volume rendering of node " + volumeNode.GetName())
volRenLogic = slicer.modules.volumerendering.logic()
displayNode = volRenLogic.CreateDefaultVolumeRenderingNodes(volumeNode)
displayNode.SetVisibility(True)
主に3Dビューの表示に使用されます。