Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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;
            }
        }
Exemple #3
0
        /// <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);
     }
 }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
                }
            }
        }
Exemple #8
0
        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);
            }
        }
Exemple #9
0
        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();
            }
        }
Exemple #10
0
 /// <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));
     }
 }
Exemple #11
0
        /// <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());
                    }
            }
        }
Exemple #12
0
        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);
        }
Exemple #13
0
 /// <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;
 }
Exemple #14
0
        /// <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;
        }
Exemple #15
0
        /// <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;
        }