예제 #1
0
        public void AKR_PaintPanels()
        {
            CommandStart.Start(doc =>
            {
                //// Принудительное сохранение файла
                //if (File.Exists(doc.Name))
                //{
                //   object obj = AcAp.GetSystemVariable("DBMOD");
                //   // Проверка значения системной переменной DBMOD. Если 0 - значит чертёж не был изменён
                //   if (Convert.ToInt16(obj) != 0)
                //   {
                //      var db = doc.Database;
                //      try
                //      {
                //         db.SaveAs(db.Filename, true, DwgVersion.Current, db.SecurityParameters);
                //      }
                //      catch (System.Exception ex)
                //      {
                //         doc.Editor.WriteMessage($"Ошибка сохранения файла. {ex.Message}");
                //         Logger.Log.Error(ex, "Ошибка при сохранении чертеже перед покраской");
                //      }
                //   }
                //}

                string commandName = nameof(AKR_PaintPanels);
                if (string.Equals(_lastStartCommandName, commandName))
                {
                    if ((DateTime.Now - _lastStartCommandDateTime).Seconds < 5)
                    {
                        doc.Editor.WriteMessage("Между запусками команды прошло меньше 5 секунд. Отмена.");
                        return;
                    }
                }

                // Проверка дубликатов блоков
                Select.SelectionBlocks sel = new Select.SelectionBlocks(doc.Database);
                sel.SelectBlRefsInModel(false);
                var panelsToCheck = sel.IdsBlRefPanelAr;
                panelsToCheck.AddRange(sel.IdsBlRefPanelSb);
                CheckDublicateBlocks.Check(panelsToCheck);

                Inspector.Clear();
                if (_album == null)
                {
                    _album = new Album();
                }
                else
                {
                    // Повторный запуск программы покраски панелей.
                    // Сброс данных
                    _album.ResetData();
                }

                // Покраска
                _album.PaintPanels();

                doc.Editor.Regen();
                doc.Editor.WriteMessage("\nПокраска панелей выполнена успешно.");
                Logger.Log.Info("Покраска панелей выполнена успешно. {0}", doc.Name);

                _lastStartCommandName     = commandName;
                _lastStartCommandDateTime = DateTime.Now;
            });
        }
예제 #2
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}");
                }
            }
        }