From 59d121da6927c83f13697c4fa8a283702cebf090 Mon Sep 17 00:00:00 2001 From: DomCR Date: Wed, 6 Nov 2024 12:41:10 +0100 Subject: [PATCH] ellipse --- samples/export_sample.dwg | Bin 42128 -> 69174 bytes src/ACadSharp.Pdf/Core/IO/PdfPen.cs | 47 +++++++++++++++++++++------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/samples/export_sample.dwg b/samples/export_sample.dwg index 3fbe00390c3ea6ce1efc2cf011ce948dd4ffac9b..192028df79dd2862ffb48bc9f516cfc9c912e900 100644 GIT binary patch delta 8118 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 RsUluQ_Uo6p{U5p6{{zD7g2(^> delta 1762 zcmcIleNbCf7C+~{mk&t7XIemLc{~WE6lh4ohXrjyTMG5-Vbhv)lR~x+Y%A=th?w1h zl8&`viJEY$(wbD-QKu^7y2g*$(b`tql~U|>$NE)J=}x=OXenc7brgf~rqzG^-!t>O z@1FC{z3-ee=Xc)gAwF=51cvPen{_$LH`ab0NxN;V?#;pHblj%CZ2?2B``qd1D@|)^ z(sd6f=1jh1GVYhIw0JA$hZ;@aecsnNb@UGX)f4}1JA2Ow;~V)k2gQqGFnnP!_xx*v zukWTQ&+3OTQ(fA;>*l?GXsD+Gn)EH3GU3NP2Jq(H&mA8$z_DqW5877H5zH)2);kVw zNj;RDYv@p&t1K!C-!;B6ygFrBrwV}Jmk1yMfU=4J=v4Ihf;%Hs#K@_}8duxw-t&>3 z=tmsAD`8tuN{<{%sOHog8Z!QOW?f1672Ph9VT4jJK?T^^YJ?SRt!Aqw@>KFRuD{JH z+iY&xreU~;?ckxyoJEvUx?4 zq?l-S)w>!^Ip9bv9Mu=ei(ln8xXF^exdup=bomQ%lVuXp*>$cg+H|G9zht2p&BnV~ zb;PN~?iC<4-WbhmR|}dHkgQ@T6Ir=@j(R^4G-?!BcGqNh6bzRe#1cbc?M)q+ZZPEM z83u|RtU61@mzRc!IJ{K!7qEIjEEW?|YM0c$T59Z$S0Wy)r&+9RbPC`qEKQ3p5kDy` zjGD!XMn_5E3ZjsV~Lh1|r>RUlR*}J2S)euEds2c6a;jj-;)tB#&HePiraNEKjuAjjcDt z{*)GrZPdhK-bmj!%^8u?%R4-l^0O}=yEI{2ru-#O_`ye1zmkME`S^V(2S^x6fb=4= z++y8?UU;e_D5>xYEjyS&zYmV}2TrQs@5g1^o$t!F!FOcai)CyCg?b~IFnbg#|`*8QXm7dlw z(;unClj-=3A93tR9eMC+#H(pk$JnfS{1Meg`tgp->nDpxfQ#Lad2o@18)tny+Y(@H z0o+0;V}@>IL~B(vGq#}@_adl}31j7Nr^`_;sII1G7Y1p6I3d&eK4Uq<*JrNd#J_7^ z`lq>l6&(rxbxFL|#_BBOIF3IX|AvvtZpA^LIzG010IUgwnmKAcu+CJby)^Z_FRe3i z=NG4bXyHR_LS5xl^M8yUp8YQS)FQW4kr#a4wr68JcpkLM{Av2ufj0?MQSZ}_wXFs- zn?YJ8`;~qt(y6p!3L|CUdR0En0Gll(+3aXb}>;b z7GE%p7krhUcwNNeYfrj$q(V^IzVX*Ow`Zn)IIT49nw}zg?`<4;;K{ZB7@8OX=v;rj zgLvhn9(1g&M}~wOzK%RMS^H28Y_VBbFMiKR$ff~s1BW)yb3=K2K^9o(+|aVDYtyTE z(QAq4n|Rn!4$5A1=V%Aiy|jidE|AROZ0<<5#;fvI^=1$7f;I~{yQT#t!fxEF>c!0# T+E0rkjfW;N=*#?FenLM30xKoP diff --git a/src/ACadSharp.Pdf/Core/IO/PdfPen.cs b/src/ACadSharp.Pdf/Core/IO/PdfPen.cs index fa0aa94..d792cc8 100644 --- a/src/ACadSharp.Pdf/Core/IO/PdfPen.cs +++ b/src/ACadSharp.Pdf/Core/IO/PdfPen.cs @@ -49,6 +49,9 @@ public void DrawEntity(Entity entity, Transform transform) case Circle circle: this.drawCircle(circle, transform); break; + case Ellipse ellipse: + this.drawEllpise(ellipse, transform); + break; case Line line: this.drawLine(line, transform); break; @@ -109,16 +112,12 @@ private void applyStyle(Entity entity) private void drawArc(Arc arc, Transform transform) { - var vertices = arc.PolygonalVertexes(this._configuration.ArcPrecision) - .Select(v => transform.ApplyTransform((XYZ)v)).ToArray(); - this.appendXY(vertices.First(), PdfKey.BeginPath); - - for (int i = 1; vertices.Count() > i; i++) - { - this.appendXY(vertices[i], PdfKey.Line); - } + XY[] vertices = arc.PolygonalVertexes(this._configuration.ArcPrecision) + .Select(v => transform.ApplyTransform((XYZ)v)) + .Select(v => (XY)v) + .ToArray(); - this.appendXY(vertices.Last(), PdfKey.Stroke); + this.appendPath(vertices); } private void drawCircle(Circle circle, Transform transform) @@ -143,6 +142,17 @@ private void drawCircle(Circle circle, Transform transform) this._sb.AppendLine($"h {PdfKey.Stroke}"); } + private void drawEllpise(Ellipse ellipse, Transform transform) + { + XY[] vertices = ellipse.PolygonalVertexes(this._configuration.ArcPrecision) + .Select(v => v + (XY)ellipse.Center) + .Select(v => transform.ApplyTransform((XYZ)v)) + .Select(v => (XY)v) + .ToArray(); + + this.appendPath(vertices); + } + private void drawLine(Line line, Transform transform) { this.appendXY(transform.ApplyTransform(line.StartPoint), PdfKey.BeginPath); @@ -162,7 +172,7 @@ private void drawPoint(Point point, Transform transform) private void drawPolyline(IPolyline polyline, Transform transform) { - var vertices = polyline.Vertices.Select(v => transform.ApplyTransform(v.Location.Convert())); + IEnumerable vertices = polyline.Vertices.Select(v => transform.ApplyTransform(v.Location.Convert())); this.appendXY(vertices.First(), PdfKey.BeginPath); @@ -171,7 +181,6 @@ private void drawPolyline(IPolyline polyline, Transform transform) this.appendXY(vertices.ElementAt(i), PdfKey.Line); } - if (polyline.IsClosed) { this.appendXY(vertices.Last(), PdfKey.Line); @@ -179,8 +188,10 @@ private void drawPolyline(IPolyline polyline, Transform transform) } else { - this.appendXY(vertices.Last(), PdfKey.Stroke); + this.appendXY(vertices.Last(), PdfKey.Line); } + + this._sb.AppendLine(PdfKey.Stroke); } private void drawViewport(Viewport viewport) @@ -217,6 +228,18 @@ private void drawViewport(Viewport viewport) this._sb.AppendLine(PdfKey.StackEnd); } + private void appendPath(params XY[] vertices) + { + this.appendXY(vertices.First(), PdfKey.BeginPath); + + for (int i = 1; vertices.Count() > i; i++) + { + this.appendXY(vertices[i], PdfKey.Line); + } + + this.appendXY(vertices.Last(), PdfKey.Stroke); + } + private void appendArray(string key, params double[] arr) { this._sb.AppendJoin(" ", arr.Select(d => this.toPdfDouble(d)));