//-------------------------------------------------------------------------------------------------- void _ImportArcSegment(SvgPathSegArc svgSegment, ref int startPoint) { var radiusX = svgSegment.RadiusX; var radiusY = svgSegment.RadiusY; var rotation = -svgSegment.Angle.ToRad(); var startPnt2d = svgSegment.Start; var endPnt2d = svgSegment.End; var centerPnt2d = Geom2dUtils.FindEllipseCenterFromEndpoints( startPnt2d, endPnt2d, radiusX, radiusY, rotation, (int)svgSegment.Size != (int)svgSegment.Sweep); // Do we have a circle arc? if (Math.Abs(radiusX - radiusY) < 0.0001) { var axis = Ax2d.OX.Rotated(Pnt2d.Origin, rotation).Translated(centerPnt2d.ToVec()); var circ = new gp_Circ2d(axis, radiusX, svgSegment.Sweep != SvgArcSweep.Positive); //Debug.WriteLine("StartParam: {0} - EndParam: {1}", ElCLib.Parameter(circ, startPnt2d), ElCLib.Parameter(circ, endPnt2d)); var startParam = ElCLib.Parameter(circ, startPnt2d); var endParam = ElCLib.Parameter(circ, endPnt2d); if (endParam < startParam) { endParam += 2 * Math.PI; } var rimPnt2d = ElCLib.Value(startParam + (endParam - startParam) / 2, circ); var endPoint = _AddPoint(endPnt2d); _Segments.Add(new SketchSegmentArc(startPoint, endPoint, _AddPoint(rimPnt2d))); startPoint = endPoint; } else { // No, we have a elliptical arc // Construct ellipse, convert to bezier var axis = Ax2d.OX.Rotated(Pnt2d.Origin, rotation).Translated(centerPnt2d.ToVec()); var ellipse = new gp_Elips2d(axis, radiusX, radiusY, svgSegment.Sweep != SvgArcSweep.Positive); var startParam = ElCLib.Parameter(ellipse, startPnt2d); var endParam = ElCLib.Parameter(ellipse, endPnt2d); if (double.IsNaN(startParam) || double.IsNaN(endParam)) { Messages.Warning("Invalid elliptical arc found in SVG file."); return; } var bezierPointArray = Geom2dUtils.EllipticalArcToBezier(ellipse, startParam, endParam); foreach (var bezierPoints in bezierPointArray) { var endPoint = _AddPoint(bezierPoints.p2); _Segments.Add(new SketchSegmentBezier(startPoint, _AddPoint(bezierPoints.c1), _AddPoint(bezierPoints.c2), endPoint)); startPoint = endPoint; } } }
//-------------------------------------------------------------------------------------------------- void IDrawingRenderer.BSplineCurve(int degree, double[] knots, Pnt2d[] controlPoints, double[] weights, bool isRational) { if (_Document.Flags.HasFlag(DxfFlags.ExportSplineAsPolygon)) { var spline = Geom2dUtils.MakeBSplineCurve(degree, knots, controlPoints, weights, false); _AddPolygonCurve(spline); return; } var flags = isRational ? DxfDomSpline.SplineFlags.IsRational : DxfDomSpline.SplineFlags.None; var entity = new DxfDomSpline(_CurrentLayerName, degree, knots, controlPoints, weights, flags); _AddEntity(entity); }
//-------------------------------------------------------------------------------------------------- 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 _ValueHudElement_RadiusEntered(ValueHudElement hudElement, double newValue) { if (newValue == 0) { return; } if (_Points[0].Distance(_Points[1]) == 0) { return; } var center = Geom2dUtils.FindEllipseCenterFromEndpoints(_Points[0], _Points[1], newValue, newValue, 0, newValue > 0); var xAxis = new Ax2d(center, new Dir2d(new Vec2d(center, _Points[0]))); var radius = center.Distance(_Points[0]); var circ = new gp_Circ2d(xAxis, radius, newValue < 0); var endParameter = ElCLib.Parameter(circ, _Points[1]); _Points[2] = ElCLib.Value(endParameter / 2, circ); _MergePointIndices[2] = -1; _PointAction.Stop(); _SketchEditorTool.FinishSegmentCreation(_Points, _MergePointIndices, new SketchSegment[] { _Segment }, null); }
//-------------------------------------------------------------------------------------------------- void _ImportSplineWithControlPoints(DxfDomSpline dxfSpline) { var spline = Geom2dUtils.MakeBSplineCurve(dxfSpline.Degree, dxfSpline.Knots, dxfSpline.ControlPoints, dxfSpline.Weights, dxfSpline.Flags.Has(DxfDomSpline.SplineFlags.IsClosed)); _AddBSplineCurve(spline); }