Пример #1
0
        //--------------------------------------------------------------------------------------------------

        void _AddBezierSegment(SketchSegmentBezier bezierSegment)
        {
            if (_Document.Flags.HasFlag(DxfFlags.ExportSplineAsPolygon))
            {
                var curve = bezierSegment.MakeCurve(_Sketch.Points);
                if (curve == null)
                {
                    Messages.Error($"Cannot make curve for converting bezier segment to polyline.");
                    return;
                }

                _AddPolygonCurve(curve);
            }
            else
            {
                var pointCount = bezierSegment.Points.Length;

                var knots = new double[pointCount * 2];
                knots.Fill(0, pointCount, 0.0);
                knots.Fill(pointCount, pointCount, 1.0);

                var points = bezierSegment.Points.Select(idx => _Sketch.Points[idx]).ToArray();

                var entity = new DxfDomSpline("0", pointCount - 1, knots, points, null, DxfDomSpline.SplineFlags.None);
                _Document.Entities.Add(entity);
            }
        }
Пример #2
0
        public void SmoothCorner_BezierArc()
        {
            var sketch      = Sketch.Create();
            var p1          = sketch.AddPoint(new Pnt2d(0, 0));
            var p2          = sketch.AddPoint(new Pnt2d(2, 9));
            var p3          = sketch.AddPoint(new Pnt2d(10, 10));
            var p4          = sketch.AddPoint(new Pnt2d(20, 0));
            var p5          = sketch.AddPoint(new Pnt2d(18, 7));
            var bezier1     = new SketchSegmentBezier(p1, p2, p3);
            var s1          = sketch.AddSegment(bezier1);
            var arc         = new SketchSegmentArc(p3, p4, p5);
            var s2          = sketch.AddSegment(arc);
            var constraint1 = new SketchConstraintSmoothCorner(p3, true);
            var c1          = sketch.AddConstraint(constraint1);

            Assert.IsTrue(sketch.SolveConstraints(true));

            var tan1      = new Vec2d(sketch.Points[p2], sketch.Points[p3]);
            var parameter = new double[2];
            var circle    = arc.GetCircle(sketch.Points, parameter);
            var pnt       = new Pnt2d();
            var tan2      = new Vec2d();

            ElCLib.D1(parameter[0], circle, ref pnt, ref tan2);
            Assert.IsTrue(tan1.IsParallel(tan2, 0.01));
        }
Пример #3
0
        //--------------------------------------------------------------------------------------------------

        void _SetEndPoint(Pnt2d point, int mergeCandidateIndex)
        {
            // End point
            if (_Points[0].Distance(point) < 0.001)
            {
                // Minimum length not met
                _PointAction.Reset();
                return;
            }

            _Points[1]            = point;
            _Points[2]            = point;
            _MergePointIndices[2] = mergeCandidateIndex;

            _Segment = new SketchSegmentBezier(0, 1, 2);

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

            _HintLine.Remove();
            _HintLine = null;

            _SketchEditorTool.WorkspaceController.HudManager?.RemoveElement(_ValueHudElement);
            _ValueHudElement = null;

            _SketchEditorTool.StatusText = "Select control point for line.";

            _PointAction.Reset();
            pointsFinished++;

            _SketchEditorTool.WorkspaceController.Invalidate();
            _SketchEditorTool.WorkspaceController.UpdateSelection();
        }
Пример #4
0
        public void ConvertBezier3ToBezier()
        {
            var sketch = Sketch.Create();
            int p1     = sketch.AddPoint(new Pnt2d(-2, 0));
            int p2     = sketch.AddPoint(new Pnt2d(0.5, 5));
            int p3     = sketch.AddPoint(new Pnt2d(2, 3));
            int p4     = sketch.AddPoint(new Pnt2d(3, 2));
            var s1     = new SketchSegmentBezier(p1, p2, p3, p4);

            sketch.AddSegment(s1);

            Assert.IsFalse(SketchUtils.CanConvertSegment(sketch, s1, typeof(SketchSegmentBezier)));
        }
Пример #5
0
        //--------------------------------------------------------------------------------------------------

        bool _AddBezierSegment(SketchSegmentBezier segment, Pnt2d start, Pnt2d end)
        {
            switch (segment.Points.Length)
            {
            case 3:
                var controlPoint = _Sketch.Points[segment.Points[1]];
                _CurrentPath.Segments.Add(new SvgPathSegCurvetoQuadratic(start, controlPoint, end));
                break;

            case 4:
                var controlPoint1 = _Sketch.Points[segment.Points[1]];
                var controlPoint2 = _Sketch.Points[segment.Points[2]];
                _CurrentPath.Segments.Add(new SvgPathSegCurvetoCubic(start, controlPoint1, controlPoint2, end));
                break;

            default:
                Messages.Warning($"The bezier segment {_Sketch.Segments.FirstOrDefault(x => x.Value == segment).Key} is of a higher order than cubic, which is unsupported in SVG paths.");
                return(false);
            }
            return(true);
        }
