//-------------------------------------------------------------------------------------------------- void _ImportEllipse(DxfDomEllipse dxfEllipse) { var centerPoint = dxfEllipse.CenterPoint; var majorRimPoint = centerPoint.Translated(dxfEllipse.MajorAxisPointOffset.ToVec()); var minorRimPoint = centerPoint.Translated(dxfEllipse.MajorAxisPointOffset.ToVec().Rotated(90.0.ToRad()).Scaled(dxfEllipse.Ratio)); var centerIndex = _AddPoint(centerPoint, false); var majorRimIndex = _AddPoint(majorRimPoint, false); var minorRimIndex = _AddPoint(minorRimPoint, false); if (majorRimIndex != minorRimIndex) { _Segments.Add(new SketchSegmentEllipse(centerIndex, majorRimIndex, minorRimIndex)); } }
//-------------------------------------------------------------------------------------------------- void _ImportEllipticalArc(DxfDomEllipse dxfEllipse) { var centerPoint = dxfEllipse.CenterPoint; var majorRimPoint = centerPoint.Translated(dxfEllipse.MajorAxisPointOffset.ToVec()); var minorRimPoint = centerPoint.Translated(dxfEllipse.MajorAxisPointOffset.ToVec().Rotated(90.0.ToRad()).Scaled(dxfEllipse.Ratio)); var ellipse = Geom2dUtils.MakeEllipse(centerPoint, majorRimPoint, minorRimPoint); var bezierPointArray = Geom2dUtils.EllipticalArcToBezier(ellipse, dxfEllipse.StartParameter, dxfEllipse.EndParameter); foreach (var bezierPoints in bezierPointArray) { var startPoint = _AddPoint(bezierPoints.p1); var endPoint = _AddPoint(bezierPoints.p2); _Segments.Add(new SketchSegmentBezier(startPoint, _AddPoint(bezierPoints.c1, false), _AddPoint(bezierPoints.c2, false), endPoint)); } }
//-------------------------------------------------------------------------------------------------- void _AddEllipseSegment(SketchSegmentEllipse ellipseSegment) { var ellipse = ellipseSegment.GetEllipse(_Sketch.Points); if (_Document.Flags.HasFlag(DxfFlags.ExportEllipseAsPolygon)) { _AddPolygonCurve(new Geom2d_Ellipse(ellipse)); return; } var center = ellipse.Location(); var majorAxisPointOffset = ellipse.XAxis().Direction.ToVec().Multiplied(ellipse.MajorRadius()).ToPnt(); var ratio = ellipse.MinorRadius() / ellipse.MajorRadius(); var entity = new DxfDomEllipse("0", center, majorAxisPointOffset, ratio); _Document.Entities.Add(entity); }
//-------------------------------------------------------------------------------------------------- void _AddEllipse(Geom2d_Ellipse ellipse, double first, double last) { if (_Document.Flags.HasFlag(DxfFlags.ExportEllipseAsPolygon)) { if (Math.Abs(last - first) < ellipse.Period()) { // Elliptical arc var trimmedCurve = new Geom2d_TrimmedCurve(ellipse, first, last); _AddPolygonCurve(trimmedCurve); } else { // Full ellipse _AddPolygonCurve(ellipse); } return; } var center = ellipse.Location(); var majorAxisPointOffset = ellipse.XAxis().Direction.ToVec().Multiplied(ellipse.MajorRadius()); var ratio = ellipse.MinorRadius() / ellipse.MajorRadius(); if (Math.Abs(last - first) < ellipse.Period()) { // Elliptical arc if (ellipse.Position().Sense() > 0) { var temp = first; first = ellipse.Period() - last; last = ellipse.Period() - temp; } var entity = new DxfDomEllipse(_CurrentLayer, center, majorAxisPointOffset.ToPnt(), ratio, first, last); _Document.Entities.Add(entity); } else { // Full ellipse var entity = new DxfDomEllipse(_CurrentLayer, center, majorAxisPointOffset.ToPnt(), ratio); _Document.Entities.Add(entity); } }
//-------------------------------------------------------------------------------------------------- void _AddEllipticalArcSegment(SketchSegmentEllipticalArc arcSegment) { var parameter = new double[2]; var ellipse = arcSegment.GetEllipse(_Sketch.Points, parameter); if (_Document.Flags.HasFlag(DxfFlags.ExportEllipseAsPolygon)) { var trimmedCurve = new Geom2d_TrimmedCurve(new Geom2d_Ellipse(ellipse), parameter[0], parameter[1]); _AddPolygonCurve(trimmedCurve); return; } var center = ellipse.Location(); var majorAxisPointOffset = ellipse.XAxis().Direction.ToVec().Multiplied(ellipse.MajorRadius()).ToPnt(); var ratio = ellipse.MinorRadius() / ellipse.MajorRadius(); var entity = new DxfDomEllipse("0", center, majorAxisPointOffset, ratio, parameter[0], parameter[1]); _Document.Entities.Add(entity); }
//-------------------------------------------------------------------------------------------------- void _ReadEntities(DxfReader reader) { while (reader.GroupCode >= 0) { if (reader.GroupCode != 0) { reader.Skip(); continue; } var type = reader.ReadString()?.ToUpper(); if (type == null) { continue; } DxfDomEntity entity = null; switch (type) { case "ENDSEC": return; case "LINE": entity = new DxfDomLine(); break; case "CIRCLE": case "ARC": entity = new DxfDomCircle(); break; case "ELLIPSE": entity = new DxfDomEllipse(); break; case "LWPOLYLINE": entity = new DxfDomLwPolyline(); break; case "POLYLINE": entity = new DxfDomPolyline(); break; case "SPLINE": entity = new DxfDomSpline(); break; } if (entity == null) { continue; } if (entity.Read(reader)) { Entities.Add(entity); } else { Messages.Error($"DxfReader: Incomplete entity description at line {reader.Line}."); } } }