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 }
讀取外部檔案中的塊,并輸出預覽圖
posted on
2015-02-03 15:33
shilvyan
閱讀(2711)
評論(1)
編輯
收藏
舉報