コード例 #1
0
        // Создание визуального представления дуги
        public DrawingVisual CreateVisual(double scale)
        {
            Vector center = new Vector(Center.X * scale, Center.Y * scale);
            double radius = Radius * scale;
            // найти начальную точку дуги
            Point startPoint = new Point(radius * Math.Cos(StartAngle * DxfHelper.DegToRad) + center.X,
                                         radius * Math.Sin(StartAngle * DxfHelper.DegToRad) + center.Y);
            // найти конечную точку дуги
            Point endPoint = new Point(radius * Math.Cos(EndAngel * DxfHelper.DegToRad) + center.X,
                                       radius * Math.Sin(EndAngel * DxfHelper.DegToRad) + center.Y);

            // определить угол дуги
            double angle = StartAngle < EndAngel ? EndAngel - StartAngle : 360 - (StartAngle - EndAngel);
            // установить флаг, если угол больше 180 градусов - 1, в обратном случае - 0
            byte isLarge = angle > 180 ? (byte)1 : (byte)0;

            // сформировать строку пути
            string str = string.Format("M{0} {1}A{2} {2} {3} {4} {5} {6} {7}", DxfHelper.DoubleToString(startPoint.X),
                                       DxfHelper.DoubleToString(startPoint.Y), DxfHelper.DoubleToString(radius), 0,
                                       isLarge, 1, DxfHelper.DoubleToString(endPoint.X), DxfHelper.DoubleToString(endPoint.Y));

            DrawingVisual visual = new DrawingVisual();

            using (DrawingContext dc = visual.RenderOpen())
            {
                // создать геометрию
                dc.DrawGeometry(null, new Pen(DxfHelper.GetBrush(Color), 2), Geometry.Parse(str));
            }
            // вернуть объект DrawingVisual с созданной геометрией
            return(visual);
        }
コード例 #2
0
ファイル: DxfVertex.cs プロジェクト: Monkeybin11/DxfReader
        // Фоматированная строка для вывода в файл версии R13
        public override string ToStringOfVerR13()
        {
            string str = ToString();

            str = str.Insert(str.IndexOf("10\n" + DxfHelper.DoubleToString(X)), "100\nAcDb2dVertex\n");
            return(str);
        }
コード例 #3
0
        public string ToStringOfVerR13()
        {
            string str = ToString();

            str = str.Insert(str.IndexOf(Center.AsPoint.ToString()), "100\nAcDbCircle\n");
            str = str.Insert(str.IndexOf("50\n" + DxfHelper.DoubleToString(StartAngle)), "100\nAcDbArc\n");
            return(str);
        }
コード例 #4
0
 // Форматированная строка 2D для вывода в файл DXF
 public string ToStringOf2d(bool isWeight)
 {
     if (!isWeight)
     {
         return(base.ToStringOf2d());
     }
     return("41\n" + DxfHelper.DoubleToString(Weight) + "\n" + base.ToStringOf2d());
 }
コード例 #5
0
ファイル: DxfVertex.cs プロジェクト: Monkeybin11/DxfReader
        // Форматированная строка для вывода в файл 2D
        public override string ToStringOf2d()
        {
            string str = string.Format("0\n{0}\n8\n0\n{1}", Name, base.ToStringOf2d());

            if (Bulge != 0)
            {
                return(str += "42\n" + DxfHelper.DoubleToString(Bulge) + "\n");
            }
            return(str);
        }
コード例 #6
0
        // Создание визуального представления точки
        public DrawingVisual CreateVisual(double scale)
        {
            DrawingVisual visual = new DrawingVisual();

            using (DrawingContext dc = visual.RenderOpen())
            {
                dc.DrawRectangle(DxfHelper.GetBrush(Color), null, new Rect(new Point(Coordinates.X * scale - 1, Coordinates.Y * scale - 1), new Size(2, 2)));
            }
            return(visual);
        }
