思路:
1)首先要定义一个数据库对象来表示包含块的文件,改数据库对象会被加载到内存中,但不会被显示在CAD窗口中。
2)调用Database类的ReadDwgFile函数将外部文件DWG文件读入到新创建的数据库对象中。
3)最后调用Database类的WblockCloneObjects函数将外部的DWG文件中块对象复制到当前数据库中。
1 /// <summary> 2 /// 外部文件导入块, 3 /// </summary> 4 /// <param name="desdb">目标数据库</param> 5 /// <param name="sourceFileName">完整的外部文件名</param> 6 public static void ImportBlocksFrmDwg(this Database desdb, string sourceFileName) 7 { 8 //public Database(bool buildDefaultDrawing, bool noDocument); 9 Database sourceDb = new Database(false, true);//创建一个新的数据库对象,作为源数据库,以读入外部文件中的对象 10 11 try 12 { 13 //把DWG文件读入到一个临时的数据库中 14 // public void ReadDwgFile(string fileName, FileShare fileSharing, bool allowCPConversion, string password); 15 sourceDb.ReadDwgFile(sourceFileName, System.IO.FileShare.Read, true, null); 16 //创建一个变量来存储块的ObjectId列表 17 ObjectIdCollection blocks = new ObjectIdCollection(); 18 //获取源数据的事务处理管理器 19 Autodesk.AutoCAD.DatabaseServices.TransactionManager tranm = sourceDb.TransactionManager; 20 21 22 //在源数据库中开始数据处理 23 24 using (Transaction tran = tranm.StartTransaction()) 25 { 26 //打开源数据库中的块表 27 // public virtual DBObject GetObject(ObjectId id, OpenMode mode); 28 //public virtual DBObject GetObject(ObjectId id, OpenMode mode, bool openErased); 29 //public virtual DBObject GetObject(ObjectId id, OpenMode mode, bool openErased, bool forceOpenOnLockedLayer); 30 BlockTable bt = (BlockTable)tran.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false); 31 32 foreach (ObjectId btrId in bt) 33 { 34 BlockTableRecord btr = tranm.GetObject(btrId, OpenMode.ForRead, false) as BlockTableRecord; 35 //只加入命名块和非布局快到复制列表中 36 if (!btr.IsAnonymous && !btr.IsLayout) 37 { 38 blocks.Add(btrId); 39 } 40 btr.Dispose(); 41 42 } 43 bt.Dispose(); 44 } 45 46 IdMapping mapping = new IdMapping(); 47 48 //从源数据库想目标数据库复制块表记录 49 sourceDb.WblockCloneObjects(blocks, desdb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false); 50 51 52 } 53 catch(Autodesk.AutoCAD.Runtime.Exception ex ) 54 { 55 Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("错误信息"+ex.Message); 56 57 58 } 59 //操作完成,销毁源数据库 60 sourceDb.Dispose(); 61 62 63 64 65 }
实例:
1 [CommandMethod("BlockPreview")] 2 public void GenerateBlockPreview() 3 { 4 Database db = HostApplicationServices.WorkingDatabase; 5 6 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; 7 8 PromptFileNameResult result = ed.GetFileNameForOpen("请选择需要预览的文件"); 9 10 if (result.Status != PromptStatus.OK) return; 11 12 string filename = result.StringResult; 13 //在C盘跟目录线,创建一个临时文件夹,用于存放文件中的块预览图标 14 string path = "C:\\Temp1"; 15 if (!Directory.Exists(path)) 16 Directory.CreateDirectory(path); 17 18 using (Transaction tran = db.TransactionManager.StartTransaction()) 19 { 20 //导入外部的块 21 db.ImportBlocksFrmDwg(filename); 22 23 //打开块表 24 BlockTable bt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; 25 26 foreach (ObjectId id in bt) 27 { 28 BlockTableRecord btr = tran.GetObject(id, OpenMode.ForRead) as BlockTableRecord; 29 30 //如果是匿名块,布局块以及没有预览图型块,则返回 31 if (btr.IsAnonymous || btr.IsLayout || !btr.HasPreviewIcon) 32 { 33 //获取预览图块,适用于2008及以下版本 34 Bitmap preview = BlockThumbnailHelper.GetBlockThumbanail(btr.ObjectId); 35 // 36 //Bitmap preview = btr.PreviewIcon;//适用于2009版本及以上版本 37 38 preview.Save(path + "\\" + btr.Name + ".bmp");//保存块预览 39 } 40 41 } 42 tran.Commit(); 43 44 } 45 46 }