33import os
44
55from PyQt5 .QtWidgets import QMessageBox , QWidget
6- from qgis .core import QgsProject
6+ from qgis .core import QgsProject , QgsWkbTypes
77from qgis .PyQt import uic
88
99from loopstructural .toolbelt .preferences import PlgOptionsManager
@@ -41,6 +41,10 @@ def __init__(self, parent=None, data_manager=None, debug_manager=None):
4141 # DTM should show raster layers, geology polygons
4242 self .dtmLayerComboBox .setFilters (QgsMapLayerProxyModel .RasterLayer )
4343 self .geologyLayerComboBox .setFilters (QgsMapLayerProxyModel .PolygonLayer )
44+ self .spatialDataLayerComboBox .setFilters (
45+ QgsMapLayerProxyModel .LineLayer | QgsMapLayerProxyModel .PointLayer
46+ )
47+
4448 # spatialData can be any type, leave default
4549 except Exception :
4650 # If QGIS isn't available, skip filter setup
@@ -53,9 +57,22 @@ def __init__(self, parent=None, data_manager=None, debug_manager=None):
5357 # Connect signals
5458 self .samplerTypeComboBox .currentIndexChanged .connect (self ._on_sampler_type_changed )
5559 self .runButton .clicked .connect (self ._run_sampler )
60+ # When user selects a spatial layer, automatically determine sampler type
61+ try :
62+ # Many QGIS widgets emit currentIndexChanged for layer changes
63+ self .spatialDataLayerComboBox .currentIndexChanged .connect (
64+ self ._on_spatial_layer_changed
65+ )
66+ except Exception :
67+ pass
5668
5769 # Initial state update
5870 self ._on_sampler_type_changed ()
71+ # Also ensure state reflects any preselected spatial layer
72+ try :
73+ self ._on_spatial_layer_changed ()
74+ except Exception :
75+ pass
5976
6077 def set_debug_manager (self , debug_manager ):
6178 """Attach a debug manager instance."""
@@ -129,6 +146,74 @@ def _on_sampler_type_changed(self):
129146 self .dtmLayerComboBox .setAllowEmptyLayer (True )
130147 self .geologyLayerComboBox .setAllowEmptyLayer (True )
131148
149+ def _set_invalid_spatial_type (self , message : str = None ):
150+ """Disable controls when an invalid spatial layer type is selected."""
151+ # Disable sampler selection and run to prevent usage with unsupported types
152+ try :
153+ self .samplerTypeComboBox .setEnabled (False )
154+ except Exception :
155+ pass
156+ try :
157+ self .runButton .setEnabled (False )
158+ except Exception :
159+ pass
160+ if message :
161+ QMessageBox .warning (self , "Invalid Spatial Data" , message )
162+
163+ def _on_spatial_layer_changed (self ):
164+ """Automatically set sampler type based on spatial data layer geometry.
165+
166+ - Point geometry -> Decimator
167+ - Other geometries -> disallowed
168+ """
169+ try :
170+ layer = self .spatialDataLayerComboBox .currentLayer ()
171+ except Exception :
172+ layer = None
173+
174+ if layer is None :
175+ return
176+
177+ # Determine geometry type; only vector layers expose geometryType
178+ try :
179+ if not hasattr (layer , 'geometryType' ):
180+ # Non-vector layer (raster, etc.) is not allowed
181+ self ._set_invalid_spatial_type ("Only point vector layers are allowed for sampling." )
182+ return
183+
184+ geom_type = layer .geometryType ()
185+ # QgsWkbTypes: PointGeometry = 0, LineGeometry = 1, PolygonGeometry = 2
186+ if geom_type == QgsWkbTypes .PointGeometry :
187+ # Use Decimator for point sets
188+ try :
189+ idx = self .sampler_types .index ("Decimator" )
190+ self .samplerTypeComboBox .setCurrentIndex (idx )
191+ except Exception as e :
192+ print (e )
193+ pass
194+ self .samplerTypeComboBox .setEnabled (False )
195+ self .runButton .setEnabled (True )
196+ elif geom_type == QgsWkbTypes .LineGeometry :
197+ # Line geometry is not allowed
198+ try :
199+ idx = self .sampler_types .index ("Spacing" )
200+ self .samplerTypeComboBox .setCurrentIndex (idx )
201+ except Exception as e :
202+ print (e )
203+ pass
204+ self .samplerTypeComboBox .setEnabled (False )
205+ self .runButton .setEnabled (False )
206+ else :
207+ # Line, polygon or other vector type -> disallowed
208+ self ._set_invalid_spatial_type ("Only point or line layers can be used" )
209+ return
210+ except Exception :
211+ # On any error, be conservative and disable run
212+ self ._set_invalid_spatial_type (
213+ "Selected layer type could not be determined. Only point vector layers are allowed."
214+ )
215+ return
216+
132217 def _run_sampler (self ):
133218 """Run the sampler algorithm using the map2loop API."""
134219
0 commit comments