Skip to content

Commit 58c25ed

Browse files
committed
fix: update dem layer from project save
1 parent e917539 commit 58c25ed

2 files changed

Lines changed: 66 additions & 13 deletions

File tree

loopstructural/gui/modelling/model_definition/dem.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
import os
22

33
from PyQt5.QtWidgets import QWidget
4+
from qgis.core import QgsMapLayerProxyModel
45
from qgis.PyQt import uic
56
from qgis.PyQt.QtWidgets import QSizePolicy
6-
from qgis.core import QgsMapLayerProxyModel
7+
78

89
class DEMWidget(QWidget):
910
def __init__(self, parent=None, data_manager=None):
1011
self.data_manager = data_manager
1112
super().__init__(parent)
1213
ui_path = os.path.join(os.path.dirname(__file__), "dem.ui")
1314
uic.loadUi(ui_path, self)
14-
self.demLayerQgsMapLayerComboBox.setFilters(
15-
QgsMapLayerProxyModel.RasterLayer)
15+
self.demLayerQgsMapLayerComboBox.setFilters(QgsMapLayerProxyModel.RasterLayer)
1616
self.useDEMCheckBox.stateChanged.connect(self.onUseDEMClicked)
1717
self.elevationQgsDoubleSpinBox.valueChanged.connect(self.onElevationChanged)
1818
self.onElevationChanged()
19-
19+
self.data_manager.set_dem_callback(self.set_dem_layer)
20+
21+
def set_dem_layer(self, layer):
22+
"""Set the DEM layer in the combo box."""
23+
# if layer:
24+
# self.demLayerQgsMapLayerComboBox.setLayer(layer)
25+
pass
26+
2027
def onUseDEMClicked(self):
2128
if self.useDEMCheckBox.isChecked():
2229
self.demLayerQgsMapLayerComboBox.setEnabled(True)
@@ -38,11 +45,9 @@ def onDEMLayerChanged(self):
3845
else:
3946
self.data_manager.set_dem_layer(None)
4047
self.data_manager.set_use_dem(True)
41-
48+
4249
def onElevationChanged(self):
4350
"""Handle changes to the elevation value."""
4451
elevation = self.elevationQgsDoubleSpinBox.value()
4552
self.data_manager.set_elevation(elevation)
4653
self.data_manager.set_use_dem(False)
47-
48-

loopstructural/main/data_manager.py

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,12 @@ def set_stratigraphic_column_callback(self, callback):
136136
"""Set the callback for when the stratigraphic column is updated."""
137137
self.stratigraphic_column_callback = callback
138138

139+
def set_dem_callback(self, callback):
140+
"""Set the callback for when the DEM layer is updated."""
141+
self.dem_callback = callback
142+
if self.dem_layer:
143+
self.dem_callback(self.dem_layer)
144+
139145
def get_bounding_box(self):
140146
"""Get the current bounding box."""
141147
return self._bounding_box
@@ -155,12 +161,24 @@ def set_dem_layer(self, dem_layer):
155161
log_level=2,
156162
)
157163
else:
158-
self.dem_function = lambda x, y: (
159-
self.dem_layer.dataProvider().sample(QgsPointXY(x, y), 1)[0]
160-
if self.dem_layer
161-
else np.nan
162-
)
164+
165+
def dem_function(x, y):
166+
if not self.dem_layer.isValid():
167+
self.logger(
168+
message="DEM layer is not valid, using 0.0 for elevation.",
169+
log_level=2,
170+
)
171+
return 0.0
172+
return (
173+
self.dem_layer.dataProvider().sample(QgsPointXY(x, y), 1)[0]
174+
if self.dem_layer
175+
else np.nan
176+
)
177+
178+
self.dem_function = dem_function
163179
self._model_manager.set_dem_function(self.dem_function)
180+
if self.dem_callback:
181+
self.dem_callback(self.dem_layer)
164182

165183
def set_use_dem(self, use_dem):
166184
self.use_dem = use_dem
@@ -391,6 +409,8 @@ def to_dict(self):
391409
and structural_orientations['layer'] is not None
392410
):
393411
structural_orientations['layer'] = structural_orientations['layer'].name()
412+
if self.dem_layer is not None:
413+
dem_layer_name = self.dem_layer.name()
394414

395415
return {
396416
'bounding_box': self._bounding_box.to_dict(),
@@ -400,6 +420,9 @@ def to_dict(self):
400420
'stratigraphic_column': (
401421
self._stratigraphic_column.to_dict() if self._stratigraphic_column else None
402422
),
423+
'dem_layer': dem_layer_name if self.dem_layer else None,
424+
'use_dem': self.use_dem,
425+
'elevation': self.elevation,
403426
}
404427

405428
def from_dict(self, data):
@@ -413,7 +436,19 @@ def from_dict(self, data):
413436
zmin=data['bounding_box']['origin'][2],
414437
zmax=data['bounding_box']['maximum'][2],
415438
)
416-
439+
if 'dem_layer' in data and data['dem_layer'] is not None:
440+
dem_layer = QgsProject.instance().mapLayersByName(data['dem_layer'])
441+
if dem_layer:
442+
self.set_dem_layer(dem_layer[0])
443+
else:
444+
self.logger(
445+
message=f"DEM layer '{data['dem_layer']}' not found in project.",
446+
log_level=2,
447+
)
448+
if 'use_dem' in data:
449+
self.set_use_dem(data['use_dem'])
450+
if 'elevation' in data:
451+
self.set_elevation(data['elevation'])
417452
if 'basal_contacts' in data:
418453
self._basal_contacts = data['basal_contacts']
419454
if 'fault_traces' in data:
@@ -437,6 +472,19 @@ def update_from_dict(self, data):
437472
)
438473
else:
439474
self.set_bounding_box(**default_bounding_box)
475+
if 'dem_layer' in data and data['dem_layer'] is not None:
476+
dem_layer = QgsProject.instance().mapLayersByName(data['dem_layer'])
477+
if dem_layer:
478+
self.set_dem_layer(dem_layer[0])
479+
else:
480+
self.logger(
481+
message=f"DEM layer '{data['dem_layer']}' not found in project.",
482+
log_level=2,
483+
)
484+
if 'use_dem' in data:
485+
self.set_use_dem(data['use_dem'])
486+
if 'elevation' in data:
487+
self.set_elevation(data['elevation'])
440488
if (
441489
'basal_contacts' in data
442490
and data['basal_contacts'] is not None

0 commit comments

Comments
 (0)