README screenshots, alpha/parity assessment in ROADMAP, MLEADER written to DXF as LEADER + MTEXT

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Brandon ThomasandClaude Opus 5.5 committed 2026-10-06 02:12:34 -04:00
1 parent 12d5f5d967
commit a599137356
9 files changed
+2840 -162

No files matched your search

+2
View File
@@ -38,6 +38,8 @@ Generated-in-code assets are original and have no file to list:
| `assets/app-icon/cadcraft-1024.png` | CADCraft contributors | generated | MIT OR Apache-2.0 | | | `assets/app-icon/cadcraft-1024.png` | CADCraft contributors | generated | MIT OR Apache-2.0 | |
| `assets/app-icon/cadcraft-macos-512.png` | CADCraft contributors | generated (macOS margin variant) | MIT OR Apache-2.0 | | | `assets/app-icon/cadcraft-macos-512.png` | CADCraft contributors | generated (macOS margin variant) | MIT OR Apache-2.0 | |
| `examples/apartment.dxf` | CADCraft contributors | sample drawing made with cadcraft-cli commands | MIT OR Apache-2.0 | Original | | `examples/apartment.dxf` | CADCraft contributors | sample drawing made with cadcraft-cli commands | MIT OR Apache-2.0 | Original |
| `docs/images/ui-apartment.png` | CADCraft contributors | screenshot of CADCraft itself (examples/apartment.dxf) | MIT OR Apache-2.0 | Original; no Autodesk UI |
| `docs/images/ui-layout.png` | CADCraft contributors | screenshot of CADCraft itself (a layout of examples/apartment.dxf) | MIT OR Apache-2.0 | Original; no Autodesk UI |
| `docs/images/ui-bracket.png` | CADCraft contributors | screenshot of CADCraft itself (sample drawing generated in code) | MIT OR Apache-2.0 | Original; no Autodesk UI | | `docs/images/ui-bracket.png` | CADCraft contributors | screenshot of CADCraft itself (sample drawing generated in code) | MIT OR Apache-2.0 | Original; no Autodesk UI |
| `docs/brand/artcraft-logo-white.png` | ArtCraft Team | storytold/craftrules `assets/brand/` | ArtCraft brand terms (`docs/brand/LICENSE-brand.txt`) | Trademark, not open source | | `docs/brand/artcraft-logo-white.png` | ArtCraft Team | storytold/craftrules `assets/brand/` | ArtCraft brand terms (`docs/brand/LICENSE-brand.txt`) | Trademark, not open source |
| `docs/brand/artcraft-logo-white.svg` | ArtCraft Team | storytold/craftrules `assets/brand/` | ArtCraft brand terms (`docs/brand/LICENSE-brand.txt`) | Trademark, not open source | | `docs/brand/artcraft-logo-white.svg` | ArtCraft Team | storytold/craftrules `assets/brand/` | ArtCraft brand terms (`docs/brand/LICENSE-brand.txt`) | Trademark, not open source |
+22 -5
View File
@@ -41,8 +41,8 @@
<br> <br>
<p align="center"> <p align="center">
<img src="docs/images/ui-bracket.png" alt="CADCraft with a mechanical drawing of a mounting bracket open: a front view with bolt holes, red centre lines, a yellow hidden circle and cyan dimensions, a hatched section view, notes and a title block; the Tool Sets palette is on the left, Layers and Properties on the right and the command line at the bottom is asking for the next point of a LINE" width="100%"> <img src="docs/images/ui-apartment.png" alt="CADCraft with an apartment floor plan open: hatched grey walls, blue windows, green door swings, furniture outlines, yellow room names with areas, a yellow room schedule table, a multileader note and cyan dimensions with architectural ticks; Tool Sets on the left, Layers and Properties on the right, the command line at the bottom" width="100%">
<br><sub><b>Mounting bracket</b>: a two-view part drawing with dimensions, centre lines, hidden lines and an ANSI31 section hatch — drawn, dimensioned and rendered by CADCraft.</sub> <br><sub><b>Apartment plan</b> (<a href="examples/apartment.dxf">examples/apartment.dxf</a>): walls with pick-point hatching, TrueType MTEXT room labels, a TABLE, a multileader and architectural dimensions — built entirely from CADCraft commands.</sub>
</p> </p>
> [!NOTE] > [!NOTE]
@@ -51,6 +51,7 @@
> last week. If you make things, you're one of us. **[Come say hi on Discord](https://discord.gg/artcraft).** > last week. If you make things, you're one of us. **[Come say hi on Discord](https://discord.gg/artcraft).**
<p align="center"> <p align="center">
<a href="#screenshots">Screenshots</a> ·
<a href="#why-cadcraft">Why CADCraft</a> · <a href="#why-cadcraft">Why CADCraft</a> ·
<a href="#what-works-today">What works today</a> · <a href="#what-works-today">What works today</a> ·
<a href="#quick-start">Quick start</a> · <a href="#quick-start">Quick start</a> ·
@@ -61,6 +62,19 @@
<a href="#license-and-credits">License and credits</a> <a href="#license-and-credits">License and credits</a>
</p> </p>
## Screenshots
<table>
<tr>
<td width="50%"><img src="docs/images/ui-layout.png" alt="A paper-space layout in CADCraft: a white sheet with a dashed printable area and a viewport showing the apartment plan at scale, the status bar showing the A1 Plan layout tab and a PAPER toggle"></td>
<td width="50%"><img src="docs/images/ui-bracket.png" alt="CADCraft with a mounting bracket part drawing: front view with bolt holes, centre lines and dimensions, a hatched section view, notes and a title block"></td>
</tr>
<tr>
<td><sub><b>Layouts</b>: paper space with viewports, page setups and PLOT to PDF. Double-click a viewport to work in model space through it.</sub></td>
<td><sub><b>Mounting bracket</b>: a two-view part drawing with centre lines, hidden lines, an ANSI31 section hatch and a title block.</sub></td>
</tr>
</table>
## Why CADCraft ## Why CADCraft
- **The workflow you know.** Type `L`, click two points, type `@5<45`, press Enter. The command - **The workflow you know.** Type `L`, click two points, type `@5<45`, press Enter. The command
@@ -90,9 +104,12 @@ numbers):
| Modify | ERASE, MOVE, COPY, ROTATE, SCALE, MIRROR, STRETCH, OFFSET, TRIM, EXTEND, FILLET, CHAMFER, BREAK, JOIN, EXPLODE, rectangular/polar ARRAY, draw order, OVERKILL | | Modify | ERASE, MOVE, COPY, ROTATE, SCALE, MIRROR, STRETCH, OFFSET, TRIM, EXTEND, FILLET, CHAMFER, BREAK, JOIN, EXPLODE, rectangular/polar ARRAY, draw order, OVERKILL |
| Precision | Object snaps (endpoint, midpoint, center, geometric center, node, quadrant, intersection, insertion, perpendicular, tangent, nearest), polar tracking, ortho, grid snap | | Precision | Object snaps (endpoint, midpoint, center, geometric center, node, quadrant, intersection, insertion, perpendicular, tangent, nearest), polar tracking, ortho, grid snap |
| Layers & properties | Layers palette and Layer Properties Manager (on/off, freeze, lock, plot, colour, linetype), layer tools (isolate, freeze, off, lock, match, previous), Properties palette with per-object editing, linetypes, lineweights, colour index and true colour | | Layers & properties | Layers palette and Layer Properties Manager (on/off, freeze, lock, plot, colour, linetype), layer tools (isolate, freeze, off, lock, match, previous), Properties palette with per-object editing, linetypes, lineweights, colour index and true colour |
| Annotation | Dimensions (linear, aligned, radius, diameter, angular, ordinate, arc length) rendered from DIMSTYLE settings, our own single-stroke drafting font, `%%d %%p %%c` codes, MTEXT wrapping and attachment | | Annotation | All DIM* commands with full DIMSTYLE variables, overrides and every arrowhead, associative dimensions that follow geometry, MLEADER, TABLE, TrueType fonts, MTEXT formatting codes (fonts, heights, colours, stacked fractions), our own single-stroke drafting font |
| Hatch & blocks | Pattern and solid hatches with our own pattern library, block references with attributes and nested blocks | | Hatch & blocks | Pick-point hatch boundaries with islands, pattern, solid and gradient fills from our own pattern library, BLOCK/INSERT, attributes and nested blocks |
| Files | DXF read/write (R12–2018), DWG read/write (R13–2018, via the acadrust library), SVG and PNG export | | Files | DXF read/write (R12–2018, including dimension styles, associativity, tables and constraints), DWG read/write (R13–2018, via the acadrust library), PDF plotting, SVG and PNG export |
| Layouts & plotting | Paper-space layouts, viewports (scale, lock, per-viewport layer freeze), MSPACE/PSPACE through viewports, page setups, PLOT and EXPORTPDF |
| Parametric | Geometric and dimensional constraints, AUTOCONSTRAIN, PARAMETERS with expressions, conflict detection; constraints re-solve after every edit |
| Grips | Hot grips with Space to cycle Stretch, Move, Rotate, Scale and Mirror |
| Automation | MCP server, JSON control channel, `cadcraft-cli` (info, convert, run, commands, mcp) | | Automation | MCP server, JSON control channel, `cadcraft-cli` (info, convert, run, commands, mcp) |
## Quick start ## Quick start
+57 -21
View File
@@ -4,20 +4,57 @@ Status as of **2026-10-07**. CADCraft targets full parity with AutoCAD (2D draft
annotation, layouts and plotting, DWG, parametrics and 3D), plus things AutoCAD doesn't have: annotation, layouts and plotting, DWG, parametrics and 3D), plus things AutoCAD doesn't have:
agent control over MCP, a scriptable CLI, a web build and a free licence. agent control over MCP, a scriptable CLI, a web build and a free licence.
## At a glance
| Question | Answer |
|---|---|
| **How close is an alpha?** | **≈ 70% of the way.** About **55 Opus 5.5 wall-clock hours** remain (≈ 15–20 hours elapsed with 3–4 agents in parallel). |
| **How far is 100% AutoCAD parity?** | **≈ 29% parity overall** (weighted by how much each area matters). About **580 Opus 5.5 wall-clock hours** remain (≈ 150–190 hours elapsed in parallel). |
| **2D drafting parity** (what most AutoCAD users do every day: M1–M8) | **≈ 55%.** About **250 hours** remain. |
| **The biggest single gap** | 3D modelling (M11): solids, surfaces, meshes, visual styles and rendering — ≈ 200 hours on its own. |
### What "alpha" means here
A person can do real 2D drafting work in CADCraft and trust it with their files:
- Installable, signed builds for macOS, Windows, Linux, FreeBSD and the web from the release pipeline.
- Drawings from AutoCAD open correctly, and CADCraft's DXF/DWG files open cleanly in AutoCAD and other readers.
- Every common 2D draw, modify, annotate, layer, block, layout and plot command works, both with the mouse and at the command line.
- No crashes and no lost work: autosave and recovery, plus undo that always works.
### Alpha checklist
| Item | State | Hours left |
|---|---|---|
| 2D draw and modify commands, snaps, tracking, grips | done (minor options missing) | — |
| Dimensions, text, MTEXT, leaders, tables, TrueType fonts | done | — |
| Hatch with pick points, blocks, attributes | done | — |
| Layouts, viewports, MSPACE/PSPACE, page setup, PLOT to PDF | done | — |
| Parametric constraints | done (engine); glyphs on the canvas in progress | 3 |
| DXF/DWG round trip of everything above | done for our data; MULTILEADER is written as LEADER + MTEXT; `*D` dimension blocks duplicate on re-save | 6 |
| Confirmed opening in AutoCAD (black-box check) | not yet confirmed | 4 |
| Layer Properties Manager, QSELECT, Quick Properties | in progress | 4 |
| Autosave, crash recovery, RECOVER/AUDIT | partial | 6 |
| Options dialog and preferences | partial | 6 |
| Plot preview | missing | 4 |
| Scripted smoke test of all 290 commands through the UI, then fixing what it finds | not started | 12 |
| Release pipeline: first green signed build on every platform | workflows written; first run being started | 6 |
| Getting-started docs and the web build hosted | partial | 4 |
| **Total** | | **≈ 55** |
## Where we are ## Where we are
| Measure | Value | | Measure | Value |
|---|---| |---|---|
| Menu breadth (`cargo xtask parity`, [docs/parity.md](docs/parity.md)) | **233 / 491 reference menu items (47%)** | | Menu breadth (`cargo xtask parity`, [docs/parity.md](docs/parity.md)) | **233 / 491 reference menu items (47%)** |
| Registered commands | 290 (133 with interactive prompts) | | Registered commands | 290 (133 with interactive prompts) |
| **Estimated overall feature parity (weighted by how much each area matters)** | **≈ 26%** | | **Estimated overall feature parity (weighted by how much each area matters)** | **≈ 29%** |
| Tests | geometry, colour, document, fonts, render, DXF, engine (commands, prompts, snaps, selection, undo, scripts, hostile input), MCP agent tasks, xtask | | Performance | 200k entities: pick 0.001 ms, pick after an edit ≈ 4 ms (incremental R-tree), GPU canvas ≈ 4 ms per frame |
| Tests | geometry, colour, document, fonts, render, DXF/DWG round trips, constraints solver, engine (commands, prompts, snaps, selection, undo, scripts, hostile input), MCP agent tasks, xtask |
| Gates | `cargo xtask ci`: fmt, clippy -D warnings, tests, asset attribution, layering, wasm — green | | Gates | `cargo xtask ci`: fmt, clippy -D warnings, tests, asset attribution, layering, wasm — green |
The weighted estimate counts depth: most covered menu items work in their common forms but lack Menu breadth counts menu items that exist; the weighted parity estimate also counts depth (options,
some options (e.g. ARC has 3-point and start-center-end but not all eleven variants; TRIM works on edge cases, dialogs), which is why it is lower.
lines, arcs, circles and polylines but not ellipses or splines; dimensions render but have no
interactive DIM commands yet).
## Milestones ## Milestones
@@ -26,27 +63,26 @@ interactive DIM commands yet).
| M0 | Skeleton + vertical slice: workspace, AutoCAD-style UI, command line, draw/modify basics, DXF, CLI, MCP, web | **done** | — | | M0 | Skeleton + vertical slice: workspace, AutoCAD-style UI, command line, draw/modify basics, DXF, CLI, MCP, web | **done** | — |
| M1 | Drafting core: every Draw-menu 2D command and option, dynamic input fields, object snap tracking, temporary snap overrides | ~85% (all 2D Draw items exist) | 8 | | M1 | Drafting core: every Draw-menu 2D command and option, dynamic input fields, object snap tracking, temporary snap overrides | ~85% (all 2D Draw items exist) | 8 |
| M2 | Modify: grips (stretch/move/rotate/scale/mirror, multifunctional), PEDIT, SPLINEDIT, LENGTHEN, BLEND, ALIGN, associative arrays, trim/extend for all curve types, MATCHPROP UI, Quick Properties | ~65% (PEDIT, LENGTHEN, ALIGN, BLEND, grips API, TRIM on splines) | 18 | | M2 | Modify: grips (stretch/move/rotate/scale/mirror, multifunctional), PEDIT, SPLINEDIT, LENGTHEN, BLEND, ALIGN, associative arrays, trim/extend for all curve types, MATCHPROP UI, Quick Properties | ~65% (PEDIT, LENGTHEN, ALIGN, BLEND, grips API, TRIM on splines) | 18 |
| M3 | Layers & properties: full Layer Properties Manager (filters, VP overrides, states), linetype manager, lineweight display, transparency, QSELECT dialog, Properties for every object type | ~45% | 20 | | M3 | Layers & properties: full Layer Properties Manager (filters, VP overrides, states), linetype manager, lineweight display, transparency, QSELECT dialog, Properties for every object type | ~60% (Layer Properties Manager, QSELECT, Quick Properties in progress) | 15 |
| M4 | Annotation: DIM* commands, DIMSTYLE manager, associative dimensions, MLEADER + styles, in-place MTEXT editor, fields, tables + table styles, annotative scaling, TrueType fonts, SHX reader | ~45% (TrueType text, MTEXT formatting codes, full DIMSTYLE variables + overrides, all arrowheads, associative dimensions, TABLE editing; not yet: DXF round-trip of the new data, jogged/ordinate polish, tolerance frames, fields, annotative scaling, SHX) | 35 | | M4 | Annotation: DIM* commands, DIMSTYLE manager, associative dimensions, MLEADER + styles, in-place MTEXT editor, fields, tables + table styles, annotative scaling, TrueType fonts, SHX reader | ~50% (TrueType text, MTEXT formatting codes, full DIMSTYLE variables + overrides, all arrowheads, associative dimensions, TABLE editing; DXF round trip; not yet: native MULTILEADER objects, jogged/ordinate polish, tolerance frames, fields, annotative scaling, SHX) | 30 |
| M5 | Hatch & blocks: pick-point boundary detection, islands, gradients, BLOCK/WBLOCK/INSERT dialogs, attributes (ATTDEF/ATTEDIT/BATTMAN), block editor, dynamic block parameters, xrefs, groups, Blocks palette | ~20% | 70 | | M5 | Hatch & blocks: pick-point boundary detection, islands, gradients, BLOCK/WBLOCK/INSERT dialogs, attributes (ATTDEF/ATTEDIT/BATTMAN), block editor, dynamic block parameters, xrefs, groups, Blocks palette | ~35% (pick-point boundaries with islands, gradients, BLOCK/INSERT, attributes, nested blocks) | 70 |
| M6 | Layouts & plotting: paper space, viewports (rect/polygonal/object, scale, lock, per-VP layers), page setups, PLOT to PDF/PNG/SVG, plot styles (CTB/STB), PUBLISH | ~55% (layouts, viewports, MSPACE/PSPACE through viewports, page setup, PLOT/EXPORTPDF) | 25 | | M6 | Layouts & plotting: paper space, viewports (rect/polygonal/object, scale, lock, per-VP layers), page setups, PLOT to PDF/PNG/SVG, plot styles (CTB/STB), PUBLISH | ~55% (layouts, viewports, MSPACE/PSPACE through viewports, page setup, PLOT/EXPORTPDF) | 25 |
| M7 | Files: DWG read/write (done via acadrust), DXF fidelity (all object types, round-trip of unknown data), RECOVER/AUDIT, PURGE, templates, autosave, ETRANSMIT, PDF/raster underlays | ~45% | 60 | | M7 | Files: DWG read/write (done via acadrust), DXF fidelity (all object types, round-trip of unknown data), RECOVER/AUDIT, PURGE, templates, autosave, ETRANSMIT, PDF/raster underlays | ~55% (DXF round trip of dimension styles, associativity, tables and constraints) | 55 |
| M8 | Inquiry & utilities: MEASUREGEOM, MASSPROP, QuickCalc, Find/Replace, spell check, COUNT, DWG Compare, Settings/OPTIONS, CUI-style customisation, alias editor | ~20% | 30 | | M8 | Inquiry & utilities: MEASUREGEOM, MASSPROP, QuickCalc, Find/Replace, spell check, COUNT, DWG Compare, Settings/OPTIONS, CUI-style customisation, alias editor | ~20% | 30 |
| M9 | Parametric: geometric + dimensional constraints, AutoConstrain, Parameters Manager (constraint solver, see plan/adr/0001) | ~60% (own solver crate, all GC*/DC* commands, AUTOCONSTRAIN, PARAMETERS, conflict detection, re-solve after edits; not yet: constraint glyph/dimension rendering, DWG/DXF persistence, inference while drawing) | 20 | | M9 | Parametric: geometric + dimensional constraints, AutoConstrain, Parameters Manager (constraint solver, see plan/adr/0001) | ~60% (own solver crate, all GC*/DC* commands, AUTOCONSTRAIN, PARAMETERS, conflict detection, re-solve after edits, DXF persistence; not yet: inference while drawing, constraint glyphs on the canvas (in progress)) | 16 |
| M10 | Performance: GPU canvas (wgpu batches), R-tree spatial index, incremental regen, 1M-entity drawings at 60 fps | ~60% (GPU canvas, R-tree: pick 50 ms → 0.001 ms at 200k entities) | 15 | | M10 | Performance: GPU canvas (wgpu batches), R-tree spatial index, incremental regen, 1M-entity drawings at 60 fps | ~70% (GPU canvas, incremental R-tree: pick 50 ms → 0.001 ms at 200k entities, ≈ 4 ms after an edit) | 12 |
| M11 | 3D: UCS, orbit, visual styles, solids (box…loft, booleans, fillet edges), meshes, surfaces, sections, rendering | 0% | 200 | | M11 | 3D: UCS, orbit, visual styles, solids (box…loft, booleans, fillet edges), meshes, surfaces, sections, rendering | 0% | 200 |
| M12 | Automation: an embedded safe AutoLISP-compatible interpreter, action recorder, sheet sets, CLI/MCP parity tests | ~25% | 60 | | M12 | Automation: an embedded safe AutoLISP-compatible interpreter, action recorder, sheet sets, CLI/MCP parity tests | ~25% | 60 |
| M13 | 1.0 polish: preferences, workspaces, themes, localisation, accessibility, signed packages for every platform, docs | ~10% | 40 | | M13 | 1.0 polish: preferences, workspaces, themes, localisation, accessibility, signed packages for every platform, docs | ~10% | 40 |
| | **Remaining total** | | **≈ 620 hours** | | | **Remaining total** | | **≈ 580 hours** |
At roughly 620 more hours of Opus 5.5 wall-clock work (with parallel agents this compresses to At roughly 580 more hours of Opus 5.5 wall-clock work (with parallel agents this compresses to
about 155–200 hours of elapsed time), CADCraft would reach broad AutoCAD parity. 2D drafting parity about 150–190 hours of elapsed time), CADCraft would reach broad AutoCAD parity. 2D drafting parity
(M1–M8) is the first ≈ 300 hours. (M1–M8) is the first ≈ 250 hours.
## Current focus ## Current focus
1. Constraint glyphs and dimensional constraints on the canvas; DXF persistence of constraints, DIMSTYLE overrides and associativity. 1. Finish the alpha checklist above (release builds, AutoCAD open check, smoke test of every command, autosave/recovery, plot preview).
2. Quick Properties, QSELECT and the full Layer Properties Manager. 2. Constraint glyphs on the canvas; Layer Properties Manager, QSELECT and Quick Properties.
3. Plot preview; polygonal/object viewports. 3. Native MULTILEADER objects in DXF; stop `*D` block duplication on re-save.
4. 3D foundations (UCS, orbit, solids via truck/csgrs per plan/adr/0001). 4. Then 3D foundations (UCS, orbit, solids via truck/csgrs per plan/adr/0001).
5. First release-candidate build through the release pipeline.
+22
View File
@@ -651,6 +651,28 @@ fn entity(w: &mut W, d: &Drawing, e: &Entity, owner: &str, paper: bool, cx: &Ctx
w.f(1040, t.text_height); w.f(1040, t.text_height);
w.s(1000, &t.style); w.s(1000, &t.style);
} }
EntityKind::MLeader(m) => {
// Written as plain LEADER + MTEXT entities (MULTILEADER objects aren't supported
// yet), so every reader shows the annotation.
for arm in m.leaders.iter().take(64) {
let mut vertices = arm.clone();
vertices.push(m.landing);
let le = Entity {
handle: Handle(u64::from_str_radix(&w.h(), 16).unwrap_or(0)),
common: e.common.clone(),
kind: EntityKind::Leader(cadcraft_doc::Leader { vertices, arrow: true, spline: false, style: m.style.clone() }),
};
entity(w, d, &le, owner, paper, cx);
}
if let Some(t) = &m.text {
let te = Entity {
handle: Handle(u64::from_str_radix(&w.h(), 16).unwrap_or(0)),
common: e.common.clone(),
kind: EntityKind::MText(t.clone()),
};
entity(w, d, &te, owner, paper, cx);
}
}
EntityKind::Leader(l) => { EntityKind::Leader(l) => {
w.s(0, "LEADER"); w.s(0, "LEADER");
common(w, e, owner, paper, "AcDbLeader"); common(w, e, owner, paper, "AcDbLeader");
+27
View File
@@ -837,3 +837,30 @@ fn dwg_roundtrip_keeps_extension_data() {
let r = back.text_style("Romans").unwrap(); let r = back.text_style("Romans").unwrap();
assert!(r.backwards && r.annotative); assert!(r.backwards && r.annotative);
} }
#[test]
fn mleader_is_written_as_leader_and_mtext() {
let mut d = Drawing::new_metric();
let text = cadcraft_doc::MText {
insert: Vec3::new(12.0, 5.0, 0.0),
height: 2.5,
width: 0.0,
attach: 1,
rotation: 0.0,
contents: "Note".into(),
style: "Standard".into(),
line_spacing: 1.0,
};
let m = cadcraft_doc::MLeader {
leaders: vec![vec![Vec3::new(0.0, 0.0, 0.0)]],
landing: Vec3::new(10.0, 5.0, 0.0),
dogleg: 2.0,
text: Some(text),
style: "Standard".into(),
arrow_size: 2.5,
};
d.add(&Space::Model, Default::default(), EntityKind::MLeader(m)).unwrap();
let back = roundtrip(&d);
assert!(back.model.iter().any(|e| matches!(e.kind, EntityKind::Leader(_))));
assert!(back.model.iter().any(|e| matches!(&e.kind, EntityKind::MText(t) if t.contents == "Note")));
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 397 KiB

After

Width:  |  Height:  |  Size: 363 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

+2710 -136
View File
File diff suppressed because it is too large. Load diff