Skip to content

Commit ca5dc6f

Browse files
Mtk112LKajan
authored andcommitted
Disconnect featureAdded signal. Move code from plugin to new_plan.
Disconnect featureAdded signal. Fixes commit errors. Moved code from plugin.py to new_plan.py
1 parent 6a012d9 commit ca5dc6f

File tree

4 files changed

+70
-57
lines changed

4 files changed

+70
-57
lines changed
+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from qgis.core import QgsProject, QgsVectorLayer
2+
from qgis.utils import iface
3+
4+
from arho_feature_template.core.update_plan import LandUsePlan, update_selected_plan
5+
6+
7+
class NewPlan:
8+
def add_new_plan(self):
9+
# Filtered layers are not editable, so clear filters first.
10+
self.clear_all_filters()
11+
12+
layers = QgsProject.instance().mapLayersByName("Kaava")
13+
if not layers:
14+
iface.messageBar().pushMessage("Error", "Layer 'Kaava' not found", level=3)
15+
return
16+
17+
kaava_layer = layers[0]
18+
19+
if not kaava_layer.isEditable():
20+
kaava_layer.startEditing()
21+
22+
iface.setActiveLayer(kaava_layer)
23+
24+
iface.actionAddFeature().trigger()
25+
26+
# Connect the featureAdded signal
27+
kaava_layer.featureAdded.connect(self.feature_added)
28+
29+
30+
def feature_added(self):
31+
kaava_layer = iface.activeLayer()
32+
kaava_layer.featureAdded.disconnect()
33+
feature_ids_before_commit = kaava_layer.allFeatureIds()
34+
if kaava_layer.isEditable():
35+
if not kaava_layer.commitChanges():
36+
iface.messageBar().pushMessage("Error", "Failed to commit changes to the layer.", level=3)
37+
return
38+
else:
39+
iface.messageBar().pushMessage("Error", "Layer is not editable.", level=3)
40+
return
41+
42+
feature_ids_after_commit = kaava_layer.allFeatureIds()
43+
44+
# Find the new plan.id by comparing fids before and after commit.
45+
new_feature_id = next((fid for fid in feature_ids_after_commit if fid not in feature_ids_before_commit), None)
46+
47+
if new_feature_id is not None:
48+
new_feature = kaava_layer.getFeature(new_feature_id)
49+
50+
if new_feature.isValid():
51+
feature_id_value = new_feature["id"]
52+
update_selected_plan(LandUsePlan(feature_id_value))
53+
else:
54+
iface.messageBar().pushMessage("Error", "Invalid feature retrieved.", level=3)
55+
else:
56+
iface.messageBar().pushMessage("Error", "No new feature was added.", level=3)
57+
58+
def clear_all_filters(self):
59+
"""Clear filters for all vector layers in the project."""
60+
layers = QgsProject.instance().mapLayers().values()
61+
62+
for layer in layers:
63+
if isinstance(layer, QgsVectorLayer):
64+
layer.setSubsetString("")

