/// <summary> /// Вставка блока в чертеж - интерактивная (BlockInsertJig) /// </summary> public static ObjectId Insert(string blName, LayerInfo?layer, List <Property>?props, bool explode = false) { var doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) { return(ObjectId.Null); } var db = doc.Database; var ed = doc.Editor; using var @lock = doc.LockDocument(); using var t = db.TransactionManager.StartTransaction(); var bt = (BlockTable)t.GetObject(db.BlockTableId, OpenMode.ForRead); if (!bt.Has(blName)) { throw new Exception("Блок не определен в чертеже " + blName); } var idBlBtr = bt[blName]; var pt = Point3d.Origin; var br = new BlockReference(pt, idBlBtr); br.SetDatabaseDefaults(); if (layer != null) { layer.CheckLayerState(); br.Layer = layer.Name; } var spaceBtr = (BlockTableRecord)t.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); var idBlRefInsert = spaceBtr.AppendEntity(br); t.AddNewlyCreatedDBObject(br, true); if (props != null && br.IsDynamicBlock) { foreach (DynamicBlockReferenceProperty item in br.DynamicBlockReferencePropertyCollection) { var prop = props.FirstOrDefault(p => p.Name.Equals(item.PropertyName, StringComparison.OrdinalIgnoreCase)); if (prop != null) { try { item.Value = prop.Value; } catch (Exception ex) { Logger.Log.Error(ex, msg: $"Ошибка типа значения для дин параметра '{item.PropertyName}' " + $"при вставке блока '{blName}': тип устанавливаемого значение '{prop.Value.GetType()}', " + $"а должен быть тип '{item.UnitsType}'"); } } } } // jig var entJig = new Jigs.BlockInsertJig(br); var pr = ed.Drag(entJig); if (pr.Status == PromptStatus.OK) { var btrBl = (BlockTableRecord)t.GetObject(idBlBtr, OpenMode.ForRead); if (btrBl.HasAttributeDefinitions) { AddAttributes(br, btrBl, t); } if (explode) { var owner = br.BlockId.GetObject <BlockTableRecord>(OpenMode.ForWrite); using var explodes = new DBObjectCollection(); br.Explode(explodes); foreach (Entity ent in explodes) { owner.AppendEntity(ent); t.AddNewlyCreatedDBObject(ent, true); ent.Layer = br.Layer; } br.Erase(); } } else { br.Erase(); idBlRefInsert = ObjectId.Null; } t.Commit(); return(idBlRefInsert); }
/// <summary> /// Вставка блока в чертеж - интерактивная (BlockInsertJig) /// </summary> public static ObjectId Insert(string blName, Layers.LayerInfo layer, List<Property> props) { ObjectId idBlRefInsert = ObjectId.Null; Document doc = AcAp.DocumentManager.MdiActiveDocument; if (doc == null) return ObjectId.Null; Database db = doc.Database; Editor ed = doc.Editor; using (doc.LockDocument()) using (var t = db.TransactionManager.StartTransaction()) { var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; if (!bt.Has(blName)) { throw new Exception("Блок не определен в чертеже " + blName); } ObjectId idBlBtr = bt[blName]; Point3d pt = Point3d.Origin; BlockReference br = new BlockReference(pt, idBlBtr); br.SetDatabaseDefaults(); if (layer != null) { Layers.LayerExt.CheckLayerState(layer); br.Layer = layer.Name; } var spaceBtr = (BlockTableRecord)t.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); idBlRefInsert = spaceBtr.AppendEntity(br); t.AddNewlyCreatedDBObject(br, true); if (props != null && br.IsDynamicBlock) { foreach (DynamicBlockReferenceProperty item in br.DynamicBlockReferencePropertyCollection) { var prop = props.FirstOrDefault(p => p.Name.Equals(item.PropertyName, StringComparison.OrdinalIgnoreCase)); if (prop != null) { try { item.Value = prop.Value; } catch (Exception ex) { Logger.Log.Error(ex, $"Ошибка типа значения для дин параметра '{item.PropertyName}' " + $"при вставке блока '{blName}': тип устанавливаемого значение '{prop.Value.GetType()}', " + $"а должен быть тип '{item.UnitsType}'"); } } } } // jig Jigs.BlockInsertJig entJig = new Jigs.BlockInsertJig(br); var pr = ed.Drag(entJig); if (pr.Status == PromptStatus.OK) { var btrBl = t.GetObject(idBlBtr, OpenMode.ForRead) as BlockTableRecord; if (btrBl.HasAttributeDefinitions) AddAttributes(br, btrBl, t); } else { br.Erase(); idBlRefInsert = ObjectId.Null; } t.Commit(); } return idBlRefInsert; }