public void BaseApartmentsClear() { Logger.Log.Info("Start command AR-BaseApartmentsClear"); Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) { return; } // Проверка допуска пользователя if (!AccessUsers.HasAccess()) { doc.Editor.WriteMessage("\nОтказано в доступе"); return; } try { BaseApartments.Clear(); } catch (System.Exception ex) { doc.Editor.WriteMessage($"\nОшибка очистки базы: {ex.Message}"); if (!ex.Message.Contains("Отменено пользователем")) { Logger.Log.Error(ex, $"Command: AR-BaseApartmentsClear. {doc.Name}"); } } }
/// <summary> /// Поиск квартир в вфбранных блоках /// </summary> public static List <Apartment> GetApartments(IEnumerable <ObjectId> idsBlRef) { List <Apartment> apartments = new List <Apartment>(); // Импользование базы для проверки категории элементов и их параметров using (var entities = BaseApartments.ConnectEntities()) { entities.F_nn_Category_Parameters.Load(); BaseCategoryParameters = entities.F_nn_Category_Parameters.Local.GroupBy(cp => cp.F_S_Categories).Select(p => new KeyValuePair <string, List <F_S_Parameters> >(p.Key.NAME_RUS_CATEGORY, p.Select(i => i.F_S_Parameters).ToList())).ToList(); } Autodesk.AutoCAD.DatabaseServices.Database db = HostApplicationServices.WorkingDatabase; using (var t = db.TransactionManager.StartTransaction()) { ProgressMeter progress = new ProgressMeter(); progress.Start("Считывание квартир с чертежа..."); foreach (ObjectId idEnt in idsBlRef) { progress.MeterProgress(); var blRefApart = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference; if (blRefApart != null) { string blName = blRefApart.GetEffectiveName(); if (IsBlockNameApartment(blName)) { // Не добавлять одну и ту же квартиру в список if (!apartments.Exists(a => a.Name.Equals(blName, StringComparison.OrdinalIgnoreCase))) { try { var apartment = new Apartment(blRefApart, blName); apartments.Add(apartment); } catch (System.Exception ex) { Inspector.AddError($"Ошибка считывания блока квартиры '{blName}' - {ex.Message}.", blRefApart, icon: SystemIcons.Error); } } } else { Inspector.AddError($"Отфильтрован блок квартиры '{blName}', имя не соответствует " + $"'{Options.Instance.BlockApartmentNameMatch}", blRefApart, icon: System.Drawing.SystemIcons.Information); } } } progress.Stop(); t.Commit(); } apartments.Sort((a1, a2) => a1.Name.CompareTo(a2.Name)); return(apartments); }
public void BaseApartmentsExport() { Logger.Log.Info("Start command AR-BaseApartmentsExport"); Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) { return; } // Проверка допуска пользователя if (!AccessUsers.HasAccess()) { doc.Editor.WriteMessage("\nОтказано в доступе"); return; } if (!File.Exists(doc.Name)) { doc.Editor.WriteMessage("\nНужно сохранить текущий чертеж."); return; } try { Inspector.Clear(); Database db = doc.Database; Editor ed = doc.Editor; ExportApartmentsAbout(); Parameter.BlocksConstantAtrs = new Dictionary <ObjectId, List <Parameter> >(); // Проверка дубликатов блоков CheckDublicateBlocks.Tolerance = new Autodesk.AutoCAD.Geometry.Tolerance(0.02, 15); CheckDublicateBlocks.Check(new HashSet <string>() { "RV_EL_BS_Базовая стена", "RV_EL_BS_Вентиляционный блок" }); // Создание папки для экспорта подложек квуартир DefineDirExportFilesApartments(db); // Считывание блоков квартир из чертежа var apartments = Apartment.GetApartments(db); if (apartments.Count == 0) { throw new System.Exception($"Блоки квартир не найдены. Имя блока квартиры должно соответствовать условию Match = '{Options.Instance.BlockApartmentNameMatch}'"); } ed.WriteMessage($"\nВ Модели найдено {apartments.Count} блоков квартир."); Inspector.ShowDialog(); Inspector.Clear(); // Квартиры в базе var apartmentsInBase = GetBaseApartments.GetAll(); //Проверка всех элементов квартир в базе - категории, параметры. CheckApartments.Check(apartments, apartmentsInBase); // Сортировка квартир, модулей и элементов var alphaComparer = AcadLib.Comparers.AlphanumComparator.New; apartments.Sort((a1, a2) => a1.Name.CompareTo(a2.Name)); apartments.ForEach(a => { a.Modules.Sort((m1, m2) => m1.Name.CompareTo(m2.Name)); a.Modules.ForEach(m => m.Elements.Sort((e1, e2) => alphaComparer.Compare(e1.NodeName, e2.NodeName))); }); // Форма предпросмотра экспорта блоков FormBlocksExport formExport = new FormBlocksExport(apartments); var dlgRes = Application.ShowModalDialog(formExport); // Прервать if (dlgRes == System.Windows.Forms.DialogResult.Abort) { formExport.SetModaless(); Application.ShowModelessDialog(formExport); throw new System.Exception(AcadLib.General.CanceledByUser); } if (dlgRes == System.Windows.Forms.DialogResult.OK) { // Экспорт блоков в файлы var count = Apartment.ExportToFiles(apartments); ed.WriteMessage($"\nЭкспортированно '{count}' квартир в отдельные файлы."); // Выбор квартир записываемых в базу - изменившиеся и новые var apartsToDb = apartments.Where (a => !a.BaseStatus.HasFlag(EnumBaseStatus.Error) && !a.BaseStatus.HasFlag(EnumBaseStatus.NotInDwg) && ( a.BaseStatus.HasFlag(EnumBaseStatus.Changed) || a.BaseStatus.HasFlag(EnumBaseStatus.New) || a.Modules.Any(m => !m.BaseStatus.HasFlag(EnumBaseStatus.Error) && ( m.BaseStatus.HasFlag(EnumBaseStatus.Changed) || m.BaseStatus.HasFlag(EnumBaseStatus.New) )) )).ToList(); //var apartsNotToDB = apartments.Except(apartsToDb); //foreach (var apartNotToDB in apartsNotToDB) //{ // ed.WriteMessage($"\nКвартира не будет записана в базу, статус '{apartNotToDB.BaseStatus}' - '{apartNotToDB.Name}'."); //} //// Запись квартир в xml //string fileXml = Path.Combine(Path.GetDirectoryName(doc.Name), Path.GetFileNameWithoutExtension(doc.Name) + ".xml"); //Apartment.ExportToXML(fileXml, apartmentsToExport); // Запись в DB try { BaseApartments.Export(apartsToDb); } catch (System.Exception ex) { Inspector.AddError($"Ошибка экспорта в БД - {ex.Message}", icon: System.Drawing.SystemIcons.Error); } // Запись лога экспортированных блоков string logFile = Path.Combine(Path.GetDirectoryName(doc.Name), Options.Instance.LogFileName); ExcelLog excelLog = new ExcelLog(logFile); excelLog.AddtoLog(apartments); // Показ ошибок Inspector.Show(); } } catch (System.Exception ex) { doc.Editor.WriteMessage($"\nОшибка экспорта блоков: {ex.Message}"); if (!ex.Message.Contains(AcadLib.General.CanceledByUser)) { Logger.Log.Error(ex, $"Command: AR-BaseApartmentsExport. {doc.Name}"); } } }