Skip to content

Commit 271ca04

Browse files
Copilotlachlangrose
andcommitted
Persist selections in model setup
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
1 parent fef404a commit 271ca04

3 files changed

Lines changed: 200 additions & 0 deletions

File tree

‎loopstructural/gui/modelling/model_definition/dem.py‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from qgis.core import QgsMapLayerProxyModel
55
from qgis.PyQt import uic
66

7+
from ...main.helpers import ColumnMatcher, get_layer_names
8+
79

810
class DEMWidget(QWidget):
911
def __init__(self, parent=None, data_manager=None):
@@ -16,6 +18,8 @@ def __init__(self, parent=None, data_manager=None):
1618
self.elevationQgsDoubleSpinBox.valueChanged.connect(self.onElevationChanged)
1719
self.onElevationChanged()
1820
self.data_manager.set_dem_callback(self.set_dem_layer)
21+
self._guess_layer()
22+
self._restore_selection()
1923

2024
def set_dem_layer(self, layer):
2125
"""Set the DEM layer in the combo box."""
@@ -25,6 +29,7 @@ def set_dem_layer(self, layer):
2529
else:
2630
self.demLayerQgsMapLayerComboBox.setCurrentIndex(-1)
2731
self.useDEMCheckBox.setChecked(False)
32+
self._persist_selection()
2833

2934

3035
def onUseDEMClicked(self):
@@ -48,9 +53,50 @@ def onDEMLayerChanged(self):
4853
else:
4954
self.data_manager.set_dem_layer(None)
5055
self.data_manager.set_use_dem(True)
56+
self._persist_selection()
5157

5258
def onElevationChanged(self):
5359
"""Handle changes to the elevation value."""
5460
elevation = self.elevationQgsDoubleSpinBox.value()
5561
self.data_manager.set_elevation(elevation)
5662
self.data_manager.set_use_dem(False)
63+
64+
def _guess_layer(self):
65+
if not self.data_manager:
66+
return
67+
layer_names = get_layer_names(self.demLayerQgsMapLayerComboBox)
68+
matcher = ColumnMatcher(layer_names)
69+
match = matcher.find_match('DEM') or matcher.find_match('DTM')
70+
if match:
71+
layer = self.data_manager.find_layer_by_name(match)
72+
if layer:
73+
self.demLayerQgsMapLayerComboBox.setLayer(layer)
74+
75+
def _persist_selection(self):
76+
if not self.data_manager:
77+
return
78+
settings = {
79+
'dem_layer': (
80+
self.demLayerQgsMapLayerComboBox.currentLayer().name()
81+
if self.demLayerQgsMapLayerComboBox.currentLayer()
82+
else None
83+
),
84+
'use_dem': self.useDEMCheckBox.isChecked(),
85+
'elevation': self.elevationQgsDoubleSpinBox.value(),
86+
}
87+
self.data_manager.set_widget_settings('dem_widget', settings)
88+
89+
def _restore_selection(self):
90+
if not self.data_manager:
91+
return
92+
settings = self.data_manager.get_widget_settings('dem_widget', {})
93+
if not settings:
94+
return
95+
if layer_name := settings.get('dem_layer'):
96+
layer = self.data_manager.find_layer_by_name(layer_name)
97+
if layer:
98+
self.demLayerQgsMapLayerComboBox.setLayer(layer)
99+
if 'use_dem' in settings:
100+
self.useDEMCheckBox.setChecked(settings['use_dem'])
101+
if 'elevation' in settings:
102+
self.elevationQgsDoubleSpinBox.setValue(settings['elevation'])

‎loopstructural/gui/modelling/model_definition/fault_layers.py‎

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from qgis.core import QgsFieldProxyModel, QgsMapLayerProxyModel, QgsWkbTypes
55
from qgis.PyQt import uic
66

7+
from ...main.helpers import ColumnMatcher, get_layer_names
8+
79

810
class FaultLayersWidget(QWidget):
911
def __init__(self, parent=None, data_manager=None):
@@ -26,6 +28,8 @@ def __init__(self, parent=None, data_manager=None):
2628
self.useZCoordinateCheckBox.stateChanged.connect(self.onUseZCoordinateClicked)
2729
self.useZCoordinateCheckBox.stateChanged.connect(self.onFaultFieldChanged)
2830
self.useZCoordinate = False
31+
self._guess_layer_and_fields()
32+
self._restore_selection()
2933

3034
def enableZCheckbox(self, enable):
3135
"""Enable or disable the Z coordinate checkbox."""
@@ -80,6 +84,7 @@ def onFaultTraceLayerChanged(self, layer):
8084
fault_displacement_field=None,
8185
use_z_coordinate=self.useZCoordinate,
8286
)
87+
self._persist_selection()
8388

