CAD二次開發---導入外部文件中的塊並輸出預覽圖形(五)


思路:

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         }
讀取外部文件中的塊,並輸出預覽圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM