Enable fiducial download from navigation context
This commit is contained in:
1 parent
74527638c1
commit
3aa4ff1564
3 files changed
+111
-21
No files matched your search
@@ -61,7 +61,7 @@
|
|||||||
"fiducials" =>
|
"fiducials" =>
|
||||||
[
|
[
|
||||||
"La funzione richiede LME Pro: sono validi sia l'abbonamento Google Play sia una licenza manuale attiva.",
|
"La funzione richiede LME Pro: sono validi sia l'abbonamento Google Play sia una licenza manuale attiva.",
|
||||||
"Scegli Provincia, Comune catastale e Foglio, quindi premi Cerca Punti Fiduciali. Puoi anche usare il comando PF sulla mappa dopo aver selezionato una particella o un foglio, oppure dalla particella individuata dal GPS.",
|
"Scegli Provincia, Comune catastale e Foglio, quindi premi Cerca Punti Fiduciali. Puoi anche usare il comando PF sulla mappa dopo aver selezionato una particella o un foglio, dalla particella individuata dal GPS oppure, in navigazione, mostrando il layer del foglio catastale corrente.",
|
||||||
"Mantieni i PF dei fogli gia caricati conserva i risultati precedenti come sottogruppi distinti; disattivalo per sostituirli con il nuovo foglio.",
|
"Mantieni i PF dei fogli gia caricati conserva i risultati precedenti come sottogruppi distinti; disattivalo per sostituirli con il nuovo foglio.",
|
||||||
"Il flag Mostra i PF sulla mappa controlla la visibilita generale. Nel pannello Layer puoi inoltre cambiare colore, ordine, visibilita o rimuovere il singolo gruppo del foglio.",
|
"Il flag Mostra i PF sulla mappa controlla la visibilita generale. Nel pannello Layer puoi inoltre cambiare colore, ordine, visibilita o rimuovere il singolo gruppo del foglio.",
|
||||||
"Tocca un punto rosso per vedere identificativo e coordinate. Quando disponibile, Scarica PDF monografia apre o salva il documento ufficiale dell'Agenzia delle Entrate.",
|
"Tocca un punto rosso per vedere identificativo e coordinate. Quando disponibile, Scarica PDF monografia apre o salva il documento ufficiale dell'Agenzia delle Entrate.",
|
||||||
|
|||||||
@@ -29,8 +29,8 @@
|
|||||||
<ApplicationId>it.liviomerola.lmemappecatastali.pro</ApplicationId>
|
<ApplicationId>it.liviomerola.lmemappecatastali.pro</ApplicationId>
|
||||||
|
|
||||||
<!-- Versions -->
|
<!-- Versions -->
|
||||||
<ApplicationDisplayVersion>1.0.24</ApplicationDisplayVersion>
|
<ApplicationDisplayVersion>1.0.25</ApplicationDisplayVersion>
|
||||||
<ApplicationVersion>124</ApplicationVersion>
|
<ApplicationVersion>125</ApplicationVersion>
|
||||||
<Version>$(ApplicationDisplayVersion)</Version>
|
<Version>$(ApplicationDisplayVersion)</Version>
|
||||||
|
|
||||||
<!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged -->
|
<!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged -->
|
||||||
|
|||||||
+108
-18
@@ -2224,9 +2224,9 @@ function managedObjectDetails(layer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function refreshLayerManager() {
|
function refreshLayerManager() {
|
||||||
updateFiducialDownloadButton();
|
|
||||||
const container = document.getElementById("layerManagerTree");
|
const container = document.getElementById("layerManagerTree");
|
||||||
if (!container || !lmeState.map) {
|
if (!container || !lmeState.map) {
|
||||||
|
updateFiducialDownloadButton();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
captureLayerManagerExpansion(container);
|
captureLayerManagerExpansion(container);
|
||||||
@@ -2274,6 +2274,7 @@ function refreshLayerManager() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (selectionHasObjects()) renderSelectedManagerHighlight();
|
if (selectionHasObjects()) renderSelectedManagerHighlight();
|
||||||
|
updateFiducialDownloadButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderLayerManagerCategory(category, records) {
|
function renderLayerManagerCategory(category, records) {
|
||||||
@@ -3625,7 +3626,7 @@ function showLeafletToolbarHelp() {
|
|||||||
<div><dt>◉</dt><dd><strong>Crea foro</strong>Seleziona 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.</dd></div>
|
<div><dt>◉</dt><dd><strong>Crea foro</strong>Seleziona 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.</dd></div>
|
||||||
<div><dt>✓</dt><dd><strong>Modalita di selezione</strong>Scegli Singola, Multipla o Disattivata. Mappa, pannello Layer e tabella oggetti condividono la stessa selezione. Disattivata e Cancella selezione deselezionano tutto senza eliminare alcun oggetto.</dd></div>
|
<div><dt>✓</dt><dd><strong>Modalita di selezione</strong>Scegli Singola, Multipla o Disattivata. Mappa, pannello Layer e tabella oggetti condividono la stessa selezione. Disattivata e Cancella selezione deselezionano tutto senza eliminare alcun oggetto.</dd></div>
|
||||||
<div><dt>⇄</dt><dd><strong>Confronta due confini</strong>Apri 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.</dd></div>
|
<div><dt>⇄</dt><dd><strong>Confronta due confini</strong>Apri 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.</dd></div>
|
||||||
<div><dt>PF</dt><dd><strong>Scarica Punti Fiduciali</strong>Seleziona 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.</dd></div>
|
<div><dt>PF</dt><dd><strong>Scarica Punti Fiduciali</strong>Seleziona una particella o un foglio catastale; in navigazione puoi anche mostrare il foglio catastale corrente. In alternativa usa la particella rilevata dal GPS. I PF vengono aggiunti come sottogruppo del relativo foglio e richiedono LME Pro.</dd></div>
|
||||||
<div><dt>?</dt><dd><strong>Guida</strong>Riapre 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.</dd></div>
|
<div><dt>?</dt><dd><strong>Guida</strong>Riapre 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.</dd></div>
|
||||||
</dl>
|
</dl>
|
||||||
</div>`);
|
</div>`);
|
||||||
@@ -3708,6 +3709,16 @@ function currentFiducialMapContext() {
|
|||||||
if (context) return context;
|
if (context) return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const navigationContext = fiducialContextFromFeature(lmeState.navigationSheetFeature);
|
||||||
|
if (navigationContext) return navigationContext;
|
||||||
|
|
||||||
|
if (lmeState.map && lmeState.cadastreLayers.includes("CP.CadastralZoning")) {
|
||||||
|
const center = lmeState.map.getCenter();
|
||||||
|
const containingSheet = loadedCadastralSheetAt([center.lng, center.lat]);
|
||||||
|
const containingSheetContext = fiducialContextFromFeature(containingSheet);
|
||||||
|
if (containingSheetContext) return containingSheetContext;
|
||||||
|
}
|
||||||
|
|
||||||
const gpsLayers = managedRecordsForCategory(layerManagerCategories().find(category => category.key === "gpsParcels"));
|
const gpsLayers = managedRecordsForCategory(layerManagerCategories().find(category => category.key === "gpsParcels"));
|
||||||
for (const record of gpsLayers) {
|
for (const record of gpsLayers) {
|
||||||
const context = fiducialContextFromLayer(record.layer);
|
const context = fiducialContextFromLayer(record.layer);
|
||||||
@@ -3717,11 +3728,37 @@ function currentFiducialMapContext() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function fiducialContextFromLayer(layer) {
|
function fiducialContextFromLayer(layer) {
|
||||||
const properties = layer?.feature?.properties || {};
|
return fiducialContextFromFeature(layer?.feature);
|
||||||
const municipalityCode = String(properties._lmeMunicipalityCode || "").trim().toUpperCase();
|
}
|
||||||
const sheet = normalizeFiducialSheet(properties._lmeSheet || properties.foglio || properties.FOGLIO || properties.sheet || properties.SHEET);
|
|
||||||
if (/^[A-Z][0-9A-Z]{3}$/.test(municipalityCode) && sheet) {
|
function fiducialContextFromFeature(feature) {
|
||||||
return { municipalityCode, sheet, label: `Comune ${municipalityCode}, foglio ${sheet}` };
|
const properties = feature?.properties || {};
|
||||||
|
const municipalityValues = [
|
||||||
|
properties._lmeMunicipalityCode,
|
||||||
|
properties.municipalityCode,
|
||||||
|
properties.MUNICIPALITYCODE,
|
||||||
|
properties.codiceComune,
|
||||||
|
properties.CODICECOMUNE,
|
||||||
|
properties.CODICE_COMUNE,
|
||||||
|
properties.codiceCatastale,
|
||||||
|
properties.CODICE_CATASTALE,
|
||||||
|
properties.comune,
|
||||||
|
properties.COMUNE,
|
||||||
|
properties.ADMINISTRATIVEUNIT
|
||||||
|
];
|
||||||
|
const municipalityCode = municipalityValues
|
||||||
|
.map(normalizeFiducialMunicipalityCode)
|
||||||
|
.find(Boolean) || "";
|
||||||
|
const sheetValues = [
|
||||||
|
properties._lmeSheet,
|
||||||
|
properties.foglio,
|
||||||
|
properties.FOGLIO,
|
||||||
|
properties.sheet,
|
||||||
|
properties.SHEET
|
||||||
|
];
|
||||||
|
const explicitSheet = sheetValues.map(normalizeSimpleFiducialSheet).find(Boolean) || "";
|
||||||
|
if (municipalityCode && explicitSheet) {
|
||||||
|
return fiducialContext(municipalityCode, explicitSheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
const references = [
|
const references = [
|
||||||
@@ -3729,18 +3766,65 @@ function fiducialContextFromLayer(layer) {
|
|||||||
properties.NATIONALCADASTRALZONINGREFERENCE,
|
properties.NATIONALCADASTRALZONINGREFERENCE,
|
||||||
properties.INSPIREID_LOCALID,
|
properties.INSPIREID_LOCALID,
|
||||||
properties._lmeParcelReference,
|
properties._lmeParcelReference,
|
||||||
properties.LABEL
|
properties._lmeSheetIdentity,
|
||||||
].filter(Boolean).map(value => String(value).toUpperCase());
|
properties._lmeSource,
|
||||||
|
properties._lmeFolder,
|
||||||
|
properties._lmeGroupName,
|
||||||
|
properties.LABEL,
|
||||||
|
properties.label,
|
||||||
|
properties.name,
|
||||||
|
properties.Name,
|
||||||
|
...sheetValues
|
||||||
|
].filter(Boolean);
|
||||||
for (const reference of references) {
|
for (const reference of references) {
|
||||||
const match = reference.match(/(?:^|\.)([A-Z][0-9A-Z]{3})[_-](\d{4})(?:\d{2})?(?:[._-]|$)/);
|
const context = fiducialContextFromText(reference, municipalityCode);
|
||||||
if (match) {
|
if (context) return context;
|
||||||
const parsedSheet = normalizeFiducialSheet(match[2]);
|
|
||||||
return { municipalityCode: match[1], sheet: parsedSheet, label: `Comune ${match[1]}, foglio ${parsedSheet}` };
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function fiducialContextFromText(value, fallbackMunicipalityCode = "") {
|
||||||
|
const text = String(value ?? "").trim().toUpperCase();
|
||||||
|
if (!text) return null;
|
||||||
|
|
||||||
|
const codedReference = text.match(/(?:^|[^0-9A-Z])([A-Z][0-9A-Z]{3})[._-](\d{4})(?:[0-9A-Z]{2})?(?=[._/\s-]|$)/);
|
||||||
|
if (codedReference) {
|
||||||
|
return fiducialContext(codedReference[1], codedReference[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fiducialReference = text.match(/\bPF\w*\s*[/_-]\s*0*(\d{1,4})\s*[/_-]\s*([A-Z][0-9A-Z]{3})\b/);
|
||||||
|
if (fiducialReference) {
|
||||||
|
return fiducialContext(fiducialReference[2], fiducialReference[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const namedSheet = text.match(/\bFOGLIO\s*[:#._/-]*\s*0*(\d{1,4})\b/);
|
||||||
|
if (fallbackMunicipalityCode && namedSheet) {
|
||||||
|
return fiducialContext(fallbackMunicipalityCode, namedSheet[1]);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function fiducialContext(municipalityCode, sheet) {
|
||||||
|
const normalizedMunicipalityCode = normalizeFiducialMunicipalityCode(municipalityCode);
|
||||||
|
const normalizedSheet = normalizeFiducialSheet(sheet);
|
||||||
|
if (!normalizedMunicipalityCode || !normalizedSheet) return null;
|
||||||
|
return {
|
||||||
|
municipalityCode: normalizedMunicipalityCode,
|
||||||
|
sheet: normalizedSheet,
|
||||||
|
label: `Comune ${normalizedMunicipalityCode}, foglio ${normalizedSheet}`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeFiducialMunicipalityCode(value) {
|
||||||
|
const code = String(value ?? "").trim().toUpperCase();
|
||||||
|
return /^[A-Z][0-9A-Z]{3}$/.test(code) ? code : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeSimpleFiducialSheet(value) {
|
||||||
|
const match = String(value ?? "").trim().toUpperCase().match(/^0*(\d{1,4})(?:[A-Z])?$/);
|
||||||
|
return match ? normalizeFiducialSheet(match[1]) : "";
|
||||||
|
}
|
||||||
|
|
||||||
function normalizeFiducialSheet(value) {
|
function normalizeFiducialSheet(value) {
|
||||||
const digits = String(value ?? "").match(/\d+/)?.[0] || "";
|
const digits = String(value ?? "").match(/\d+/)?.[0] || "";
|
||||||
if (!digits) return "";
|
if (!digits) return "";
|
||||||
@@ -3750,12 +3834,16 @@ function normalizeFiducialSheet(value) {
|
|||||||
function updateFiducialDownloadButton() {
|
function updateFiducialDownloadButton() {
|
||||||
const button = lmeState.fiducialDownloadButton;
|
const button = lmeState.fiducialDownloadButton;
|
||||||
if (!button) return;
|
if (!button) return;
|
||||||
const enabled = Boolean(lmeState.entitlements?.fiducialPoints && currentFiducialMapContext());
|
const entitled = Boolean(lmeState.entitlements?.fiducialPoints);
|
||||||
|
const context = currentFiducialMapContext();
|
||||||
|
const enabled = Boolean(entitled && context);
|
||||||
button.classList.toggle("is-disabled", !enabled);
|
button.classList.toggle("is-disabled", !enabled);
|
||||||
button.setAttribute("aria-disabled", String(!enabled));
|
button.setAttribute("aria-disabled", String(!enabled));
|
||||||
button.title = enabled
|
button.title = !entitled
|
||||||
? "Scarica PF del foglio o della particella"
|
? "PF disponibili con abbonamento Pro o licenza manuale"
|
||||||
: "Seleziona una particella o un foglio per scaricare i PF";
|
: enabled
|
||||||
|
? `Scarica PF - ${context.label}`
|
||||||
|
: "Seleziona una particella o un foglio, oppure mostra il foglio catastale corrente";
|
||||||
}
|
}
|
||||||
|
|
||||||
async function numericEditManagedRecord(record) {
|
async function numericEditManagedRecord(record) {
|
||||||
@@ -6434,6 +6522,7 @@ async function refreshNavigationSheetOutline() {
|
|||||||
html: escapeHtml(reference ? `Foglio ${reference}` : "Foglio catastale")
|
html: escapeHtml(reference ? `Foglio ${reference}` : "Foglio catastale")
|
||||||
})
|
})
|
||||||
}).addTo(lmeState.navigationSheetLayer);
|
}).addTo(lmeState.navigationSheetLayer);
|
||||||
|
updateFiducialDownloadButton();
|
||||||
if (reference && reference !== previousReference) {
|
if (reference && reference !== previousReference) {
|
||||||
setInfo(`Confine del foglio catastale ${reference} caricato.`);
|
setInfo(`Confine del foglio catastale ${reference} caricato.`);
|
||||||
}
|
}
|
||||||
@@ -6450,6 +6539,7 @@ function clearNavigationSheetOutline() {
|
|||||||
lmeState.navigationSheetFeature = null;
|
lmeState.navigationSheetFeature = null;
|
||||||
lmeState.navigationSheetLabel = null;
|
lmeState.navigationSheetLabel = null;
|
||||||
lmeState.navigationSheetLayer?.clearLayers();
|
lmeState.navigationSheetLayer?.clearLayers();
|
||||||
|
updateFiducialDownloadButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadedCadastralSheetAt(point) {
|
function loadedCadastralSheetAt(point) {
|
||||||
|
|||||||
Reference in new issue
Block a user