Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 63 additions & 1 deletion mapclientplugins/scaffoldcreator/model/scaffoldcreatormodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from cmlibs.utils.zinc.general import ChangeManager, HierarchicalChangeManager
from cmlibs.utils.zinc.group import group_add_group_elements, group_get_highest_dimension, \
identifier_ranges_fix, identifier_ranges_from_string, identifier_ranges_to_string, mesh_group_to_identifier_ranges
from cmlibs.utils.zinc.region import determine_appropriate_glyph_size
from cmlibs.utils.zinc.region import determine_appropriate_glyph_size, copy_fitting_data
from cmlibs.utils.zinc.scene import (
scene_create_selection_group, scene_get_selection_group, scene_create_node_derivative_graphics)
from cmlibs.zinc.field import Field, FieldGroup
Expand All @@ -18,8 +18,11 @@
from scaffoldmaker.annotation.annotationgroup import findAnnotationGroupByName, getAnnotationMarkerGroup, \
getAnnotationMarkerLocationField, getAnnotationMarkerNameField
from scaffoldmaker.scaffolds import Scaffolds
from scaffoldmaker.utils.zinc_utils import find_or_create_field_zero_fibres
from scaffoldmaker.scaffoldpackage import ScaffoldPackage
from scaffoldmaker.utils.exportvtk import ExportVtk
from scaffoldfitter.fitter import Fitter as GeometryFitter
from scaffoldfitter.fitterstepalign import FitterStepAlign

import copy
import math
Expand Down Expand Up @@ -734,6 +737,65 @@ def applyTransformation(self, editCoordinatesField):
self._checkCustomParameterSet()
self._setGraphicsTransformation()

def initializeAutoAlignTransformation(self):
"""
Initialize the fitter for the automatic align process
"""
scaffold_region = self._region
# Load data into the current region (copied from load_vagus_data in 3d_nerve1)
# This way of loading data is probably not completely right? Need to consult for a better way
data_region = self._parentRegion.findChildByName('data')
data_fieldmodule = data_region.getFieldmodule()
with ChangeManager(data_fieldmodule):
copy_fitting_data(scaffold_region, data_region)
del data_region, data_fieldmodule
# Setup fitting routine
fieldmodule = scaffold_region.getFieldmodule()
self.fitter = GeometryFitter(region=scaffold_region)
self.fitter.getInitialFitterStepConfig()
# Load the _loadModel routines
self.fitter._discoverModelCoordinatesField()
self.fitter._discoverModelFitGroup()
zero_fibres = find_or_create_field_zero_fibres(fieldmodule)
self.fitter.setFibreField(zero_fibres)
del zero_fibres
self.fitter._discoverFlattenGroup()
self.fitter.defineCommonMeshFields()
# Load the _loadData routines
self.fitter._discoverDataCoordinatesField()
self.fitter._discoverMarkerGroup()
self.fitter.defineDataProjectionFields()
# Start fit
self.fitter.initializeFit()
fit1 = FitterStepAlign()
self.fitter.addFitterStep(fit1)
return fit1.canAutoAlign()

def runAutoAlignTransformation(self):
"""
Run the align step and update visual settings
"""
scaffoldPackage = self._scaffoldPackages[-1]
fit1 = self.fitter.getFitterSteps()[-1]
# Add markers/groups to align step if possible
if fit1.canAlignMarkers():
fit1.setAlignMarkers(True)
if fit1.canAlignGroups():
fit1.setAlignGroups(True)
# Run align step
fit1._doAutoAlign()
# Store align rotation settings
rotation = [rad * 180.0 / math.pi for rad in fit1._rotation]
scale = [fit1._scale for i in range(3)]
translation = fit1._translation
del fit1
# If any visual settings changes, update graphics settings
update_rotation = scaffoldPackage.setRotation(rotation)
update_scale = scaffoldPackage.setScale(scale)
update_translation = scaffoldPackage.setTranslation(translation)
if update_rotation or update_scale or update_translation:
self._setGraphicsTransformation()

def getRotationText(self):
return ', '.join(STRING_FLOAT_FORMAT.format(value) for value in self._scaffoldPackages[-1].getRotation())