コード例 #7
0
ファイル: DxfCircle.cs プロジェクト: Monkeybin11/DxfReader
        // Создание визуального представления окружности
        public DrawingVisual CreateVisual(double scale)
        {
            DrawingVisual visual = new DrawingVisual();
            double        radius = Radius * scale;
            Point         center = new Point(Center.X * scale, Center.Y * scale);

            using (DrawingContext dc = visual.RenderOpen())
            {
                dc.DrawEllipse(null, new Pen(DxfHelper.GetBrush(Color), 2.0), center, radius, radius);
            }
            return(visual);
        }
コード例 #8
0
        // Создание визуального представления линии
        public DrawingVisual CreateVisual(double scale)
        {
            DrawingVisual visual     = new DrawingVisual();
            Point         startPoint = new Point(StartPoint.X * scale, StartPoint.Y * scale);
            Point         endPoint   = new Point(EndPoint.X * scale, EndPoint.Y * scale);

            using (DrawingContext dc = visual.RenderOpen())
            {
                Pen pen = new Pen(DxfHelper.GetBrush(Color), 2);
                dc.DrawLine(pen, startPoint, endPoint);
            }
            return(visual);
        }
コード例 #9
0
ファイル: LwPolyline.cs プロジェクト: Monkeybin11/DxfReader
        // Строка форматированная для вывода в файл DXF
        public override string ToString()
        {
            string str = string.Format("0\n{0}\n8\n0\n62\n{1}\n90\n{2}\n70\n{3}\n",
                                       Name, (int)Color, NumberOfVertices, Flag);

            foreach (DxfVertex vert in polyline.Vertexes)
            {
                str += "10\n" + DxfHelper.DoubleToString(vert.X) +
                       "\n20\n" + DxfHelper.DoubleToString(vert.Y) + "\n";
                if (vert.Bulge != 0)
                {
                    str += "42\n" + DxfHelper.DoubleToString(vert.Bulge) + "\n";
                }
            }
            return(str);
        }
コード例 #10
0
ファイル: DxfEllipse.cs プロジェクト: Monkeybin11/DxfReader
        // Метод создания визуального представления
        public DrawingVisual CreateVisual(double scale)
        {
            DrawingVisual visual = new DrawingVisual();

            if (IsFull)    // эллипс полный
            {
                Point center = new Point(Center.X * scale, Center.Y * scale);
                using (DrawingContext dc = visual.RenderOpen())
                {
                    // Создать визуальное представление эллипса
                    dc.DrawEllipse(null, new Pen(DxfHelper.GetBrush(Color), 2.0),
                                   center, majorRadius * scale, minorRadius * scale);
                }

                // задать трансформацию объекту DrawingVisual
                visual.Transform = new RotateTransform();
                // определить центр поворота эллипса
                (visual.Transform as RotateTransform).CenterX = center.X;
                (visual.Transform as RotateTransform).CenterY = center.Y;
                // задать угол поворота
                (visual.Transform as RotateTransform).Angle = rotateAngle;
            }
            else                                                                              // часть эллипса
            {
                Vector startPoint = GetVector(StartParam, scale, rotateAngle);                // найти начальную точку эллипса
                Vector endPoint   = GetVector(EndParam, scale, rotateAngle);                  // найти конечную точку
                byte   isLarge    = EndParam - StartParam > DxfHelper.Pi ? (byte)1 : (byte)0; // определить большая дуга или нет

                // создать строку пути для эллиптической дуги
                string str = string.Format("M{0} {1}A{2} {3} {4} {5} {6} {7} {8}", DxfHelper.DoubleToString(startPoint.X),
                                           DxfHelper.DoubleToString(startPoint.Y), DxfHelper.DoubleToString(majorRadius * scale), DxfHelper.DoubleToString(minorRadius * scale),
                                           DxfHelper.DoubleToString(rotateAngle), isLarge, 1, DxfHelper.DoubleToString(endPoint.X), DxfHelper.DoubleToString(endPoint.Y));
                using (DrawingContext dc = visual.RenderOpen())
                {
                    // создать визуальное представление для эллиптической дуги
                    dc.DrawGeometry(null, new Pen(DxfHelper.GetBrush(Color), 2), Geometry.Parse(str));
                }
            }

            return(visual);
        }
