public void CreateBtrPanelFromBase(int i, string[] marks) { // Тест создания определения блока панели по описанию в xml базе. PanelBase panelBase; string testFile = @"c:\temp\test\АКР\Base\Tests\CreateBlockPanelTest\TestCreatePanels.dwg"; //File.Copy(@"c:\Autodesk\AutoCAD\Pik\Settings\Template\АР\АР.dwt", testFile, true); using (var db = new Database(false, true)) { db.ReadDwgFile(testFile, FileOpenMode.OpenForReadAndAllShare, false, ""); db.CloseInput(true); using (AcadLib.WorkingDatabaseSwitcher dbSwitcher = new AcadLib.WorkingDatabaseSwitcher(db)) { baseService.ClearPanelsAkrFromDrawing(db); baseService.InitToCreationPanels(db); Point3d pt = Point3d.Origin; List<ObjectId> idsBtrPanels = new List<ObjectId>(); // Создание определениц блоков панелей foreach (var mark in marks) { Panel panelXml = baseService.GetPanelXml(mark); panelBase = new PanelBase(panelXml, baseService); panelBase.CreateBlock(); if (!panelBase.IdBtrPanel.IsNull) { idsBtrPanels.Add(panelBase.IdBtrPanel); } } // Вставка вхождениц блоков панелей в модель using (var t = db.TransactionManager.StartTransaction()) { foreach (var idBtrPanel in idsBtrPanels) { var blRefPanel = new BlockReference(pt, idBtrPanel); var ms = db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord; ms.AppendEntity(blRefPanel); t.AddNewlyCreatedDBObject(blRefPanel, true); pt = new Point3d(0, pt.Y + 10000, 0); } t.Commit(); } } db.SaveAs(testFile, DwgVersion.Current); } }
private Dictionary<string, PanelBase> matchingPlans(List<FacadeMounting> facadesMounting, List<FloorArchitect> floorsAr) { // Определение окон в монтажных планах по архитектурным планам var panelsBase = new Dictionary<string, PanelBase>(); // string - ключ - маркаСБ + Марки Окон по порядку. // Список монтажных планов - уникальных var floorsMount = facadesMounting.SelectMany(f => f.Floors); foreach (var floorMount in floorsMount) { // Найти соотв арх план var floorAr = floorsAr.Find(f => f.Section == floorMount.Section && f.IsEqualMountingStorey(floorMount.Storey) ); //Test Добавить текст имени плана Ар в блок монтажного плана #if Test { if (floorAr != null) { using (var btrMount = floorMount.IdBtrMounting.Open(OpenMode.ForWrite) as BlockTableRecord) { DBText textFindPlanAr = new DBText(); textFindPlanAr.TextString = floorAr.BlName; btrMount.AppendEntity(textFindPlanAr); //btrMount.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(textFindPlanAr, true); } } } #endif if (floorAr == null) { Inspector.AddError($"Не найден блок архитектурного плана для соответствующего монтажного плана '{floorMount.BlRefName}'", floorMount.IdBlRefMounting, icon: System.Drawing.SystemIcons.Error); } else if (floorAr.Windows.Count == 0) { Inspector.AddError($"Не найдено ни одного окна в блоке архитектурного плана '{floorMount.BlRefName}'.", floorAr.IdBlRef, icon: System.Drawing.SystemIcons.Error); } foreach (var panelMount in floorMount.PanelsSbInFront) { Panel panelXml = GetPanelXml(panelMount.MarkSb, panelMount); if (panelXml == null) continue; PanelBase panelBase = new PanelBase(panelXml, this, panelMount); // Определение окон в панели по арх плану if (panelXml.windows?.window != null) { foreach (var window in panelXml.windows.window) { if (floorAr == null || floorAr.Windows.Count==0) { break; } // Точка окна внутри панели по XML описанию Point3d ptOpeningCenter = new Point3d(window.posi.X + window.width * 0.5, 0, 0); // Точка окна внутри монтажного плана Point3d ptWindInModel = panelMount.ExtTransToModel.MinPoint.Add(ptOpeningCenter.GetAsVector()); Point3d ptWindInArPlan = ptWindInModel.TransformBy(floorMount.Transform.Inverse()); var windowKey = floorAr?.Windows.GroupBy(w => w.Key.DistanceTo(ptWindInArPlan))?.MinBy(w => w.Key); if (windowKey == null || windowKey.Key > 600) { Inspector.AddError( $"Не найдено соответствующее окно в архитектурном плане. Блок монтажной панели {panelMount.MarkSb}", panelMount.ExtTransToModel, panelMount.IdBlRef, icon: System.Drawing.SystemIcons.Error); continue; } panelBase.WindowsBaseCenters.Add(ptOpeningCenter, windowKey.First().Value); // Test Добавление точек окна в блоке монтажки #if Test { using (var btrMountPlan = floorMount.IdBtrMounting.Open(OpenMode.ForWrite) as BlockTableRecord) { using (DBPoint ptWinInPlan = new DBPoint(ptWindInArPlan)) { ptWinInPlan.ColorIndex = 2; btrMountPlan.AppendEntity(ptWinInPlan); //btrMountPlan.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(ptWinInPlan, true); } using (DBText dbText = new DBText()) { dbText.Position = ptWindInArPlan; dbText.TextString = windowKey.First().Value; btrMountPlan.AppendEntity(dbText); //btrMountPlan.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(dbText, true); } } using (var btrArPlan = floorAr.IdBtr.Open(OpenMode.ForWrite) as BlockTableRecord) { using (DBPoint ptWinInArPlan = new DBPoint(ptWindInArPlan)) { ptWinInArPlan.ColorIndex = 1; btrArPlan.AppendEntity(ptWinInArPlan); //btrArPlan.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(ptWinInArPlan, true); } } } #endif } } // Уникальный ключ панели - МаркаСБ + Марки окон string key = panelBase.MarkWithoutElectric; if (panelBase.WindowsBaseCenters.Count > 0) { string windowMarks = string.Join(";", panelBase.WindowsBaseCenters.Values); key += windowMarks; } PanelBase panelBaseUniq; if (!panelsBase.TryGetValue(key, out panelBaseUniq)) { panelsBase.Add(key, panelBase); panelBaseUniq = panelBase; } panelMount.PanelBase = panelBaseUniq; } } return panelsBase; }
public DimensionFacade(BlockTableRecord btrPanel, Transaction t, PanelBase panel) : base(btrPanel, t, panel) { }
public DimensionAbstract(BlockTableRecord btrPanel, Transaction t, PanelBase panel) { this.btrPanel = btrPanel; this.t = t; this.panelBase = panel; }
private Dictionary <string, PanelBase> matchingPlans(List <FacadeMounting> facadesMounting, List <FloorArchitect> floorsAr) { // Определение окон в монтажных планах по архитектурным планам var panelsBase = new Dictionary <string, PanelBase>(); // string - ключ - маркаСБ + Марки Окон по порядку. // Список монтажных планов - уникальных var floorsMount = facadesMounting.SelectMany(f => f.Floors); foreach (var floorMount in floorsMount) { // Найти соотв арх план var floorAr = floorsAr.Find(f => f.Section == floorMount.Section && f.IsEqualMountingStorey(floorMount.Storey) ); //Test Добавить текст имени плана Ар в блок монтажного плана #if Test { if (floorAr != null) { using (var btrMount = floorMount.IdBtrMounting.Open(OpenMode.ForWrite) as BlockTableRecord) { DBText textFindPlanAr = new DBText(); textFindPlanAr.TextString = floorAr.BlName; btrMount.AppendEntity(textFindPlanAr); //btrMount.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(textFindPlanAr, true); } } } #endif if (floorAr == null) { Inspector.AddError($"Не найден блок архитектурного плана для соответствующего монтажного плана '{floorMount.BlRefName}'", floorMount.IdBlRefMounting, icon: System.Drawing.SystemIcons.Error); } else if (floorAr.Windows.Count == 0) { Inspector.AddError($"Не найдено ни одного окна в блоке архитектурного плана '{floorMount.BlRefName}'.", floorAr.IdBlRef, icon: System.Drawing.SystemIcons.Error); } foreach (var panelMount in floorMount.PanelsSbInFront) { Panel panelXml = GetPanelXml(panelMount.MarkSb, panelMount); if (panelXml == null) { continue; } PanelBase panelBase = new PanelBase(panelXml, this, panelMount); // Определение окон в панели по арх плану if (panelXml.windows?.window != null) { foreach (var window in panelXml.windows.window) { if (floorAr == null || floorAr.Windows.Count == 0) { break; } // Точка окна внутри панели по XML описанию Point3d ptOpeningCenter = new Point3d(window.posi.X + window.width * 0.5, 0, 0); // Точка окна внутри монтажного плана Point3d ptWindInModel = panelMount.ExtTransToModel.MinPoint.Add(ptOpeningCenter.GetAsVector()); Point3d ptWindInArPlan = ptWindInModel.TransformBy(floorMount.Transform.Inverse()); var windowKey = floorAr?.Windows.GroupBy(w => w.Key.DistanceTo(ptWindInArPlan))?.MinBy(w => w.Key); if (windowKey == null || windowKey.Key > 600) { Inspector.AddError( $"Не найдено соответствующее окно в архитектурном плане. Блок монтажной панели {panelMount.MarkSb}", panelMount.ExtTransToModel, panelMount.IdBlRef, icon: System.Drawing.SystemIcons.Error); continue; } panelBase.WindowsBaseCenters.Add(ptOpeningCenter, windowKey.First().Value); // Test Добавление точек окна в блоке монтажки #if Test { using (var btrMountPlan = floorMount.IdBtrMounting.Open(OpenMode.ForWrite) as BlockTableRecord) { using (DBPoint ptWinInPlan = new DBPoint(ptWindInArPlan)) { ptWinInPlan.ColorIndex = 2; btrMountPlan.AppendEntity(ptWinInPlan); //btrMountPlan.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(ptWinInPlan, true); } using (DBText dbText = new DBText()) { dbText.Position = ptWindInArPlan; dbText.TextString = windowKey.First().Value; btrMountPlan.AppendEntity(dbText); //btrMountPlan.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(dbText, true); } } using (var btrArPlan = floorAr.IdBtr.Open(OpenMode.ForWrite) as BlockTableRecord) { using (DBPoint ptWinInArPlan = new DBPoint(ptWindInArPlan)) { ptWinInArPlan.ColorIndex = 1; btrArPlan.AppendEntity(ptWinInArPlan); //btrArPlan.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(ptWinInArPlan, true); } } } #endif } } // Уникальный ключ панели - МаркаСБ + Марки окон string key = panelBase.MarkWithoutElectric; if (panelBase.WindowsBaseCenters.Count > 0) { string windowMarks = string.Join(";", panelBase.WindowsBaseCenters.Values); key += windowMarks; } PanelBase panelBaseUniq; if (!panelsBase.TryGetValue(key, out panelBaseUniq)) { panelsBase.Add(key, panelBase); panelBaseUniq = panelBase; } panelMount.PanelBase = panelBaseUniq; } } return(panelsBase); }