DXF a entità aperte: con banda larga il confronto non produce punti #103

Closed
opened 2026-10-25 15:08:48 +00:00 by Adriano · 2 comments
Owner

src/vision/costruttori.py build_dxf_compare: DXF MEVIS = 8 LINE/ARC aperti, sider_2_1 banda 0.2/0.3 → 422 «il confronto non ha prodotto punti» (cut_open_ends di compare_with_band). Con le entità unite in un contorno chiuso: banda 0.1-0.3 ok, 89-100% in banda.

src/vision/costruttori.py build_dxf_compare: DXF MEVIS = 8 LINE/ARC aperti, sider_2_1 banda 0.2/0.3 → 422 «il confronto non ha prodotto punti» (cut_open_ends di compare_with_band). Con le entità unite in un contorno chiuso: banda 0.1-0.3 ok, 89-100% in banda.
Adriano added the bug label 2026-10-25 15:08:48 +00:00
Author
Owner

ESITO: richiesta
COSA: DXF fatto di entità aperte (LINE/ARC in fila) → con banda larga il confronto DXF fallisce («disegno non sovrapponibile al pezzo: il confronto non ha prodotto punti»). Correzione: il costruttore unisce le entità aperte in contorni chiusi prima di costruire la ricetta e salva il DXF chiuso come disegno.dxf.

Segnalazione di Adriano 25/10/2026: «ho messo sider2 ma con banda 0,3 da errore di sovrapposizione. Se metto 0,2 funziona».

VERIFICATO (daitarn, build/venv313, src.vision.costruttori.build_dxf_compare, px_per_mm 71.1238, foto C:/Users/Adriano/Desktop/Sider foto e DXF/Foto/sider_2_*.bmp):

  • DXF DXF profilo/12.3X5.1MEVISS235JR_profilo.dxf = 8 entità aperte (4 LINE + 4 ARC r=1). sider_2_1: banda 0.1 ok (points_in_pct 63.6), 0.2 e 0.3 errore; sider_2_2: 0.1 ok (67.4), 0.2 ok, 0.3 errore. CompareDxf: «nessun punto del contorno misurato nella banda del disegno».
  • Causa: vendor/visionsuite/packages/vs-dxf/src/visionsuite/dxf/band.py::compare_with_band con cut_open_ends=True taglia il contorno misurato agli estremi di ogni entità DXF aperta (_remove_edge_parts); per le LINE non resta mai nulla in banda, per gli ARC con banda 0.3 nemmeno. Con il disegno spezzato i numeri sono anche sbagliati (distance_avg 0.086 mm).
  • Stesso DXF unito in UNA LWPOLYLINE chiusa (ezdxf 1.4.4 edgeminer.Deposit(edges, gap_tol=1e-3) + find_all_loops + edgesmith.lwpolyline_from_chain, script C:/Users/Adriano/AppData/Local/Temp/claude/D--Sorgenti-AI-OS/9b03ae07-a674-41a9-831d-0acc7b8b7e44/scratchpad/chiudi_dxf.py): sider_2_1..4 con banda 0.1/0.2/0.3 tutte costruite, points_in_pct 89-100, distance_avg 0.02-0.03 mm. PR165 chiuso su sider_3_1/2: banda 0.1 e 0.3 ok (94-100).

