Skip to content

Commit cea7d79

Browse files
committed
fix: allow z coordinate from shapefile to be used for elevation
1 parent 604ca00 commit cea7d79

6 files changed

Lines changed: 342 additions & 226 deletions

File tree

loopstructural/gui/modelling/model_definition/fault_layers.py

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

33
from PyQt5.QtWidgets import QWidget
4-
from qgis.core import QgsFieldProxyModel, QgsMapLayerProxyModel
4+
from qgis.core import QgsFieldProxyModel, QgsMapLayerProxyModel, QgsWkbTypes
55
from qgis.PyQt import uic
66

77

@@ -24,6 +24,19 @@ def __init__(self, parent=None, data_manager=None):
2424
self.faultDipField.fieldChanged.connect(self.onFaultFieldChanged)
2525
self.faultDisplacementField.fieldChanged.connect(self.onFaultFieldChanged)
2626
self.data_manager.set_fault_trace_layer_callback(self.set_fault_trace_layer)
27+
self.useZCoordinateCheckBox.stateChanged.connect(self.onUseZCoordinateClicked)
28+
self.useZCoordinateCheckBox.stateChanged.connect(self.onFaultFieldChanged)
29+
self.useZCoordinate = False
30+
def enableZCheckbox(self, enable):
31+
"""Enable or disable the Z coordinate checkbox."""
32+
self.useZCoordinateCheckBox.setEnabled(enable)
33+
if enable:
34+
self.useZCoordinateCheckBox.setChecked(self.useZCoordinate)
35+
else:
36+
self.useZCoordinateCheckBox.setChecked(False)
37+
def onUseZCoordinateClicked(self):
38+
"""Handle changes to the Z coordinate checkbox."""
39+
self.useZCoordinate = self.useZCoordinateCheckBox.isChecked()
2740
def set_fault_trace_layer(self, layer, fault_name_field=None, fault_dip_field=None, fault_displacement_field=None):
2841
self.faultTraceLayer.setLayer(layer)
2942
if fault_name_field:
@@ -36,11 +49,17 @@ def onFaultTraceLayerChanged(self, layer):
3649
self.faultNameField.setLayer(layer)
3750
self.faultDipField.setLayer(layer)
3851
self.faultDisplacementField.setLayer(layer)
39-
52+
if layer is not None and layer.isValid():
53+
if layer.wkbType() != QgsWkbTypes.Unknown:
54+
55+
has_z = QgsWkbTypes.hasZ(layer.wkbType())
56+
print(f"Layer {layer.name()} has Z coordinate: {has_z}")
57+
self.enableZCheckbox(has_z)
4058
def onFaultFieldChanged(self):
4159
self.data_manager.set_fault_trace_layer(
4260
self.faultTraceLayer.currentLayer(),
4361
fault_name_field = self.faultNameField.currentField(),
4462
fault_dip_field = self.faultDipField.currentField(),
4563
fault_displacement_field = self.faultDisplacementField.currentField(),
64+
use_z_coordinate=self.useZCoordinate
4665
)

loopstructural/gui/modelling/model_definition/fault_layers.ui

