Ricetta creata da DXF: riaprirla e modificarla nel wizard #105
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#105
COSA: una ricetta creata con «Crea ricetta da DXF» deve potersi modificare. Il wizard si riapre compilato con DXF, immagine di riferimento, mm/px, banda, soglia e polarità; si cambia, si prova e si salva sopra.
Richiesta di Adriano 25/10/2026: «se ho creato una ricetta con Crea ricetta da DXF devo poterla modificare».
STATO OGGI
VERIFICATO leggendo il codice, ramo lavoro/daitarn-tmf-dxfcal
711abc9.POST /api/vision/tasks/{id}/recipe/dxf-comparecon save=true, insrc/backend/api/routers/vision.py(~riga 383), salva sul task:task.vision_json= il grafo;task.vision_recipe_dir= la cartella immutabilevision/recipes/<task>/<digest>(vision_service.store_recipe_folder).recipe.json,disegno.dxfecalibrazione.json({"px_per_mm": f}).src/vision/costruttori.py::_graph):id="pezzo", kind LocateBlob:values.polarity('dark' | 'light');id="dxf", kind CompareDxf:values.band_plus(= banda mm) evalues.points_in_pct_nominal(= soglia %).vision_service.ensure_points_quotecrea la quota «Punti in tolleranza» (ltl = soglia) una volta sola. Se la soglia cambia, la quota resta col valore vecchio.CONTRATTO (identico per piano A e piano B)
GET /api/vision/tasks/{task_id}/recipe/dxf-compare/source(require_maker):pezzo/LocateBlob edxf/CompareDxf.px_per_mmviene dacalibrazione.jsondella cartella; null se manca o non è leggibile.dxfeimagesono i nomi dei file presenti nella cartella, null se assenti.GET /api/vision/tasks/{task_id}/recipe/files/{path:path}(require_maker):mimetypes, default application/octet-stream);vision_service._safe_join);GET /maker/api/vision/tasks/<id>/recipe/dxf-compare/source;GET /maker/api/vision/tasks/<id>/recipe/files/<path:path>.Entrambe inoltrano codice, corpo e content-type; i file passano come byte, non come JSON.
PIANO A — backend (worktree C:/Users/Adriano/lavoro/TieMeasureFlow-105a, ramo lavoro/daitarn-tmf-105a, base
711abc9)create_dxf_compare_recipecon save=true, l'immagine ricevuta si aggiunge ai file della cartella comeriferimento.<ext>:_IMAGE_EXTENSIONS[image.content_type], comeadd_reference_image;placedprima di_store_validate_assign, così finisce nel digest della cartella.PRIMA verificare che il worker
/validate(src/vision_worker/main.py ~riga 216 e il codice vs-task in vendor, sola lettura) e l'esecuzione accettino un file in più non citato in meta. Se lo rifiutano, fermarsi e riportarlo, senza aggirarlo.Nella risposta di save,
filesresta com'è oggi: la riga «File» del componente visionRecipe lo mostrerà./sourcecome da contratto. Funzione pura in vision_service,dxf_compare_source(graph, recipe_dir) -> dict | None, testabile senza DB./files/{path:path}come da contratto (FileResponse o Response con i byte).ensure_points_quote: se esiste già una quota convision_output == "dxf.points_in_pct"edescription == "Punti in tolleranza"(cioè creata da qui), la versione non ha misure eltl != min_points_pct, allora aggiornaltl = min_points_pct. Tutto il resto resta com'è. Ritorna True anche in quel caso. Aggiornare docstring e commento.TEST A
src/backend/tests/, sullo schema dei test esistenti di vision e dxf-compare (cercaretest_vision*edxf_comparenei test):riferimento.bmpo.pngnella cartella;/sourcerestituisce i valori di un grafo costruito come_graph, e 404 su un task senza ricetta o con un grafo non wizard;/filesrestituisce i byte, e 404 su../xe su un file assente;ensure_points_quoteaggiorna ltl.PYTHONPATH=. C:/Users/Adriano/lavoro/TieMeasureFlow-dxfcal-backend/.venv/Scripts/python.exe -m pytest src/backend/tests/<file> -q -p no:cacheprovider. Lanciare anche gli altri test vision del backend: non devono comparire fallimenti nuovi.NON TOCCARE (A): src/frontend/, src/vision/, vendor/**.
PIANO B — Flask e wizard (dopo il merge di #104: stessi file)
blueprints/maker.py, sul modello delle rotte vision esistenti (per i byte vedere come il proxy dicamera/grabrestituisce il blob).dxf_recipe_wizard.js:/source→existing(null se 404);existing, altrimenti «Crea ricetta da DXF»;existing:bandMm,minPointsPctedark = polarity === 'dark'dai valori salvati;mmPx= 1/px_per_mm (fino a 6 cifre significative, virgola);dxfFileeloadDxfPreview();imagec'è: fetch → File →_setImage, conimageSource = 'file';_()e voci .po, test JS col node, test delle rotte Flask, commenti «#105».PROVA (Opus): dopo il merge e il riavvio, headless Edge sul task 8 della ricetta 3.
_profilo.dxf+ sider_2_1.bmp, mm/px 0,01406, banda 0,3.Soluzione
ESITO: fatto. Ramo lavoro/daitarn-tmf-dxfcal (push
08616aa). FILE: src/backend/api/routers/vision.py (save salva riferimento. nella cartella; GET /tasks/{id}/recipe/dxf-compare/source; GET /tasks/{id}/recipe/files/{path}), src/backend/services/vision_service.py (dxf_compare_source, recipe_file_path, ensure_points_quote aggiorna ltl della quota «Punti in tolleranza» senza misure), blueprints/maker.py (2 proxy), dxf_recipe_wizard.js (existing, applyExisting, bottone «Modifica ricetta da DXF», contatori contro sovrascrittura), task_editor.html, messages.po; test src/backend/tests/test_vision_dxf_source.py (10). Commit6080e6a,9b8e729,39b9ad7,bdef1f1. PROVA dal vivo task 8: apertura compilata (banda 0.1, soglia 90, mm/px 0,014, DXF 1 entità, avviso immagine assente); Salva → riapertura con riferimento.bmp, avviso sparito; ricetta originale ripristinata (cartella b7068a6ca92f70f8). Ricette salvate prima di #105: niente immagine, va ricaricata una volta.