Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
c8f1b4c
Add sample parity baselines and design docs
mubeda Sep 2, 2026
aeb6074
Assert parity page counts match baselines
mubeda Sep 2, 2026
4cb9d47
Update ACadSharp to 3.7.1 and drop net6.0
mubeda Sep 2, 2026
2ed6212
Add drawing surface abstraction and ImageSharp implementation
mubeda Sep 2, 2026
609a98c
Render entities through the drawing surface
mubeda Sep 2, 2026
e977934
Add RenderedPage abstraction and format-aware Render
mubeda Sep 2, 2026
71e32a0
Emit entity boundaries with effective layer to the surface
mubeda Sep 2, 2026
de84625
Apply plan 1 review fixes
mubeda Sep 2, 2026
29240d1
Add SvgOptions and the Svg export format
mubeda Sep 2, 2026
fc7d42d
Add SVG number and id formatting helpers
mubeda Sep 2, 2026
73d6282
Add SvgDrawingSurface with layer groups and straight primitives
mubeda Sep 2, 2026
19f1ea4
Use fixed precision for SVG style values
mubeda Sep 2, 2026
e061312
Emit native arcs, bulges and Bezier splines for curve-capable surfaces
mubeda Sep 2, 2026
38fe93a
Guard native curves against non-WCS normals and unbounded sweeps
mubeda Sep 2, 2026
0588075
Write CAD text as SVG text elements
mubeda Sep 2, 2026
a878efe
Clip SVG viewport contents with clipPath groups
mubeda Sep 2, 2026
8040d82
Render pages to SVG through the exporter
mubeda Sep 2, 2026
1181c65
Derive SVG style precision from the stroke unit
mubeda Sep 2, 2026
b1b1e5e
Add SVG format and options to the CLI
mubeda Sep 2, 2026
6c3368e
Add SVG golden files for the samples
mubeda Sep 2, 2026
f15170b
Assert golden SVG page counts match
mubeda Sep 2, 2026
24801d7
Apply SVG backend review fixes
mubeda Sep 2, 2026
1a37d40
Add layer visibility, include list and related configuration
mubeda Sep 2, 2026
ea83516
Apply layer visibility and selection in the render loop
mubeda Sep 2, 2026
436b261
Document the render-time reframing on RenderTo
mubeda Sep 2, 2026
8e08ef6
Resolve colour index 7 from the background or ForegroundColor
mubeda Sep 2, 2026
0c76ed0
Map entity transparency to opacity
mubeda Sep 2, 2026
05a2978
Render linetypes as dash patterns with LTSCALE and PSLTSCALE
mubeda Sep 2, 2026
fb22d36
Fix PSLTSCALE branch and test viewport linetype scaling
mubeda Sep 2, 2026
9c54090
Render solid and pattern hatches
mubeda Sep 3, 2026
425d6ef
Add layer visibility, include list and --list-layers to the CLI
mubeda Sep 3, 2026
2e1fec1
Align the layer table and validate --layer-visibility strictly
mubeda Sep 3, 2026
f9821b9
Document layer visibility, selection and SVG output
mubeda Sep 3, 2026
fc99ba8
Apply final review fixes for layer attributes
mubeda Sep 3, 2026
4016f3b
Sanitise SVG text and ids, keep background alpha, run tests on push
mubeda Sep 3, 2026
ed338ef
Bring OCS polylines and hatches into world space, cap hatch expansion…
mubeda Sep 3, 2026
e5709c3
Fit filtered pages through a PageFrame instead of rewriting the page
mubeda Sep 3, 2026
3d2882e
Resolve ByLayer against the effective layer and ByBlock against the i…
mubeda Sep 3, 2026
c140a2b
Draw fit-point-only splines, tighten two tests, record review amendments
mubeda Sep 3, 2026
b8c1585
Test the CLI parser, format resolution and layer table
mubeda Sep 3, 2026
2d4a492
Add the test-hardening plan
mubeda Sep 3, 2026
d045d53
Add a paper-space viewport fixture with PNG baseline and SVG golden
mubeda Sep 3, 2026
0439299
Add feature goldens covering hatches, ellipses, opacity, inserts and …
mubeda Sep 3, 2026
9696fa3
Test spline sampling and text placement through the dispatcher
mubeda Sep 3, 2026
b6fe164
Test the configuration set API, rendered page encoders, formats and u…
mubeda Sep 3, 2026
f58b35f
Fix final review findings in test-hardening tests
mubeda Sep 3, 2026
65d32b5
Add the post-review follow-up plan
mubeda Sep 3, 2026
3bb69ab
Place raster viewport content against the exact viewport height
mubeda Sep 3, 2026
434990e
Correct the viewport parity amendment in the spec
mubeda Sep 3, 2026
58f5e59
Bring OCS solids into world space
mubeda Sep 3, 2026
1ad1427
Route CLI output through writers and document the new test classes
mubeda Sep 3, 2026
e513f8e
Fill solids in DXF corner order and correct the follow-up docs
mubeda Sep 3, 2026
e5d939d
Add the remaining-fixes plan
mubeda Sep 3, 2026
42f5e3c
Keep the sub-pixel position of raster viewport composites
mubeda Sep 3, 2026
d15638d
Place single-line TEXT on non-default OCS planes
mubeda Sep 3, 2026
67c50af
Test frozen inserts with layer-0 contents and tidy the CLI entry point
mubeda Sep 3, 2026
b284365
Normalise exploded TEXT clones and correct the mirrored-text wording
mubeda Sep 3, 2026
292aa69
Place block text through the insert transform and normalise hatch clones
mubeda Sep 3, 2026
c66c2e0
Document text foreshortening and test nested-insert text
mubeda Sep 3, 2026
a4842a7
Tidy text placement: drop unused overloads, warn on edge-on text
mubeda Sep 3, 2026
b1412b7
Skip malformed entities instead of aborting the export
mubeda Sep 3, 2026
5ab4bb5
Add the text-fidelity plan
mubeda Sep 3, 2026
b0521f8
Decode Unicode escapes and percent codes in text
mubeda Sep 3, 2026
88a44b0
Resolve missing font families along a deterministic fallback chain
mubeda Sep 3, 2026
db2e717
Size, anchor and wrap SVG text like the raster backend
mubeda Sep 3, 2026
1ad68f5
Wrap SVG text at the raster's break opportunities and survive missing…
mubeda Sep 3, 2026
3c3793c
Space raster text lines at 5/3 of the text height like AutoCAD
mubeda Sep 3, 2026
de6b00d
Wrap SVG text with a greedy fit at whitespace, hyphen and slash breaks
mubeda Sep 3, 2026
fd9105c
Keep no-break spaces unbroken when wrapping SVG text
mubeda Sep 3, 2026
8ec2894
Describe SVG wrapping parity as line-count parity in the spec
mubeda Sep 3, 2026
3dcf823
Add research note on the remaining rendering limitations
mubeda Sep 3, 2026
2937547
Add the remaining-entities plan
mubeda Sep 3, 2026
5ac7cdc
Refine the remaining-entities plan after pre-flight review
mubeda Sep 3, 2026
feb479a
Draw page entities in the drawing's sort order
mubeda Sep 3, 2026
0c41257
Draw 3DFACE edges on both backends
mubeda Sep 3, 2026
1ceba7d
Draw block attributes and skip attribute definition templates
mubeda Sep 3, 2026
db275fe
Fix round 1: thread ATTMODE through nested inserts, dedupe constant a…
mubeda Sep 3, 2026
bd8e734
Fix round 2: gate constant ATTDEFs on ATTMODE, case-insensitive tag d…
mubeda Sep 3, 2026
32423dd
Draw leaders with their default arrowhead
mubeda Sep 3, 2026
e1a6919
Draw multilines and shield block MLINEs from the destructive clone
mubeda Sep 3, 2026
989eacd
Fix round 1: fill closed MLINE rings, heal nested-block MLINEs in pla…
mubeda Sep 3, 2026
cadbe95
Mask wipeouts with the background colour
mubeda Sep 3, 2026
fddd9d4
Size raster text in ems at 72 dpi and fix the leading compensation
mubeda Sep 3, 2026
f85567c
Guard non-finite fills and close the plan 08 review items
mubeda Sep 3, 2026
771b265
Drop the last 96 dpi wording and point the research note at TextMetrics
mubeda Sep 3, 2026
aee549f
Split the research note's source pointers for TextMetrics and SvgText…
mubeda Sep 3, 2026
0131f28
Note the draw-order and Dpi behaviour changes in the README migration…
mubeda Sep 3, 2026
5a2146d
Add the Codex review fixes plan
mubeda Sep 4, 2026
cd0a9d1
Refine plan 09 after pre-flight review
mubeda Sep 4, 2026
f605a91
Draw viewports in page order and survive malformed model entities in …
mubeda Sep 4, 2026
99c06ae
Draw only AddViewport'd viewports as viewports; review fixes
mubeda Sep 4, 2026
e846c60
Frame pages from the geometry the renderer draws and skip block refer…
mubeda Sep 4, 2026
771b2aa
Cull viewport contents by the renderer's own bounds, not raw GetBound…
mubeda Sep 4, 2026
555caab
Cull viewport contents by XY bounds overlap, not corner-based IsIn
mubeda Sep 4, 2026
abad75e
Add the design note and spec for the remaining rendering limitations
mubeda Sep 4, 2026
c8207b3
Place block solids and leaders from their originals through the inser…
mubeda Sep 4, 2026
2e6d466
Fix round 1: carry LEADER vertex Z into the arrowhead anchor
mubeda Sep 4, 2026
10259a9
Stretch block text along the reading axis under non-uniform insert sc…
mubeda Sep 4, 2026
efca4a9
Fix round 1 for task 4: style-precision stretch factor, guard alignme…
mubeda Sep 4, 2026
0902b36
Fix MLINE fallback offsets and inherited element linetypes, cache blo…
mubeda Sep 4, 2026
9d5a0a6
Fix round 1 for Task 5: real LEADER staleness test, cache-truncation …
mubeda Sep 4, 2026
0546c91
Preserve text whitespace in SVG, refresh stale docs, reject extra CLI…
mubeda Sep 4, 2026
776611f
Fix round 1 for Task 6: scope xml:space to avoid drawing pretty-print…
mubeda Sep 4, 2026
157becd
Pin DRAWORDER tables, render the new entities through both backends, …
mubeda Sep 4, 2026
84e29d2
Polish round for Task 7: docs, dedupe WithHandle, tighten assertions
mubeda Sep 4, 2026
1557691
Refresh the remaining-limitations design against the current code
mubeda Sep 4, 2026
42151d3
Fix final-review findings from plan 09 (C1, I1, I2, M1-M4)
mubeda Sep 4, 2026
77e6b65
Add the implementation plan for the remaining rendering limitations
mubeda Sep 4, 2026
2e945a8
Amend plan 10 Task 1: build test placements from a real block reference
mubeda Sep 4, 2026
ff9676d
Amend plan 10 after review: cycle detection, arrow placement, scope r…
mubeda Sep 4, 2026
6cd2dc5
Add the insert placement helpers and route the existing maps through …
mubeda Sep 4, 2026
ecf1435
Lay out multi-line attributes from their embedded MText
mubeda Sep 4, 2026
669d7c3
Cover the orthogonality branch of TryGetPlanarSimilarity with a shear…
mubeda Sep 4, 2026
13cc66b
Cover the placed constant multi-line ATTDEF and label the observable-…
mubeda Sep 4, 2026
792b934
Draw hatches from the original entity in its own OCS through the inse…
mubeda Sep 4, 2026
28719b6
Polish task 3: pattern-hatch mirror test, doc gaps from review
mubeda Sep 4, 2026
609f6ed
Refuse a circular block graph before exploding or bounding it
mubeda Sep 4, 2026
d5d32c1
Draw custom arrowhead blocks at leader tips
mubeda Sep 4, 2026
ab66bec
Cover the MLINE-hidden, diamond, and direct self-reference cycle cases
mubeda Sep 4, 2026
68fe3b8
Snapshot a leader's arrowhead block before its contents are cloned
mubeda Sep 4, 2026
d5aa179
Mask inverted wipeout clips and ignore the clip mode when clipping is…
mubeda Sep 4, 2026
2ea9352
Draw MLINE cut segments from their stored positions
mubeda Sep 4, 2026
8bbd846
Fix round 1 for Task 6: harden thin inverted-wipeout ring assertions
mubeda Sep 4, 2026
c5feac0
Correct the MLINE cut documentation and cover the closed and non-fini…
mubeda Sep 4, 2026
4d6a47e
Add a golden that exercises every newly drawn feature
mubeda Sep 4, 2026
03416ee
Polish Task 8's golden: notification guard, non-degenerate wipeout fi…
mubeda Sep 4, 2026
82cecfa
Follow every dimension-style block edge when healing and guarding
mubeda Sep 4, 2026
6d5f9ff
Record what plan 10 actually shipped, and the widened block-edge cove…
mubeda Sep 4, 2026
94c9c28
Follow a dimension's picture block, the fifth cloning edge
mubeda Sep 4, 2026
dd4b145
Snapshot and heal around a top-level dimension's UpdateBlock()
mubeda Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
*.png binary
#*.gif binary

