Operatore, pannello visione: zoom −/+/Adatta in overlay sull'immagine #115
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?
Chiesto da Adriano in fiera il 28/10/2026: sull'immagine del task camera/DXF dell'operatore (templates/measure/task_execute.html, pannello visionExecute) mancano zoom +/− e Adatta, come in Acquisizione (#111) e nel wizard DXF (#113). Fatto: barra in overlay sull'immagine con −, +, Adatta e percentuale; Ctrl+rotella e trascinamento; all'apertura l'immagine resta in fit come oggi (#96), senza scorrimento del pannello.
ANALISI (Opus, passo 1)
COSA: zoom −/+/Adatta/% in overlay sull'immagine del pannello visione dell'operatore, Ctrl+rotella, trascinamento; all'apertura fit come oggi (#96). Stesso schema del wizard DXF (#113:
static/js/dxf_recipe_wizard.jsmetodi_vpEl,_vLimits,vFit,vZoomBy,vWheel,vPan*; commit45c9e6c04b81ad198c6c6), qui per una sola vista.FILE:
src/frontend/flask_app/templates/measure/task_execute.html~579-583, riquadrox-show="shownImage"(restarelative flex-1 min-h-0 ... overflow-hidden):absolute top-2 right-2 z-10con − (zoomBy(0.8)), + (zoomBy(1.25)), Adatta (zFit()), percentualex-text="zPct()"; classi come la barra di #113 intemplates/maker/task_editor.html~729-785.x-ref="vp"class="absolute inset-0"con SOLO:stylestringa (overflow:auto;touch-action:none;user-select:none;display:flex;cursor:...),@wheel="zWheel($event)",@pointerdown/move/up/cancel→zPanDown/zPanMove/zPanEnd.class="relative"con:style="'margin:auto;flex:none;' + zSize()"(width:Wpx;height:Hpx= naturale × zoom; prima del loadwidth:100%;height:100%).img x-ref="img"ecanvas x-ref="overlay"dentro il wrapper,absolute inset-0 w-full h-full object-containcome ora;img @load="onImgLoad()".FILE:
src/frontend/flask_app/static/js/vision_execute.js, componentevisionExecute():z: { zoom: 1, fit: 1, w: 0, h: 0, auto: true },_zPan: null,_zRO: null.onImgLoad(): se cambiano le dimensioni naturali oz.autoè vero → aggiornaz.w/z.hezFit(); altrimenti tiene lo zoom (in linea il frame nuovo resta ingrandito); poidrawOverlay();_zObserve()(ResizeObserver suvp, rifà il fit solo sez.auto)._zArea(): area utile =offsetWidth/offsetHeightmeno i bordi dagetComputedStyle(come198c6c6:client*escludono le barre di scorrimento); senzaoffsetWidth(test)clientWidth/clientHeight.zFit():fit = min(cw/w, ch/h),zoom = fit,auto = true, scroll a 0.zoomBy(f, cx, cy): limiti[fit*0.5, max(8, fit)]; punto (cx, cy) del viewport fermo (default centro):scrollLeft = (scrollLeft + cx) * nuovo/vecchio - cxdopo$nextTick;auto = false.zWheel(ev): solo conctrlKey(preventDefault), fattore 1.25/0.8 al cursore.zCanPan(),zCursor()(grab/grabbing/default),zPanDown/Move/Endcon pointer capture, spostanoscrollLeft/scrollTop.zPct()=Math.round(zoom*100) + '%';zSize().TRAPPOLE (viste in #113): Alpine 3.15.12 con
:stylestringa fasetAttribute('style')e cancella lostylestatico → nientestyle=statico sugli elementi con:style; maix-showe:stylestringa sullo stesso elemento.TEST: nuovo
src/frontend/flask_app/tests/js/test_vision_zoom.js(node + vm, stiletests/js/test_dxf_zoom.js): fit con$refs.vpfinto (offsetWidth/offsetHeight +getComputedStylefinto con bordi), limiti dizoomBy,autofalse/true,zSizeprima e dopo il load, frame nuovo con stesse dimensioni che tiene lo zoom; wrappertests/test_vision_zoom_js.py(skip senza node). Aggiornaretests/test_vision_panel_fit.pyalla struttura nuova mantenendo l'intento #96: pannellooverflow-hidden min-h-0, riquadroflex-1 min-h-0 overflow-hidden,vpconoverflow:auto, img e canvasobject-contain.NON TOCCARE: backend, wizard DXF, altre pagine, logica di acquisizione/check/record,
rows.label(#114).RAMO:
lavoro/daitarn-tmf-pannellodalavoro/daitarn-tmf-dxfcal(7a1df0b). Ordine dei commit: #115, #117, #116.🔵 daitarn — preso in carico 2026-10-28T15:45:07Z
ramo:
lavoro/daitarn· capacità: build-windows, gpuSoluzione
ESITO: fatto. Zoom −/+/Adatta/% in overlay, Ctrl+rotella, trascinamento sul riquadro immagine del pannello visione; fit all'apertura (#96), zoom tenuto fra frame in linea di uguali dimensioni. FILE: src/frontend/flask_app/static/js/vision_execute.js (z, onImgLoad, zFit, zoomBy, zWheel, zPan*), templates/measure/task_execute.html (barra, viewport x-ref=vp, wrapper naturale×zoom). TEST: tests/js/test_vision_zoom.js + tests/test_vision_zoom_js.py, test_vision_panel_fit.py aggiornato. Ramo lavoro/daitarn-tmf-dxfcal
4a11d25(merge4485803), pytest pannello 37 passed. Installato sul PC fiera DESKTOP-RABEHJJ con riavvio TMF il 28/10, backup C:\Tielogic\backup\pre-115.