思路:

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. using (Transaction tran = tranm.StartTransaction())
  24. {
  25. //打开源数据库中的块表
  26. // public virtual DBObject GetObject(ObjectId id, OpenMode mode);
  27. //public virtual DBObject GetObject(ObjectId id, OpenMode mode, bool openErased);
  28. //public virtual DBObject GetObject(ObjectId id, OpenMode mode, bool openErased, bool forceOpenOnLockedLayer);
  29. BlockTable bt = (BlockTable)tran.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false);
  30.  
  31. foreach (ObjectId btrId in bt)
  32. {
  33. BlockTableRecord btr = tranm.GetObject(btrId, OpenMode.ForRead, false) as BlockTableRecord;
  34. //只加入命名块和非布局快到复制列表中
  35. if (!btr.IsAnonymous && !btr.IsLayout)
  36. {
  37. blocks.Add(btrId);
  38. }
  39. btr.Dispose();
  40.  
  41. }
  42. bt.Dispose();
  43. }
  44.  
  45. IdMapping mapping = new IdMapping();
  46.  
  47. //从源数据库想目标数据库复制块表记录
  48. sourceDb.WblockCloneObjects(blocks, desdb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false);
  49.  
  50. }
  51. catch(Autodesk.AutoCAD.Runtime.Exception ex )
  52. {
  53. Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("错误信息"+ex.Message);
  54.  
  55. }
  56. //操作完成,销毁源数据库
  57. sourceDb.Dispose();
  58.  
  59. }

导入块函数

实例:

  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. }

读取外部文件中的块,并输出预览图

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

  1. CAD二次开发中浮动面板不浮动的问题

    CAD二次开发中创建了一个浮动面板,想让它创建出来后以浮动状态显示, 但是DockSides.None设置完后,面板还是不浮动.搞了很久,最后原来是 需要先设置Visible,再设置DockSides ...

  2. CAD二次开发起步

    1 环境搭建(VS 2017 + CAD 2019) CAD版本一般要比VS版本晚两年以上,比如我现在使用VS2017,则CAD要用2019版,至于CAD2018能不能用没试验过,有兴趣的小伙伴可以试 ...

  3. C#进行CAD二次开发环境配置

    最近被公司分配到了做CAD二次开发.也是初次接触这方面的东西,其实是有些无从下手的感觉.因为公司这边也没有人有时间带我,只能是自己看书,然后再写一些Demo,再结合实际的应用来一点点的学习.废话不多说 ...

  4. CAD 二次开发 -- 自动加载开发的DLL

    CAD二次开发可以采用写扩展DLL的方式实现.该DLL的函数可以被CAD调用. 但是调用前,必须用命令netload 将该dll加载到CAD. 其实可以修改注册表,当CAD软件启动后,自动加载扩展DL ...

  5. Cad 二次开发关于SelectCrossingPolygon和SelectFence返回结果Status为error的小测试

    CAD2008的二次开发,有个很奇怪的现象,只要你选择的点集不在当前视图上SelectCrossingPolygon和SelectFence返回结果Status就会为error,所以要获取正确的结果, ...

  6. CAD二次开发

    用C#有一段时间了,由于单位需要,开始接触CAD二次开发,网上一搜,加入CAD开发的群,零零碎碎看了一些文章和博客,没有系统地的知识,能解决一些小问题.最近开始系统学习,再次推荐两本书,一本事纸质版的 ...

  7. 推荐两个不错的CAD二次开发(.Net)手册

    推荐两个不错的CAD二次开发(.Net)手册 http://www.mjtd.com/helpcenter/netguide/index.html http://www.ceesky.com/book ...

  8. C# 将List中的数据导入csv文件中

    //http://www.cnblogs.com/mingmingruyuedlut/archive/2013/01/20/2849906.html C# 将List中的数据导入csv文件中   将数 ...

  9. (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql

    http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...

随机推荐

  1. 短视频APP+不同类型社交应用发展分析+化妆品电商

    短视频APP——昙花一现还是发展趋势? 在这个互联网与科技并行且飞速发展的时代,各种app不断涌入市场,其中短视频app便是一个典型,美拍,就成功入围2014年十大最火app.而短视频app也势必要成 ...

  2. 原生JS封装简单动画效果

    原生JS封装简单动画效果 一致使用各种插件,有时候对原生JS陌生了起来,所以决定封装一个简单动画效果,熟悉JS原生代码 function animate(obj, target,num){ if(ob ...

  3. 三表联查,这是我目前写过的最长的sql语句,嗯嗯,果然遇到问题才能让我更快成长,更复杂的语句也有了一些心得了

    select sum(amount),sum(card_number) from sy_user inner join sy_admin on sy_user.customer_id=sy_admin ...

  4. ORACLE临时表空间

    ORACLE临时表空间总结 2014-10-05 11:35 by 潇湘隐者, 临时表空间概念 临 时表空间用来管理数据库排序操作以及用于存储临时表.中间排序结果等临时对象,当ORACLE里需要用到S ...

  5. Android 学习 (一)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  6. sql查询上一条记录和下一条记录

    上一条记录的SQL语句: * from news where newsid<id order by newsid DESC 下一条记录的SQL语句: * from news where news ...

  7. MES开发学习一

    /*开发批次的当前信息查询界面,显示字段包括批次名,产品名,产品版本,批次数量,开始原因,所有者,当前工序,工艺路线, 工艺路线版本,车间,并能通过批次名,产品名,工序进行过滤和按照批次名正序排列.* ...

  8. 重复数据分析的三个常用语法distinct, group by, partition by

    由于数据经常会出现重复现象,数据去重是数据分析中常用操作之一,而distinct,group by, partition by三者都可以实现去重功能,实践中需要根据不同的场景需求来选取相应的语法. d ...

  9. 解决: maven编译项目报“非法字符: \65279 ”错误

    打包maven项目的时候,出现异常: [INFO] ------------------------------------------------------------------------ [ ...

  10. Memento(备忘录)-对象行为型模式

    1.意图 在布破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将对象恢复到原先保存的状态. 2.别名 Token 3.动机 为了允许用户取消不确定的操作或从错误中 ...