Skip to content

Commit 0a86854

Browse files
committed
FIlter layers after new plan is committed.
After committing new plan feature, filter layers based on the id of the new plan. The id is retrieved by comparing ids before and after commit.
1 parent d96d94d commit 0a86854

File tree

3 files changed

+53
-84
lines changed

3 files changed

+53
-84
lines changed

arho_feature_template/core/create_land_use_plan.py

-57
This file was deleted.

arho_feature_template/core/update_plan.py

+16-11
Original file line numberDiff line numberDiff line change
@@ -8,38 +8,43 @@
88
@dataclass
99
class LandUsePlan:
1010
id: str
11-
name: str
1211

1312

1413
# To be replaced later
1514
LAYER_PLAN_ID_MAP = {
16-
"land_use_plan": "id",
17-
"land_use_area": "plan_id",
15+
"Kaava": "id",
16+
"Maankäytön kohteet": "plan_id",
17+
"Muut pisteet": "plan_id",
18+
"Viivat": "plan_id",
19+
"Aluevaraus": "plan_id",
1820
"Osa-alue": "plan_id",
1921
}
2022

2123

2224
def update_selected_plan(new_plan: LandUsePlan):
2325
"""Update the project layers based on the selected land use plan."""
2426
plan_id = new_plan.id
27+
2528
for layer_name, field_name in LAYER_PLAN_ID_MAP.items():
29+
# Set the filter on each layer using the plan_id
2630
set_filter_for_vector_layer(layer_name, field_name, plan_id)
2731

2832

2933
def set_filter_for_vector_layer(layer_name: str, field_name: str, field_value: str):
30-
# Get layer and perform checks
34+
"""Set a filter for the given vector layer."""
3135
layers = QgsProject.instance().mapLayersByName(layer_name)
36+
3237
if not _check_layer_count(layers):
3338
return
39+
3440
layer = layers[0]
35-
if not _check_vector_layer(layer):
36-
return
3741

38-
# Perform the filtering
39-
query = f"{field_name} = {field_value}"
40-
if not layer.setSubsetString(query):
41-
# TODO: Convert to log msg?
42-
iface.messageBar().pushMessage("Error", f"Failed to filter layer {layer_name} with query {query}", level=3)
42+
# Create the filter expression directly based on the plan_id
43+
expression = f"\"{field_name}\" = '{field_value}'" # Properly formatted filter expression
44+
45+
# Apply the filter to the layer
46+
if not layer.setSubsetString(expression):
47+
iface.messageBar().pushMessage("Error", f"Failed to filter layer {layer_name} with query {expression}", level=3)
4348

4449

4550
def _check_layer_count(layers: list) -> bool:

arho_feature_template/plugin.py

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

6-
from qgis.core import QgsProject, QgsWkbTypes
6+
from qgis.core import QgsProject, QgsVectorLayer
77
from qgis.PyQt.QtCore import QCoreApplication, Qt, QTranslator
88
from qgis.PyQt.QtGui import QIcon
99
from qgis.PyQt.QtWidgets import QAction, QWidget
1010
from qgis.utils import iface
1111

1212
from arho_feature_template.core.feature_template_library import FeatureTemplater, TemplateGeometryDigitizeMapTool
13-
14-
# from arho_feature_template.core.update_plan import LandUsePlan, update_selected_plan
13+
from arho_feature_template.core.update_plan import LandUsePlan, update_selected_plan
1514
from arho_feature_template.qgis_plugin_tools.tools.custom_logging import setup_logger, teardown_logger
1615
from arho_feature_template.qgis_plugin_tools.tools.i18n import setup_translation
1716
from arho_feature_template.qgis_plugin_tools.tools.resources import plugin_name
@@ -139,7 +138,6 @@ def initGui(self) -> None: # noqa N802
139138

140139
iface.mapCanvas().mapToolSet.connect(self.templater.digitize_map_tool.deactivate)
141140

142-
# Add main plugin action to the toolbar
143141
self.template_dock_action = self.add_action(
144142
"",
145143
"Feature Templates",
@@ -171,8 +169,18 @@ def on_map_tool_changed(self, new_tool: QgsMapTool, old_tool: QgsMapTool) -> Non
171169
if not isinstance(new_tool, TemplateGeometryDigitizeMapTool):
172170
self.template_dock_action.setChecked(False)
173171

172+
def clear_all_filters(self):
173+
"""Clear filters for all vector layers in the project."""
174+
layers = QgsProject.instance().mapLayers().values()
175+
176+
for layer in layers:
177+
if isinstance(layer, QgsVectorLayer):
178+
layer.setSubsetString("")
179+
174180
def digitize_new_plan(self):
175-
# Activate and start editing the Kaava-layer
181+
# Filtered layers are not editable, so clear filters first.
182+
self.clear_all_filters()
183+
# Find and set the "Kaava" layer
176184
layers = QgsProject.instance().mapLayersByName("Kaava")
177185
if not layers:
178186
iface.messageBar().pushMessage("Error", "Layer 'Kaava' not found", level=3)
@@ -185,23 +193,36 @@ def digitize_new_plan(self):
185193

186194
iface.setActiveLayer(kaava_layer)
187195

188-
if kaava_layer.geometryType() != QgsWkbTypes.PolygonGeometry:
189-
iface.messageBar().pushMessage("Error", "Layer 'Kaava' is not a polygon layer", level=3)
190-
return
191-
192-
kaava_layer.featureAdded.connect(self.commit_new_plan)
193-
194196
iface.actionAddFeature().trigger()
197+
kaava_layer.featureAdded.connect(self.feature_added)
195198

196-
def commit_new_plan(self):
199+
def feature_added(self):
197200
kaava_layer = iface.activeLayer()
201+
feature_ids_before_commit = kaava_layer.allFeatureIds()
202+
if kaava_layer.isEditable():
203+
if not kaava_layer.commitChanges():
204+
iface.messageBar().pushMessage("Error", "Failed to commit changes to the layer.", level=3)
205+
return
206+
else:
207+
iface.messageBar().pushMessage("Error", "Layer is not editable.", level=3)
208+
return
209+
feature_ids_after_commit = kaava_layer.allFeatureIds()
210+
211+
# Finds the feature id that was committed by comparing ids before commit to features after commit.
212+
new_feature_id = next((fid for fid in feature_ids_after_commit if fid not in feature_ids_before_commit), None)
213+
if new_feature_id is not None:
214+
new_feature = kaava_layer.getFeature(new_feature_id)
198215

199-
kaava_layer.featureAdded.disconnect()
216+
if new_feature.isValid():
217+
feature_id_value = new_feature["id"] # UUID of the new feature
218+
iface.messageBar().pushMessage("Info", f"Feature 'id' field value: {feature_id_value}", level=0)
200219

201-
if kaava_layer.commitChanges():
202-
iface.messageBar().pushMessage("Info", "Feature committed successfully", level=0)
220+
# plan = LandUsePlan(feature_id_value)
221+
update_selected_plan(LandUsePlan(feature_id_value))
222+
else:
223+
iface.messageBar().pushMessage("Error", "Invalid feature retrieved.", level=3)
203224
else:
204-
iface.messageBar().pushMessage("Error", "Failed to commit feature", level=3)
225+
iface.messageBar().pushMessage("Error", "No new feature was added.", level=3)
205226

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

0 commit comments

Comments
 (0)