Beispiel #1
0
 private bool checkNewRoll(List<RollSegment> segSomes, Vector2d direction, RollSegment rollSeg)
 {
     if (segSomes.Count > 0 && !rollSeg.IsPartition && !direction.IsCodirectionalTo(rollSeg.Direction, RollUpService.Tolerance))
     {
         return true;
     }
     return false;
 }
Beispiel #2
0
        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);
                    }
                }
            }
        }