Wizard DXF: anteprime sotto le scelte, mm/px solo da file, prova su due colonne con zoom e Fit #104
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Richiesta Adriano 25/10/2026. Analisi nel commento.
ESITO: richiesta
RIF: gitea:Adriano/TieMeasureFlow#104
COSA: wizard «Crea ricetta da DXF» (editor task, tipo dxf_compare): nuova disposizione. Le anteprime stanno sotto le scelte, il mm/px compare solo per un'immagine da file, il risultato della Prova va su due colonne (immagine a sinistra con zoom e Fit, dati ed errori a destra).
Richiesta di Adriano 25/10/2026: «metti anteprima immagine e anteprima dxf sotto alle scelte di immagine e dxf. Se si seleziona immagine da file viene visualizzato mm/px; anteprima della prova della ricetta deve occupare 1 colonna sx e a dx vengono visualizzati dati risultanti, eventuali errori. Inoltre immagine di prova deve avere anche i pulsanti di zoom e fit».
BASE: ramo lavoro/daitarn-tmf-102, commit
20f3323(#102: anteprima immagine), worktree C:/Users/Adriano/lavoro/TieMeasureFlow-102.File: src/frontend/flask_app/static/js/dxf_recipe_wizard.js e src/frontend/flask_app/templates/maker/task_editor.html, blocco «Crea ricetta da DXF» (~righe 662-760).
STATO OGGI
errorenoticesono righe sopra;dxf.points_in_pct.result = {result: {outputs, overlay, outcome, ...}, saved, recipe_dir}. Il campooutcomeè l'esito della ricetta sul riferimento (vedisrc/vision/costruttori.py~riga 257).MODIFICHE
imageSource: ''('' | 'file' | 'camera'):onImagelo imposta a 'file',grab()a 'camera'; con_setImage(null)torna ''.useManualScale=imageSource === 'file' && manualPxMm !== null. Va usato:canRun, al posto dimanualPxMm !== null;run(), per decidere se inviarepx_per_mm;imagePreviewSummary;Con un'immagine dalla camera vale la calibrazione della stazione.
mmPxnon si azzera cambiando sorgente: resta pronto se si torna al file.a. Stazione (invariata).
b. Griglia
sm:grid-cols-2delle SCELTE:x-show="imageSource === 'file'", il campo mm/px di #98 (spostato qui con le sue righe di aiuto e di errore, logica invariata);c. Griglia
sm:grid-cols-2delle ANTEPRIME,items-start, subito sotto:Le due scatole hanno la stessa altezza fissa (
height: 240px, non max-height),object-fit: containper l'img,preserveAspectRatioper l'SVG: così stanno allineate. Ogni scatola è visibile solo col suo contenuto. Il codice SVG di #101 non cambia (un solo path,x-bind:view-box.camel).d. Banda, soglia, controluce, bottoni Prova / Salva: invariati.
e. RISULTATO DELLA PROVA, visibile solo dopo una Prova (
x-show="tested";tested= true alla fine dirun(), riportato a false da_setImage,onDxf,onStation). Griglialg:grid-cols-2 gap-3:x-ref="viewport"conoverflow: auto, altezzamin(70vh, 520px), bordo e sfondo var(--bg-primary). Dentro un wrapperposition: relativelargonaturalWidth * zoompx e altonaturalHeight * zoompx, che contiene l'<img x-ref="img">(width/height 100%) e il<canvas x-ref="overlay">assoluto inset-0. Il canvas resta nelle coordinate pixel dell'immagine come oggi (drawOverlayinvariato) e lo scala il CSS.zoom: 1;zoomBy(f)moltiplica per 1.25 o 1/1.25, limiti 0.05..8, e tiene il centro visibile aggiustando scrollLeft e scrollTop;fit()= min(clientWidth / naturalWidth, clientHeight / naturalHeight) del viewport. Fit si applica da solo al load dell'immagine di prova e a ogni nuova Prova (in$nextTick).@wheel.preventsolo con ctrlKey); senza Ctrl la rotella scorre la pagina.result.result.outcome, verde se positivo e rosso altrimenti. I valori possibili si leggono insrc/vision/o vs-task; non indovinarli: se non sono chiari mostrare il valore grezzo.fmt. La chiave grezza resta in piccolo grigio o intitle.error(rosso) enotice(verde) si spostano qui dalla posizione di oggi.error, nessunresult), la sezione si mostra lo stesso: a sinistra l'immagine senza overlay, a destra l'errore._()e voci intranslations/{it,en}/LC_MESSAGES/messages.po, niente .mo. Testi passati al JS viamsgsse servono nel JS.TEST
src/frontend/flask_app/tests/js/test_dxf_preview.js, eseguito con node, con un caso per ciascuno di questi punti:useManualScaleè falso con imageSource 'camera' anche se mmPx è valido, e vero con 'file';run()non inviapx_per_mmcon la camera (stub di fetch e FormData come nei test esistenti, se c'è il modo; altrimenti testare il getter usato da run);zoomByrispetta i limiti;fitcalcola il rapporto, con un viewport e un img finti con clientWidth e naturalWidth;testedtorna false dopo_setImage.tests/test_dxf_recipe_routes.py: la pagina contieneimageSource === 'file',zoomBy,fit().src/frontend/flask_app:C:/Users/Adriano/lavoro/TieMeasureFlow-dxfcal-frontend/.venv/Scripts/python.exe -m pytest tests -q -p no:cacheprovider. Base: 9 failed / 402 passed / 2 skipped (fallimenti noti). Nessun fallimento nuovo.NON TOCCARE
loadDxfPreviewedxfPreviewD(#101).drawOverlay(solo il suo contenitore cambia).PROVA (Opus): dopo il merge e il riavvio, headless Edge sul task 8 della ricetta 3.
C:/Users/Adriano/Desktop/Sider foto e DXF/Foto/sider_2_1.bmp: il campo mm/px compare; si inserisce 0,01406.C:/Users/Adriano/Desktop/Sider foto e DXF/DXF profilo/12.3X5.1MEVISS235JR_profilo.dxf: le due anteprime sono affiancate e allineate.🔵 daitarn — preso in carico 2026-10-25T15:16:38Z
ramo:
lavoro/daitarn· capacità: build-windows, gpuSoluzione
ESITO: fatto. Ramo lavoro/daitarn-tmf-dxfcal (push
08616aa). FILE: dxf_recipe_wizard.js (imageSource, useManualScale, tested, zoom/fitZoom/zoomBy/fit/onWheel, pan onPanDown/Move/End con preventDefault, vpHeight, outcome/values con etichette, scaleSummary), task_editor.html (scelte → anteprime affiancate, DXF sm:col-start-2; mm/px solo con immagine da file; risultato sm:grid-cols-2: immagine con barra −/+/Adatta in sovrimpressione e pan a sinistra, esito/valori/parametri/errori a destra), messages.po. Commit1a19bb6,02f1481,bdef1f1,34e1b04,08616aa. PROVA: headless Edge 1500 e 900 px: risultati a destra; Adatta 21 %, + ×4 52 %, drag (-120,-80) → scroll +120/+80, cursore grabbing; Adatta → altezza viewport 435 (segue immagine); camera → campo mm/px nascosto; node test ok; suite frontend 9 fallimenti noti.