// Создание линии из вершин полилинии 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); }
// Установка цвета линий для отрисовки на экране 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); }
// Создать объект 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); }
private DxfPoint(DxfDot dot, DxfColors color = DxfColors.NotClosedLine) { Coordinates = dot; Color = color; }
public void SetColor(DxfColors color) { Color = color; }