思路:
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 }