diff --git a/mapclientplugins/segmentationstitcherstep/model/segmentationstitchermodel.py b/mapclientplugins/segmentationstitcherstep/model/segmentationstitchermodel.py index ef80d9d..b4bebde 100644 --- a/mapclientplugins/segmentationstitcherstep/model/segmentationstitchermodel.py +++ b/mapclientplugins/segmentationstitcherstep/model/segmentationstitchermodel.py @@ -9,9 +9,10 @@ rotation_matrix_to_euler from cmlibs.utils.zinc.finiteelement import evaluate_field_nodeset_range from cmlibs.utils.zinc.general import ChangeManager, HierarchicalChangeManager +from cmlibs.utils.zinc.field import get_group_list from cmlibs.utils.zinc.group import group_add_group_local_contents from cmlibs.utils.zinc.scene import scene_clear_selection_group, scene_get_or_create_selection_group -from cmlibs.zinc.field import Field +from cmlibs.zinc.field import Field, FieldGroup from cmlibs.zinc.glyph import Glyph from cmlibs.zinc.graphics import Graphicslineattributes from cmlibs.zinc.material import Material @@ -36,11 +37,11 @@ def __init__(self, segmentation_file_locations, location, step_identifier, initially assigned to network group 2, allowing them to be stitched together. """ self._stitcher = Stitcher(segmentation_file_locations, network_group_1_keywords, network_group2_keywords) - self._location = os.path.join(location, step_identifier) + self._location_stem = os.path.join(location, step_identifier) self._step_identifier = step_identifier self._category_graphics_info = [ - (AnnotationCategory.GENERAL, "display_line_general", "green"), - (AnnotationCategory.INDEPENDENT_NETWORK, "display_independent_networks", "yellow"), + (AnnotationCategory.GENERAL, "display_line_general", "mid green"), + (AnnotationCategory.INDEPENDENT_NETWORK, "display_independent_networks", "purple"), (AnnotationCategory.NETWORK_GROUP_1, "display_network_group_1", "mid blue"), (AnnotationCategory.NETWORK_GROUP_2, "display_network_group_2", "orange") ] @@ -50,6 +51,9 @@ def __init__(self, segmentation_file_locations, location, step_identifier, "display_axes": True, "display_marker_points": True, "display_marker_names": False, + "display_node_numbers": False, + "display_node_points": False, + "display_node_group_name": None, "display_line_general": True, "display_line_general_radius": False, "display_line_general_trans": False, @@ -66,7 +70,8 @@ def __init__(self, segmentation_file_locations, location, step_identifier, "display_end_point_best_fit_lines": True, "display_end_point_radius": False, "display_end_point_trans": False, - "display_radius_scale": 1.0 + "display_radius_scale": 1.0, + "display_theme": "Dark" } self._load_settings() self.create_graphics() @@ -79,6 +84,8 @@ def __init__(self, segmentation_file_locations, location, step_identifier, self._current_annotation = None self._segment_data_change_callback = None + _EMPTY_GROUP_NAME = "" + def _init_graphics_modules(self): context = self._stitcher.get_context() self._materialmodule = context.getMaterialmodule() @@ -87,11 +94,27 @@ def _init_graphics_modules(self): mid_blue = self._materialmodule.createMaterial() mid_blue.setName("mid blue") mid_blue.setManaged(True) - mid_blue.setAttributeReal3(Material.ATTRIBUTE_AMBIENT, [0.0, 0.2, 0.6]) - mid_blue.setAttributeReal3(Material.ATTRIBUTE_DIFFUSE, [0.0, 0.7, 1.0]) + mid_blue.setAttributeReal3(Material.ATTRIBUTE_AMBIENT, [0.0, 0.4, 0.8]) + mid_blue.setAttributeReal3(Material.ATTRIBUTE_DIFFUSE, [0.0, 0.6, 1.0]) mid_blue.setAttributeReal3(Material.ATTRIBUTE_EMISSION, [0.0, 0.0, 0.0]) mid_blue.setAttributeReal3(Material.ATTRIBUTE_SPECULAR, [0.1, 0.1, 0.1]) mid_blue.setAttributeReal(Material.ATTRIBUTE_SHININESS, 0.2) + mid_green = self._materialmodule.createMaterial() + mid_green.setName("mid green") + mid_green.setManaged(True) + mid_green.setAttributeReal3(Material.ATTRIBUTE_AMBIENT, [0.2, 0.7, 0.2]) + mid_green.setAttributeReal3(Material.ATTRIBUTE_DIFFUSE, [0.2, 0.7, 0.2]) + mid_green.setAttributeReal3(Material.ATTRIBUTE_EMISSION, [0.0, 0.0, 0.0]) + mid_green.setAttributeReal3(Material.ATTRIBUTE_SPECULAR, [0.1, 0.1, 0.1]) + mid_green.setAttributeReal(Material.ATTRIBUTE_SHININESS, 0.2) + purple = self._materialmodule.createMaterial() + purple.setName("purple") + purple.setManaged(True) + purple.setAttributeReal3(Material.ATTRIBUTE_AMBIENT, [0.6, 0.0, 1.0]) + purple.setAttributeReal3(Material.ATTRIBUTE_DIFFUSE, [0.6, 0.0, 1.0]) + purple.setAttributeReal3(Material.ATTRIBUTE_EMISSION, [0.0, 0.0, 0.0]) + purple.setAttributeReal3(Material.ATTRIBUTE_SPECULAR, [0.1, 0.1, 0.1]) + purple.setAttributeReal(Material.ATTRIBUTE_SHININESS, 0.2) line_material_names = [graphics_info[-1] for graphics_info in self._category_graphics_info] for material_name in line_material_names + [self._end_point_material_name]: material = self._materialmodule.findMaterialByName(material_name) @@ -111,40 +134,80 @@ def _init_graphics_modules(self): default_tessellation = tessellationmodule.getDefaultTessellation() default_tessellation.setRefinementFactors([12]) - def _get_settings_file_name(self): - return self._location + "-settings.json" + @classmethod + def get_json_settings_filename(cls, location_stem): + """ + :param location_stem: Path and stem name of workflow step to make unique filenames from. + :return: Standard settings file location. + """ + return location_stem + "-settings.json" + + @classmethod + def get_json_display_settings_filename(cls, location_stem): + """ + :param location_stem: Path and stem name of workflow step to make unique filenames from. + :return: Standard display settings file location. + """ + return location_stem + "-display-settings.json" - def _get_display_settings_file_name(self): - return self._location + "-display-settings.json" + @classmethod + def get_config_files(cls, location_stem): + """ + :param location_stem: Path and stem name of workflow step to make unique filenames from. + :return: list of config file locations needed to reproduce step behaviour. + """ + return [cls.get_json_settings_filename(location_stem), cls.get_json_display_settings_filename(location_stem)] + + @classmethod + def get_output_segmentation_filename(cls, location_stem): + """ + :param location_stem: Path and stem name of workflow step to make unique filenames from. + :return: Standard name of output segmentation file name. + """ + return location_stem + ".exf" + + SEGMENTATION_STITCHER_DISPLAY_SETTINGS_ID = 'segmentation stitcher display settings' + + def _get_output_display_settings(self): + """ + :return: Display settings augmented with id and version information. + """ + display_settings = { + 'id': self.SEGMENTATION_STITCHER_DISPLAY_SETTINGS_ID, + 'version': '1.0.0' + } + display_settings.update(self._display_settings) + return display_settings def _load_settings(self): - settings_file_name = self._get_settings_file_name() + settings_file_name = self.get_json_settings_filename(self._location_stem) if os.path.isfile(settings_file_name): with open(settings_file_name, "r") as f: settings = json.loads(f.read()) self._stitcher.decode_settings(settings) - display_settings_file_name = self._get_display_settings_file_name() + display_settings_file_name = self.get_json_display_settings_filename(self._location_stem) if os.path.isfile(display_settings_file_name): with open(display_settings_file_name, "r") as f: display_settings = json.loads(f.read()) + settings_id = display_settings.get('id') + if settings_id is not None: + assert settings_id == self.SEGMENTATION_STITCHER_DISPLAY_SETTINGS_ID + assert display_settings['version'] == '1.0.0' # future: migrate if version changes + # these are not stored: + del display_settings['id'] + del display_settings['version'] self._display_settings.update(display_settings) def _save_settings(self): - with open(self._get_settings_file_name(), "w") as f: + with open(self.get_json_settings_filename(self._location_stem), "w") as f: settings = self._stitcher.encode_settings() f.write(json.dumps(settings, sort_keys=False, indent=4)) - with open(self._get_display_settings_file_name(), "w") as f: - f.write(json.dumps(self._display_settings, sort_keys=False, indent=4)) - - def get_output_file_name_stem(self): - return self._location - - def get_output_segmentation_file_name(self): - return self._location + ".exf" + with open(self.get_json_display_settings_filename(self._location_stem), "w") as f: + f.write(json.dumps(self._get_output_display_settings(), sort_keys=False, indent=4)) def done(self): self._save_settings() - self._stitcher.write_output_segmentation_file(self.get_output_segmentation_file_name()) + self._stitcher.write_output_segmentation_file(self.get_output_segmentation_filename(self._location_stem)) def get_step_identifier(self): return self._step_identifier @@ -415,6 +478,88 @@ def is_display_marker_names(self): def set_display_marker_names(self, show): self._set_raw_visibility("display_marker_names", show) + def get_raw_group_names(self): + """ + Get all unique-named groups in raw regions for populating node group combo box. + :return: List of unique group names in alphabetical order. + """ + group_names_set = set() + for segment in self._stitcher.get_segments(): + for group in get_group_list(segment.get_raw_region().getFieldmodule()): + group_names_set.add(group.getName()) + return sorted(group_names_set) + + def get_display_node_group_name(self): + """ + :return: Name of node group being displayed or None. + """ + return self._display_settings['display_node_group_name'] + + def set_display_node_group_name(self, node_group_name): + """ + Set group to restrict display of node points to. + :param node_group_name: Node group name or None. + """ + self._display_settings['display_node_group_name'] = node_group_name + segments = self._stitcher.get_segments() + for segment in segments: + region = segment.get_raw_region() + fieldmodule = region.getFieldmodule() + if node_group_name: + node_group = fieldmodule.findFieldByName(node_group_name) + if not node_group.isValid(): + node_group = fieldmodule.findFieldByName(self._EMPTY_GROUP_NAME) + else: + node_group = FieldGroup() + scene = region.getScene() + with ChangeManager(scene): + for graphics_name in ['display_node_points', 'display_node_numbers']: + graphics = scene.findGraphicsByName(graphics_name) + if graphics.isValid(): + graphics.setSubgroupField(node_group) + + def is_display_node_numbers(self): + return self._get_visibility('display_node_numbers') + + def set_display_node_numbers(self, show): + self._set_raw_visibility('display_node_numbers', show) + + def is_display_node_points(self): + return self._get_visibility('display_node_points') + + def set_display_node_points(self, show): + self._set_raw_visibility('display_node_points', show) + + def get_display_theme(self): + return self._display_settings['display_theme'] + + def _apply_display_theme(self): + """ + Update graphics materials for the current theme. + """ + root_region = self.get_root_region() + root_scene = root_region.getScene() + if not root_scene: + return + display_theme_name = self._display_settings['display_theme'] + is_dark = display_theme_name == 'Dark' + segments = self._stitcher.get_segments() + for segment in segments: + region = segment.get_raw_region() + scene = region.getScene() + with ChangeManager(scene): + for graphics_name in ['display_marker_points', 'display_marker_names']: + graphics = scene.findGraphicsByName(graphics_name) + graphics.setMaterial(self._materialmodule.findMaterialByName('white' if is_dark else 'black')) + for graphics_name in ['display_node_points', 'display_node_numbers']: + graphics = scene.findGraphicsByName(graphics_name) + graphics.setMaterial(self._materialmodule.findMaterialByName('yellow' if is_dark else 'magenta')) + + def set_display_theme(self, display_theme_name): + assert display_theme_name in ('Dark', 'Light') + self._display_settings['display_theme'] = display_theme_name + self._apply_display_theme() + def is_display_line_general(self): return self._get_visibility("display_line_general") @@ -599,6 +744,14 @@ def create_graphics(self): minimums[c] = segment_minimums[c] elif segment_maximums[c] > maximums[c]: maximums[c] = segment_maximums[c] + # create '.empty' group in all raw regions to show nothing when a required group doesn't exist there + with HierarchicalChangeManager(self._stitcher.get_root_region()): + for segment in segments: + region = segment.get_raw_region() + fieldmodule = region.getFieldmodule() + empty_group = fieldmodule.createFieldGroup() + empty_group.setName(self._EMPTY_GROUP_NAME) + empty_group.setManaged(True) if minimums: max_range = 0.0 for c in range(3): @@ -638,6 +791,14 @@ def create_graphics(self): marker_group = None marker_coordinates = None marker_name = None + cmiss_number = fieldmodule.findFieldByName('cmiss_number') + node_group_name = self.get_display_node_group_name() + if node_group_name: + node_group = fieldmodule.findFieldByName(node_group_name) + if not node_group.isValid(): + node_group = fieldmodule.findFieldByName(self._EMPTY_GROUP_NAME) + else: + node_group = FieldGroup() radius = fieldmodule.findFieldByName("radius") if not radius.isValid(): radius = None @@ -673,6 +834,31 @@ def create_graphics(self): marker_names.setName("display_marker_names") marker_names.setVisibilityFlag(self.is_display_marker_names()) + node_points = scene.createGraphicsPoints() + node_points.setFieldDomainType(Field.DOMAIN_TYPE_NODES) + node_points.setSubgroupField(node_group) + node_points.setCoordinateField(coordinates) + pointattr = node_points.getGraphicspointattributes() + pointattr.setGlyphShapeType(Glyph.SHAPE_TYPE_SPHERE) + pointattr.setBaseSize([0.5 * glyph_width_small]) + # pointattr.setGlyphShapeType(Glyph.SHAPE_TYPE_POINT) + # node_points.setRenderPointSize(3.0) + node_points.setMaterial(self._materialmodule.findMaterialByName('yellow')) + node_points.setName('display_node_points') + node_points.setVisibilityFlag(self.is_display_node_points()) + + node_numbers = scene.createGraphicsPoints() + node_numbers.setFieldDomainType(Field.DOMAIN_TYPE_NODES) + node_numbers.setSubgroupField(node_group) + node_numbers.setCoordinateField(coordinates) + pointattr = node_numbers.getGraphicspointattributes() + pointattr.setLabelField(cmiss_number) + pointattr.setLabelText(1, " ") + pointattr.setGlyphShapeType(Glyph.SHAPE_TYPE_NONE) + node_numbers.setMaterial(self._materialmodule.findMaterialByName('yellow')) + node_numbers.setName('display_node_numbers') + node_numbers.setVisibilityFlag(self.is_display_node_numbers()) + self._create_category_graphics(segment, scene, coordinates, radius, radius_scale) working_region = segment.get_working_region() @@ -716,6 +902,7 @@ def create_graphics(self): end_point_best_fit_lines.setVisibilityFlag(self.is_display_end_point_best_fit_lines()) self._create_connection_graphics() + self._apply_display_theme() def _create_connection_graphics(self, only_connection=None): for connection in [only_connection] if only_connection else self._stitcher.get_connections(): diff --git a/mapclientplugins/segmentationstitcherstep/qt/segmentationstitcherwidget.ui b/mapclientplugins/segmentationstitcherstep/qt/segmentationstitcherwidget.ui index dacec40..746bb13 100644 --- a/mapclientplugins/segmentationstitcherstep/qt/segmentationstitcherwidget.ui +++ b/mapclientplugins/segmentationstitcherstep/qt/segmentationstitcherwidget.ui @@ -50,10 +50,10 @@ - QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + QDockWidget::DockWidgetFeature::DockWidgetFloatable|QDockWidget::DockWidgetFeature::DockWidgetMovable - Qt::AllDockWidgetAreas + Qt::DockWidgetArea::AllDockWidgetAreas Control Panel @@ -103,10 +103,10 @@ - QFrame::NoFrame + QFrame::Shape::NoFrame - Qt::ScrollBarAsNeeded + Qt::ScrollBarPolicy::ScrollBarAsNeeded true @@ -115,9 +115,9 @@ 0 - -23 - 343 - 92 + 0 + 358 + 94 @@ -139,10 +139,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -164,7 +164,7 @@ - QFormLayout::AllNonFixedFieldsGrow + QFormLayout::FieldGrowthPolicy::AllNonFixedFieldsGrow @@ -214,10 +214,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -233,7 +233,7 @@ 0 - + New... @@ -284,10 +284,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -308,10 +308,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -350,6 +350,54 @@ + + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Node points + + + + + + + Node numbers + + + + + + + Node group: + + + + + + + + + @@ -359,10 +407,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -410,10 +458,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -455,10 +503,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -506,10 +554,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -603,10 +651,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -627,10 +675,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -655,6 +703,54 @@ + + + + QFrame::Shape::NoFrame + + + QFrame::Shadow::Plain + + + + QFormLayout::FieldGrowthPolicy::FieldsStayAtSizeHint + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Theme: + + + + + + + + Dark + + + + + Light + + + + + + + @@ -668,10 +764,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -771,10 +867,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised diff --git a/mapclientplugins/segmentationstitcherstep/step.py b/mapclientplugins/segmentationstitcherstep/step.py index 1de63e4..34e4994 100644 --- a/mapclientplugins/segmentationstitcherstep/step.py +++ b/mapclientplugins/segmentationstitcherstep/step.py @@ -2,6 +2,7 @@ MAP Client Plugin Step """ import json +import os import pathlib from PySide6 import QtGui, QtWidgets, QtCore @@ -27,13 +28,27 @@ def __init__(self, location): self.addPort([('http://physiomeproject.org/workflow/1.0/rdf-schema#port', 'http://physiomeproject.org/workflow/1.0/rdf-schema#uses', 'http://physiomeproject.org/workflow/1.0/rdf-schema#file_location'), + ('http://physiomeproject.org/workflow/1.0/rdf-schema#port', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#uses', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#exf_file_location'), + ('http://physiomeproject.org/workflow/1.0/rdf-schema#port', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#uses-list-of', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#file_location'), ('http://physiomeproject.org/workflow/1.0/rdf-schema#port', 'http://physiomeproject.org/workflow/1.0/rdf-schema#uses-list-of', - 'http://physiomeproject.org/workflow/1.0/rdf-schema#file_location') - ]) - self.addPort(('http://physiomeproject.org/workflow/1.0/rdf-schema#port', - 'http://physiomeproject.org/workflow/1.0/rdf-schema#provides', - 'http://physiomeproject.org/workflow/1.0/rdf-schema#file_location')) + 'http://physiomeproject.org/workflow/1.0/rdf-schema#exf_file_location')]) + self.addPort([('http://physiomeproject.org/workflow/1.0/rdf-schema#port', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#provides', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#file_location'), + ('http://physiomeproject.org/workflow/1.0/rdf-schema#port', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#provides', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#exf_file_location')]) + self.addPort([('http://physiomeproject.org/workflow/1.0/rdf-schema#port', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#provides', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#file_location'), + ('http://physiomeproject.org/workflow/1.0/rdf-schema#port', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#provides', + 'http://physiomeproject.org/workflow/1.0/rdf-schema#json_file_location')]) # Config: self._config = { 'identifier': '', @@ -41,7 +56,10 @@ def __init__(self, location): 'network group 2 keywords': ['fascicle'] } # Port data: - self._segmentation_file_locations = None # file_location + self._port0_input_segmentation_file_locations = None # list of exf_file_location + # following are only set on successful execution of step + self._port1_output_segmentation_file_location = None # exf_file_location + self._port2_output_json_settings_file_location = None # json_file_location self._model = None self._view = None @@ -53,15 +71,28 @@ def execute(self): """ QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.CursorShape.WaitCursor) try: + self._port1_output_segmentation_file_location = None # exf_file_location + self._port2_output_json_settings_file_location = None # json_file_location self._model = SegmentationStitcherModel( - self._segmentation_file_locations, self._location, self._config['identifier'], + self._port0_input_segmentation_file_locations, self._location, self._config['identifier'], self._config['network group 1 keywords'], self._config['network group 2 keywords']) self._view = SegmentationStitcherWidget(self._model) - self._view.register_done_callback(self._doneExecution) + self._view.register_done_callback(self._my_done_execution) self._setCurrentWidget(self._view) finally: QtWidgets.QApplication.restoreOverrideCursor() + def _my_done_execution(self): + location_stem = os.path.join(self._location, self._config['identifier']) + # important that these are only set on successful execution: + self._port1_output_segmentation_file_location = \ + SegmentationStitcherModel.get_output_segmentation_filename(location_stem) + self._port2_output_json_settings_file_location = \ + SegmentationStitcherModel.get_json_settings_filename(location_stem) + self._view = None + self._model = None + self._doneExecution() + def setPortData(self, index, dataIn): """ Add your code here that will set the appropriate objects for this step. @@ -73,8 +104,8 @@ def setPortData(self, index, dataIn): """ if not isinstance(dataIn, list): dataIn = [dataIn] - - self._segmentation_file_locations = [pathlib.PureWindowsPath(p).as_posix() for p in dataIn] # file_location + # list of exf_file_location: + self._port0_input_segmentation_file_locations = [pathlib.PureWindowsPath(p).as_posix() for p in dataIn] def getPortData(self, index): """ @@ -84,8 +115,11 @@ def getPortData(self, index): :param index: Index of the port to return. """ - # http://physiomeproject.org/workflow/1.0/rdf-schema#file_location - return self._model.get_output_segmentation_file_name() + if index == 1: + return self._port1_output_segmentation_file_location + if index == 2: + return self._port2_output_json_settings_file_location + return None def configure(self): """ @@ -139,3 +173,6 @@ def deserialize(self, string): d.identifierOccursCount = self._identifierOccursCount d.setConfig(self._config) self._configured = d.validate() + + def getAdditionalConfigFiles(self): + return SegmentationStitcherModel.get_config_files(os.path.join(self._location, self._config['identifier'])) diff --git a/mapclientplugins/segmentationstitcherstep/view/segmentationstitcherwidget.py b/mapclientplugins/segmentationstitcherstep/view/segmentationstitcherwidget.py index 2953d74..71d09b3 100644 --- a/mapclientplugins/segmentationstitcherstep/view/segmentationstitcherwidget.py +++ b/mapclientplugins/segmentationstitcherstep/view/segmentationstitcherwidget.py @@ -45,11 +45,19 @@ def _graphics_initialized(self): if sceneviewer is not None: scene = self._model.get_root_region().getScene() self._ui.alignmentsceneviewerwidget.setScene(scene) + self._set_display_theme_background() # self._ui.alignmentsceneviewerwidget.setSelectModeAll() sceneviewer.setLookatParametersNonSkew([2.0, -2.0, 1.0], [0.0, 0.0, 0.0], [0.0, 0.0, 1.0]) sceneviewer.setTransparencyMode(sceneviewer.TRANSPARENCY_MODE_SLOW) self._viewAll_buttonClicked() + def _set_display_theme_background(self): + sceneviewer = self._ui.alignmentsceneviewerwidget.getSceneviewer() + if sceneviewer is not None: + theme_name = self._model.get_display_theme() + background_colour_rgb = [1.0, 1.0, 1.0] if (theme_name == 'Light') else [0.0, 0.0, 0.0] + sceneviewer.setBackgroundColourRGB(background_colour_rgb) + def _transformation_changed(self): # self._ui.segmentRotation_lineEdit.setText(self._model.getRotationText()) # self._ui.segmentTranslation_lineEdit.setText(self._model.getTranslationText()) @@ -64,7 +72,7 @@ def _make_connections(self): self._ui.segmentRotation_lineEdit.editingFinished.connect(self._segmentRotation_lineEditChanged) self._ui.segmentTranslation_lineEdit.editingFinished.connect(self._segmentTranslation_lineEditChanged) - self._ui.conntectionsNew_pushButton.clicked.connect(self._connectionNew_buttonClicked) + self._ui.connectionsNew_pushButton.clicked.connect(self._connectionNew_buttonClicked) self._ui.connectionsDelete_pushButton.clicked.connect(self._connectionDelete_buttonClicked) self._ui.connectionsOptimizeAlignment_pushButton.clicked.connect( self._connectionsOptimizeAlignment_buttonPressed) @@ -72,6 +80,9 @@ def _make_connections(self): self._ui.displayAxes_checkBox.clicked.connect(self._displayAxes_clicked) self._ui.displayMarkerPoints_checkBox.clicked.connect(self._displayMarkerPoints_clicked) self._ui.displayMarkerNames_checkBox.clicked.connect(self._displayMarkerNames_clicked) + self._ui.displayNodePoints_checkBox.clicked.connect(self._displayNodePoints_clicked) + self._ui.displayNodeNumbers_checkBox.clicked.connect(self._displayNodeNumbers_clicked) + self._ui.displayNodeGroup_comboBox.currentIndexChanged.connect(self._displayNodeGroupChanged) self._ui.displayLineGeneral_checkBox.clicked.connect(self._displayLineGeneral_clicked) self._ui.displayLineGeneralRadius_checkBox.clicked.connect(self._displayLineGeneralRadius_clicked) @@ -86,21 +97,43 @@ def _make_connections(self): self._ui.displayNetworkGroup2Radius_checkBox.clicked.connect(self._displayNetworkGroup2Radius_clicked) self._ui.displayNetworkGroup2Trans_checkBox.clicked.connect(self._displayNetworkGroup2Trans_clicked) - self._ui.displayRadiusScale_lineEdit.editingFinished.connect(self._displayRadiusScale_entered) self._ui.displayEndPointDirections_checkBox.clicked.connect(self._displayEndPointDirections_clicked) self._ui.displayEndPointBestFitLines_checkBox.clicked.connect(self._displayEndPointBestFitLines_clicked) self._ui.displayEndPointRadius_checkBox.clicked.connect(self._displayEndPointRadius_clicked) self._ui.displayEndPointTrans_checkBox.clicked.connect(self._displayEndPointTrans_clicked) + self._ui.displayRadiusScale_lineEdit.editingFinished.connect(self._displayRadiusScale_entered) + self._ui.displayTheme_comboBox.currentIndexChanged.connect(self._display_theme_changed) self._ui.annotationName_comboBox.currentIndexChanged.connect(self._annotationName_changed) self._ui.annotationCategory_comboBox.currentIndexChanged.connect(self._annotationCategory_changed) self._ui.annotationAlignWeight_lineEdit.editingFinished.connect(self._annotationAlignWeight_entered) + def _set_combo_box_items(self, combo_box, names, current_name): + """ + Set list of all names and currently selected name in combo box. + :param combo_box: QComboBox + :param names: List of all valid names of which 0 index is the default/None text. + :param current_name: Name in combo box tests or None for first/default item. + """ + combo_box.blockSignals(True) + combo_box.addItems(names) + if current_name: + index = combo_box.findText(current_name) + else: + index = 0 + combo_box.setCurrentIndex(index) + combo_box.blockSignals(False) + def _refresh_options(self): self._ui.identifier_label.setText('Identifier: ' + self._model.get_step_identifier()) self._ui.displayAxes_checkBox.setChecked(self._model.is_display_axes()) self._ui.displayMarkerPoints_checkBox.setChecked(self._model.is_display_marker_points()) self._ui.displayMarkerNames_checkBox.setChecked(self._model.is_display_marker_names()) + self._ui.displayNodePoints_checkBox.setChecked(self._model.is_display_node_points()) + self._ui.displayNodeNumbers_checkBox.setChecked(self._model.is_display_node_numbers()) + group_names = self._model.get_raw_group_names() + self._set_combo_box_items( + self._ui.displayNodeGroup_comboBox, [""] + group_names, self._model.get_display_node_group_name()) self._ui.displayLineGeneral_checkBox.setChecked(self._model.is_display_line_general()) self._ui.displayLineGeneralRadius_checkBox.setChecked(self._model.is_display_line_general_radius()) @@ -120,6 +153,10 @@ def _refresh_options(self): self._ui.displayEndPointBestFitLines_checkBox.setChecked(self._model.is_display_end_point_best_fit_lines()) self._ui.displayEndPointRadius_checkBox.setChecked(self._model.is_display_end_point_radius()) self._ui.displayEndPointTrans_checkBox.setChecked(self._model.is_display_end_point_trans()) + index = self._ui.displayTheme_comboBox.findText(self._model.get_display_theme()) + self._ui.displayTheme_comboBox.blockSignals(True) + self._ui.displayTheme_comboBox.setCurrentIndex(index) + self._ui.displayTheme_comboBox.blockSignals(False) self._refresh_segment_data() self._refresh_current_annotation_settings() @@ -411,6 +448,19 @@ def _displayMarkerPoints_clicked(self): def _displayMarkerNames_clicked(self): self._model.set_display_marker_names(self._ui.displayMarkerNames_checkBox.isChecked()) + def _displayNodePoints_clicked(self): + self._model.set_display_node_points(self._ui.displayNodePoints_checkBox.isChecked()) + + def _displayNodeNumbers_clicked(self): + self._model.set_display_node_numbers(self._ui.displayNodeNumbers_checkBox.isChecked()) + + def _displayNodeGroupChanged(self, index): + if index == 0: + name = None + else: + name = self._ui.displayNodeGroup_comboBox.itemText(index) + self._model.set_display_node_group_name(name) + def _displayLineGeneral_clicked(self): self._model.set_display_line_general(self._ui.displayLineGeneral_checkBox.isChecked()) @@ -470,3 +520,8 @@ def _displayRadiusScale_entered(self): if radius_scale >= 0.0: self._model.set_radius_scale(radius_scale) self._refresh_radius_scale() + + def _display_theme_changed(self, index): + theme_name = self._ui.displayTheme_comboBox.itemText(index) + self._model.set_display_theme(theme_name) + self._set_display_theme_background() diff --git a/mapclientplugins/segmentationstitcherstep/view/ui_segmentationstitcherwidget.py b/mapclientplugins/segmentationstitcherstep/view/ui_segmentationstitcherwidget.py index 39cd1a4..704c444 100644 --- a/mapclientplugins/segmentationstitcherstep/view/ui_segmentationstitcherwidget.py +++ b/mapclientplugins/segmentationstitcherstep/view/ui_segmentationstitcherwidget.py @@ -3,7 +3,7 @@ ################################################################################ ## Form generated from reading UI file 'segmentationstitcherwidget.ui' ## -## Created by: Qt User Interface Compiler version 6.6.1 +## Created by: Qt User Interface Compiler version 6.8.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -28,7 +28,7 @@ def setupUi(self, SegmentationStitcherWidget): if not SegmentationStitcherWidget.objectName(): SegmentationStitcherWidget.setObjectName(u"SegmentationStitcherWidget") SegmentationStitcherWidget.resize(1137, 878) - sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) + sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(SegmentationStitcherWidget.sizePolicy().hasHeightForWidth()) @@ -42,11 +42,11 @@ def setupUi(self, SegmentationStitcherWidget): self.dockWidget.setObjectName(u"dockWidget") sizePolicy.setHeightForWidth(self.dockWidget.sizePolicy().hasHeightForWidth()) self.dockWidget.setSizePolicy(sizePolicy) - self.dockWidget.setFeatures(QDockWidget.DockWidgetFloatable|QDockWidget.DockWidgetMovable) - self.dockWidget.setAllowedAreas(Qt.AllDockWidgetAreas) + self.dockWidget.setFeatures(QDockWidget.DockWidgetFeature.DockWidgetFloatable|QDockWidget.DockWidgetFeature.DockWidgetMovable) + self.dockWidget.setAllowedAreas(Qt.DockWidgetArea.AllDockWidgetAreas) self.dockWidgetContents = QWidget() self.dockWidgetContents.setObjectName(u"dockWidgetContents") - sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) + sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) sizePolicy1.setHeightForWidth(self.dockWidgetContents.sizePolicy().hasHeightForWidth()) @@ -75,20 +75,20 @@ def setupUi(self, SegmentationStitcherWidget): self.stepedit_scrollArea.setObjectName(u"stepedit_scrollArea") sizePolicy.setHeightForWidth(self.stepedit_scrollArea.sizePolicy().hasHeightForWidth()) self.stepedit_scrollArea.setSizePolicy(sizePolicy) - self.stepedit_scrollArea.setFrameShape(QFrame.NoFrame) - self.stepedit_scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) + self.stepedit_scrollArea.setFrameShape(QFrame.Shape.NoFrame) + self.stepedit_scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded) self.stepedit_scrollArea.setWidgetResizable(True) self.stepedit_scrollAreaWidgetContents = QWidget() self.stepedit_scrollAreaWidgetContents.setObjectName(u"stepedit_scrollAreaWidgetContents") - self.stepedit_scrollAreaWidgetContents.setGeometry(QRect(0, -23, 343, 92)) + self.stepedit_scrollAreaWidgetContents.setGeometry(QRect(0, 0, 358, 94)) self.verticalLayout_3 = QVBoxLayout(self.stepedit_scrollAreaWidgetContents) self.verticalLayout_3.setSpacing(0) self.verticalLayout_3.setObjectName(u"verticalLayout_3") self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.segment_frame = QFrame(self.stepedit_scrollAreaWidgetContents) self.segment_frame.setObjectName(u"segment_frame") - self.segment_frame.setFrameShape(QFrame.StyledPanel) - self.segment_frame.setFrameShadow(QFrame.Raised) + self.segment_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.segment_frame.setFrameShadow(QFrame.Shadow.Raised) self.verticalLayout_5 = QVBoxLayout(self.segment_frame) self.verticalLayout_5.setObjectName(u"verticalLayout_5") self.verticalLayout_5.setContentsMargins(0, 0, 0, 0) @@ -96,7 +96,7 @@ def setupUi(self, SegmentationStitcherWidget): self.segmentTransformation_groupBox.setObjectName(u"segmentTransformation_groupBox") self.formLayout = QFormLayout(self.segmentTransformation_groupBox) self.formLayout.setObjectName(u"formLayout") - self.formLayout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) + self.formLayout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.AllNonFixedFieldsGrow) self.segmentRotation_label = QLabel(self.segmentTransformation_groupBox) self.segmentRotation_label.setObjectName(u"segmentRotation_label") @@ -138,15 +138,15 @@ def setupUi(self, SegmentationStitcherWidget): self.connectionsControls_frame.setObjectName(u"connectionsControls_frame") sizePolicy.setHeightForWidth(self.connectionsControls_frame.sizePolicy().hasHeightForWidth()) self.connectionsControls_frame.setSizePolicy(sizePolicy) - self.connectionsControls_frame.setFrameShape(QFrame.StyledPanel) - self.connectionsControls_frame.setFrameShadow(QFrame.Raised) + self.connectionsControls_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.connectionsControls_frame.setFrameShadow(QFrame.Shadow.Raised) self.horizontalLayout_11 = QHBoxLayout(self.connectionsControls_frame) self.horizontalLayout_11.setObjectName(u"horizontalLayout_11") self.horizontalLayout_11.setContentsMargins(0, 0, 0, 0) - self.conntectionsNew_pushButton = QPushButton(self.connectionsControls_frame) - self.conntectionsNew_pushButton.setObjectName(u"conntectionsNew_pushButton") + self.connectionsNew_pushButton = QPushButton(self.connectionsControls_frame) + self.connectionsNew_pushButton.setObjectName(u"connectionsNew_pushButton") - self.horizontalLayout_11.addWidget(self.conntectionsNew_pushButton) + self.horizontalLayout_11.addWidget(self.connectionsNew_pushButton) self.connectionsDelete_pushButton = QPushButton(self.connectionsControls_frame) self.connectionsDelete_pushButton.setObjectName(u"connectionsDelete_pushButton") @@ -171,7 +171,7 @@ def setupUi(self, SegmentationStitcherWidget): self.controls_tabWidget = QTabWidget(self.dockWidgetContents) self.controls_tabWidget.setObjectName(u"controls_tabWidget") - sizePolicy2 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) + sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) sizePolicy2.setHorizontalStretch(0) sizePolicy2.setVerticalStretch(0) sizePolicy2.setHeightForWidth(self.controls_tabWidget.sizePolicy().hasHeightForWidth()) @@ -182,8 +182,8 @@ def setupUi(self, SegmentationStitcherWidget): self.verticalLayout_7.setObjectName(u"verticalLayout_7") self.displayMisc_frame = QFrame(self.display_tab) self.displayMisc_frame.setObjectName(u"displayMisc_frame") - self.displayMisc_frame.setFrameShape(QFrame.StyledPanel) - self.displayMisc_frame.setFrameShadow(QFrame.Raised) + self.displayMisc_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.displayMisc_frame.setFrameShadow(QFrame.Shadow.Raised) self.horizontalLayout_8 = QHBoxLayout(self.displayMisc_frame) self.horizontalLayout_8.setObjectName(u"horizontalLayout_8") self.horizontalLayout_8.setContentsMargins(0, 0, 0, 0) @@ -192,8 +192,8 @@ def setupUi(self, SegmentationStitcherWidget): self.displayMarker_frame = QFrame(self.display_tab) self.displayMarker_frame.setObjectName(u"displayMarker_frame") - self.displayMarker_frame.setFrameShape(QFrame.StyledPanel) - self.displayMarker_frame.setFrameShadow(QFrame.Raised) + self.displayMarker_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.displayMarker_frame.setFrameShadow(QFrame.Shadow.Raised) self.gridLayout = QGridLayout(self.displayMarker_frame) self.gridLayout.setObjectName(u"gridLayout") self.gridLayout.setContentsMargins(0, 0, 0, 0) @@ -215,14 +215,44 @@ def setupUi(self, SegmentationStitcherWidget): self.verticalLayout_7.addWidget(self.displayMarker_frame) + self.displayNode_frame = QFrame(self.display_tab) + self.displayNode_frame.setObjectName(u"displayNode_frame") + self.displayNode_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.displayNode_frame.setFrameShadow(QFrame.Shadow.Raised) + self.horizontalLayout_12 = QHBoxLayout(self.displayNode_frame) + self.horizontalLayout_12.setObjectName(u"horizontalLayout_12") + self.horizontalLayout_12.setContentsMargins(0, 0, 0, 0) + self.displayNodePoints_checkBox = QCheckBox(self.displayNode_frame) + self.displayNodePoints_checkBox.setObjectName(u"displayNodePoints_checkBox") + + self.horizontalLayout_12.addWidget(self.displayNodePoints_checkBox) + + self.displayNodeNumbers_checkBox = QCheckBox(self.displayNode_frame) + self.displayNodeNumbers_checkBox.setObjectName(u"displayNodeNumbers_checkBox") + + self.horizontalLayout_12.addWidget(self.displayNodeNumbers_checkBox) + + self.displayNodeGroup_label = QLabel(self.displayNode_frame) + self.displayNodeGroup_label.setObjectName(u"displayNodeGroup_label") + + self.horizontalLayout_12.addWidget(self.displayNodeGroup_label) + + self.displayNodeGroup_comboBox = QComboBox(self.displayNode_frame) + self.displayNodeGroup_comboBox.setObjectName(u"displayNodeGroup_comboBox") + + self.horizontalLayout_12.addWidget(self.displayNodeGroup_comboBox) + + + self.verticalLayout_7.addWidget(self.displayNode_frame) + self.displayLineCategories_groupBox = QGroupBox(self.display_tab) self.displayLineCategories_groupBox.setObjectName(u"displayLineCategories_groupBox") self.verticalLayout_4 = QVBoxLayout(self.displayLineCategories_groupBox) self.verticalLayout_4.setObjectName(u"verticalLayout_4") self.displayLineGeneral_frame = QFrame(self.displayLineCategories_groupBox) self.displayLineGeneral_frame.setObjectName(u"displayLineGeneral_frame") - self.displayLineGeneral_frame.setFrameShape(QFrame.StyledPanel) - self.displayLineGeneral_frame.setFrameShadow(QFrame.Raised) + self.displayLineGeneral_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.displayLineGeneral_frame.setFrameShadow(QFrame.Shadow.Raised) self.horizontalLayout_9 = QHBoxLayout(self.displayLineGeneral_frame) self.horizontalLayout_9.setObjectName(u"horizontalLayout_9") self.horizontalLayout_9.setContentsMargins(0, 0, 0, 0) @@ -233,7 +263,7 @@ def setupUi(self, SegmentationStitcherWidget): self.displayLineGeneralRadius_checkBox = QCheckBox(self.displayLineGeneral_frame) self.displayLineGeneralRadius_checkBox.setObjectName(u"displayLineGeneralRadius_checkBox") - sizePolicy3 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) + sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) sizePolicy3.setHorizontalStretch(0) sizePolicy3.setVerticalStretch(0) sizePolicy3.setHeightForWidth(self.displayLineGeneralRadius_checkBox.sizePolicy().hasHeightForWidth()) @@ -251,8 +281,8 @@ def setupUi(self, SegmentationStitcherWidget): self.displayIndepNetworks_frame = QFrame(self.displayLineCategories_groupBox) self.displayIndepNetworks_frame.setObjectName(u"displayIndepNetworks_frame") - self.displayIndepNetworks_frame.setFrameShape(QFrame.StyledPanel) - self.displayIndepNetworks_frame.setFrameShadow(QFrame.Raised) + self.displayIndepNetworks_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.displayIndepNetworks_frame.setFrameShadow(QFrame.Shadow.Raised) self.horizontalLayout_10 = QHBoxLayout(self.displayIndepNetworks_frame) self.horizontalLayout_10.setObjectName(u"horizontalLayout_10") self.horizontalLayout_10.setContentsMargins(0, 0, 0, 0) @@ -276,8 +306,8 @@ def setupUi(self, SegmentationStitcherWidget): self.displayNetworkGroup1_frame = QFrame(self.displayLineCategories_groupBox) self.displayNetworkGroup1_frame.setObjectName(u"displayNetworkGroup1_frame") - self.displayNetworkGroup1_frame.setFrameShape(QFrame.StyledPanel) - self.displayNetworkGroup1_frame.setFrameShadow(QFrame.Raised) + self.displayNetworkGroup1_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.displayNetworkGroup1_frame.setFrameShadow(QFrame.Shadow.Raised) self.horizontalLayout_6 = QHBoxLayout(self.displayNetworkGroup1_frame) self.horizontalLayout_6.setObjectName(u"horizontalLayout_6") self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) @@ -303,8 +333,8 @@ def setupUi(self, SegmentationStitcherWidget): self.displayNetworkGroup2_frame = QFrame(self.displayLineCategories_groupBox) self.displayNetworkGroup2_frame.setObjectName(u"displayNetworkGroup2_frame") - self.displayNetworkGroup2_frame.setFrameShape(QFrame.StyledPanel) - self.displayNetworkGroup2_frame.setFrameShadow(QFrame.Raised) + self.displayNetworkGroup2_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.displayNetworkGroup2_frame.setFrameShadow(QFrame.Shadow.Raised) self.horizontalLayout_4 = QHBoxLayout(self.displayNetworkGroup2_frame) self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) @@ -362,8 +392,8 @@ def setupUi(self, SegmentationStitcherWidget): self.displayEndPoints_frame = QFrame(self.display_tab) self.displayEndPoints_frame.setObjectName(u"displayEndPoints_frame") - self.displayEndPoints_frame.setFrameShape(QFrame.StyledPanel) - self.displayEndPoints_frame.setFrameShadow(QFrame.Raised) + self.displayEndPoints_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.displayEndPoints_frame.setFrameShadow(QFrame.Shadow.Raised) self.horizontalLayout_5 = QHBoxLayout(self.displayEndPoints_frame) self.horizontalLayout_5.setObjectName(u"horizontalLayout_5") self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0) @@ -372,8 +402,8 @@ def setupUi(self, SegmentationStitcherWidget): self.displayScale_frame = QFrame(self.display_tab) self.displayScale_frame.setObjectName(u"displayScale_frame") - self.displayScale_frame.setFrameShape(QFrame.StyledPanel) - self.displayScale_frame.setFrameShadow(QFrame.Raised) + self.displayScale_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.displayScale_frame.setFrameShadow(QFrame.Shadow.Raised) self.horizontalLayout_3 = QHBoxLayout(self.displayScale_frame) self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) @@ -387,6 +417,29 @@ def setupUi(self, SegmentationStitcherWidget): self.horizontalLayout_3.addWidget(self.displayRadiusScale_lineEdit) + self.displayTheme_frame = QFrame(self.displayScale_frame) + self.displayTheme_frame.setObjectName(u"displayTheme_frame") + self.displayTheme_frame.setFrameShape(QFrame.Shape.NoFrame) + self.displayTheme_frame.setFrameShadow(QFrame.Shadow.Plain) + self.formLayout_4 = QFormLayout(self.displayTheme_frame) + self.formLayout_4.setObjectName(u"formLayout_4") + self.formLayout_4.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.FieldsStayAtSizeHint) + self.formLayout_4.setContentsMargins(0, 0, 0, 0) + self.displayTheme_label = QLabel(self.displayTheme_frame) + self.displayTheme_label.setObjectName(u"displayTheme_label") + + self.formLayout_4.setWidget(0, QFormLayout.LabelRole, self.displayTheme_label) + + self.displayTheme_comboBox = QComboBox(self.displayTheme_frame) + self.displayTheme_comboBox.addItem("") + self.displayTheme_comboBox.addItem("") + self.displayTheme_comboBox.setObjectName(u"displayTheme_comboBox") + + self.formLayout_4.setWidget(0, QFormLayout.FieldRole, self.displayTheme_comboBox) + + + self.horizontalLayout_3.addWidget(self.displayTheme_frame) + self.verticalLayout_7.addWidget(self.displayScale_frame) @@ -397,8 +450,8 @@ def setupUi(self, SegmentationStitcherWidget): self.verticalLayout_12.setObjectName(u"verticalLayout_12") self.annotations_group_frame = QFrame(self.annotations_tab) self.annotations_group_frame.setObjectName(u"annotations_group_frame") - self.annotations_group_frame.setFrameShape(QFrame.StyledPanel) - self.annotations_group_frame.setFrameShadow(QFrame.Raised) + self.annotations_group_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.annotations_group_frame.setFrameShadow(QFrame.Shadow.Raised) self.formLayout_2 = QFormLayout(self.annotations_group_frame) self.formLayout_2.setObjectName(u"formLayout_2") self.formLayout_2.setContentsMargins(0, 0, 0, 0) @@ -469,8 +522,8 @@ def setupUi(self, SegmentationStitcherWidget): self.bottom_frame = QFrame(self.dockWidgetContents) self.bottom_frame.setObjectName(u"bottom_frame") - self.bottom_frame.setFrameShape(QFrame.StyledPanel) - self.bottom_frame.setFrameShadow(QFrame.Raised) + self.bottom_frame.setFrameShape(QFrame.Shape.StyledPanel) + self.bottom_frame.setFrameShadow(QFrame.Shadow.Raised) self.horizontalLayout_2 = QHBoxLayout(self.bottom_frame) self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") self.horizontalLayout_2.setContentsMargins(3, 3, 3, 3) @@ -505,7 +558,7 @@ def setupUi(self, SegmentationStitcherWidget): self.alignmentsceneviewerwidget = AlignmentSceneviewerWidget(SegmentationStitcherWidget) self.alignmentsceneviewerwidget.setObjectName(u"alignmentsceneviewerwidget") - sizePolicy4 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) sizePolicy4.setHorizontalStretch(1) sizePolicy4.setVerticalStretch(1) sizePolicy4.setHeightForWidth(self.alignmentsceneviewerwidget.sizePolicy().hasHeightForWidth()) @@ -532,7 +585,7 @@ def retranslateUi(self, SegmentationStitcherWidget): self.segmentRotation_label.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Rotation:", None)) self.segmentTranslation_label.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Translation:", None)) self.connections_groupBox.setTitle(QCoreApplication.translate("SegmentationStitcherWidget", u"Connections:", None)) - self.conntectionsNew_pushButton.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"New...", None)) + self.connectionsNew_pushButton.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"New...", None)) self.connectionsDelete_pushButton.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Delete...", None)) #if QT_CONFIG(tooltip) self.connectionsOptimizeAlignment_pushButton.setToolTip(QCoreApplication.translate("SegmentationStitcherWidget", u"

Optimize transformation of the second segment in the selected connection to align its network end points with those of the first segment.

", None)) @@ -541,6 +594,9 @@ def retranslateUi(self, SegmentationStitcherWidget): self.displayMarkerNames_checkBox.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Marker names", None)) self.displayMarkerPoints_checkBox.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Marker points", None)) self.displayAxes_checkBox.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Axes", None)) + self.displayNodePoints_checkBox.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Node points", None)) + self.displayNodeNumbers_checkBox.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Node numbers", None)) + self.displayNodeGroup_label.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Node group:", None)) self.displayLineCategories_groupBox.setTitle(QCoreApplication.translate("SegmentationStitcherWidget", u"Line Segmentations:", None)) self.displayLineGeneral_checkBox.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"General ", None)) self.displayLineGeneralRadius_checkBox.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Radius", None)) @@ -560,6 +616,10 @@ def retranslateUi(self, SegmentationStitcherWidget): self.displayEndPointRadius_checkBox.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Radius", None)) self.displayEndPointTrans_checkBox.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Trans.", None)) self.displayRadiusScale_label.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Radius scale:", None)) + self.displayTheme_label.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Theme:", None)) + self.displayTheme_comboBox.setItemText(0, QCoreApplication.translate("SegmentationStitcherWidget", u"Dark", None)) + self.displayTheme_comboBox.setItemText(1, QCoreApplication.translate("SegmentationStitcherWidget", u"Light", None)) + self.controls_tabWidget.setTabText(self.controls_tabWidget.indexOf(self.display_tab), QCoreApplication.translate("SegmentationStitcherWidget", u"Display", None)) self.annotationName_label.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Name:", None)) self.annotationTerm_label.setText(QCoreApplication.translate("SegmentationStitcherWidget", u"Term:", None))