Skip to content

Commit e831747

Browse files
committed
fix: auto select sampler or decimator for line/point data
1 parent 9955147 commit e831747

File tree

2 files changed

+105
-16
lines changed

2 files changed

+105
-16
lines changed

loopstructural/gui/map2loop_tools/sampler_widget.py

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import os
44

55
from PyQt5.QtWidgets import QMessageBox, QWidget
6-
from qgis.core import QgsProject
6+
from qgis.core import QgsProject, QgsWkbTypes
77
from qgis.PyQt import uic
88

99
from 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

loopstructural/gui/map2loop_tools/sampler_widget.ui

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,53 +17,57 @@
1717
<item>
1818
<layout class="QFormLayout" name="formLayout">
1919
<item row="0" column="0">
20+
<widget class="QLabel" name="spatialDataLayerLabel">
21+
<property name="text">
22+
<string>Spatial Data Layer:</string>
23+
</property>
24+
</widget>
25+
</item>
26+
<item row="0" column="1">
27+
<widget class="QgsMapLayerComboBox" name="spatialDataLayerComboBox">
28+
<property name="allowEmptyLayer">
29+
<bool>false</bool>
30+
</property>
31+
</widget>
32+
</item>
33+
<item row="1" column="0">
2034
<widget class="QLabel" name="samplerTypeLabel">
2135
<property name="text">
2236
<string>Sampler Type:</string>
2337
</property>
2438
</widget>
2539
</item>
26-
<item row="0" column="1">
40+
<item row="1" column="1">
2741
<widget class="QComboBox" name="samplerTypeComboBox"/>
2842
</item>
29-
<item row="1" column="0">
43+
<item row="2" column="0">
3044
<widget class="QLabel" name="dtmLayerLabel">
3145
<property name="text">
3246
<string>DTM Layer:</string>
3347
</property>
3448
</widget>
3549
</item>
36-
<item row="1" column="1">
50+
<item row="2" column="1">
3751
<widget class="QgsMapLayerComboBox" name="dtmLayerComboBox">
3852
<property name="allowEmptyLayer">
3953
<bool>true</bool>
4054
</property>
4155
</widget>
4256
</item>
43-
<item row="2" column="0">
57+
<item row="3" column="0">
4458
<widget class="QLabel" name="geologyLayerLabel">
4559
<property name="text">
4660
<string>Geology Layer:</string>
4761
</property>
4862
</widget>
4963
</item>
50-
<item row="2" column="1">
64+
<item row="3" column="1">
5165
<widget class="QgsMapLayerComboBox" name="geologyLayerComboBox">
5266
<property name="allowEmptyLayer">
5367
<bool>true</bool>
5468
</property>
5569
</widget>
5670
</item>
57-
<item row="3" column="0">
58-
<widget class="QLabel" name="spatialDataLayerLabel">
59-
<property name="text">
60-
<string>Spatial Data Layer:</string>
61-
</property>
62-
</widget>
63-
</item>
64-
<item row="3" column="1">
65-
<widget class="QgsMapLayerComboBox" name="spatialDataLayerComboBox"/>
66-
</item>
6771
<item row="4" column="0">
6872
<widget class="QLabel" name="decimationLabel">
6973
<property name="text">

0 commit comments

Comments
 (0)