/// <summary> /// Загрузка точек. Определение точек найденных на карте /// </summary> private void LoadPoints() { var doc = Doc; if (doc == null) { return; } Tree.ClearVisuals(); Tree.Points.Clear(); var idPoints = Map.InsPoints; if (idPoints == null || idPoints.Count == 0) { return; } foreach (var idPt in idPoints) { try { DefinePoint(idPt); } catch (Exception ex) { Inspector.AddError($"Ошибка расчета точки - {ex.Message}", idPt, System.Drawing.SystemIcons.Error); Logger.Log.Error(ex, "LoadPoints()"); } } Tree.UpdateVisualTree(); }
public static List <MountingPanel> GetPanels(BlockTableRecord btr, Point3d ptBase, Matrix3d transform, PanelLibraryLoadService libLoadServ, FloorMounting floor) { // Поиск всех панелей СБ в определении блока var panelsSB = new List <MountingPanel>(); foreach (ObjectId idEnt in btr) { if (idEnt.IsValidEx() && idEnt.ObjectClass.Name == "AcDbBlockReference") { using (var blRefPanelSB = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference) { var panelSb = DefinePanel(blRefPanelSB, transform, libLoadServ, floor); if (panelSb != null) { panelsSB.Add(panelSb); } } } } if (panelsSB.Count == 0) { // Ошибка - в блоке монтажного плана, не найдена ни одна панель Inspector.AddError($"В блоке монтажного плана {btr.Name} не найдена ни одна панель.", new Extents3d(ptBase, new Point3d(ptBase.X + 10000, ptBase.Y + 10000, 0)), btr.Id, icon: System.Drawing.SystemIcons.Error); } return(panelsSB); }
public static List <Region> CreateRegion([NotNull] this IEnumerable <Curve> curves) { var res = new List <Region>(); foreach (var curve in curves) { var dbs = new DBObjectCollection { curve }; try { var dbsRegions = Region.CreateFromCurves(dbs); foreach (var item in dbsRegions) { res.Add((Region)item); } } catch { // Самопересечение Inspector.AddError("Самопересечение контура", curve.GeometricExtents, Matrix3d.Identity); } } #if DRAW //EntityHelper.AddEntityToCurrentSpace(res); #endif return(res); }
private static double GetArea(Entity ent, double unitFactor = 1, string tag = "") { double res = 0; try { if (ent is Curve) { var curve = ent as Curve; res = curve.Area * unitFactor; } else if (ent is Hatch) { var h = ent as Hatch; res = h.Area * unitFactor; } else { Inspector.AddError($"Неподдерживаемый тип объекта - '{ent.GetType().Name}'. Классификатор '{tag}'. Слой '{ent.Layer}'", ent, System.Drawing.SystemIcons.Error); } } catch { } if (res == 0) { Inspector.AddError($"Не определена площадь объекта '{tag}'. Слой '{ent.Layer}'", ent, System.Drawing.SystemIcons.Error); } return(res); }
public static Workspace Define(BlockReference blRef) { string err = null; try { var ws = new Workspace(blRef); if (string.IsNullOrEmpty(ws.Error)) { return(ws); } else { err = ws.Error; } } catch (Exception ex) { err = ex.Message; } if (err != null) { Inspector.AddError($"Ошибка определения блока рабочей области - {err}", blRef, System.Drawing.SystemIcons.Error); } return(null); }
/// <summary> /// Обновление площадки - пересчет и перерисовка /// </summary> public void Update() { try { if (!PlaceModel.IsEnableCalc) { return; } if (!IsVisualPlaceOn) { VisualPlace?.Dispose(); VisualPlace = null; return; } var tiles = PlaceModel.Model.CalcService.CalcPlace.CalcPlace(this); // Суммирование освещенностей по уровням LevelsInfo = GetLevelsInfo(tiles); // Визуализация ячеек if (VisualPlace == null) { VisualPlace = new VisualPlace(this); } VisualPlace.Tiles = tiles; VisualPlace.VisualIsOn = true; } catch (Exception ex) { Inspector.AddError($"Ошибка расчета площадки {Name} - {ex.Message}", PlaceId, System.Drawing.SystemIcons.Error); Logger.Log.Error(ex, "Place.Update()"); } }
public static List <Pile> Filter(List <ObjectId> selblocks, PileOptions pileOptions, bool checkNum) { var resVal = new List <Pile>(); var db = HostApplicationServices.WorkingDatabase; using (var t = db.TransactionManager.StartTransaction()) { foreach (var idBlRef in selblocks) { using (var blRef = idBlRef.GetObject(OpenMode.ForRead, false, true) as BlockReference) { var blName = blRef.GetEffectiveName(); if (Regex.IsMatch(blName, pileOptions.PileBlockNameMatch)) { var pile = new Pile(blRef, blName); if (pile.Error == null) { resVal.Add(pile); } else { Inspector.AddError(pile.Error); } } } } t.Commit(); } return(resVal); }
public void ReadPanelsFromBase() { if (!File.Exists(XmlBasePanelsFile)) { throw new FileNotFoundException("XML файл базы панелей не найден.", XmlBasePanelsFile); } // TODO: Проверка валидности xml // Чтение файла базы панелей _panelsXML = new Dictionary <string, Panel>(); XmlSerializer ser = new XmlSerializer(typeof(Base.Panels)); using (var fileStreamXml = new FileStream(XmlBasePanelsFile, FileMode.Open)) { Panels panels = ser.Deserialize(fileStreamXml) as Panels; var panelsList = panels.Panel.ToList(); foreach (var panel in panelsList) { try { _panelsXML.Add(panel.mark.ToUpper(), panel); } catch (ArgumentException ex) { Inspector.AddError($"Ошибка получения панели из базы xml - такая панель уже есть. {ex.Message}", icon: System.Drawing.SystemIcons.Error); } } } }
// загрузка АКР-панелей из библиотеки с попыткой расстановить их в виде фасадов если правильно расставлены монтажки public void LoadPanels() { Inspector.Clear(); // Попытка определить фасады по монтажкам Facades = FacadeMounting.GetFacadesFromMountingPlans(this); if (Inspector.HasErrors) { Inspector.Show(); return; } if (Facades.Count > 0) { // загрузка АКР-панелей из библиотеки MountingPanel.LoadBtrPanels(Facades); // удаление АКР-Панелей старых фасадов FacadeMounting.DeleteOldAkrPanels(Facades); // расстановка АКР-Панелей по фасадам FacadeMounting.CreateFacades(Facades); } else { Inspector.AddError("Не удалось определить фасады по монтажным планам.", icon: System.Drawing.SystemIcons.Error); } if (Inspector.HasErrors) { // Показать ошибки. Inspector.Show(); } }
private Dictionary <string, ObjectId> defineBlockFromTemplate(List <string> blNames) { // Переопределение блока плитки из файла шаблона блоков string fileBlocksTemplate = Path.Combine(Commands.CurDllDir, Settings.Default.TemplateBlocksAKRFileName); if (File.Exists(fileBlocksTemplate)) { try { // копирование сечений панелей Dictionary <string, ObjectId> blNamesCopy; BlPanelSections = BlockSectionAbstract.LoadSections(fileBlocksTemplate, _service, blNames, out blNamesCopy); return(blNamesCopy); // копирование остальных блоков //return AcadLib.Blocks.Block.CopyBlockFromExternalDrawing(blNames, fileBlocksTemplate, // _service.Db, DuplicateRecordCloning.Replace); } catch (Exception ex) { Logger.Log.Error(ex, "AcadLib.Blocks.Block.CopyBlockFromExternalDrawing"); } } else { Inspector.AddError($"Не найден файл шаблона блоков АКР - {fileBlocksTemplate}", icon: System.Drawing.SystemIcons.Error); } return(new Dictionary <string, ObjectId>()); }
public Panel GetPanelXml(string markSb, MountingPanel panelMount = null) { Panel panel; if (!_panelsXML.TryGetValue(markSb.ToUpper(), out panel)) { // Если это панель с классом бетона 2, то найти панель без индекса класса (3НСНг2 75.29.42-6 - 3НСНг 75.29.42-6 - геометрически одинаковые) int indexConcreteClass = panelMount != null ? panelMount.IndexConcreteClass : MountingPanel.DefineIndexConcreteClass(markSb); if (indexConcreteClass > 0) { string markSbWoConcreteClass = MountingPanel.GetMarkWoConcreteClass(markSb); panel = GetPanelXml(markSbWoConcreteClass, panelMount); if (panel != null) { panel.mark = markSb; } return(panel); } } if (panel == null) { // Ошибка - панели с такой маркой нет в базе if (panelMount == null) { Inspector.AddError($"Панели с такой маркой нет в базе - {markSb}", icon: System.Drawing.SystemIcons.Error); } else { Inspector.AddError($"Панели с такой маркой нет в базе - {markSb}", panelMount.ExtTransToModel, panelMount.IdBlRef, icon: System.Drawing.SystemIcons.Error); } } return(panel); }
/// <summary> /// преобразование панеелей /// </summary> public void ConvertBtr() { ProgressMeter progress = new ProgressMeter(); progress.SetLimit(PanelsBtrExport.Count); progress.Start("Преобразование блоков панелей в экспортированном файле"); // Преобразования определений блоков панелей foreach (var panelBtr in PanelsBtrExport) { progress.MeterProgress(); if (HostApplicationServices.Current.UserBreak()) { throw new System.Exception("Отменено пользователем."); } try { panelBtr.ConvertBtr(); if (!string.IsNullOrEmpty(panelBtr.ErrMsg)) { Inspector.AddError(panelBtr.ErrMsg, panelBtr.Panels.First().Extents, panelBtr.Panels.First().IdBlRefAkr, icon: System.Drawing.SystemIcons.Error); } } catch (System.Exception ex) { Inspector.AddError($"Ошибка конвертации блока панели - {ex.Message}", icon: System.Drawing.SystemIcons.Error); //Logger.Log.Error(ex, "Ошибка конвертиации экспортрированного блока панели"); } } progress.Stop(); }
public void Update() { try { AddPlacesFromMap(); if (!IsEnableCalc) { return; } // Очистка удаленных контуров var deletedPlaces = Places.Where(p => !p.PlaceId.IsValidEx()).ToList(); foreach (var item in deletedPlaces) { Places.Remove(item); item.Dispose(); } foreach (var place in Places) { place.Update(); } } catch (Exception ex) { Inspector.AddError($"Ошибка расчета площадок - {ex.Message}"); Logger.Log.Error(ex, "PlaceModel.Update()"); } }
private void checkWindow() { if (string.IsNullOrEmpty(Mark)) { Inspector.AddError($"Не определена марка окна '{BlName}' в блоке панели '{MarkSb.MarkSbBlockName}'", icon: System.Drawing.SystemIcons.Error); } }
private void checkStoreysFacade() { // проверка этажей в фасаде. // не должно быть одинаковых номеров этажей var storeysFacade = Floors.Select(f => f.Storey); var storeyNumbersType = storeysFacade.Where(s => s.Type == EnumStorey.Number).ToList(); var dublicateNumbers = storeyNumbersType.GroupBy(s => s.Number).Where(g => g.Count() > 1).Select(g => g.Key).ToList(); if (dublicateNumbers.Count > 0) { string nums = string.Join(",", dublicateNumbers); Inspector.AddError($"Повторяющиеся номера этажей в фасаде. Координата фасада X = {XMin}. " + $"Повторяющиеся номера этажей определенные по блокам монтажных планов этого фасада {nums}", icon: System.Drawing.SystemIcons.Error); } // Ч и П могут быть только по одной штуке var storeyUpperType = storeysFacade.Where(s => s.Type == EnumStorey.Upper); if (storeyUpperType.Count() > 1) { Inspector.AddError(string.Format( "Не должно быть больше одного этажа Чердака в одном фасаде. Для фасада найдено {0} блоков монтажных планов определенных как чердак. Координата фасада X = {1}.", storeyUpperType.Count(), XMin), icon: System.Drawing.SystemIcons.Error); } var storeyParapetType = storeysFacade.Where(s => s.Type == EnumStorey.Parapet); if (storeyParapetType.Count() > 1) { Inspector.AddError(string.Format( "Не должно быть больше одного этажа Парапета в одном фасаде. Для фасада найдено {0} блоков монтажных планов определенных как парапет. Координата фасада X = {1}.", storeyParapetType.Count(), XMin), icon: System.Drawing.SystemIcons.Error); } }
/// <summary> /// Создание таблицы спецификации блоков, с запросом выбора блоков у пользователя. /// Таблица будет вставлена в указанное место пользователем в текущем пространстве. /// </summary> public void CreateTable() { // Выбор блоков SelBlocks.Select(); using (var t = Doc.TransactionManager.StartTransaction()) { try { // Фильтрация блоков Items = SpecItem.FilterSpecItems(this); // Группировка элементов Groups = SpecGroup.Grouping(this); // Создание таблицы Table table = getTable(); // Вставка таблицы insertTable(table); } catch (Exception ex) { Logger.Log.Error(ex, "SpecTable.CreateTable()."); Inspector.AddError(ex.Message); } t.Commit(); } }
public void DefineStorey(List <Storey> storeysNumbersTypeInAllFacades) { try { var storey = new Storey(BlRefName); if (storey.Type == EnumStorey.Number) { // поиск в общем списке этажей. Номерные этажи всех фасадов должны быть на одном уровне var storeyAllFacades = storeysNumbersTypeInAllFacades?.Find(s => s.Number == storey.Number); if (storeyAllFacades == null) { storeysNumbersTypeInAllFacades?.Add(storey); } else { storey = storeyAllFacades; } //Height = Settings.Default.FacadeFloorHeight; } Storey = storey; } catch (Exception ex) { // ошибка определения номера этажа монтажки - это не чердак (Ч), не парапет (П), и не // просто число Inspector.AddError(ex.Message + BlRefName, IdBlRefMounting, icon: System.Drawing.SystemIcons.Error); Logger.Log.Error(ex, "Floor - DefineStorey()"); } }
public ParkingBuilding(BlockReference blRef, string blName) : base(blRef, blName) { IdBlRef = blRef.Id; Height = Floors * 3; FriendlyTypeName = "Паркинг"; BuildingType = BuildingTypeEnum.Garage; var valPlaces = BlockBase.GetPropValue <string>(ParamPlaces, exactMatch: false); var resPlaces = AcadLib.Strings.StringHelper.GetStartInteger(valPlaces); if (resPlaces.Success) { Places = resPlaces.Value; } else { BlockBase.AddError($"Не определено кол машиномест из параметра {ParamPlaces} = {valPlaces}"); } // Полилиния контура var plContour = BlockBase.FindPolylineInLayer(LayerContour).FirstOrDefault(); if (plContour == null) { Inspector.AddError($"Не определена полилиния контура здания парковки на слое {LayerContour}.", IdBlRef, System.Drawing.SystemIcons.Warning); } else { IdPlContour = plContour.Id; } }
/// <summary> /// Обновление домов в группе и расчет /// </summary> public void Update() { if (!IsVisualFrontOn || Front?.Model == null) { return; } try { // Дома в области группы - без домов из других групп var housesInGroup = Front.Model.Map.Houses.GetHousesInExtents(SelectRegion). Where(w => w.FrontGroup == null || w.FrontGroup == this).ToList(); for (int i = 0; i < housesInGroup.Count; i++) { var house = housesInGroup[i]; house.FrontGroup = this; house.Update(i + 1); } Houses = new ObservableCollection <House>(housesInGroup.OrderBy(o => o.Name, AcadLib.Comparers.AlphanumComparator.New)); } catch (Exception ex) { Inspector.AddError($"Ошибка расчета фронтов '{Name}' - {ex.Message}", SelectRegion, Matrix3d.Identity, System.Drawing.SystemIcons.Error); Logger.Log.Error(ex, "FrontGroup.Update()"); } }
// Определение покраски панели (список цветов по порядку списка плитов в блоке СБ) public static List <Paint> GetPanelMarkAR(MarkSb markSb, BlockReference blRefPanel, RTree <ColorArea> rtreeColorAreas) { List <Paint> paintsAR = new List <Paint>(); int i = 0; bool hasTileWithoutPaint = false; foreach (Tile tileMarSb in markSb.Tiles) { Paint paintSb = markSb.Paints[i++]; Paint paintAR; if (paintSb == null) { // Опрделение покраски по зонам Point3d centerTileInBlRef = GetCenterTileInBlockRef(blRefPanel.Position, tileMarSb.CenterTile); paintAR = ColorArea.GetPaint(centerTileInBlRef, rtreeColorAreas); if (paintAR == null) { if (!hasTileWithoutPaint) { //Ошибка. Не удалось определить покраску плитки.??? Inspector.AddError($"{markSb.MarkSbClean} - не все плитки покрашены", blRefPanel, icon: System.Drawing.SystemIcons.Error); hasTileWithoutPaint = true; } } } else { paintAR = paintSb; } paintsAR.Add(paintAR); } return(paintsAR); }
public static void CreateTable(bool isNew) { Doc = Application.DocumentManager.MdiActiveDocument; Db = Doc.Database; Ed = Doc.Editor; OptionsKPBS.PromptOptions(); // Выбор блоков блок-секций var blocks = SelectBlocksection(isNew, false); // Определение точных контуров ГНС - с учетом стыковки блок-секций if (isNew) { try { DefineHouses(blocks, false); } catch (Exception ex) { Inspector.AddError($"Ошибка определения точного контура ГНС Блок-Секций - {ex}"); } } // Подсчет блок-секций var dataSec = new DataSection(blocks, OptionsKPBS.Instance); dataSec.Calc(); // Создание таблицы и вставка var tableSec = new TableSection(dataSec); tableSec.Create(); }
private List <OutsidePanel> defineOutsidePanelsToExport() { List <OutsidePanel> outPanelsToExport = new List <OutsidePanel>(); // Выбор блоков SelectBlocks selectBl = new SelectBlocks(); selectBl.SelectOutsidesAndWorkspaces(); // Связывание блоков наружек и рабочих областей. RTree <Workspace> treeWs = getRTreeWS(selectBl.Workspaces); foreach (var outPanel in selectBl.OutsidePanels) { Point p = new Point(outPanel.Position.X, outPanel.Position.Y, 0); var nearestWs = treeWs.Nearest(p, 1).FirstOrDefault(); if (nearestWs != null) { outPanel.Workspace = nearestWs; outPanelsToExport.Add(outPanel); } else { // Для панели не определена рабочая область Inspector.AddError($"Для наружной стеновой панели '{outPanel.Mark}' не определена рабочая область.", outPanel.IdBlRef, System.Drawing.SystemIcons.Exclamation); } } return(outPanelsToExport); }
public static void CheckNums(List <Pile> piles) { // Проверка последовательности номеров. //var sortNums = piles.OrderBy(p => p.Pos); // Проверка повторяющихся номеров var repeatNums = piles.GroupBy(g => g.Pos).Where(g => g.Skip(1).Any()); foreach (var repaet in repeatNums) { foreach (var item in repaet) { Inspector.AddError($"Повтор номера {item.Pos}", item.IdBlRef, System.Drawing.SystemIcons.Error); } } // Проверка пропущенных номеров var minNum = piles.First().Pos; var maxNum = piles.Last().Pos; var trueSeq = Enumerable.Range(minNum, maxNum - minNum); var missNums = trueSeq.Except(piles.Select(p => p.Pos)).Where(p => p > 0); foreach (var item in missNums) { Inspector.AddError($"Пропущен номер сваи {item}", System.Drawing.SystemIcons.Error); } // Недопустимые номера - меньше 1 var negateNums = piles.Where(p => p.Pos < 1); foreach (var item in negateNums) { Inspector.AddError($"Недопустимый номер сваи {item.Pos}", item.IdBlRef, System.Drawing.SystemIcons.Error); } }
/// <summary> /// Поиск блока стены по границам стен и точке вставки блока двери /// </summary> public void SearchHostWallDwg(List <Element> elements) { this.HostWall = new List <WallElement>(); var walls = elements.OfType <WallElement>(); foreach (var wall in walls) { // Попадает ли точка вствавки блока двери в границы стены if (wall.Contour == null) { if (wall.ExtentsClean.IsPointInBounds(Position)) { HostWall.Add(wall); } } else { if (wall.Contour.IsPointInsidePolygon(Position)) { HostWall.Add(wall); } } } // Ошибка если не найдена стена if (this.HostWall.Count == 0) { Inspector.AddError($"Не определена стена для двери {FamilySymbolName}. ", ExtentsInModel, IdBlRef, System.Drawing.SystemIcons.Error); // Исключить дверь из элементов модуля - и дверь не будет записана в базк elements.Remove(this); } }
/// <summary> /// Определение номеров строк и столбцов ячеек инсоляции /// </summary> public void DefineNumCells() { foreach (var cell in Cells) { cell.DefineNumCell(); } // Проверка наложения ячеек - не должно быть ячеек с одинаковым номером строки и столбца var dublicateCells = Cells.GroupBy(g => new { row = g.Row, col = g.Column }).Where(w => w.Skip(1).Any()); foreach (var dubl in dublicateCells) { // Ошибка var fp = dubl.First(); var err = $"Наложение ячеек инсоляции! Координата {fp.PtCenterOrig}. Ячейка в Excel [{dubl.Key.row};{dubl.Key.col}]"; var ext = fp.PtCenterOrig.GetRectangleFromCenter(InsCell.ModuleSize).Convert3d(); Inspector.AddError(err, ext, Matrix3d.Identity, System.Drawing.SystemIcons.Error); } #if TEST // Подпись ячеек foreach (var item in Cells) { item.TestDraw(); } #endif }
public void DefineOrientation(BlockReference blRefElem) { // Определение направления var btr = blRefElem.BlockTableRecord.GetObject(OpenMode.ForRead) as BlockTableRecord; bool isFinded = false; foreach (var idEnt in btr) { var lineOrient = idEnt.GetObject(OpenMode.ForRead, false, true) as Line; if (lineOrient == null || lineOrient.ColorIndex != Options.Instance.DoorOrientLineColorIndex || !lineOrient.Visible) { continue; } var lineTemp = (Line)lineOrient.Clone(); lineTemp.TransformBy(blRefElem.BlockTransform); Direction = Element.GetDirection(lineTemp.Angle); isFinded = true; break; } if (!isFinded) { Inspector.AddError($"Не определено направление открывания двери {Name}. " + $"Направление открывания двери определяется отрезком с цветом {Options.Instance.DoorOrientLineColorIndex} в блоке двери.", this.ExtentsInModel, this.IdBlRef, System.Drawing.SystemIcons.Error); } }
/// <summary> /// Проверка соответствия значениям в столбцах /// </summary> /// <param name="columnsValue"></param> public void CheckColumnsValur(List <ColumnValue> columnsValue, SpecTable specTable) { string err = string.Empty; foreach (var colVal in columnsValue) { if (colVal.ColumnSpec.ItemPropName == "Count") { continue; } DBText atr; if (AttrsDict.TryGetValue(colVal.ColumnSpec.ItemPropName, out atr)) { if (!colVal.Value.Equals(atr.TextString, StringComparison.OrdinalIgnoreCase)) { err += $"'{colVal.ColumnSpec.ItemPropName}'='{atr.TextString}' не соответствует эталонному значению '{colVal.Value}', '{specTable.SpecOptions.KeyPropName}' = '{Key}'.\n"; } } else { // В элементе вообще нет свойства для этого столбца err += $"Не определено свойство '{colVal.ColumnSpec.ItemPropName}'.\n"; } } if (!string.IsNullOrEmpty(err)) { Inspector.AddError($"Ошибки в блоке {BlName}: {err} Этот блок попадет в спецификацию с эталонными значениями.", IdBlRef); } }
private static void ShowSelection() { if (Palette.IsStop || !providers.Any()) { Clear(); return; } var doc = AcadHelper.Doc; var sel = doc.Editor.SelectImplied(); if (sel.Status != PromptStatus.OK || sel.Value.Count == 0) { // Очистить палитру свойств Clear(); return; } entModifiedObs?.Dispose(); var ids = sel.Value.GetObjectIds(); idsHash = new HashSet <ObjectId>(ids); // группы по типу объектов var groups = new List <PalettePropsType>(); using (doc.LockDocument()) using (var t = doc.TransactionManager.StartTransaction()) { foreach (var provider in providers) { try { var types = provider.GetTypes(ids, doc) .Where(w => w?.Groups?.Any(g => g?.Properties?.Any() == true) == true); groups.AddRange(types); } catch (Exception ex) { Inspector.AddError($"Ошибка обработки группы свойств '{provider.Name}' - {ex}"); } } t.Commit(); } if (groups.Count == 0) { propsVM.Clear(); } else { propsVM.Types = groups.OrderByDescending(o => o.Count).ToList(); propsVM.SelectedType = propsVM.Types[0]; } SubscibeEntityModified(doc.Database); Inspector.Show(); }
private List <AirConditioner> Filter(List <ObjectId> selBls) { var airConds = new List <AirConditioner>(); foreach (var idBlRef in selBls) { using (var blRef = idBlRef.Open(OpenMode.ForRead, false, true) as BlockReference) { var blName = blRef.GetEffectiveName(); if (blName.Equals("АР_Корзина_Кондиционера", StringComparison.OrdinalIgnoreCase)) { var airCond = new AirConditioner(blRef); airConds.Add(airCond); if (!string.IsNullOrEmpty(airCond.Error)) { Inspector.AddError($"Ошибки в блоке кондиционера - {airCond.Error}", blRef, System.Drawing.SystemIcons.Warning); } } } } if (airConds.Count == 0) { throw new Exception("Не найдены блоки кондиционеров 'АР_Корзина_Кондиционера'"); } return(airConds); }
public void CalcRows(List <IGrouping <string, IArea> > groups) { data = new List <BalanceRow>(); foreach (var item in groups) { BalanceRow row = new BalanceRow(item.ToList()); data.Add(row); } // Строка Площади участка дома var homeRow = data.Find(r => r.ClassType.ClassName == BalanceClassService.HomeArea); if (homeRow != null) { // Процент остальных площадей foreach (var item in data) { item.PercentTerritory = Math.Round(item.Area / homeRow.Area * 100, 2); } } else { Inspector.AddError($"Не определен объект класса '{BalanceClassService.HomeArea}'"); } CalcRows(); }