コード例 #11
0
ファイル: ExtMin.cs プロジェクト: Monkeybin11/DxfReader
        }                                               // имя в файле DXF

        #endregion
        #region Конструктор

        public ExtMin(DxfDot dot) :
            base(DxfHelper.NormalizeDouble(dot.X), DxfHelper.NormalizeDouble(dot.Y), DxfHelper.NormalizeDouble(dot.Z))
        {
        }
コード例 #12
0
ファイル: DxfCircle.cs プロジェクト: Monkeybin11/DxfReader
 // Формирование строки для вывода в файл DXF
 public override string ToString()
 {
     return(string.Format("0\n{0}\n8\n0\n{1}40\n{2}\n62\n{3}\n", Name, Center.AsPoint.ToString(),
                          DxfHelper.DoubleToString(Radius), (int)Color));
 }
コード例 #13
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);
        }
コード例 #14
0
ファイル: DxfEllipse.cs プロジェクト: Monkeybin11/DxfReader
 // Создание форматированной строки для вывода в файл DXF
 public override string ToString()
 {
     return(string.Format("0\n{0}\n8\n0\n62\n{1}\n{2}{3}40\n{4}\n41\n{5}\n42\n{6}\n",
                          Name, (int)Color, Center.AsPoint.ToString(), MajorAxis.ToStringOf2d(),
                          DxfHelper.DoubleToString(Ratio), DxfHelper.DoubleToString(StartParam), DxfHelper.DoubleToString(EndParam)));
 }
コード例 #15
0
 // Формирование строки для вывода в файл DXF
 public override string ToString()
 {
     return(string.Format("0\n{0}\n8\n0\n62\n{1}\n{2}40\n{3}\n50\n{4}\n51\n{5}\n",
                          Name, (int)Color, Center.AsPoint.ToString(), DxfHelper.DoubleToString(Radius),
                          DxfHelper.DoubleToString(StartAngle), DxfHelper.DoubleToString(EndAngel)));
 }
コード例 #16
0
 public override string ToStringOf2d()
 {
     return(string.Format("13\n{0}\n23\n{1}\n", DxfHelper.DoubleToString(X), DxfHelper.DoubleToString(Y)));
 }
コード例 #17
0
ファイル: DxfEndPoint.cs プロジェクト: Monkeybin11/DxfReader
 public override string ToString()
 {
     return(string.Format("11\n{0}\n21\n{1}\n31\n{2}\n", DxfHelper.DoubleToString(X),
                          DxfHelper.DoubleToString(Y), DxfHelper.DoubleToString(Z)));
 }
コード例 #18
0
ファイル: DxfEllipse.cs プロジェクト: Monkeybin11/DxfReader
        // Определение координат точки, параметр угол в радианах
        private Vector GetVector(double param, double scale, double rotate)
        {
            Vector vector = DxfHelper.RotateVector(new Vector(scale * majorRadius * Math.Cos(param), scale * minorRadius * Math.Sin(param)), rotate);

            return(scale * center + vector);
        }
コード例 #19
0
        // Создание форматированной строки для вывода в файл DXF
        public override string ToString()
        {
            string str = string.Format("10\n{0}\n20\n{1}\n", DxfHelper.DoubleToString(X), DxfHelper.DoubleToString(Y));

            return(str);
        }
コード例 #20
0
 public override string ToString()
 {
     return(string.Format("210\n{0}\n220\n{1}\n230\n{0}\n", DxfHelper.DoubleToString(X),
                          DxfHelper.DoubleToString(Y), DxfHelper.DoubleToString(Z)));
 }