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