/// <summary> /// Определение высоты здания. По параметрам высот 1,тип и тех этажа, или = переданной высоте /// </summary> /// <param name="height">Высота заданная в параметре Высота в классифицированном объекте</param> private double CalcHeight(double height) { double resHeight; // Определение параметров - для расчета инсоляции HeightFirstFloor = FCProperties.GetPropValue(BlockSectionBase.PropHeightFirstFloor, 3.6); HeightTypicalFloors = FCProperties.GetPropValue(BlockSectionBase.PropHeightTypicalFloor, 2.9); HeightTechnicalFloor = FCProperties.GetPropValue(BlockSectionBase.PropHeightTechFloor, 1.6); if (height != 0) { resHeight = height; } else { resHeight = BlockSectionBase.CalcHeight(HeightFirstFloor, HeightTypicalFloors, HeightTechnicalFloor, Floors); } return(resHeight); }
/// <summary> /// Определение точных габаритов Блок-Секций - по стыковке Блок-Секций /// </summary> private static void DefineHouses(List <BlockSectionKP> blocks, bool fill) { // Дерево блок-секций var rtreeBs = GetRtreeBs(blocks); Tolerance tolerance = new Tolerance(0.1, 0.1); using (var t = Db.TransactionManager.StartTransaction()) { var layerGNS = AcadLib.Layers.LayerExt.CheckLayerState(OptionsKPBS.Instance.LayerBSContourGNS); var cs = Db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord; foreach (var bs in blocks) { // Полилиния ГНС этой секции скопированная в модель var idPlExtern = bs.IdPlContour.CopyEnt(cs.Id); var plExtern = idPlExtern.GetObject(OpenMode.ForWrite, false, true) as Polyline; plExtern.Layer = OptionsKPBS.Instance.LayerBSContourGNS; plExtern.ColorIndex = 256; plExtern.Linetype = SymbolUtilityServices.LinetypeByLayerName; plExtern.LineWeight = LineWeight.ByLayer; plExtern.TransformBy(bs.BlockBase.Transform); try { // Пересечение с другими секциями var bsIntersects = rtreeBs.Intersects(bs.Rectangle); if (bsIntersects.Count > 1) { List <Point2d> vertexModified = new List <Point2d> (); foreach (var bsIntersect in bsIntersects) { // Пропускаем саму себя if (ReferenceEquals(bs, bsIntersect)) { continue; } // Проверка пересечения полилиний контуров // ГНС линия пересекаемой секции var plExternItem = bsIntersect.IdPlContour.GetObject(OpenMode.ForRead, false, true) as Polyline; plExternItem = plExternItem.Clone() as Polyline; plExternItem.TransformBy(bsIntersect.BlockBase.Transform); // Корректировка контура б.с. если она пересекается с другим контуром б.с. BlockSectionBase.CorrectSectionsConnect(ref plExtern, plExternItem); } } } catch (Exception ex) { Inspector.AddError($"Ошибка определения точного контура ГНС блок-секции - {ex}", bs.BlockBase.IdBlRef, System.Drawing.SystemIcons.Warning); } bs.AreaGNS = plExtern.Area; if (fill) { // Заливка контура штриховкой try { FillContour(bs, plExtern, cs, t); } catch (Exception ex) { Inspector.AddError($"Ошибка заполнения штриховки контура ГНС блок-секции - {ex}", bs.BlockBase.IdBlRef, System.Drawing.SystemIcons.Warning); } } } t.Commit(); } }