From afacac3f25a65a9983ed8e5d724c661d282e6139 Mon Sep 17 00:00:00 2001 From: Heckmann Date: Wed, 21 Jan 2026 14:20:23 +0100 Subject: [PATCH 1/5] Window Caption added if missing and spaces set to 4 where found --- .../basicmechanisms/macromodules/guidesign.md | 54 +- .../macromodules/itemmodelview.md | 117 +-- .../macromodules/pythonscripting.md | 2 +- .../macromodules/scriptingexample2.md | 128 ++-- .../dataobjects/contours/contourexample7.md | 20 +- .../content/tutorials/shorts.md | 19 +- .../content/tutorials/summary/summary2.md | 20 +- .../content/tutorials/summary/summary3.md | 673 +++++++++--------- .../content/tutorials/summary/summary4.md | 315 ++++---- .../content/tutorials/summary/summary6.md | 18 +- .../content/tutorials/summary/summary8.md | 310 ++++---- .../thirdparty/MONAI/monaiexample2.md | 298 ++++---- .../thirdparty/matplotlib/2Dplotting.md | 127 ++-- .../thirdparty/matplotlib/3Dplotting.md | 5 +- .../thirdparty/matplotlib/modulesetup.md | 5 +- .../thirdparty/matplotlib/slicecomparison.md | 30 +- .../thirdparty/opencv/thirdpartyexample1.md | 108 +-- .../thirdparty/pytorch/pytorchexample2.md | 74 +- .../thirdparty/pytorch/pytorchexample3.md | 204 +++--- 19 files changed, 1287 insertions(+), 1240 deletions(-) diff --git a/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/guidesign.md b/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/guidesign.md index 3a9e515a1..280f0640c 100644 --- a/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/guidesign.md +++ b/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/guidesign.md @@ -99,16 +99,14 @@ Interface { internalName = Arithmetic2.output0 } } - Parameters { - - } + Parameters {} } Window MyWindowName { - title = MyWindowTitle - - Box MyBox { + Category { + title = MyWindowTitle + Box MyBox {} } } ``` @@ -136,13 +134,14 @@ Window MyWindowName { title = MyWindowTitle w = 100 h = 50 - - Vertical { - Box MyBox { - title = "Title of my Box" - } - Label MyLabel { + Category { + Vertical { + Box MyBox { + title = "Title of my Box" + } + Label MyLabel { title = "This is a label below the box" + } } } } @@ -157,13 +156,14 @@ Window MyWindowName { title = MyWindowTitle w = 100 h = 50 - - Horizontal { - Box MyBox { - title = "Title of my Box" - } - Label MyLabel { - title = "This is a label beside the box" + Category { + Horizontal { + Box MyBox { + title = "Title of my Box" + } + Label MyLabel { + title = "This is a label beside the box" + } } } } @@ -209,8 +209,10 @@ Changes of the properties of this field can be done in the curled brackets using Window MyWindowName { title = MyWindowTitle - Field Convolution.predefKernel { - title = Kernel + Category { + Field Convolution.predefKernel { + title = Kernel + } } } ``` @@ -243,7 +245,9 @@ Interface { Window MyWindowName { title = MyWindowTitle - Field kernel {} + Category { + Field kernel {} + } } ``` {{}} @@ -259,8 +263,10 @@ Window MyWindowName { title = MyWindowTitle wakeupCommand = myWindowCommand - Button MyButton { - command = myButtonAction + Category { + Button MyButton { + command = myButtonAction + } } } ``` diff --git a/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/itemmodelview.md b/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/itemmodelview.md index f0023c3a5..cbfda6c6d 100644 --- a/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/itemmodelview.md +++ b/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/itemmodelview.md @@ -50,11 +50,11 @@ We first define the input for the image. {{< highlight filename="MyItemModelView.script" >}} ```Stan Interface { - Inputs { - Field inImage { type = Image } - } - Outputs {} - Parameters {} + Inputs { + Field inImage { type = Image } + } + Outputs {} + Parameters {} } ``` {{}} @@ -78,21 +78,21 @@ All of them have to be defined as a *Field* in the *Parameters* section of the s {{< highlight filename="MyItemModelView.script" >}} ```Stan Interface { - Inputs { - Field inImage { type = Image } - } - Outputs {} - Parameters { - Field id { type = Int } - Field patientName { type = String } - Field patientBirthdate { type = String } - Field studyDescription { type = String } - Field studyDate { type = String } - Field modality { type = String } - Field seriesDescription { type = String } - Field seriesDate { type = String } - Field sopInstanceUID { type = String } - } + Inputs { + Field inImage { type = Image } + } + Outputs {} + Parameters { + Field id { type = Int } + Field patientName { type = String } + Field patientBirthdate { type = String } + Field studyDescription { type = String } + Field studyDate { type = String } + Field modality { type = String } + Field seriesDescription { type = String } + Field seriesDate { type = String } + Field sopInstanceUID { type = String } + } } ``` {{}} @@ -107,23 +107,23 @@ We can now add the *ItemModelView* to our panel and define the columns of the vi {{< highlight filename="MyItemModelView.script" >}} ```Stan Window { - Category { - Vertical { - ItemModelView myItemModel { - name = itemModelView - idAttribute = id - Column id {} - Column patientName {} - Column patientBirthdate {} - Column studyDescription {} - Column studyDate {} - Column modality {} - Column seriesDescription {} - Column seriesDate {} - Column sopInstanceUID {} - } + Category { + Vertical { + ItemModelView myItemModel { + name = itemModelView + idAttribute = id + Column id {} + Column patientName {} + Column patientBirthdate {} + Column studyDescription {} + Column studyDate {} + Column modality {} + Column seriesDescription {} + Column seriesDate {} + Column sopInstanceUID {} + } + } } - } } ``` {{}} @@ -150,11 +150,11 @@ We want to get the necessary information from the defined input image *inImage*. {{< highlight filename="MyItemModelView.script" >}} ```Stan Commands { - source = $(LOCAL)/MyItemModelView.py + source = $(LOCAL)/MyItemModelView.py - FieldListener inImage { - command = imageChanged - } + FieldListener inImage { + command = imageChanged + } } ``` {{}} @@ -259,23 +259,24 @@ You can see that the above Python code uses a field *selection* that contains th {{< highlight filename="MyItemModelView.script" >}} ```Stan Interface { - ... - Parameters { - ... - Field selection { type = String } ... - } + Parameters { + ... + Field selection { type = String } + ... + } } + Window { - Category { - Vertical { - ItemModelView myItemModel { - ... - selectionField = selection - ... - } + Category { + Vertical { + ItemModelView myItemModel { + ... + selectionField = selection + ... + } + } } - } } ``` {{}} @@ -368,11 +369,11 @@ We can now add options to interact with the *ItemModelView*. Open the *.script* {{< highlight filename="MyItemModelView.script" >}} ```Stan Commands { - ... - FieldListener selection { - command = itemClicked - } - ... + ... + FieldListener selection { + command = itemClicked + } + ... } ``` {{}} diff --git a/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/pythonscripting.md b/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/pythonscripting.md index 1ff224fdf..0061dfb35 100644 --- a/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/pythonscripting.md +++ b/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/pythonscripting.md @@ -87,7 +87,7 @@ Open the *.script* file and add a *Commands* section defining the name of the Py {{< highlight filename="IsoCSOs.script" >}} ```Stan Commands { - source = $(LOCAL)/mytest.py + source = $(LOCAL)/mytest.py } ``` {{}} diff --git a/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/scriptingexample2.md b/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/scriptingexample2.md index e960e87cd..72974f9c7 100644 --- a/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/scriptingexample2.md +++ b/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/scriptingexample2.md @@ -57,23 +57,25 @@ First, we create a {{< docuLinks "/Resources/Documentation/Publish/SDK/MDLRefere {{< highlight filename="IsoCSOs.script" >}} ```Stan Window { - TabView { - TabViewItem Main { - Horizontal { - Viewer View2D.self { - type = SoRenderArea - pw = 400 - ph = 400 - } - Viewer SoExaminerViewer.self { - type = SoExaminerViewer - pw = 400 - ph = 400 + Category { + TabView { + TabViewItem Main { + Horizontal { + Viewer View2D.self { + type = SoRenderArea + pw = 400 + ph = 400 + } + Viewer SoExaminerViewer.self { + type = SoExaminerViewer + pw = 400 + ph = 400 + } } } - } - - TabViewItem Settings { + + TabViewItem Settings { + } } } } @@ -109,26 +111,28 @@ name. All field settings are taken over from the internal field from the module {{< highlight filename="IsoCSOs.script" >}} ```Stan Window { - TabView { - TabViewItem Main { - Vertical { - Field LocalImage.name {} - Horizontal { - Viewer View2D.self { - type = SoRenderArea - pw = 400 - ph = 400 - } - Viewer SoExaminerViewer.self { - type = SoExaminerViewer - pw = 400 - ph = 400 + Category { + TabView { + TabViewItem Main { + Vertical { + Field LocalImage.name {} + Horizontal { + Viewer View2D.self { + type = SoRenderArea + pw = 400 + ph = 400 + } + Viewer SoExaminerViewer.self { + type = SoExaminerViewer + pw = 400 + ph = 400 + } } } } - } - - TabViewItem Settings { + + TabViewItem Settings { + } } } } @@ -174,35 +178,37 @@ Commands { } Window { - TabView { - TabViewItem Main { - Vertical { - Horizontal { - Field LocalImage.name {} - Button { - title = "Browse..." - command = fileDialog + Category { + TabView { + TabViewItem Main { + Vertical { + Horizontal { + Field LocalImage.name {} + Button { + title = "Browse..." + command = fileDialog + } + Button IsoGenerator { + title = "Iso Generator" + } } - Button IsoGenerator { - title = "Iso Generator" - } - } - Horizontal { - Viewer View2D.self { - type = SoRenderArea - pw = 400 - ph = 400 - } - Viewer SoExaminerViewer.self { - type = SoExaminerViewer - pw = 400 - ph = 400 + Horizontal { + Viewer View2D.self { + type = SoRenderArea + pw = 400 + ph = 400 + } + Viewer SoExaminerViewer.self { + type = SoExaminerViewer + pw = 400 + ph = 400 + } } } } - } - - TabViewItem Settings { + + TabViewItem Settings { + } } } } @@ -245,9 +251,11 @@ can do this in the following way: ```Stan Window { windowActivatedCommand = enableFunctionalities - TabView { - TabViewItem Main { - ... + Category { + TabView { + TabViewItem Main { + ... + } } } } diff --git a/mevislab.github.io/content/tutorials/dataobjects/contours/contourexample7.md b/mevislab.github.io/content/tutorials/dataobjects/contours/contourexample7.md index bf388a3e1..31c85fae8 100644 --- a/mevislab.github.io/content/tutorials/dataobjects/contours/contourexample7.md +++ b/mevislab.github.io/content/tutorials/dataobjects/contours/contourexample7.md @@ -59,20 +59,20 @@ In order to call Python functions, we also need a Python file. Add a *Commands* {{< highlight filename="csoList.script" >}} ```Stan Interface { - Inputs {} - Outputs { - Field baseOut0 { - internalName = CSOListContainer.outCSOList + Inputs {} + Outputs { + Field baseOut0 { + internalName = CSOListContainer.outCSOList + } + } + Parameters { + Field areaThreshold { type = Float value = 2000.0 } } - } - Parameters { - Field areaThreshold { type = Float value = 2000.0 } - } } Commands { - source = $(LOCAL)/csoList.py - initCommand = initCSOList + source = $(LOCAL)/csoList.py + initCommand = initCSOList } ``` {{}} diff --git a/mevislab.github.io/content/tutorials/shorts.md b/mevislab.github.io/content/tutorials/shorts.md index aa98fcf38..f70a71274 100644 --- a/mevislab.github.io/content/tutorials/shorts.md +++ b/mevislab.github.io/content/tutorials/shorts.md @@ -123,19 +123,18 @@ Enter the following: {{< highlight filename="MyScripts.def" >}} ```Stan UserIDEActions { - Action "Set Dark Theme" { - name = changeTheme - userScript = $(LOCAL)/changeTheme.py - statusTip = "Change theme to dark mode" - accel = "ctrl+F9" - } - + Action "Set Dark Theme" { + name = changeTheme + userScript = $(LOCAL)/changeTheme.py + statusTip = "Change theme to dark mode" + accel = "ctrl+F9" + } } UserIDEMenus { - SubMenu "Theme" { - ActionReference = changeTheme - } + SubMenu "Theme" { + ActionReference = changeTheme + } } ``` {{}} diff --git a/mevislab.github.io/content/tutorials/summary/summary2.md b/mevislab.github.io/content/tutorials/summary/summary2.md index 0dd64b301..a81c215a8 100644 --- a/mevislab.github.io/content/tutorials/summary/summary2.md +++ b/mevislab.github.io/content/tutorials/summary/summary2.md @@ -68,13 +68,13 @@ The initial *.def* file contains information you entered into the Wizard for the {{< highlight filename=".def" >}} ```Stan Macro module TutorialSummary { - genre = "VisualizationMain" - author = "MeVis Medical Solutions AG" - comment = "Macro module for MeVisLab tutorials" - keywords = "2D 3D RegionGrowing" - seeAlso = "" + genre = "VisualizationMain" + author = "MeVis Medical Solutions AG" + comment = "Macro module for MeVisLab tutorials" + keywords = "2D 3D RegionGrowing" + seeAlso = "" - externalDefinition = "$(LOCAL)/TutorialSummary.script" + externalDefinition = "$(LOCAL)/TutorialSummary.script" } ``` {{}} @@ -99,14 +99,14 @@ The script (*.script*) file defines fields accessible from outside the macro mod {{< highlight filename=".script" >}} ```Stan Interface { - Inputs {} - Outputs {} - Parameters {} + Inputs {} + Outputs {} + Parameters {} } Commands { - source = $(LOCAL)/TutorialSummary.py + source = $(LOCAL)/TutorialSummary.py } ``` {{}} diff --git a/mevislab.github.io/content/tutorials/summary/summary3.md b/mevislab.github.io/content/tutorials/summary/summary3.md index 81d2e29d7..6ba465617 100644 --- a/mevislab.github.io/content/tutorials/summary/summary3.md +++ b/mevislab.github.io/content/tutorials/summary/summary3.md @@ -45,24 +45,27 @@ In addition to that, we define the minimal size of the Window as 400 x 300 pixel {{< highlight filename=".script" >}} ```Stan Window { - // Define minimum width and height - minimumWidth = 400 - minimumHeight = 300 - // Vertical Layout and 4 Boxes with Horizontal Layout - Vertical { - Box Source { - layout = Horizontal - } - Box Viewing { - layout = Horizontal + // Define minimum width and height + minimumWidth = 400 + minimumHeight = 300 + + Category { + // Vertical Layout and 4 Boxes with Horizontal Layout + Vertical { + Box Source { + layout = Horizontal + } + Box Viewing { + layout = Horizontal + } + Box Settings { + layout = Horizontal + } + Box Info { + layout = Horizontal + } + } } - Box Settings { - layout = Horizontal - } - Box Info { - layout = Horizontal - } - } } ``` {{}} @@ -89,41 +92,44 @@ Then, add another field to your *Box* for the *Source* and use the field name fr {{< highlight filename=".script" >}} ```Stan Interface { - Inputs {} - Outputs {} - Parameters { - Field openFile { - type = String - internalName = LocalImage.name + Inputs {} + Outputs {} + Parameters { + Field openFile { + type = String + internalName = LocalImage.name + } } - } } ... Window { - // Define minimum width and height - minimumWidth = 400 - minimumHeight = 300 - // Vertical Layout and 4 Boxes with Horizontal Layout - Vertical { - Box Source { - layout = Horizontal - Field openFile { - browseButton = True - browseMode = open - } - } - Box Viewing { - layout = Horizontal - } - Box Settings { - layout = Horizontal - } - Box Info { - layout = Horizontal + // Define minimum width and height + minimumWidth = 400 + minimumHeight = 300 + + Category { + // Vertical Layout and 4 Boxes with Horizontal Layout + Vertical { + Box Source { + layout = Horizontal + Field openFile { + browseButton = True + browseMode = open + } + } + Box Viewing { + layout = Horizontal + } + Box Settings { + layout = Horizontal + } + Box Info { + layout = Horizontal + } + } } - } } ``` {{}} @@ -142,17 +148,17 @@ Set the 2D viewer's type to *SoRenderArea* and the 3D viewer's type to *SoExamin ... Box Viewing { - layout = Horizontal - Viewer View2D.self { - expandX = True - expandY = True - type = SoRenderArea - } - Viewer SoExaminerViewer.self { - expandX = True - expandY = True - type = SoExaminerViewer - } + layout = Horizontal + Viewer View2D.self { + expandX = True + expandY = True + type = SoRenderArea + } + Viewer SoExaminerViewer.self { + expandX = True + expandY = True + type = SoExaminerViewer + } } ... @@ -183,24 +189,24 @@ The *baseColor* field of the `SoView2DOverlay` already has a parameter connectio {{< highlight filename=".script" >}} ```Stan Interface { - Inputs {} - Outputs {} - Parameters { - ... - Field selectOverlayColor { - internalName = SoView2DOverlay.baseColor - type = Color + Inputs {} + Outputs {} + Parameters { + ... + Field selectOverlayColor { + internalName = SoView2DOverlay.baseColor + type = Color + } } - } } ... Box Settings { - layout = Horizontal - Field selectOverlayColor { - title = Color - } + layout = Horizontal + Field selectOverlayColor { + title = Color + } } ... @@ -225,90 +231,93 @@ In the *Settings* section of the UI, set *step = 2* and *slider = True*. {{< highlight filename=".script" >}} ```Stan Interface { - Inputs {} - Outputs {} - Parameters { - Field openFile { - type = String - internalName = LocalImage.name - } - Field selectOverlayColor { - internalName = SoView2DOverlay.baseColor - type = Color - } - Field imageAlpha { - internalName = SoWEMRendererImage.faceAlphaValue - type = Integer - min = 0 - max = 1 - } - Field thresholdInterval { - internalName = RegionGrowing.autoThresholdIntervalSizeInPercent - type = Integer - min = 0 - max = 100 - } - Field isoValueImage { - internalName = IsoSurfaceImage.isoValue - type = Integer - min = 0 - max = 1000 + Inputs {} + Outputs {} + Parameters { + Field openFile { + type = String + internalName = LocalImage.name + } + Field selectOverlayColor { + internalName = SoView2DOverlay.baseColor + type = Color + } + Field imageAlpha { + internalName = SoWEMRendererImage.faceAlphaValue + type = Integer + min = 0 + max = 1 + } + Field thresholdInterval { + internalName = RegionGrowing.autoThresholdIntervalSizeInPercent + type = Integer + min = 0 + max = 100 + } + Field isoValueImage { + internalName = IsoSurfaceImage.isoValue + type = Integer + min = 0 + max = 1000 + } } - } } Commands { - source = $(LOCAL)/TutorialSummary.py + source = $(LOCAL)/TutorialSummary.py } Window { - // Define minimum width and height - minimumWidth = 400 - minimumHeight = 300 - // Vertical Layout and 4 Boxes with Horizontal Layout - Vertical { - Box Source { - layout = Horizontal - Field openFile { - browseButton = True - browseMode = open - } - } - Box Viewing { - layout = Horizontal - Viewer View2D.self { - expandX = True - expandY = True - type = SoRenderArea - } - Viewer SoExaminerViewer.self { - expandX = True - expandY = True - type = SoExaminerViewer - } - } - Box Settings { - layout = Horizontal - Field selectOverlayColor { - title = Color - } - Field imageAlpha { - step = 0.1 - slider = True - } - Field thresholdInterval { - step = 0.1 - slider = True - } - Field isoValueImage { - step = 2 - slider = True - } - } - Box Info { - layout = Horizontal + // Define minimum width and height + minimumWidth = 400 + minimumHeight = 300 + + Category { + // Vertical Layout and 4 Boxes with Horizontal Layout + Vertical { + Box Source { + layout = Horizontal + Field openFile { + browseButton = True + browseMode = open + } + } + Box Viewing { + layout = Horizontal + Viewer View2D.self { + expandX = True + expandY = True + type = SoRenderArea + } + Viewer SoExaminerViewer.self { + expandX = True + expandY = True + type = SoExaminerViewer + } + } + Box Settings { + layout = Horizontal + Field selectOverlayColor { + title = Color + } + Field imageAlpha { + step = 0.1 + slider = True + } + Field thresholdInterval { + step = 0.1 + slider = True + } + Field isoValueImage { + step = 2 + slider = True + } + } + Box Info { + layout = Horizontal + } + } } - } } ``` @@ -339,11 +348,11 @@ Open your script file and go to the *Commands* section. Add a *FieldListener* an {{< highlight filename=".script" >}} ```Stan Commands { - source = $(LOCAL)/TutorialSummary.py - - FieldListener selected3DView { - command = viewSelectionChanged - } + source = $(LOCAL)/TutorialSummary.py + + FieldListener selected3DView { + command = viewSelectionChanged + } } ``` {{}} @@ -355,12 +364,12 @@ Right-click {{< mousebutton "right" >}} the command select {{< menuitem "Create from mevis import * def viewSelectionChanged(field): - if field.value == "Segmented": - ctx.field("SoSwitch.whichChild").value = 0 - if field.value == "File": - ctx.field("SoSwitch.whichChild").value = 1 - if field.value == "Both": - ctx.field("SoSwitch.whichChild").value = 2 + if field.value == "Segmented": + ctx.field("SoSwitch.whichChild").value = 0 + if field.value == "File": + ctx.field("SoSwitch.whichChild").value = 1 + if field.value == "Both": + ctx.field("SoSwitch.whichChild").value = 2 ``` {{}} @@ -375,11 +384,11 @@ Then, add a trigger field *applyMarker* to your *Parameters* section. Set *type ```Stan ... Field markerPosition { - type = Vector3 + type = Vector3 } Field applyMarker { - type = Trigger - title = Add + type = Trigger + title = Add } ... ``` @@ -389,12 +398,12 @@ Add another *FieldListener* to both fields: {{< highlight filename=".script" >}} ```Stan ... - FieldListener markerPosition { - command = insertPosition - } - FieldListener applyMarker { - command = applyPosition - } + FieldListener markerPosition { + command = insertPosition + } + FieldListener applyMarker { + command = applyPosition + } ... ``` {{}} @@ -403,8 +412,8 @@ Finally, add both fields to the *Settings* section of your user interface: {{< highlight filename=".script" >}} ```Stan ... - Field markerPosition {} - Field applyMarker {} + Field markerPosition {} + Field applyMarker {} ... ``` {{}} @@ -414,11 +423,11 @@ The Python functions should look like this: ```Python ... def insertPosition(field): - ctx.field("SoView2DMarkerEditor.newPosXYZ").value = field.value + ctx.field("SoView2DMarkerEditor.newPosXYZ").value = field.value def applyPosition(): - ctx.field("SoView2DMarkerEditor.useInsertTemplate").value = True - ctx.field("SoView2DMarkerEditor.add").touch() + ctx.field("SoView2DMarkerEditor.useInsertTemplate").value = True + ctx.field("SoView2DMarkerEditor.add").touch() ... ``` {{}} @@ -440,27 +449,27 @@ Add the field to your *Source* region. ```Stan ... Parameters { - Field resetApplication { - type = Trigger - title = Reset - } + Field resetApplication { + type = Trigger + title = Reset + } } ... Commands { - ... - FieldListener resetApplication { - command = resetApplication - } + ... + FieldListener resetApplication { + command = resetApplication + } } ... - Box Source { - layout = Horizontal - Field openFile { - browseButton = True - browseMode = open + Box Source { + layout = Horizontal + Field openFile { + browseButton = True + browseMode = open + } + Field resetApplication { } } - Field resetApplication { } - } ... ``` {{}} @@ -475,9 +484,9 @@ Add the Python function *resetApplication* and implement the following: from mevis import * def resetApplication(): - ctx.field("RegionGrowing.clear").touch() - ctx.field("SoView2DMarkerEditor.deleteAll").touch() - ctx.field("LocalImage.close").touch() + ctx.field("RegionGrowing.clear").touch() + ctx.field("SoView2DMarkerEditor.deleteAll").touch() + ctx.field("LocalImage.close").touch() ``` {{}} @@ -486,11 +495,10 @@ You can also reset the application to initial state by adding a *initCommand* to {{< highlight filename=".script" >}} ```Stan Window { - // Define minimum width and height - minimumWidth = 400 - minimumHeight = 300 - initCommand = resetApplication - + // Define minimum width and height + minimumWidth = 400 + minimumHeight = 300 + initCommand = resetApplication ... } ``` @@ -503,13 +511,13 @@ This can also be used for setting/resetting to default values of the application from mevis import * def resetApplication(): - ctx.field("RegionGrowing.clear").touch() - ctx.field("SoView2DMarkerEditor.deleteAll").touch() - ctx.field("LocalImage.close").touch() - ctx.field("imageAlpha").value = 0.5 - ctx.field("thresholdInterval").value = 1.0 - ctx.field("isoValueImage").value = 200 - ctx.field("selected3DView").value = "Both" + ctx.field("RegionGrowing.clear").touch() + ctx.field("SoView2DMarkerEditor.deleteAll").touch() + ctx.field("LocalImage.close").touch() + ctx.field("imageAlpha").value = 0.5 + ctx.field("thresholdInterval").value = 1.0 + ctx.field("isoValueImage").value = 200 + ctx.field("selected3DView").value = "Both" ``` {{}} @@ -539,131 +547,134 @@ If the GUI editor is not shown in MATE, make sure to check *[View → Preview {{< highlight filename=".script" >}} ```Stan Interface { - Inputs {} - Outputs {} - Parameters { - Field openFile { - type = String - internalName = LocalImage.name - } - Field selectOverlayColor { - internalName = SoView2DOverlay.baseColor - type = Color - } - Field imageAlpha { - internalName = SoWEMRendererImage.faceAlphaValue - type = Integer - min = 0 - max = 1 - } - Field thresholdInterval { - internalName = RegionGrowing.autoThresholdIntervalSizeInPercent - type = Integer - min = 0 - max = 100 - } - Field isoValueImage { - internalName = IsoSurfaceImage.isoValue - type = Integer - min = 0 - max = 1000 + Inputs {} + Outputs {} + Parameters { + Field openFile { + type = String + internalName = LocalImage.name + } + Field selectOverlayColor { + internalName = SoView2DOverlay.baseColor + type = Color + } + Field imageAlpha { + internalName = SoWEMRendererImage.faceAlphaValue + type = Integer + min = 0 + max = 1 + } + Field thresholdInterval { + internalName = RegionGrowing.autoThresholdIntervalSizeInPercent + type = Integer + min = 0 + max = 100 + } + Field isoValueImage { + internalName = IsoSurfaceImage.isoValue + type = Integer + min = 0 + max = 1000 + } + Field selected3DView { + type = Enum + values = Segmented,File,Both + } + Field totalVolume { + internalName = CalculateVolume.totalVolume + editable = False + } + Field resetApplication { + type = Trigger + title = Reset + } + Field markerPosition { + type = Vector3 + } + Field applyMarker { + type = Trigger + title = Add + } } - Field selected3DView { - type = Enum - values = Segmented,File,Both - } - Field totalVolume { - internalName = CalculateVolume.totalVolume - editable = False +} + +Commands { + source = $(LOCAL)/.py + + FieldListener selected3DView { + command = viewSelectionChanged } - Field resetApplication { - type = Trigger - title = Reset + FieldListener resetApplication { + command = resetApplication } - Field markerPosition { - type = Vector3 + FieldListener markerPosition { + command = insertPosition } - Field applyMarker { - type = Trigger - title = Add + FieldListener applyMarker { + command = applyPosition } - } -} - -Commands { - source = $(LOCAL)/.py - - FieldListener selected3DView { - command = viewSelectionChanged - } - FieldListener resetApplication { - command = resetApplication - } - FieldListener markerPosition { - command = insertPosition - } - FieldListener applyMarker { - command = applyPosition - } } Window { - // Define minimum width and height - minimumWidth = 400 - minimumHeight = 300 - initCommand = resetApplication - // Vertical Layout and 4 Boxes with Horizontal Layout - Vertical { - Box Source { - layout = Horizontal - Field openFile { - browseButton = True - browseMode = open - } - Field resetApplication { } - } - Box Viewing { - layout = Horizontal - Viewer View2D.self { - expandX = True - expandY = True - type = SoRenderArea - } - Viewer SoExaminerViewer.self { - expandX = True - expandY = True - type = SoExaminerViewer - } - } - Box Settings { - layout = Horizontal - Field selectOverlayColor { - title = Color - } - Field imageAlpha { - step = 0.1 - slider = True - } - Field thresholdInterval { - step = 0.1 - slider = True - } - Field isoValueImage { - step = 2 - slider = True - } - Field markerPosition {} - Field applyMarker {} - ComboBox selected3DView { - alignX = Left - editable = False - } - } - Box Info { - layout = Horizontal - Field totalVolume {} + // Define minimum width and height + minimumWidth = 400 + minimumHeight = 300 + initCommand = resetApplication + + Category { + // Vertical Layout and 4 Boxes with Horizontal Layout + Vertical { + Box Source { + layout = Horizontal + Field openFile { + browseButton = True + browseMode = open + } + Field resetApplication { } + } + Box Viewing { + layout = Horizontal + Viewer View2D.self { + expandX = True + expandY = True + type = SoRenderArea + } + Viewer SoExaminerViewer.self { + expandX = True + expandY = True + type = SoExaminerViewer + } + } + Box Settings { + layout = Horizontal + Field selectOverlayColor { + title = Color + } + Field imageAlpha { + step = 0.1 + slider = True + } + Field thresholdInterval { + step = 0.1 + slider = True + } + Field isoValueImage { + step = 2 + slider = True + } + Field markerPosition {} + Field applyMarker {} + ComboBox selected3DView { + alignX = Left + editable = False + } + } + Box Info { + layout = Horizontal + Field totalVolume {} + } + } } - } } ``` {{}} @@ -673,28 +684,28 @@ Window { from mevis import * def viewSelectionChanged(field): - if field.value == "Segmented": - ctx.field("SoSwitch.whichChild").value = 0 - if field.value == "File": - ctx.field("SoSwitch.whichChild").value = 1 - if field.value == "Both": - ctx.field("SoSwitch.whichChild").value = 2 + if field.value == "Segmented": + ctx.field("SoSwitch.whichChild").value = 0 + if field.value == "File": + ctx.field("SoSwitch.whichChild").value = 1 + if field.value == "Both": + ctx.field("SoSwitch.whichChild").value = 2 def resetApplication(): - ctx.field("RegionGrowing.clear").touch() - ctx.field("SoView2DMarkerEditor.deleteAll").touch() - ctx.field("LocalImage.close").touch() - ctx.field("imageAlpha").value = 0.5 - ctx.field("thresholdInterval").value = 1.0 - ctx.field("isoValueImage").value = 200 - ctx.field("selected3DView").value = "Both" + ctx.field("RegionGrowing.clear").touch() + ctx.field("SoView2DMarkerEditor.deleteAll").touch() + ctx.field("LocalImage.close").touch() + ctx.field("imageAlpha").value = 0.5 + ctx.field("thresholdInterval").value = 1.0 + ctx.field("isoValueImage").value = 200 + ctx.field("selected3DView").value = "Both" def insertPosition(field): - ctx.field("SoView2DMarkerEditor.newPosXYZ").value = field.value + ctx.field("SoView2DMarkerEditor.newPosXYZ").value = field.value def applyPosition(): - ctx.field("SoView2DMarkerEditor.useInsertTemplate").value = True - ctx.field("SoView2DMarkerEditor.add").touch() + ctx.field("SoView2DMarkerEditor.useInsertTemplate").value = True + ctx.field("SoView2DMarkerEditor.add").touch() ``` {{}} diff --git a/mevislab.github.io/content/tutorials/summary/summary4.md b/mevislab.github.io/content/tutorials/summary/summary4.md index 9931385e7..1fdb4ccc3 100644 --- a/mevislab.github.io/content/tutorials/summary/summary4.md +++ b/mevislab.github.io/content/tutorials/summary/summary4.md @@ -36,13 +36,13 @@ Open the *.script* file in MATE as already explained in [Step 3](tutorials/summa {{< highlight filename=".script" >}} ```Stan Interface { - Inputs {} - Outputs { - Field out2D { internalName = LocalImage.outImage } - Field out3D { internalName = SoSwitch.self } - Field outSegmentationMask { internalName = CloseGap.output0 } - } - ... + Inputs {} + Outputs { + Field out2D { internalName = LocalImage.outImage } + Field out3D { internalName = SoSwitch.self } + Field outSegmentationMask { internalName = CloseGap.output0 } + } + ... } ``` {{}} @@ -87,8 +87,8 @@ marker_location_new = [-20, -30, 35] new_color = [0.5, 0.5, 0] def loadImage(full_path): - MLAB.log("Setting image path to '" + full_path + "'...") - ctx.field("TutorialSummary.openFile").value = full_path + MLAB.log("Setting image path to '" + full_path + "'...") + ctx.field("TutorialSummary.openFile").value = full_path ``` {{}} @@ -102,12 +102,12 @@ Next, we need a function to check if the loaded image available at the first out ```Python ... def isImageValid(): - MLAB.log("Checking if image is valid...") - data_valid = ctx.field("TutorialSummary.out2D").isValid() - if data_valid: - return True - else: - return False + MLAB.log("Checking if image is valid...") + data_valid = ctx.field("TutorialSummary.out2D").isValid() + if data_valid: + return True + else: + return False ... ``` {{}} @@ -118,14 +118,15 @@ We also need to set a marker in our macro module. ```Python ... def setMarkerPosition(vector): - MLAB.log("Setting marker position to [" + str(vector[0]) + "," + str(vector[1]) + "," + str(vector[2]) + "]...") - ctx.field("TutorialSummary.markerPosition").setValue(vector[0], vector[1], vector[2]) - ctx.field("TutorialSummary.applyMarker").touch() - MLAB.processEvents() - while not ctx.field("TutorialSummary.outSegmentationMask").isValid(): - MLAB.msleep(100) + MLAB.log("Setting marker position to [" + str(vector[0]) + "," + str(vector[1]) + "," + str(vector[2]) + "]...") + ctx.field("TutorialSummary.markerPosition").setValue(vector[0], vector[1], vector[2]) + ctx.field("TutorialSummary.applyMarker").touch() MLAB.processEvents() - MLAB.log("Marker position set to '" + str(ctx.field("TutorialSummary.markerPosition").value) + "'...") + + while not ctx.field("TutorialSummary.outSegmentationMask").isValid(): + MLAB.msleep(100) + MLAB.processEvents() + MLAB.log("Marker position set to '" + str(ctx.field("TutorialSummary.markerPosition").value) + "'...") ... ``` {{}} @@ -141,8 +142,8 @@ Having one test case for the requirement to load images and one for setting the ```Python ... def reset(): - MLAB.log("Resetting application...") - ctx.field("TutorialSummary.resetApplication").touch() + MLAB.log("Resetting application...") + ctx.field("TutorialSummary.resetApplication").touch() ... ``` {{}} @@ -157,12 +158,12 @@ The first requirement we want to test is the possibility to load DICOM data. Aft ... # Requirement 1: The application shall be able to load DICOM data def TEST_LoadDICOMData(): - # Set path to image and expect a valid image - loadImage(path_to_image) - ASSERT_TRUE(isImageValid()) - # Reset again and expect an invalid image - reset() - ASSERT_FALSE(isImageValid()) + # Set path to image and expect a valid image + loadImage(path_to_image) + ASSERT_TRUE(isImageValid()) + # Reset again and expect an invalid image + reset() + ASSERT_FALSE(isImageValid()) ... ``` {{}} @@ -178,25 +179,25 @@ This test case shall make sure the `RegionGrowing` module calculates the total v # Requirement 4: The 2D viewer shall provide the possibility to segment parts of the image based on a RegionGrowing algorithm # Requirement 4.1: It shall be possible to click into the image for defining a marker position for starting the RegionGrowing def TEST_RegionGrowing(): - # Load image and expect volumes and voxels without marker to be 0 - loadImage(path_to_image) - region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value - region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value - ASSERT_EQ(region_growing_voxels, 0) - ASSERT_EQ(region_growing_volume, 0) - # Set marker and expect volumes and voxels to be larger than 0 - reset() - setMarkerPosition(marker_location) - region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value - region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value - ASSERT_GT(region_growing_voxels, 0) - ASSERT_GT(region_growing_volume, 0) - # Reset application and expect volumes and voxels to be 0 again - reset() - region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value - region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value - ASSERT_EQ(region_growing_voxels, 0) - ASSERT_EQ(region_growing_volume, 0) + # Load image and expect volumes and voxels without marker to be 0 + loadImage(path_to_image) + region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value + region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value + ASSERT_EQ(region_growing_voxels, 0) + ASSERT_EQ(region_growing_volume, 0) + # Set marker and expect volumes and voxels to be larger than 0 + reset() + setMarkerPosition(marker_location) + region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value + region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value + ASSERT_GT(region_growing_voxels, 0) + ASSERT_GT(region_growing_volume, 0) + # Reset application and expect volumes and voxels to be 0 again + reset() + region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value + region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value + ASSERT_EQ(region_growing_voxels, 0) + ASSERT_EQ(region_growing_volume, 0) ... ``` {{}} @@ -213,38 +214,38 @@ Increasing the threshold shall result in larger volumes, decreasing shall result # Requirement 4.1: It shall be possible to click into the image for defining a marker position for starting the RegionGrowing # Requirement 4.2: It shall be possible to define a threshold for the RegionGrowing algorithm def TEST_RegionGrowing(): - # Load image and expect volumes and voxels without marker to be 0 - loadImage(path_to_image) - region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value - region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value - ASSERT_EQ(region_growing_voxels, 0) - ASSERT_EQ(region_growing_volume, 0) - # Set marker and expect volumes and voxels to be larger than 0 - setMarkerPosition(marker_location) - region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value - region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value - ASSERT_GT(region_growing_voxels, 0) - ASSERT_GT(region_growing_volume, 0) - # Test the threshold functionality by changing the value and comparing the results - current_threshold = ctx.field("TutorialSummary.thresholdInterval").value - current_threshold = current_threshold + 0.5 - ctx.field("TutorialSummary.thresholdInterval").value = current_threshold - region_growing_voxels_new = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value - region_growing_volume_new = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value - ASSERT_GT(region_growing_voxels_new, region_growing_voxels) - ASSERT_GT(region_growing_volume_new, region_growing_volume) - current_threshold = current_threshold - 0.7 - ctx.field("TutorialSummary.thresholdInterval").value = current_threshold - region_growing_voxels_new = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value - region_growing_volume_new = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value - ASSERT_LT(region_growing_voxels_new, region_growing_voxels) - ASSERT_LT(region_growing_volume_new, region_growing_volume) - # Reset application and expect volumes and voxels to be 0 again - reset() - region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value - region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value - ASSERT_EQ(region_growing_voxels, 0) - ASSERT_EQ(region_growing_volume, 0) + # Load image and expect volumes and voxels without marker to be 0 + loadImage(path_to_image) + region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value + region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value + ASSERT_EQ(region_growing_voxels, 0) + ASSERT_EQ(region_growing_volume, 0) + # Set marker and expect volumes and voxels to be larger than 0 + setMarkerPosition(marker_location) + region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value + region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value + ASSERT_GT(region_growing_voxels, 0) + ASSERT_GT(region_growing_volume, 0) + # Test the threshold functionality by changing the value and comparing the results + current_threshold = ctx.field("TutorialSummary.thresholdInterval").value + current_threshold = current_threshold + 0.5 + ctx.field("TutorialSummary.thresholdInterval").value = current_threshold + region_growing_voxels_new = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value + region_growing_volume_new = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value + ASSERT_GT(region_growing_voxels_new, region_growing_voxels) + ASSERT_GT(region_growing_volume_new, region_growing_volume) + current_threshold = current_threshold - 0.7 + ctx.field("TutorialSummary.thresholdInterval").value = current_threshold + region_growing_voxels_new = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value + region_growing_volume_new = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value + ASSERT_LT(region_growing_voxels_new, region_growing_voxels) + ASSERT_LT(region_growing_volume_new, region_growing_volume) + # Reset application and expect volumes and voxels to be 0 again + reset() + region_growing_voxels = ctx.field("TutorialSummary.RegionGrowing.numSegmentedVoxels").value + region_growing_volume = ctx.field("TutorialSummary.RegionGrowing.segmentedVolume_ml").value + ASSERT_EQ(region_growing_voxels, 0) + ASSERT_EQ(region_growing_volume, 0) ... ``` {{}} @@ -260,25 +261,25 @@ Nevertheless, we can write an automated test checking the possibility to define ```Python ... def TEST_OverlayColor(): - reset() - loadImage(path_to_image) - setMarkerPosition(marker_location) - ctx.field("SoCameraInteraction.viewAll").touch() - ctx.field("SoCameraInteraction.viewFromLeft").touch() - MLAB.processInventorQueue() - ctx.field("OffscreenRenderer.update").touch() - MLAB.processInventorQueue() - current_color = ctx.field("TutorialSummary.selectOverlayColor").value - ctx.field("TutorialSummary.selectOverlayColor").setValue(new_color) - ctx.field("SoCameraInteraction.viewAll").touch() - ctx.field("SoCameraInteraction.viewFromLeft").touch() - MLAB.processInventorQueue() - ctx.field("OffscreenRenderer1.update").touch() - MLAB.processInventorQueue() - ASSERT_NE(current_color, ctx.field("TutorialSummary.selectOverlayColor").value) - ASSERT_EQ(ctx.field("TutorialSummary.selectOverlayColor").value, ctx.field("TutorialSummary.SoView2DOverlay.baseColor").value) - ASSERT_EQ(ctx.field("TutorialSummary.selectOverlayColor").value, ctx.field("TutorialSummary.SoWEMRendererSegmentation.faceDiffuseColor").value) - ASSERT_FALSE(ctx.field("ImageCompare.testPassed").value) + reset() + loadImage(path_to_image) + setMarkerPosition(marker_location) + ctx.field("SoCameraInteraction.viewAll").touch() + ctx.field("SoCameraInteraction.viewFromLeft").touch() + MLAB.processInventorQueue() + ctx.field("OffscreenRenderer.update").touch() + MLAB.processInventorQueue() + current_color = ctx.field("TutorialSummary.selectOverlayColor").value + ctx.field("TutorialSummary.selectOverlayColor").setValue(new_color) + ctx.field("SoCameraInteraction.viewAll").touch() + ctx.field("SoCameraInteraction.viewFromLeft").touch() + MLAB.processInventorQueue() + ctx.field("OffscreenRenderer1.update").touch() + MLAB.processInventorQueue() + ASSERT_NE(current_color, ctx.field("TutorialSummary.selectOverlayColor").value) + ASSERT_EQ(ctx.field("TutorialSummary.selectOverlayColor").value, ctx.field("TutorialSummary.SoView2DOverlay.baseColor").value) + ASSERT_EQ(ctx.field("TutorialSummary.selectOverlayColor").value, ctx.field("TutorialSummary.SoWEMRendererSegmentation.faceDiffuseColor").value) + ASSERT_FALSE(ctx.field("ImageCompare.testPassed").value) ... ``` {{}} @@ -297,27 +298,27 @@ For the correctness of the volume calculation, we added the `CalculateVolume` mo ... # Requirement 8: The total volume of the segmented volume shall be calculated and shown (in ml) def TEST_VolumeCalculation(): - # Reset and expect all volumes and number of voxels to be 0 - reset() - reference_volume = ctx.field("CalculateVolume.totalVolume").value - ASSERT_EQ(reference_volume, 0) - # Load patient, set marker and expect all volumes and number of voxels to be > 0 - loadImage(path_to_image) - reference_volume = ctx.field("CalculateVolume.totalVolume").value - ASSERT_EQ(reference_volume, 0) - setMarkerPosition(marker_location) - reference_volume = ctx.field("CalculateVolume.totalVolume").value - current_volume = ctx.field("TutorialSummary.totalVolume").value - # Expect the total volume of the application to be the same as our additional CalculateVolume module - ASSERT_GT(reference_volume, 0) - ASSERT_EQ(reference_volume, current_volume) - #set marker to a different location and check if volumes change. - setMarkerPosition(marker_location_new) - reference_volume_new = ctx.field("CalculateVolume.totalVolume").value - current_volume_new = ctx.field("TutorialSummary.totalVolume").value - ASSERT_NE(reference_volume, reference_volume_new) - ASSERT_NE(current_volume, current_volume_new) - ASSERT_EQ(reference_volume_new, current_volume_new) + # Reset and expect all volumes and number of voxels to be 0 + reset() + reference_volume = ctx.field("CalculateVolume.totalVolume").value + ASSERT_EQ(reference_volume, 0) + # Load patient, set marker and expect all volumes and number of voxels to be > 0 + loadImage(path_to_image) + reference_volume = ctx.field("CalculateVolume.totalVolume").value + ASSERT_EQ(reference_volume, 0) + setMarkerPosition(marker_location) + reference_volume = ctx.field("CalculateVolume.totalVolume").value + current_volume = ctx.field("TutorialSummary.totalVolume").value + # Expect the total volume of the application to be the same as our additional CalculateVolume module + ASSERT_GT(reference_volume, 0) + ASSERT_EQ(reference_volume, current_volume) + #set marker to a different location and check if volumes change. + setMarkerPosition(marker_location_new) + reference_volume_new = ctx.field("CalculateVolume.totalVolume").value + current_volume_new = ctx.field("TutorialSummary.totalVolume").value + ASSERT_NE(reference_volume, reference_volume_new) + ASSERT_NE(current_volume, current_volume_new) + ASSERT_EQ(reference_volume_new, current_volume_new) ... ``` {{}} @@ -341,42 +342,42 @@ Initially, without any marker and segmentation, the views *Both* and *Head* show # Requirement 9.2: Segmentation results # Requirement 9.3: All def TEST_Toggle3DVolumes(): - # Set ImageCompare.postErrorOnDiff to False because otherwise differences will lead to a failed test - ctx.field("ImageCompare.postErrorOnDiff").value = False - # Reset application and check if number of voxels is 0 on output - reset() - loadImage(path_to_image) - # Without marker, the content of the 3D viewer should be the same for File and All - ctx.field("TutorialSummary.selected3DView").value = "Both" - MLAB.processInventorQueue() - ctx.field("SoCameraInteraction.viewFromLeft").touch() - MLAB.processInventorQueue() - ctx.field("OffscreenRenderer.update").touch() - ctx.field("TutorialSummary.selected3DView").value = "File" - MLAB.processInventorQueue() - ctx.field("OffscreenRenderer1.update").touch() - ctx.field("ImageCompare.compare").touch() - ASSERT_TRUE(ctx.field("ImageCompare.testPassed").value) - # With marker, the content of the 3D viewer should be different - setMarkerPosition(marker_location) - ctx.field("TutorialSummary.selected3DView").value = "Both" - MLAB.processInventorQueue() - ctx.field("OffscreenRenderer.update").touch() - ctx.field("TutorialSummary.selected3DView").value = "File" - ctx.field("OffscreenRenderer1.update").touch() - MLAB.processInventorQueue() - ctx.field("ImageCompare.compare").touch() - ASSERT_FALSE(ctx.field("ImageCompare.testPassed").value) - ctx.field("TutorialSummary.selected3DView").value = "Segmented" - ctx.field("OffscreenRenderer1.update").touch() - MLAB.processInventorQueue() - ctx.field("ImageCompare.compare").touch() - ASSERT_FALSE(ctx.field("ImageCompare.testPassed").value) - ctx.field("TutorialSummary.selected3DView").value = "Both" - ctx.field("OffscreenRenderer.update").touch() - MLAB.processInventorQueue() - ctx.field("ImageCompare.compare").touch() - ASSERT_FALSE(ctx.field("ImageCompare.testPassed").value) + # Set ImageCompare.postErrorOnDiff to False because otherwise differences will lead to a failed test + ctx.field("ImageCompare.postErrorOnDiff").value = False + # Reset application and check if number of voxels is 0 on output + reset() + loadImage(path_to_image) + # Without marker, the content of the 3D viewer should be the same for File and All + ctx.field("TutorialSummary.selected3DView").value = "Both" + MLAB.processInventorQueue() + ctx.field("SoCameraInteraction.viewFromLeft").touch() + MLAB.processInventorQueue() + ctx.field("OffscreenRenderer.update").touch() + ctx.field("TutorialSummary.selected3DView").value = "File" + MLAB.processInventorQueue() + ctx.field("OffscreenRenderer1.update").touch() + ctx.field("ImageCompare.compare").touch() + ASSERT_TRUE(ctx.field("ImageCompare.testPassed").value) + # With marker, the content of the 3D viewer should be different + setMarkerPosition(marker_location) + ctx.field("TutorialSummary.selected3DView").value = "Both" + MLAB.processInventorQueue() + ctx.field("OffscreenRenderer.update").touch() + ctx.field("TutorialSummary.selected3DView").value = "File" + ctx.field("OffscreenRenderer1.update").touch() + MLAB.processInventorQueue() + ctx.field("ImageCompare.compare").touch() + ASSERT_FALSE(ctx.field("ImageCompare.testPassed").value) + ctx.field("TutorialSummary.selected3DView").value = "Segmented" + ctx.field("OffscreenRenderer1.update").touch() + MLAB.processInventorQueue() + ctx.field("ImageCompare.compare").touch() + ASSERT_FALSE(ctx.field("ImageCompare.testPassed").value) + ctx.field("TutorialSummary.selected3DView").value = "Both" + ctx.field("OffscreenRenderer.update").touch() + MLAB.processInventorQueue() + ctx.field("ImageCompare.compare").touch() + ASSERT_FALSE(ctx.field("ImageCompare.testPassed").value) ... ``` {{}} diff --git a/mevislab.github.io/content/tutorials/summary/summary6.md b/mevislab.github.io/content/tutorials/summary/summary6.md index 8b0d7532e..376ad03d3 100644 --- a/mevislab.github.io/content/tutorials/summary/summary6.md +++ b/mevislab.github.io/content/tutorials/summary/summary6.md @@ -38,22 +38,22 @@ In MATE, add another field to your *Parameters* section and reuse the field by s ```Stan Interface { ... - Parameters { - ... - Field selectOverlayTransparency { - internalName = SoView2DOverlay.alphaFactor + Parameters { + ... + Field selectOverlayTransparency { + internalName = SoView2DOverlay.alphaFactor + } + ... } - ... - } } Window { ... Box Settings { ... - Field selectOverlayTransparency { - title = Alpha - } + Field selectOverlayTransparency { + title = Alpha + } ... } ... diff --git a/mevislab.github.io/content/tutorials/summary/summary8.md b/mevislab.github.io/content/tutorials/summary/summary8.md index c23533770..c7d50c29b 100644 --- a/mevislab.github.io/content/tutorials/summary/summary8.md +++ b/mevislab.github.io/content/tutorials/summary/summary8.md @@ -76,20 +76,20 @@ The file opens in MATE and you will see that it looks similar to the *.script* f {{< highlight filename="TutorialSummaryBrowser.script" >}} ```Stan Web { - plugin = "$(MLAB_MeVisLab_Private)/Sources/Web/application/js/jquery/Plugin.js" - plugin = "$(MLAB_MeVisLab_Private)/Sources/Web/application/js/yui/Plugin.js" - - // Specify web plugins here. If you have additional JavaScript files, you can load them from - // the plugin. It is also possible to load other plugins here. - plugin = "$(LOCAL)/www/js/Plugin.js" - - Deployment { - // Deploy the www directory recursively when building web application installers - directory = "$(LOCAL)/www" - } - - // The developer URL is used by the startWorkerService.py user script. - developerUrl = "MeVis/TutorialSummary/Projects/TutorialSummaryBrowser/Modules/www/TutorialSummaryBrowser.html" + plugin = "$(MLAB_MeVisLab_Private)/Sources/Web/application/js/jquery/Plugin.js" + plugin = "$(MLAB_MeVisLab_Private)/Sources/Web/application/js/yui/Plugin.js" + + // Specify web plugins here. If you have additional JavaScript files, you can load them from + // the plugin. It is also possible to load other plugins here. + plugin = "$(LOCAL)/www/js/Plugin.js" + + Deployment { + // Deploy the www directory recursively when building web application installers + directory = "$(LOCAL)/www" + } + + // The developer URL is used by the startWorkerService.py user script. + developerUrl = "MeVis/TutorialSummary/Projects/TutorialSummaryBrowser/Modules/www/TutorialSummaryBrowser.html" } ``` {{}} @@ -101,62 +101,62 @@ You can also copy all fields from *Parameters* section to your web macro module {{< highlight filename="TutorialSummaryBrowser.script" >}} ```Stan Interface { - Inputs {} - Outputs { - Field out2D { internalName = RemoteRendering2D.output } - Field out3D { internalName = RemoteRendering3D.output } - Field outSegmentationMask { internalName = CloseGap.output0 } - } - Parameters { - Field openFile { - type = String - internalName = LocalImage.name - } - Field selectOverlayColor { - internalName = SoView2DOverlay.baseColor - type = Color - } - Field selectOverlayTransparency { - internalName = SoView2DOverlay.alphaFactor - } - Field imageAlpha { - internalName = SoWEMRendererImage.faceAlphaValue - type = Integer - min = 0 - max = 1 - } - Field thresholdInterval { - internalName = RegionGrowing.autoThresholdIntervalSizeInPercent - type = Integer - min = 0 - max = 100 - } - Field isoValueImage { - internalName = IsoSurfaceImage.isoValue - type = Integer - min = 0 - max = 1000 - } - Field selected3DView { - type = Enum - values = Segmented,File,Both - } - Field totalVolume { - internalName = CalculateVolume.totalVolume - editable = False - } - Field resetApplication { - type = Trigger - title = Reset + Inputs {} + Outputs { + Field out2D { internalName = RemoteRendering2D.output } + Field out3D { internalName = RemoteRendering3D.output } + Field outSegmentationMask { internalName = CloseGap.output0 } } - Field markerPosition { - type = Vector3 + Parameters { + Field openFile { + type = String + internalName = LocalImage.name + } + Field selectOverlayColor { + internalName = SoView2DOverlay.baseColor + type = Color + } + Field selectOverlayTransparency { + internalName = SoView2DOverlay.alphaFactor + } + Field imageAlpha { + internalName = SoWEMRendererImage.faceAlphaValue + type = Integer + min = 0 + max = 1 + } + Field thresholdInterval { + internalName = RegionGrowing.autoThresholdIntervalSizeInPercent + type = Integer + min = 0 + max = 100 + } + Field isoValueImage { + internalName = IsoSurfaceImage.isoValue + type = Integer + min = 0 + max = 1000 + } + Field selected3DView { + type = Enum + values = Segmented,File,Both + } + Field totalVolume { + internalName = CalculateVolume.totalVolume + editable = False + } + Field resetApplication { + type = Trigger + title = Reset + } + Field markerPosition { + type = Vector3 + } + Field applyMarker { + type = Trigger + title = Add + } } - Field applyMarker { - type = Trigger - title = Add - } - } } ``` {{}} @@ -178,20 +178,20 @@ Open the *.script* files of your macro modules and copy the *FieldListeners* fro {{< highlight filename="TutorialSummaryBrowser.script" >}} ```Stan Commands { - source = $(LOCAL)/TutorialSummaryBrowser.py - - FieldListener selected3DView { - command = viewSelectionChanged - } - FieldListener resetApplication { - command = resetApplication - } - FieldListener markerPosition { - command = insertPosition - } - FieldListener applyMarker { - command = applyPosition - } + source = $(LOCAL)/TutorialSummaryBrowser.py + + FieldListener selected3DView { + command = viewSelectionChanged + } + FieldListener resetApplication { + command = resetApplication + } + FieldListener markerPosition { + command = insertPosition + } + FieldListener applyMarker { + command = applyPosition + } } ``` {{}} @@ -201,63 +201,65 @@ Also copy the *Window* section to your web macro module. The *Box* of the *Viewi {{< highlight filename="TutorialSummaryBrowser.script" >}} ```Stan Window "MainPanel" { - // Define minimum width and height - minimumWidth = 400 - minimumHeight = 300 - initCommand = resetApplication - // Vertical Layout and 4 Boxes with Horizontal Layout - Vertical { - Box Source { - layout = Horizontal - Field openFile { - browseButton = True - browseMode = open - } - Field resetApplication { } - } - Box Viewing { - layout = Horizontal - RemoteRendering out2D { - expandX = True - expandY = True - } - RemoteRendering out3D { - expandX = True - expandY = True - } - } - Box Settings { - layout = Horizontal - Field selectOverlayColor { - title = Color - } - Field selectOverlayTransparency { - title = Alpha - } - Field imageAlpha { - step = 0.1 - slider = True - } - Field thresholdInterval { - step = 0.1 - slider = True - } - Field isoValueImage { - step = 2 - slider = True - } - Field markerPosition {} - Field applyMarker {} - ComboBox selected3DView { - alignX = Left - editable = False - } - } - Box Info { - layout = Horizontal - Field totalVolume {} + // Define minimum width and height + minimumWidth = 400 + minimumHeight = 300 + initCommand = resetApplication + Category { + // Vertical Layout and 4 Boxes with Horizontal Layout + Vertical { + Box Source { + layout = Horizontal + Field openFile { + browseButton = True + browseMode = open + } + Field resetApplication { } + } + Box Viewing { + layout = Horizontal + RemoteRendering out2D { + expandX = True + expandY = True + } + RemoteRendering out3D { + expandX = True + expandY = True + } + } + Box Settings { + layout = Horizontal + Field selectOverlayColor { + title = Color + } + Field selectOverlayTransparency { + title = Alpha + } + Field imageAlpha { + step = 0.1 + slider = True + } + Field thresholdInterval { + step = 0.1 + slider = True + } + Field isoValueImage { + step = 2 + slider = True + } + Field markerPosition {} + Field applyMarker {} + ComboBox selected3DView { + alignX = Left + editable = False + } + } + Box Info { + layout = Horizontal + Field totalVolume {} + } + } } - } } ``` {{}} @@ -285,31 +287,31 @@ MLABRemote.setup(ctx) @allowedRemoteCall def viewSelectionChanged(field): - if field.value == "Segmented": - ctx.field("SoSwitch.whichChild").value = 0 - if field.value == "File": - ctx.field("SoSwitch.whichChild").value = 1 - if field.value == "Both": - ctx.field("SoSwitch.whichChild").value = 2 + if field.value == "Segmented": + ctx.field("SoSwitch.whichChild").value = 0 + if field.value == "File": + ctx.field("SoSwitch.whichChild").value = 1 + if field.value == "Both": + ctx.field("SoSwitch.whichChild").value = 2 @allowedRemoteCall def resetApplication(): - ctx.field("RegionGrowing.clear").touch() - ctx.field("SoView2DMarkerEditor.deleteAll").touch() - ctx.field("LocalImage.close").touch() - ctx.field("imageAlpha").value = 0.5 - ctx.field("thresholdInterval").value = 1.0 - ctx.field("isoValueImage").value = 200 - ctx.field("selected3DView").value = "Both" + ctx.field("RegionGrowing.clear").touch() + ctx.field("SoView2DMarkerEditor.deleteAll").touch() + ctx.field("LocalImage.close").touch() + ctx.field("imageAlpha").value = 0.5 + ctx.field("thresholdInterval").value = 1.0 + ctx.field("isoValueImage").value = 200 + ctx.field("selected3DView").value = "Both" @allowedRemoteCall def insertPosition(field): - ctx.field("SoView2DMarkerEditor.newPosXYZ").value = field.value + ctx.field("SoView2DMarkerEditor.newPosXYZ").value = field.value @allowedRemoteCall def applyPosition(): - ctx.field("SoView2DMarkerEditor.useInsertTemplate").value = True - ctx.field("SoView2DMarkerEditor.add").touch() + ctx.field("SoView2DMarkerEditor.useInsertTemplate").value = True + ctx.field("SoView2DMarkerEditor.add").touch() ``` {{}} diff --git a/mevislab.github.io/content/tutorials/thirdparty/MONAI/monaiexample2.md b/mevislab.github.io/content/tutorials/thirdparty/MONAI/monaiexample2.md index 7ee3790b7..d51ff7a9b 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/MONAI/monaiexample2.md +++ b/mevislab.github.io/content/tutorials/thirdparty/MONAI/monaiexample2.md @@ -60,15 +60,15 @@ Add the following code into the *.script* file and save. {{< highlight filename="MONAIDemo.script" >}} ```Stan Interface { - Inputs { - Field inputImage { type = Image } - } - Outputs { - Field outImage { internalName = PythonImage.output0 } - } - Parameters { - Field start { type = Trigger } - } + Inputs { + Field inputImage { type = Image } + } + Outputs { + Field outImage { internalName = PythonImage.output0 } + } + Parameters { + Field start { type = Trigger } + } } ``` {{}} @@ -83,7 +83,7 @@ Add a *Commands* section to your *.script* file. ```Stan ... Commands { - source = $(LOCAL)/MONAIDemo.py + source = $(LOCAL)/MONAIDemo.py } ... ``` @@ -107,9 +107,9 @@ Define your input image field to reuse the internal name of the left input of th {{< highlight filename="MONAIDemo.script" >}} ```Stan Interface { - Inputs { - Field inputImage { internalName = Resample3D.input0 } - } + Inputs { + Field inputImage { internalName = Resample3D.input0 } + } ... } ``` @@ -124,11 +124,11 @@ Again, open the *.script* file and change the internal name of your *outImage* f {{< highlight filename="MONAIDemo.script" >}} ```Stan Interface { - ... - Outputs { - Field outImage { internalName = Resample3D1.output0 } - } - ... + ... + Outputs { + Field outImage { internalName = Resample3D1.output0 } + } + ... } ``` {{}} @@ -160,12 +160,12 @@ Open the *.script* file and add the fields *start* and *voxelSize* to your local {{< highlight filename="MONAIDemo.script" >}} ```Stan Interface { - ... - Parameters { - Field start { type = Trigger } - Field voxelSize { internalName = Resample3D.voxelSize } - } - ... + ... + Parameters { + Field start { type = Trigger } + Field voxelSize { internalName = Resample3D.voxelSize } + } + ... } ``` {{}} @@ -185,15 +185,15 @@ Open the *.script* file and add the following fields to your local macro module {{< highlight filename="MONAIDemo.script" >}} ```Stan Interface { - ... - Parameters { ... - Field sizeX { type = Int } - Field sizeY { type = Int } - Field sizeZ { type = Int } + Parameters { + ... + Field sizeX { type = Int } + Field sizeY { type = Int } + Field sizeZ { type = Int } + ... + } ... - } - ... } ``` {{}} @@ -210,14 +210,14 @@ Open the *.script* file and add the following fields to your local macro module {{< highlight filename="MONAIDemo.script" >}} ```Stan Interface { - ... - Parameters { ... - Field thresholdMin { internalName = IntervalThreshold.threshMin } - Field thresholdMax { internalName = IntervalThreshold.threshMax } + Parameters { + ... + Field thresholdMin { internalName = IntervalThreshold.threshMin } + Field thresholdMax { internalName = IntervalThreshold.threshMax } + ... + } ... - } - ... } ``` {{}} @@ -233,14 +233,14 @@ Open the *.script* file and add the following fields to your local macro module {{< highlight filename="MONAIDemo.script" >}} ```Stan Interface { - ... - Parameters { ... - Field scaleMin { internalName = Scale.outputMin } - Field scaleMax { internalName = Scale.outputMax } + Parameters { + ... + Field scaleMin { internalName = Scale.outputMin } + Field scaleMax { internalName = Scale.outputMax } + ... + } ... - } - ... } ``` {{}} @@ -271,27 +271,27 @@ We add some Field Listeners to our *Commands* section of the *.script* file. The ```Stan ... Commands { - source = $(LOCAL)/MONAIDemo.py - - FieldListener start { - command = onStart - } - - FieldListener sizeX { - command = _sizeChanged - } - - FieldListener sizeY { - command = _sizeChanged - } - - FieldListener sizeZ { - command = _sizeChanged - } - - FieldListener inputImage { - command = _setDefaultValues - } + source = $(LOCAL)/MONAIDemo.py + + FieldListener start { + command = onStart + } + + FieldListener sizeX { + command = _sizeChanged + } + + FieldListener sizeY { + command = _sizeChanged + } + + FieldListener sizeZ { + command = _sizeChanged + } + + FieldListener inputImage { + command = _setDefaultValues + } } ... ``` @@ -360,53 +360,53 @@ We want to use the image that has been modified according to our pretrained netw {{< highlight filename="MONAIDemo.py" >}} ```Python ... - def onStart(): - print("\n--- Start ---") - try: - inputImage = _getImage() - - if inputImage: - imageArray = inputImage.getTile( - (0, 0, 0, 0, 0, 0), inputImage.imageExtent() - ) - # We only need x, y and z-dimensions - image = imageArray[0, 0, 0, :, :, :] - - print(f"Using image {image.shape}") - - # prepare tensor - inputTensor = torch.tensor(image[None, None, :, :, :]).to(DEVICE) - print(f" Tensorform: {tuple(inputTensor.shape)}") - # Load Bundle-Configuration - parser = load_bundle_config(MODEL_DIR, "train.json") - - # Create network from train.json - model = parser.get_parsed_content("network_def") - model.load_state_dict(torch.load(MODEL_PATH, map_location=DEVICE)) - model.to(DEVICE) - model.eval() - print("Model loaded and initialized.") - - # Inference - with torch.no_grad(): - output = model(inputTensor) - prediction = output.argmax(dim=1, keepdim=True).cpu().numpy()[0, 0] - - print("Inference done.") - - # Result back into MeVisLab - interface = ctx.module("PythonImage").call("getInterface") - interface.setImage( - prediction, voxelToWorldMatrix=inputImage.voxelToWorldMatrix() - ) - - print("--- Segmentation done ---\n") - - except Exception as e: - print("Error:", e) - import traceback - - traceback.print_exc() + def onStart(): + print("\n--- Start ---") + try: + inputImage = _getImage() + + if inputImage: + imageArray = inputImage.getTile( + (0, 0, 0, 0, 0, 0), inputImage.imageExtent() + ) + # We only need x, y and z-dimensions + image = imageArray[0, 0, 0, :, :, :] + + print(f"Using image {image.shape}") + + # prepare tensor + inputTensor = torch.tensor(image[None, None, :, :, :]).to(DEVICE) + print(f" Tensorform: {tuple(inputTensor.shape)}") + # Load Bundle-Configuration + parser = load_bundle_config(MODEL_DIR, "train.json") + + # Create network from train.json + model = parser.get_parsed_content("network_def") + model.load_state_dict(torch.load(MODEL_PATH, map_location=DEVICE)) + model.to(DEVICE) + model.eval() + print("Model loaded and initialized.") + + # Inference + with torch.no_grad(): + output = model(inputTensor) + prediction = output.argmax(dim=1, keepdim=True).cpu().numpy()[0, 0] + + print("Inference done.") + + # Result back into MeVisLab + interface = ctx.module("PythonImage").call("getInterface") + interface.setImage( + prediction, voxelToWorldMatrix=inputImage.voxelToWorldMatrix() + ) + + print("--- Segmentation done ---\n") + + except Exception as e: + print("Error:", e) + import traceback + + traceback.print_exc() ... ``` {{}} @@ -418,25 +418,25 @@ We have to calculate a bounding box in our `ROISelect` module and need to be abl {{< highlight filename="MONAIDemo.py" >}} ```Python ... - def _sizeChanged(field: "mevislab.MLABField"): - if ctx.field("Resample3D.output0").isValid(): - voxelSizeImage = ctx.field("Resample3D.output0").image() - # Get the size of this image - voxelSizeImageExtent = voxelSizeImage.imageExtent() - - # Calculate region of interest by defining start point and size - roiStartX = voxelSizeImageExtent[0] - ctx.field("sizeX").value - roiStartY = voxelSizeImageExtent[1] - ctx.field("sizeY").value - roiStartZ = voxelSizeImageExtent[2] - ctx.field("sizeZ").value - - ctx.field("ROISelect.startVoxelX").value = roiStartX - ctx.field("ROISelect.startVoxelY").value = roiStartY - ctx.field("ROISelect.startVoxelZ").value = roiStartZ - - # Subtract 1 because the voxel values start with 0 - ctx.field("ROISelect.endVoxelX").value = voxelSizeImageExtent[0] - 1 - ctx.field("ROISelect.endVoxelY").value = voxelSizeImageExtent[1] - 1 - ctx.field("ROISelect.endVoxelZ").value = voxelSizeImageExtent[2] - 1 + def _sizeChanged(field: "mevislab.MLABField"): + if ctx.field("Resample3D.output0").isValid(): + voxelSizeImage = ctx.field("Resample3D.output0").image() + # Get the size of this image + voxelSizeImageExtent = voxelSizeImage.imageExtent() + + # Calculate region of interest by defining start point and size + roiStartX = voxelSizeImageExtent[0] - ctx.field("sizeX").value + roiStartY = voxelSizeImageExtent[1] - ctx.field("sizeY").value + roiStartZ = voxelSizeImageExtent[2] - ctx.field("sizeZ").value + + ctx.field("ROISelect.startVoxelX").value = roiStartX + ctx.field("ROISelect.startVoxelY").value = roiStartY + ctx.field("ROISelect.startVoxelZ").value = roiStartZ + + # Subtract 1 because the voxel values start with 0 + ctx.field("ROISelect.endVoxelX").value = voxelSizeImageExtent[0] - 1 + ctx.field("ROISelect.endVoxelY").value = voxelSizeImageExtent[1] - 1 + ctx.field("ROISelect.endVoxelZ").value = voxelSizeImageExtent[2] - 1 ... ``` {{}} @@ -449,15 +449,15 @@ Open the *.script* file and add a *Window* section. In this window, we reuse the ```Stan ... Window { - height = 100 - width = 100 - Category { - Viewer ROISelect.scene.self { - type = SoRenderArea - expandX = True - expandY = True + height = 100 + width = 100 + Category { + Viewer ROISelect.scene.self { + type = SoRenderArea + expandX = True + expandY = True + } } - } } ... ``` @@ -473,17 +473,17 @@ Back to Python, we now need to reset our module to default in the case the input ```Python ... def _setDefaultValues(): - ctx.field("voxelSize").value = [1.5, 1.5, 2] - ctx.field("sizeX").value = 160 - ctx.field("sizeY").value = 160 - ctx.field("sizeZ").value = 160 - ctx.field("thresholdMin").value = -57 - ctx.field("thresholdMax").value = 164 - ctx.field("scaleMin").value = 0 - ctx.field("scaleMax").value = 1 - - interface = ctx.module("PythonImage").call("getInterface") - interface.unsetImage() + ctx.field("voxelSize").value = [1.5, 1.5, 2] + ctx.field("sizeX").value = 160 + ctx.field("sizeY").value = 160 + ctx.field("sizeZ").value = 160 + ctx.field("thresholdMin").value = -57 + ctx.field("thresholdMax").value = 164 + ctx.field("scaleMin").value = 0 + ctx.field("scaleMax").value = 1 + + interface = ctx.module("PythonImage").call("getInterface") + interface.unsetImage() ... ``` {{}} diff --git a/mevislab.github.io/content/tutorials/thirdparty/matplotlib/2Dplotting.md b/mevislab.github.io/content/tutorials/thirdparty/matplotlib/2Dplotting.md index 98f806042..8c0321c1e 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/matplotlib/2Dplotting.md +++ b/mevislab.github.io/content/tutorials/thirdparty/matplotlib/2Dplotting.md @@ -31,35 +31,36 @@ This new panel window contains a Matplotlib canvas where the plots will be displ {{< highlight filename = "BaseNetwork.script">}} ```Stan Window { - Category { - Horizontal { - Vertical { - expandY = True - expandX = False - Box { - title= "Single Slice" + Category { + Horizontal { + Vertical { + expandY = True + expandX = False + Box { + title= "Single Slice" + } + Box { + title = "Sequence" + } + Empty { + expandY = True + } + } + Box { + MatplotlibCanvas { + expandY = True + expandX = True + name = canvas + useToolBar = True + } + expandY = True + expandX = True + } } - Box { - title = "Sequence" - } - Empty { - expandY = True - } - } - Box { - MatplotlibCanvas { - expandY = True - expandX = True - name = canvas - useToolBar = True - } - expandY = True - expandX = True - } } - } } -``` {{}} +``` +{{}} Letting a box expand on the x- or y-axis or adding an empty object do so contributes to the panel looking a certain way and helps the positioning of the elements. You can also try to vary the positioning by adding or removing "expand" statements or moving boxes from a vertical to a horizontal alignment. Hover over the boxes in the preview to explore the concept. @@ -85,7 +86,7 @@ But there are a few other module parameters that must be set beforehand to make To do so, we will be defining a "setDefaults" function for our module. Open the *.py* file and add the code below. {{< highlight filename = "BaseNetwork.py">}} -```Stan +```Python def setDefaults(): ctx.field("SubImage.fullSize").touch() ctx.field("SubImage.autoApply").value = True @@ -97,12 +98,13 @@ def setDefaults(): ctx.field("Histogram.curveType").value = "Area" ctx.field("Histogram.useStepFunction").value = True ctx.field("Histogram.curveStyle").value = 7 -``` {{}} +``` +{{}} As it is also incredibly important that the values of the parameters we are referencing are regularly updated, we will be setting some global values containing those values. {{< highlight filename = "BaseNetwork.py">}} -```Stan +```Python startSlice = None endSlice = None @@ -113,12 +115,13 @@ def updateSlices(): startSlice = int(ctx.field("SubImage.z").value) endSlice = int(ctx.field("SubImage.sz").value) bins = ctx.field("Histogram.binSize").value -``` {{}} +``` +{{}} Make sure that the variable declarations as "None" are put above the "setDefaults" function and add the execution of the "updateSlices()" function into the "setDefaults" function, like so: {{< highlight filename = "BaseNetwork.py">}} -```Stan +```Python def setDefaults(): ctx.field("Histogram.xRange").value = "Dynamic Min/Max" ctx.field("Histogram.useZeroAsBinCenter").value = False @@ -131,7 +134,8 @@ def setDefaults(): ctx.field("SubImage.autoApply").value = True ctx.field("Histogram.updateMode").value = "AutoUpdate" updateSlices() -``` {{}} +``` +{{}} Now we are ensuring that the "setDefaults" function and therefore also the "updateSlices" function are executed every time the panel is opened by setting "setDefaults" as a wakeup command. @@ -142,7 +146,8 @@ Commands { wakeupCommand = "setDefaults" } -``` {{}} +``` +{{}} And we add field listeners, so that the field values that we are working with are updated every time they are changed. @@ -154,11 +159,11 @@ Commands { wakeupCommand = "setDefaults" FieldListener { - listenField = "SubImage.sz" - listenField = "SubImage.z" - listenField = "Histogram.binSize" + listenField = "SubImage.sz" + listenField = "SubImage.z" + listenField = "Histogram.binSize" - command = "updateSlices" + command = "updateSlices" } } ``` {{}} @@ -169,46 +174,49 @@ Put this inside of the box titled "Single Slice": {{< highlight filename = "BaseNetwork.script">}} ```Stan Field "SubImage.sz" { - title = "Plot slice" + title = "Plot slice" } Button { - title = "in 2D" - command = "singleSlice2D" + title = "in 2D" + command = "singleSlice2D" } Button { - title = "in 3D" - command = "click3D" + title = "in 3D" + command = "click3D" } Empty {} -``` {{}} +``` +{{}} And then add this to your box titled "Sequence": {{< highlight filename = "BaseNetwork.script">}} ```Stan Field "SubImage.z" { - title = "From slice" + title = "From slice" } Field "SubImage.sz" { - title = "To slice" + title = "To slice" } Button { - title = "Plot 2D" - command = "click2D" + title = "Plot 2D" + command = "click2D" } Button { - title = "Plot 3D" - command = "click3D" + title = "Plot 3D" + command = "click3D" } -``` {{}} +``` +{{}} Lastly, put this under your two boxes, but above the empty element in the vertical alignment: {{< highlight filename = "BaseNetwork.script">}} ```Stan Field "Histogram.binSize" { - title = "Bin size" + title = "Bin size" } -``` {{}} +``` +{{}} If you followed all of the listed steps, your panel preview should look like this and display all the current parameter values. ![Adapted macro panel](images/tutorials/thirdparty/Matplotlib10.PNG) @@ -218,16 +226,17 @@ You will have noticed how all of the buttons in the *.script* file have a comman However, for any of the functions referenced via "command" to work, we need one that ensures that the plots are shown on the integrated Matplotlib canvas. We will start with that one. {{< highlight filename = "BaseNetwork.py">}} -```Stan +```Python def clearFigure(): control = ctx.control("canvas").object() control.figure().clear() -``` {{}} +``` +{{}} Now that this is prepared and ready, we can add the functions to extract the data: {{< highlight filename = "BaseNetwork.py">}} -```Stan +```Python def getX(): x = ctx.field("Histogram.outputHistogramCurve").object().getXValues() stringx = ",".join([str(i) for i in x]) @@ -239,12 +248,13 @@ def getY(): stringy = ",".join([str(i) for i in y]) yValues = stringy.split(",") return [float(s) for s in yValues] -``` {{}} +``` +{{}} And lastly, enable the plotting of a single slice as well as a sequence in 2D through our panel by adding the code below. {{< highlight filename = "BaseNetwork.py">}} -```Stan +```Python def singleSlice2D(): lastSlice = endSlice ctx.field("SubImage.z").value = endSlice @@ -287,7 +297,8 @@ def click2D(): figure.canvas.draw() else: plotSequence() -``` {{}} +``` +{{}} You should now be able to reproduce results like these: diff --git a/mevislab.github.io/content/tutorials/thirdparty/matplotlib/3Dplotting.md b/mevislab.github.io/content/tutorials/thirdparty/matplotlib/3Dplotting.md index 747a3e17e..ef487cac9 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/matplotlib/3Dplotting.md +++ b/mevislab.github.io/content/tutorials/thirdparty/matplotlib/3Dplotting.md @@ -22,7 +22,7 @@ In this tutorial, we will equip the macro module we created in the [Example 1: M The fields and commands needed have already been prepared in the second tutorial. We will just have to modify our *.py* file a little bit to make them usable. Integrate the following code into your *.py* file and import numpy. {{< highlight filename = "BaseNetwork.py">}} -```Stan +```Python def click3D(): clearFigure() figure = ctx.control("canvas").object().figure() @@ -47,7 +47,8 @@ def click3D(): subplot.set_title(f'Sequence from {values[0]} to {endSlice}') ctx.field("SubImage.z").value = values[0] figure.canvas.draw() -``` {{}} +``` +{{}} After saving, you should be able to reproduce results like these: diff --git a/mevislab.github.io/content/tutorials/thirdparty/matplotlib/modulesetup.md b/mevislab.github.io/content/tutorials/thirdparty/matplotlib/modulesetup.md index daef8cefd..5b2afce90 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/matplotlib/modulesetup.md +++ b/mevislab.github.io/content/tutorials/thirdparty/matplotlib/modulesetup.md @@ -60,9 +60,10 @@ Now open the *.script* file of your newly created macro through the context menu {{< highlight filename = "BaseNetwork.script">}} ```Stan Commands{ - source = $(LOCAL)/BaseNetwork.py + source = $(LOCAL)/BaseNetwork.py } -``` {{}} +``` +{{}} Click the "Reload" button, which is located above the script for the *.py* file to be added into the module definition folder, then open it using the "Files" button on the same bar as demonstrated below: diff --git a/mevislab.github.io/content/tutorials/thirdparty/matplotlib/slicecomparison.md b/mevislab.github.io/content/tutorials/thirdparty/matplotlib/slicecomparison.md index 96c1a6415..9cedc70aa 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/matplotlib/slicecomparison.md +++ b/mevislab.github.io/content/tutorials/thirdparty/matplotlib/slicecomparison.md @@ -29,19 +29,20 @@ Add the following code into your *.script* file between the "Single Slice" and t {{< highlight filename = "BaseNetwork.script">}} ```Stan Box { - title = "Comparison" - Field "SubImage.z" { - title = "Compare slice" - } - Field "SubImage.sz" { - title = "With slice" - } - Button { - title = "Plot" - command = "comparison" - } + title = "Comparison" + Field "SubImage.z" { + title = "Compare slice" + } + Field "SubImage.sz" { + title = "With slice" + } + Button { + title = "Plot" + command = "comparison" + } } -``` {{}} +``` +{{}} Your panel should now be changed to look like this: @@ -50,7 +51,7 @@ Your panel should now be changed to look like this: We will now add the "comparison" function, to give the "Plot" button in our "Comparison" box a purpose. To do so, switch to your module's *.py* file and choose a cosy place for the following piece of code: {{< highlight filename = "BaseNetwork.py">}} -```Stan +```Python def comparison(): clearFigure() figure = ctx.control("canvas").object().figure() @@ -76,7 +77,8 @@ def comparison(): subplot.legend([f'Slice {i}' for i in values]) figure.canvas.draw() ctx.field("SubImage.z").value = values[0] -``` {{}} +``` +{{}} You should now be able to reproduce results like these: diff --git a/mevislab.github.io/content/tutorials/thirdparty/opencv/thirdpartyexample1.md b/mevislab.github.io/content/tutorials/thirdparty/opencv/thirdpartyexample1.md index 8546a7e94..5ca81132d 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/opencv/thirdpartyexample1.md +++ b/mevislab.github.io/content/tutorials/thirdparty/opencv/thirdpartyexample1.md @@ -45,41 +45,43 @@ Add the following to your file: {{< highlight filename=".script" >}} ```Stan Interface { - Inputs {} - Outputs {} - Parameters {} + Inputs {} + Outputs {} + Parameters {} } Commands { - source = $(LOCAL)/.py + source = $(LOCAL)/.py } Window { - h = 500 - w = 500 - initCommand = setupInterface - destroyedCommand = releaseCamera - - Vertical { - Horizontal { - Button { - title = Start - command = startCapture - } - Button { - title = Pause - command = stopCapture - } + h = 500 + w = 500 + initCommand = setupInterface + destroyedCommand = releaseCamera + + Category { + Vertical { + Horizontal { + Button { + title = Start + command = startCapture + } + Button { + title = Pause + command = stopCapture + } + } + Horizontal { + expandX = True + expandY = True + + Viewer View2D.self { + type = SoRenderArea + } + } + } } - Horizontal { - expandX = True - expandY = True - - Viewer View2D.self { - type = SoRenderArea - } - } - } } ``` {{}} @@ -91,19 +93,19 @@ Now open the Python file of your module and define the commands to be called fro # Set up the interface for PythonImage module def setupInterface(): - pass + pass # Release camera in the end def releaseCamera(_): - pass + pass # Start capturing webcam def startCapture(): - pass + pass # Stop capturing webcam def stopCapture(): - pass + pass ``` {{}} @@ -121,22 +123,22 @@ camera = None # Set up the interface for PythonImage module def setupInterface(): - global _interfaces - _interfaces = [] - interface = ctx.module("PythonImage").call("getInterface") - _interfaces.append(interface) + global _interfaces + _interfaces = [] + interface = ctx.module("PythonImage").call("getInterface") + _interfaces.append(interface) # Release camera in the end def releaseCamera(_): - pass + pass # Start capturing webcam def startCapture(): - pass + pass # Stop capturing webcam def stopCapture(): - pass + pass ``` {{}} @@ -150,19 +152,19 @@ Now we want to start capturing the camera. ```Python # Start capturing webcam def startCapture(): - global camera - if not camera: - camera = cv2.VideoCapture(0) - ctx.callWithInterval(0.1, grabImage) + global camera + if not camera: + camera = cv2.VideoCapture(0) + ctx.callWithInterval(0.1, grabImage) # Grab image from camera and update def grabImage(): - _, img = camera.read() - updateImage(img) + _, img = camera.read() + updateImage(img) # Update image in interface def updateImage(image): - _interfaces[0].setImage(OpenCVUtils.convertImageToML(image), minMaxValues = [0,255]) + _interfaces[0].setImage(OpenCVUtils.convertImageToML(image), minMaxValues = [0,255]) ``` {{}} @@ -176,7 +178,7 @@ Next, we define what happens if you click the *Pause* button. ... # Stop capturing webcam def stopCapture(): - ctx.removeTimers() + ctx.removeTimers() ... ``` {{}} @@ -189,12 +191,12 @@ In the end, we need to release the camera whenever you close the Window of your ... # Release camera in the end def releaseCamera(_): - global camera, _interfaces - ctx.removeTimers() - _interfaces = [] - if camera: - camera.release() - camera = None + global camera, _interfaces + ctx.removeTimers() + _interfaces = [] + if camera: + camera.release() + camera = None ... ``` {{}} diff --git a/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample2.md b/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample2.md index c817bed18..8cc3631f6 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample2.md +++ b/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample2.md @@ -52,19 +52,19 @@ You should also already add a Python file in the *Commands* section. {{< highlight filename="DemoAI.script" >}} ```Stan Interface { - Inputs { - Field inputImage { type = Image } - } - Outputs { - Field outImage { internalName = PythonImage.output0 } - } - Parameters { - Field start { type = Trigger } - } + Inputs { + Field inputImage { type = Image } + } + Outputs { + Field outImage { internalName = PythonImage.output0 } + } + Parameters { + Field start { type = Trigger } + } } Commands { - source = $(LOCAL)/DemoAI.py + source = $(LOCAL)/DemoAI.py } ``` {{}} @@ -102,9 +102,9 @@ Add the following code to your *Commands* section: {{< highlight filename="DemoAI.script" >}} ```Stan Commands { - source = $(LOCAL)/DemoAI.py - - FieldListener start { command = onStart } + source = $(LOCAL)/DemoAI.py + + FieldListener start { command = onStart } } ``` {{}} @@ -118,31 +118,31 @@ The Python file opens automatically and the function is created. import torch def onStart(): - # Step 1: Get input image - image = ctx.field("inputImage").image() - imageArray = image.getTile((0, 0, 0, 0, 0, 0), image.imageExtent()) - inputImage = imageArray[0,0,0,:,:,:].astype("float") - - # Step 2: Normalize input image - values = inputImage[inputImage > inputImage.mean()] - inputImage = (inputImage - values.mean()) / values.std() - - # Step 3: Convert into torch tensor of size: [Batch, Channel, z, y, x] - inputTensor = torch.Tensor(inputImage[None, None, :, :, :]) - - # Step 4: Load and prepare AI model - device = torch.device("cpu") - model = torch.hub.load("fepegar/highresnet", "highres3dnet", pretrained=True, trust_repo=True) - model.to(device).eval() - - output = model(inputTensor.to(device)) + # Step 1: Get input image + image = ctx.field("inputImage").image() + imageArray = image.getTile((0, 0, 0, 0, 0, 0), image.imageExtent()) + inputImage = imageArray[0,0,0,:,:,:].astype("float") + + # Step 2: Normalize input image + values = inputImage[inputImage > inputImage.mean()] + inputImage = (inputImage - values.mean()) / values.std() + + # Step 3: Convert into torch tensor of size: [Batch, Channel, z, y, x] + inputTensor = torch.Tensor(inputImage[None, None, :, :, :]) + + # Step 4: Load and prepare AI model + device = torch.device("cpu") + model = torch.hub.load("fepegar/highresnet", "highres3dnet", pretrained=True, trust_repo=True) + model.to(device).eval() + + output = model(inputTensor.to(device)) + + brainParcellationMap = output.argmax(dim=1, keepdim=True).cpu()[0] + print('...done.') - brainParcellationMap = output.argmax(dim=1, keepdim=True).cpu()[0] - print('...done.') - - # Step 6: Set output image to module - interface = ctx.module("PythonImage").call("getInterface") - interface.setImage(brainParcellationMap.numpy(), voxelToWorldMatrix=image.voxelToWorldMatrix()) + # Step 6: Set output image to module + interface = ctx.module("PythonImage").call("getInterface") + interface.setImage(brainParcellationMap.numpy(), voxelToWorldMatrix=image.voxelToWorldMatrix()) ``` {{}} diff --git a/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md b/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md index ea57c7492..ac1bd9cc9 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md +++ b/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md @@ -50,41 +50,43 @@ Open the script file of the `WebcamTest` module and copy the contents to your ne {{< highlight filename="PyTorchSegmentationExample.script" >}} ```Stan Interface { - Inputs {} - Outputs {} - Parameters {} + Inputs {} + Outputs {} + Parameters {} } Commands { - source = $(LOCAL)/PyTorchSegmentationExample.py + source = $(LOCAL)/PyTorchSegmentationExample.py } Window { - h = 500 - w = 500 - destroyedCommand = releaseCamera - initCommand = setupInterface - - Vertical { - Horizontal { - Button { - title = Start - command = startCapture - } - Button { - title = Pause - command = stopCapture - } - } - Horizontal { - expandX = True - expandY = True - - Viewer View2D.self { - type = SoRenderArea - } + h = 500 + w = 500 + destroyedCommand = releaseCamera + initCommand = setupInterface + + Category { + Vertical { + Horizontal { + Button { + title = Start + command = startCapture + } + Button { + title = Pause + command = stopCapture + } + } + Horizontal { + expandX = True + expandY = True + + Viewer View2D.self { + type = SoRenderArea + } + } + } } - } } ``` {{}} @@ -104,46 +106,46 @@ face_cascade = cv2.CascadeClassifier('C:/tmp/haarcascade_frontalface_default.xml # Set up the interface for PythonImage module def setupInterface(): - global _interfaces - _interfaces = [] - interface = ctx.module("PythonImage").call("getInterface") - _interfaces.append(interface) + global _interfaces + _interfaces = [] + interface = ctx.module("PythonImage").call("getInterface") + _interfaces.append(interface) # Grab image from camera and update def grabImage(): - _, img = camera.read() - updateImage(img) - gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - faces = face_cascade.detectMultiScale(gray, 1.1, 4) - for (x, y, w, h) in faces: - cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) - # Display the output - cv2.imshow('img', img) + _, img = camera.read() + updateImage(img) + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + faces = face_cascade.detectMultiScale(gray, 1.1, 4) + for (x, y, w, h) in faces: + cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) + # Display the output + cv2.imshow('img', img) # Update image in interface def updateImage(image): - _interfaces[0].setImage(OpenCVUtils.convertImageToML(image), minMaxValues = [0,255]) + _interfaces[0].setImage(OpenCVUtils.convertImageToML(image), minMaxValues = [0,255]) # Start capturing webcam def startCapture(): - global camera - if not camera: - camera = cv2.VideoCapture(0) - ctx.callWithInterval(0.1, grabImage) + global camera + if not camera: + camera = cv2.VideoCapture(0) + ctx.callWithInterval(0.1, grabImage) # Stop capturing webcam def stopCapture(): - ctx.removeTimers() + ctx.removeTimers() # Release camera in the end def releaseCamera(_): - global camera, _interfaces - ctx.removeTimers() - _interfaces = [] - if camera: - camera.release() - camera = None - cv2.destroyAllWindows() + global camera, _interfaces + ctx.removeTimers() + _interfaces = [] + if camera: + camera.release() + camera = None + cv2.destroyAllWindows() ``` {{}} @@ -195,8 +197,8 @@ You can also remove the OpenCV-specific lines in *grabImage*. The function shoul ```Python # Grab image from camera and update def grabImage(): - _, img = camera.read() - updateImage(img) + _, img = camera.read() + updateImage(img) ``` {{}} @@ -206,12 +208,12 @@ Adapt the function *releaseCamera* and remove the line *cv2.destroyAllWindows()* ```Python # Release camera in the end def releaseCamera(_): - global camera, _interfaces - ctx.removeTimers() - _interfaces = [] - if camera: - camera.release() - camera = None + global camera, _interfaces + ctx.removeTimers() + _interfaces = [] + if camera: + camera.release() + camera = None ``` {{}} @@ -221,10 +223,10 @@ The first thing we need is a function for starting the camera. It closes the pre {{< highlight filename="PyTorchSegmentationExample.py" >}} ```Python def startWebcam(): - # Close previous segmentation - ctx.module("PythonImage1").call("getInterface").unsetImage() - # Start webcam - startCapture() + # Close previous segmentation + ctx.module("PythonImage1").call("getInterface").unsetImage() + # Start webcam + startCapture() ``` {{}} @@ -233,8 +235,8 @@ As this function is not called in our user interface, we need to update the *.sc {{< highlight filename="PyTorchSegmentationExample.script" >}} ```Stan Button { - title = "Start Webcam" - command = startWebcam + title = "Start Webcam" + command = startWebcam } ``` {{}} @@ -244,38 +246,38 @@ Now, your new function *startWebcam* is called whenever touching the left button {{< highlight filename="PyTorchSegmentationExample.py" >}} ```Python def segmentSnapshot(): - # Step 1: Get image from webcam capture - stopCapture() - inImage = ctx.field("PythonImage.output0").image() - img = inImage.getTile((0,0,0,0,0,0), inImage.imageExtent())[0,0,:,0,:,:] - - # Step 2: Convert image into torch tensor - img = torch.Tensor(img).type(torch.uint8) - - # Step 3: Initialize model with the best available weights - weights = FCN_ResNet50_Weights.DEFAULT - model = fcn_resnet50(weights=weights) - model.eval() - - # Step 4: Initialize the inference transforms - preprocess = weights.transforms() - - # Step 5: Apply inference preprocessing transforms - batch = preprocess(img).unsqueeze(0) - - # Step 6: Use the model to segment persons in snapshot - prediction = model(batch)["out"] - normalized_masks = prediction.softmax(dim=1) - class_to_idx = {cls: idx for (idx, cls) in enumerate(weights.meta["categories"])} - mask = normalized_masks[0, class_to_idx["person"]] - - # Step 7: Set output image to module - interface = ctx.module("PythonImage1").call("getInterface") - interface.setImage(mask.detach().numpy()) - - # Step 8: Resize network output to original image size - origImageSize = inImage.imageExtent() - ctx.field("Resample3D.imageSize").value = (origImageSize[0], origImageSize[1], origImageSize[2]) + # Step 1: Get image from webcam capture + stopCapture() + inImage = ctx.field("PythonImage.output0").image() + img = inImage.getTile((0,0,0,0,0,0), inImage.imageExtent())[0,0,:,0,:,:] + + # Step 2: Convert image into torch tensor + img = torch.Tensor(img).type(torch.uint8) + + # Step 3: Initialize model with the best available weights + weights = FCN_ResNet50_Weights.DEFAULT + model = fcn_resnet50(weights=weights) + model.eval() + + # Step 4: Initialize the inference transforms + preprocess = weights.transforms() + + # Step 5: Apply inference preprocessing transforms + batch = preprocess(img).unsqueeze(0) + + # Step 6: Use the model to segment persons in snapshot + prediction = model(batch)["out"] + normalized_masks = prediction.softmax(dim=1) + class_to_idx = {cls: idx for (idx, cls) in enumerate(weights.meta["categories"])} + mask = normalized_masks[0, class_to_idx["person"]] + + # Step 7: Set output image to module + interface = ctx.module("PythonImage1").call("getInterface") + interface.setImage(mask.detach().numpy()) + + # Step 8: Resize network output to original image size + origImageSize = inImage.imageExtent() + ctx.field("Resample3D.imageSize").value = (origImageSize[0], origImageSize[1], origImageSize[2]) ``` {{}} @@ -284,8 +286,8 @@ In order to call this function, we have to change the command of the right butto {{< highlight filename="PyTorchSegmentationExample.script" >}} ```Stan Button { - title = "Segment Snapshot" - command = segmentSnapshot + title = "Segment Snapshot" + command = segmentSnapshot } ``` {{}} From 984fcb85652f850ae320d3f59720ce7c86a1a1a3 Mon Sep 17 00:00:00 2001 From: Heckmann Date: Wed, 21 Jan 2026 14:44:04 +0100 Subject: [PATCH 2/5] Replaced usage of True to Yes in scripts --- .../basicmechanisms/macromodules/guidesign.md | 2 +- .../content/tutorials/summary/summary3.md | 52 +++++++++---------- .../content/tutorials/summary/summary8.md | 16 +++--- .../thirdparty/MONAI/monaiexample2.md | 6 +-- .../thirdparty/matplotlib/2Dplotting.md | 16 +++--- .../thirdparty/opencv/thirdpartyexample1.md | 4 +- .../thirdparty/pytorch/pytorchexample3.md | 4 +- 7 files changed, 50 insertions(+), 50 deletions(-) diff --git a/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/guidesign.md b/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/guidesign.md index 280f0640c..5b4f481d4 100644 --- a/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/guidesign.md +++ b/mevislab.github.io/content/tutorials/basicmechanisms/macromodules/guidesign.md @@ -115,7 +115,7 @@ Window MyWindowName { ![Module Panel](images/tutorials/basicmechanics/ModulePanel.png "Module Panel") You can define different properties of your control. For a window, you can, for example, define a title, or whether the -window should be shown in full screen (*fullscreen = True*). +window should be shown in full screen (*fullscreen = Yes*). These properties are called {{< docuLinks "/Resources/Documentation/Publish/SDK/MDLReference/#SyntaxTagsAndValues" "tags" >}} and are individually different for each control. Which tags exist for the control window can be found {{< docuLinks "/Resources/Documentation/Publish/SDK/MDLReference/index.html#mdl_Window" "here" >}}. diff --git a/mevislab.github.io/content/tutorials/summary/summary3.md b/mevislab.github.io/content/tutorials/summary/summary3.md index 6ba465617..6f82f6830 100644 --- a/mevislab.github.io/content/tutorials/summary/summary3.md +++ b/mevislab.github.io/content/tutorials/summary/summary3.md @@ -87,7 +87,7 @@ The *Source Box* shall provide the possibility to select a file for loading into Add a field to the *Parameters* section of your *.script* file. Name the field *openFile* and set type to *String* and internalName to *LocalImage.name*. -Then, add another field to your *Box* for the *Source* and use the field name from *Parameters* section, in this case *openFile*. Set *browseButton = True* and *browseMode = open* and save your script. +Then, add another field to your *Box* for the *Source* and use the field name from *Parameters* section, in this case *openFile*. Set *browseButton = Yes* and *browseMode = open* and save your script. {{< highlight filename=".script" >}} ```Stan @@ -115,7 +115,7 @@ Window { Box Source { layout = Horizontal Field openFile { - browseButton = True + browseButton = Yes browseMode = open } } @@ -150,13 +150,13 @@ Set the 2D viewer's type to *SoRenderArea* and the 3D viewer's type to *SoExamin Box Viewing { layout = Horizontal Viewer View2D.self { - expandX = True - expandY = True + expandX = Yes + expandY = Yes type = SoRenderArea } Viewer SoExaminerViewer.self { - expandX = True - expandY = True + expandX = Yes + expandY = Yes type = SoExaminerViewer } } @@ -218,15 +218,15 @@ The next elements follow the same rules; therefore, the final script will be ava In order to set the transparency of the 3D image, we need another field reusing the *SoWEMRendererImage.faceAlphaValue*. Add a field *imageAlpha* to the *Parameters* section. Define *internalName = SoWEMRendererImage.faceAlphaValue*, *type = Integer*, *min = 0*, and *max = 1*. -Add the field to the *Settings Box* and set *step = 0.1* and *slider = True*. +Add the field to the *Settings Box* and set *step = 0.1* and *slider = Yes*. For the `RegionGrowing` threshold, add the field *thresholdInterval* to *Parameters* section and set *type = Integer*, *min = 1*, *max = 100*, and *internalName = RegionGrowing.autoThresholdIntervalSizeInPercent*. -Add the field to the *Settings* UI, and define *step = 0.1* and *slider = True*. +Add the field to the *Settings* UI, and define *step = 0.1* and *slider = Yes*. Define a field *isoValueImage* in the *Parameters* section and set *internalName = IsoSurfaceImage.isoValue*, *type = Integer*, *min = 1*, and *max = 1000*. -In the *Settings* section of the UI, set *step = 2* and *slider = True*. +In the *Settings* section of the UI, set *step = 2* and *slider = Yes*. {{< highlight filename=".script" >}} ```Stan @@ -278,20 +278,20 @@ Window { Box Source { layout = Horizontal Field openFile { - browseButton = True + browseButton = Yes browseMode = open } } Box Viewing { layout = Horizontal Viewer View2D.self { - expandX = True - expandY = True + expandX = Yes + expandY = Yes type = SoRenderArea } Viewer SoExaminerViewer.self { - expandX = True - expandY = True + expandX = Yes + expandY = Yes type = SoExaminerViewer } } @@ -302,15 +302,15 @@ Window { } Field imageAlpha { step = 0.1 - slider = True + slider = Yes } Field thresholdInterval { step = 0.1 - slider = True + slider = Yes } Field isoValueImage { step = 2 - slider = True + slider = Yes } } Box Info { @@ -465,7 +465,7 @@ Commands { Box Source { layout = Horizontal Field openFile { - browseButton = True + browseButton = Yes browseMode = open } Field resetApplication { } @@ -627,7 +627,7 @@ Window { Box Source { layout = Horizontal Field openFile { - browseButton = True + browseButton = Yes browseMode = open } Field resetApplication { } @@ -635,13 +635,13 @@ Window { Box Viewing { layout = Horizontal Viewer View2D.self { - expandX = True - expandY = True + expandX = Yes + expandY = Yes type = SoRenderArea } Viewer SoExaminerViewer.self { - expandX = True - expandY = True + expandX = Yes + expandY = Yes type = SoExaminerViewer } } @@ -652,15 +652,15 @@ Window { } Field imageAlpha { step = 0.1 - slider = True + slider = Yes } Field thresholdInterval { step = 0.1 - slider = True + slider = Yes } Field isoValueImage { step = 2 - slider = True + slider = Yes } Field markerPosition {} Field applyMarker {} diff --git a/mevislab.github.io/content/tutorials/summary/summary8.md b/mevislab.github.io/content/tutorials/summary/summary8.md index c7d50c29b..d3beda3c3 100644 --- a/mevislab.github.io/content/tutorials/summary/summary8.md +++ b/mevislab.github.io/content/tutorials/summary/summary8.md @@ -211,7 +211,7 @@ Window "MainPanel" { Box Source { layout = Horizontal Field openFile { - browseButton = True + browseButton = Yes browseMode = open } Field resetApplication { } @@ -219,12 +219,12 @@ Window "MainPanel" { Box Viewing { layout = Horizontal RemoteRendering out2D { - expandX = True - expandY = True + expandX = Yes + expandY = Yes } RemoteRendering out3D { - expandX = True - expandY = True + expandX = Yes + expandY = Yes } } Box Settings { @@ -237,15 +237,15 @@ Window "MainPanel" { } Field imageAlpha { step = 0.1 - slider = True + slider = Yes } Field thresholdInterval { step = 0.1 - slider = True + slider = Yes } Field isoValueImage { step = 2 - slider = True + slider = Yes } Field markerPosition {} Field applyMarker {} diff --git a/mevislab.github.io/content/tutorials/thirdparty/MONAI/monaiexample2.md b/mevislab.github.io/content/tutorials/thirdparty/MONAI/monaiexample2.md index d51ff7a9b..9492104ba 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/MONAI/monaiexample2.md +++ b/mevislab.github.io/content/tutorials/thirdparty/MONAI/monaiexample2.md @@ -453,9 +453,9 @@ Window { width = 100 Category { Viewer ROISelect.scene.self { - type = SoRenderArea - expandX = True - expandY = True + type = SoRenderArea + expandX = Yes + expandY = Yes } } } diff --git a/mevislab.github.io/content/tutorials/thirdparty/matplotlib/2Dplotting.md b/mevislab.github.io/content/tutorials/thirdparty/matplotlib/2Dplotting.md index 8c0321c1e..739a0db36 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/matplotlib/2Dplotting.md +++ b/mevislab.github.io/content/tutorials/thirdparty/matplotlib/2Dplotting.md @@ -34,7 +34,7 @@ Window { Category { Horizontal { Vertical { - expandY = True + expandY = Yes expandX = False Box { title= "Single Slice" @@ -43,18 +43,18 @@ Window { title = "Sequence" } Empty { - expandY = True + expandY = Yes } } Box { MatplotlibCanvas { - expandY = True - expandX = True - name = canvas - useToolBar = True + expandY = Yes + expandX = Yes + name = canvas + useToolBar = Yes } - expandY = True - expandX = True + expandY = Yes + expandX = Yes } } } diff --git a/mevislab.github.io/content/tutorials/thirdparty/opencv/thirdpartyexample1.md b/mevislab.github.io/content/tutorials/thirdparty/opencv/thirdpartyexample1.md index 5ca81132d..9c80ad8e1 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/opencv/thirdpartyexample1.md +++ b/mevislab.github.io/content/tutorials/thirdparty/opencv/thirdpartyexample1.md @@ -73,8 +73,8 @@ Window { } } Horizontal { - expandX = True - expandY = True + expandX = Yes + expandY = Yes Viewer View2D.self { type = SoRenderArea diff --git a/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md b/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md index ac1bd9cc9..12b9cbf5c 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md +++ b/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md @@ -78,8 +78,8 @@ Window { } } Horizontal { - expandX = True - expandY = True + expandX = Yes + expandY = Yes Viewer View2D.self { type = SoRenderArea From 71cbc6448a18768754e8c1d9004e5825c80072f7 Mon Sep 17 00:00:00 2001 From: Heckmann Date: Wed, 21 Jan 2026 15:10:26 +0100 Subject: [PATCH 3/5] Changed to modern Enum format --- mevislab.github.io/content/tutorials/summary/summary3.md | 6 +++++- mevislab.github.io/content/tutorials/summary/summary8.md | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mevislab.github.io/content/tutorials/summary/summary3.md b/mevislab.github.io/content/tutorials/summary/summary3.md index 6f82f6830..8d2175821 100644 --- a/mevislab.github.io/content/tutorials/summary/summary3.md +++ b/mevislab.github.io/content/tutorials/summary/summary3.md @@ -578,7 +578,11 @@ Interface { } Field selected3DView { type = Enum - values = Segmented,File,Both + items { + item Segmented {} + item File {} + item Both {} + } } Field totalVolume { internalName = CalculateVolume.totalVolume diff --git a/mevislab.github.io/content/tutorials/summary/summary8.md b/mevislab.github.io/content/tutorials/summary/summary8.md index d3beda3c3..9129cde4b 100644 --- a/mevislab.github.io/content/tutorials/summary/summary8.md +++ b/mevislab.github.io/content/tutorials/summary/summary8.md @@ -139,7 +139,11 @@ Interface { } Field selected3DView { type = Enum - values = Segmented,File,Both + items { + item Segmented {} + item File {} + item Both {} + } } Field totalVolume { internalName = CalculateVolume.totalVolume From 055a86d0046905e2250777f838e321e0edcf5633 Mon Sep 17 00:00:00 2001 From: Sascha Heckmann Date: Thu, 22 Jan 2026 08:34:52 +0100 Subject: [PATCH 4/5] Files in zip archives adapted --- .../examples/basic_mechanisms/Modules.zip | Bin 3661 -> 3696 bytes .../contour_filter/ContourFilter.zip | Bin 2340 -> 2559 bytes .../example1/FilterExample.zip | Bin 2757 -> 2907 bytes .../example2/ScriptingExample2.zip | Bin 6979 -> 7313 bytes .../contours/example7/CSOListContainer.zip | Bin 3526 -> 3709 bytes .../example4/SurfaceExample4.zip | Bin 7673 -> 8086 bytes .../open_inventor/example4/flight2.zip | Bin 7012 -> 7240 bytes .../examples/summary/TutorialSummary.zip | Bin 8833 -> 8519 bytes .../summary/TutorialSummaryBrowser.zip | Bin 12825 -> 12138 bytes .../examples/summary/TutorialSummaryTest.zip | Bin 7955 -> 5022 bytes .../summary/TutorialSummaryUpdated.zip | Bin 8997 -> 8681 bytes .../examples/summary/TutorialSummary_UI.zip | Bin 8967 -> 8597 bytes .../examples/testing/Example1/TestCases.zip | Bin 1580 -> 1905 bytes .../thirdparty/example1/OpenCVExample.zip | Bin 580 -> 816 bytes .../thirdparty/example2/FaceDetection.py | 58 ++++++++++-------- .../examples/thirdparty/monai/MONAIDemo.zip | Bin 5743 -> 5983 bytes .../pytorch1/PyTorchSegmentationExample.zip | Bin 5100 -> 5332 bytes .../examples/thirdparty/pytorch2/DemoAI.zip | Bin 7886 -> 7382 bytes 18 files changed, 32 insertions(+), 26 deletions(-) diff --git a/mevislab.github.io/content/examples/basic_mechanisms/Modules.zip b/mevislab.github.io/content/examples/basic_mechanisms/Modules.zip index 92a57f885a4e251d8633a1bb166fdbfab85a7b4a..618150e3b4c6257585acc3a2bd2e3e3342f7ac68 100644 GIT binary patch delta 2712 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 F{tL8F@4o;5 delta 2696 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 diff --git a/mevislab.github.io/content/examples/basic_mechanisms/contour_filter/ContourFilter.zip b/mevislab.github.io/content/examples/basic_mechanisms/contour_filter/ContourFilter.zip index 7fdd6965aa1ef9845b7cb1e50029242b493f2dc5..b4585dea5bf4d14bfea1083b4fb1b23690490119 100644 GIT binary patch literal 2559 zcma);3pmsJAICR$Mfoq6<~odAC&Ns0FO=(yQEKi)#n;uuUg|j->ezcUlsBV4vqS(Q z02PaGS&;8o0UOD%aJ--YKhZ6@WZuZ8AOhz1I}lh12^z;!!glMtpF&@{PqNv~%cI*H zDsN-5!eK(HY2p5A7|1o`u+4hhO6GFp2>wiC6I5hkB^as4IFWShXrjk!kl8Mc9O_YR zvYiTOHFEPI3ERQLq~VuQwqwo-_un*VbgQy_2HDcqb~+`yt&`jl^U-sZOLa&WfG(yb zS*^3SR>hsK45`m&jY@YL5Ef#I$~xM1gVP7gA0zDNCX5-2cwFuQGO~s>a+XGy1W_)S z3YVZjvNuYQ;I{HMg+!>d%^qv=9mCTd0eOW^$xzG6=Via(_U4^eqtO@N_Sr=G{siKG z#xO|_WE89RFyuRK1(wp78l$5zLab9PadWK@bDWUi*$f}ai7QDKvmNoc+#zxeY&6^Y zclhRC3~F3QOr!!`lpl#JK7|E|mgX|Ik6mbmyDCA4XLMw2Id65^XDT2RFOcT8w;_%@ zbqhJvLO^^TZq8|06Y^}rUT^?NEnn4zsWIVOtYfYi&;mKO^ZKd#o1eJRCpYb&9(*sb zFA{?DdU4^&%{@Oj$(p$j6)`r4gd?aj&29PyLK$S~*vr7wS~H_W*U6ZmVaQ zVX4O2oIiEHZ24cvYpaKfNLWe+oy>+N&NhJhOSEKjtgKZO!bgp__q&}*A@WHsPKklM z#Grvj0v6e)kHFGAbsj||;9|p$Qx~do9^|EI?c4PDo_BTYlB5N>+Ok2lffEiTFP&Zx-oz&ay)zk- zHaBwDNBK4<({cHw&$KU28-+k)JlwW-g@{<-K%X8khT3fSi*8tr8^OeGP5uA!h8Qq-%xo=Sz}1ML!zK z{<`qNV&(-LDCe3$)PflitFx51LG{y$Nav`hUB;|#l-`m zIgYH#u#b&7oQ5b?=}Ea(U=&8EoL3!Een+}6WjwgWU@N8xe#F!`Xl7TV10~PxSn%$) z#Xk&jt;A|E<|t|?ZlqpYMPjWg`V)LD=RupW;o$a7p-t-oXa`{t4UwvHcdns%O8@|W zIoOP=Id-EPg1>XHFQ)iI>&oI<7Km$Iy!kHHA!B5x1Z~Fi=MO-<;%!*6qC|#t)Bz8Q zO*mmZkWV^Y!2~hjvC58ml_{>_<$PTc6gthBHp?3wYxiFi;Q;FGm0HBu^}c@urPcj< zx^qWL^V;iyH$v?LY-GimOw_3a#oLMHF?}J$V%HulID4yu`Xy|$D#Fj6qZd!PR-uU< zSEMYp_MN5luR)RqlsX~-Y`-pl#@)l3q;>aNc{Kj+WRFdPx_q8h_QQ~xi$7t`>1Z;5 z8hVnG`W}k1D>pyncl8b->_OK-UQ=HE26gRHYX@cfSBiG#OOPFsDQalPko>Flh}s&z z-r4x;5U*51u7Rwac1dBHqNiJd?^u5AL|l7)+ImEo;#I|Wv5iJ+?bOO!2TrP%l6{gK z(I=Hn{jv#SlX*~Wa0a-Cm?IE`cgm$V!&6H`3}Iz<!rJ8q0c&in7 zp=&VI@zL{?-^*Jc$`kRE0wpBKFzU4C@3IlCZi%IB5q<3i)MH1Hws6rlz`9}YgCh><`h7UHE8-bnE@n3r&) zTY(P%zzS{Dp!DBvQMn&!@K^vbG?MgB7pN{*fyQ4|xO7i@pRT=wqcav=K0Sp2@G)CX z-_P<#$_R|Y-Hu@-;Z`7_?&pw9Q8+|Tze`Ww7~AgAZemfbV^LNQHL!5mdKFmQBHfXM zS*NHWb$W&SBai6Ss%m2}S2m*j#+Kw;GKO2vY1q}iG#cWJ;{Eqp5v?1Iq zycXooo%6Er%wgk^fxpSJMey%C|8G{o#q%s;Bc6Be8-JSIH~1{!AK-tW0&W7H3eXOM TTygPQHvvE_5C9;E@ZSCnI1>Ng literal 2340 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 O-K%o9r*m@e&He!0CaYWk diff --git a/mevislab.github.io/content/examples/basic_mechanisms/macro_modules_and_module_interaction/example2/ScriptingExample2.zip b/mevislab.github.io/content/examples/basic_mechanisms/macro_modules_and_module_interaction/example2/ScriptingExample2.zip index 6f2dd3879c7a5f064f89bae5db295242cc01be93..eca1e8edf6b49d3fd10ec7b75d5ff8e86243371c 100644 GIT binary patch literal 7313 zcmb7J1yCGY+Qr>HK!OGxEVw%a4erhW!QBQ67F+@Z9S9n1AOQjd2@W9)f#5P&(BSR^ z`C)h8UwONETl>1}wp4YUbML8B-|hO2h6*wY3BvsmC@Em_kB5Iht-Ms8w z?Bx9{o!y*lo^W~lVIv@-+<)?qi>?kX0{ZTNyS*3G-TwZr@t1g%zr|DXbd}Y9=J_{p z$))~0Px}9gtL6&ycCz_B{-e7&|9RdR2p9+?5u&=k>cH_o;s0wLoIo4f-$@jW$!q<` zs81Gk?cyehJb!wLpAj8Ok2(hUARC22#z>E*m(J2=U&Yk+nno<*Vt*QwmDVQ0`U})| zZ^fi9f1Pw^p)>o40f!>)4d*a)q?9 zJsg9dA_DcObjtaQjXFHXbQs4NV@lt+Kfw;?3DCv+S=*|SR!`TgTFQ-Zp-`S}>T(sv za#UvglW;!L-UM}mUwLe5i99Jl%jBFkAyY5=s-h#r&rKF+#&L_kcj@-QXn1UbYFoVu z`|+(R3EBp>h6*|c;ky6XV2=`UpaqV5rUyeP`(O~Qz#H4!oK75WN}t2&>t3 zKi7_^)6Z@-m~59YoMaz3`SXT9uX)pLs*qylp)A8c4UgBi%z3z3n^aQf?G!sdSpz1<#X?Cv|jG8-vQ(X8jXQ(F%=j}U(!kPh273a_y~MQ<>i=3gGh zY)MJT6b9HS5Va0>o$K-?EqkIxM`|p=zI2@n?NFn$bdRMCJ*ABL5tL(L64RFNS%$# z_WiNKgCAb00LFNHqw(?fe1Fa86!_8v#rWEoAhNEocNW-Xus={tpp}W*+2gS{zB04= z2$J}rbq3AT1a8c*&(ZMX_>IuQW=crM+~{h=1!CRpk=@ahBY^okJLnk|#jsoRv!`Ip zMU9+1{PgZ&sSO+Fcm3v@RCt!X90Xjn4?tMk$#y=`f!|UIhNWUJ2_uLDlL~1gd=Oka z;>`}=+)3$asg-%Qos&=13ab!}BVm1$v}O-nNZ#Z4sUD_-xu^2{NtPNF^!N>?dQ=yl z@Y1Zjbuc-}<@a=$3rWbSMzM9-tzV-x#E);X}| zWRgy`TgAW-$NB$cH!-X2k=*jSm1eY5dZX1AV|t})k`9@ zKrMj@=-v5+uJ|24Z=g!bhqifPjsj+ve8*4e7b%||D|F#>al%EwuPL3F56>1St5fn9p8K^PYnS zeX)L5iBsL;xseC1?-V07?@??r@Od3%T&z#5#8(JOJ9&itOZ=_d^QLeK3h3U?$64Rc zoT1)|+~}~amTKWFO@>>qC$eP8@1w;?UnydwdMcFCDTMW;C=5=vRyNdlJ%4i;$|Pi0 znxjF&ef*vjuik;TDE2NN)M9BSPk)Ul-!G zjKAbbmml%%2$LD$pf{7}b<|AJ%*Avb=5CU3RdR*>)@Z8@l)x!Ss<Ej2t11-!vX(n@-ZAYZ}VQh3OhlwexAS=@~3JWhy4&Wj$qjOsf6&HcJcG1L5@f{qRKZD(SI) zybG$&m+!K?=uW|1>fCC6dZ3b?1XQJu@YfY(URwO~`uceJhY zF{B|A*;;3%Z@wEiNIzSnA=punt`2`gzTnXS^V{wP&H~lde>fXEiY0RsGi6jgZ<_|? z%v-gcFy&b7X}(BV!e0MU%QlEym*Sg^1Ue5g7KmGI)9_SpF?DWJ6R0CXAQV||5>Yqh zC?!>q>=WZ-9pZE(E`1)Z4Wa(ZCv%vt&Lhg=aqXIxhlMP8-X>f(zv|vH8)RPfC_*!a z!iw~8n;y+>s3WESg3XD;6> zG9yI`5tw7$vb@*1m_of+wV58sL>ocoHqT!AXH#cmznj}ml&6ZNwIUsA@no&)LHPjA@#B=$KD_r(;R5Ww=UToI!`kr{`pD@n$WkMo}OnO zFZ#3ktE;koR}i`HhVF60K})I^r_%v3f_vdZ(-DJ6!k?GLTu!Y4M}a2cx2ZZUzO@$_ zNnJX4%jOcI9G|#e1%2#|B>AB( z+Yx3MEMtLs90E@X0Q-jGpiFrT&`M})kiPL58cfUd&>mw&VXky_rXm{EJzt-3Nl{w& z*fV{k|7F8z-|-E6Fjf!UXu}sep84gA9?EZxP;3ld!8z>SB$3U!Vhg# z@b(v|l(MiUq_{3}ZSXB7%0KUhr5Lb20n&R{I6N)r2TrpVoY8bHk5f z4D4%`9%i=S$x^!{0e=#G=ld!OVWxWF7dL+vEOAqd0%N~&Zbfyw+}foTI3+)}Cw&a@ zR@c*IJ_;;`&vh5{OKD?^az%?dcg9by!UMZTts*}3x?6u|3ev4&aZP!`YU9VoVl?`) z@d1|ls`P4LXu~FwW}7!9L8a9>o4^{T_C_xIt1Geqm5IYsyepEd&Xu4vl-pzq9+46EOl zk91s&yZfAL3wqIEHcqxCFk*aO*hbNU`3-oa;%Pc_;^XPe7Z)r0oHq_jgC~wuUgQhY zS8k+jDxeIdZqZ9NpdlV*qnfk$%)*`0$Gd0xahH%L>u#vZtQFGATh`fA`LfUNOkYgl zs3Tv*Qf!lT(JCGDZFhmy-~q0avrS6*yJ#FPS+1HND*!6uD!XByY{e-%^ihl@_s}}C zOE0B68)o7@+H~FhhHV(@p==je1-GZECh2Y9qE)RLlkp<&1PA-JzgVoI%oIEshqi@4 zd^HzM+Aw{^)FISl{*YtP6a|ybjf^>`iqHq=0eGg%wi}TlF1< zpo;24b^kQ78PYsY3(yy>PP&{HpL%i97c}~cvQso8in8ZSo0RzpNBkDLm{bU8xlWX| z)oG89qUviGj>8=c_x*G|rbz4XoRf`P90cOaeym3x^qg*-FOT54G(E9=1Q|b@s)goFej|4fFRDB^VUWpFREr6z2;66hUIc!fxs4PyF zHF|>@uf$VdYwIl(O+H*rnOx_5dd|WXPD<$pP*tm%)d<3|A_g{9Kfrrsl+t4sN4x-+ z>Po)wdsZYhuIB~KNg#>art4dFhfy?2)-I1Cw5w6HD=xym-c=XDJN5vvr3<`*XH%A1B#=)QRINu%$2X~A#fhctxGxWn7@tHp3XxlUke@k65g1#)8@Be zL`lwLcjbPO$I!SxXTO?U-*`B+@B!yinFjZk{mZ-89Is<-F(i|1I`p&a-dW9OLyMIT zEp)E|rm>s`fM+iAQ+WbPY#I{QZ(DD|8kMXEeHAQmt|R>u!d-AtN^oT7Oy)gIw|!m~ zwTV8OSuv@v80}lgUlCb(wQ>?*YPTw~)BzqUTlDPP>vzx1TQNAZn05y>So?n7;|_@_ zu2{P5Yum}+pLJQ>^F_D#F{4=E>^nyjT3Rz>SJ+vK_*~2*Kz7Q98ulouMI5>t-&aJ} zlZ71c%@fqr9mlO~D>v;KU)15U`VmK%E=M|i!%ASyb91m_gQrhtgWsi|q8CtIj!?sj#4U$?PUPW8cy&%)ovz;UbG)q~q z7jC3$6{*L{p7E17Cnu@C`_$f4R`iNh6&@j~pG!mjWxqG0 z;C%oGmuTzdiR*m}=ThyBpdujxf~x$lEgX`6>$w5`Rtv|?|91@>io5RH{a_*Iv#!#C zxy(ut1U0UPP;|zbqC)deN{C*wU=k5UlqqSKXGHZrvVhr4&8o;;o#vjRs%Gcw3}E5p zL9=-6d>XMo37S|EpqXAFzzy6(r5qi`FKjJSmTPKx?F5yP2Xkx66o=SMg*|Mc5z-Fd2L7{R$b!f^^jm@i8z5YBo2)oWUXz&iCtK?xoAb zg&!qT=MOBCSFoNuPFoL27Sn{&;RG^(2YoUiLa}07$#z4G#zpGIFi@*HPB&e#_Xl%S z-nSrG%lB(#O8ly~?mA#RTecvJUHiuOaEJO6G5NLD5CzLzAx)@x<_yc(R{;!D3NG8Y z;W5`D*yb`88L<$()E;iCBj?n6;LN@VyDk4&%!s#D)0dhC zjhw`{sg4D=R4p*eQ^Z!ucAW1gz2~@RHbP>qfbv+NN@oH34YI?R_Nl1Hw(&9ra{yHa zH|0e_F6*p@Jh8gn*3|9+@FdG_2<}eu@$$D(kjLS+Rwd@AB>X7y63I-jDs2Ita?<%UDOx5{>oBnuI%I!#crbaZ-INpfQmd)C#xg zkGzwr(w@w>?df>``wCu67YVAM>>Wq{UUF1r*QTRyI-58m53fL;S<^A+z6RlAl-1RL%Xuld?;NOhT{kM$o`H%Mb@62y_XZ-u&L&0a= ztE=LAXZ|*ZHA#pD{%&tfg_$Sq%i?re9dDJPIPuKalcJLn4j4xv`%bEZ41Hu<1q>?J z+50(DdqP@dC$Y>OK7z;!MCDzE-9EaXz@h=Qx1IdMq1@{am)102s2TzfFiD=fXwtj^ z5iTSyA7y>p$%{OM8;CB+(>0>Yd8?~kwd-PmUJgm&`^IArDHZD&5Mer5J zxEj+ahY3io(^@Z|koH{#n$j%RY%4i~A&*%!wSSsLDAz!w*I+0`l~+9&FnAf%85SHa+2WWV+;~%Ke!GX={60j4(^VRgJLM$=qZnRz43# z_ARIC9DOsuj|m(#x+}lx|J1@Z_h|ln%7KT|ulo)LD-52I>|ES^g|>jpqP*^Sw7XZW z=sN#S|5Sl!1=#H=Jp&P}j@u-;UR-gQk${O9nFSB=7_jTu&W?UNIY|w9!ToV*w7z|S zlIXhaBSD{LxBpt(acd4{EkC6sm8|8|E2AZ}RrI$NC9L=r?f15G-1#hViFlW$px@gL z5s3u(uhJNb{|_a8O5Z>J57`VV0^&b2nZL%RMEDg~9 g7(IVq|L$1tYoCS+>RqixKtR7c_wUq;e{lcyf8iUVNB{r; literal 6979 zcmb7}1yEc~w#SDc!QI{62^K84JA=D>@PyzH21y9+3{D`pCO8Z_!EJy5L59IX2=0)) ze0lrTX7}5-Z?|vN?b~(x)bE_Wr@C+bkB&Mr3Nhf1<`^mk{Ppm+8{yAh-_FOy%g@Er zN%6UjhnKs9AfL|vIiK=h&R6w)DzC5Y`dpNdYgUxB#_YJR_1I?z_`0V1uLV_Rm$Z|~BV8A1;w*g;| zTy|!|a@ft<1YOzOqNPV`E_^IUm?M17HHxzVWPtqK(N%dRakE0^HT(zvZiDvL5#P9v zq6-Z?e~%aqz?D|Hx~0ps8zAL6AEu~n;|kOQM$a@0FRpuQ$M2Jt5~S+s=VIN(JQP)M z+(LwUP4;visRuQdxqH}C-f4MhNe_rF>n4|f~e zL31l#xCnmOVY#*7fyS*)yvKLxvxsot<1|2&YV85mrZs`26Ze7$vrG9}S5;Vs!>6GI z%jK1oafi$D^k&lVYy&|S$fGVrTuai^GLBQ`&bnW>;qIaSK_ic`DcFSzZgmJ9r> zU3H9UU2uec`RT9`c%mxvAkikt5zyXt{bjOFYf&bqqNz8C&rfR=tGJ$iM29et!2?Am zW(-7SEBVj7e zLidFiST%%wT9Xf#E5HMdNso6rCtkUida{e!&eipRONjD=vOiojZa$M)fus93t$P*H zALebKUIYU?MH5B#lsJR7YiT>t5iH{)v~Q}l!fcb`V?Q~A=yH(uRPnmJTN7OyEBVS;&)^zV^(iPWMiu=PqOD- z@i{PyQlm2+n^2JE%dKgUZrwogc_`DP$QN$b`{JjD!OA6p1BGLZ6|`L7&jQXyUxVtD2NJz?Es5&EgGOUJVE#~ znz1MM)^a6(3r|!{nr3=un1!Z~f%nMAE#n6wdPjr?J#Sj*meM^?TI%^z$X@UR-b3%2u|m6prbI61fq$w*4>vYdSMDSV#+IN>(b6cUS^VeB12Z0 zdg57NUVep|&<=Xc8Kx6iYpO+HAagew@JcfaCthliNE1J1#YFNkDjOzcQDG&sS@A*+ z1#~OPlmmXXq+%?+phR4-OOlr5N`qb?)atFVDTdIvjV$H{m+YLXi!U;Y#+L)SG8h5T z+}LUZ9l=qQoM66^=GJCFIrp%3x{Bw%)T_5k*_B6#B!@Aphq0}CIsA7I-Zhk&I$rtd zEoI6<%juSuS6THr0N zOEVCUT85?cKy-YUjq0Yai;LN%*qlk>_vH)pidD>jK_H0IT_lnd7pP7^f20!(JQ57SQwpjWrfGW70xHjKzk4S~#@V zsjpc7quFL!V^&vR0Tt{vrLZs0%DY`^(P${vn26bBAN)s%trO7%)$E-uFW3d_3&kD67+0%PSgELAOzzRc zIhRvhe45n8JSpt5YEavSbFhy{<6UMW>SuYHhcd4ol>EXN3Ojgn>Oppb%yTJm>^ zA-0Wmn%ffbHBGt?RiEpsV8}iD1OuGKlQKw=g+_1dg#X1s#$$#7CVxFK$Y{g{PkCx2@&! z=a4C8UC*y@vRHWAjc&PK*5@o6*sx%WhrANI3_bT2{qRBG$!1dBcnSk-|4gz-rlbf7 z?{!GiY^0BVihs=BN4{JCP@aURAa8g%Tr3k&BlfKPU25a`19~;YJP-b!;P-x6E0wUz zqtFJlTRgqM!?8`PB`g8)*s#4_wY~cX%h6`s3H&Z*TVU)HK5Ger7=e~)-#1;rCPWT( zJ)++^s=wo&v~=L*qbasCt;UD^`*UwYAqztGjQ%-hv9?fVYF48GIk_r12`s-t4ktlC zBq@g3$QYh|pu-4JM2j^CSapl-k^Q!9;q-x^{^mEBkEjKAz(oI9)B&j{9P#Fx459ek zb4Ne_vn3?Pd}&hx;I|@~jOe*U^Ko^#hup`6cN4hEX~}~sxnRU|v4|zC*p=b?uyy8K zrb}-+L~0ro`t|iqlq=rHY^w?R`8|2fh%~K!-`#%skB>$oUC5ui?0tQKaoj{UgB2WF zByR&AFf){E&q6@X(t|pv4eSYqr3|aR zLe=(Ww%%o5p^dsPM=#@eTA%L;u;mL_4syDfB@E_s`_Mo}zx8p|gQ3DiOo)P|dNc*o zpOH^l<5J2!9-A9@6{!D~Cw4X`-%2Z1Tgf%oLzK`HZUlR!M~D@H7&q{-r&OFdizND_ zDqz*SU?89LVdC+CT6I1#6E`Q_2L(6n_s@(k3PhdB8NHvECY(L9Dy4FMGGjW$`4Uos zI#fWr2~wgoMA9o@EpE?iiig?^+-$t49)ya1HpK=n2;;Ya+zMAD=fvk38U>JPD=RF_j&4%od0QU#+Cftt^W2ug-bo8A z4?RQFA2+66S>2@LP5hiI!sm$|EB<9>%n4>~ib!*xixE(8wHXL^j;w-^BR!C0(4Rvh zAs6&M-}CU3Ye#Tf5$$~TKF&FCis2^Gjo!cQTy^STK`(-M*)WE9MJa)>!c7mgMQ1zs z%j)uJ<&Y7Hnl6u@DJ375IjmgqQcrzQ&)sZL&x>kMt+3XZU?NW8Bq!02*KJ%|kzwT)(IZP~FO8fv_;B2-$tNY;cX`9oGCq;y_|gZc>OmMN zg7#d42*W2uhdcMynua^C{iDW;c)0a!{ZqM-{c`7YjS>WvL*E0pd1My2PeDcpg36Yn z8Z@RQACzX(>d}@vQ671R+)nJMdA2EnHu(mWp(i^N%t4G}^w^D;AcHJnC($o%1tEej z?4nqDZ+_T582kF{hJKCOgc-vS4A>mw%K?nGOnotVq8`7OE?m_g(e?b|>@oSX!(_q5 zl?QM7U==V>*?J^S5~6+kh?_aXpqrE}?GFE?%{rsX!EN>X$V@1wchEJdB5juIW&ry2 zo-*BAh1C+bLuzQ!4~_ijXN9emuDXf_*wN!hdvE+7>}PuD<_IHJU4r4}Ig_s|KG`)|Ez>)Kj!>wux*~uBM+JpvXjyTL1w4+U ziu=tY9TTCaTI(c4Cy!vZ%aHy&#go4Nu=)euMy`+r&2`<0JdN+Sk;%!^QG~s#VRwub zl|5IU8wZK*R@>ThlUEv6e4fW<*<88c{`!GfhD$TX(FNCY2fUGaE5aFdj=)^VsWoNL z)ZllpQEY7H4foOW35(bna-A!d{VE^4b+E0N!bA+R0e9M~M)K68;ZC`Qpzj#6uKrQt_YcX;j=b8UMeB~`;8q?|FRKU8Q6^Z4Cw`!3^l%@#H2gtMN<`)g zA(f%Os2&IXn=xOVUC0*G#%G1%0L`5gHQ6H+>a@h6IB1DgJbI})27S(K%zLJh0(dE* zV}0?=?L)*y=o{WrNfoJzMCj?eeZGK=)V-i~wm|{nl;Yj70<;!NR-G)%d(r{#IIU(4 zTx4ClrrdUkVc=vJR!*ia7CS|D4edPEt&`KO`YMOy=1O$FYutKp9LGc_k&6B(veWFt zAfeCq_RITnJ+$H)%l((cZ6S%tFRKp{I^H`mB2t|mUP(vYmaP2?|j zsw=Z<4Me41n6%Gz(2I02`qxQ$pmE5zDP+~&OtN$lWen6B^FIc$oEx2JdEjfHF7Zlc;8eF}eSEw+&@i zoG_d(*%-KTi5SI2%RmCIMy=vgcTFS33sbz_C>4M@6>n%DPuaVlD`(i`9Kq02X@fgy zDt(8TVufOc>YrX*N07_}RN<|ztW!~%Gt+K|#kX#;Mzd*Qs1!N4cU%OBe3trwfb zL_aZY2N))w_*5@g((6V6_(JVv7IPmgxFbv-8+BeR!>IY-Tirmjdq4xTxCmz)BiOuk zoS2oBM!S!z`K?ZT5}9?T@zFFNr`w|bZfR+9K2e?q_#7nkYUo<+i?qrXO+oY!Q37#y zYv~hoss`w5nyoGPJ@0v?)YdJ1dls1ruy2cu1j;8&&m%^&RBy`=uE)?)%);GXO++Xq znn~%;aPJi!;Gguq-_6tNI(F@pp zu6Ov(nqUem9&^1FBX5GcA>;5sFWLk4=XO;Jyul{?)Yvii5LFqeqUYJRiwkV+jgDAm zo$0uU_x$tyxs}tV*=0IjT-C(t(Y4FEGl8@Zv^MrHJ(ag5UKGcKj*y7g(hH3kUt@95 z4j#7C&?@LH9;T!#q$^8}j75{WHOJwaDeVt>y}(3XwWyO5Gm>w&P>l6QndkIr+ z?-uHbKTWE!@pG|rb3BdIzg*WLklZ%MSOx5HM4s4(V?O8C=efI8Y6+l7&&>GBralk- z!9)jCJhrgazVmW z+)|s@lWBK*5C&FfOn727+6T}i8Hb=)a0+i?V{_l?M7AaGD-&( z;z%<&4BDuzz$ukD36?W!UbH<69~iTj)BND4Mx;g1dYTd3xY{f&W6gN}p` z8tql)^4>!`5*ulj6J~Ky)yPE@L+-AaMjBY_&9Wn(w|5gV&PTJc<-f6MIGHoMPcq!@ zbvBYU`G#-6YU|V;fyVW5(Y2fqyVJBX=z_pbz@qM^RfRPAMMc9ftx50wJjG(!F|MV( zSuRS^ouJ*>-IGEZPvS8l?6G%3-t*oXUH(Isv3`fAIL3}%bu3+Jrr&y%mUfVqP7L@$ zYwO;!PL@qjk~(#2Mjgf^zJmERUY%u+;^yl@wnQ4pcG>;l2mX0_n)`*eV>yDPbP*gk zCik-7>_$*#y0j|B54A}5rJKkM>ca`QRY7wRLOCFuuWe(1@-l#e2w}^i`wU0Dm+-9~ zFhi+3CiwN+?iRP(K7PrGws*hK`zad# zYJXM!F#+_y-XHJVj)7LI}{y#%3jt_$Tv8<6N*Z&mqzmoZX$3uT^1^<7@f8zfT{eS1{&^?9` z&n_a-ehL1?zuWrp7ye&Q&fodxKdVRoIo~VrcRFtZnjYy-ddghLFS?)D_rK8py5;>& zZzuV0=)S);z~4Ox-$$b$`{}_%X6P>u`hMK~%>&e*{|ErU!=INtG63*}?2pm^0QBi> A4gdfE diff --git a/mevislab.github.io/content/examples/data_objects/contours/example7/CSOListContainer.zip b/mevislab.github.io/content/examples/data_objects/contours/example7/CSOListContainer.zip index 4ced4d6b73447274f24cb05ca81e642587f31b58..d949b94e600f0529960074fc164aeb8b4e72e42d 100644 GIT binary patch literal 3709 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 Q6`lZdeZ*+uLx#Qk4@3b6Jpcdz literal 3526 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 O_AY5!03ZysAN>ztW($h| diff --git a/mevislab.github.io/content/examples/data_objects/surface_objects/example4/SurfaceExample4.zip b/mevislab.github.io/content/examples/data_objects/surface_objects/example4/SurfaceExample4.zip index 2f6690973ee2040e173e77204dbf6bfe137c457b..aa294289f4e9108d7b65f5ffb01b98630085d328 100644 GIT binary patch literal 8086 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 QD8DXbBmh8#;`i)-08QP(fB*mh diff --git a/mevislab.github.io/content/examples/summary/TutorialSummary.zip b/mevislab.github.io/content/examples/summary/TutorialSummary.zip index 2ff6c00801fc31b26b5b064205bb35c44a5a480e..7138c8842a26d11f09843a541e40aad0d084b909 100644 GIT binary patch literal 8519 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 diff --git a/mevislab.github.io/content/examples/summary/TutorialSummaryBrowser.zip b/mevislab.github.io/content/examples/summary/TutorialSummaryBrowser.zip index 970b6ec07a012af36e3e0e59fbd5e42290346dc8..05666a3b6d576f3e39d267b3edea6f43905f7844 100644 GIT binary patch literal 12138 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 literal 12825 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%0Dw` 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 Km>J6Jr~d*}Dcf@Z literal 7955 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 VFtERX0N7vm&aVVEA@T3l{{iTlYnuQ7 diff --git a/mevislab.github.io/content/examples/summary/TutorialSummaryUpdated.zip b/mevislab.github.io/content/examples/summary/TutorialSummaryUpdated.zip index e005bbc2c5e62f7c7de1b1c8d77e75db67e15245..dca56e8677aefc63ca73dcce60628f2b5edbd5fb 100644 GIT binary patch literal 8681 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 CkzOVM literal 8997 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 R0D$`QH;MoNFw*?W{SWX2{R;p9 diff --git a/mevislab.github.io/content/examples/testing/Example1/TestCases.zip b/mevislab.github.io/content/examples/testing/Example1/TestCases.zip index 3b0c1c54824ec5c45e3452858a00894884606cc8..c9f696ace89da5b95a6ca0dfd55e026b23727b1d 100644 GIT binary patch literal 1905 zcmWIWW@Zs#0D)^xW-(v}l;C1eU9*0WC2NmiO>*U26mSVg_%A; ztO~>dU~@PaI2g{OnWKPWj&EXeQNC|}N@-3i%y7MeN^GW^15E|t72(y%b3+32Zy5;G zxj(Xxxaqy=;svg^i5|0EytNb$zVNta8#b?4B}~|QlPuTYuh!O_zNf>sKIWYNe&6qR zpQqo}iku`=79$)N79{zp(4ycV%a+d9r;grQ?Y%0|Wu2wSO1X(k&lu@#66~DGBv7b# zHZya_BA=6XKMFoHUXeQCc&+OMyQ5ZCk9xK?<#*}>MZ5&2bB36UpW4wf>|n2vh7)bS9s-04e^sl=NLy;9d=BRJxsTCxrdI ztOxIPIUn^y)&@O~BH311Do&Ybdiw7I#|Yi@>4{5KxE3vz|$={Rp{Y4%wkzdwt&K`33 zdA*T)=FfRk3%zVUy{wK*#5cBeQ;c)^(~TV8y+XQHV!UvtX7**=8tV3i>80Mv?!zNSe@LW$mvqYREue0t!WuJ&Z+olid)%$&dTtm6s~&-ae!QgU-FmRlE`oHflM zC~JZG=c%sIH;VrBTwC|xe%JdL^XY$Qz2Mc1N$(b#u93C&r?Ss8S+8F%8#8}|HJg5( zGoN9bm~-)5hyGu4njb#k5AbH^SX5(mZyFN=!!$Mq21FjXh?WOrQ1XCZYDsy1Q8t0} zZw*ZQAl!hK{$HY}|5I`kpUZS!J<^xc?o|I*&(FzO@~X+a4?p+4-?#hsqqUPPPbMBW zeOReDRdN0=Tj?H$*&B3n*6iH1Sc>gQqqEp+#+j#89x6#rn4rlZxa`s#=fA9}US%hL z@6`^<3V5R6?fRr!fz?z~sgkY#M}Lj-xxW=ZS~ROHG`loSODv}Mq#b5mvvc0%`^x{j z|9?&U;c?U0*FpaAVbKhgREb$mdb*$d0`(T%)=W1lU-jy598dHn9fun;UibdCZL&}M z_HSF(+0r*h&uD$yso}MGf}zE{{fi?xr|#1PC;R8lIl9Z3bE^Lcq>A_p1$^Z^=r&EK zbg$Ir8UFA7IC;JaWVaS@+io6SW^3o)67r#2t8w?t4vPRUt?x3|7Q_WjacMD`enn%! z$A!5IC9ei{oMYhneyy7Oe}9|zzoa-P8}Ni(REx4@&10R!h6<>Wq z?xoDpiYjQlFd?wr0~t-^IVg+pL5?HGJCoAYQfd5y)r54U)fvx zuW4(%G`Xd4IksJ_i~Dib;yc@BwaXPwJO7v~LNxo}*To`BCGJgYitN>4{T8#*NOOW| z`}B)nZtY`j>6%dzR-o%0+#0-#dG?x2K9yx`R?U0Y-$)acv2S0>8Z+OeHOHQe6$DOdbd{Uc+3AKh_oRS`c()Q422lvceeG1P+!`4OK5HqEB7v%U1%oxyjwo(|#tZm#>N;fgqBb&LfAhkjIy3hAh=tm5OkgCNPsg zTWAQD?1l*4r6)bO=JfjgW|^Y znypKMJn)&iDS}S*iW5xY$WkLum>fi3DQh?3^r>(8uWBpC-XY1DC8*R&>O`Md1F=jV zH!~8zmn)67L1QtAlb=N+VZY0D2q6EZS%Obph#A(YjQjFNvmHgGTsbU!;A1eaQzEpQp*qE$i#W zVT^ByEv|0Jx9Jd{v)cCwI@Ip5TM*46SQGWh1Fg~!Aw%(g$21?+@mKscg3!Mz=SbC90%W%7)q6$aIB36?|LqPHB^t61LfIftw5Q z?M*iL1ZwV3;6U`Nxu!m7;*=sp9tX(-lH9~%K<1cc+t>+m{Rb%m=_tdcS>1ZH^q$Rr zPg<-#B{>k{h`rosU3WI6ZyNCqSRt zr+Vv&zSs?+JoRG)F-CqPcg-CXyta~H`724{pa2sPnZUYcPgZ2?G!9Rkw8|7S8EWMBty`1|13&lCDbjh{K; f`{h3xLwtYy*B3|!Vg3gI00DmE_%n;|AOQFqmHE;r diff --git a/mevislab.github.io/content/examples/thirdparty/example1/OpenCVExample.zip b/mevislab.github.io/content/examples/thirdparty/example1/OpenCVExample.zip index 17d8e961e9b9723ed6ebddda78ab2038de9f9433..5c4a1df454310242c1dc9e3a6988053ebaafdc00 100644 GIT binary patch literal 816 zcmWIWW@Zs#0D9*0WC2NoiO>*U2KJ;2 zg_$)#4599-dtP6u=du%?Z-P=>S zSURI;nnLCi+k%^!$q&8f9o?R_$M^kytDxC$H$Po;ezT2rLF!49h(P}A8*e|aaq?ul zJAZ!E#P%mQd2J@iT5V8oYH4?q{_*$vye+$?-w^VM zBFGvuq3y?45xc5oQO>FHkqR1O;!C&o1H_I%{FZVBLl-bW(I};Z$>5& zW?ack0-oyrJA#-55*;f8BP6jw%!DO3Wc#EU5N2*`^uaI_f8qmL07`fP-mGjO=P&`` LRv?|q1mXbztF<8l literal 580 zcmWIWW@Zs#U|`^2Sd}m#G-fIv>k>u=hV9G@47@>)q2`vo)9o&~ayo8IO+R3qd@T9$zuM=b*L`RAZd|G?J6HK9 zQ`TA*4yj81m=Z7PACuKSu9aE8?0dcJ$*<3je%R(e+2m$nrpNV&Ab#zN+siyVn@n!? zv#XwT)O*l*=0c;TfKSGXscrw|pDlQ@_CTA%imVLXeT$^3+V|T!ZT_R?%P=eK?Z#Hg zh28(2v`e1k^7?$v>2;3b;^-%9j%+(C#yhh!W8(ahlpB#-L(N=2EqK2Em~Damw(YuJ zZjlEsgk~)2Id;efG_?lIX2^{Y~fpJWKhv z{pqwwedd&H7GYYJllVH*OY6m7a|^`Wd;FX2w&IVSI_uW0-(EORz4@KQ2IJ;un;OG! ztq(jhb?2R1%l*W}j{MqtMPX_uBR}Jebw}?>-2TvYW#h?9){nnEH~V_(>_PpkBWBT? zPCq(*H`D6sTv@-;`{~8GrktjijJGp?iOl)rp_}M`eB+KU;o12LCYKcVe!H3Tz586! zyZ@HUjMJn4r}1{rS(ukLu8lW5V)1r=swkYFfHKj3L6 ec#{!E=ZUWY^8>tD*+6<3fiNCOp9iKD1_l5;O!b)n diff --git a/mevislab.github.io/content/examples/thirdparty/example2/FaceDetection.py b/mevislab.github.io/content/examples/thirdparty/example2/FaceDetection.py index 5ce5ea6f6..3bb6c6ecf 100644 --- a/mevislab.github.io/content/examples/thirdparty/example2/FaceDetection.py +++ b/mevislab.github.io/content/examples/thirdparty/example2/FaceDetection.py @@ -4,47 +4,53 @@ _interfaces = [] camera = None -face_cascade = cv2.CascadeClassifier('C:/tmp/haarcascade_frontalface_default.xml') +face_cascade = cv2.CascadeClassifier("C:/tmp/haarcascade_frontalface_default.xml") + # Setup the interface for PythonImage module def setupInterface(): - global _interfaces - _interfaces = [] - interface = ctx.module("PythonImage").call("getInterface") - _interfaces.append(interface) + global _interfaces + _interfaces = [] + interface = ctx.module("PythonImage").call("getInterface") + _interfaces.append(interface) + # Grab image from camera and update def grabImage(): - _, img = camera.read() - updateImage(img) - gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - faces = face_cascade.detectMultiScale(gray, 1.1, 4) - for (x, y, w, h) in faces: - cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) - # Display the output - cv2.imshow('img', img) + _, img = camera.read() + updateImage(img) + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + faces = face_cascade.detectMultiScale(gray, 1.1, 4) + for x, y, w, h in faces: + cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) + # Display the output + cv2.imshow("img", img) + # Update image in interface def updateImage(image): - _interfaces[0].setImage(OpenCVUtils.convertImageToML(image), minMaxValues = [0,255]) + _interfaces[0].setImage(OpenCVUtils.convertImageToML(image), minMaxValues=[0, 255]) + # Start capturing WebCam def startCapture(): - global camera - if not camera: - camera = cv2.VideoCapture(0) - ctx.callWithInterval(0.1, grabImage) + global camera + if not camera: + camera = cv2.VideoCapture(0) + ctx.callWithInterval(0.1, grabImage) + # Stop capturing WebCam def stopCapture(): - ctx.removeTimers() + ctx.removeTimers() + # Release camera in the end def releaseCamera(_): - global camera, _interfaces - ctx.removeTimers() - _interfaces = [] - if camera: - camera.release() - camera = None - cv2.destroyAllWindows() \ No newline at end of file + global camera, _interfaces + ctx.removeTimers() + _interfaces = [] + if camera: + camera.release() + camera = None + cv2.destroyAllWindows() diff --git a/mevislab.github.io/content/examples/thirdparty/monai/MONAIDemo.zip b/mevislab.github.io/content/examples/thirdparty/monai/MONAIDemo.zip index ae2fae4f1f1bd49b0d42e52cd81662453bd2beb0..b15c166f8e0f646455e148ed1a8a95e3ab4a3618 100644 GIT binary patch delta 986 zcmaE_b6?LRz?+#xgaHH&IGe?Q8Bl_YL4m>7-_Oz0B{er+zqEpzfsq9y1tvm6cp2D# zUM$SCzf_pH{6b;o+TL^j<&S%l zw7XDu_dVB*JS}xSQM+!<7W@*zY&cQnTk_)nwdzsJbDghmWObbMd7porZRdH@6Q-R9 ze!eM_k+D0^z4p~iNqv!sHvya9rK>oq`dv86IeP-nob+_It`y7W* zveWH_kJwV~i!S{u^UF)c>tf17E#D<>EABmKGn;PW>2U3w+jc?g1jfHR{`vO4Vp>p8 zdNZe`{_;A`{0nR9F1!e7@?z~iJ|+H{uJlgDoVe9@yz-BP2c&%G7U|NT?B3F78knGU z{8?mhNLX}}aQ0^HeIH(y*-T7rIex!4e9?r7AM5Yl?O%2;;mZe$d46pF1dJX&t6sda zCyvLm{E$PzIDPrOG*;smSO~b06W(Rh!tkitSdBi;6Q2oL+|9mpzi>$f6 z2wYo|P~{lG_-c!O{*>cM(b2&RJXc-3`u^*xsk*(TueOBSEK(FKx_>XvF|j)`E!duc zZDLty%flE}vz)urW(LNI9~WRYWR`1|@laSUb>pc-UFWO~=c=Q)&U@cqzP9)WQ-C)+ zN8po)$|;Nt4DzfD3=^dI)KKDbqMQNuBpr>+$G~_5(it3DM00e5vd*%q$`d96-1%u{xRo3Ge}R zOe|31_B7JS6t>jJR5>BKaqf0jk)J83>UcmVM~cbv@iMTtS!iT-0`ZblqMPTk$+3z& zjYd^008)IDTcti<17hlo6QY?*C!fwcWFX-B-Q!QQc{_`d z#Y4xkEXCR;>f?La=YbpxFSJi_`FO^*+)eJbFx!=`HV3<1vQ9P=pSn%|-(q9#G*xBU3AGjsOIdijX2vXKjpr=1U3$kQln zpS!{+Bdu(v=}b+r;|si&U0d^1tm42u{qOYwrU|_hk1k|*7jC_O&!qaj6U;lA=6cBW z&dm58-jnY8b4{4#(tBO|H!i##e`CRpo4FpAbKa_Kn3-j;_LXYcx+3P)s~@t@&pSRf z)5|raH{^6o>$IIaWq-b_Pbew3|EA8I&#|&()7;P-+chkbZZ#aR41cU&&FO7jGC^rW z=laXVY&yrQxc1%LF*`uexuiAjUw7SKTuu{ zxnRY5n@2iEMBJo3t>k7$*z?7k|FZ;mvvV*!PLAkdWMG)d!oV>3u9%FF41)wbZER}< zF(-?P8yJC7Qh+xjlL#{+5%GMT`+W{81B0&+0|Ot5wms|&z$7Ja%F4h9N>#`jL8;2{ zKf@JfpvEbD3=BLd8n^HQ?TZvsFajkoWNqN|h2&NN6m5dSKy5d<6=i`If)ZSSH!B;+ P=`27P2lU-<5fBdmytoZb diff --git a/mevislab.github.io/content/examples/thirdparty/pytorch1/PyTorchSegmentationExample.zip b/mevislab.github.io/content/examples/thirdparty/pytorch1/PyTorchSegmentationExample.zip index 9ada61381dca55d03d967e43d2e5f63cafffe8c5..028e25c3d0a38ab3d4f984b66d89e239bb7ab536 100644 GIT binary patch literal 5332 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 diff --git a/mevislab.github.io/content/examples/thirdparty/pytorch2/DemoAI.zip b/mevislab.github.io/content/examples/thirdparty/pytorch2/DemoAI.zip index 022ab6067a600afa2c581b72d1e901f3375fc6b7..7a48a4c1d6db9de281768042b4047ae4072d4733 100644 GIT binary patch literal 7382 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 B4G91M literal 7886 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 From d830bf0acf1a7d7d1e089a3d9d6fa687e09e5050 Mon Sep 17 00:00:00 2001 From: Sascha Heckmann Date: Thu, 22 Jan 2026 09:13:45 +0100 Subject: [PATCH 5/5] Resolved review comments --- mevislab.github.io/content/tutorials/summary/summary8.md | 2 +- .../content/tutorials/thirdparty/pytorch/pytorchexample2.md | 2 +- .../content/tutorials/thirdparty/pytorch/pytorchexample3.md | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mevislab.github.io/content/tutorials/summary/summary8.md b/mevislab.github.io/content/tutorials/summary/summary8.md index 9129cde4b..17724a19a 100644 --- a/mevislab.github.io/content/tutorials/summary/summary8.md +++ b/mevislab.github.io/content/tutorials/summary/summary8.md @@ -210,7 +210,7 @@ Window "MainPanel" { minimumHeight = 300 initCommand = resetApplication Category { - // Vertical Layout and 4 Boxes with Horizontal Layout + // Vertical Layout and four Boxes with Horizontal Layout Vertical { Box Source { layout = Horizontal diff --git a/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample2.md b/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample2.md index 8cc3631f6..9ebe3fb25 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample2.md +++ b/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample2.md @@ -121,7 +121,7 @@ def onStart(): # Step 1: Get input image image = ctx.field("inputImage").image() imageArray = image.getTile((0, 0, 0, 0, 0, 0), image.imageExtent()) - inputImage = imageArray[0,0,0,:,:,:].astype("float") + inputImage = imageArray[0, 0, 0, :, :, :].astype("float") # Step 2: Normalize input image values = inputImage[inputImage > inputImage.mean()] diff --git a/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md b/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md index 12b9cbf5c..95b20893c 100644 --- a/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md +++ b/mevislab.github.io/content/tutorials/thirdparty/pytorch/pytorchexample3.md @@ -118,13 +118,13 @@ def grabImage(): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.1, 4) for (x, y, w, h) in faces: - cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) + cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) # Display the output cv2.imshow('img', img) # Update image in interface def updateImage(image): - _interfaces[0].setImage(OpenCVUtils.convertImageToML(image), minMaxValues = [0,255]) + _interfaces[0].setImage(OpenCVUtils.convertImageToML(image), minMaxValues = [0, 255]) # Start capturing webcam def startCapture(): @@ -249,7 +249,7 @@ def segmentSnapshot(): # Step 1: Get image from webcam capture stopCapture() inImage = ctx.field("PythonImage.output0").image() - img = inImage.getTile((0,0,0,0,0,0), inImage.imageExtent())[0,0,:,0,:,:] + img = inImage.getTile((0, 0, 0, 0, 0, 0), inImage.imageExtent())[0, 0, :, 0, :, :] # Step 2: Convert image into torch tensor img = torch.Tensor(img).type(torch.uint8)