Lines changed: 77 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -15,76 +15,83 @@
1515
</property>
1616
<layout class="QVBoxLayout" name="verticalLayout">
1717
<item>
18-
<widget class="QWidget" name="formLayoutWidget_3">
19-
<property name="geometry">
20-
<rect>
21-
<x>10</x>
22-
<y>10</y>
23-
<width>730</width>
24-
<height>181</height>
25-
</rect>
26-
</property>
27-
<layout class="QFormLayout" name="formLayout_4">
28-
<item row="0" column="0">
29-
<widget class="QLabel" name="faultTracesLabel">
30-
<property name="text">
31-
<string>Fault Traces</string>
32-
</property>
33-
</widget>
34-
</item>
35-
<item row="0" column="1">
36-
<widget class="QgsMapLayerComboBox" name="faultTraceLayer"/>
37-
</item>
38-
<item row="1" column="0">
39-
<widget class="QLabel" name="label_3">
40-
<property name="text">
41-
<string>Fault Name</string>
42-
</property>
43-
</widget>
44-
</item>
45-
<item row="1" column="1">
46-
<widget class="QgsFieldComboBox" name="faultNameField"/>
47-
</item>
48-
<item row="2" column="0">
49-
<widget class="QLabel" name="label_4">
50-
<property name="text">
51-
<string>Dip</string>
52-
</property>
53-
</widget>
54-
</item>
55-
<item row="2" column="1">
56-
<widget class="QgsFieldComboBox" name="faultDipField">
57-
<property name="allowEmptyFieldName">
58-
<bool>true</bool>
59-
</property>
60-
</widget>
61-
</item>
62-
<item row="3" column="0">
63-
<widget class="QLabel" name="label_5">
64-
<property name="text">
65-
<string>Displacement</string>
66-
</property>
67-
</widget>
68-
</item>
69-
<item row="3" column="1">
70-
<widget class="QgsFieldComboBox" name="faultDisplacementField">
71-
<property name="allowEmptyFieldName">
72-
<bool>true</bool>
73-
</property>
74-
</widget>
75-
</item>
76-
<item row="4" column="0">
77-
<widget class="QLabel" name="label_29">
78-
<property name="text">
79-
<string>Pitch</string>
80-
</property>
81-
</widget>
82-
</item>
83-
<item row="4" column="1">
84-
<widget class="QgsFieldComboBox" name="faultPitchField"/>
85-
</item>
86-
</layout>
87-
</widget>
18+
<layout class="QFormLayout" name="formLayout_4">
19+
<item row="0" column="0">
20+
<widget class="QLabel" name="faultTracesLabel">
21+
<property name="text">
22+
<string>Fault Traces</string>
23+
</property>
24+
</widget>
25+
</item>
26+
<item row="0" column="1">
27+
<widget class="QgsMapLayerComboBox" name="faultTraceLayer"/>
28+
</item>
29+
<item row="2" column="0">
30+
<widget class="QLabel" name="label_3">
31+
<property name="text">
32+
<string>Fault Name</string>
33+
</property>
34+
</widget>
35+
</item>
36+
<item row="2" column="1">
37+
<widget class="QgsFieldComboBox" name="faultNameField"/>
38+
</item>
39+
<item row="3" column="0">
40+
<widget class="QLabel" name="label_4">
41+
<property name="text">
42+
<string>Dip</string>
43+
</property>
44+
</widget>
45+
</item>
46+
<item row="3" column="1">
47+
<widget class="QgsFieldComboBox" name="faultDipField">
48+
<property name="allowEmptyFieldName">
49+
<bool>true</bool>
50+
</property>
51+
</widget>
52+
</item>
53+
<item row="4" column="0">
54+
<widget class="QLabel" name="label_5">
55+
<property name="text">
56+
<string>Displacement</string>
57+
</property>
58+
</widget>
59+
</item>
60+
<item row="4" column="1">
61+
<widget class="QgsFieldComboBox" name="faultDisplacementField">
62+
<property name="allowEmptyFieldName">
63+
<bool>true</bool>
64+
</property>
65+
</widget>
66+
</item>
67+
<item row="5" column="0">
68+
<widget class="QLabel" name="label_29">
69+
<property name="text">
70+
<string>Pitch</string>
71+
</property>
72+
</widget>
73+
</item>
74+
<item row="5" column="1">
75+
<widget class="QgsFieldComboBox" name="faultPitchField"/>
76+
</item>
77+
<item row="1" column="0">
78+
<widget class="QLabel" name="useZCoordinateLabel">
79+
<property name="text">
80+
<string>Use Z coordinate</string>
81+
</property>
82+
</widget>
83+
</item>
84+
<item row="1" column="1">
85+
<widget class="QCheckBox" name="useZCoordinateCheckBox">
86+
<property name="enabled">
87+
<bool>false</bool>
88+
</property>
89+
<property name="toolTip">
90+
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use the Z coordinate from the layer if available. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
91+
</property>
92+
</widget>
93+
</item>
94+
</layout>
8895
</item>
8996
</layout>
9097
</widget>

loopstructural/gui/modelling/model_definition/stratigraphic_layers.py

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

33
from PyQt5.QtWidgets import QWidget
4-
from qgis.core import QgsMapLayerProxyModel
4+
from qgis.core import QgsMapLayerProxyModel, QgsWkbTypes
55
from qgis.PyQt import uic
66
from PyQt5.QtCore import Qt
77

