acquisitore: calibrazione manuale (mm/px impostato a mano) senza scacchiera #95

Closed
opened 2026-10-24 15:19:47 +00:00 by Adriano · 1 comment
Owner

Richiesta Adriano 24/10/2026: senza calibrazione con scacchiera deve essere possibile impostare comunque un mm/px, che servira' nel DXF compare.

VERIFICATO: il backend legge solo px_per_mm dalla calibrazione attiva (src/backend/services/vision_service.py:244-265, worker_kwargs calibration = {px_per_mm} a :562; src/backend/api/routers/vision.py:373-381). Una voce di archivio con px_per_mm valido basta al DXF compare.

ANALISI (Opus, base = ramo lavoro/daitarn-tmf-dxfcal DOPO il commit di #94)
SERVIZIO scripts/camera_service.py

  1. POST /camera/calibrazioni/manuale json {source, nome, mm_per_px, sovrascrivi=false}:
    • mm_per_px numero finito, 0.00001 <= x <= 100 -> altrimenti 400 «mm/px deve essere un numero positivo».
    • risoluzione: dal frame grezzo tenuto (grezzi[source]); se manca, un grab come /camera/grab (stessi errori 404/503/504). Serve al controllo W×H di PUT /camera/calibrazione-attiva.
    • dati = {px_per_mm: 1/mm_per_px, mm_per_px, metodo: "manuale", image_width, image_height, origine: source, calibrated_at: calibrazione.ora_iso(), rms_px: None, square_mm: None}; archivio.salva_nome(nome, dati, mappa=None, sovrascrivi) -> 201 metadati come POST /camera/calibrazioni; 400 nome non valido; 409 nome gia' usato (stessi messaggi).
    • non la attiva: si attiva come le altre (Carica / CONFERMA).
  2. POST /camera/anteprima/calibrata: per una calibrazione SENZA mappa (manuale o planare) non piu' 409: risponde il frame grezzo tenuto, ridotto come al solito, header X-Raddrizzato: no, X-Calibrazione come oggi. Il controllo di risoluzione resta (409 se W×H diverso).
    PAGINA scripts/calibrazione_pagina.py
  3. Tab Calibrazione, nuova scheda «Calibrazione manuale» (sotto quella con la scacchiera): campo «mm per pixel» (id=mmPx, virgola decimale come quadrato, fmtCasella/parse esistenti), testo calcolato «= N px/mm» (id=pxMmCalc) aggiornato a ogni tasto, campo Nome (id=nomeManuale), pulsante «Salva» (id=salvaManuale) con la stessa conferma di sovrascrittura del Salva scacchiera (409 -> secondo clic entro 4 s), messaggio id=msgManuale. Senza sorgente: pulsante disabilitato con nota. Riuscita: messaggio verde «salvata: per usarla «Carica» o CONFERMA», caricaCalibrazioni().
  4. Schede salvate e combo #93: metodo «manuale» mostrato come «manuale» (oggi densa|planare). tabella()/stato: campi null (rms_px, square_mm) mostrati «-», nessun NaN; aggiornaStato non deve scrivere square_mm null nel campo quadrato.
  5. Riquadro calibrata con X-Raddrizzato: no -> titolo «Calibrata «nome» — solo scala, nessuna correzione ottica».
    NON TOCCARE: scripts/calibrazione.py salvo se salva_nome rifiuta i campi null (allora la modifica minima, motivata nel rapporto); src/backend; combo #93 oltre al testo del metodo; blocco #94.
    TEST: rotta manuale 201 con px_per_mm = 1/mm_per_px e W×H del frame; 400 valori 0/negativi/testo; 409 nome doppio e sovrascrivi=true ok; PUT calibrazione-attiva con la manuale ok su stessa risoluzione e 409 su diversa; GET /camera/calibration restituisce px_per_mm; anteprima/calibrata con manuale -> 200 X-Raddrizzato: no. Pagina: id e testi. pytest scripts/tests tutti verdi, node --check. Prova d'insieme Playwright fatta da Opus.
Richiesta Adriano 24/10/2026: senza calibrazione con scacchiera deve essere possibile impostare comunque un mm/px, che servira' nel DXF compare. VERIFICATO: il backend legge solo px_per_mm dalla calibrazione attiva (src/backend/services/vision_service.py:244-265, worker_kwargs calibration = {px_per_mm} a :562; src/backend/api/routers/vision.py:373-381). Una voce di archivio con px_per_mm valido basta al DXF compare. ANALISI (Opus, base = ramo lavoro/daitarn-tmf-dxfcal DOPO il commit di #94) SERVIZIO scripts/camera_service.py 1. POST /camera/calibrazioni/manuale json {source, nome, mm_per_px, sovrascrivi=false}: - mm_per_px numero finito, 0.00001 <= x <= 100 -> altrimenti 400 «mm/px deve essere un numero positivo». - risoluzione: dal frame grezzo tenuto (grezzi[source]); se manca, un grab come /camera/grab (stessi errori 404/503/504). Serve al controllo W×H di PUT /camera/calibrazione-attiva. - dati = {px_per_mm: 1/mm_per_px, mm_per_px, metodo: "manuale", image_width, image_height, origine: source, calibrated_at: calibrazione.ora_iso(), rms_px: None, square_mm: None}; archivio.salva_nome(nome, dati, mappa=None, sovrascrivi) -> 201 metadati come POST /camera/calibrazioni; 400 nome non valido; 409 nome gia' usato (stessi messaggi). - non la attiva: si attiva come le altre (Carica / CONFERMA). 2. POST /camera/anteprima/calibrata: per una calibrazione SENZA mappa (manuale o planare) non piu' 409: risponde il frame grezzo tenuto, ridotto come al solito, header X-Raddrizzato: no, X-Calibrazione come oggi. Il controllo di risoluzione resta (409 se W×H diverso). PAGINA scripts/calibrazione_pagina.py 3. Tab Calibrazione, nuova scheda «Calibrazione manuale» (sotto quella con la scacchiera): campo «mm per pixel» (id=mmPx, virgola decimale come quadrato, fmtCasella/parse esistenti), testo calcolato «= N px/mm» (id=pxMmCalc) aggiornato a ogni tasto, campo Nome (id=nomeManuale), pulsante «Salva» (id=salvaManuale) con la stessa conferma di sovrascrittura del Salva scacchiera (409 -> secondo clic entro 4 s), messaggio id=msgManuale. Senza sorgente: pulsante disabilitato con nota. Riuscita: messaggio verde «salvata: per usarla «Carica» o CONFERMA», caricaCalibrazioni(). 4. Schede salvate e combo #93: metodo «manuale» mostrato come «manuale» (oggi densa|planare). tabella()/stato: campi null (rms_px, square_mm) mostrati «-», nessun NaN; aggiornaStato non deve scrivere square_mm null nel campo quadrato. 5. Riquadro calibrata con X-Raddrizzato: no -> titolo «Calibrata «nome» — solo scala, nessuna correzione ottica». NON TOCCARE: scripts/calibrazione.py salvo se salva_nome rifiuta i campi null (allora la modifica minima, motivata nel rapporto); src/backend; combo #93 oltre al testo del metodo; blocco #94. TEST: rotta manuale 201 con px_per_mm = 1/mm_per_px e W×H del frame; 400 valori 0/negativi/testo; 409 nome doppio e sovrascrivi=true ok; PUT calibrazione-attiva con la manuale ok su stessa risoluzione e 409 su diversa; GET /camera/calibration restituisce px_per_mm; anteprima/calibrata con manuale -> 200 X-Raddrizzato: no. Pagina: id e testi. pytest scripts/tests tutti verdi, node --check. Prova d'insieme Playwright fatta da Opus.
Adriano added the sviluppo label 2026-10-24 15:19:47 +00:00
Author
Owner

Soluzione

ESITO: fatto
RIF: gitea:Adriano/TieMeasureFlow#95, ramo lavoro/daitarn-tmf-dxfcal, commit 552f96b
COSA: calibrazione manuale: mm/px a mano, salvata con nome (metodo manuale, W×H dal frame della sorgente, nessuna mappa), attivabile come le altre; il DXF compare legge px_per_mm (src/backend/services/vision_service.py:244-265).
FILE: scripts/camera_service.py — POST /camera/calibrazioni/manuale (201/400/409); /camera/anteprima/calibrata senza mappa -> frame grezzo, X-Raddrizzato: no, controllo W×H mantenuto
FILE: scripts/calibrazione_pagina.py — scheda «Calibrazione manuale» (mmPx, pxMmCalc, nomeManuale, salvaManuale, msgManuale), metodo «manuale» in schede e combo, campi null come «-», titolo «solo scala, nessuna correzione ottica»
PROVA: pytest scripts/tests → 185 passed (20 nuovi in test_calibrazione_manuale.py). Prova a mano: Adriano.
MANCA: merge su V3.0.0 con #83-#85; build e PC fiera.

**Soluzione** ESITO: fatto RIF: gitea:Adriano/TieMeasureFlow#95, ramo lavoro/daitarn-tmf-dxfcal, commit 552f96b COSA: calibrazione manuale: mm/px a mano, salvata con nome (metodo manuale, W×H dal frame della sorgente, nessuna mappa), attivabile come le altre; il DXF compare legge px_per_mm (src/backend/services/vision_service.py:244-265). FILE: scripts/camera_service.py — POST /camera/calibrazioni/manuale (201/400/409); /camera/anteprima/calibrata senza mappa -> frame grezzo, X-Raddrizzato: no, controllo W×H mantenuto FILE: scripts/calibrazione_pagina.py — scheda «Calibrazione manuale» (mmPx, pxMmCalc, nomeManuale, salvaManuale, msgManuale), metodo «manuale» in schede e combo, campi null come «-», titolo «solo scala, nessuna correzione ottica» PROVA: pytest scripts/tests → 185 passed (20 nuovi in test_calibrazione_manuale.py). Prova a mano: Adriano. MANCA: merge su V3.0.0 con #83-#85; build e PC fiera.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#95