###############################################################################
Expand Down
16 changes: 14 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,20 @@ on:
- 'ACadSharp.Image/**'
- 'ACadSharp.Image.Cli/**'
- 'ACadSharp.Image.Tests/**'
- 'Directory.Packages.props'
- 'Directory.Build.props'
- '*.sln'
- '.github/workflows/ci.yml'
push:
branches:
- main
paths:
- 'ACadSharp.Image/**'
- 'ACadSharp.Image.Cli/**'
- 'ACadSharp.Image.Tests/**'
- 'Directory.Packages.props'
- 'Directory.Build.props'
- '*.sln'
- '.github/workflows/ci.yml'

jobs:
Expand All @@ -26,12 +33,17 @@ jobs:
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
6.0.x
8.0.x
10.0.x

- name: Restore
run: dotnet restore ACadSharp.Image.sln

- name: Install parity font
run: sudo apt-get update && sudo apt-get install -y fonts-dejavu-core

- name: Build
run: dotnet build ACadSharp.Image.sln --configuration Release --no-restore -warnaserror

- name: Test
run: dotnet test ACadSharp.Image.sln --configuration Release --no-restore
run: dotnet test ACadSharp.Image.sln --configuration Release --no-build
1 change: 0 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ jobs:
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
6.0.x
8.0.x
10.0.x

Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -361,4 +361,6 @@ MigrationBackup/
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd
FodyWeavers.xsd
# CodeGraph index
.codegraph/
4 changes: 4 additions & 0 deletions ACadSharp.Image.Cli/ACadSharp.Image.Cli.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,8 @@
<ProjectReference Include="..\ACadSharp.Image\ACadSharp.Image.csproj" SetTargetFramework="TargetFramework=net10.0" AdditionalProperties="TargetFramework=net10.0;TargetFrameworks=net10.0;PublishAot=false" />
</ItemGroup>

<ItemGroup>
<InternalsVisibleTo Include="ACadSharp.Image.Tests" />
</ItemGroup>

</Project>
10 changes: 9 additions & 1 deletion ACadSharp.Image.Cli/CliOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,13 @@ internal sealed record CliOptions(
string BackgroundColor,
int Quality,
bool ExportPaperLayouts,
IReadOnlyList<string> HideLayers
IReadOnlyList<string> HideLayers,
bool SvgNoScalingStroke,
bool SvgNoEntityAttributes,
bool SvgEmitSize,
string SvgIdPrefix,
int? SvgPrecision,
LayerVisibilityMode? LayerVisibility,
IReadOnlyList<string> OnlyLayers,
bool ListLayers
);
Loading
Loading