Skip to content

Commit 0775c60

Browse files
author
Michael Colonel
committed
ENH: Represent calculated isodose surfaces as a segmentation node
This is a partial solution of the issue #80. There are two modes of isodose representation have been implemented, single border and double border mode. Single border mode (solid surface) shows isosurface for dose high than a thresholdMin. Double border mode (hollow or ring-shaped surface) shows isosurface in dose range from thresholdMin up to thresholdMax. For example dose values: 10 Gy, 25 Gy, 30 Gy, 50Gy. Single border mode will generate isosurfaces: higher than 10Gy, higher than 25 Gy, higher than 30 Gy, higher than 50 Gy. Double border mode will generate isosurfaces: from 10 Gy to 25 Gy, from 25 Gy to 30 Gy, from 30 Gy to 50 Gy.
1 parent 74cf35b commit 0775c60

17 files changed

+328
-497
lines changed

Isodose/CMakeLists.txt

-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ string(TOUPPER ${MODULE_NAME} MODULE_NAME_UPPER)
77
#-----------------------------------------------------------------------------
88
add_subdirectory(Logic)
99
add_subdirectory(Widgets)
10-
add_subdirectory(SubjectHierarchyPlugins)
1110

1211
#-----------------------------------------------------------------------------
1312
set(MODULE_EXPORT_DIRECTIVE "Q_SLICER_QTMODULES_${MODULE_NAME_UPPER}_EXPORT")
@@ -19,8 +18,6 @@ set(MODULE_INCLUDE_DIRECTORIES
1918
${CMAKE_CURRENT_SOURCE_DIR}/Widgets
2019
${CMAKE_CURRENT_BINARY_DIR}/Widgets
2120
${SlicerRtCommon_INCLUDE_DIRS}
22-
${CMAKE_CURRENT_SOURCE_DIR}/SubjectHierarchyPlugins
23-
${CMAKE_CURRENT_BINARY_DIR}/SubjectHierarchyPlugins
2421
${qSlicerSubjectHierarchyModuleWidgets_INCLUDE_DIRS}
2522
)
2623

