天天看點

CAD二次開發---導入外部檔案中的塊并輸出預覽圖形(五) - shilvyan

CAD二次開發---導入外部檔案中的塊并輸出預覽圖形(五)

思路:

1)首先要定義一個資料庫對象來表示包含塊的檔案,改資料庫對象會被加載到記憶體中,但不會被顯示在CAD視窗中。

2)調用Database類的ReadDwgFile函數将外部檔案DWG檔案讀入到新建立的資料庫對象中。

3)最後調用Database類的WblockCloneObjects函數将外部的DWG檔案中塊對象複制到目前資料庫中。

CAD二次開發---導入外部檔案中的塊并輸出預覽圖形(五) - shilvyan
CAD二次開發---導入外部檔案中的塊并輸出預覽圖形(五) - shilvyan
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         }      

導入塊函數

執行個體:

CAD二次開發---導入外部檔案中的塊并輸出預覽圖形(五) - shilvyan
CAD二次開發---導入外部檔案中的塊并輸出預覽圖形(五) - shilvyan
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         }      

讀取外部檔案中的塊,并輸出預覽圖

posted on

2015-02-03 15:33 

shilvyan 

閱讀(2711) 

評論(1) 

編輯 

收藏 

舉報