コード例 #1
0
ファイル: dwgThumnail.cs プロジェクト: cughudson/DWGLib-2014
        //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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: DbExtensions.cs プロジェクト: mustafatamer/AcadLib
        // Копирование стиля таблиц ПИК из файла шаблона
        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);
        }
コード例 #4
0
ファイル: Db.cs プロジェクト: 15831944/EM
        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");
            }
        }
コード例 #5
0
ファイル: DrawOverrules.cs プロジェクト: 15831944/oldProject
        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);
        }
コード例 #6
0
        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);
                }
            }
        }
コード例 #7
0
ファイル: Breaklines.cs プロジェクト: dsb6063/TOUR-2018.V18.0
        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);
            }
        }
コード例 #8
0
        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);
                    }
                }
            }
        }
コード例 #9
0
        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]);
                }
        }
コード例 #10
0
        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);
                }
            });
        }
コード例 #11
0
        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);
        }
コード例 #12
0
ファイル: CADops.cs プロジェクト: peggylin-hub/CADworks
        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);
        }
コード例 #13
0
 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;
                     }
                 }
             }
         }
     }
 }
コード例 #14
0
ファイル: Block.cs プロジェクト: trgis/AcadLib
        /// <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);
        }
コード例 #15
0
        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;
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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);
                });
            }
        }
コード例 #18
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());
                    }
            }
        }
コード例 #19
0
        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;
                    }
                }
            }
        }
コード例 #20
0
        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);
                        }
                    }
                }
            }
        }
コード例 #21
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());
                }
        }
コード例 #22
0
 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;
                     }
                 }
             }
         }
     }
 }
コード例 #23
0
        /// <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);
        }
コード例 #24
0
ファイル: Db.cs プロジェクト: zhengjian211/MgdDbg
        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();
            }
        }
コード例 #25
0
        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();
                }
            }
        }
コード例 #26
0
        /// <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);
                }
            }
        }
コード例 #27
0
        // Копирование новых панелей
        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);
        }
コード例 #28
0
ファイル: Block.cs プロジェクト: vildar82/AcadLib
 /// <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;
 }
コード例 #29
0
        public override void ProcessId(IdMapping idMapping)
        {
            var conventions = finder.Find <IIdConvention>();

            Apply <IIdentityInspector, IIdentityInstance>(conventions,
                                                          new IdentityInstance(idMapping));
        }
コード例 #30
0
        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);
        }
コード例 #31
0
        /// <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());
        }
コード例 #32
0
ファイル: ObjectIdExt.cs プロジェクト: vildar82/AcadLib
 /// <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;
 }
コード例 #33
0
ファイル: DictNOD.cs プロジェクト: vildar82/PanelColorAlbum
 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);
 }
コード例 #34
0
 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;
 }
コード例 #35
0
 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);
      }
 }
コード例 #36
0
        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);
             }
        }
コード例 #37
0
ファイル: Block.cs プロジェクト: vildar82/PanelColorAlbum
 ///// <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;
 }
コード例 #38
0
        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);
                    }
                }
            }
        }
コード例 #39
0
ファイル: Class1.cs プロジェクト: freudshow/raffles-codes
        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();
        }
コード例 #40
0
ファイル: Block.cs プロジェクト: vildar82/AcadLib
 /// <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;
 }
コード例 #41
0
        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();
            }
        }
コード例 #42
0
ファイル: AC_DBObject.cs プロジェクト: darkimage/autocad-arx
 public DBObject DeepClone(DBObject ownerPointer, IdMapping idMap, bool isPrimary)
 {
     createInstance();
     DBObject DeepC = BaseDBObject.DeepClone(ownerPointer, idMap, isPrimary);
     tr.Dispose();
     return DeepC;
 }
コード例 #43
0
        // создаение блока монтажки
        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();
            }
        }
コード例 #44
0
        // Вставка ячейки покраски (пока = одной плитке)
        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++;
                    }
                }
            }
        }
コード例 #45
0
        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;
                    }
                }
            }
        }
コード例 #46
0
ファイル: ARedefineBlocks.cs プロジェクト: anielii/Acommands
 private void CopyBlockDefinition(ObjectIdCollection blocksIds)
 {
     IdMapping mapping = new IdMapping();
     sourceDB.WblockCloneObjects(blocksIds, currentdestDB.BlockTableId, mapping,
         DuplicateRecordCloning.Replace, false);
 }
コード例 #47
0
ファイル: DbExtensions.cs プロジェクト: vildar82/AcadLib
 // Копирование стиля таблиц ПИК из файла шаблона
 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;
 }
コード例 #48
0
        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;
        }
コード例 #49
0
ファイル: AC_DBObject.cs プロジェクト: darkimage/autocad-arx
 public DBObject WblockClone(RXObject ownerPointer, IdMapping idMap, bool isPrimary)
 {
     createInstance();
     DBObject WblockC = BaseDBObject.WblockClone(ownerPointer,idMap,isPrimary);
     tr.Dispose();
     return WblockC;
 }
コード例 #50
0
ファイル: AC_DBObject.cs プロジェクト: darkimage/autocad-arx
 public virtual void SwapReferences(IdMapping idMap)
 {
     createInstance();
     BaseDBObject.SwapReferences(idMap);
     tr.Dispose();
 }
コード例 #51
0
        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();
            }
        }
コード例 #52
0
ファイル: Block.cs プロジェクト: vildar82/AcadLib
        /// <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;
        }
コード例 #53
0
      /// <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();         
      }
コード例 #54
0
        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;
                    }
                }
            }
        }
コード例 #55
0
        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;
        }
コード例 #56
0
 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);
    }
 }
コード例 #57
0
        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();
             }
        }
コード例 #58
0
ファイル: Block.cs プロジェクト: vildar82/AcadLib
        /// <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;
        }
コード例 #59
0
ファイル: Class2.cs プロジェクト: kmorin/pointloadcalc
            //[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();
            }
コード例 #60
-1
 /// <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();
             }
         }
     }
 }