@@ -44,7 +41,6 @@ set(MODULE_UI_SRCS
4441
set(MODULE_TARGET_LIBRARIES
4542
vtkSlicer${MODULE_NAME}ModuleLogic
4643
vtkSlicer${MODULE_NAME}ModuleWidgets
47-
qSlicer${MODULE_NAME}SubjectHierarchyPlugins
4844
)
4945

5046
set(MODULE_RESOURCES

Isodose/Logic/CMakeLists.txt

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ set(${KIT}_EXPORT_DIRECTIVE "VTK_SLICER_${MODULE_NAME_UPPER}_LOGIC_EXPORT")
77
set(${KIT}_INCLUDE_DIRECTORIES
88
${SlicerRtCommon_INCLUDE_DIRS}
99
${vtkSlicerSubjectHierarchyModuleLogic_INCLUDE_DIRS}
10+
${vtkSlicerSegmentationsModuleMRML_INCLUDE_DIRS}
11+
${vtkSlicerDicomRtImportExportConversionRules_INCLUDE_DIRS}
1012
)
1113

1214
set(${KIT}_SRCS
@@ -19,6 +21,8 @@ set(${KIT}_SRCS
1921
set(${KIT}_TARGET_LIBRARIES
2022
vtkSlicerRtCommon
2123
vtkSlicerSubjectHierarchyModuleLogic
24+
vtkSlicerSegmentationsModuleMRML
25+
vtkSlicerDicomRtImportExportConversionRules
2226
MRMLCore
2327
${ITK_LIBRARIES}
2428
${VTK_LIBRARIES}

Isodose/Logic/vtkMRMLIsodoseNode.cxx

+30-10
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ vtkMRMLIsodoseNode::vtkMRMLIsodoseNode()
5353
this->DoseUnits = DoseUnitsType::Unknown;
5454
this->ReferenceDoseValue = -1.;
5555
this->RelativeRepresentationFlag = false;
56+
this->BorderMode = BorderModeType::Single;
5657

5758
this->HideFromEditors = false;
5859
}
@@ -73,6 +74,7 @@ void vtkMRMLIsodoseNode::WriteXML(ostream& of, int nIndent)
7374
vtkMRMLWriteXMLBooleanMacro(ShowScalarBar2D, ShowScalarBar2D);
7475
vtkMRMLWriteXMLBooleanMacro(ShowDoseVolumesOnly, ShowDoseVolumesOnly);
7576
vtkMRMLWriteXMLIntMacro(DoseUnits, DoseUnits);
77+
vtkMRMLWriteXMLIntMacro(BorderMode, BorderMode);
7678
vtkMRMLWriteXMLFloatMacro(ReferenceDoseValue, ReferenceDoseValue);
7779
vtkMRMLWriteXMLBooleanMacro(RelativeRepresentationFlag, RelativeRepresentationFlag);
7880

@@ -92,6 +94,7 @@ void vtkMRMLIsodoseNode::ReadXMLAttributes(const char** atts)
9294
vtkMRMLReadXMLBooleanMacro(ShowScalarBar2D, ShowScalarBar2D);
9395
vtkMRMLReadXMLBooleanMacro(ShowDoseVolumesOnly, ShowDoseVolumesOnly);
9496
vtkMRMLReadXMLIntMacro(DoseUnits, DoseUnits);
97+
vtkMRMLReadXMLIntMacro(BorderMode, BorderMode);
9598
vtkMRMLReadXMLFloatMacro(ReferenceDoseValue, ReferenceDoseValue);
9699
vtkMRMLReadXMLBooleanMacro(RelativeRepresentationFlag, RelativeRepresentationFlag);
97100
vtkMRMLReadXMLEndMacro();
@@ -115,6 +118,7 @@ void vtkMRMLIsodoseNode::Copy(vtkMRMLNode *anode)
115118
vtkMRMLCopyBooleanMacro(ShowScalarBar2D);
116119
vtkMRMLCopyBooleanMacro(ShowDoseVolumesOnly);
117120
vtkMRMLCopyIntMacro(DoseUnits);
121+
vtkMRMLCopyIntMacro(BorderMode);
118122
vtkMRMLCopyFloatMacro(ReferenceDoseValue);
119123
vtkMRMLCopyBooleanMacro(RelativeRepresentationFlag);
120124
vtkMRMLCopyEndMacro();
@@ -134,6 +138,7 @@ void vtkMRMLIsodoseNode::PrintSelf(ostream& os, vtkIndent indent)
134138
vtkMRMLPrintBooleanMacro(ShowScalarBar2D);
135139
vtkMRMLPrintBooleanMacro(ShowDoseVolumesOnly);
136140
vtkMRMLPrintIntMacro(DoseUnits);
141+
vtkMRMLPrintIntMacro(BorderMode);
137142
vtkMRMLPrintFloatMacro(ReferenceDoseValue);
138143
vtkMRMLPrintBooleanMacro(RelativeRepresentationFlag);
139144
vtkMRMLPrintEndMacro();
@@ -194,15 +199,30 @@ void vtkMRMLIsodoseNode::SetDoseUnits(int doseUnits)
194199
{
195200
switch (doseUnits)
196201
{
197-
case 0:
198-
SetDoseUnits(DoseUnitsType::Gy);
199-
break;
200-
case 1:
201-
SetDoseUnits(DoseUnitsType::Relative);
202-
break;
203-
case -1:
204-
default:
205-
SetDoseUnits(DoseUnitsType::Unknown);
206-
break;
202+
case 0:
203+
this->SetDoseUnits(DoseUnitsType::Gy);
204+
break;
205+
case 1:
206+
this->SetDoseUnits(DoseUnitsType::Relative);
207+
break;
208+
case -1:
209+
default:
210+
this->SetDoseUnits(DoseUnitsType::Unknown);
211+
break;
212+
}
213+
}
214+
215+
//----------------------------------------------------------------------------
216+
void vtkMRMLIsodoseNode::SetBorderMode(int doseBorder)
217+
{
218+
switch (doseBorder)
219+
{
220+
case 2:
221+
this->SetBorderMode(BorderModeType::Double);
222+
break;
223+
case 1:
224+
default:
225+
this->SetBorderMode(BorderModeType::Single);
226+
break;
207227
}
208228
}

Isodose/Logic/vtkMRMLIsodoseNode.h

+12
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ class VTK_SLICER_ISODOSE_LOGIC_EXPORT vtkMRMLIsodoseNode : public vtkMRMLNode
3838
{
3939
public:
4040
enum DoseUnitsType { Unknown = -1, Gy = 0, Relative = 1 };
41+
enum BorderModeType {
42+
Single = 1, /// solid shape. Shows dose higher that thesholdMin.
43+
Double = 2 /// hollow shape aka ring-shaped. Shows dose higher than thesholdMin but lower than thesholdMax.
44+
};
4145
static const char* COLOR_TABLE_REFERENCE_ROLE;
4246

4347
static vtkMRMLIsodoseNode *New();
@@ -103,6 +107,10 @@ class VTK_SLICER_ISODOSE_LOGIC_EXPORT vtkMRMLIsodoseNode : public vtkMRMLNode
103107
vtkGetMacro(DoseUnits, DoseUnitsType);
104108
vtkSetMacro(DoseUnits, DoseUnitsType);
105109

110+
/// Get/Set dose border mode type
111+
vtkGetMacro(BorderMode, BorderModeType);
112+
vtkSetMacro(BorderMode, BorderModeType);
113+
106114
/// Get/Set relative representation flag
107115
vtkGetMacro(RelativeRepresentationFlag, bool);
108116
vtkSetMacro(RelativeRepresentationFlag, bool);
@@ -115,6 +123,7 @@ class VTK_SLICER_ISODOSE_LOGIC_EXPORT vtkMRMLIsodoseNode : public vtkMRMLNode
115123
void operator=(const vtkMRMLIsodoseNode&);
116124

117125
void SetDoseUnits(int doseUnits);
126+
void SetBorderMode(int doseBorder);
118127

119128
protected:
120129
/// State of Show isodose lines checkbox
@@ -135,6 +144,9 @@ class VTK_SLICER_ISODOSE_LOGIC_EXPORT vtkMRMLIsodoseNode : public vtkMRMLNode
135144
/// Type of dose units
136145
DoseUnitsType DoseUnits;
137146

147+
/// Type of isodose border surface
148+
BorderModeType BorderMode;
149+
138150
/// Reference dose value
139151
double ReferenceDoseValue;
140152

0 commit comments

Comments
 (0)