Crea ricetta da DXF: mm/px a mano per immagini da file #98

Closed
opened 2026-10-25 14:34:23 +00:00 by Adriano · 2 comments
Owner

COSA: nel wizard «Crea ricetta da DXF» (editor task maker) un campo mm/px opzionale che sostituisce la calibrazione della stazione.
PERCHÉ: Adriano 25/10/2026: con un'immagine da file (foto Menoncin B2997, Sider) la scala non c'è, il wizard pretende la stazione calibrata (canRun richiede calibrated) e la ricetta non si crea. Il backend accetta già px_per_mm (src/backend/api/routers/vision.py create_dxf_compare_recipe, Form px_per_mm) e il proxy maker lo inoltra (src/frontend/flask_app/blueprints/maker.py api_dxf_compare_recipe).
CRITERIO DI FATTO: con stazione non calibrata e mm/px inserito, «Prova» e «Salva ricetta» funzionano; la richiesta porta px_per_mm = 1/mm_per_px; senza mm/px il comportamento è quello di oggi.

COSA: nel wizard «Crea ricetta da DXF» (editor task maker) un campo mm/px opzionale che sostituisce la calibrazione della stazione. PERCHÉ: Adriano 25/10/2026: con un'immagine da file (foto Menoncin B2997, Sider) la scala non c'è, il wizard pretende la stazione calibrata (canRun richiede calibrated) e la ricetta non si crea. Il backend accetta già px_per_mm (src/backend/api/routers/vision.py create_dxf_compare_recipe, Form px_per_mm) e il proxy maker lo inoltra (src/frontend/flask_app/blueprints/maker.py api_dxf_compare_recipe). CRITERIO DI FATTO: con stazione non calibrata e mm/px inserito, «Prova» e «Salva ricetta» funzionano; la richiesta porta px_per_mm = 1/mm_per_px; senza mm/px il comportamento è quello di oggi.
Adriano added the sviluppo label 2026-10-25 14:34:23 +00:00
Author
Owner

