/// <summary> /// Загрузка панелей из библиотеки. И запись загруженных блоков в список панелей СБ. /// </summary> /// <param name="_allPanelsSB">Список всех панелей-СБ в чертеже</param> public static void LoadBtrPanels(List <FacadeMounting> facades) { // файл библиотеки if (!File.Exists(PanelLibrarySaveService.LibPanelsFilePath)) { throw new Exception("Не найден файл библиотеки АКР-Панелей - " + PanelLibrarySaveService.LibPanelsFilePath); } Database dbFacade = HostApplicationServices.WorkingDatabase; using (Database dbLib = new Database(false, true)) { dbLib.ReadDwgFile(PanelLibrarySaveService.LibPanelsFilePath, FileShare.ReadWrite, true, ""); dbLib.CloseInput(true); // список блоков АКР-Панелей в библиотеке (полные имена блоков). List <PanelAKR> panelsAkrInLib = PanelAKR.GetAkrPanelLib(dbLib, false); // словарь соответствия блоков в библиотеке и в чертеже фасада после копирования блоков Dictionary <ObjectId, PanelAKR> idsPanelsAkrInLibAndFacade = new Dictionary <ObjectId, PanelAKR>(); List <MountingPanel> allPanelsSb = facades.SelectMany(f => f.Panels).ToList(); foreach (var panelSb in allPanelsSb) { PanelAKR panelAkrLib = findAkrPanelFromPanelSb(panelSb, panelsAkrInLib); if (panelAkrLib == null) { // Не найден блок в библиотеке Inspector.AddError($"Не найдена панель в библиотеке соответствующая монтажке - '{panelSb.MarkSbWithoutElectric}'", panelSb.ExtTransToModel, panelSb.IdBlRef, icon: System.Drawing.SystemIcons.Error); } else { //panelAkrLib.PanelSb = panelSb; if (!idsPanelsAkrInLibAndFacade.ContainsKey(panelAkrLib.IdBtrAkrPanel)) { idsPanelsAkrInLibAndFacade.Add(panelAkrLib.IdBtrAkrPanel, panelAkrLib); } panelSb.PanelAkr = panelAkrLib; } } // Копирование блоков в базу чертежа фасада if (idsPanelsAkrInLibAndFacade.Count > 0) { using (IdMapping iMap = new IdMapping()) { dbFacade.WblockCloneObjects(new ObjectIdCollection(idsPanelsAkrInLibAndFacade.Keys.ToArray()), dbFacade.BlockTableId, iMap, DuplicateRecordCloning.Replace, false); // запись соответствия панелей foreach (var item in idsPanelsAkrInLibAndFacade) { item.Value.IdBtrPanelAkrInFacade = iMap[item.Key].Value; // определение габаритов панели item.Value.DefineGeom(item.Value.IdBtrPanelAkrInFacade); } } } } // определение отметок этажей Ч и П в фасадах //facades.ForEach(f => f.DefYForUpperAndParapetStorey()); }
private void savePanelsAkrToLibDb(List <PanelAkrFacade> panelsAkrInFacade, out string msgReport) { msgReport = string.Empty; using (var dbLib = new Database(false, true)) { try { dbLib.ReadDwgFile(LibPanelsFilePath, FileShare.Read, false, ""); dbLib.CloseInput(true); } catch (Exception ex) { // Кто-то уже выполняет сохранение панелей в библиотеку. Сообщить кто занял библиотеку и попросить повторить позже. WarningBusyLibrary(ex); return; } dbLib.CloseInput(true); // список панелей в библиотеке List <PanelAKR> panelsAkrInLib = PanelAKR.GetAkrPanelLib(dbLib, false); //GetPanelsAkrInDb(dbLib); //GetPanelsInLib(); // Список изменившихся панелей и новых для записи в базу. List <PanelAkrFacade> panelsAkrToSave = PanelAkrFacade.GetChangedAndNewPanels(panelsAkrInFacade, panelsAkrInLib); // Форма для просмотра и управления списков сохранения панелей FormSavePanelsToLib formSave = new FormSavePanelsToLib( panelsAkrToSave.Where(p => p.ReportStatus == EnumReportStatus.New).ToList(), panelsAkrToSave.Where(p => p.ReportStatus == EnumReportStatus.Changed).ToList(), panelsAkrInFacade.Where(p => p.ReportStatus == EnumReportStatus.Other).ToList()); if (Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(formSave) != System.Windows.Forms.DialogResult.OK) { return; } if (formSave.PanelsToSave.Count > 0) { //// копия текущего файла библиотеки панелей с приставкой сегодняшней даты //copyLibPanelFile(LibPanelsFilePath); // файл с панелями до изменений - сохранить. backupChangedPanels(formSave.PanelsToSave, panelsAkrInLib, dbLib); // Копирование новых панелей copyNewPanels(dbLib, formSave.PanelsToSave); // Текст изменений. //textChangesToLibDwg(panelsAkrToCopy, dbLib, t); // Сохранение файла библиотеки панелей dbLib.SaveAs(dbLib.Filename, DwgVersion.Current); // строка отчета msgReport = getReport(formSave.PanelsToSave); Logger.Log.Info("Обновлена библиотека панелей."); SaveChangesToExel.Save(formSave.PanelsToSave); } else { throw new Exception("\nНет панелей для сохранения в библиотеку (в текущем чертеже нет новых и изменившихся панелей)."); } } }
public static List <PanelAKR> GetPanelsInLib(string panelsFile, bool defineFullPanelData) { List <PanelAKR> panelsInLib = new List <PanelAKR>(); // Получение списка панелей в библиотеке // файл библиотеки if (!File.Exists(PanelLibrarySaveService.LibPanelsFilePath)) { throw new Exception("Не найден файл библиотеки АКР-Панелей - " + PanelLibrarySaveService.LibPanelsFilePath); } // копирование в temp //string fileLibPanelsTemp = Path.GetTempFileName(); //File.Copy(PanelLibrarySaveService.LibPanelsFilePath, fileLibPanelsTemp, true); using (Database dbLib = new Database(false, true)) { dbLib.ReadDwgFile(panelsFile, FileShare.ReadWrite, true, ""); dbLib.CloseInput(true); // список блоков АКР-Панелей в библиотеке (полные имена блоков). panelsInLib = PanelAKR.GetAkrPanelLib(dbLib, defineFullPanelData); } return(panelsInLib); }