//-------------------------------------------------------------------------------------------------- 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); } }
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)); }
//-------------------------------------------------------------------------------------------------- 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(); }
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))); }
//-------------------------------------------------------------------------------------------------- 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); }
//-------------------------------------------------------------------------------------------------- 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); }
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]); }
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)); }
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; } } }