/// <summary> /// Копирование определенич блока из внешнего чертежа /// </summary> /// <param name="blName">Имя блока</param> /// <param name="fileDrawing">Полный путь к чертежу из которого копируется блок</param> /// <param name="destDb">База чертежа в который копируетсяя блок</param> /// <param name="mode">Режим для уже существующих элементов - пропускать или заменять.</param> /// <exception cref="Exception">Если нет блока в файле fileDrawing.</exception> public static ObjectId CopyBlockFromExternalDrawing( string blName, string fileDrawing, Database destDb, DuplicateRecordCloning mode = DuplicateRecordCloning.Ignore) { if (mode == DuplicateRecordCloning.Ignore) { #pragma warning disable 618 using var bt = (BlockTable)destDb.BlockTableId.Open(OpenMode.ForRead); #pragma warning restore 618 if (bt.Has(blName)) { return(bt[blName]); } } var blNames = new List <string> { blName }; var resCopy = CopyBlockFromExternalDrawing(blNames, fileDrawing, destDb, mode); if (!resCopy.TryGetValue(blName, out var idRes)) { throw new Autodesk.AutoCAD.Runtime.Exception(Autodesk.AutoCAD.Runtime.ErrorStatus.MissingBlockName, $"Не найден блок {blName}"); } return(idRes); }
public override void CopyFrom(DxfHandledObject from, CloneContext cloneContext) { base.CopyFrom(from, cloneContext); DxfDictionary dxfDictionary = (DxfDictionary)from; this.bool_0 = dxfDictionary.bool_0; this.duplicateRecordCloning_0 = dxfDictionary.duplicateRecordCloning_0; foreach (DxfDictionaryEntry dxfDictionaryEntry1 in (ActiveList <IDictionaryEntry>)dxfDictionary.dxfDictionaryEntryCollection_0) { DxfDictionaryEntry dxfDictionaryEntry2 = (DxfDictionaryEntry)dxfDictionaryEntry1.Clone(cloneContext); if (dxfDictionaryEntry2.Value != null) { dxfDictionaryEntry2.Dictionary = this; dxfDictionaryEntry2.Value.vmethod_2((IDxfHandledObject)this); } cloneContext.ClonedDictionaryEntries.Add(dxfDictionaryEntry2); this.dxfDictionaryEntryCollection_0.Add((IDictionaryEntry)dxfDictionaryEntry2); } switch (dxfDictionary.Handle) { case 12: case 13: case 14: case 23: case 25: case 26: this.SetHandle(dxfDictionary.Handle); break; } }
/// <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()); } }
public static List <ObjectId> WblockCloneObjects(this Database dbDest, ObjectId owner, List <ObjectId> idsCopy, DuplicateRecordCloning mode) { using var map = new IdMapping(); using var ids = new ObjectIdCollection(idsCopy.ToArray()); dbDest.WblockCloneObjects(ids, owner, map, mode, false); return(idsCopy.Select(s => map[s].Value).ToList()); }
private void CopyBlock(DuplicateRecordCloning mode) { var doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; var db = doc.Database; using (doc.LockDocument()) { // Выбор и вставка блока Block.CopyBlockFromExternalDrawing(new List<string> { blName }, file, db, mode); } }
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, string.Empty); 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 = (BlockTableRecord)idBtr.Open(OpenMode.ForRead)) { if (!btr.IsLayout && !btr.IsDependent && !btr.IsAnonymous && filter(btr.Name)) { valToCopy.Add(btr.Id, btr.Name); } } } } // Копир if (valToCopy.Count > 0) { // Получаем текущую базу чертежа using (var 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); }
private void CopyBlock(DuplicateRecordCloning mode) { var doc = AcadHelper.Doc; var db = doc.Database; using (doc.LockDocument()) { // Выбор и вставка блока if (mode == DuplicateRecordCloning.Replace) { Block.Redefine(blName, file, db); } else { Block.CopyBlockFromExternalDrawing(new List <string> { blName }, file, db, mode); } } }
WblockCloneObjects() { try { m_db = Utils.Db.GetCurDwg(); if (m_db == null) { return; } using (TransactionHelper trHlpr = new TransactionHelper()) { trHlpr.Start(); /// get the object to clone Objects objs = new Objects(trHlpr); if (objs.ShowDialog() != DialogResult.OK) { trHlpr.Abort(); return; } DBObject objToClone = trHlpr.Transaction.GetObject(objs.ObjectId, OpenMode.ForRead); if (objToClone is DBDictionary) { throw new System.Exception("Please select a record in a dictionary"); } AcadApp.Document activeDoc = AcadApp.Application.DocumentManager.MdiActiveDocument; /// get cloning options... /// //String message = "\nDuplicate Record Cloning Options:"; //Array enums = Enum.GetValues(typeof(DuplicateRecordCloning)); //foreach (int option in enums) { // message += string.Format("\n{0} = {1}", // option, // Enum.GetName(typeof(DuplicateRecordCloning), option)); //} //PromptIntegerOptions prOpts = new PromptIntegerOptions(message); //prOpts.LowerLimit = 0; //prOpts.UpperLimit = enums.Length; //Editor ed = activeDoc.Editor; //PromptIntegerResult prRes = ed.GetInteger(prOpts); //if (prRes.Status != PromptStatus.OK) // return; //DuplicateRecordCloning drc = (DuplicateRecordCloning)prRes.Value; //if (drc == DuplicateRecordCloning.NotApplicable || // drc == DuplicateRecordCloning.RefMangleName) { // ed.WriteMessage("Invalid Input"); // return; //} /// .... or not DuplicateRecordCloning drc = DuplicateRecordCloning.Ignore; if (objToClone.OwnerId == ObjectId.Null) /// object to clone is a root object, can't clone { return; } /// get the destination db Documents docs = new Documents(); docs.Text = "Destination database"; if (docs.ShowDialog() != DialogResult.OK) { return; } Database dbSrc = activeDoc.Database; Database dbDest = docs.Document.Database; if (dbDest == dbSrc) { throw new System.Exception("Please pick a destination database other than the source"); } /// find out parent dictionary ObjectId owningDictId = objToClone.OwnerId; DBDictionary owningDictSrc = trHlpr.Transaction.GetObject(owningDictId, OpenMode.ForRead) as DBDictionary; /// might be nested Stack owningDictNames = new Stack(); while (owningDictSrc.OwnerId != ObjectId.Null) { owningDictSrc = trHlpr.Transaction.GetObject(owningDictSrc.OwnerId, OpenMode.ForRead) as DBDictionary; String owningDictName = owningDictSrc.NameAt(owningDictId); owningDictNames.Push(owningDictName); owningDictId = owningDictSrc.ObjectId; } /// check if parent dictionary exists in dest. DBDictionary owningDictDest = null; using (Transaction trDest = dbDest.TransactionManager.StartTransaction()) { AcadApp.Application.DocumentManager.GetDocument(dbDest).LockDocument(); DBDictionary parentDictDest = trDest.GetObject(dbDest.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary; String owningDictName = owningDictNames.Peek().ToString(); if (parentDictDest.Contains(owningDictName)) { while (owningDictNames.Count != 0) { owningDictName = owningDictNames.Pop().ToString(); owningDictDest = trDest.GetObject(parentDictDest.GetAt(owningDictName), OpenMode.ForRead) as DBDictionary; parentDictDest = owningDictDest; } } else { /// dest doesnt have same structure , create it while (owningDictNames.Count != 0) { owningDictName = owningDictNames.Pop().ToString(); parentDictDest.UpgradeOpen(); owningDictDest = new DBDictionary(); parentDictDest.SetAt(owningDictName, owningDictDest); trDest.AddNewlyCreatedDBObject(owningDictDest, true); parentDictDest = owningDictDest; } } trDest.Commit(); } /// clone the objects over ObjectIdCollection objIds = new ObjectIdCollection(); objIds.Add(objToClone.ObjectId); IdMapping idMap = new IdMapping(); idMap.DestinationDatabase = dbDest; m_db.WblockCloneObjects(objIds, owningDictDest.ObjectId, idMap, drc, false); trHlpr.Commit(); } } catch (AcRx.Exception ex) { if (ex.ErrorStatus == AcRx.ErrorStatus.FileNotFound) { MessageBox.Show("No documents found in current session"); } else { MessageBox.Show(ex.Message); } } catch (System.Exception ex) { MessageBox.Show(ex.Message); } }
WblockObjects2() { m_db = Utils.Db.GetCurDwg(); if (m_db == null) { return; } ObjectIdCollection objIds; if (!Utils.AcadUi.GetSelSetFromUser(out objIds)) { return; } String message = "\nDuplicate Record Cloning Options:"; Array enums = Enum.GetValues(typeof(DuplicateRecordCloning)); foreach (int option in enums) { message += string.Format("\n{0} = {1}", option, Enum.GetName(typeof(DuplicateRecordCloning), option)); } PromptIntegerOptions prOpts = new PromptIntegerOptions(message); prOpts.LowerLimit = 0; prOpts.UpperLimit = enums.Length; Editor ed = AcadApp.Application.DocumentManager.MdiActiveDocument.Editor; PromptIntegerResult prRes = ed.GetInteger(prOpts); if (prRes.Status != PromptStatus.OK) { return; } Database db = new Database(true, true); DuplicateRecordCloning drc = (DuplicateRecordCloning)prRes.Value; if (drc == DuplicateRecordCloning.NotApplicable || drc == DuplicateRecordCloning.RefMangleName) { ed.WriteMessage("Invalid Input"); return; } using (TransactionHelper trHlp = new TransactionHelper(m_db)) { trHlp.Start(); m_db.Wblock(db, objIds, new Point3d(0, 0, 0), drc); trHlp.Commit(); } using (TransactionHelper trHlp = new TransactionHelper(db)) { trHlp.Start(); Snoop.Forms.Database dbForm = new MgdDbg.Snoop.Forms.Database(db, trHlp); dbForm.Text = "Destination Database (In memory only)"; dbForm.ShowDialog(); trHlp.Commit(); } }
/// <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); return(Copy(dbDest, dbSource, mode, getOwnerId, getCopyIds)); } }
/// <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()); } } }
public static Dictionary <string, ObjectId> CopyBlockFromExternalDrawing( [NotNull] IList <string> blNames, string fileDrawing, Database destDb, DuplicateRecordCloning mode = DuplicateRecordCloning.Ignore) { var resVal = new Dictionary <string, ObjectId>(); var uniqBlNames = blNames.Distinct(StringComparer.OrdinalIgnoreCase).ToList(); if (mode == DuplicateRecordCloning.Ignore) { // Если уже есть эти блоки #pragma warning disable 618 using var btDest = (BlockTable)destDb.BlockTableId.Open(OpenMode.ForRead); #pragma warning restore 618 var existBls = new List <string>(); foreach (var uniqBlName in uniqBlNames) { if (btDest.Has(uniqBlName)) { existBls.Add(uniqBlName); resVal.Add(uniqBlName, btDest[uniqBlName]); } } if (existBls.Any()) { uniqBlNames = uniqBlNames.Except(existBls).ToList(); } } if (!uniqBlNames.Any()) { return(resVal); } using (var extDb = new Database(false, true)) { extDb.ReadDwgFile(fileDrawing, System.IO.FileShare.ReadWrite, true, string.Empty); extDb.CloseInput(true); var valToCopy = new Dictionary <ObjectId, string>(); #pragma warning disable 618 using (var bt = (BlockTable)extDb.BlockTableId.Open(OpenMode.ForRead)) #pragma warning restore 618 { foreach (var blName in uniqBlNames) { if (bt.Has(blName)) { var id = bt[blName]; valToCopy.Add(id, blName); } } } // Копир if (valToCopy.Count > 0) { // Получаем текущую базу чертежа using var 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(); foreach (var item in resVal) { if (item.Value.IsValidEx()) { var btr = (BlockTableRecord)item.Value.GetObject(OpenMode.ForRead); if (btr.IsDynamicBlock) { try { btr = (BlockTableRecord)item.Value.GetObject(OpenMode.ForWrite); btr.UpdateAnonymousBlocks(); } catch { // } } } } t.Commit(); } return(resVal); }
/// <summary> /// Копирование определенич блока из внешнего чертежа /// </summary> /// <param name="blName">Имя блока</param> /// <param name="fileDrawing">Полный путь к чертежу из которого копируется блок</param> /// <param name="destDb">База чертежа в который копируетсяя блок</param> /// <exception cref="Exception">Если нет блока в файле fileDrawing.</exception> public static ObjectId CopyBlockFromExternalDrawing(string blName, string fileDrawing, Database destDb, DuplicateRecordCloning mode = DuplicateRecordCloning.Ignore) { ObjectId idRes; if (mode == DuplicateRecordCloning.Ignore) { using (var bt = destDb.BlockTableId.Open( OpenMode.ForRead) as BlockTable) { if (bt.Has(blName)) { return bt[blName]; } } } List<string> blNames = new List<string> { blName }; var resCopy = CopyBlockFromExternalDrawing(blNames, fileDrawing, destDb, mode); if (!resCopy.TryGetValue(blName, out idRes)) { throw new Autodesk.AutoCAD.Runtime.Exception(Autodesk.AutoCAD.Runtime.ErrorStatus.MissingBlockName, $"Не найден блок {blName}"); } return idRes; }
/// <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> /// Копирование определенич блока из внешнего чертежа /// </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; }