//something plobrem //文件的名称必须和块的名称一致 //不一致将会发生错误 //将图块写入到当前文档中 private bool WBlockBetweenDataBase(string BlockName) { Database SourceDB = new Database(false, true); ErrorStatus Stats = this.GetInsertDwgFile(ref SourceDB); Document Doc = AcadApp.DocumentManager.MdiActiveDocument; Database TargetDB = Doc.Database; ObjectIdCollection SourceIds = new ObjectIdCollection(); using (Transaction Tr = SourceDB.TransactionManager.StartTransaction()) { using (Transaction Tr2 = TargetDB.TransactionManager.StartTransaction()) { BlockTable SourceBt = (BlockTable)Tr.GetObject(SourceDB.BlockTableId, OpenMode.ForRead); if (SourceBt.Has(BlockName)) { SourceIds.Add(SourceBt[BlockName]); } Tr.Commit(); } } if (SourceIds.Count != 0) { IdMapping IdMap = new IdMapping(); TargetDB.WblockCloneObjects(SourceIds, TargetDB.BlockTableId, IdMap, DuplicateRecordCloning.Ignore, false); SourceDB.Dispose(); return(true); } else { SourceDB.Dispose(); return(false); } }
public override DBObject DeepClone(DBObject dbObject, DBObject ownerObject, IdMapping idMap, bool isPrimary) { DBObject res = base.DeepClone(dbObject, ownerObject, idMap, isPrimary); foreach (IdPair ip in idMap) { var oldid = ip.Key; var newid = ip.Value; if (DBSymbolFinder.Instance.ContainsKey(oldid)) { //PublicMethod.PasteSelectSymbol(oldid, newid); } } if (PipeDrawOverrule.PipeRadiusForObject(res) > 0.0) { Transaction tr = dbObject.Database.TransactionManager.StartTransaction(); using (tr) { PipeDrawOverrule.SetPipeRadiusOnObject(tr, res, 0.0); tr.Commit(); } } return(res); }
// Копирование стиля таблиц ПИК из файла шаблона private static ObjectId CopyObjectFromTemplate( Database db, Func <Database, string, ObjectId> getObjectId, string styleName, ObjectId ownerIdTable, string templateName) { var idStyleDest = ObjectId.Null; // файл шаблона var fileTemplate = Path.Combine(PikSettings.LocalSettingsFolder, "Template", UserGroup, templateName + ".dwt"); if (File.Exists(fileTemplate)) { using var dbTemplate = new Database(false, true); dbTemplate.ReadDwgFile(fileTemplate, FileOpenMode.OpenForReadAndAllShare, false, string.Empty); dbTemplate.CloseInput(true); var idStyleInTemplate = getObjectId(dbTemplate, styleName); if (!idStyleInTemplate.IsNull) { using var map = new IdMapping(); using var ids = new ObjectIdCollection(new[] { idStyleInTemplate }); using var lockDoc = Application.DocumentManager.MdiActiveDocument?.LockDocument(); db.WblockCloneObjects(ids, ownerIdTable, map, DuplicateRecordCloning.Replace, false); idStyleDest = map[idStyleInTemplate].Value; } } return(idStyleDest); }
cloneAndXformObjects(Database db, ObjectIdCollection entsToClone, ObjectId ownerBlockId, Matrix3d xformMat) { try { using (Transaction tr = BaseObjs.startTransactionDb()) { IdMapping idMap = new IdMapping(); db.DeepCloneObjects(entsToClone, ownerBlockId, idMap, false); // walk through all the cloned objects and Xform any of the entities foreach (IdPair idpair in idMap) { if (idpair.IsCloned) { DBObject clonedObj = tr.GetObject(idpair.Value, OpenMode.ForWrite); Entity clonedEnt = clonedObj as Entity; if (clonedEnt != null) { clonedEnt.TransformBy(xformMat); } } } tr.Commit(); } } catch (System.Exception ex) { BaseObjs.writeDebug(ex.Message + " Db.cs: line: 46"); } }
public override DBObject DeepClone( DBObject dbObject, DBObject ownerObject, IdMapping idMap, bool isPrimary ) { // First we deep clone the object via the parent DBObject res = base.DeepClone(dbObject, ownerObject, idMap, isPrimary); // Then we check for our XData if (PipeDrawOverrule.PipeRadiusForObject(res) > 0.0) { // A transaction is needed by the set function to access // the RegApp table - we could also assume the app name // is registered and have a separate implementation // not taking the transaction... // Just as we might also have chosen to remove the XData Transaction tr = dbObject.Database.TransactionManager.StartTransaction(); using (tr) { PipeDrawOverrule.SetPipeRadiusOnObject(tr, res, 0.0); tr.Commit(); } } return(res); }
public static void CopyBlockFromDwg(string blockName, string filePath, Database destinationDatabase) { using (Database sourceDatabase = new Database(false, true)) { sourceDatabase.ReadDwgFile(filePath, FileShare.ReadWrite, true, string.Empty); ObjectIdCollection ids = new ObjectIdCollection(); using (Transaction sourceTransaction = sourceDatabase.TransactionManager.StartTransaction()) { BlockTable blockTable = (BlockTable)sourceTransaction.GetObject(sourceDatabase.BlockTableId, OpenMode.ForRead); if (blockTable.Has(blockName)) { ids.Add(blockTable[blockName]); } sourceTransaction.Commit(); } if (ids.Count != 0) { IdMapping mapping = new IdMapping(); destinationDatabase.WblockCloneObjects(ids, destinationDatabase.BlockTableId, mapping, DuplicateRecordCloning.Ignore, false); } } }
public void SaveDrawingV3(List <Polyline3d> polyCollection, Autodesk.AutoCAD.DatabaseServices.Database sidedb) { var exfeaturelines = Commands.GetSurfaceEntityIDs(CivilApplicationManager.WorkingDatabase); ObjectIdCollection exfeatures = new ObjectIdCollection(exfeaturelines.ToArray()); using (Autodesk.AutoCAD.DatabaseServices.Database db = sidedb) { using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable acBlkTbl; // Open the Block table for read acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; // Open the Block table record Model space for write BlockTableRecord acBlkTblRec; acBlkTblRec = tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; IdMapping oIdMap = new IdMapping(); db.WblockCloneObjects( exfeatures, acBlkTblRec.ObjectId, oIdMap, DuplicateRecordCloning.Ignore, false); tr.Commit(); } db.SaveAs(Commands._drawingName, DwgVersion.Current); } }
private void backupChangedPanels(List <PanelAkrFacade> panelsToSave, List <PanelAKR> panelsAkrInLib, Database dbLib) { // сохранение изменяемых панель в файл // создание новоq базы и копирование туда блоков изменяемемых панелей (до изменения) ObjectIdCollection idsBtrToCopy = new ObjectIdCollection(); foreach (var panelFacadeTosave in panelsToSave) { PanelAKR panelLib = panelsAkrInLib.Find( p => string.Equals(p.BlName, panelFacadeTosave.BlName, StringComparison.OrdinalIgnoreCase)); if (panelLib != null) { idsBtrToCopy.Add(panelLib.IdBtrAkrPanel); } } if (idsBtrToCopy.Count > 0) { string newFile = getBackupPanelsLibFile(LibPanelsFilePath); using (var dbBak = new Database(true, true)) { dbBak.CloseInput(true); using (IdMapping map = new IdMapping()) { dbLib.WblockCloneObjects(idsBtrToCopy, dbBak.BlockTableId, map, DuplicateRecordCloning.Replace, false); dbBak.SaveAs(newFile, DwgVersion.Current); } } } }
private static ObjectId ImportMissedRecord(SymbolTable srcTable, string key, SymbolTable destTable) { if (string.IsNullOrEmpty(key)) { throw new ArgumentNullException("ImportMissedRecord(" + srcTable.GetType().Name + ".key)"); } if (destTable.Has(key)) // It is not missed { return(destTable[key]); } if (!srcTable.Has(key)) { throw new KeyNotFoundException("'" + key + "' not found in " + srcTable.GetType().Name); } Ac.WriteLn("Updating " + destTable.GetType().Name + "... "); // Updating BlockTable... using (var mapping = new IdMapping()) using (var sourceIds = new ObjectIdCollection()) { sourceIds.Add(srcTable[key]); srcTable.Database.WblockCloneObjects(sourceIds, destTable.ObjectId, mapping, DuplicateRecordCloning.Ignore, false); Ac.Write(string.Format("'{0}' added.", key)); // G7-FixedPoint added. return(destTable[key]); } }
public void Getlayer() { string dir = null; System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog(); if (dialog.ShowDialog() == DialogResult.OK) { string foldPath = dialog.SelectedPath; dir = foldPath; } if (dir == null) { return; } Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = db.TransactionManager; List <string> layersName = LayersToList(db); TransactionControl(() => { foreach (var layerName in layersName) { TypedValue[] filterlist = new TypedValue[1]; filterlist[0] = new TypedValue(8, layerName); SelectionFilter filter = new SelectionFilter(filterlist); PromptSelectionResult selRes = ed.SelectAll(filter); if (selRes.Status != PromptStatus.OK) { ed.WriteMessage( "\nerror in getting the selectAll"); return; } ObjectId[] ids = selRes.Value.GetObjectIds(); ObjectIdCollection sourceIds = new ObjectIdCollection(); foreach (var id in ids) { Entity entity = (Entity)tm.GetObject(id, OpenMode.ForRead, true); sourceIds.Add(id); } Database destDb = new Database(true, true); ObjectId sourceMsId = SymbolUtilityServices.GetBlockModelSpaceId(db); ObjectId destDbMsId = SymbolUtilityServices.GetBlockModelSpaceId(destDb); IdMapping mapping = new IdMapping(); db.WblockCloneObjects(sourceIds, destDbMsId, mapping, DuplicateRecordCloning.Replace, false); destDb.SaveAs(dir + "\\" + layerName + ".dwg", DwgVersion.Current); } }); }
public BlockReference createAnonymousBlock(BlockTable bt, List <Entity> entities, BlockTableRecord spaceRecord, Transaction tr, Database db) { BlockTableRecord btr = new BlockTableRecord(); spaceRecord.UpgradeOpen(); ObjectId btrId = bt.Add(btr); tr.AddNewlyCreatedDBObject(btr, true); ObjectIdCollection obIdCol = new ObjectIdCollection(); foreach (Entity ent in entities) { //ent.TransformBy(matrix); obIdCol.Add(ent.ObjectId); } IdMapping mapping = new IdMapping(); db.DeepCloneObjects(obIdCol, btrId, mapping, false); BlockReference bref = new BlockReference(Point3d.Origin, btrId); spaceRecord.AppendEntity(bref); tr.AddNewlyCreatedDBObject(bref, true); spaceRecord.DowngradeOpen(); foreach (Entity ent in entities) { ent.Erase(); } return(bref); }
public static List <string> ImportBlocks(Database db, Database sourceDb, List <string> blockNames) { List <string> output = new List <string>(); try { //create a variable to store the list of block identifiers ObjectIdCollection blockIds = new ObjectIdCollection(); Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = sourceDb.TransactionManager; using (Transaction tr = tm.StartTransaction()) { //open the block table BlockTable bt = tm.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false) as BlockTable; //check each block in the block table foreach (ObjectId btrId in bt) { BlockTableRecord btr = tm.GetObject(btrId, OpenMode.ForRead, false) as BlockTableRecord; //only add named & non-layout blocks to the copy list if (blockNames.Contains(btr.Name)) { blockIds.Add(btrId); output.Add(btr.Name); } btr.Dispose(); } } //copy blocks from source to destination database IdMapping mapping = new IdMapping(); sourceDb.WblockCloneObjects(blockIds, db.BlockTableId, mapping, DuplicateRecordCloning.Ignore, false); } catch { } return(output); }
private static void copyFlat(string fileFlat, ObjectId idBt) { using (var dbFlat = new Database(false, true)) { dbFlat.ReadDwgFile(fileFlat, FileOpenMode.OpenForReadAndAllShare, false, ""); dbFlat.CloseInput(true); using (var bt = dbFlat.BlockTableId.Open(OpenMode.ForRead) as BlockTable) { foreach (var idBtr in bt) { using (var btr = idBtr.Open(OpenMode.ForRead) as BlockTableRecord) { if (Revit.Apartment.IsBlockNameApartment(btr.Name)) { using (var map = new IdMapping()) { ObjectIdCollection ids = new ObjectIdCollection(new[] { idBtr }); dbFlat.WblockCloneObjects(ids, idBt, map, DuplicateRecordCloning.Ignore, false); } return; } } } } } }
/// <summary> /// Клонирование листа. /// Должна быть открыта транзакция!!! /// </summary> /// <param name="db">База в которой это производится. Должна быть WorkingDatabase</param> /// <param name="existLayoutName">Имя существующего листа, с которого будет клонироваться новый лист. /// Должен существовать в чертеже.</param> /// <param name="newLayoutName">Имя для нового листа.</param> /// <returns>ObjectId нового листа</returns> public static ObjectId CloneLayout([NotNull] Database db, string existLayoutName, string newLayoutName) { ObjectId newLayoutId; ObjectId existLayoutId; using (new WorkingDatabaseSwitcher(db)) { var lm = LayoutManager.Current; newLayoutId = lm.CreateLayout(newLayoutName); existLayoutId = lm.GetLayoutId(existLayoutName); } var objIdCol = new ObjectIdCollection(); ObjectId idBtrNewLayout; using (var newLayout = (Layout)newLayoutId.GetObject(OpenMode.ForWrite)) { var curLayout = (Layout)existLayoutId.GetObject(OpenMode.ForRead); newLayout.CopyFrom(curLayout); idBtrNewLayout = newLayout.BlockTableRecordId; #pragma warning disable 618 using (var btrCurLayout = (BlockTableRecord)curLayout.BlockTableRecordId.Open(OpenMode.ForRead)) #pragma warning restore 618 { foreach (var objId in btrCurLayout) { objIdCol.Add(objId); } } } var idMap = new IdMapping(); db.DeepCloneObjects(objIdCol, idBtrNewLayout, idMap, false); return(newLayoutId); }
public void Map(ClassMappingBase classMap, Member member) { if (!(classMap is ClassMapping)) { return; } var idMapping = new IdMapping { ContainingEntityType = classMap.Type }; idMapping.AddDefaultColumn(new ColumnMapping() { Name = member.Name }); idMapping.Name = member.Name; idMapping.Type = new TypeReference(member.PropertyType); idMapping.Member = member; idMapping.SetDefaultValue("Generator", GetDefaultGenerator(member)); if (member.IsProperty && !member.CanWrite) { idMapping.Access = cfg.GetAccessStrategyForReadOnlyProperty(member).ToString(); } ((ClassMapping)classMap).Id = idMapping; }
public void cmdImportBlockFromExternalDrawing() { var doc = AcApp.DocumentManager.MdiActiveDocument; var ed = doc.Editor; var db = doc.Database; var dlg = new Microsoft.Win32.OpenFileDialog(); dlg.ShowDialog(); var srcPath = dlg.FileName; var srcDb = new Database(); srcDb.ReadDwgFile(srcPath, FileOpenMode.OpenForReadAndReadShare, false, ""); var ids = new ObjectIdCollection(); using (var tr = srcDb.TransactionManager.StartTransaction()) { var bt = tr.GetObject(srcDb.BlockTableId, OpenMode.ForRead) as BlockTable; foreach (ObjectId id in bt) { var btr = tr.GetObject(id, OpenMode.ForRead) as BlockTableRecord; if (id != SymbolUtilityServices.GetBlockModelSpaceId(db) && //Block must have a Name !SymbolUtilityServices.IsBlockLayoutName(btr.Name)) { ids.Add(id); } } } var idmap = new IdMapping(); db.WblockCloneObjects(ids, db.BlockTableId, idmap, DuplicateRecordCloning.Ignore, false); }
public void CopyBlockTable(Database db, string filePath, Predicate <BlockTableRecord> predicate) { var aw = new AutoCadWrapper(); using (Database sourceDb = new Database(false, true)) { // Read the DWG into a side database sourceDb.ReadDwgFile(filePath, System.IO.FileShare.ReadWrite, true, ""); // Start transaction to read equipment aw.ExecuteActionOnBlockTable(sourceDb, bt => { // Create a variable to store the list of block identifiers ObjectIdCollection blockIds = new ObjectIdCollection(); foreach (var objectId in bt) { using (var btr = objectId.GetObject <BlockTableRecord>()) { // Only add named & non-layout blocks to the copy list and filter for specific item if (!btr.IsAnonymous && !btr.IsLayout && predicate(btr)) { blockIds.Add(objectId); } } } // Copy blocks from source to destination database IdMapping mapping = new IdMapping(); sourceDb.WblockCloneObjects(blockIds, db.BlockTableId, mapping, DuplicateRecordCloning.Replace, false); }); } }
/// <summary> /// Копирование объектов из внешней базы /// </summary> /// <param name="dbDest">База целевая</param> /// <param name="externalFile">Внешний файл</param> /// <param name="getOwnerId">Получение таблицы содержащей копируемые элементы</param> /// <param name="getCopyIds">Получение списка копируемых объектов из таблицы</param> /// <param name="mode">Режим копирования</param> public static List <ObjectId> Copy(this Database dbDest, string externalFile, DuplicateRecordCloning mode, Func <Database, ObjectId> getOwnerId, Func <ObjectId, List <ObjectId> > getCopyIds) { using (var dbSource = new Database(false, true)) { dbSource.ReadDwgFile(externalFile, FileOpenMode.OpenForReadAndAllShare, false, string.Empty); dbSource.CloseInput(true); List <ObjectId> idsSource; ObjectId ownerIdDest; using (var t = dbSource.TransactionManager.StartTransaction()) { var ownerIdSourse = getOwnerId(dbSource); ownerIdDest = getOwnerId(dbDest); idsSource = getCopyIds(ownerIdSourse); t.Commit(); } if (idsSource?.Any() != true) { return(new List <ObjectId>()); } using (var map = new IdMapping()) using (var ids = new ObjectIdCollection(idsSource.ToArray())) { dbDest.WblockCloneObjects(ids, ownerIdDest, map, mode, false); return(idsSource.Select(s => map[s].Value).ToList()); } } }
private void copyPanelToExportFile(Database dbExport) { Dictionary <ObjectId, PanelBlRefExport> dictPanelsToExport = new Dictionary <ObjectId, PanelBlRefExport>(); foreach (var panelBtr in CPS.PanelsBtrExport) { foreach (var panelBlref in panelBtr.Panels) { dictPanelsToExport.Add(panelBlref.IdBlRefAkr, panelBlref); } } ObjectIdCollection ids = new ObjectIdCollection(dictPanelsToExport.Keys.ToArray()); using (IdMapping map = new IdMapping()) { var msExport = SymbolUtilityServices.GetBlockModelSpaceId(dbExport); dbExport.WblockCloneObjects(ids, msExport, map, DuplicateRecordCloning.Replace, false); // скопированные блоки в экспортированном чертеже var idsBtrExport = new HashSet <ObjectId>(); foreach (var itemDict in dictPanelsToExport) { itemDict.Value.IdBlRefExport = map[itemDict.Key].Value; using (var blRef = itemDict.Value.IdBlRefExport.Open(OpenMode.ForRead, false, true) as BlockReference) { idsBtrExport.Add(blRef.BlockTableRecord); itemDict.Value.PanelBtrExport.IdBtrExport = blRef.BlockTableRecord; } } } }
private void AddToDB() { using (Database DB = new Database(false, true)) { DB.ReadDwgFile(path, FileShare.Read, false, ""); ObjectIdCollection ids = new ObjectIdCollection(); using (Transaction tr = DB.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(DB.BlockTableId, OpenMode.ForRead); if (bt.Has(BlockReplacement)) { ids.Add(bt[BlockReplacement]); } tr.Commit(); } if (ids.Count != 0) { foreach (DWG dwg in DWGs) { Database destdb = new Database(false, true); using (destdb) { destdb.ReadDwgFile(dwg.Path, FileShare.ReadWrite, false, ""); IdMapping iMap = new IdMapping(); destdb.WblockCloneObjects(ids, destdb.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false); destdb.SaveAs(dwg.Path, DwgVersion.Current); } } } } }
/// <summary> /// Копирует объекты из другого чертежа /// </summary> /// <param name="dbDest">Чертеж назначения</param> /// <param name="dbSrc">Чертеж источник</param> /// <param name="mode">Режим копирования</param> /// <param name="getOwnerId">Получение контейнера</param> /// <param name="getCopyIds">Объекты копирования</param> /// <returns>Скопированные объекты</returns> public static List <ObjectId> Copy(this Database dbDest, Database dbSrc, DuplicateRecordCloning mode, Func <Database, ObjectId> getOwnerId, Func <ObjectId, List <ObjectId> > getCopyIds) { List <ObjectId> idsSource; ObjectId ownerIdDest; using (var t = dbSrc.TransactionManager.StartTransaction()) { var ownerIdSourse = getOwnerId(dbSrc); ownerIdDest = getOwnerId(dbDest); idsSource = getCopyIds(ownerIdSourse); t.Commit(); } if (idsSource?.Any() != true) { return(new List <ObjectId>()); } using (var map = new IdMapping()) using (var ids = new ObjectIdCollection(idsSource.ToArray())) { dbDest.WblockCloneObjects(ids, ownerIdDest, map, mode, false); return(idsSource.Select(s => map[s].Value).ToList()); } }
private static void copyFlat(string fileFlat, ObjectId idBt) { using (var dbFlat = new Database(false, true)) { dbFlat.ReadDwgFile(fileFlat, FileOpenMode.OpenForReadAndAllShare, false, ""); dbFlat.CloseInput(true); using (var bt = dbFlat.BlockTableId.Open( OpenMode.ForRead) as BlockTable) { foreach (var idBtr in bt) { using (var btr = idBtr.Open( OpenMode.ForRead) as BlockTableRecord) { if (Revit.Apartment.IsBlockNameApartment(btr.Name)) { using (var map = new IdMapping()) { ObjectIdCollection ids = new ObjectIdCollection(new[] { idBtr }); dbFlat.WblockCloneObjects(ids, idBt, map, DuplicateRecordCloning.Ignore, false); } return; } } } } } }
/// <summary> /// 写块克隆对象 /// </summary> /// <param name="idCollection">对象ObjectId集合</param> /// <returns>克隆后的数据库</returns> public static Database WBClone(ObjectIdCollection idCollection) { //获取新数据库的块表id Database TargetDb = new Database(true, true); ObjectId objectId; using (Transaction trans = TargetDb.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)trans.GetObject(TargetDb.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead); objectId = btr.ObjectId; trans.Commit(); } //拷贝对象 var idsGroup = idCollection.ToList() .GroupBy(i => i.Database) .Select(i => new { i.Key, Value = i.ToList(), }).ToList(); foreach (var idg in idsGroup) { Database db = idg.Key; var idc = idg.Value.ToObjectIdCollection(); IdMapping Map = new IdMapping(); db.WblockCloneObjects(idc, objectId, Map, DuplicateRecordCloning.Replace, false); } return(TargetDb); }
CloneAndXformObjects(Database db, ObjectIdCollection entsToClone, ObjectId ownerBlockId, Matrix3d xformMat) { using (TransactionHelper trHlp = new TransactionHelper(db)) { trHlp.Start(); IdMapping idMap = new IdMapping(); db.DeepCloneObjects(entsToClone, ownerBlockId, idMap, false); // walk through all the cloned objects and Xform any of the entities foreach (IdPair idpair in idMap) { if (idpair.IsCloned) { DBObject clonedObj = trHlp.Transaction.GetObject(idpair.Value, OpenMode.ForWrite); Entity clonedEnt = clonedObj as Entity; if (clonedEnt != null) { clonedEnt.TransformBy(xformMat); } } } trHlp.Commit(); } }
public static void AddBlockToActiveDrawing(string blockDrawingFile, string blockName) { Database dbDest = Application.DocumentManager.MdiActiveDocument.Database; if (HasBlockDefinition(blockName, dbDest)) { return; } using (Database db = new Database(false, true)) { db.ReadDwgFile(blockDrawingFile, FileOpenMode.OpenForReadAndAllShare, false, null); ObjectIdCollection ids = new ObjectIdCollection(); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); //BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead); if (bt.Has(blockName)) { ObjectId id = bt[blockName]; BlockTableRecord btr = (BlockTableRecord)tr.GetObject(id, OpenMode.ForRead); ObjectIdCollection IdsCol = new ObjectIdCollection(); IdsCol.Add(id); IdMapping iMap = new IdMapping(); dbDest.WblockCloneObjects(IdsCol, dbDest.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false); } tr.Commit(); } } }
/// <summary> /// Realizá la carga del bloque /// </summary> /// <param name="tr">La transacción activa.</param> /// <param name="localDwg">La base de datos local.</param> /// <param name="file">La ruta del bloque a cargar.</param> /// <param name="blockName">El nombre del bloque.</param> public static void LoadBlock(this Transaction tr, Database localDwg, string file, string blockName) { BlockTable blkTab = (BlockTable)localDwg.BlockTableId.GetObject(OpenMode.ForRead); if (!blkTab.Has(blockName) && File.Exists(file)) { blkTab.UpgradeOpen(); BlockTableRecord newRecord = new BlockTableRecord(); newRecord.Name = blockName; blkTab.Add(newRecord); tr.AddNewlyCreatedDBObject(newRecord, true); //3: Se abre la base de datos externa Database externalDB = new Database(); externalDB.ReadDwgFile(file, FileShare.Read, true, null); //4: Con una subtransacción se clonán los elementos que esten contenidos en el espcio de modelo de la //base de datos externa ObjectIdCollection ids; using (Transaction subTr = externalDB.TransactionManager.StartTransaction()) { //4.1: Abrir el espacio de modelo de la base de datos externa ObjectId modelId = SymbolUtilityServices.GetBlockModelSpaceId(externalDB); BlockTableRecord model = subTr.GetObject(modelId, OpenMode.ForRead) as BlockTableRecord; //4.2: Se extraen y clonan los elementos mediante la clase IdMapping ids = new ObjectIdCollection(model.OfType <ObjectId>().ToArray()); using (IdMapping iMap = new IdMapping()) localDwg.WblockCloneObjects(ids, newRecord.Id, iMap, DuplicateRecordCloning.Replace, false); } } }
// Копирование новых панелей private void copyNewPanels(Database dbLib, List <PanelAkrFacade> panelsAkrToCopy) { var ids = new ObjectIdCollection(panelsAkrToCopy.Select(p => p.IdBtrAkrPanel).ToArray()); IdMapping iMap = new IdMapping(); dbLib.WblockCloneObjects(ids, dbLib.BlockTableId, iMap, DuplicateRecordCloning.Replace, false); }
/// <summary> /// Клонирование листа. /// Должна быть открыта транзакция!!! /// </summary> /// <param name="db">База в которой это производится. Должна быть WorkingDatabase</param> /// <param name="existLayoutName">Имя существующего листа, с которого будет клонироваться новый лист. /// Должен существовать в чертеже.</param> /// <param name="newLayoutName">Имя для нового листа.</param> /// <returns>ObjectId нового листа</returns> public static ObjectId CloneLayout(Database db, string existLayoutName, string newLayoutName) { ObjectId newLayoutId; ObjectId existLayoutId; using (WorkingDatabaseSwitcher sw = new WorkingDatabaseSwitcher(db)) { LayoutManager lm = LayoutManager.Current; newLayoutId = lm.CreateLayout(newLayoutName); existLayoutId = lm.GetLayoutId(existLayoutName); } ObjectIdCollection objIdCol = new ObjectIdCollection(); ObjectId idBtrNewLayout = ObjectId.Null; using (Layout newLayout = newLayoutId.GetObject(OpenMode.ForWrite) as Layout) { Layout curLayout = existLayoutId.GetObject(OpenMode.ForRead) as Layout; newLayout.CopyFrom(curLayout); idBtrNewLayout = newLayout.BlockTableRecordId; using (var btrCurLayout = curLayout.BlockTableRecordId.Open(OpenMode.ForRead) as BlockTableRecord) { foreach (ObjectId objId in btrCurLayout) { objIdCol.Add(objId); } } } IdMapping idMap = new IdMapping(); db.DeepCloneObjects(objIdCol, idBtrNewLayout, idMap, false); return newLayoutId; }
public override void ProcessId(IdMapping idMapping) { var conventions = finder.Find <IIdConvention>(); Apply <IIdentityInspector, IIdentityInstance>(conventions, new IdentityInstance(idMapping)); }
public static ObjectIdCollection CopyElements(Document resultDoc, ObjectIdCollection sourceObjectsIdColl, Database sourceDatabase, bool explode) { Database acDbNewDoc = resultDoc.Database; ObjectIdCollection collection = new ObjectIdCollection(); // Start a transaction in the new database using (Transaction acTrans = acDbNewDoc.TransactionManager.StartTransaction()) { // Open the Block table for read BlockTable acBlkTblNewDoc; acBlkTblNewDoc = acTrans.GetObject(acDbNewDoc.BlockTableId, OpenMode.ForRead) as BlockTable; // Open the Block table record Model space for read BlockTableRecord acBlkTblRecNewDoc; acBlkTblRecNewDoc = acTrans.GetObject(acBlkTblNewDoc[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord; // Clone the objects to the new database IdMapping acIdMap = new IdMapping(); sourceDatabase.WblockCloneObjects(sourceObjectsIdColl, acBlkTblRecNewDoc.ObjectId, acIdMap, DuplicateRecordCloning.Ignore, false); foreach (IdPair idPair in acIdMap) { collection.Add(idPair.Value); } // Save the copied objects to the database acTrans.Commit(); } return(collection); }
/// <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()); }
/// <summary> /// Копирование объекта в одной базе /// </summary> /// <param name="idEnt">Копируемый объект</param> /// <param name="idBtrOwner">Куда копировать (контейнер - BlockTableRecord)</param> public static ObjectId CopyEnt(this ObjectId idEnt, ObjectId idBtrOwner) { Database db = idEnt.Database; IdMapping map = new IdMapping(); ObjectIdCollection ids = new ObjectIdCollection(new[] { idEnt }); db.DeepCloneObjects(ids, idBtrOwner, map, false); return map[idEnt].Value; }
public static void CopyDict(Database dbDest) { // Копирование словаря АКР в базу var idDict = getDict(); if (idDict.IsNull) { throw new Exception("Словарь АКР в текущем чертеже не найден."); } var ids = new ObjectIdCollection(); ids.Add(idDict); var map = new IdMapping(); dbDest.WblockCloneObjects(ids, dbDest.NamedObjectsDictionaryId, map, DuplicateRecordCloning.Replace, false); }
public static ObjectId CopyEnt(ObjectId idEnt, ObjectId idBtrOwner) { Database destDb = idBtrOwner.Database; ObjectId resId = ObjectId.Null; using (IdMapping map = new IdMapping()) { using (var ids = new ObjectIdCollection(new ObjectId[] { idEnt })) { destDb.WblockCloneObjects(ids, destDb.BlockTableId, map, DuplicateRecordCloning.Ignore, false); resId = map[idEnt].Value; } } return resId; }
public void ChangeBlockFrame(Database db, bool insertDescription) { // Замена блока рамки если он есть в чертеже фасада if (IsOk) { using (IdMapping iMap = new IdMapping()) { var ids = new ObjectIdCollection(); ids.Add(_idBtrFrame); db.WblockCloneObjects(ids, db.BlockTableId, iMap, DuplicateRecordCloning.Replace, false); } // Запись атрибутов (Наименование, и другие если есть) changeBlkRefFrame(db, Settings.Default.BlockFrameName, insertDescription); } }
public void ChangeCoverAndTitle(Database db) { // Замена блоков обложки и титульного лисчта if (!IsOkCover && !IsOkTitle) { return; } var ids = new ObjectIdCollection(); if (IsOkCover) { ids.Add(IdCoverBtr); } if (IsOkTitle) { ids.Add(IdTitleBtr); } using (IdMapping iMap = new IdMapping()) { db.WblockCloneObjects(ids, db.BlockTableId, iMap, DuplicateRecordCloning.Replace, false); } }
///// <summary> ///// Копирование определенич блока из внешнего чертежа ///// </summary> ///// <param name="blName">Имя блока</param> ///// <param name="fileDrawing">Полный путь к чертежу из которого копируется блок</param> ///// <param name="destDb">База чертежа в который копируетсяя блок</param> ///// <exception cref="Exception">Если нет блока в файле fileDrawing.</exception> //public static void CopyBlockFromExternalDrawing(string blName, string fileDrawing, Database destDb) //{ // using (var extDb = new Database(false, true)) // { // extDb.ReadDwgFile(fileDrawing, System.IO.FileShare.ReadWrite, true, ""); // ObjectIdCollection ids = new ObjectIdCollection(); // using (var t = extDb.TransactionManager.StartTransaction()) // { // var bt = (BlockTable)t.GetObject(extDb.BlockTableId, OpenMode.ForRead); // if (bt.Has(blName)) // { // ids.Add(bt[blName]); // } // else // { // throw new Exception(string.Format("Не найдено определение блока {0} в файле {1}", blName, fileDrawing)); // } // t.Commit(); // } // // Если нашли – добавим блок // if (ids.Count != 0) // { // // Получаем текущую базу чертежа // IdMapping iMap = new IdMapping(); // destDb.WblockCloneObjects(ids, destDb.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false); // } // } //} /// <summary> /// Копирование определения блока и добавление его в таблицу блоков. /// </summary> /// <param name="idBtrSource">Копируемый блок</param> /// <param name="name">Имя для нового блока</param> /// <returns>ID скопированного блока, или существующего в чертеже с таким именем.</returns> public static ObjectId CopyBtr(ObjectId idBtrSource, string name) { ObjectId idBtrCopy = ObjectId.Null; Database db = idBtrSource.Database; ObjectIdCollection ids = new ObjectIdCollection (); using (var btrSource = idBtrSource.Open(OpenMode.ForRead) as BlockTableRecord) { using (var bt = db.BlockTableId.Open( OpenMode.ForRead) as BlockTable) { //проверка имени блока if (bt.Has(name)) { idBtrCopy = bt[name]; } else { using (var btrCopy = btrSource.Clone() as BlockTableRecord) { btrCopy.Name = name; bt.UpgradeOpen(); idBtrCopy = bt.Add(btrCopy); // Объекты в блоке для копирования foreach (ObjectId idEnt in btrSource) { ids.Add(idEnt); } } } } } if (ids.Count>0) { // Копирование объектов блока IdMapping map = new IdMapping(); db.DeepCloneObjects(ids, idBtrCopy, map, false); } return idBtrCopy; }
private void createBlock() { // создание определения блока using (var bt = CPS.DbExport.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable) { IdBtrEnd = getIdBtrEnd(bt); } // для каждой панели - копирование объектв торца с преобразование в координаты модели // список копируемых объектов торуа с привязкой к объекту блока панели для дальнейшего перемещения объектов в 0,0 в блоке торца foreach (var panelBlRef in itemLefEndsByY) { Dictionary<ObjectId, PanelBlRefExport> dictIdsEndEnts = new Dictionary<ObjectId, PanelBlRefExport>(); if (isLeftSide) { panelBlRef.PanelBtrExport.IdsEndsLeftEntity.ForEach(e => dictIdsEndEnts.Add(e, panelBlRef)); } else { panelBlRef.PanelBtrExport.IdsEndsRightEntity.ForEach(e => dictIdsEndEnts.Add(e, panelBlRef)); } ObjectIdCollection ids = new ObjectIdCollection(dictIdsEndEnts.Keys.ToArray()); using (IdMapping mapping = new IdMapping()) { CPS.DbExport.DeepCloneObjects(ids, IdBtrEnd, mapping, false); //перемещение объектов в блоке var moveMatrix = Matrix3d.Displacement(new Vector3d(0, panelBlRef.Position.Y - Position.Y, 0)); foreach (ObjectId id in ids) { var ent = mapping[id].Value.GetObject(OpenMode.ForWrite, false, true) as Entity; ent.TransformBy(moveMatrix); } } } // перемещение вех объектов торца в 0 var btr = IdBtrEnd.GetObject(OpenMode.ForRead) as BlockTableRecord; Extents3d extFull = new Extents3d(); extFull.AddBlockExtents(btr); foreach (ObjectId idEnt in btr) { using (var ent = idEnt.GetObject(OpenMode.ForWrite, false, true) as Entity) { ent.TransformBy(Matrix3d.Displacement(new Vector3d(-extFull.MinPoint.X, 0, 0))); } } ////сопоставление скопированных объектов с панелями //Dictionary<ObjectId, PanelBlRefExport> dictIdsCopyedEndEnts = new Dictionary<ObjectId, PanelBlRefExport>(); //foreach (IdPair itemIdMap in mapping) //{ // var panelBlRef = dictIdsEndEnts[itemIdMap.Key]; // dictIdsCopyedEndEnts.Add(itemIdMap.Key, panelBlRef); //} //// удаление выбранных объектов //foreach (ObjectId idEnt in ids) //{ // var ent = t.GetObject(idEnt, OpenMode.ForWrite, false, true) as Entity; // ent.Erase(); //} // вставка блока if (!IsExistsBlockEnd) { using (var blRef = new BlockReference(Position, IdBtrEnd)) { blRef.SetDatabaseDefaults(CPS.DbExport); using (var ms = SymbolUtilityServices.GetBlockModelSpaceId(CPS.DbExport).GetObject(OpenMode.ForWrite) as BlockTableRecord) { ms.AppendEntity(blRef); ms.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(blRef, true); } } } }
public void ImportBlocks() { AcadApp.DocumentCollection dm = AcadApp.Application.DocumentManager; Editor ed = dm.MdiActiveDocument.Editor; Database destDb = dm.MdiActiveDocument.Database; Database sourceDb = new Database(false, true); PromptResult sourceFileName; try { //从命令行要求用户输入以得到要导入的块所在的源DWG文件的名字 sourceFileName = ed.GetString("\nEnter the name of the source drawing: "); //把源DWG读入辅助数据库 sourceDb.ReadDwgFile(sourceFileName.StringResult, System.IO.FileShare.Write, true, ""); //用集合变量来存储块ID的列表 ObjectIdCollection blockIds = new ObjectIdCollection(); Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = sourceDb.TransactionManager; using (Transaction myT = tm.StartTransaction()) { //打开块表 BlockTable bt = (BlockTable)tm.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false); //在块表中检查每个块 foreach (ObjectId btrId in bt) { BlockTableRecord btr = (BlockTableRecord)tm.GetObject(btrId, OpenMode.ForRead, false); //只添加有名块和非layout块(layout块是非MS和非PS的块) if (!btr.IsAnonymous && !btr.IsLayout) blockIds.Add(btrId); btr.Dispose(); //释放块表记录引用变量所占用的资源 } bt.Dispose();//释放块表引用变量所占用的资源 //没有作改变,不需要提交事务 myT.Dispose(); } IdMapping mapping = new IdMapping(); mapping = sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, DuplicateRecordCloning.Replace, false); ed.WriteMessage("\nCopied " + blockIds.Count.ToString() + " block definitions from " + sourceFileName.StringResult + " to the current drawing."); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { ed.WriteMessage("\nError during copy: " + ex.Message); } sourceDb.Dispose(); }
/// <summary> /// Копирование определения блока и добавление его в таблицу блоков. /// </summary> /// <param name="idBtrSource">Копируемый блок</param> /// <param name="name">Имя для нового блока</param> /// <returns>ID скопированного блока, или существующего в чертеже с таким именем.</returns> public static ObjectId CopyBtr(ObjectId idBtrSource, string name) { ObjectId idBtrCopy = ObjectId.Null; Database db = idBtrSource.Database; using (var t = db.TransactionManager.StartTransaction()) { var btrSource = t.GetObject(idBtrSource, OpenMode.ForRead) as BlockTableRecord; var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //проверка имени блока if (bt.Has(name)) { idBtrCopy = bt[name]; } else { var btrCopy = btrSource.Clone() as BlockTableRecord; btrCopy.Name = name; bt.UpgradeOpen(); idBtrCopy = bt.Add(btrCopy); t.AddNewlyCreatedDBObject(btrCopy, true); // Копирование объектов блока ObjectIdCollection ids = new ObjectIdCollection(); foreach (ObjectId idEnt in btrSource) { ids.Add(idEnt); } IdMapping map = new IdMapping(); db.DeepCloneObjects(ids, idBtrCopy, map, false); } t.Commit(); } return idBtrCopy; }
public static void ImportBlocks() { using (DocumentLock docLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument()) { DocumentCollection dm = Application.DocumentManager; Editor ed = dm.MdiActiveDocument.Editor; Database destDb = dm.MdiActiveDocument.Database; Database sourceDb = new Database(false, true); try { // Read the DWG into a side database #if DEBUG sourceDb.ReadDwgFile("../../88.dwg", System.IO.FileShare.Read, true,""); #else sourceDb.ReadDwgFile("./Resource/88.dwg", System.IO.FileShare.Read, true, ""); #endif // Create a variable to store the list of block identifiers ObjectIdCollection blockIds = new ObjectIdCollection(); Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = sourceDb.TransactionManager; using (Transaction myT = tm.StartTransaction()) { // Open the block table BlockTable bt = (BlockTable)tm.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false); // Check each block in the block table foreach (ObjectId btrId in bt) { BlockTableRecord btr = (BlockTableRecord)tm.GetObject(btrId, OpenMode.ForRead, false); // Only add named & non-layout blocks to the copy list if (!btr.IsAnonymous && !btr.IsLayout) blockIds.Add(btrId); btr.Dispose(); } } // Copy blocks from source to destination database IdMapping mapping = new IdMapping(); sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { ed.WriteMessage("\nError during copy: " + ex.Message); } sourceDb.Dispose(); } }
public DBObject DeepClone(DBObject ownerPointer, IdMapping idMap, bool isPrimary) { createInstance(); DBObject DeepC = BaseDBObject.DeepClone(ownerPointer, idMap, isPrimary); tr.Dispose(); return DeepC; }
// создаение блока монтажки private void createBlock(List<ObjectId> idsFloor, string floorBlockName) { Point3d location = getPoint($"Точка вставки блока {_planTypeName} плана {floorBlockName}").TransformBy(_ed.CurrentUserCoordinateSystem); using (var t = _db.TransactionManager.StartTransaction()) { var bt = t.GetObject(_db.BlockTableId, OpenMode.ForWrite) as BlockTable; ObjectId idBtr; BlockTableRecord btr; // создание определения блока using (btr = new BlockTableRecord()) { btr.Name = floorBlockName; idBtr = bt.Add(btr); t.AddNewlyCreatedDBObject(btr, true); } // копирование выбранных объектов в блок ObjectIdCollection ids = new ObjectIdCollection(idsFloor.ToArray()); using (IdMapping mapping = new IdMapping()) { _db.DeepCloneObjects(ids, idBtr, mapping, false); } // перемещение объектов в блоке btr = t.GetObject(idBtr, OpenMode.ForRead) as BlockTableRecord; var moveMatrix = Matrix3d.Displacement(Point3d.Origin - location); foreach (ObjectId idEnt in btr) { var ent = t.GetObject(idEnt, OpenMode.ForWrite, false, true) as Entity; ent.TransformBy(moveMatrix); } // удаление выбранных объектов foreach (ObjectId idEnt in ids) { var ent = t.GetObject(idEnt, OpenMode.ForWrite, false, true) as Entity; ent.Erase(); } // вставка блока using (var blRef = new BlockReference(location, idBtr)) { blRef.SetDatabaseDefaults(_db); var ms = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; ms.AppendEntity(blRef); t.AddNewlyCreatedDBObject(blRef, true); } t.Commit(); } }
// Вставка ячейки покраски (пока = одной плитке) private void insertSpot(Spot spot, int x, int y, Transaction t) { Point3d position; if (_colorAreaSize.PatternChess) { double offset = 0; if (y % 2 == 0) { offset = _colorAreaSize.LenghtSpot * 0.5; } position = new Point3d(_colorAreaSize.ExtentsColorArea.MinPoint.X + x * _colorAreaSize.LenghtSpot + offset, _colorAreaSize.ExtentsColorArea.MinPoint.Y + y * _colorAreaSize.HeightSpot, 0); } else { position = new Point3d(_colorAreaSize.ExtentsColorArea.MinPoint.X + x * _colorAreaSize.LenghtSpot, _colorAreaSize.ExtentsColorArea.MinPoint.Y + y * _colorAreaSize.HeightSpot, 0); } using (IdMapping map = new IdMapping()) { _db.DeepCloneObjects(_idColCopy, _idMS, map, false); ObjectId idBlRefCopy = map[_idBlRefColorAreaTemplate].Value; if (idBlRefCopy.IsValid && !idBlRefCopy.IsNull) { using (var blRefSpot = t.GetObject(idBlRefCopy, OpenMode.ForWrite, false, true) as BlockReference) { blRefSpot.Position = position; blRefSpot.LayerId = spot.Proper.IdLayer; spot.IdBlRef = blRefSpot.Id; _countInsertBlocksSpot++; } } } }
private static void copyItem(ColorArea item, ObjectIdCollection idColToCopy, ObjectId idBtrOwner, Transaction t) { using (IdMapping map = new IdMapping()) { Db.DeepCloneObjects(idColToCopy, idBtrOwner, map, false); ObjectId idBlRefCopy = map[idColToCopy[0]].Value; if (idBlRefCopy.IsValid && !idBlRefCopy.IsNull) { using (var blRefCopy = t.GetObject(idBlRefCopy, OpenMode.ForWrite, false, true) as BlockReference) { blRefCopy.Position = new Point3d(Base.X + item.Pos.X, Base.Y + item.Pos.Y, 0); blRefCopy.Layer = item.EntInfo.Layer; } } } }
private void CopyBlockDefinition(ObjectIdCollection blocksIds) { IdMapping mapping = new IdMapping(); sourceDB.WblockCloneObjects(blocksIds, currentdestDB.BlockTableId, mapping, DuplicateRecordCloning.Replace, false); }
// Копирование стиля таблиц ПИК из файла шаблона private static ObjectId copyObjectFromTemplate(Database db, Func<Database, string, ObjectId> getObjectId, string styleName, ObjectId ownerIdTable) { ObjectId idStyleDest = ObjectId.Null; // файл шаблона var userGroup = PikSettings.UserGroupsCombined.First(); string fileTemplate = Path.Combine(PikSettings.LocalSettingsFolder, "Template", userGroup, userGroup + ".dwt"); if (File.Exists(fileTemplate)) { using (Database dbTemplate = new Database(false, true)) { dbTemplate.ReadDwgFile(fileTemplate, FileOpenMode.OpenForReadAndAllShare, false, ""); dbTemplate.CloseInput(true); ObjectId idStyleInTemplate = getObjectId(dbTemplate, styleName); if (!idStyleInTemplate.IsNull) { using (IdMapping map = new IdMapping()) { using (var ids = (new ObjectIdCollection(new ObjectId[] { idStyleInTemplate }))) { db.WblockCloneObjects(ids, ownerIdTable, map, DuplicateRecordCloning.Replace, false); idStyleDest = map[idStyleInTemplate].Value; } } } } } return idStyleDest; }
private static int renameAndRedefBlocksInDb(List<RedefineBlock> blocksRedefine, List<RedefineBlock> renameBlocks, FileInfo file, int countFilesRedefined, List<Error> errors, Database dbExt) { // Переименование блоков в этом файле var renameErrors = RenameBlocks(dbExt, renameBlocks); errors.AddRange(renameErrors); if (blocksRedefine != null && blocksRedefine.Count > 0) { List<RedefineBlock> redefBlockInThisDb = new List<RedefineBlock>(); using (var bt = dbExt.BlockTableId.Open(OpenMode.ForRead) as BlockTable) { foreach (var item in blocksRedefine) { if (bt.Has(item.Name)) { redefBlockInThisDb.Add(item); } else { errors.Add(new Error($"Нет блока '{item.Name}' в чертеже {file.Name}", System.Drawing.SystemIcons.Warning)); //Inspector.AddError($"Нет блока '{item.Name}' в чертеже {file.Name}", // System.Drawing.SystemIcons.Warning); } } } using (var map = new IdMapping()) { var ids = new ObjectIdCollection(redefBlockInThisDb.Select(b => b.IdBtr).ToArray()); // Копирование блока с переопредедлением. dbExt.WblockCloneObjects(ids, dbExt.BlockTableId, map, DuplicateRecordCloning.Replace, false); //ed.WriteMessage("\n" + file.FullName + " - ок."); countFilesRedefined++; // Обновление анонимных блоков для дин блоков using (var t = dbExt.TransactionManager.StartTransaction()) { foreach (ObjectId id in ids) { var btr = map[id].Value.GetObject(OpenMode.ForRead) as BlockTableRecord; if (btr == null || !btr.IsDynamicBlock) continue; btr.UpdateAnonymousBlocks(); } // Изменение точки вставки блока foreach (var redefBl in redefBlockInThisDb) { if (redefBl.IsChangeBasePoint) { redefBl.ChangeBasePointInRedefineBase(dbExt, map[redefBl.IdBtr].Value); } } t.Commit(); } foreach (var item in redefBlockInThisDb) { errors.Add(new Error($"Переопределен блок '{item.Name}' в чертеже {file.Name}", System.Drawing.SystemIcons.Information)); //Inspector.AddError($"Переопределен блок '{item.Name}' в чертеже {file.Name}", // System.Drawing.SystemIcons.Information); } } } return countFilesRedefined; }
public DBObject WblockClone(RXObject ownerPointer, IdMapping idMap, bool isPrimary) { createInstance(); DBObject WblockC = BaseDBObject.WblockClone(ownerPointer,idMap,isPrimary); tr.Dispose(); return WblockC; }
public virtual void SwapReferences(IdMapping idMap) { createInstance(); BaseDBObject.SwapReferences(idMap); tr.Dispose(); }
private void CopyEtalonStyle(ObjectIdCollection col) { IdMapping acIdMap = new IdMapping(); using (Transaction t = targetDB.TransactionManager.StartTransaction()) { DimStyleTable tst = (DimStyleTable)t.GetObject(targetDB.DimStyleTableId, OpenMode.ForRead); // ObjectIdCollection col = new ObjectIdCollection(); // col.Add(pikStyle.ObjectId); targetDB.WblockCloneObjects(col, tst.Id, acIdMap, DuplicateRecordCloning.Replace, false); t.Commit(); } }
/// <summary> /// Копирование определенич блока из внешнего чертежа /// </summary> /// <param name="blNames">Имена блоков</param> /// <param name="fileDrawing">Полный путь к чертежу из которого копируется блок</param> /// <param name="destDb">База чертежа в который копируетсяя блок</param> /// <exception cref="Exception">Если нет блока в файле fileDrawing.</exception> /// <returns>Список пар значений имени блока и idBtr</returns> public static Dictionary<string, ObjectId> CopyBlockFromExternalDrawing(IList<string> blNames, string fileDrawing, Database destDb, DuplicateRecordCloning mode = DuplicateRecordCloning.Ignore) { var resVal = new Dictionary<string, ObjectId>(); var uniqBlNames = blNames.Distinct(StringComparer.OrdinalIgnoreCase); using (var extDb = new Database(false, true)) { extDb.ReadDwgFile(fileDrawing, System.IO.FileShare.ReadWrite, true, ""); extDb.CloseInput(true); var valToCopy = new Dictionary<ObjectId, string>(); using (var bt = (BlockTable)extDb.BlockTableId.Open(OpenMode.ForRead)) { foreach (var blName in uniqBlNames) { ObjectId id; if (bt.Has(blName)) { id = bt[blName]; valToCopy.Add(id, blName); } } } // Копир if (valToCopy.Count > 0) { // Получаем текущую базу чертежа using (IdMapping map = new IdMapping()) { using (var ids = new ObjectIdCollection(valToCopy.Keys.ToArray())) { destDb.WblockCloneObjects(ids, destDb.BlockTableId, map, mode, false); foreach (var item in valToCopy) { resVal.Add(item.Value, map[item.Key].Value); } } } } } // Если задан режим переопределения - то перерисовка геометрии динамических блоков if (mode == DuplicateRecordCloning.Replace) { using (var t = destDb.TransactionManager.StartTransaction()) { var bt = destDb.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable; foreach (var item in resVal) { if (item.Value.IsValidEx()) { var btr = item.Value.GetObject(OpenMode.ForRead) as BlockTableRecord; if (btr.IsDynamicBlock) { try { btr.UpgradeOpen(); btr.UpdateAnonymousBlocks(); } catch { } } } } t.Commit(); } } return resVal; }
/// <summary> /// Копирование блоков сечений из шаблона блоков и доп списка блоков blNames /// </summary> /// <param name="fileBlocksTemplate"></param> /// <param name="service"></param> /// <param name="blNames"></param> /// <returns></returns> public static List<BlockSectionAbstract> LoadSections(string fileBlocksTemplate, BaseService service, List<string> blNames, out Dictionary<string, ObjectId> blNamesCopy) { blNamesCopy = new Dictionary<string, ObjectId>(); Dictionary<ObjectId, BlockSectionAbstract> blSecToCopy = new Dictionary<ObjectId, BlockSectionAbstract>(); using (var dbBlocks = new Database(false, true)) { dbBlocks.ReadDwgFile(fileBlocksTemplate, FileOpenMode.OpenForReadAndAllShare, false, ""); dbBlocks.CloseInput(true); using (var bt = dbBlocks.BlockTableId.Open(OpenMode.ForRead) as BlockTable) { foreach (ObjectId idBtr in bt) { using (var btr = idBtr.Open(OpenMode.ForRead) as BlockTableRecord) { var blNameToCopy = blNames.Find(n => n.Equals(btr.Name, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(blNameToCopy)) { blNamesCopy.Add(blNameToCopy, btr.Id); continue; } BlockSectionAbstract blSec = null; if (btr.Name.StartsWith(Settings.Default.BlockPanelSectionVerticalPrefixName, StringComparison.OrdinalIgnoreCase)) { blSec = new BlockSectionVertical(btr.Name, service); } else if (btr.Name.StartsWith(Settings.Default.BlockPanelSectionHorizontalPrefixName, StringComparison.OrdinalIgnoreCase)) { blSec = new BlockSectionHorizontal(btr.Name, service); } if (blSec != null) { var resParse = blSec.ParseBlName(); if (resParse.Success) { blSecToCopy.Add(idBtr, blSec); //Определение ассоциативных штриховок и объектов с которыми они связаны blSec.getHatchAssociateIds(btr); } else { Inspector.AddError($"Не определены параметры блока сечения в файле шаблона блоков. {btr.Name}. {resParse.Error}", icon: System.Drawing.SystemIcons.Error); } } } } } if (blSecToCopy.Count > 0) { using (ObjectIdCollection ids = new ObjectIdCollection(blSecToCopy.Keys.ToArray())) { foreach (var item in blNamesCopy.Values) { ids.Add(item); } using (IdMapping map = new IdMapping()) { service.Db.WblockCloneObjects(ids, service.Db.BlockTableId, map, DuplicateRecordCloning.Replace, false); foreach (var item in blSecToCopy) { item.Value.IdBtr = map[item.Key].Value; if (item.Value._hatchsAssociatedIdsDictInTemplate != null) { item.Value.setHatchIdsMapping(map); //item.Value.ReplaceAssociateHatch(); } } foreach (var name in blNames) { ObjectId idBl; if (blNamesCopy.TryGetValue(name, out idBl)) { blNamesCopy[name] = map[idBl].Value; } } } } } else { Inspector.AddError("Не найдены блоки сечений панелей в файле шаблона блоков АКР. " + $"Файл шаблона {fileBlocksTemplate}. Префикс блоков {Settings.Default.BlockPanelSectionVerticalPrefixName} " + $"и {Settings.Default.BlockPanelSectionHorizontalPrefixName}", icon: System.Drawing.SystemIcons.Error); } } return blSecToCopy.Values.ToList(); }
private void copyPanelToExportFile(Database dbExport) { Dictionary<ObjectId, PanelBlRefExport> dictPanelsToExport = new Dictionary<ObjectId, PanelBlRefExport>(); foreach (var panelBtr in CPS.PanelsBtrExport) foreach (var panelBlref in panelBtr.Panels) dictPanelsToExport.Add(panelBlref.IdBlRefAkr, panelBlref); ObjectIdCollection ids = new ObjectIdCollection(dictPanelsToExport.Keys.ToArray()); using (IdMapping map = new IdMapping()) { var msExport = SymbolUtilityServices.GetBlockModelSpaceId(dbExport); dbExport.WblockCloneObjects(ids, msExport, map, DuplicateRecordCloning.Replace, false); // скопированные блоки в экспортированном чертеже var idsBtrExport = new HashSet<ObjectId>(); foreach (var itemDict in dictPanelsToExport) { itemDict.Value.IdBlRefExport = map[itemDict.Key].Value; using (var blRef = itemDict.Value.IdBlRefExport.Open(OpenMode.ForRead, false, true) as BlockReference) { idsBtrExport.Add(blRef.BlockTableRecord); itemDict.Value.PanelBtrExport.IdBtrExport = blRef.BlockTableRecord; } } } }
private static void SetLayerProperties(LayerTableRecord stdLayer, LayerTableRecord ltr, Database db, Transaction tr) { ltr.Color = stdLayer.Color; ltr.LineWeight = stdLayer.LineWeight; ObjectIdCollection acObjIdColl = new ObjectIdCollection(); acObjIdColl.Add(stdLayer.LinetypeObjectId); IdMapping acIdMap = new IdMapping(); LinetypeTable acLinTbl; acLinTbl = tr.GetObject(db.LinetypeTableId, OpenMode.ForWrite) as LinetypeTable; db.WblockCloneObjects(acObjIdColl, acLinTbl.Id, acIdMap, DuplicateRecordCloning.Ignore, false); LinetypeTableRecord currentLineType = GetLineType(tr, stdLayer.LinetypeObjectId, acLinTbl); ltr.LinetypeObjectId = currentLineType.Id; ltr.IsPlottable = stdLayer.IsPlottable; ltr.Description = stdLayer.Description; }
private void setHatchIdsMapping(IdMapping map) { _hatchsAssociatedIdsDictInFacade = new Dictionary<ObjectId, HatchInfo>(); foreach (var itemDict in _hatchsAssociatedIdsDictInTemplate) { ObjectIdCollection idsAssFacade = new ObjectIdCollection(); foreach (ObjectId idVal in itemDict.Value.IdsAssociate) { idsAssFacade.Add(map[idVal].Value); } itemDict.Value.IdsAssociate = idsAssFacade; itemDict.Value.Id = map[itemDict.Key].Value; _hatchsAssociatedIdsDictInFacade.Add(itemDict.Value.Id, itemDict.Value); } }
public static void ImportNestedFilters(LayerFilter srcFilter, LayerFilter destFilter, Database srcDb, Database destDb) { using (Transaction t = srcDb.TransactionManager.StartTransaction()) { LayerTable lt = t.GetObject(srcDb.LayerTableId, OpenMode.ForRead, false) as LayerTable; foreach (LayerFilter sf in srcFilter.NestedFilters) { // Получаем слои, которые следует клонировать в db // Только те, которые участвуют в фильтре ObjectIdCollection layerIds = new ObjectIdCollection(); foreach (ObjectId layerId in lt) { LayerTableRecord ltr = t.GetObject(layerId, OpenMode.ForRead, false) as LayerTableRecord; if (sf.Filter(ltr)) { layerIds.Add(layerId); } } // Клонируем слои во внешнюю db IdMapping idmap = new IdMapping(); if (layerIds.Count > 0) { srcDb.WblockCloneObjects(layerIds, destDb.LayerTableId, idmap, DuplicateRecordCloning.Replace, false); } // Опеределяем не было ли фильтра слоев // с таким же именем во внешней db LayerFilter df = null; foreach (LayerFilter f in destFilter.NestedFilters) { if (f.Name.Equals(sf.Name)) { df = f; break; } } if (df == null) { if (sf is LayerGroup) { // Создаем новую группу слоев если // ничего не найдено LayerGroup sfgroup = sf as LayerGroup; LayerGroup dfgroup = new LayerGroup(); dfgroup.Name = sf.Name; df = dfgroup; LayerCollection lyrs = sfgroup.LayerIds; foreach (ObjectId lid in lyrs) { if (idmap.Contains(lid)) { IdPair idp = idmap[lid]; dfgroup.LayerIds.Add(idp.Value); } } destFilter.NestedFilters.Add(df); } else { // Создаем фильтр слоев если // ничего не найдено df = new LayerFilter(); df.Name = sf.Name; df.FilterExpression = sf.FilterExpression; destFilter.NestedFilters.Add(df); } } // Импортируем другие фильтры ImportNestedFilters(sf, df, srcDb, destDb); } t.Commit(); } }
/// <summary> /// Копирование определенич блока из внешнего чертежа /// </summary> /// <param name="filter">Фильтр блоков, которые нужно копировать</param> /// <param name="fileDrawing">Полный путь к чертежу из которого копируется блок</param> /// <param name="destDb">База чертежа в который копируетсяя блок</param> /// <exception cref="Exception">Если нет блока в файле fileDrawing.</exception> /// <returns>Список пар значений имени блока и idBtr</returns> public static Dictionary<string, ObjectId> CopyBlockFromExternalDrawing(Predicate<string> filter, string fileDrawing, Database destDb, DuplicateRecordCloning mode = DuplicateRecordCloning.Ignore) { var resVal = new Dictionary<string, ObjectId>(); using (var extDb = new Database(false, true)) { extDb.ReadDwgFile(fileDrawing, System.IO.FileShare.ReadWrite, true, ""); extDb.CloseInput(true); var valToCopy = new Dictionary<ObjectId, string>(); using (var bt = (BlockTable)extDb.BlockTableId.Open(OpenMode.ForRead)) { foreach (var idBtr in bt) { using (var btr = idBtr.Open(OpenMode.ForRead) as BlockTableRecord) { if (!btr.IsLayout && !btr.IsDependent && !btr.IsAnonymous && filter(btr.Name)) { valToCopy.Add(btr.Id, btr.Name); } } } } // Копир if (valToCopy.Count > 0) { // Получаем текущую базу чертежа using (IdMapping map = new IdMapping()) { using (var ids = new ObjectIdCollection(valToCopy.Keys.ToArray())) { destDb.WblockCloneObjects(ids, destDb.BlockTableId, map, mode, false); foreach (var item in valToCopy) { resVal.Add(item.Value, map[item.Key].Value); } } } } } return resVal; }
//[CommandMethod("IB")] public static void ImportBlocks() { Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; Database destDb = doc.Database; Database sourceDb = new Database(false, true); String sourceFileName; try { //Get name of DWG from which to copy blocks sourceFileName = "C:\\Program Files\\AutoCAD MEP 2010\\DynaPrograms\\TagHgr.dwg"; //Read the DWG file into the database sourceDb.ReadDwgFile(sourceFileName.ToString(), System.IO.FileShare.Read, true, ""); //Create a variable to store the list of block Identifiers ObjectIdCollection blockIds = new ObjectIdCollection(); Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = sourceDb.TransactionManager; using (Transaction myTm = tm.StartTransaction()) { //Open the block table BlockTable bt = (BlockTable)tm.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false); //Check each block in the table foreach (ObjectId btrId in bt) { BlockTableRecord btr = (BlockTableRecord)tm.GetObject(btrId, OpenMode.ForRead, false); //Only add named and non-layout blocks to the copy file if the don't already exist. if (!btr.IsAnonymous && !btr.IsLayout) blockIds.Add(btrId); btr.Dispose(); } } //Copy blocks from source to dest database IdMapping mapping = new IdMapping(); sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false); //Writes the number of blocks copied to cmd line. //ed.WriteMessage("\nCopied: " + blockIds.Count.ToString() + " block definitions from " + sourceFileName + " to the current drawing."); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { ed.WriteMessage(ex.Message); } sourceDb.Dispose(); }
/// <summary> /// COPY A BLOCK (WITH BLOCK NAME) from ONE FILE TO ANOTHER. /// </summary> /// <param name="blockDrawingFile"></param> /// <param name="blockDestinationFile"></param> /// <param name="blockName"></param> public static void AddBlockToDrawing(string blockDrawingFile, string blockDestinationFile, string blockName) { if (!GoodiesPath.IsFileLocked(blockDestinationFile) && !GoodiesPath.IsFileReadOnly(blockDestinationFile)) { using (Database db = new Database()) { db.ReadDwgFile(blockDrawingFile, System.IO.FileShare.Read, true, ""); ObjectIdCollection ids = new ObjectIdCollection(); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); //BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead); if (bt.Has(blockName)) { ObjectId id = bt[blockName]; BlockTableRecord btr = (BlockTableRecord)tr.GetObject(id, OpenMode.ForRead); ObjectIdCollection IdsCol = new ObjectIdCollection(); using (Database dbDest = new Database()) { dbDest.ReadDwgFile(blockDestinationFile, System.IO.FileShare.Write, true, ""); IdsCol.Add(id); IdMapping iMap = new IdMapping(); dbDest.WblockCloneObjects(IdsCol, dbDest.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false); dbDest.Save(); dbDest.Dispose(); } } tr.Commit(); } } } }