* dxf: proxy objects and entities keep their class through a save (#1812) A proxy (ACAD_PROXY_OBJECT, ACAD_PROXY_ENTITY) names its class by number in group 91: 500 plus the class's place in the CLASSES section (DXF Reference). Saving rewrites CLASSES (CADCraft's own classes, then the kept ones), but kept proxies were written with their read number, which then named another class: an R14 file's visual styles came back as SCALE, TABLESTYLE or MLEADERSTYLE, and numbers past the last class stayed. The reader now keeps the file's class order (Foreign::class_order) when the file has proxies, and the CLASS records its proxies name. The writer renumbers each kept proxy to its class's place in the written CLASSES and drops a proxy whose number names no class (with what it owns and its dictionary entry). The DWG bridge writes through the same path. Test proxies_keep_their_class_when_classes_are_rewritten (a file with VISUALSTYLE and WIDGETX first in CLASSES, proxies of both and of a number past the last class, and a proxy entity; also through a second save). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019Nnsfu3QGqjD1aFZbBgUWP * docs: the proxy class fix is for DXF save (#1812) From the local CodeRabbit review: DWG save drops proxy entities (acadrust) and proxy objects through DWG weren't checked, so the progress log says DXF. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019Nnsfu3QGqjD1aFZbBgUWP * dxf: a proxy's class number is found outside 102 groups (#1812) From the PR review: an application's 102 {NAME ... 102 } group before a proxy's own groups can hold a group 91, which was read as the class number and overwritten on save. class_group finds the first 91 outside 102 groups (before xdata), for reading and renumbering alike (test proxies_keep_their_class_when_classes_are_rewritten, now with a {MYAPP group holding a 91 that stays as it was). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019Nnsfu3QGqjD1aFZbBgUWP --------- Co-authored-by: Tyrel Haveman <1434399+tyrel@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Brandon Thomas <echelon@gmail.com>
12 KiB
CADCraft roadmap
Stage: pre-alpha · next: alpha, ~2 points (38% → 40% ready for real work) and ~125–190 Opus 5.5 hours away (the four failing core workflows of the alpha gate)
Last reviewed: 2026-10-10 · Last updated: 2026-10-21 · Change: trivial (progress log: proxy objects keep their class through a save, #1812; previously minor: HATCHEDIT boundary add/remove progress) · Target: Autodesk AutoCAD 2027
CADCraft targets full parity with AutoCAD (2D drafting first, then annotation, layouts and plotting, DWG, parametrics and 3D), plus what AutoCAD doesn't have: agent control over MCP, a scriptable CLI, a web build, Linux and FreeBSD builds, and a free licence.
Why pre-alpha: four of AutoCAD's five core workflows fail the alpha gate. Precise drafting lacks object snap tracking and has stubbed TRIM/EXTEND/OFFSET options; blocks can't be edited in a block editor (REFEDIT edits them in place, xrefs not yet); plots ignore plot styles; and a DWG saved by CADCraft drops everything it doesn't model and has never been checked in AutoCAD. Dimensioning passes. Ready for real work (≈ 38%) is also under the ~40% alpha bar. Beta is ≈ 600–930 h away.
Headline numbers
| Number | Value | Kind |
|---|---|---|
| Feature breadth (AutoCAD for Mac menu items with a live command) | 50% (245 / 491; 2D menus only ≈ 65%) | measured (parity-checklist.md + UI-only commands) |
| Ready for real work | ≈ 38% | estimated (target-app-parity.md) |
| Mainstream practitioner (2D drafter) | ≈ 28% (lower than the full number: file exchange, stability and interaction discounts multiply) | estimated (target-app-parity.md) |
| Essentials user | ≈ 46% | estimated (target-app-parity.md) |
| Remaining to alpha | ≈ 125–190 h (the gate rows) | estimated |
| Remaining to beta | ≈ 600–930 h (≈ 150–250 h elapsed with 4–6 agents) | estimated |
| Remaining to full parity | ≈ 1,300–2,100 h (≈ 330–550 h elapsed) | estimated |
Readiness by audience
| Audience | Ready % | Opus 5.5 agent wall-clock hours to ~95% | Work that dominates |
|---|---|---|---|
| Full target (ready for real work) | ≈ 38% | ≈ 1,150–1,850 h (≈ 70% parallelises across 4–6 agents: ≈ 300–480 h elapsed) | 3D kernel (300–450 h), DWG/DXF and other formats, AutoLISP and ecosystem, blocks/xrefs/dynamic blocks, localization |
| Mainstream practitioner (2D drafter) | ≈ 28% | ≈ 570–880 h (≈ 70% parallelises: ≈ 150–240 h elapsed) | lossless DWG exchange and a real-file corpus, precision input (tracking, dynamic input), 2D geometry precision, blocks/xrefs, annotation depth, stability backlog |
| Essentials user | ≈ 46% | ≈ 140–225 h (≈ 50% parallelises across 3 agents: ≈ 60–110 h elapsed) | stubbed options in basic draw/modify commands, opening DWGs people send, launch/stability fixes, plot dialog, context menus and dynamic input |
Hours are subsets (essentials ⊂ mainstream ⊂ full) and use the calibration in target-app-parity.md: ≈ 25 commands per agent-hour at presence quality in the first build (≈ 11.5 agent-hours), 0.3–0.7 h per option or bug fix (≈ 60 such fixes on 2026-10-10), 2–5 h per moderate feature, 15–100 h per subsystem.
Hours are Opus 5.5 agent wall-clock hours, calibrated on this repo's own build: the first version (51k lines, 290 commands) took ≈ 11.5 agent-hours at presence quality, while depth work runs at 0.3–0.7 h per option or bug fix (≈ 60 such fixes landed on 2026-10-10). Details: target-app-parity.md.
By dimension
| Dimension | Parity | Remaining (h) | Doc |
|---|---|---|---|
| Features (depth, weighted by use) | 41% | 735–1,115 | target-app-parity.md |
| UI/UX fidelity | 43% | 100–160 | ui-parity.md |
| File formats | 30% | 170–280 | file-format-parity.md |
| Hardware | 45% | 15–25 | hardware-parity.md |
| Localization | 5% | 60–100 | localization-parity.md |
| Performance | 60% | 20–40 | hardware-parity.md |
| Stability | 35% | 30–50 | gaps.md |
| Platforms | 75% | 15–25 | gaps.md |
| Ecosystem and automation | 10% | 120–200 | gaps.md |
| AI features | 20% | 40–80 | gaps.md |
Features
| Area | Parity | Remaining (h) | Doc |
|---|---|---|---|
| Draw (2D) | 60% | 15–25 | gaps.md |
| Modify | 50% | 40–60 | gaps.md |
| Geometry precision | 40% | 70–110 | geometry-parity.md |
| Layers and properties | 70% | 10–15 | gaps.md |
| Dimensions | 45% | 25–35 | gaps.md |
| Text and MTEXT | 35% | 30–45 | gaps.md |
| Leaders, tables, fields | 25% | 25–35 | gaps.md |
| Hatch and gradients | 35% | 15–25 | gaps.md |
| Blocks, attributes, xrefs, groups | 25% | 80–120 | gaps.md |
| Layouts, viewports, plotting | 35% | 35–50 | gaps.md |
| Inquiry and utilities | 30% | 30–45 | gaps.md |
| Parametric constraints | 50% | 20–30 | geometry-parity.md |
| 3D modelling and rendering | 2% | 300–450 | gaps.md |
| Collaboration and cloud | 5% | 40–70 | gaps.md |
Languages
AutoCAD 2027 for Mac ships 8 interface languages; CADCraft ships English plus partial Ukrainian and German. Detail: localization-parity.md.
| Language | Status | UI translated |
|---|---|---|
| English | full | 100% |
| Simplified Chinese | none | 0% |
| Spanish | none | 0% |
| Hindi | none | 0% |
| Arabic | none | 0% |
| French | none | 0% |
| Portuguese | none | 0% |
| Indonesian | none | 0% |
| Japanese | none | 0% |
| Greek | complete current catalog | 1,330 current source keys; independent proofreading pending |
| German | partial | ≈ 100% of the catalog (989 rows) |
| Korean | none | 0% |
| Vietnamese | none | 0% |
Other languages shipped: Ukrainian and German (989 catalog rows each; Ukrainian landed with #36), Brazilian Portuguese, Spanish, Czech, Russian, French, Simplified Chinese and Italian (1,227 rows, 2026-10-12); engine messages stay English.
Upcoming
Ranked; detail and the full beta checklist in docs/roadmap.md.
- Gate and land: fix fmt on main, run
cargo xtask cion every PR, land the 47 open PRs (15–25 h). - Stop losing data on save; native MULTILEADER; save DWG/DXF at a chosen version (30–45 h).
- Real-file DWG/DXF corpus and a black-box check in AutoCAD (10–15 h + owner).
- Precision input: object snap tracking, extension/parallel snaps, FROM/M2P/TK, snap overrides, editable dynamic input (25–35 h).
- Unstub prompt options in TRIM/EXTEND, OFFSET, ROTATE, PLINE, SPLINE, MTEXT, MLEADER (15–25 h).
- Autosave, recovery, AUDIT, RECOVER (10–15 h).
- Exact ellipse/spline geometry and correct polyline offsets (30–50 h).
- Xrefs, block editor, groups, then dynamic blocks (80–120 h).
Progress log
| Date | Entry |
|---|---|
| 2026-10-21 | DXF save keeps each proxy object's and proxy entity's class: its class number (group 91) is renumbered to the rewritten CLASSES instead of naming another class, so AutoCAD's visual styles in an R14 file no longer come back as SCALE or MLEADERSTYLE (#1812) |
| 2026-10-14 | HATCHEDIT adds boundaries from internal points or closed objects and removes selected loops in the dialog, command line and JSON command; associative links and undo are covered by tests. |
| 2026-10-12 | TRIM: a pick after a closed polyline's last cut keeps only the complementary run instead of an extra circuit of the outline (#726) |
| 2026-10-12 | HATCHEDIT refuses an explicit bad scale or angle before it edits anything, so a rejected request leaves the drawing, undo and redo as they were (#724) |
| 2026-10-10 | Merged main: Ukrainian interface (#36, first string catalog), Dynamic Input pointer boxes with Tab and relative entry (#60), press-drag selection windows (#63), WIPEOUT and hatch gradients kept through DXF/DWG save (#147, #162), SETVAR DIM* as style overrides (#129), UNITS dialog (#38), close-window save prompt (#47), DIMANGULAR on circles (#20), cargo fmt fixed on main. UI/UX 40% → 43% (dynamic input 15% → 45%), localization 3% → 5%; ready for real work ≈ 37% → 38% (weighted 37.2% → 37.7%), mainstream 27% → 28%, essentials 45% → 46%. Beta is now ~37 points away; hours unchanged within rounding. |
| 2026-10-10 | Added mainstream practitioner (≈ 27%) and essentials user (≈ 45%) numbers; ready for real work unchanged at ≈ 37%. User evidence: 2 praise comments, 0 "switched from AutoCAD" reports, 27 of 37 open issues on the core path. |
| 2026-10-10 | Stage re-normalized from alpha to pre-alpha under the craftrules core-workflow gate: drafting with tracking, blocks, plotting and lossless DWG save fail; dimensioning passes. Alpha is ≈ 125–190 h away. |
| 2026-10-10 | Full re-measure against AutoCAD 2027 for Mac in the craftrules progress-docs format: menu breadth 245/491 (50%), ready for real work ≈ 37%, stage alpha. Remaining estimates rose (≈ 570 h → 1,300–2,100 h) on new evidence: behaviour audits found tracking/extension/parallel snaps and dynamic input are not real, saves drop unmodelled content, DWG saves as R2000, and the old estimate had no localization, ecosystem, stability, platform or AI rows. New docs: target-app-parity, gaps, roadmap, architecture, localization, file-format, hardware, UI and geometry parity; docs/parity.md became docs/parity-checklist.md. |
| 2026-10-10 | About 60 community PRs merged in a day: DXF fidelity (transparency, LWPOLYLINE elevation, frozen VP layers, dimension text rotation, arc-length dims, non-ASCII escapes), CJK font fallback, Save/Don't Save on close, Light/System themes, F2 history, trackpad pan, Linux XWayland drag-and-drop, correctness fixes across draw/modify/constraints. Release v0.4.0. |
| 2026-10-08 | Releases v0.1.0–v0.3.0: Flatpak, AppImage updates, signed macOS universal, Windows x64/x86/arm64, Linux, FreeBSD and web builds. |
| 2026-10-07 | Old assessment: menu breadth 233/491 (47%), ≈ 29% weighted parity, 2D drafting ≈ 55%, ≈ 570 h remaining; milestones as reported then: M1 ~85%, M2 ~65%, M3 ~75%, M4 ~50%, M5 ~35%, M6 ~55%, M7 ~55%, M8 ~20%, M9 ~60%, M10 ~70%, M11 0%, M12 ~25%, M13 ~10%. |
| 2026-10-07 | First version built in one session (≈ 6.9 h elapsed, ≈ 11.5 agent-hours): M0 vertical slice, dimensions, hatch, blocks, DWG bridge, layouts and PDF plotting, GPU canvas, R-tree, constraints, Layer Properties Manager, QSELECT, release pipeline. |
Revision history
| Date | Change | Summary |
|---|---|---|
| 2026-10-21 | trivial | Progress log: proxy objects keep their class through a save (#1812) |
| 2026-10-14 | minor | Progress log: HATCHEDIT boundary add/remove |
| 2026-10-12 | trivial | Progress log: closed-polyline TRIM (#726) |
| 2026-10-12 | trivial | Progress log: HATCHEDIT numeric validation (#724) |
| 2026-10-10 | minor | Merged main's changes (Ukrainian catalog, dynamic input pointer boxes, DXF fixes); UI/UX and localization numbers updated |
| 2026-10-10 | minor | Readiness-by-audience table with hours to ~95% for each number |
| 2026-10-10 | minor | Mainstream practitioner and essentials user headline numbers |
| 2026-10-10 | minor | Stage alpha → pre-alpha under the core-workflow gate; banner, why, headline row |
| 2026-10-10 | major | Restructured to the progress-docs standard (stage, two numbers, dimensions, features, languages, upcoming, log); full re-measure; milestone detail moved to docs/roadmap.md, parity assessment to docs/target-app-parity.md |
| 2026-10-07 | major | Alpha checklist, milestone table, ≈ 29% weighted parity estimate |
Shared UI workspace integration
Tool Sets, Layers and Properties use shared docking with persisted layouts, keyboard focus and compact toolbar overflow. No milestone percentage change.