Skip to content

Commit 1d5e3e4

Browse files
pigrecoclaude
andcommitted
Release v1.4.11: Fix logica Seleziona Punti, conteggi legenda Qt5/Qt6
- Semplificata canvasPressEvent: ora gestisce solo click singolo - Rimossa rilevazione automatica layer punti vicini al click - _processa_layer_punti: refactoring con try/finally per cleanup garantito - Aggiunto _set_show_feature_count: compatibile Qt5 (setCustomProperty) e Qt6/QGIS 3.32+ (setShowFeatureCount) - Aggiunto _refresh_feature_counts_deferred via QTimer.singleShot(500ms) per aggiornare conteggi per-regola dopo il render del canvas in Qt6 - Migliorato messaggio errore "Nessuna feature" per punti in mare - Rimossi print di debug diagnostico Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 5ae44d1 commit 1d5e3e4

5 files changed

Lines changed: 425 additions & 226 deletions

File tree

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ L'autore declina ogni responsabilità per eventuali usi impropri del plugin o pe
116116

117117
## Changelog
118118

119+
- **1.4.11** - Fix logica "Seleziona Punti": separazione netta tra Sorgente=(clicca sulla mappa) [solo singola particella per click, sessione ESC] e Sorgente=layer [processing automatico senza click interattivi]; refactoring try/finally garantisce chiusura tool anche su errore; messaggio "Nessuna feature" migliorato con suggerimento per punti in mare
120+
- **1.4.10** - Fix: combo "Sorgente" si azzera a "(clicca sulla mappa)" alla riapertura del dialogo; notifica nella barra messaggi QGIS con il conteggio feature caricate/aggiunte (sia per nuovo layer che per append)
121+
- **1.4.9** - Modalità Seleziona Punti: nuova combo "Sorgente" per scegliere un layer di punti dal dialogo senza cliccare in mappa; nuova combo "Aggiungi a" per appendere le particelle a un layer Particelle WFS esistente (risolve issue [#6](https://github.com/pigreco/wfs_catasto_download_particelle_bbox/issues/6))
119122
- **1.4.8** - Modalità Seleziona Punti: click singolo con accumulo feature nello stesso layer di sessione (append), deduplicazione cross-click, ESC affidabile con QShortcut
120123
- **1.4.7** - Miglioramenti interfaccia: riorganizzato layout bottoni ("Chiudi" 3/4 spazio, "Guida" 1/4), aggiunta voce "Guida" nel menu Plugin
121124
- **1.4.6** - Sistema help integrato con GitHub Pages (bottone "Aiuto" → documentazione online completa)

index.html

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ <h3>Installazione da GitHub</h3>
261261
</ol>
262262

263263
<div class="info">
264-
<strong>💡 Tip:</strong> Il plugin comparirà nel menu <strong>Plugin</strong> con due opzioni: "Avvia Download Particelle Catastali" e "Informazioni".
264+
<strong>💡 Tip:</strong> Il plugin comparirà nel menu <strong>Plugin</strong> con tre opzioni: "Avvia Download Particelle Catastali", "Informazioni" e "Guida".
265265
</div>
266266
</section>
267267

@@ -338,18 +338,58 @@ <h4>Procedura:</h4>
338338
<div class="mode-card">
339339
<div class="mode-content">
340340
<h4>4. 📍 Seleziona Punti</h4>
341-
<p>Usa punti esistenti o disegnati per scaricare le particelle che li contengono.</p>
342-
341+
<p>Usa punti esistenti o disegnati per scaricare le particelle che li contengono. Supporta quattro scenari d'uso combinabili.</p>
342+
343343
<div class="steps">
344-
<h4>Procedura:</h4>
345-
<ol>
346-
<li>Carica un layer di punti o preparati a cliccare in mappa</li>
347-
<li>Il sistema supporta selezione parziale dei punti</li>
348-
<li>Auto-riproiezione UTM per CRS geografici</li>
349-
<li>Download automatico delle particelle contenenti i punti</li>
350-
<li>Se non ci sono layer di punti, ogni click scarica la particella e la accumula nello stesso layer</li>
351-
<li>Premi <strong>ESC</strong> per terminare la sessione</li>
352-
</ol>
344+
<h4>Parametri disponibili nel dialogo:</h4>
345+
<ul>
346+
<li><strong>Buffer:</strong> distanza in metri attorno a ciascun punto (default 1 m)</li>
347+
<li><strong>Snap:</strong> tolleranza in pixel per il click sulla mappa</li>
348+
<li><strong>Sorgente:</strong> layer di punti da usare come input (opzionale)</li>
349+
<li><strong>Aggiungi a:</strong> layer Particelle WFS esistente in cui accodare le nuove particelle (opzionale)</li>
350+
</ul>
351+
</div>
352+
353+
<div class="steps">
354+
<h4>Due modalità di funzionamento:</h4>
355+
<ul>
356+
<li>
357+
<strong>Sorgente = "(clicca sulla mappa)"</strong> — modalità interattiva a click.<br>
358+
Ogni click sulla mappa scarica la particella catastale nel punto cliccato e la accumula nello stesso layer di sessione.
359+
Premi <strong>ESC</strong> per terminare la sessione e riaprire il dialogo.
360+
Se hai impostato <em>Aggiungi a</em>, le particelle vengono accodate al layer selezionato; altrimenti viene creato un nuovo layer al primo click e i click successivi vi vengono aggiunti.
361+
</li>
362+
<li>
363+
<strong>Sorgente = layer specifico</strong> — modalità automatica.<br>
364+
Scegli un layer di punti dalla combo <em>Sorgente</em>: il download parte automaticamente, senza dover cliccare sulla mappa.
365+
Vengono usati i punti selezionati (se presenti) oppure tutti i punti del layer.
366+
Al termine il dialogo si riapre automaticamente.
367+
</li>
368+
</ul>
369+
</div>
370+
371+
<div class="steps">
372+
<h4>Come usare "Aggiungi a":</h4>
373+
<ul>
374+
<li><strong>Aggiungi a = "(nuovo layer)"</strong> — il risultato finisce in un nuovo layer temporaneo (comportamento predefinito)</li>
375+
<li><strong>Aggiungi a = layer esistente</strong> — le particelle vengono accodate al layer Particelle WFS selezionato. La selezione viene mantenuta tra un ciclo e l'altro. Compatibile con entrambe le modalità Sorgente.</li>
376+
</ul>
377+
</div>
378+
379+
<div class="info">
380+
<strong>💡 Tip:</strong> Le combo <em>Sorgente</em> e <em>Aggiungi a</em> sono combinabili: puoi usare un layer sorgente <strong>e</strong> accodare il risultato a un layer esistente in una sola operazione. Dopo ogni download viene mostrata una notifica nella barra messaggi QGIS con il numero di particelle caricate.
381+
</div>
382+
383+
<div class="info">
384+
<strong>🔄 Selezione parziale:</strong> Se nel layer di punti sorgente sono presenti punti selezionati, verranno usati solo quelli; altrimenti tutti i punti del layer.
385+
</div>
386+
387+
<div class="warning">
388+
<strong>⚠️ CRS geografico:</strong> Se il layer di punti usa un CRS geografico (gradi), il plugin esegue automaticamente una riproiezione UTM per calcolare correttamente il buffer.
389+
</div>
390+
391+
<div class="warning">
392+
<strong>⚠️ Punti in mare o fuori dalla copertura catastale:</strong> Se uno o più punti del layer cadono in mare, su un lago o in un'area priva di dati catastali (es. zone militari, aree estere), il download restituirà "Nessuna feature". Il servizio WFS dell'Agenzia delle Entrate copre solo il territorio italiano continentale e insulare con dati catastali disponibili. <strong>Soluzione:</strong> seleziona manualmente solo i punti su terraferma prima di avviare il download; il plugin utilizzerà automaticamente solo i punti selezionati.
353393
</div>
354394
</div>
355395
<div class="mode-image">

metadata.txt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
name=WFS Catasto Download Particelle BBox
77
qgisMinimumVersion=3.0
88
description=Download particelle catastali dal WFS dell'Agenzia delle Entrate tramite BBox, selezione poligono, linea con buffer o layer di punti.
9-
version=1.4.8
9+
version=1.4.11
1010
author=Salvatore Fiandaca
1111
email=pigrecoinfinito@gmail.com
1212

@@ -30,6 +30,26 @@ repository=https://github.com/pigreco/wfs_catasto_download_particelle_bbox
3030

3131
hasProcessingProvider=no
3232
changelog=
33+
1.4.11 - Fix logica 'Seleziona Punti': separazione netta tra le due modalita'.
34+
Sorgente=(clicca sulla mappa): SOLO download singola particella per
35+
ogni click (modalita' sessione, ESC per terminare). Rimossa la
36+
rilevazione automatica di layer punti vicini al click, ora gestita
37+
esclusivamente dalla combo Sorgente.
38+
Sorgente=layer specifico: processing automatico all'avvio, nessun
39+
click interattivo. Refactoring _processa_layer_punti con try/finally
40+
per garantire chiusura tool e riapertura dialogo anche in caso di errore.
41+
Migliorato messaggio di errore "Nessuna feature" con suggerimento per
42+
punti in mare o fuori copertura catastale.
43+
1.4.10 - Fix: combo "Sorgente" si azzera sempre a "(clicca sulla mappa)" alla
44+
riapertura del dialogo (non ripristina piu' la selezione precedente).
45+
Fix: aggiunto showFeatureCount sul layer di destinazione in modalita'
46+
append, e notifica nella barra messaggi QGIS con il conteggio
47+
delle particelle aggiunte/caricate (sia per nuovo layer che per append).
48+
1.4.9 - Modalita' Seleziona Punti: nuova combo "Sorgente" per scegliere un layer
49+
di punti direttamente dal dialogo (senza dover cliccare in mappa).
50+
Nuova combo "Aggiungi a" per aggiungere le particelle a un layer
51+
Particelle WFS esistente invece di crearne uno nuovo.
52+
Copertura completa degli scenari 2/3/4 richiesti nell'issue #6.
3353
1.4.8 - Modalita' Seleziona Punti: click singolo con accumulo feature nello
3454
stesso layer di sessione (append invece di creare un layer per ogni click).
3555
Deduplicazione cross-click per gml_id. ESC per terminare la sessione

wfs_catasto_download_particelle_bbox_d.py

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
import os
1111
import webbrowser
1212

13+
from qgis.core import QgsProject, QgsVectorLayer
1314
from qgis.PyQt.QtCore import Qt
1415
from qgis.PyQt.QtGui import QFont, QPixmap
1516
from qgis.PyQt.QtWidgets import (
17+
QComboBox,
1618
QDialog,
1719
QVBoxLayout,
1820
QHBoxLayout,
@@ -47,6 +49,24 @@
4749
_SmoothTransformation = Qt.SmoothTransformation
4850

4951

52+
def _is_point_layer(layer):
53+
"""Verifica se il layer è puntuale (compatibile Qt5/Qt6)."""
54+
try:
55+
from qgis.core import Qgis
56+
return layer.geometryType() == Qgis.GeometryType.Point
57+
except AttributeError:
58+
return layer.geometryType() == 0
59+
60+
61+
def _is_polygon_layer(layer):
62+
"""Verifica se il layer è poligonale (compatibile Qt5/Qt6)."""
63+
try:
64+
from qgis.core import Qgis
65+
return layer.geometryType() == Qgis.GeometryType.Polygon
66+
except AttributeError:
67+
return layer.geometryType() == 2
68+
69+
5070
def _plugin_version():
5171
"""Legge la versione dal file metadata.txt del plugin."""
5272
meta_path = os.path.join(os.path.dirname(__file__), "metadata.txt")
@@ -190,6 +210,39 @@ def __init__(self, parent=None, default_buffer_m=50,
190210
self._default_snap_px = default_snap_px
191211
self._init_ui()
192212

213+
def showEvent(self, event):
214+
"""Aggiorna le combo dei layer ogni volta che il dialog viene mostrato."""
215+
super().showEvent(event)
216+
self._refresh_layer_combos()
217+
218+
def _refresh_layer_combos(self):
219+
"""Ripopola le combo con i layer correnti del progetto."""
220+
# --- Sorgente punti: si azzera sempre a "(clicca sulla mappa)" ---
221+
self.combo_source_layer.blockSignals(True)
222+
self.combo_source_layer.clear()
223+
self.combo_source_layer.addItem("(clicca sulla mappa)", None)
224+
for layer in QgsProject.instance().mapLayers().values():
225+
if isinstance(layer, QgsVectorLayer) and _is_point_layer(layer):
226+
self.combo_source_layer.addItem(layer.name(), layer.id())
227+
# Non ripristinare la selezione: ogni operazione parte da "(clicca sulla mappa)"
228+
self.combo_source_layer.blockSignals(False)
229+
230+
# --- Layer destinazione append ---
231+
self.combo_append_layer.blockSignals(True)
232+
current_append_id = self.combo_append_layer.currentData()
233+
self.combo_append_layer.clear()
234+
self.combo_append_layer.addItem("(nuovo layer)", None)
235+
for layer in QgsProject.instance().mapLayers().values():
236+
if isinstance(layer, QgsVectorLayer) and _is_polygon_layer(layer):
237+
if "Particelle" in layer.name() or "WFS" in layer.name():
238+
self.combo_append_layer.addItem(layer.name(), layer.id())
239+
# Ripristina selezione precedente se ancora presente
240+
if current_append_id is not None:
241+
idx = self.combo_append_layer.findData(current_append_id)
242+
if idx >= 0:
243+
self.combo_append_layer.setCurrentIndex(idx)
244+
self.combo_append_layer.blockSignals(False)
245+
193246
def _init_ui(self):
194247
ver = _plugin_version()
195248
titolo = "WFS Catasto - Scelta modalità"
@@ -450,6 +503,36 @@ def _cell_punti(self, svg_w, svg_h):
450503
params_row.addStretch()
451504
gl.addLayout(params_row)
452505

506+
# Layer sorgente punti
507+
src_row = QHBoxLayout()
508+
src_lbl = QLabel("Sorgente:")
509+
src_lbl.setStyleSheet("font-weight: normal; font-size: 10px;")
510+
src_row.addWidget(src_lbl)
511+
self.combo_source_layer = QComboBox()
512+
self.combo_source_layer.addItem("(clicca sulla mappa)", None)
513+
self.combo_source_layer.setStyleSheet("font-size: 10px;")
514+
self.combo_source_layer.setToolTip(
515+
"Scegli un layer punti dal progetto oppure lascia\n"
516+
"'(clicca sulla mappa)' per selezionarlo cliccando."
517+
)
518+
src_row.addWidget(self.combo_source_layer, 1)
519+
gl.addLayout(src_row)
520+
521+
# Layer destinazione (append)
522+
app_row = QHBoxLayout()
523+
app_lbl = QLabel("Aggiungi a:")
524+
app_lbl.setStyleSheet("font-weight: normal; font-size: 10px;")
525+
app_row.addWidget(app_lbl)
526+
self.combo_append_layer = QComboBox()
527+
self.combo_append_layer.addItem("(nuovo layer)", None)
528+
self.combo_append_layer.setStyleSheet("font-size: 10px;")
529+
self.combo_append_layer.setToolTip(
530+
"Scegli un layer Particelle WFS esistente a cui aggiungere\n"
531+
"le nuove particelle, oppure lascia '(nuovo layer)'."
532+
)
533+
app_row.addWidget(self.combo_append_layer, 1)
534+
gl.addLayout(app_row)
535+
453536
gl.addStretch()
454537

455538
btn = QPushButton("Seleziona Punti")
@@ -515,6 +598,22 @@ def _on_snap_changed(self, value):
515598
def _on_punti(self):
516599
self.scelta = "punti"
517600
self.accept()
601+
602+
@property
603+
def selected_point_layer(self):
604+
"""Restituisce il layer punti sorgente selezionato, o None se 'clicca sulla mappa'."""
605+
layer_id = self.combo_source_layer.currentData()
606+
if layer_id is None:
607+
return None
608+
return QgsProject.instance().mapLayer(layer_id)
609+
610+
@property
611+
def append_to_wfs_layer(self):
612+
"""Restituisce il layer WFS destinazione selezionato, o None se 'nuovo layer'."""
613+
layer_id = self.combo_append_layer.currentData()
614+
if layer_id is None:
615+
return None
616+
return QgsProject.instance().mapLayer(layer_id)
518617

519618
def _on_aiuto(self):
520619
"""Apre la pagina di aiuto del plugin su GitHub Pages."""

0 commit comments

Comments
 (0)