Acquisizione: zoom +/−, Adatta e pan sull'immagine visualizzata, come nel wizard DXF #111

Closed
opened 2026-10-28 09:48:06 +00:00 by Adriano · 1 comment
Owner

RICHIESTA: Adriano 28/10 (fiera A&T): «metti sull'acquisizione la possibilità di fare zoom+- e fit dell'immagine visualizzata (come dentro in TMF)». Riferimento TMF: wizard DXF #104, src/frontend/flask_app/static/js/dxf_recipe_wizard.js:414-478 (zoomBy che tiene fermo il centro visibile, fit, Ctrl+rotella, pan col puntatore con preventDefault), barra in sovrimpressione 776-794.

RAMO: lavoro/daitarn-tmf-zoom da lavoro/daitarn-tmf-flip-unione b46a703 (codice ora sul PC fiera, con la specchiatura #110).
FILE: scripts/calibrazione_pagina.py (solo HTML/CSS/JS della PAGINA), scripts/tests/test_pagina_acquisizione.py (solo aggiunte).

COSA: un visore generico (funzione JS, stile del file: var/function, $, commenti brevi «#111») applicato ai TRE riquadri immagine: Acquisizione cornice/immagine, Acquisizione corniceCal/immagineCal, tab Calibrazione corniceCalTab/immagineCalTab. Ogni visore ha il suo zoom.

MODIFICHE:

  1. Barra in sovrimpressione in alto a destra di ogni .palco (position:absolute; il palco diventa position:relative): pulsanti «−», «Adatta», «+» e la percentuale. Id: zoomMeno/zoomAdatta/zoomPiu/zoomPct, con suffisso Cal e CalTab per gli altri due visori. Barra nascosta finché la cornice è nascosta.
  2. Zoom ASSOLUTO sul frame pieno della camera: z = pixel schermo CSS per pixel camera; 100 % = pixel della camera. Dimensioni del frame pieno: dagli header X-Larghezza/X-Altezza dell'anteprima (già letti in aggiornaIndicatori, A.ris); per la calibrata e la copia bloccata usare le stesse dimensioni. Adatta: zFit = min(larghezza palco / W, altezza massima palco / H), con altezza massima = quella di oggi (calc(100vh - 330px), 60vh sotto i 900 px: leggerla dal CSS calcolato, non duplicare numeri). Limiti: z ∈ [zFit, 8]; passo ×1,25 / ÷1,25; «+»/«−» e Ctrl+rotella (preventDefault solo con Ctrl, la rotella senza Ctrl scorre la pagina). zoomBy tiene fermo il centro visibile (stessa formula del wizard).
  3. Stato Adatta (z == zFit): NESSUN cambio di layout rispetto a oggi (le regole CSS esistenti valgono). Stato zoomato (z > zFit): classe zoomata sul palco → palco con altezza fissa uguale all'altezza massima, overflow:auto, niente centratura flex; cornice con width/height espliciti = W·z × H·z px; img width/height 100 %, senza max-width/max-height/min-height. Il mirino (inset:0 nella cornice) segue da solo.
  4. Pan: con classe zoomata, pointerdown/move/up/cancel sul palco spostano scrollLeft/scrollTop; cursor grab/grabbing; preventDefault su pointerdown (Chromium altrimenti manda pointercancel). Niente pan sui pulsanti della barra.
  5. Frame nuovi durante l'anteprima: zoom e scroll restano (la cornice ha dimensioni esplicite, cambia solo src). Torna ad Adatta: cambio sorgente (cambioSorgente), dimensioni del frame pieno diverse dalle precedenti, resize della finestra SOLO se il visore è in Adatta (ricalcola zFit).
  6. Risoluzione: oggi il ciclo chiede lato_max 1280 (ciclo(): unaAnteprima(1280)), troppo poco per ingrandire. Sostituire con latoAnteprima(): nessun visore dell'Acquisizione zoomato → 1280 (come oggi); altrimenti min(4096, max(1280, ceil(max(W, H) · zMax · devicePixelRatio))), zMax = zoom più alto fra i due visori dell'Acquisizione. Scatta resta 4096. Nient'altro nel ciclo cambia.
  7. Percentuale: Math.round(z·100) + " %".

TEST:

  • test_pagina_acquisizione.py: nuovo test con gli id dei 3×4 controlli e la classe zoomata; i test esistenti (id usati da $("...") esistono, niente alert/confirm/http) restano verdi.
  • node --check sullo <script> estratto da PAGINA.
  • uv run --python 3.13 --extra vision-worker --extra dev --with-editable vendor/visionsuite/packages/vs-camera pytest scripts/tests/test_pagina_acquisizione.py -q → verde.

NON TOCCARE: scripts/camera_service.py, le rotte, i blob URL e la loro revoca (mostraImmagine/mostraCalibrata/mostraInTabCal: solo aggiunta di una chiamata al visore se serve), la logica di blocca/calibrata (#92 #94), la specchiatura (#110).

FATTO QUANDO: sul PC fiera, anteprima attiva: «+» ingrandisce intorno al centro, trascinando si sposta, i frame continuano ad arrivare più definiti, «Adatta» torna alla vista di oggi; cambio sorgente → Adatta.

RICHIESTA: Adriano 28/10 (fiera A&T): «metti sull'acquisizione la possibilità di fare zoom+- e fit dell'immagine visualizzata (come dentro in TMF)». Riferimento TMF: wizard DXF #104, src/frontend/flask_app/static/js/dxf_recipe_wizard.js:414-478 (zoomBy che tiene fermo il centro visibile, fit, Ctrl+rotella, pan col puntatore con preventDefault), barra in sovrimpressione 776-794. RAMO: lavoro/daitarn-tmf-zoom da lavoro/daitarn-tmf-flip-unione b46a703 (codice ora sul PC fiera, con la specchiatura #110). FILE: scripts/calibrazione_pagina.py (solo HTML/CSS/JS della PAGINA), scripts/tests/test_pagina_acquisizione.py (solo aggiunte). COSA: un visore generico (funzione JS, stile del file: var/function, `$`, commenti brevi «#111») applicato ai TRE riquadri immagine: Acquisizione `cornice`/`immagine`, Acquisizione `corniceCal`/`immagineCal`, tab Calibrazione `corniceCalTab`/`immagineCalTab`. Ogni visore ha il suo zoom. MODIFICHE: 1. Barra in sovrimpressione in alto a destra di ogni `.palco` (position:absolute; il palco diventa position:relative): pulsanti «−», «Adatta», «+» e la percentuale. Id: zoomMeno/zoomAdatta/zoomPiu/zoomPct, con suffisso Cal e CalTab per gli altri due visori. Barra nascosta finché la cornice è nascosta. 2. Zoom ASSOLUTO sul frame pieno della camera: z = pixel schermo CSS per pixel camera; 100 % = pixel della camera. Dimensioni del frame pieno: dagli header X-Larghezza/X-Altezza dell'anteprima (già letti in aggiornaIndicatori, A.ris); per la calibrata e la copia bloccata usare le stesse dimensioni. Adatta: zFit = min(larghezza palco / W, altezza massima palco / H), con altezza massima = quella di oggi (calc(100vh - 330px), 60vh sotto i 900 px: leggerla dal CSS calcolato, non duplicare numeri). Limiti: z ∈ [zFit, 8]; passo ×1,25 / ÷1,25; «+»/«−» e Ctrl+rotella (preventDefault solo con Ctrl, la rotella senza Ctrl scorre la pagina). zoomBy tiene fermo il centro visibile (stessa formula del wizard). 3. Stato Adatta (z == zFit): NESSUN cambio di layout rispetto a oggi (le regole CSS esistenti valgono). Stato zoomato (z > zFit): classe `zoomata` sul palco → palco con altezza fissa uguale all'altezza massima, overflow:auto, niente centratura flex; cornice con width/height espliciti = W·z × H·z px; img width/height 100 %, senza max-width/max-height/min-height. Il mirino (inset:0 nella cornice) segue da solo. 4. Pan: con classe `zoomata`, pointerdown/move/up/cancel sul palco spostano scrollLeft/scrollTop; cursor grab/grabbing; preventDefault su pointerdown (Chromium altrimenti manda pointercancel). Niente pan sui pulsanti della barra. 5. Frame nuovi durante l'anteprima: zoom e scroll restano (la cornice ha dimensioni esplicite, cambia solo src). Torna ad Adatta: cambio sorgente (cambioSorgente), dimensioni del frame pieno diverse dalle precedenti, resize della finestra SOLO se il visore è in Adatta (ricalcola zFit). 6. Risoluzione: oggi il ciclo chiede lato_max 1280 (ciclo(): `unaAnteprima(1280)`), troppo poco per ingrandire. Sostituire con `latoAnteprima()`: nessun visore dell'Acquisizione zoomato → 1280 (come oggi); altrimenti min(4096, max(1280, ceil(max(W, H) · zMax · devicePixelRatio))), zMax = zoom più alto fra i due visori dell'Acquisizione. Scatta resta 4096. Nient'altro nel ciclo cambia. 7. Percentuale: Math.round(z·100) + " %". TEST: - test_pagina_acquisizione.py: nuovo test con gli id dei 3×4 controlli e la classe `zoomata`; i test esistenti (id usati da $("...") esistono, niente alert/confirm/http) restano verdi. - node --check sullo <script> estratto da PAGINA. - uv run --python 3.13 --extra vision-worker --extra dev --with-editable vendor/visionsuite/packages/vs-camera pytest scripts/tests/test_pagina_acquisizione.py -q → verde. NON TOCCARE: scripts/camera_service.py, le rotte, i blob URL e la loro revoca (mostraImmagine/mostraCalibrata/mostraInTabCal: solo aggiunta di una chiamata al visore se serve), la logica di blocca/calibrata (#92 #94), la specchiatura (#110). FATTO QUANDO: sul PC fiera, anteprima attiva: «+» ingrandisce intorno al centro, trascinando si sposta, i frame continuano ad arrivare più definiti, «Adatta» torna alla vista di oggi; cambio sorgente → Adatta.
Adriano added the sviluppo label 2026-10-28 09:48:06 +00:00
Author
Owner

Soluzione

ESITO: fatto
COSA: zoom +/−, Adatta e percentuale in overlay (alto a destra) sui tre visori di Acquisizione/Calibrazione; Ctrl+rotella, trascinamento per spostarsi; lato anteprima cresce con lo zoom (latoAnteprima, 1280..4096).
FILE: scripts/calibrazione_pagina.py — .visore/.barraZoom, V{}, zFit/applica/zoomBy/adattaVisore/tornaAdatta/latoAnteprima (b3c56ef); rinomina adatta→adattaVisore, collisione con adatta(d,v) dei parametri camera (c70d29d)
FILE: scripts/tests/test_pagina_acquisizione.py — test_zoom_visori, test_nessuna_funzione_dichiarata_due_volte; scripts/tests/test_blocca_immagine.py:154 — asserzione su unaAnteprima(latoAnteprima()) (34c251a, Opus)
RAMO: lavoro/daitarn-tmf-dxfcal @ 34c251a (pushato)
PROVA: pytest scripts/tests (file camera) → 90 passed; browser locale porta 8799 camera:folder → zoom a passi, barra ferma allo scorrimento, pan, Adatta ripristina, latoAnteprima 1360 a 55 % e 4096 al massimo, nessun errore console
DEPLOY: DESKTOP-RABEHJJ (PC fiera A&T) 28/10/2026, pagina contiene adattaVisore e specchiaO, /health engine 06b549a

**Soluzione** ESITO: fatto COSA: zoom +/−, Adatta e percentuale in overlay (alto a destra) sui tre visori di Acquisizione/Calibrazione; Ctrl+rotella, trascinamento per spostarsi; lato anteprima cresce con lo zoom (latoAnteprima, 1280..4096). FILE: scripts/calibrazione_pagina.py — .visore/.barraZoom, V{}, zFit/applica/zoomBy/adattaVisore/tornaAdatta/latoAnteprima (b3c56ef); rinomina adatta→adattaVisore, collisione con adatta(d,v) dei parametri camera (c70d29d) FILE: scripts/tests/test_pagina_acquisizione.py — test_zoom_visori, test_nessuna_funzione_dichiarata_due_volte; scripts/tests/test_blocca_immagine.py:154 — asserzione su unaAnteprima(latoAnteprima()) (34c251a, Opus) RAMO: lavoro/daitarn-tmf-dxfcal @ 34c251a (pushato) PROVA: pytest scripts/tests (file camera) → 90 passed; browser locale porta 8799 camera:folder → zoom a passi, barra ferma allo scorrimento, pan, Adatta ripristina, latoAnteprima 1360 a 55 % e 4096 al massimo, nessun errore console DEPLOY: DESKTOP-RABEHJJ (PC fiera A&T) 28/10/2026, pagina contiene adattaVisore e specchiaO, /health engine 06b549a
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#111