예제 #1
0
        // Создание линии из вершин полилинии
        public static DxfLine Create(DxfVertex vertex1, DxfVertex vertex2, DxfColors color = DxfColors.MainOutline)
        {
            DxfLine line = new DxfLine
            {
                Color      = color,
                StartPoint = vertex1.AsDot,
                EndPoint   = DxfEndPoint.EndPointFromDot(vertex2.AsDot)
            };

            CreateRect(line);
            return(line);
        }
예제 #2
0
        // Установка цвета линий для отрисовки на экране
        public static Brush GetBrush(DxfColors color)
        {
            Brush b = null;

            switch (color)
            {
            case DxfColors.LineOfMarking:
                b = Brushes.Red;
                break;

            case DxfColors.MainOutline:
                b = SystemColors.WindowTextBrush;
                break;

            case DxfColors.NotClosedLine:
                b = Brushes.Orange;
                break;

            default:
                b = Brushes.Gray;
                break;
            }
            return(b);
        }
예제 #3
0
        // Создать объект Arc из двух вершин, в первой из который устанолен коэффициет искривления
        public static DxfArc Create(DxfVertex vertex1, DxfVertex vertex2, DxfColors color = DxfColors.MainOutline)
        {
            if (vertex1.Bulge == 0)
            {
                throw new ArgumentNullException(Properties.Resource.BulgeNotFound);
            }

            DxfArc arc = new DxfArc();

            arc.Color = color;      // цвет линии

            // Наити полный угол дуги
            double angleOfArc = 0;

            if (Math.Abs(vertex1.Bulge) == 1)
            {
                angleOfArc = 180;
            }
            else
            {
                angleOfArc = Math.Abs(Math.Atan(vertex1.Bulge) * DxfHelper.RadToDeg) * 4;
            }

            // Найти хорду и ее длинну, определить начало и конец дуги,
            // т.к. в файлах DXF направление дуги всегда по часовой стрелке,
            // если коэффициент искривления вершины имеет отрицательное значение,
            // то поменять точки местами
            Vector startPoint = vertex1.Bulge > 0 ? new Vector(vertex1.X, vertex1.Y) : new Vector(vertex2.X, vertex2.Y);    // точка начала дуги
            Vector endPoint   = vertex1.Bulge > 0 ? new Vector(vertex2.X, vertex2.Y) : new Vector(vertex1.X, vertex1.Y);    // точка конца дуги
            Vector chord      = endPoint - startPoint;                                                                      // хорда

            // Радиус дуги
            // если угол дуги равен 180 градусов, то радиус равен половине длинны хорды
            if (angleOfArc == 180)
            {
                arc.Radius = chord.Length / 2;
            }
            else
            {
                arc.Radius = Math.Abs((chord.Length / Math.Sin(angleOfArc / 2 * DxfHelper.DegToRad)) / 2);
            }

            // найти центр хорды
            Vector centerChord = startPoint + chord / 2;

            if (angleOfArc == 180)
            {
                arc.Center = new DxfDot(centerChord.X, centerChord.Y);
            }
            else
            {
                // найти расстояние от центра дуги до середины хорды
                double length = Math.Sqrt(arc.Radius * arc.Radius - Math.Pow(chord.Length * .5, 2));
                // единичный вектор, перпендикулярный хорде
                Vector perp = angleOfArc > 180 ? DxfHelper.RotateVector(chord, 270) : DxfHelper.RotateVector(chord, 90);
                perp.Normalize();
                // умножить перпендикуляр на расстояние до центра дуги
                Vector size = perp * length;
                // найти центр дуги
                Vector centerArc = centerChord + size;
                arc.Center = new DxfDot(centerArc.X, centerArc.Y);
            }

            // найти начальный и конечный углы дуги
            arc.StartAngle = GetAngle(arc.Center, startPoint, arc.Radius);
            arc.EndAngel   = arc.StartAngle + angleOfArc;
            arc.EndAngel   = arc.EndAngel >= 360 ? arc.EndAngel - 360 : arc.EndAngel;

            CreateBound(arc);

            return(arc);
        }
예제 #4
0
 private DxfPoint(DxfDot dot, DxfColors color = DxfColors.NotClosedLine)
 {
     Coordinates = dot;
     Color       = color;
 }
예제 #5
0
 public void SetColor(DxfColors color)
 {
     Color = color;
 }