CAD二次开发---导入外部文件中的块并输出预览图形(五) - shilvyan

时间:2024-02-18 09:17:22

思路:

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编辑  收藏  举报