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