Operatore, pannello visione: disegnare tutte le forme dell'overlay e le quote sull'immagine #116

Closed
opened 2026-10-28 15:41:17 +00:00 by Adriano · 3 comments
Owner

Chiesto da Adriano in fiera il 28/10/2026. static/js/vision_execute.js drawOverlay disegna solo gli elementi con rows/cols (points, contour): segment, line, rect2, circle, arc vengono saltati. Su TEST1 task 14 il motore manda 25 elementi (7 segment, 4 rect2 roi, 8 arc, 4 circle, 1 points, 1 contour) e l'operatore vede solo il contorno del pezzo. Fatto: tutte le forme disegnate con le convenzioni di TieVision-Studio (frontend/src/comune/overlay.js) e, per ogni quota con uscita di visione, un'etichetta 'nome valore unità' colorata per esito, agganciata alla geometria del suo strumento (come etichetteMisure/ancoraOverlay di Studio, frontend/src/editor/misure.js).

Chiesto da Adriano in fiera il 28/10/2026. static/js/vision_execute.js drawOverlay disegna solo gli elementi con rows/cols (points, contour): segment, line, rect2, circle, arc vengono saltati. Su TEST1 task 14 il motore manda 25 elementi (7 segment, 4 rect2 roi, 8 arc, 4 circle, 1 points, 1 contour) e l'operatore vede solo il contorno del pezzo. Fatto: tutte le forme disegnate con le convenzioni di TieVision-Studio (frontend/src/comune/overlay.js) e, per ogni quota con uscita di visione, un'etichetta 'nome valore unità' colorata per esito, agganciata alla geometria del suo strumento (come etichetteMisure/ancoraOverlay di Studio, frontend/src/editor/misure.js).
Adriano added the sviluppo label 2026-10-28 15:41:17 +00:00
Author
Owner

