protected override bool WorldDraw(WorldDraw draw) { var line = new Line(_startPoint, _currentPoint) { ColorIndex = PlinesEditFunction.HelpGeometryColor }; draw.Geometry.Draw(line); _polyline.SetBulgeAt(_vertex, _startBulge); // polyline edit var tangent = _currentPoint - _startPoint; int?nextVertex; if (_vertex != _polyline.NumberOfVertices - 1) { nextVertex = _vertex + 1; } else if (_polyline.Closed) { nextVertex = 0; } else { return(true); } // ReSharper disable once ConditionIsAlwaysTrueOrFalse if (nextVertex != null) { var chordVector = _polyline.GetPoint3dAt(nextVertex.Value) - _startPoint; // По касательной if (_workType.Equals("Tangent")) { var bulge = Math.Tan(tangent.GetAngleTo(chordVector) / 2); if (tangent.GetAngleTo(chordVector, _polyline.Normal) > Math.PI) { bulge = -bulge; } _polyline.SetBulgeAt(_vertex, bulge); draw.Geometry.Draw(_polyline); } // По точке прохождения else if (_workType.Equals("Point")) { // Строим вспомогательную геометрию в виде дуги для получения полного угла var cArc = new CircularArc3d(_startPoint, _currentPoint, _polyline.GetPoint3dAt(nextVertex.Value)); var angle = cArc.ReferenceVector.AngleOnPlane(new Plane(cArc.Center, cArc.Normal)); var arc = new Arc(cArc.Center, cArc.Normal, cArc.Radius, cArc.StartAngle + angle, cArc.EndAngle + angle); var bulge = Math.Tan(arc.TotalAngle / 4); if (tangent.GetAngleTo(chordVector, _polyline.Normal) > Math.PI) { bulge = -bulge; } _polyline.SetBulgeAt(_vertex, bulge); draw.Geometry.Draw(_polyline); } } return(true); }