What's Changed
- Render tests: drop the always-true assert in degenerate_input by @kaffeochknivar in #37
- Keep elevations when EXPLODE splits a 3D polyline (#88) by @MarekSpodBiedry in #138
- Reject out-of-domain values in PARAMETERS instead of dropping the constraint (#93) by @MarekSpodBiedry in #139
- Apply DIMOVERRIDE text together with dimension variables (#108) by @MarekSpodBiedry in #141
- Convert typed ellipse arc angles to ellipse parameters (#82) by @MarekSpodBiedry in #143
- Fix justified TEXT extents and picking (#89) by @MarekSpodBiedry in #144
- Reject deleting a dimension that a remaining dimension refers to (#94) by @MarekSpodBiedry in #145
- MCP bridge: do not resend a mutation whose reply was lost (#102) by @MarekSpodBiedry in #146
- Keep selected objects outside the joined chain when using JOIN (#86) by @MarekSpodBiedry in #148
- Fence selection now includes crossed XLINE and RAY objects (#92) by @MarekSpodBiedry in #149
- HATCHEDIT: clear the gradient when a named pattern is chosen (#107) by @MarekSpodBiedry in #151
- Reject nonpositive MTEXT height on creation (#84) by @MarekSpodBiedry in #154
- AREA of a normal hatch no longer counts unfilled islands (#91) by @MarekSpodBiedry in #155
- Store canonical autoTypes names so accepted spellings take effect (#95) by @MarekSpodBiedry in #156
- Keep an ordinate dimension's datum fixed when its feature moves (#105) by @MarekSpodBiedry in #157
- Keep ATTDEF prompt when saving DXF (#81) by @MarekSpodBiedry in #137
- Write LWPOLYLINE elevation (group 38) to DXF (#77) by @MarekSpodBiedry in #142
- Keep viewport frozen-layer lists through DXF save and reopen (#98) by @MarekSpodBiedry in #150
- DXF: keep layer transparency and description through save and reopen (fixes #96, fixes #97) by @kaffeochknivar in #131
- Entity transparency: set it in properties.set, report it, round-trip DXF group 440 by @vangel76 in #174
- DXF: write non-ASCII text as \U+ escapes so R2000 files read correctly elsewhere (fixes #164) by @vangel76 in #169
- fix(engine): programmatic undo/redo ends a running command first by @vangel76 in #178
- DWG open: stop runaway conversions early and name the limit (#57) by @vangel76 in #175
- HATCH/GRADIENT/BOUNDARY: keep islands drawn as separate lines (fixes #106) by @vangel76 in #163
- LINE: deferred tangent/perpendicular for the first point, so belt lines tangent to two circles work (fixes #69) by @vangel76 in #168
- Selection commands prompt "Select objects" without a pickfirst selection (#126, part 2) by @vangel76 in #176
- Properties palette: every control acts or is visibly unavailable by @vangel76 in #182
- Menu items open their missing dialogs; COUNT shows its result; New Layout asks for a name (#126, part 1) by @vangel76 in #180
- cadcraft-cli mcp: --connect without HOST:PORT is an error, not a headless session (fixes #103) by @vangel76 in #167
- CLI: image exports honour the current view; add --window / --view framing (fixes #165) by @vangel76 in #170
- MCP plate test: finish TEXT before undo and check the centre line survives by @vangel76 in #171
- Windows installer: offer a desktop shortcut (#32) by @vangel76 in #184
- Light and System interface themes (System follows the OS appearance live) by @vangel76 in #179
- Command line, ViewCube and UCS icon take the pointer; command history window (F2) by @vangel76 in #181
- Linux: present without a vsync queue so the crosshair follows the mouse (#25) by @vangel76 in #183
- Ask Save / Don't Save / Cancel before closing a dirty drawing by @vangel76 in #172
- Menu commands open their dialogs; JSON calls never open file pickers (fixes #65, fixes #101) by @kaffeochknivar in #125
- Fix macOS runtime app icon sizing by @cyfung1031 in #128
- Keep a free measured origin in place when its source moves (#109) by @MarekSpodBiedry in #152
- Keep dimension text rotation when saving DXF (#78) by @MarekSpodBiedry in #153
- ARC: refuse zero-radius arcs instead of adding them (fixes #85) by @SBaksa in #123
- Extents: a wide polyline's bounds follow its drawn band (fixes #90) by @SBaksa in #127
- Reject unknown CADCraft CLI options before side effects by @cyfung1031 in #120
- macOS: the delete key erases the selection, guarded against typing by @Tru10 in #64
- Default Windows startup to DirectX 12 by @DWAA1660 in #31
- Redraw edits made while a command is still running (fixes #4) by @SBaksa in #22
- DIMANGULAR: accept polyline segments (fixes #10) by @SBaksa in #15
- Fix Open dialog drawing filter to include DWG by @DWAA1660 in #21
- Print and Ctrl+P ask where to save the PDF (#5) by @MarekSpodBiedry in #26
- SCALE: Reference option (#17) by @MarekSpodBiedry in #27
- Blocks window: click a block to insert it (#8) by @MarekSpodBiedry in #28
- Scripts: split a line at keyword prompts so POLYGON 6 200,20 I 15 works (#43) by @MarekSpodBiedry in #45
- Layer Properties Manager: stop the window growing every frame (fixes #29) by @LloydNicholson in #46
- ui.render: fit the drawing and return pngBase64 like the headless render (#49, #50) by @MarekSpodBiedry in #52
- Linux: default to XWayland for file drag-and-drop on Wayland desktops by @dylanmtaylor in #159
- Fonts: per-character fallback, FONTALT and .ttc support for CJK text in SHX styles by @vangel76 in #173
- Trackpad pan by @Tru10 in #58
- Keep arc-length dimensions as arc-length through DXF save and reopen (#100) by @MarekSpodBiedry in #140
- PLINE: Halfwidth is centre-to-edge, and Width answers taper the next segment (fixes #83, #104) by @SBaksa in #121
- DXF/DWG: keep hatch gradients through save and reopen (fixes #80) by @vangel76 in #162
- Write Wipeout entities to DXF so saving keeps them (#79) by @MarekSpodBiedry in #147
- Press-and-drag selection windows (PICKDRAG = 2) by @Tru10 in #63
- SETVAR DIM* variables become style overrides for new dimensions (fixes #66) by @kaffeochknivar in #129
- DIMANGULAR: accept a circle by @SBaksa in #20
- Show Ctrl/Shift shortcuts on Windows and Linux, symbols only on macOS (#53) by @MarekSpodBiedry in #54
- UNITS opens a Drawing Units dialog; SETVAR prompts at the command line (fixes #30) by @kaffeochknivar in #38
- Dynamic Input: pointer input boxes with Tab, comma and relative entry by @Tru10 in #60
- Ask to save unsaved changes before closing the window (#34) by @LloydNicholson in #47
- i18n: add Ukrainian (uk) interface translation by @dmatviichuk in #36
- Progress docs: full re-measure against AutoCAD 2027 (craftrules standard) by @echelon in #205
- fix(geom): preserve three-point circle precision at large coordinates by @Ni-zav in #210
- Reject layer.set atomically: a refused call no longer applies other changes (#71) by @MarekSpodBiedry in #188
- Reject two-line angular constraints over 180 degrees that can never be satisfied (#73) by @MarekSpodBiedry in #190
- Keep the active drawing when closing an earlier inactive one (#76) by @MarekSpodBiedry in #192
- Respect locked layers in Clear, Cut, Stretch, Trim, Extend, Fillet, Explode and SplineEdit (#87) by @MarekSpodBiedry in #196
- Keep viewport layer colour overrides through DXF save and reopen (#99) by @MarekSpodBiedry in #197
- DXF: keep saved layer states through save and reopen (fixes #201) by @vangel76 in #203
- DXF: keep block descriptions and constant attribute definitions (fixes #204) by @vangel76 in #207
- DXF: keep thickness, point angle, hatch origin/background/elevation, xref paths and the built-in font name (fixes #213) by @vangel76 in #215
- DXF: keep linetype text, multileader styles, page setups, named views, UCSs and groups (fixes #209) by @vangel76 in #216
- DXF: keep raster images through save; report entities a save can't keep (fixes #208) by @vangel76 in #217
- ELLIPSE Rotation/Parameter and BREAK First point take effect (fixes #219) by @vangel76 in #222
- ROTATE: Reference option (fixes #235) by @vangel76 in #236
- AREA Object/Add area/Subtract area and DIST Multiple points take effect (fixes #233) by @vangel76 in #237
- TEXTEDIT prompt, Undo and Mode; MTEXT in scripts takes lines until an empty one (fixes #234) by @vangel76 in #239
- UNDO asks for the number of operations; U undoes one (fixes #241) by @vangel76 in #242
- macOS: the window title lines up with the traffic lights (fixes #161) by @vangel76 in #202
- Option to keep the system cursor over the drawing area for screen magnifiers (#39) by @vangel76 in #187
- Web: File > Open… shows the browser's file picker (fixes #55) by @vangel76 in #199
- fix(geom): calculate tight ellipse and arc bounds analytically by @Ni-zav in #211
- fix(geom): measure bulged polylines and distant polygons accurately by @Ni-zav in #212
- fix(geom): avoid false line-circle tangencies on long construction lines by @Ni-zav in #214
- Layer delete and purge keep layers used by block definitions (#72) by @MarekSpodBiedry in #189
- Layer rename re-points paper-space and block-definition entities (#75) by @MarekSpodBiedry in #191
- Deliver browser saves as downloads; keep unsaved state when they fail (#133) by @vangel76 in #193
- Linetype rename keeps layer, object and current-linetype references (#74) by @MarekSpodBiedry in #195
- DWG: keep true colours, transparency, table styles, layouts and viewport ids (fixes #223) by @vangel76 in #225
- Raster points no longer panic debug builds (fixes #270) by @vangel76 in #271
- Programmatic SPLINE limits the degree to 1..10 (fixes #268) by @vangel76 in #269
- Bound block expansion in drawing and extents: nested, self-referencing or arrayed blocks no longer hang (fixes #255) by @vangel76 in #267
- Points draw with the point style (PDMODE/PDSIZE) (fixes #261) by @vangel76 in #265
- Layout viewports scale model-space linetypes by PSLTSCALE (fixes #257) by @vangel76 in #259
- io: only the first CADCraft xdata string marks the PAPERVIEW viewport by @vangel76 in #253
- BLOCK refuses a definition that references itself; names are case-insensitive (fixes #250) by @vangel76 in #252
- fix(annotate): DIMCONTINUE/DIMBASELINE in linear time, cap the points (#279) by @vangel76 in #281
- DXF read: map mirrored OCS (extrusion 0,0,−1) of 2D entities to WCS by @STE1200 in #277
- Save As: offer DWG and keep the drawing's format (complements #21) by @Tru10 in #198
- SPLINE Close is smooth and options report; POLYGON typed radius has a flat bottom; CIRCLE rejects bad input (fixes #238) by @vangel76 in #240
- Array commands: ARRAY, and edit-array option loops for ARRAYRECT/ARRAYPOLAR (#230) by @vangel76 in #232
- fix(engine): guard begin/prompt/preview of interactive commands against panics (#283) by @vangel76 in #284
- Default lineweight follows LWDEFAULT (fixes #292) by @vangel76 in #295
- Metric drawings load library linetypes in millimetres (fixes #294) by @vangel76 in #299
- WBLOCK honours base when writing a block (fixes #297) by @vangel76 in #300
- OFFSET keeps a closed spline closed (fixes #303) by @vangel76 in #305
- -BLOCK erases the selection and asks before redefining (fixes #307) by @vangel76 in #310
- Only colour 7 flips with the background (fixes #272) by @vangel76 in #285
- Wide polylines are drawn with their linetype (fixes #293) by @vangel76 in #309
- Wipeouts mask what is drawn before them; WIPEOUTFRAME controls the frame (fixes #291) by @vangel76 in #308
- Extents: ignore what draws nothing (rays, missing or empty blocks, hidden block geometry), as ZOOM Extents does by @STE1200 in #288
- Default save format for new drawings (DXF or DWG) by @Tru10 in #298
- Draw the text of complex linetypes along the line (fixes #312) by @vangel76 in #316
- Object snaps find the geometry inside block references (fixes #314) by @vangel76 in #318
- -RENAME prompts; RENAME renames blocks (fixes #264) by @vangel76 in #266
- -INSERT asks for X and Y scale; Basepoint/Scale/Rotate take effect (fixes #245) by @vangel76 in #249
- OFFSET Erase/Layer/Multiple/Undo and MOVE/COPY Displacement take effect (fixes #244) by @vangel76 in #246
- JSON handles: reject a malformed handle instead of using the selection (fixes #330) by @vangel76 in #331
- Save As to an image or PDF exports without renaming the drawing (fixes #327) by @vangel76 in #329
- Nearest snap picks the closest object in any drawing order (fixes #323) by @vangel76 in #324
- Grip edits act on the whole selection (fixes #320) by @vangel76 in #322
- Refuse edits whose result has infinite or undefined coordinates (fixes #338) by @vangel76 in #339
- MCP: invalid tool arguments are -32602 errors; query_entities counts all matches and windows by geometry (fixes #335) by @vangel76 in #336
- Dimensions take viewport layer colours, leader arrows their style's DIMSCALE, attributes their own properties (fixes #313) by @vangel76 in #319
- Typed angles follow ANGBASE, ANGDIR and AUNITS (fixes #326) by @vangel76 in #328
- Dimensions snap; justified text snaps and grips at its alignment point; grid snap follows SNAPBASE/SNAPANG; OSNAPHATCH (fixes #334) by @vangel76 in #337
- Midpoint, Perpendicular and Tangent snaps on elliptical arcs and splines; Quadrant stays on the arc (fixes #332) by @vangel76 in #333
- LAYMRG and LAYDEL: merge layers, delete a layer with its objects (fixes #286) by @vangel76 in #296
- ATTDISP and ATTSYNC; the display follows ATTMODE (fixes #275, #276) by @vangel76 in #282
- ATTEDIT prompts at the command line; -ATTEDIT; attribute tags in any case (fixes #273, #274) by @vangel76 in #280
- -PURGE: type, names and verify prompts; purge by type (fixes #262) by @vangel76 in #263
- -LAYER: command-line option loop for layers (fixes #254) by @vangel76 in #260
- Draw hatch island styles, backgrounds, two-colour gradients and DXF pattern definitions (fixes #289, #290) by @vangel76 in #302
- Dimension and multileader options take effect (fixes #243) by @vangel76 in #247
- FILLET/CHAMFER: Trim, Multiple, Undo; CHAMFER Angle, mEthod, Polyline (fixes #248) by @vangel76 in #251
- QDIM: one snap index per call, cap the input (fixes #356) by @vangel76 in #357
- TL/ML/BL text is placed by its alignment point (fixes #342) by @vangel76 in #346
- JSON draw/annotation commands refuse invalid sizes and coincident points (fixes #343) by @vangel76 in #344
- DWG and DXF keep ANGBASE/ANGDIR, fillet/chamfer, elevation and the snap grid (fixes #349) by @vangel76 in #350
- Angle prompts read AUNITS, ANGBASE and ANGDIR: ROTATE, HATCH, dimensions, CHAMFER, MLEADER (fixes #353) by @vangel76 in #354
- Control channel: a timed-out request is cancelled, and the reply says whether it ran (fixes #345) by @vangel76 in #348
- Control channel: headless and app reply alike to cmdline.input, state and app.open (fixes #351) by @vangel76 in #352
- INSERT inserts exploded (*NAME) and drawing files (fixes #340) by @vangel76 in #341
- Copy and paste between drawings with their layers and blocks; PASTEORIG, PASTEBLOCK; right-click menu (part of #325) by @vangel76 in #355
- STRETCH: repeat Select objects until Enter, C/W windows, Displacement (fixes #228) by @vangel76 in #231
- fix(geom): preserve boundary vertices far from the origin by @Ni-zav in #386
- fix(geom): use scale-aware circle-circle intersections by @Ni-zav in #384
- Keep egui on the System theme preference so the OS appearance is followed live (#301) by @MarekSpodBiedry in #363
- Undo/redo of LAYOUT Rename/New keeps the session on a layout that exists (fixes #371) by @vangel76 in #375
- DIMBASELINE spacing follows DIM* overrides and DIMSCALE 0 (fixes #364) by @vangel76 in #366
- Angular dimensions keep each leg's extension line; centre mark only outside (fixes #374) by @vangel76 in #377
- Dimension text: DIMRND rounds only the measurement; no DIMPOST on angles (fixes #373) by @vangel76 in #376
- DIMRADIUS/DIMDIAMETER: a location inside the circle puts the text inside (fixes #385) by @vangel76 in #389
- DIMTEDIT prompts at the command line and in scripts (fixes #382) by @vangel76 in #383
- Exploded dimension text and DXF dimension blocks match the drawn text (fixes #367) by @vangel76 in #369
- MLEADER remembers the placement order and Options (fixes #362) by @vangel76 in #365
- Control channel: cmdline.key replies like cmdline.input (fixes #360) by @vangel76 in #361
- ZOOM inside a layout viewport acts on the viewport; nXP sets its scale (fixes #370) by @vangel76 in #372
- LAYOUT / -LAYOUT: option prompts at the command line (fixes #378) by @vangel76 in #380
- VPLAYER: option prompts at the command line (fixes #381) by @vangel76 in #387
- Attributes keep their own layer, colour, linetype and lineweight; -ATTEDIT Layer/Color (fixes #358) by @vangel76 in #359
- ZOOM Center/Scale/Dynamic and plain n; All/Extents fit the sheet in paper space (fixes #388, stacked on #372) by @vangel76 in #391
- fix(select): include solid interiors in crossing-window selection by @Ni-zav in #401
- fix(geom): keep finite-scale tolerance and midpoint math stable by @Ni-zav in #400
- Layouts: a viewport on a frozen layer hides its contents (fixes #395) by @vangel76 in #396
- Dimension text: DIMPOST's suffix also goes on tolerances (fixes #390) by @vangel76 in #394
- Point prompts: FROM, M2P/MTP, point filters, * prefix and <angle override (fixes #392) by @vangel76 in #402
- TRIM/EXTEND: cutting edges, Fence, Crossing, mOde, Project, Edge, eRase, Undo (part of #397) by @vangel76 in #403
- Object snap tracking, Extension, Parallel and Apparent Intersection snaps (fixes #379) by @vangel76 in #405
- PLINE arc-mode options and Length; XLINE picks the polyline segment (fixes #397) by @vangel76 in #407
- Object snap overrides at point prompts, Shift/Ctrl+right-click snap menu, Tab cycling (fixes #393) by @vangel76 in #409
- Release prep: 0.5.0 and Linux riscv64 release build by @echelon in #423
New Contributors
- @kaffeochknivar made their first contribution in #37
- @MarekSpodBiedry made their first contribution in #138
- @cyfung1031 made their first contribution in #128
- @SBaksa made their first contribution in #123
- @Tru10 made their first contribution in #64
- @DWAA1660 made their first contribution in #31
- @LloydNicholson made their first contribution in #46
- @dylanmtaylor made their first contribution in #159
- @dmatviichuk made their first contribution in #36
- @Ni-zav made their first contribution in #210
- @STE1200 made their first contribution in #277
Full Changelog: v0.4.0...v0.5.0