From 7a95d32824db6ac469965a05f5f2b657995232c8 Mon Sep 17 00:00:00 2001 From: lachlangrose Date: Tue, 14 Oct 2025 08:41:39 +1100 Subject: [PATCH 1/3] fix: add colour to surfaces --- loopstructural/gui/visualisation/feature_list_widget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loopstructural/gui/visualisation/feature_list_widget.py b/loopstructural/gui/visualisation/feature_list_widget.py index d24ca37..1159eed 100644 --- a/loopstructural/gui/visualisation/feature_list_widget.py +++ b/loopstructural/gui/visualisation/feature_list_widget.py @@ -144,5 +144,5 @@ def add_stratigraphic_surfaces(self): return stratigraphic_surfaces = self.model_manager.model.get_stratigraphic_surfaces() for surface in stratigraphic_surfaces: - self.viewer.add_mesh_object(surface.vtk(), name=surface.name) + self.viewer.add_mesh_object(surface.vtk(), name=surface.name,color=surface.colour) print("Adding stratigraphic surfaces...") From 4d12ed26afee955122c2d631777b70822586298c Mon Sep 17 00:00:00 2001 From: lachlangrose Date: Tue, 14 Oct 2025 08:42:02 +1100 Subject: [PATCH 2/3] trying to add colour to unit stylesheets, not working --- .../stratigraphic_column.py | 6 +++- .../stratigraphic_unit.py | 28 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_column.py b/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_column.py index 2fc81d6..4e1607e 100644 --- a/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_column.py +++ b/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_column.py @@ -107,6 +107,7 @@ def add_unit(self, *, unit_data=None, create_new=True): for k in list(unit_data.keys()): if unit_data[k] is None: unit_data.pop(k) + print(f"Adding unit with data: {unit_data}") unit_widget = StratigraphicUnitWidget(**unit_data) unit_widget.deleteRequested.connect(self.delete_unit) # Connect delete signal unit_widget.nameChanged.connect( @@ -116,8 +117,11 @@ def add_unit(self, *, unit_data=None, create_new=True): unit_widget.thicknessChanged.connect( lambda: self.update_element(unit_widget) ) # Connect thickness change signal - + unit_widget.set_thickness(unit_data.get('thickness', 0.0)) # Set initial thickness + unit_widget.colourChanged.connect( + lambda: self.update_element(unit_widget) + ) # Connect colour change signal item = QListWidgetItem() item.setSizeHint(unit_widget.sizeHint()) self.unitList.addItem(item) diff --git a/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_unit.py b/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_unit.py index 7585b96..f60180f 100644 --- a/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_unit.py +++ b/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_unit.py @@ -1,4 +1,5 @@ import os +import numpy as np from typing import Optional from PyQt5 import uic @@ -24,13 +25,28 @@ def __init__( uic.loadUi(os.path.join(os.path.dirname(__file__), "stratigraphic_unit.ui"), self) self.uuid = uuid self._name = name if name is not None else "" - self.colour = colour if colour is not None else "" + # Convert colour from RGB tuple or string to Qt-compatible hex string + if colour is not None: + if (isinstance(colour, tuple) or isinstance(colour, list) or isinstance(colour, np.ndarray)) and len(colour) == 3: + # Convert (r, g, b) to "#RRGGBB" + if all(isinstance(c, float) and 0.0 <= c <= 1.0 for c in colour): + rgb = [int(c * 255) for c in colour] + else: + rgb = [int(c) for c in colour] + self.colour = "#{:02x}{:02x}{:02x}".format(*rgb ) + else: + self.colour = str(colour) + else: + self.colour = "" self.thickness = thickness # Optional thickness attribute + print("color is", self.colour) # Add delete button self.buttonDelete.clicked.connect(self.request_delete) self.lineEditName.editingFinished.connect(self.onNameChanged) self.spinBoxThickness.valueChanged.connect(self.onThicknessChanged) + self.setStyleSheet(f"background-color: {self.colour};" if self.colour else "") + print(self.styleSheet()) @property def name(self): return str(self._name) @@ -58,7 +74,9 @@ def onColourSelectClicked(self): color = QColorDialog.getColor() if color.isValid(): self.colour = color.name() - self.buttonColor.setStyleSheet(f"background-color: {self.colour};") + print("Selected colour:", self.colour) + self.setStyleSheet(f"background-color: {self.colour};") + self.colourChanged.emit(self.colour) def onThicknessChanged(self, thickness: float): """Handle changes to the thickness spinbox. @@ -84,6 +102,10 @@ def request_delete(self): self.deleteRequested.emit(self) + def mouseDoubleClickEvent(self, event): + """Handle double-click event to open color selection dialog.""" + self.onColourSelectClicked() + def validateFields(self): """Validate the widget fields and update UI hints.""" # Reset all styles first @@ -111,11 +133,13 @@ def setData(self, data: Optional[dict] = None): self.name = str(data.get("name", "")) self.colour = data.get("colour", "") self.lineEditName.setText(self.name) + self.setStyleSheet(f"background-color: {self.colour};" if self.colour else "") # self.lineEditColour.setText(self.colour) else: self.name = "" self.colour = "" self.lineEditName.clear() + self.setStyleSheet("") # self.lineEditColour.clear() self.validateFields() From 8d958b474464a53f23e405565801d672ea828f5c Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Tue, 14 Oct 2025 13:22:13 +1100 Subject: [PATCH 3/3] removing prints --- .../stratigraphic_column/stratigraphic_unit.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_unit.py b/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_unit.py index f60180f..c3125bd 100644 --- a/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_unit.py +++ b/loopstructural/gui/modelling/stratigraphic_column/stratigraphic_unit.py @@ -1,7 +1,7 @@ import os -import numpy as np from typing import Optional +import numpy as np from PyQt5 import uic from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QWidget @@ -27,26 +27,28 @@ def __init__( self._name = name if name is not None else "" # Convert colour from RGB tuple or string to Qt-compatible hex string if colour is not None: - if (isinstance(colour, tuple) or isinstance(colour, list) or isinstance(colour, np.ndarray)) and len(colour) == 3: + if ( + isinstance(colour, tuple) + or isinstance(colour, list) + or isinstance(colour, np.ndarray) + ) and len(colour) == 3: # Convert (r, g, b) to "#RRGGBB" if all(isinstance(c, float) and 0.0 <= c <= 1.0 for c in colour): rgb = [int(c * 255) for c in colour] else: rgb = [int(c) for c in colour] - self.colour = "#{:02x}{:02x}{:02x}".format(*rgb ) + self.colour = "#{:02x}{:02x}{:02x}".format(*rgb) else: self.colour = str(colour) else: self.colour = "" self.thickness = thickness # Optional thickness attribute - print("color is", self.colour) # Add delete button self.buttonDelete.clicked.connect(self.request_delete) self.lineEditName.editingFinished.connect(self.onNameChanged) self.spinBoxThickness.valueChanged.connect(self.onThicknessChanged) self.setStyleSheet(f"background-color: {self.colour};" if self.colour else "") - print(self.styleSheet()) @property def name(self): return str(self._name) @@ -74,7 +76,6 @@ def onColourSelectClicked(self): color = QColorDialog.getColor() if color.isValid(): self.colour = color.name() - print("Selected colour:", self.colour) self.setStyleSheet(f"background-color: {self.colour};") self.colourChanged.emit(self.colour)