/// <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); }
/// <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); }