@@ -30,12 +30,49 @@ def __init__(self, parent=None, data_manager=None):
3030
self.orientationType.currentIndexChanged.connect(self.onOrientationTypeChanged)
3131
self.data_manager.set_basal_contacts_callback(self.set_basal_contacts)
3232
self.data_manager.set_structural_orientations_callback(self.set_orientations_layer)
33+
self.basal_contacts_use_z = False
34+
self.structural_points_use_z = False
35+
self.useBasalContactsZCoordinatesCheckBox.stateChanged.connect(lambda : self.enableBasalContactsZCheckBox(self.useBasalContactsZCoordinatesCheckBox.isChecked()))
36+
self.useBasalContactsZCoordinatesCheckBox.stateChanged.connect(self.onStructuralDataFieldChanged)
37+
self.useStructuralPointsZCoordinatesCheckBox.stateChanged.connect(lambda : self.enableStructuralPointsZCheckBox(self.useStructuralPointsZCoordinatesCheckBox.isChecked()))
38+
self.useStructuralPointsZCoordinatesCheckBox.stateChanged.connect(self.onStructuralDataFieldChanged)
39+
40+
def enableBasalContactsZCheckBox(self, enable):
41+
self.useBasalContactsZCoordinatesCheckBox.setEnabled(enable)
42+
if enable:
43+
self.useBasalContactsZCoordinatesCheckBox.setChecked(self.basal_contacts_use_z)
44+
else:
45+
self.useBasalContactsZCoordinatesCheckBox.setChecked(False)
46+
def enableStructuralPointsZCheckBox(self, enable):
47+
self.useStructuralPointsZCoordinatesCheckBox.setEnabled(enable)
48+
if enable:
49+
self.useStructuralPointsZCoordinatesCheckBox.setChecked(self.structural_points_use_z)
50+
else:
51+
self.useStructuralPointsZCoordinatesCheckBox.setChecked(False)
3352
def set_basal_contacts(self, layer, unitname_field=None):
3453
self.basalContactsLayer.setLayer(layer)
54+
if layer is not None and layer.isValid():
55+
if layer.wkbType() != QgsWkbTypes.Unknown:
56+
has_z = QgsWkbTypes.hasZ(layer.wkbType())
57+
self.data_manager.logger(message=f"Layer {layer.name()} has Z coordinate: {has_z}",log_level=2)
58+
self.enableBasalContactsZCheckBox(has_z)
59+
else:
60+
self.data_manager.logger(message="Unknown geometry type.",log_level=2)
61+
else:
62+
self.enableBasalContactsZCheckBox(False)
3563
if unitname_field:
3664
self.unitNameField.setField(unitname_field)
3765
def set_orientations_layer(self, layer, strike_field=None, dip_field=None, unitname_field=None, orientation_type=None):
3866
self.structuralDataLayer.setLayer(layer)
67+
if layer is not None and layer.isValid():
68+
if layer.wkbType() != QgsWkbTypes.Unknown:
69+
has_z = QgsWkbTypes.hasZ(layer.wkbType())
70+
self.data_manager.logger(message=f"Layer {layer.name()} has Z coordinate: {has_z}",level=2)
71+
self.enableStructuralPointsZCheckBox(has_z)
72+
else:
73+
self.data_manager.logger(message="Unknown geometry type.",level=2)
74+
else:
75+
self.enableStructuralPointsZCheckBox(False)
3976
if strike_field:
4077
self.orientationField.setField(strike_field)
4178
if dip_field:
@@ -64,17 +101,19 @@ def onStructuralDataLayerChanged(self, layer):
64101
self.orientationField.currentField(),
65102
self.dipField.currentField(),
66103
self.structuralDataUnitName.currentField(),
104+
use_z_coordinate=self.structural_points_use_z,
67105
)
68106
def onStructuralDataFieldChanged(self, field):
69107
self.data_manager.set_structural_orientations(
70108
self.structuralDataLayer.currentLayer(),
71109
self.orientationField.currentField(),
72110
self.dipField.currentField(),
73111
self.structuralDataUnitName.currentField(),
74-
self.orientationType.currentText()
112+
self.orientationType.currentText(),
113+
use_z_coordinate=self.structural_points_use_z
75114
)
76115
# self.updateDataManager()
77116
def onUnitFieldChanged(self, field):
78-
self.data_manager.set_basal_contacts(self.basalContactsLayer.currentLayer(), field)
117+
self.data_manager.set_basal_contacts(self.basalContactsLayer.currentLayer(), field, use_z_coordinate=self.basal_contacts_use_z)
79118

80119
# self.updateDataManager()

0 commit comments

Comments
 (0)