8489
def onFaultFieldChanged(self):
8590
self.data_manager.set_fault_trace_layer(
@@ -89,3 +94,60 @@ def onFaultFieldChanged(self):
8994
fault_displacement_field=self.faultDisplacementField.currentField(),
9095
use_z_coordinate=self.useZCoordinate,
9196
)
97+
self._persist_selection()
98+
99+
def _guess_layer_and_fields(self):
100+
if not self.data_manager:
101+
return
102+
layer_names = get_layer_names(self.faultTraceLayer)
103+
matcher = ColumnMatcher(layer_names)
104+
match = matcher.find_match('FAULT')
105+
if match:
106+
layer = self.data_manager.find_layer_by_name(match)
107+
if layer:
108+
self.faultTraceLayer.setLayer(layer)
109+
fields = [field.name() for field in layer.fields()]
110+
field_matcher = ColumnMatcher(fields)
111+
if name_match := field_matcher.find_match('FAULT_NAME') or field_matcher.find_match('NAME'):
112+
self.faultNameField.setField(name_match)
113+
if dip_match := field_matcher.find_match('DIP'):
114+
self.faultDipField.setField(dip_match)
115+
if disp_match := field_matcher.find_match('DISPLACEMENT') or field_matcher.find_match(
116+
'SLIP'
117+
):
118+
self.faultDisplacementField.setField(disp_match)
119+
120+
def _persist_selection(self):
121+
if not self.data_manager:
122+
return
123+
settings = {
124+
'fault_layer': (
125+
self.faultTraceLayer.currentLayer().name()
126+
if self.faultTraceLayer.currentLayer()
127+
else None
128+
),
129+
'fault_name_field': self.faultNameField.currentField(),
130+
'fault_dip_field': self.faultDipField.currentField(),
131+
'fault_displacement_field': self.faultDisplacementField.currentField(),
132+
'use_z': self.useZCoordinateCheckBox.isChecked(),
133+
}
134+
self.data_manager.set_widget_settings('fault_layers_widget', settings)
135+
136+
def _restore_selection(self):
137+
if not self.data_manager:
138+
return
139+
settings = self.data_manager.get_widget_settings('fault_layers_widget', {})
140+
if not settings:
141+
return
142+
if layer_name := settings.get('fault_layer'):
143+
layer = self.data_manager.find_layer_by_name(layer_name)
144+
if layer:
145+
self.faultTraceLayer.setLayer(layer)
146+
if field := settings.get('fault_name_field'):
147+
self.faultNameField.setField(field)
148+
if field := settings.get('fault_dip_field'):
149+
self.faultDipField.setField(field)
150+
if field := settings.get('fault_displacement_field'):
151+
self.faultDisplacementField.setField(field)
152+
if 'use_z' in settings:
153+
self.useZCoordinateCheckBox.setChecked(settings['use_z'])

‎loopstructural/gui/modelling/model_definition/stratigraphic_layers.py‎

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from qgis.core import QgsMapLayerProxyModel, QgsWkbTypes
66
from qgis.PyQt import uic
77

8+
from ...main.helpers import ColumnMatcher, get_layer_names
9+
810

911
class StratigraphicLayersWidget(QWidget):
1012
def __init__(self, parent=None, data_manager=None):
@@ -50,6 +52,8 @@ def __init__(self, parent=None, data_manager=None):
5052
self.useStructuralPointsZCoordinatesCheckBox.stateChanged.connect(
5153
self.onStructuralDataFieldChanged
5254
)
55+
self._guess_layers_and_fields()
56+
self._restore_selection()
5357

5458
def enableBasalContactsZCheckBox(self, enable):
5559
self.useBasalContactsZCoordinatesCheckBox.setEnabled(enable)
@@ -116,6 +120,7 @@ def set_orientations_layer(
116120
def onBasalContactsChanged(self, layer):
117121
self.unitNameField.setLayer(layer)
118122
self.data_manager.set_basal_contacts(layer, self.unitNameField.currentField())
123+
self._persist_selection()
119124

120125
def onOrientationTypeChanged(self, index):
121126
if index == 0:
@@ -153,6 +158,7 @@ def onStructuralDataFieldChanged(self, field):
153158
self.orientationType.currentText(),
154159
use_z_coordinate=self.structural_points_use_z,
155160
)
161+
self._persist_selection()
156162
# self.updateDataManager()
157163

