diff --git a/LMEMappeCatastaliApp.csproj b/LMEMappeCatastaliApp.csproj index 4661808..ea742f1 100644 --- a/LMEMappeCatastaliApp.csproj +++ b/LMEMappeCatastaliApp.csproj @@ -29,8 +29,8 @@ it.liviomerola.lmemappecatastali.pro - 1.0.21 - 121 + 1.0.22 + 122 $(ApplicationDisplayVersion) diff --git a/wwwroot/js/lme-map.js b/wwwroot/js/lme-map.js index 37d2ba3..98625d3 100644 --- a/wwwroot/js/lme-map.js +++ b/wwwroot/js/lme-map.js @@ -349,7 +349,8 @@ function init(dotNetReference) { }); lmeState.map.createPane("drawingsMarkerPane", lmeState.map._norotatePane || lmeState.map._mapPane); lmeState.map.createPane("gpsAccuracyPane", lmeState.map._rotatePane || lmeState.map._mapPane); - lmeState.map.createPane("comparisonPane", lmeState.map._rotatePane || lmeState.map._mapPane); + const comparisonPane = lmeState.map.createPane("comparisonPane", lmeState.map._rotatePane || lmeState.map._mapPane); + comparisonPane.style.zIndex = "680"; const managerHighlightPane = lmeState.map.createPane("managerHighlightPane", lmeState.map._rotatePane || lmeState.map._mapPane); managerHighlightPane.style.zIndex = "650"; lmeState.drawingsRenderer = L.canvas({ pane: "drawingsPane", tolerance: 14 }); @@ -395,7 +396,7 @@ function init(dotNetReference) { return; } hideDrawingScopeMenu(); - clearManagerHighlight(); + if (!multiSelectionHasObjects()) clearManagerHighlight(); const info = await queryFeatureInfo(event.latlng); if (info) { L.popup().setLatLng(event.latlng).setContent(info).openOn(lmeState.map); @@ -453,6 +454,10 @@ function init(dotNetReference) { || selectedParent?.dataset.highlightKey === lmeState.managerHighlightedParentKey) { return; } + if (multiSelectionHasObjects()) { + renderSelectedManagerHighlight(); + return; + } clearManagerHighlight(); }); lmeState.managerOutsideSelectionBound = true; @@ -1607,7 +1612,7 @@ function setLayerOrder(order) { normalized.forEach((key, index) => { const zIndex = String(590 - index * 20); const paneNames = [panes[key]]; - if (key === "drawings") paneNames.push("drawingsMarkerPane", "comparisonPane"); + if (key === "drawings") paneNames.push("drawingsMarkerPane"); if (key === "gpsPosition") paneNames.push("gpsAccuracyPane"); paneNames.forEach(paneName => { const pane = lmeState.map.getPane(paneName); @@ -2194,6 +2199,7 @@ function refreshLayerManager() { scrollHost.scrollTop = scrollTop; }); } + if (multiSelectionHasObjects()) renderSelectedManagerHighlight(); } function renderLayerManagerCategory(category, records) { @@ -3261,13 +3267,15 @@ function compareSelectedGeometries() { const resultLayers = []; const addResult = (feature, name, color, role) => { if (!feature) return; + const overlapResult = role === "overlap"; feature.properties = { name, + _lmeSource: "Confronto confini", _lmeColor: color, _lmeFillColor: color, - _lmeWeight: 3, + _lmeWeight: overlapResult ? 5 : 3, _lmeOpacity: 1, - _lmeFillOpacity: 0.48, + _lmeFillOpacity: overlapResult ? 0.72 : 0.48, _lmeComparisonResult: true, _lmeComparisonRole: role, _lmeManagerId: undefined @@ -3278,6 +3286,13 @@ function compareSelectedGeometries() { addResult(onlyFirst, `Solo ${managedObjectLabel(polygons[0], 0)}`, "#ef4444", "only-first"); addResult(onlySecond, `Solo ${managedObjectLabel(polygons[1], 1)}`, "#2563eb", "only-second"); addResult(overlap, "Sovrapposizione", "#16a34a", "overlap"); + const comparisonIds = [...resultLayers].reverse().map(layer => managedLayerId(layer, "drawings")); + const previousOrder = lmeState.managerObjectOrder.drawings || []; + lmeState.managerObjectOrder.drawings = [ + ...comparisonIds, + ...previousOrder.filter(id => !comparisonIds.includes(id)) + ]; + saveLayerManagerState(); const firstArea = onlyFirst ? turf.area(onlyFirst) : 0; const secondArea = onlySecond ? turf.area(onlySecond) : 0; const overlapArea = overlap ? turf.area(overlap) : 0; const message = `Confronto creato. Solo primo confine: ${formatArea(firstArea)}. Solo secondo confine: ${formatArea(secondArea)}. Sovrapposizione: ${formatArea(overlapArea)}.`; lmeState.managerSelectedObjectIds.clear(); @@ -3358,6 +3373,10 @@ function toggleMultiSelection() { return lmeState.multiSelectionEnabled; } +function multiSelectionHasObjects() { + return lmeState.multiSelectionEnabled && lmeState.managerSelectedObjectIds.size > 0; +} + function refreshMultipleMapSelection(preferredRecord) { clearManagerHighlight(); const selectedRecords = selectedManagedRecords(); @@ -3389,8 +3408,8 @@ function showLeafletToolbarHelp() {
▱
Elimina disegniPremi il cestino e scegli Solo selezionato oppure Tutti. L'oggetto rimosso può essere recuperato con Annulla o dal cestino negli strumenti avanzati.
✓
Controlla e riparaVerifica gli oggetti selezionati e prova a correggere coordinate duplicate o poligoni non validi. Esempio: usalo quando un contorno importato non si esporta o si riempie male; al termine compare un riepilogo.
◉
Crea foroSeleziona esattamente due poligoni: prima l'area esterna, poi quella interna. Esempio: sottrai il cortile dal perimetro di un fabbricato o un'isola esclusa da un'area di lavoro.
-
☑
Selezione multiplaAttiva il comando e tocca più oggetti sulla mappa per aggiungerli o rimuoverli dalla selezione. Disattivalo per tornare alla selezione singola. È utile prima di Confronta, Unisci, Buffer e altre operazioni su più oggetti.
-
⇄
Confronta due confiniApri il comando e scegli Confronta dopo aver selezionato esattamente due poligoni. L'app crea il solo primo in rosso, il solo secondo in blu e la sovrapposizione in verde. Usa Pulisci confronto per rimuovere soltanto questi risultati.
+
☑
Selezione multiplaAttiva il comando e tocca più oggetti sulla mappa per aggiungerli o rimuoverli dalla selezione. Gli oggetti restano evidenziati anche aprendo e chiudendo i pannelli. Disattivalo per tornare alla selezione singola.
+
⇄
Confronta due confiniApri il comando e scegli Confronta dopo aver selezionato esattamente due poligoni. Il gruppo Confronto confini viene collocato sopra gli altri layer: rosso indica solo il primo, blu solo il secondo e verde la sovrapposizione. Usa Pulisci confronto per rimuovere soltanto questi risultati.
PF
Scarica Punti FiducialiSeleziona una particella o un foglio catastale; in alternativa usa la particella rilevata dal GPS. I PF vengono aggiunti come sottogruppo del relativo foglio e richiedono LME Pro.
?
GuidaRiapre questa descrizione. I risultati di riparazione e confronto vengono mostrati anche in una finestra; per uscire dalla visualizzazione rosso, blu e verde usa Pulisci confronto.
@@ -4050,6 +4069,13 @@ function highlightManagedParent(row, key, records) { } function renderSelectedManagerHighlight() { + if (multiSelectionHasObjects()) { + const selected = [...lmeState.managerSelectedObjectIds] + .map(id => lmeState.managerRecords.get(id)) + .filter(Boolean); + renderManagerHighlight(selected); + return; + } if (lmeState.managerHighlightedParentRecords?.length) { renderManagerHighlight(lmeState.managerHighlightedParentRecords); return;