//--------------------------------------------------------------------------------------------------

        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;
                }
            }
        }
Example #2
0
        //--------------------------------------------------------------------------------------------------

        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);
        }
Example #3
0
        //--------------------------------------------------------------------------------------------------

        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));
            }
        }
Example #4
0
        //--------------------------------------------------------------------------------------------------

        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);
        }
Example #5
0
        //--------------------------------------------------------------------------------------------------

        void _ImportSplineWithControlPoints(DxfDomSpline dxfSpline)
        {
            var spline = Geom2dUtils.MakeBSplineCurve(dxfSpline.Degree, dxfSpline.Knots, dxfSpline.ControlPoints, dxfSpline.Weights, dxfSpline.Flags.Has(DxfDomSpline.SplineFlags.IsClosed));

            _AddBSplineCurve(spline);
        }