MODIFICHE

  1. src/vision/costruttori.py: funzione pura chiudi_contorni(dxf_bytes: bytes) -> tuple[bytes, dict]:
    • legge con ezdxf (da file temporaneo come oggi); entità già chiuse (LWPOLYLINE/POLYLINE chiuse, CIRCLE, ELLIPSE intera, SPLINE chiusa) restano come sono;
    • le entità aperte supportate da edgesmith.edges_from_entities_2d (LINE, ARC, LWPOLYLINE aperta, …) vanno in edgeminer.Deposit(..., gap_tol=0.01) (mm; giunzioni dei disegni CAD); find_all_loops; scelta golosa dei loop dal più lungo, ogni edge usato una volta; ogni loop → LWPOLYLINE chiusa (lwpolyline_from_chain), stesso layer dell'entità di partenza se ricavabile;
    • le entità aperte non finite in nessun loop restano nel DXF come prima (copiate);
    • scrive un DXF R2010 nuovo e ritorna (bytes, {"anelli": n, "entita_unite": k, "entita_libere": m});
    • se non c'è nulla da unire (nessun loop) ritorna i byte originali invariati (sha256 invariato → ricette esistenti stabili);
    • se ezdxf non legge il file: nessuna eccezione nuova, ritorna i byte originali (l'errore «DXF illeggibile» resta quello di oggi, più avanti).
  2. build_dxf_compare (costruttori.py ~riga 191): dxf_bytes, info = chiudi_contorni(dxf_bytes) subito dopo il controllo DXF vuoto e PRIMA di dxf_sha = hashlib.sha256(dxf_bytes): così disegno.dxf nella ricetta, lo sha nel grafo e il runtime (CompareDxf su disegno.dxf) usano il DXF chiuso.
  3. src/vision_worker/main.py::_dxf_preview (#101): applica chiudi_contorni prima della lettura, così l'anteprima mostra ciò che il confronto userà (MEVIS: «1 entità» invece di 8).
  4. Commento breve «#103» su ogni modifica.

TEST (worker): in src/vision_worker/tests/test_dxf_compare.py (o file nuovo accanto), sincroni come quelli di #101 (venv313 non ha pytest-asyncio): rettangolo fatto di 4 LINE → 1 LWPOLYLINE chiusa, bbox invariato; LINE+ARC (asola) → 1 anello con bulge; un DXF già chiuso → byte identici; LINE isolata → resta, anelli=0 → byte identici; byte non DXF → ritornati identici. Se possibile un test di build_dxf_compare su immagine sintetica (rettangolo nero su bianco) con DXF a 4 LINE e banda 0.3 che prima falliva e ora passa. Comando: C:/Users/Adriano/lavoro/TieMeasureFlow-dxfcal/build/venv313/Scripts/python.exe -m pytest <file> -q -p no:cacheprovider -k "chiudi or preview" dalla radice del worktree.
NON TOCCARE: vendor/visionsuite/** (TieVision-Core: il comportamento di cut_open_ends resta), src/backend/, src/frontend/.
PROVA (Opus): dopo merge e riavvio, ricetta da DXF profilo/12.3X5.1MEVISS235JR_profilo.dxf (quello aperto) con sider_2_1.bmp, mm/px 0,01406, banda 0,3 → ricetta creata, points_in_pct ≈ 100.

ESITO: richiesta COSA: DXF fatto di entità aperte (LINE/ARC in fila) → con banda larga il confronto DXF fallisce («disegno non sovrapponibile al pezzo: il confronto non ha prodotto punti»). Correzione: il costruttore unisce le entità aperte in contorni chiusi prima di costruire la ricetta e salva il DXF chiuso come disegno.dxf. Segnalazione di Adriano 25/10/2026: «ho messo sider2 ma con banda 0,3 da errore di sovrapposizione. Se metto 0,2 funziona». VERIFICATO (daitarn, build/venv313, `src.vision.costruttori.build_dxf_compare`, px_per_mm 71.1238, foto `C:/Users/Adriano/Desktop/Sider foto e DXF/Foto/sider_2_*.bmp`): - DXF `DXF profilo/12.3X5.1MEVISS235JR_profilo.dxf` = 8 entità aperte (4 LINE + 4 ARC r=1). sider_2_1: banda 0.1 ok (points_in_pct 63.6), 0.2 e 0.3 errore; sider_2_2: 0.1 ok (67.4), 0.2 ok, 0.3 errore. CompareDxf: «nessun punto del contorno misurato nella banda del disegno». - Causa: `vendor/visionsuite/packages/vs-dxf/src/visionsuite/dxf/band.py::compare_with_band` con `cut_open_ends=True` taglia il contorno misurato agli estremi di ogni entità DXF aperta (`_remove_edge_parts`); per le LINE non resta mai nulla in banda, per gli ARC con banda 0.3 nemmeno. Con il disegno spezzato i numeri sono anche sbagliati (distance_avg 0.086 mm). - Stesso DXF unito in UNA LWPOLYLINE chiusa (ezdxf 1.4.4 `edgeminer.Deposit(edges, gap_tol=1e-3)` + `find_all_loops` + `edgesmith.lwpolyline_from_chain`, script `C:/Users/Adriano/AppData/Local/Temp/claude/D--Sorgenti-AI-OS/9b03ae07-a674-41a9-831d-0acc7b8b7e44/scratchpad/chiudi_dxf.py`): sider_2_1..4 con banda 0.1/0.2/0.3 tutte costruite, points_in_pct 89-100, distance_avg 0.02-0.03 mm. PR165 chiuso su sider_3_1/2: banda 0.1 e 0.3 ok (94-100). MODIFICHE 1. `src/vision/costruttori.py`: funzione pura `chiudi_contorni(dxf_bytes: bytes) -> tuple[bytes, dict]`: - legge con ezdxf (da file temporaneo come oggi); entità già chiuse (LWPOLYLINE/POLYLINE chiuse, CIRCLE, ELLIPSE intera, SPLINE chiusa) restano come sono; - le entità aperte supportate da `edgesmith.edges_from_entities_2d` (LINE, ARC, LWPOLYLINE aperta, …) vanno in `edgeminer.Deposit(..., gap_tol=0.01)` (mm; giunzioni dei disegni CAD); `find_all_loops`; scelta golosa dei loop dal più lungo, ogni edge usato una volta; ogni loop → LWPOLYLINE chiusa (`lwpolyline_from_chain`), stesso layer dell'entità di partenza se ricavabile; - le entità aperte non finite in nessun loop restano nel DXF come prima (copiate); - scrive un DXF R2010 nuovo e ritorna (bytes, {"anelli": n, "entita_unite": k, "entita_libere": m}); - se non c'è nulla da unire (nessun loop) ritorna i byte originali invariati (sha256 invariato → ricette esistenti stabili); - se ezdxf non legge il file: nessuna eccezione nuova, ritorna i byte originali (l'errore «DXF illeggibile» resta quello di oggi, più avanti). 2. `build_dxf_compare` (costruttori.py ~riga 191): `dxf_bytes, info = chiudi_contorni(dxf_bytes)` subito dopo il controllo DXF vuoto e PRIMA di `dxf_sha = hashlib.sha256(dxf_bytes)`: così disegno.dxf nella ricetta, lo sha nel grafo e il runtime (CompareDxf su disegno.dxf) usano il DXF chiuso. 3. `src/vision_worker/main.py::_dxf_preview` (#101): applica `chiudi_contorni` prima della lettura, così l'anteprima mostra ciò che il confronto userà (MEVIS: «1 entità» invece di 8). 4. Commento breve «#103» su ogni modifica. TEST (worker): in `src/vision_worker/tests/test_dxf_compare.py` (o file nuovo accanto), sincroni come quelli di #101 (venv313 non ha pytest-asyncio): rettangolo fatto di 4 LINE → 1 LWPOLYLINE chiusa, bbox invariato; LINE+ARC (asola) → 1 anello con bulge; un DXF già chiuso → byte identici; LINE isolata → resta, anelli=0 → byte identici; byte non DXF → ritornati identici. Se possibile un test di `build_dxf_compare` su immagine sintetica (rettangolo nero su bianco) con DXF a 4 LINE e banda 0.3 che prima falliva e ora passa. Comando: `C:/Users/Adriano/lavoro/TieMeasureFlow-dxfcal/build/venv313/Scripts/python.exe -m pytest <file> -q -p no:cacheprovider -k "chiudi or preview"` dalla radice del worktree. NON TOCCARE: `vendor/visionsuite/**` (TieVision-Core: il comportamento di cut_open_ends resta), src/backend/**, src/frontend/**. PROVA (Opus): dopo merge e riavvio, ricetta da `DXF profilo/12.3X5.1MEVISS235JR_profilo.dxf` (quello aperto) con sider_2_1.bmp, mm/px 0,01406, banda 0,3 → ricetta creata, points_in_pct ≈ 100.
Author
Owner

Soluzione

ESITO: fatto. Ramo lavoro/daitarn-tmf-dxfcal (push 08616aa). FILE: src/vision/costruttori.py chiudi_contorni() (ezdxf edgeminer Deposit gap_tol 0.01 + find_all_loops → LWPOLYLINE chiuse; byte originali se nessun loop o errore), chiamata in build_dxf_compare prima dello sha256 e in src/vision_worker/main.py _dxf_preview. Test src/vision_worker/tests/test_chiudi_contorni.py (8). Commit 77419f9, merge 711abc9. PROVA dal vivo: POST /api/vision/tasks/8/recipe/dxf-compare con 12.3X5.1MEVISS235JR_profilo.dxf (8 entità aperte) + sider_2_1.bmp px/mm 71.1238: banda 0.2 e 0.3 → pass, points_in_pct 100, distance_avg 0.028 mm (prima 0.3 = errore «non sovrapponibile»); dxf-preview → entita 1, 12.3 × 5.1 mm.

**Soluzione** ESITO: fatto. Ramo lavoro/daitarn-tmf-dxfcal (push 08616aa). FILE: src/vision/costruttori.py chiudi_contorni() (ezdxf edgeminer Deposit gap_tol 0.01 + find_all_loops → LWPOLYLINE chiuse; byte originali se nessun loop o errore), chiamata in build_dxf_compare prima dello sha256 e in src/vision_worker/main.py _dxf_preview. Test src/vision_worker/tests/test_chiudi_contorni.py (8). Commit 77419f9, merge 711abc9. PROVA dal vivo: POST /api/vision/tasks/8/recipe/dxf-compare con 12.3X5.1MEVISS235JR_profilo.dxf (8 entità aperte) + sider_2_1.bmp px/mm 71.1238: banda 0.2 e 0.3 → pass, points_in_pct 100, distance_avg 0.028 mm (prima 0.3 = errore «non sovrapponibile»); dxf-preview → entita 1, 12.3 × 5.1 mm.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#103