158164
def onUnitFieldChanged(self, field):
@@ -161,5 +167,91 @@ def onUnitFieldChanged(self, field):
161167
field,
162168
use_z_coordinate=self.basal_contacts_use_z,
163169
)
170+
self._persist_selection()
164171

165172
# self.updateDataManager()
173+
174+
def _guess_layers_and_fields(self):
175+
if not self.data_manager:
176+
return
177+
# Basal contacts
178+
basal_names = get_layer_names(self.basalContactsLayer)
179+
basal_matcher = ColumnMatcher(basal_names)
180+
basal_match = basal_matcher.find_match('BASAL_CONTACTS')
181+
if basal_match:
182+
layer = self.data_manager.find_layer_by_name(basal_match)
183+
if layer:
184+
self.basalContactsLayer.setLayer(layer)
185+
fields = [f.name() for f in layer.fields()]
186+
fmatcher = ColumnMatcher(fields)
187+
if unit_match := fmatcher.find_match('UNITNAME'):
188+
self.unitNameField.setField(unit_match)
189+
# Structural data
190+
structural_names = get_layer_names(self.structuralDataLayer)
191+
structural_matcher = ColumnMatcher(structural_names)
192+
structural_match = structural_matcher.find_match('STRUCTURE') or structural_matcher.find_match(
193+
'ORIENTATION'
194+
)
195+
if structural_match:
196+
layer = self.data_manager.find_layer_by_name(structural_match)
197+
if layer:
198+
self.structuralDataLayer.setLayer(layer)
199+
fields = [f.name() for f in layer.fields()]
200+
fmatcher = ColumnMatcher(fields)
201+
if strike_match := fmatcher.find_match('STRIKE') or fmatcher.find_match('DIPDIR'):
202+
self.orientationField.setField(strike_match)
203+
if dip_match := fmatcher.find_match('DIP'):
204+
self.dipField.setField(dip_match)
205+
if unit_match := fmatcher.find_match('UNITNAME'):
206+
self.structuralDataUnitName.setField(unit_match)
207+
208+
def _persist_selection(self):
209+
if not self.data_manager:
210+
return
211+
settings = {
212+
'basal_layer': self.basalContactsLayer.currentLayer().name()
213+
if self.basalContactsLayer.currentLayer()
214+
else None,
215+
'structural_layer': self.structuralDataLayer.currentLayer().name()
216+
if self.structuralDataLayer.currentLayer()
217+
else None,
218+
'unit_name_field': self.unitNameField.currentField(),
219+
'orientation_field': self.orientationField.currentField(),
220+
'dip_field': self.dipField.currentField(),
221+
'structural_unit_field': self.structuralDataUnitName.currentField(),
222+
'orientation_type': self.orientationType.currentText(),
223+
'use_basal_z': self.useBasalContactsZCoordinatesCheckBox.isChecked(),
224+
'use_structural_z': self.useStructuralPointsZCoordinatesCheckBox.isChecked(),
225+
}
226+
self.data_manager.set_widget_settings('stratigraphic_layers_widget', settings)
227+
228+
def _restore_selection(self):
229+
if not self.data_manager:
230+
return
231+
settings = self.data_manager.get_widget_settings('stratigraphic_layers_widget', {})
232+
if not settings:
233+
return
234+
if layer_name := settings.get('basal_layer'):
235+
layer = self.data_manager.find_layer_by_name(layer_name)
236+
if layer:
237+
self.basalContactsLayer.setLayer(layer)
238+
if layer_name := settings.get('structural_layer'):
239+
layer = self.data_manager.find_layer_by_name(layer_name)
240+
if layer:
241+
self.structuralDataLayer.setLayer(layer)
242+
if field := settings.get('unit_name_field'):
243+
self.unitNameField.setField(field)
244+
if field := settings.get('orientation_field'):
245+
self.orientationField.setField(field)
246+
if field := settings.get('dip_field'):
247+
self.dipField.setField(field)
248+
if field := settings.get('structural_unit_field'):
249+
self.structuralDataUnitName.setField(field)
250+
if 'orientation_type' in settings:
251+
idx = self.orientationType.findText(settings['orientation_type'], Qt.MatchFixedString)
252+
if idx >= 0:
253+
self.orientationType.setCurrentIndex(idx)
254+
if 'use_basal_z' in settings:
255+
self.useBasalContactsZCoordinatesCheckBox.setChecked(settings['use_basal_z'])
256+
if 'use_structural_z' in settings:
257+
self.useStructuralPointsZCoordinatesCheckBox.setChecked(settings['use_structural_z'])

0 commit comments

Comments
 (0)