//-------------------------------------------------------------------------------------------------- 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); } }
//-------------------------------------------------------------------------------------------------- void _ImportSplineWithFitPoints(DxfDomSpline dxfSpline) { // Copy points var pointCount = dxfSpline.FitPoints.Length; var points = new TColgp_HArray1OfPnt2d(1, pointCount); for (int i = 0; i < pointCount; i++) { points.SetValue(i + 1, dxfSpline.FitPoints[i]); } // Interpolate var algo = new Geom2dAPI_Interpolate(points, false, 0.001); if (dxfSpline.HasTangents) { algo.Load(dxfSpline.StartTangent, dxfSpline.EndTangent); } algo.Perform(); if (!algo.IsDone()) { Messages.Warning("DxfImporter: Cannot create spline through fit points."); return; } _AddBSplineCurve(algo.Curve()); }
//-------------------------------------------------------------------------------------------------- void _ImportSpline(DxfDomSpline dxfSpline) { if (dxfSpline.ControlPoints.Length > 0 && dxfSpline.Knots.Length > 0) { _ImportSplineWithControlPoints(dxfSpline); } else if (dxfSpline.FitPoints.Length > 0) { _ImportSplineWithFitPoints(dxfSpline); } }
//-------------------------------------------------------------------------------------------------- void IDrawingRenderer.BSplineCurve(int degree, double[] knots, Pnt2d[] controlPoints, double[] weights, bool isRational) { if (_Document.Flags.HasFlag(DxfFlags.ExportSplineAsPolygon)) { var spline = Geom2dUtils.MakeBSplineCurve(degree, knots, controlPoints, weights, false); _AddPolygonCurve(spline); return; } var flags = isRational ? DxfDomSpline.SplineFlags.IsRational : DxfDomSpline.SplineFlags.None; var entity = new DxfDomSpline(_CurrentLayerName, degree, knots, controlPoints, weights, flags); _AddEntity(entity); }
//-------------------------------------------------------------------------------------------------- void _ImportSplineWithControlPoints(DxfDomSpline dxfSpline) { var spline = Geom2dUtils.MakeBSplineCurve(dxfSpline.Degree, dxfSpline.Knots, dxfSpline.ControlPoints, dxfSpline.Weights, dxfSpline.Flags.Has(DxfDomSpline.SplineFlags.IsClosed)); _AddBSplineCurve(spline); }