@@ -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