Exemple #1
0
        /// <summary>
        /// Расчет площадки
        /// </summary>
        public List <Tile> CalcPlace(Place place)
        {
            List <Tile> tiles;

            dictLevels   = new Dictionary <double, TileLevel>();
            placeOptions = place.PlaceModel.Options;
            levels       = placeOptions.Levels.OrderByDescending(o => o.TotalTimeMin).ToList();
            model        = place.PlaceModel.Model;
            step         = placeOptions.TileSize;
            stepHalf     = step * 0.5;
            stepQuart    = step * 0.25;
            using (pl = place.PlaceId.Open(OpenMode.ForRead) as Polyline)
            {
                place.Area = NetLib.DoubleExt.Round(pl.Area, 2);
                // Нарезка площадки на ячейки (tiles)
                tiles = DividePlace();
                //  расчет каждой ячейке (точка - без оуна и без здания)
                var insPt = new InsPoint();
                insPt.Model    = model;
                insPt.Window   = null;
                insPt.Building = null;
                insPt.Height   = 0;
                foreach (var tile in tiles)
                {
                    insPt.Point = tile.Point.Convert3d();
                    try
                    {
                        var illums = calcTrees.CalcPoint(insPt, false);
                        tile.InsValue = calcService.CalcTimeAndGetRate(illums, Elements.Buildings.BuildingTypeEnum.Living);
                        tile.Level    = DefineLevel(tile.InsValue.TotalTime);
                    }
                    catch (UserBreakException)
                    {
                        throw;
                    }
                    catch
                    {
                        tile.InsValue = InsValue.Empty;
                        tile.Level    = TileLevel.Empty;
                        // На угловых точках - может не рассчитаться пока
                        // Пропустить!?
                    }
                }
            }
            return(tiles);
        }
Exemple #2
0
        /// <summary>
        /// Определение расчетных точек на сегменте
        /// </summary>
        private List <FrontCalcPoint> CalcFrontPoints(LineSegment2d seg, double delta)
        {
            var calcPts = new List <FrontCalcPoint>();

            calcPts.Add(new FrontCalcPoint(seg.StartPoint, true));

            // Добавление остальных точек с заданным шагом от стартовой до конечной
            var countSteps = Convert.ToInt32(seg.Length / delta) - 1;

            if (countSteps == 0)
            {
                // Добавление средней точки сегмента
                calcPts.Add(new FrontCalcPoint(seg.MidPoint, false));
            }
            else
            {
                var ptPrew   = seg.StartPoint;
                var vecDelta = seg.Direction * delta;
                for (int i = 0; i < countSteps; i++)
                {
                    var ptNext = ptPrew + vecDelta;
                    calcPts.Add(new FrontCalcPoint(ptNext, false));
                    ptPrew = ptNext;
                }
            }

            calcPts.Add(new FrontCalcPoint(seg.EndPoint, true));

            // Определение блок-секций для точек
            DefineSectionInRange(ref calcPts);
            // Расчетные точки с определенными секциями - только их считать
            //calcPts = calcPts.Where(w => w.Section != null).ToList();

            // Расчет в точке
            var insPt = new InsPoint();

            insPt.Model  = model;
            insPt.Window = house.GetCalcFrontWindow();

            foreach (var calcFrontPt in calcPts)
            {
                if (calcFrontPt.Section == null)
                {
                    continue;
                }
                if (calcFrontPt.IsCorner)
                {
                    calcFrontPt.IsCalulated = true;
                    continue;
                }

                insPt.Point = calcFrontPt.Point.Convert3d();
#if TEST
                //EntityHelper.AddEntityToCurrentSpace(new DBPoint(insPt.Point));
#endif
                insPt.Building = calcFrontPt.Section;
                // Уточнение высоты расчета фронта с учетом параметров заданных в здании (Section) - если не задана общая высота для фронта пользователем
                insPt.Height = CalcHeightCalcPt(calcFrontPt);
                insPt.Building.InitContour();
                using (insPt.Building.Contour)
                {
                    try
                    {
                        var illums   = calcTrees.CalcPoint(insPt);
                        var insValue = calcService.CalcTimeAndGetRate(illums, calcFrontPt.Section.BuildingType);
                        calcFrontPt.InsValue    = insValue.Requirement.Type;
                        calcFrontPt.IsCalulated = true;
                    }
                    catch (UserBreakException)
                    {
                        throw;
                    }
                    catch
                    {
                        calcFrontPt.InsValue = InsRequirementEnum.None;
                        calcFrontPt.IsCorner = true;
                        // На угловых точках - может не рассчитаться пока
                        // Пропустить!?
                    }
                }
            }
            return(calcPts);
        }