Expand Down
63 changes: 50 additions & 13 deletions mapclientplugins/scaffoldcreator/qt/scaffoldsettingswidget.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>556</width>
<width>554</width>
<height>773</height>
</rect>
</property>
Expand Down Expand Up @@ -41,7 +41,7 @@
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<enum>QFrame::Shape::NoFrame</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
Expand All @@ -56,7 +56,7 @@
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
Expand All @@ -82,7 +82,7 @@
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
Expand All @@ -100,7 +100,7 @@
<item>
<widget class="QFrame" name="meshType_frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<enum>QFrame::Shape::NoFrame</enum>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="leftMargin">
Expand Down Expand Up @@ -135,7 +135,7 @@
<item>
<widget class="QFrame" name="meshTypeOptions_frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<enum>QFrame::Shape::NoFrame</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_9">
<property name="leftMargin">
Expand All @@ -150,13 +150,13 @@
<item>
<widget class="QFrame" name="modifyOptions_frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<enum>QFrame::Shape::NoFrame</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QFrame" name="deleteElementsRanges_frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<enum>QFrame::Shape::NoFrame</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
<property name="leftMargin">
Expand Down Expand Up @@ -189,7 +189,7 @@
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
Expand All @@ -209,7 +209,7 @@
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
Expand Down Expand Up @@ -256,7 +256,7 @@
<item>
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
Expand All @@ -276,7 +276,44 @@
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="autoAlignTransformation_pushButton">
<property name="text">
<string>Auto align</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
Expand All @@ -294,7 +331,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
Expand Down
50 changes: 50 additions & 0 deletions mapclientplugins/scaffoldcreator/view/scaffoldcreatorwidget.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ def _makeConnections(self):
self._scaffold_settings_ui.scale_lineEdit.editingFinished.connect(self._scaleLineEditChanged)
self._scaffold_settings_ui.translation_lineEdit.editingFinished.connect(self._translationLineEditChanged)
self._scaffold_settings_ui.applyTransformation_pushButton.clicked.connect(self._applyTransformationButtonPressed)
self._scaffold_settings_ui.autoAlignTransformation_pushButton.clicked.connect(self._autoAlignTransformationButtonPressed)
self._display_settings_ui.displayDataGroup_fieldChooser.setNullObjectName('-')
self._display_settings_ui.displayDataGroup_fieldChooser.setRegion(self._segmentation_data_model.getRegion())
self._display_settings_ui.displayDataGroup_fieldChooser.setConditional(field_is_managed_group)
Expand Down Expand Up @@ -700,6 +701,55 @@ def _applyTransformationButtonPressed(self):
self._scaffold_model.applyTransformation(self._display_settings_ui.displayModelCoordinates_fieldChooser.getField())
self._transformationChanged()

def _autoAlignTransformationButtonPressed(self):
# Create dialog
reply = QtWidgets.QDialog(self)
reply.setWindowTitle('Confirm action')
layout = QtWidgets.QVBoxLayout(reply)
hasData = self._segmentation_data_model.hasData()
if not hasData:
# Add text
textLabel = QtWidgets.QLabel('No data file supplied')
textLabel.setWordWrap(True)
layout.addWidget(textLabel)
layout.addSpacing(10)
# add Ok Button
buttons = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.StandardButton.Ok)
buttons.accepted.connect(reply.reject)
layout.addWidget(buttons)
else:
# Initilize fitter
canAutoAlign = self._scaffold_model.initializeAutoAlignTransformation()
if canAutoAlign:
# Add text
textLabel = QtWidgets.QLabel('Automatically align scaffold to data?')
textLabel.setWordWrap(True)
layout.addWidget(textLabel)
layout.addSpacing(10)
# Add buttons
buttons = QtWidgets.QDialogButtonBox(
QtWidgets.QDialogButtonBox.StandardButton.Yes |
QtWidgets.QDialogButtonBox.StandardButton.No
)
layout.addWidget(buttons)
buttons.accepted.connect(reply.accept)
buttons.rejected.connect(reply.reject)
else:
# Add text
textLabel = QtWidgets.QLabel('Not enough markers and/or groups' \
' to perform automatic alignment to data')
textLabel.setWordWrap(True)
layout.addWidget(textLabel)
layout.addSpacing(10)
# add Ok Button
buttons = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.StandardButton.Ok)
layout.addWidget(buttons)
buttons.accepted.connect(reply.reject)
# Execute dialog
if reply.exec() == QtWidgets.QDialog.Accepted:
self._scaffold_model.runAutoAlignTransformation()
self._transformationChanged()

def _displayDataGroupChanged(self, index):
"""
Callback for change in model coordinates field chooser widget.
Expand Down
Loading