示例#1
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));
        }
示例#2
0
        //--------------------------------------------------------------------------------------------------

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

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

                    _PointAction.Reset();
                    break;

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

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

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

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

                    _SketchEditorTool.StatusText = "Select rim point for circular arc.";

                    _PointAction.Reset();
                    break;

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

                    _PointAction.Stop();

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

                    _SketchEditorTool.FinishSegmentCreation(_Points, _MergePointIndices, new SketchSegment[] { _Segment }, null);
                    break;
                }
            }
        }
        public void RadiusArc()
        {
            var sketch = Sketch.Create();
            var p1     = sketch.AddPoint(new Pnt2d(0, -10));
            var p2     = sketch.AddPoint(new Pnt2d(5, 0));
            var p3     = sketch.AddPoint(new Pnt2d(0, 10));
            var arc    = new SketchSegmentArc(p1, p3, p2);
            var s1     = sketch.AddSegment(arc);
            var center = arc.Center(sketch.Points);
            var c1     = sketch.AddConstraint(new SketchConstraintRadius(s1, 10.0));

            Assert.IsTrue(sketch.SolveConstraints(true));
            Assert.AreEqual(10.0, arc.Radius(sketch.Points), MaxAngleDelta);
        }
示例#4
0
        //--------------------------------------------------------------------------------------------------

        bool _AddArcSegment(SketchSegmentArc arcSegment, Pnt2d start, Pnt2d end)
        {
            var parameters = new double[2];
            var circle     = arcSegment.GetCircle(_Sketch.Points, parameters);

            if (circle == null)
            {
                return(false);
            }
            double length = parameters[1] - parameters[0];
            var    size   = length < Math.PI ? SvgArcSize.Small : SvgArcSize.Large;
            var    sweep  = circle.Position().Sense() > 0 ? SvgArcSweep.Positive : SvgArcSweep.Negative;

            var svgSegment = new SvgPathSegArc(start, circle.Radius(), circle.Radius(), 0, size, sweep, end);

            _CurrentPath.Segments.Add(svgSegment);
            return(true);
        }
        //--------------------------------------------------------------------------------------------------

        void _SetStartPoint(Pnt2d point, int mergeCandidateIndex)
        {
            if (_CenterPoint.Distance(point) < 0.001)
            {
                // Minimum length not met
                _PointAction.Reset();
                return;
            }

            if (_PreviewLine != null)
            {
                _PreviewLine.Remove();
                _PreviewLine = null;
            }

            _HintLines[0].Set(_CenterPoint, point, _SketchEditorTool.Sketch.Plane);

            if (_ValueHudElement != null)
            {
                _SketchEditorTool.WorkspaceController.HudManager?.RemoveElement(_ValueHudElement);
                _ValueHudElement.ValueEntered -= _ValueHudElement_RadiusEntered;
                _ValueHudElement = null;
            }

            _Points.Add(0, point);
            _MergePointIndices[0] = mergeCandidateIndex;
            _PointsCompleted++;

            _Points.Add(1, point);
            _Points.Add(2, point);
            _Segment = new SketchSegmentArc(0, 1, 2);

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

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

            _PointAction.Reset();
            _PointAction.ConstraintPoint += _PointActionOnConstraintPoint;

            _SketchEditorTool.WorkspaceController.Invalidate();
            _SketchEditorTool.WorkspaceController.UpdateSelection();
        }
示例#6
0
        public void ConvertToLine()
        {
            var sketch = Sketch.Create();
            int p1     = sketch.AddPoint(new Pnt2d(0, 0));
            int p2     = sketch.AddPoint(new Pnt2d(5, 3));
            int pr     = sketch.AddPoint(new Pnt2d(2, 3));
            var s1     = new SketchSegmentArc(p1, p2, pr);

            sketch.AddSegment(s1);

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

            Assert.AreNotEqual(SketchUtils.ConvertSegmentFailed, s2);

            Assert.AreEqual(1, sketch.Segments.Count);
            Assert.IsInstanceOf <SketchSegmentLine>(sketch.Segments[1]);
            Assert.AreEqual(p1, sketch.Segments[s2].StartPoint);
            Assert.AreEqual(p2, sketch.Segments[s2].EndPoint);
        }
示例#7
0
        public void DeletePointArcArc()
        {
            var sketch = Sketch.Create();
            int p1     = sketch.AddPoint(new Pnt2d(0, 5));
            int p2     = sketch.AddPoint(new Pnt2d(4, 3));
            int p3     = sketch.AddPoint(new Pnt2d(3, 4));
            var arc1   = new SketchSegmentArc(p1, p2, p3);
            int s1     = sketch.AddSegment(arc1);
            int p4     = sketch.AddPoint(new Pnt2d(4, -3));
            int p5     = sketch.AddPoint(new Pnt2d(5, 0));
            var arc2   = new SketchSegmentArc(p2, p4, p5);
            int s2     = sketch.AddSegment(arc2);

            Assume.That(arc1.Center(sketch.Points).IsEqual(arc2.Center(sketch.Points), 0.001));

            SketchUtils.DeletePointTrySubstituteSegments(sketch, p2);
            Assert.AreEqual(3, sketch.Points.Count);
            Assert.AreEqual(1, sketch.Segments.Count);
            Assert.AreEqual(p1, sketch.Segments[s2 + 1].StartPoint);
            Assert.AreEqual(p4, sketch.Segments[s2 + 1].EndPoint);
        }
示例#8
0
        //--------------------------------------------------------------------------------------------------

        void _AddArcSegment(SketchSegmentArc arcSegment)
        {
            var circle = arcSegment.GetCircle(_Sketch.Points);

            Pnt2d startPoint;
            Pnt2d endPoint;

            if (circle.Position().Sense() < 0)
            {
                startPoint = _Sketch.Points[arcSegment.StartPoint];
                endPoint   = _Sketch.Points[arcSegment.EndPoint];
            }
            else
            {
                startPoint = _Sketch.Points[arcSegment.EndPoint];
                endPoint   = _Sketch.Points[arcSegment.StartPoint];
            }

            var entity = new DxfDomCircle("0", circle.Location(), circle.Radius(), startPoint, endPoint);

            _Document.Entities.Add(entity);
        }
        public void TangentLineToArc()
        {
            var sketch = Sketch.Create();
            var p1     = sketch.AddPoint(new Pnt2d(-20, 0));
            var p2     = sketch.AddPoint(new Pnt2d(20, 30));
            var line   = new SketchSegmentLine(p1, p2);
            var s1     = sketch.AddSegment(line);
            var ap1    = sketch.AddPoint(new Pnt2d(-10, 0));
            var ap2    = sketch.AddPoint(new Pnt2d(8, 8));
            var ap3    = sketch.AddPoint(new Pnt2d(0, -10));
            var circ   = new SketchSegmentArc(ap1, ap3, ap2);
            var s2     = sketch.AddSegment(circ);
            var c1     = sketch.AddConstraint(new SketchConstraintTangent(s1, s2));

            Assert.IsTrue(sketch.SolveConstraints(true));
            var intersec = new IntAna2d_AnaIntersection(line.GetLine(sketch.Points), circ.GetCircle(sketch.Points));

            Assert.IsTrue(intersec.IsDone());
            if (intersec.NbPoints() > 1)
            {
                Assert.AreEqual(0.0, intersec.Point(1).Value().Distance(intersec.Point(2).Value()), MaxLengthDelta);
            }
        }