ANALISI (Opus, passo 1)
COSA: il pannello visione disegna tutte le forme dell'overlay (rect2, segment, line, circle, arc, points, contour) e un'etichetta per quota «nome valore unità» colorata per esito, agganciata alla geometria del suo strumento. Riferimento da portare: TieVision-Studio frontend/src/comune/overlay.js (convenzioni e forme) e frontend/src/editor/misure.js (ancoraOverlay, etichetteMisure); copia locale in C:/Users/Adriano/lavoro/TieVision-Assistant/vendor/TieVision-Studio/frontend/src/.
CONVENZIONI (Studio, vs-tools/detect.py): coordinate immagine row = y, col = x; angoli in gradi, positivi antiorari a video; punto su cerchio ad a gradi = (col + r cos a, row − r sin a); rect2 = centro, phi_deg, semi-lati length1 lungo phi e length2 perpendicolare; arc = start_deg + extent_deg (positivo antiorario). Su canvas: g.arc(col, row, r, -rad(start), -rad(start+extent), extent > 0).
FILE: nuovo src/frontend/flask_app/static/js/vision_overlay.js, script semplice con globale VisionOverlay = { draw, anchor, labels } e module.exports se module esiste (test node):

  • draw(g, overlay, lw): una forma per elemento; colore per ruolo (reference #2563eb, found #16a34a, roi #f59e0b, altro #ef4444); roi tratteggiata (setLineDash([lw*3, lw*2]), spessore lw*0.75, poi setLineDash([])); points = croci di semi-lato max(3, lw*2); contour = polilinea; tipo ignoto o numeri non finiti → saltato senza errori.
  • anchor(o): porting di ancoraOverlay (segment/line punto medio, circle centro + raggio a destra, arc punto medio, points primo punto, rect2 centro, contour punto a metà).
  • labels(rows, overlay): per ogni riga con vision_output tool.proprietà prende gli elementi con tool_id === tool; ancora dal primo role: 'found' che ne dà una, altrimenti da qualsiasi; testo name + ' ' + value.toFixed(3) + ' ' + unit; righe senza ancora (Formula) → nessuna etichetta. Ritorna [{key, x, y, text, status}].
    FILE: src/frontend/flask_app/static/js/vision_execute.js: rows aggiunge name (description || measurement_type || '#id') e vision_output, senza cambiare label (#114); drawOverlay usa VisionOverlay.draw(g, overlay, lineWidth) (lineWidth come oggi); getter overlayLabels = VisionOverlay.labels(...) con left/top in percentuale delle dimensioni naturali (x / w * 100 + '%'); labelClass(status): pass bg-green-600 text-white, warning bg-amber-400 text-black, fail bg-red-600 text-white, altro bg-gray-700 text-white.
    FILE: src/frontend/flask_app/templates/measure/task_execute.html: <script src=".../js/vision_overlay.js"> prima di vision_execute.js (~1179); dentro il wrapper dello zoom (#115), dopo il canvas, <template x-for="l in overlayLabels" :key="l.key"> con div absolute pointer-events-none whitespace-nowrap text-xs font-bold px-1.5 py-0.5 rounded shadow, :class="labelClass(l.status)", solo :style stringa con left/top + transform:translate(8px,-50%), x-text="l.text". Le etichette restano della stessa dimensione a ogni zoom perché sono HTML in percentuale.
    TEST: nuovo src/frontend/flask_app/tests/js/test_vision_overlay.js con il fixture vero src/frontend/flask_app/tests/js/fixtures/vision_check_task14.json (risposta di /api/vision/check del task 14 TEST1 sul PC fiera: 25 elementi overlay, measurements 12, _subtasks 12 quote): canvas finto che registra le chiamate; sul fixture 25 elementi disegnati e 0 saltati; rect2 con phi 0 → vertici col±l1, row±l2; arc → argomenti di g.arc attesi; elemento malformato e tipo ignoto saltati; anchor per ogni tipo; labels sul fixture = 6 etichette (larghezza, lunghezza, R_tl, R_tr, R_br, R_bl), nessuna per le 6 differenze (Formula); il testo della quota 15 contiene Larghezza e 1.668. Wrapper tests/test_vision_overlay_js.py (skip senza node). tests/test_template_js_syntax.py deve restare verde.
    NON TOCCARE: backend, wizard DXF, rows.label (#114), logica di acquisizione/check/record.
    RAMO: lavoro/daitarn-tmf-pannello, commit dopo #115 e #117.
ANALISI (Opus, passo 1) COSA: il pannello visione disegna tutte le forme dell'overlay (rect2, segment, line, circle, arc, points, contour) e un'etichetta per quota «nome valore unità» colorata per esito, agganciata alla geometria del suo strumento. Riferimento da portare: TieVision-Studio `frontend/src/comune/overlay.js` (convenzioni e forme) e `frontend/src/editor/misure.js` (`ancoraOverlay`, `etichetteMisure`); copia locale in `C:/Users/Adriano/lavoro/TieVision-Assistant/vendor/TieVision-Studio/frontend/src/`. CONVENZIONI (Studio, vs-tools/detect.py): coordinate immagine row = y, col = x; angoli in gradi, positivi antiorari a video; punto su cerchio ad a gradi = (col + r cos a, row − r sin a); rect2 = centro, `phi_deg`, semi-lati `length1` lungo phi e `length2` perpendicolare; arc = `start_deg` + `extent_deg` (positivo antiorario). Su canvas: `g.arc(col, row, r, -rad(start), -rad(start+extent), extent > 0)`. FILE: nuovo `src/frontend/flask_app/static/js/vision_overlay.js`, script semplice con globale `VisionOverlay = { draw, anchor, labels }` e `module.exports` se `module` esiste (test node): - `draw(g, overlay, lw)`: una forma per elemento; colore per ruolo (reference `#2563eb`, found `#16a34a`, roi `#f59e0b`, altro `#ef4444`); roi tratteggiata (`setLineDash([lw*3, lw*2])`, spessore `lw*0.75`, poi `setLineDash([])`); points = croci di semi-lato `max(3, lw*2)`; contour = polilinea; tipo ignoto o numeri non finiti → saltato senza errori. - `anchor(o)`: porting di `ancoraOverlay` (segment/line punto medio, circle centro + raggio a destra, arc punto medio, points primo punto, rect2 centro, contour punto a metà). - `labels(rows, overlay)`: per ogni riga con `vision_output` `tool.proprietà` prende gli elementi con `tool_id === tool`; ancora dal primo `role: 'found'` che ne dà una, altrimenti da qualsiasi; testo `name + ' ' + value.toFixed(3) + ' ' + unit`; righe senza ancora (Formula) → nessuna etichetta. Ritorna `[{key, x, y, text, status}]`. FILE: `src/frontend/flask_app/static/js/vision_execute.js`: `rows` aggiunge `name` (description || measurement_type || '#id') e `vision_output`, senza cambiare `label` (#114); `drawOverlay` usa `VisionOverlay.draw(g, overlay, lineWidth)` (lineWidth come oggi); getter `overlayLabels` = `VisionOverlay.labels(...)` con `left/top` in percentuale delle dimensioni naturali (`x / w * 100 + '%'`); `labelClass(status)`: pass `bg-green-600 text-white`, warning `bg-amber-400 text-black`, fail `bg-red-600 text-white`, altro `bg-gray-700 text-white`. FILE: `src/frontend/flask_app/templates/measure/task_execute.html`: `<script src=".../js/vision_overlay.js">` prima di `vision_execute.js` (~1179); dentro il wrapper dello zoom (#115), dopo il canvas, `<template x-for="l in overlayLabels" :key="l.key">` con div `absolute pointer-events-none whitespace-nowrap text-xs font-bold px-1.5 py-0.5 rounded shadow`, `:class="labelClass(l.status)"`, solo `:style` stringa con `left/top` + `transform:translate(8px,-50%)`, `x-text="l.text"`. Le etichette restano della stessa dimensione a ogni zoom perché sono HTML in percentuale. TEST: nuovo `src/frontend/flask_app/tests/js/test_vision_overlay.js` con il fixture vero `src/frontend/flask_app/tests/js/fixtures/vision_check_task14.json` (risposta di `/api/vision/check` del task 14 TEST1 sul PC fiera: 25 elementi overlay, `measurements` 12, `_subtasks` 12 quote): canvas finto che registra le chiamate; sul fixture 25 elementi disegnati e 0 saltati; rect2 con phi 0 → vertici `col±l1`, `row±l2`; arc → argomenti di `g.arc` attesi; elemento malformato e tipo ignoto saltati; `anchor` per ogni tipo; `labels` sul fixture = 6 etichette (larghezza, lunghezza, R_tl, R_tr, R_br, R_bl), nessuna per le 6 differenze (Formula); il testo della quota 15 contiene `Larghezza` e `1.668`. Wrapper `tests/test_vision_overlay_js.py` (skip senza node). `tests/test_template_js_syntax.py` deve restare verde. NON TOCCARE: backend, wizard DXF, `rows.label` (#114), logica di acquisizione/check/record. RAMO: `lavoro/daitarn-tmf-pannello`, commit dopo #115 e #117.
Adriano added the assegnata:daitarn label 2026-10-28 15:45:13 +00:00
Author
Owner

🔵 daitarn — preso in carico 2026-10-28T15:45:10Z
ramo: lavoro/daitarn · capacità: build-windows, gpu

🔵 daitarn — **preso in carico** 2026-10-28T15:45:10Z ramo: `lavoro/daitarn` · capacità: build-windows, gpu
Author
Owner

Soluzione

ESITO: fatto. Il pannello visione disegna tutte le forme dell'overlay (rect2, segment, line, circle, arc, points, contour; roi tratteggiata) e un'etichetta HTML per quota «nome valore unità» colorata per esito, ancorata alla geometria dello strumento (porting di overlay.js e ancoraOverlay di TieVision-Studio). Le Formula non hanno etichetta. FILE: nuovo static/js/vision_overlay.js (VisionOverlay.draw/anchor/labels), static/js/vision_execute.js (drawOverlay, overlayLabels, labelClass), templates/measure/task_execute.html (script e strato etichette). TEST: tests/js/test_vision_overlay.js (43 controlli sul fixture vero tests/js/fixtures/vision_check_task14.json) + wrapper. Ramo lavoro/daitarn-tmf-dxfcal b46ccba acd94a9 merge 4485803, installato in fiera il 28/10. Noto: a zoom basso le etichette di quote vicine si sovrappongono (come nello Studio).

**Soluzione** ESITO: fatto. Il pannello visione disegna tutte le forme dell'overlay (rect2, segment, line, circle, arc, points, contour; roi tratteggiata) e un'etichetta HTML per quota «nome valore unità» colorata per esito, ancorata alla geometria dello strumento (porting di overlay.js e ancoraOverlay di TieVision-Studio). Le Formula non hanno etichetta. FILE: nuovo static/js/vision_overlay.js (VisionOverlay.draw/anchor/labels), static/js/vision_execute.js (drawOverlay, overlayLabels, labelClass), templates/measure/task_execute.html (script e strato etichette). TEST: tests/js/test_vision_overlay.js (43 controlli sul fixture vero tests/js/fixtures/vision_check_task14.json) + wrapper. Ramo lavoro/daitarn-tmf-dxfcal b46ccba acd94a9 merge 4485803, installato in fiera il 28/10. Noto: a zoom basso le etichette di quote vicine si sovrappongono (come nello Studio).
Adriano removed the assegnata:daitarn label 2026-10-28 16:05:53 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#116