コード例 #1
0
            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);
            }