Exemple #1
0
        //--------------------------------------------------------------------------------------------------

        bool _AddEllipicalArcSegment(SketchSegmentEllipticalArc arcSegment, Pnt2d start, Pnt2d end)
        {
            var parameters = new double[2];
            var ellipse    = arcSegment.GetEllipse(_Sketch.Points, parameters);

            if (ellipse == null)
            {
                return(false);
            }
            double rotAngle = ellipse.XAxis().Angle(new Ax2d(ellipse.Location(), Dir2d.DX));
            double length   = parameters[1] - parameters[0];
            var    size     = length < Math.PI ? SvgArcSize.Small : SvgArcSize.Large;
            var    sense    = ellipse.Axis().Sense() > 0;

            if (start == _Sketch.Points[arcSegment.EndPoint])
            {
                sense = !sense; // Sense was inverted by interchanged start/end point
            }
            var sweep = sense ? SvgArcSweep.Positive : SvgArcSweep.Negative;

            var svgSegment = new SvgPathSegArc(start, ellipse.MajorRadius(), ellipse.MinorRadius(), rotAngle.ToDeg(), size, sweep, end);

            _CurrentPath.Segments.Add(svgSegment);
            return(true);
        }
Exemple #2
0
        //--------------------------------------------------------------------------------------------------

        void _OnActionFinished(ToolAction toolAction)
        {
            if (toolAction == _PointAction)
            {
                switch (_PointsCompleted)
                {
                case 0:
                    _CenterPoint = _PointAction.Point;
                    _Points.Add(0, _PointAction.Point);
                    _MergePointIndices[0] = _PointAction.MergeCandidateIndex;
                    _PointsCompleted++;

                    _SketchEditorTool.StatusText = "Select start point for elliptical arc.";

                    _PointAction.Reset();
                    break;

                case 1:
                    if (_CenterPoint.Distance(_PointAction.Point) < 0.001)
                    {
                        // Minimum distance not met
                        _PointAction.Reset();
                        return;
                    }

                    _StartPoint           = _PointAction.Point;
                    _StartPointMergeIndex = _PointAction.MergeCandidateIndex;
                    _PointsCompleted++;

                    _Points.Add(1, _PointAction.Point);
                    _Points.Add(2, _PointAction.Point);
                    _Segment = new SketchSegmentEllipticalArc(1, 2, 0);

                    _Element            = new SketchEditorSegmentElement(_SketchEditorTool, -1, _Segment, _SketchEditorTool.Transform, _SketchEditorTool.Sketch.Plane);
                    _Element.IsCreating = true;
                    _Element.OnPointsChanged(_Points, null);

                    _SketchEditorTool.StatusText = "Select end point for elliptical arc.";

                    _PointAction.Reset();
                    break;

                case 2:
                    if (!_CalcArcRimPoints(_PointAction.Point, _PointAction.MergeCandidateIndex))
                    {
                        // Minimum length not met
                        _PointAction.Reset();
                        return;
                    }

                    _PointAction.Stop();

                    _SketchEditorTool.FinishSegmentCreation(_Points, _MergePointIndices, new SketchSegment[] { _Segment }, null);
                    break;
                }
            }
        }
Exemple #3
0
        //--------------------------------------------------------------------------------------------------

        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);
        }
Exemple #4
0
        public void ConvertEllipticalArcToArc()
        {
            var sketch = Sketch.Create();
            int p1     = sketch.AddPoint(new Pnt2d(2, 1));
            int p2     = sketch.AddPoint(new Pnt2d(-2, 5));
            int pc     = sketch.AddPoint(new Pnt2d(0, 0));
            var s1     = new SketchSegmentEllipticalArc(p1, p2, pc);

            sketch.AddSegment(s1);

            Assert.IsTrue(SketchUtils.CanConvertSegment(sketch, s1, typeof(SketchSegmentArc)));
            var s2 = SketchUtils.ConvertSegment(sketch, s1, typeof(SketchSegmentArc));

            Assert.AreNotEqual(SketchUtils.ConvertSegmentFailed, s2);

            Assert.AreEqual(1, sketch.Segments.Count);
            Assert.IsInstanceOf <SketchSegmentArc>(sketch.Segments[1]);
            Assert.AreEqual(p1, sketch.Segments[s2].StartPoint);
            Assert.AreEqual(p2, sketch.Segments[s2].EndPoint);
            Assert.AreEqual(pc + 1, sketch.Segments[s2].Points[2]);
        }