arho_feature_template/core/update_plan.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ def set_filter_for_vector_layer(layer_name: str, field_name: str, field_value: s
3939

4040
layer = layers[0]
4141

42-
# Create the filter expression directly based on the plan_id
43-
expression = f"\"{field_name}\" = '{field_value}'" # Properly formatted filter expression
42+
expression = f"\"{field_name}\" = '{field_value}'"
4443

4544
# Apply the filter to the layer
4645
if not layer.setSubsetString(expression):

arho_feature_template/plugin.py

+3-55
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
import os
44
from typing import TYPE_CHECKING, Callable, cast
55

6-
from qgis.core import QgsProject, QgsVectorLayer
76
from qgis.PyQt.QtCore import QCoreApplication, Qt, QTranslator
87
from qgis.PyQt.QtGui import QIcon
98
from qgis.PyQt.QtWidgets import QAction, QWidget
109
from qgis.utils import iface
1110

1211
from arho_feature_template.core.feature_template_library import FeatureTemplater, TemplateGeometryDigitizeMapTool
13-
from arho_feature_template.core.update_plan import LandUsePlan, update_selected_plan
12+
from arho_feature_template.core.new_plan import NewPlan
1413
from arho_feature_template.qgis_plugin_tools.tools.custom_logging import setup_logger, teardown_logger
1514
from arho_feature_template.qgis_plugin_tools.tools.i18n import setup_translation
1615
from arho_feature_template.qgis_plugin_tools.tools.resources import plugin_name
@@ -125,6 +124,7 @@ def add_action(
125124

126125
def initGui(self) -> None: # noqa N802
127126
self.templater = FeatureTemplater()
127+
self.new_plan = NewPlan()
128128

129129
plan_icon_path = os.path.join(PLUGIN_PATH, "resources/icons/city.png") # A placeholder icon
130130
load_icon_path = os.path.join(PLUGIN_PATH, "resources/icons/folder.png") # A placeholder icon
@@ -165,60 +165,8 @@ def on_map_tool_changed(self, new_tool: QgsMapTool, old_tool: QgsMapTool) -> Non
165165
if not isinstance(new_tool, TemplateGeometryDigitizeMapTool):
166166
self.template_dock_action.setChecked(False)
167167

168-
def clear_all_filters(self):
169-
"""Clear filters for all vector layers in the project."""
170-
layers = QgsProject.instance().mapLayers().values()
171-
172-
for layer in layers:
173-
if isinstance(layer, QgsVectorLayer):
174-
layer.setSubsetString("")
175-
176168
def digitize_new_plan(self):
177-
# Filtered layers are not editable, so clear filters first.
178-
self.clear_all_filters()
179-
# Find and set the "Kaava" layer
180-
layers = QgsProject.instance().mapLayersByName("Kaava")
181-
if not layers:
182-
iface.messageBar().pushMessage("Error", "Layer 'Kaava' not found", level=3)
183-
return
184-
185-
kaava_layer = layers[0]
186-
187-
if not kaava_layer.isEditable():
188-
kaava_layer.startEditing()
189-
190-
iface.setActiveLayer(kaava_layer)
191-
192-
iface.actionAddFeature().trigger()
193-
kaava_layer.featureAdded.connect(self.feature_added)
194-
195-
def feature_added(self):
196-
kaava_layer = iface.activeLayer()
197-
feature_ids_before_commit = kaava_layer.allFeatureIds()
198-
if kaava_layer.isEditable():
199-
if not kaava_layer.commitChanges():
200-
iface.messageBar().pushMessage("Error", "Failed to commit changes to the layer.", level=3)
201-
return
202-
else:
203-
iface.messageBar().pushMessage("Error", "Layer is not editable.", level=3)
204-
return
205-
feature_ids_after_commit = kaava_layer.allFeatureIds()
206-
207-
# Finds the feature id that was committed by comparing ids before commit to features after commit.
208-
new_feature_id = next((fid for fid in feature_ids_after_commit if fid not in feature_ids_before_commit), None)
209-
if new_feature_id is not None:
210-
new_feature = kaava_layer.getFeature(new_feature_id)
211-
212-
if new_feature.isValid():
213-
feature_id_value = new_feature["id"] # UUID of the new feature
214-
iface.messageBar().pushMessage("Info", f"Feature 'id' field value: {feature_id_value}", level=0)
215-
216-
# plan = LandUsePlan(feature_id_value)
217-
update_selected_plan(LandUsePlan(feature_id_value))
218-
else:
219-
iface.messageBar().pushMessage("Error", "Invalid feature retrieved.", level=3)
220-
else:
221-
iface.messageBar().pushMessage("Error", "No new feature was added.", level=3)
169+
self.new_plan.add_new_plan()
222170

223171
def load_existing_land_use_plan(self) -> None:
224172
"""Open existing land use plan."""

arho_feature_template/resources/template_libraries/asemakaava-sample.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ templates:
77
description: Kaavakohde ilman kikkareita
88
feature:
99
layer: land_use_area
10+
# layer: Aluevaraus
1011
attributes:
1112
- attribute: name
1213
- attribute: type_of_underground_id
@@ -15,6 +16,7 @@ templates:
1516
description: Aluella kuvataan ...
1617
feature:
1718
layer: land_use_area
19+
# layer: Aluevaraus
1820
attributes:
1921
- attribute: name
2022
- attribute: type_of_underground_id

0 commit comments

Comments
 (0)