ANALISI #98 (Opus)
RIF: gitea:Adriano/TieMeasureFlow#98, base ramo lavoro/daitarn-tmf-dxfcal 4b1b23c
COSA: campo «mm/px» opzionale nel wizard «Crea ricetta da DXF»; se valido sostituisce la calibrazione della stazione.
FILE:

  1. src/frontend/flask_app/static/js/dxf_recipe_wizard.js
    • stato nuovo mmPx: '' (stringa, accetta virgola decimale).
    • getter manualPxMm: parse di mmPx (replace ',' -> '.'), valido se finito e 0.00001 <= v <= 100 (stessi limiti di /camera/calibrazioni/manuale, #95); ritorna 1/v, altrimenti null.
    • canRun: stationId && (calibrated || manualPxMm) && imageFile && dxfFile && !busy.
    • run(): se manualPxMm != null aggiunge fd.append('px_per_mm', String(manualPxMm)); station_id resta inviato (serve per il worker della stazione).
  2. src/frontend/flask_app/templates/maker/task_editor.html, blocco «Crea ricetta da DXF» (#83, ~riga 662-700): sotto i messaggi di calibrazione della stazione, input testo «mm/px (immagine da file)» x-model="mmPx" inputmode="decimal", placeholder es. 0,01406; sotto, testo calcolato «= N px/mm» quando valido, oppure errore «mm/px non valido» quando compilato e non valido; nota breve: «Se compilato sostituisce la calibrazione della stazione; la scala resta salvata nella ricetta.» Il messaggio ambra «Stazione non calibrata…» resta, ma con mm/px valido aggiungere che si può procedere con il valore inserito (o nasconderlo: x-show con && !manualPxMm).
    Testi con _(), commenti {# #98 #} / // #98.
    TEST:
  • tests/test_dxf_recipe_routes.py (o file nuovo tests/test_dxf_wizard_mmpx.py): il proxy POST /maker/api/vision/tasks//recipe/dxf-compare inoltra px_per_mm al backend (api_client finto); senza px_per_mm il campo non viene inoltrato.
  • template: la pagina editor (task dxf_compare) contiene x-model="mmPx"; test_template_js_syntax resta verde; node --check static/js/dxf_recipe_wizard.js.
    NON TOCCARE: src/backend (accetta gia' px_per_mm), maker.py salvo bug nel proxy, vision_execute.js, task_execute.html, scripts/camera_service.py.
ANALISI #98 (Opus) RIF: gitea:Adriano/TieMeasureFlow#98, base ramo lavoro/daitarn-tmf-dxfcal 4b1b23c COSA: campo «mm/px» opzionale nel wizard «Crea ricetta da DXF»; se valido sostituisce la calibrazione della stazione. FILE: 1. src/frontend/flask_app/static/js/dxf_recipe_wizard.js - stato nuovo `mmPx: ''` (stringa, accetta virgola decimale). - getter `manualPxMm`: parse di mmPx (replace ',' -> '.'), valido se finito e 0.00001 <= v <= 100 (stessi limiti di /camera/calibrazioni/manuale, #95); ritorna 1/v, altrimenti null. - `canRun`: stationId && (calibrated || manualPxMm) && imageFile && dxfFile && !busy. - `run()`: se manualPxMm != null aggiunge fd.append('px_per_mm', String(manualPxMm)); station_id resta inviato (serve per il worker della stazione). 2. src/frontend/flask_app/templates/maker/task_editor.html, blocco «Crea ricetta da DXF» (#83, ~riga 662-700): sotto i messaggi di calibrazione della stazione, input testo «mm/px (immagine da file)» x-model="mmPx" inputmode="decimal", placeholder es. 0,01406; sotto, testo calcolato «= N px/mm» quando valido, oppure errore «mm/px non valido» quando compilato e non valido; nota breve: «Se compilato sostituisce la calibrazione della stazione; la scala resta salvata nella ricetta.» Il messaggio ambra «Stazione non calibrata…» resta, ma con mm/px valido aggiungere che si può procedere con il valore inserito (o nasconderlo: x-show con && !manualPxMm). Testi con _(), commenti {# #98 #} / // #98. TEST: - tests/test_dxf_recipe_routes.py (o file nuovo tests/test_dxf_wizard_mmpx.py): il proxy POST /maker/api/vision/tasks/<id>/recipe/dxf-compare inoltra px_per_mm al backend (api_client finto); senza px_per_mm il campo non viene inoltrato. - template: la pagina editor (task dxf_compare) contiene x-model="mmPx"; test_template_js_syntax resta verde; node --check static/js/dxf_recipe_wizard.js. NON TOCCARE: src/backend (accetta gia' px_per_mm), maker.py salvo bug nel proxy, vision_execute.js, task_execute.html, scripts/camera_service.py.
Author
Owner

Soluzione

ESITO: fatto
FILE: src/frontend/flask_app/static/js/dxf_recipe_wizard.js — campo mmPx, getter manualPxMm (virgola→punto, 0.00001..100, restituisce 1/v), canRun ammette mm/px valido senza stazione calibrata, run() invia px_per_mm; templates/maker/task_editor.html — input mm/px, riga «= N px/mm», errore «mm/px non valido», avviso «Stazione non calibrata» nascosto con mm/px valido.
TEST: test_manual_px_per_mm_forwarded (frontend).
COMMIT: 27d7c1e, su lavoro/daitarn-tmf-dxfcal (pushato in b78f242).
PROVA: pytest frontend → nessun fallimento nuovo rispetto alla base; backend accetta px_per_mm: dxf-compare con px_per_mm=71.11 e BMP Sider → HTTP 200; TMF daitarn riavviato 15:48 con il codice.

**Soluzione** ESITO: fatto FILE: src/frontend/flask_app/static/js/dxf_recipe_wizard.js — campo mmPx, getter manualPxMm (virgola→punto, 0.00001..100, restituisce 1/v), canRun ammette mm/px valido senza stazione calibrata, run() invia px_per_mm; templates/maker/task_editor.html — input mm/px, riga «= N px/mm», errore «mm/px non valido», avviso «Stazione non calibrata» nascosto con mm/px valido. TEST: test_manual_px_per_mm_forwarded (frontend). COMMIT: 27d7c1e, su lavoro/daitarn-tmf-dxfcal (pushato in b78f242). PROVA: pytest frontend → nessun fallimento nuovo rispetto alla base; backend accetta px_per_mm: dxf-compare con px_per_mm=71.11 e BMP Sider → HTTP 200; TMF daitarn riavviato 15:48 con il codice.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#98