public void CalcRolls() { // Вычисление разверток помещения using (var pl = IdPolyline.GetObject(OpenMode.ForRead, false, true) as Polyline) { if (pl.Area < 500) { return; } Roll roll = new Roll(this); var segSomes = new List<RollSegment>(); Vector2d direction = Vector2d.XAxis; RollSegment segFirst = null; RollSegment segLast = null; RollSegment seg = null; for (int i = 0; i < pl.NumberOfVertices; i++) { var segType = pl.GetSegmentType(i); if (segType == SegmentType.Line) { var segLine = pl.GetLineSegment2dAt(i); var segLen = segLine.Length; // Создане сегмента и определение вида который в упор смотрит на этот сегмент seg = new RollSegment(this, segLine, i); // Если этот сегмент не сонаправлен предыдущему if (checkNewRoll(segSomes, direction, seg)) { roll.AddSegments(segSomes); AddRoll(roll); roll = new Roll(this); segSomes = new List<RollSegment>(); } if (!seg.IsPartition) { direction = seg.Direction; if (segFirst == null) segFirst = seg; segLast = seg; } if (seg.View != null && !seg.IsPartition) { // определен вид. roll.Num = seg.View.Name; roll.View = seg.View; } segSomes.Add(seg); } else if (segType == SegmentType.Arc) { var segBounds = pl.GetArcSegmentAt(i).BoundBlock; Extents3d segExt = new Extents3d(segBounds.GetMinimumPoint(), segBounds.GetMaximumPoint()); // Пока ошибка Inspector.AddError($"Дуговой сегмент полилинии помещения. Пока не обрабатываеься.", segExt, TransToModel, System.Drawing.SystemIcons.Warning); } else { //Inspector.AddError($"Cегмент полилинии помещения типа {segType}. Пока не обрабатываеься.", // pl.GeometricExtents, TransToModel, System.Drawing.SystemIcons.Warning); } } // Проверка последнего сегмента, если для него еще не определена развертка if (seg.Roll == null && segFirst != null) { // Проверка что последний сегмент входит в первую развертку помещения Roll rollFirst = segFirst.Roll; if (seg.IsPartition) { //rolFirst.AddSegments(new List<RollSegment>() { seg }); seg = segLast; direction = seg.Direction; } // Проверка - может это сегмент первой развертки в помещении var dirFirst = segFirst.Direction; if (checkNewRoll(segSomes, dirFirst, seg)) { // Новая развертка roll.AddSegments(segSomes); AddRoll(roll); } else { // Добавляем в первую развертку segSomes.Reverse(); rollFirst.AddSegments(segSomes); } } } }