Пример #6
0
        //--------------------------------------------------------------------------------------------------

        public bool Continue(int continueWithPoint)
        {
            // Start the next line with the first point already catched
            _Points[0]            = _SketchEditorTool.Sketch.Points[continueWithPoint];
            _MergePointIndices[0] = continueWithPoint;
            _Element?.Remove();

            _Segment  = null;
            _HintLine = new HintLine(_SketchEditorTool.WorkspaceController, HintStyle.ThinDashed | HintStyle.Topmost);
            _HintLine.Set(_Points[0], _Points[0], _SketchEditorTool.Sketch.Plane);

            _PointAction = new SketchPointAction(_SketchEditorTool);
            if (!_SketchEditorTool.WorkspaceController.StartToolAction(_PointAction, false))
            {
                return(false);
            }

            pointsFinished = 1;
            _SketchEditorTool.StatusText = "Select end point for line.";
            return(true);
        }
Пример #7
0
        public void ConvertBezierToArc()
        {
            var sketch = Sketch.Create();
            int p1     = sketch.AddPoint(new Pnt2d(-2, 0));
            int p2     = sketch.AddPoint(new Pnt2d(0.5, 5));
            int p3     = sketch.AddPoint(new Pnt2d(3, 2));
            var s1     = new SketchSegmentBezier(p1, p2, p3);

            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(p3, sketch.Segments[s2].EndPoint);
            Assert.AreEqual(p3 + 1, sketch.Segments[s2].Points[2]);
        }
Пример #8
0
        public void SmoothCorner_BezierLine()
        {
            var sketch      = Sketch.Create();
            var p1          = sketch.AddPoint(new Pnt2d(0, 0));
            var p2          = sketch.AddPoint(new Pnt2d(2, 9));
            var p3          = sketch.AddPoint(new Pnt2d(10, 10));
            var p4          = sketch.AddPoint(new Pnt2d(15, 0));
            var bezier1     = new SketchSegmentBezier(p1, p2, p3);
            var s1          = sketch.AddSegment(bezier1);
            var line        = new SketchSegmentLine(p3, p4);
            var s2          = sketch.AddSegment(line);
            var constraint1 = new SketchConstraintSmoothCorner(p3, true);
            var c1          = sketch.AddConstraint(constraint1);

            Assert.IsTrue(sketch.SolveConstraints(true));

            var tan1 = new Vec2d(sketch.Points[p2], sketch.Points[p3]);
            var tan2 = new Vec2d(sketch.Points[p3], sketch.Points[p4]);

            Assert.IsTrue(tan1.IsParallel(tan2, 0.01));
        }
Пример #9
0
        public void SmoothCorner_BezierBezier_Symmetric()
        {
            var sketch      = Sketch.Create();
            var p1          = sketch.AddPoint(new Pnt2d(0, 0));
            var p2          = sketch.AddPoint(new Pnt2d(2, 9));
            var p3          = sketch.AddPoint(new Pnt2d(10, 10));
            var p4          = sketch.AddPoint(new Pnt2d(15, 9));
            var p5          = sketch.AddPoint(new Pnt2d(20, 7));
            var p6          = sketch.AddPoint(new Pnt2d(20, 0));
            var bezier1     = new SketchSegmentBezier(p1, p2, p3);
            var s1          = sketch.AddSegment(bezier1);
            var bezier2     = new SketchSegmentBezier(p3, p4, p5, p6);
            var s2          = sketch.AddSegment(bezier2);
            var constraint1 = new SketchConstraintSmoothCorner(p3, true);
            var c1          = sketch.AddConstraint(constraint1);

            Assert.IsTrue(sketch.SolveConstraints(true));

            var tan1 = new Vec2d(sketch.Points[p2], sketch.Points[p3]);
            var tan2 = new Vec2d(sketch.Points[p3], sketch.Points[p4]);

            Assert.IsTrue(tan1.IsParallel(tan2, 0.1));
            Assert.AreEqual(tan1.Magnitude(), tan2.Magnitude(), 0.0001);
        }
        //--------------------------------------------------------------------------------------------------

        void _OnActionFinished(ToolAction toolAction)
        {
            if (toolAction == _PointAction)
            {
                switch (pointsFinished)
                {
                case 0:
                    // Start point
                    _Points.Add(0, _PointAction.Point);
                    _MergePointIndices[0] = _PointAction.MergeCandidateIndex;

                    _HintLine = new HintLine(_SketchEditorTool.WorkspaceController, HintStyle.ThinDashed | HintStyle.Topmost);
                    _HintLine.Set(_PointAction.Point, _PointAction.Point, _SketchEditorTool.Sketch.Plane);

                    _SketchEditorTool.StatusText = "Select end point for line.";

                    _PointAction.Reset();
                    pointsFinished++;
                    break;

                case 1:
                    // End point
                    if (_Points[0].Distance(_PointAction.Point) < 0.001)
                    {
                        // Minimum length not met
                        _PointAction.Reset();
                        return;
                    }

                    _Points.Add(1, _PointAction.Point);
                    _Points.Add(2, _PointAction.Point);
                    _MergePointIndices[2] = _PointAction.MergeCandidateIndex;

                    _Segment = new SketchSegmentBezier(0, 1, 2);

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

                    _HintLine.Remove();
                    _HintLine = null;

                    _SketchEditorTool.StatusText = "Select control point for line.";

                    _PointAction.Reset();
                    pointsFinished++;
                    break;

                case 2:
                    // Control point, finished
                    _PointAction.Stop();

                    _Points[1]            = _PointAction.Point;
                    _MergePointIndices[1] = _PointAction.MergeCandidateIndex;

                    _SketchEditorTool.FinishSegmentCreation(_Points, _MergePointIndices, new SketchSegment[] { _Segment }, null, _MergePointIndices[1] >= 0 ? -1 : 2);
                    pointsFinished++;
                    break;
                }
            }
        }