forked from 1b-agent/opencadstudio-upstream
PURGE left behind three classes of dead data that AutoCAD removes, so an OCS-purged drawing stayed far larger than AutoCAD's (a 23 MB test file purged to 3.5 MB in OCS vs 0.58 MB in AutoCAD): - Anonymous blocks (`*U`/`*D`/`*T`/dynamic-block variants) were skipped wholesale. Leftover unreferenced ones now purge like AutoCAD's, held live only when actually referenced. - Block liveness now comes from REACHABILITY: a block is kept only if it is reached from a real layout container by following block references (INSERT names, dimension *D, table *T / cell blocks, MultiLeader content). The old flat "named by some INSERT" scan could not free a mutually-referencing dead subgraph — e.g. the dependent blocks a detached xref leaves behind, whose head carried a DANGLING layout handle that `is_layout()` mistook for a real layout and shielded. That subgraph (here 467k lines) is now purged; live xrefs, reached from the layout that inserts them, stay. The used-set also gains the by-handle block references (table/MultiLeader/dimstyle-arrow) so purging anonymous blocks can't delete an in-use block no INSERT names. - SortEntitiesTable objects (per-block draw order) were never removed, so each purged block's table lingered still listing the handle of every deleted entity — 341k stale handles / ~2.7 MB of dead weight the save re-emitted. Drop every table whose owning block is gone. Net on the test file: 3.5 MB -> 0.81 MB (AutoCAD 0.58 MB). Co-Authored-By: Claude Fable 5 <[email protected]>