예제 #1
0
        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}");
                }
            }
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        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}");
                }
            }
        }