思路:

1)首先要定义一个数据库对象来表示包含块的文件,改数据库对象会被加载到内存中,但不会被显示在CAD窗口中。

2)调用Database类的ReadDwgFile函数将外部文件DWG文件读入到新创建的数据库对象中。

3)最后调用Database类的WblockCloneObjects函数将外部的DWG文件中块对象复制到当前数据库中。

 /// <summary>
/// 外部文件导入块,
/// </summary>
/// <param name="desdb">目标数据库</param>
/// <param name="sourceFileName">完整的外部文件名</param>
public static void ImportBlocksFrmDwg(this Database desdb, string sourceFileName)
{
//public Database(bool buildDefaultDrawing, bool noDocument);
Database sourceDb = new Database(false, true);//创建一个新的数据库对象,作为源数据库,以读入外部文件中的对象 try
{
//把DWG文件读入到一个临时的数据库中
// public void ReadDwgFile(string fileName, FileShare fileSharing, bool allowCPConversion, string password);
sourceDb.ReadDwgFile(sourceFileName, System.IO.FileShare.Read, true, null);
//创建一个变量来存储块的ObjectId列表
ObjectIdCollection blocks = new ObjectIdCollection();
//获取源数据的事务处理管理器
Autodesk.AutoCAD.DatabaseServices.TransactionManager tranm = sourceDb.TransactionManager; //在源数据库中开始数据处理 using (Transaction tran = tranm.StartTransaction())
{
//打开源数据库中的块表
// public virtual DBObject GetObject(ObjectId id, OpenMode mode);
//public virtual DBObject GetObject(ObjectId id, OpenMode mode, bool openErased);
//public virtual DBObject GetObject(ObjectId id, OpenMode mode, bool openErased, bool forceOpenOnLockedLayer);
BlockTable bt = (BlockTable)tran.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false); foreach (ObjectId btrId in bt)
{
BlockTableRecord btr = tranm.GetObject(btrId, OpenMode.ForRead, false) as BlockTableRecord;
//只加入命名块和非布局快到复制列表中
if (!btr.IsAnonymous && !btr.IsLayout)
{
blocks.Add(btrId);
}
btr.Dispose(); }
bt.Dispose();
} IdMapping mapping = new IdMapping(); //从源数据库想目标数据库复制块表记录
sourceDb.WblockCloneObjects(blocks, desdb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false); }
catch(Autodesk.AutoCAD.Runtime.Exception ex )
{
Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("错误信息"+ex.Message); }
//操作完成,销毁源数据库
sourceDb.Dispose(); }

导入块函数

实例:

     [CommandMethod("BlockPreview")]
public void GenerateBlockPreview()
{
Database db = HostApplicationServices.WorkingDatabase; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; PromptFileNameResult result = ed.GetFileNameForOpen("请选择需要预览的文件"); if (result.Status != PromptStatus.OK) return; string filename = result.StringResult;
//在C盘跟目录线,创建一个临时文件夹,用于存放文件中的块预览图标
string path = "C:\\Temp1";
if (!Directory.Exists(path))
Directory.CreateDirectory(path); using (Transaction tran = db.TransactionManager.StartTransaction())
{
//导入外部的块
db.ImportBlocksFrmDwg(filename); //打开块表
BlockTable bt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; foreach (ObjectId id in bt)
{
BlockTableRecord btr = tran.GetObject(id, OpenMode.ForRead) as BlockTableRecord; //如果是匿名块,布局块以及没有预览图型块,则返回
if (btr.IsAnonymous || btr.IsLayout || !btr.HasPreviewIcon)
{
//获取预览图块,适用于2008及以下版本
Bitmap preview = BlockThumbnailHelper.GetBlockThumbanail(btr.ObjectId);
//
//Bitmap preview = btr.PreviewIcon;//适用于2009版本及以上版本 preview.Save(path + "\\" + btr.Name + ".bmp");//保存块预览
} }
tran.Commit(); } }

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

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. Python实现插件机制——自动import一个目录下的所有.py文件

    假设有这样一个目录结构: /src          main.py          /plugins                __init__.py                a.py  ...

  2. 转: windows下面安装Python和pip终极教程

    原文: http://www.cnblogs.com/yuanzm/p/4089856.html 因为如果是初学者在windows环境下安装,简直是折磨人,会遇到各种蛋疼的情况.本文希望提供傻瓜式的教 ...

  3. sip常用消息实体参考(系网上摘抄,感谢分享)

    1.MESSAGE消息       1)头字段填写说明       Call-id:                 必选       CSeq:                   必选       ...

  4. Visual Studio 2015激活码,Visual Studio 2015密钥

    微软刚刚为开发人员奉上了最新大礼Visual Studio 2015正式版.如果你是MSDN订阅用户,现在就可以去下载丰富的相关资源.如果你指向体验一把尝尝鲜,微软也是很慷慨的. Visual Stu ...

  5. 各种Java序列化性能比较

    转载:http://www.jdon.com/concurrent/serialization.html 这里比较Java对象序列化 XML JSON  Kryo  POF等序列化性能比较. 很多人以 ...

  6. 【干货】解密监控宝Docker监控实现原理

    分享人高驰涛(Neeke),云智慧高级架构师,PHP 开发组成员,同时也是 PECL/SeasLog 的作者.8 年研发管理经验,早期从事大规模企业信息化研发架构,09 年涉足互联网数字营销领域并深入 ...

  7. NSURLCache详解和使用

    使用缓存的目的是为了使应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,以空间换取时间,减少对同一个url多次请求,减轻服务器的压力,优化客户端网络 ...

  8. 运用String类实现一个模拟用户登录程序

    package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...

  9. centos7安装apue.3e时出错处理

    错误代码如下: /tmp/ccb9gvom.o: In function `thr_fn': barrier.c:(.text+0x6e): undefined reference to `heaps ...

  10. 使用QRCode生成二维码

    第一步: 获取QRCode组件 可以通过vs的nuget管理安装Gma.QrCodeNet, 也可以直接添加"Gma.QrCodeNet.Encoding.dll"的引用. 第二步 ...