上海做产地证在哪个网站录入/网站建站开发
大家好,今天我们继续讨论CAD二次开发中有关图块的话题。不过今天的内容不是新型图块,而是一个比较实用的功能,即从外部的dwg文件中导入块定义。并且结合实际工作给出一个例子,也就是在加载程序的过程中加入作图图例的块定义,以便使用。
通过之前的介绍可以知道,每一个CAD文件都是一个数据库,有关更加深入的CAD文档和图形数据库的信息这里先挖个小坑,将在本系列之后的篇章中介绍。这里回归正题,导入外部文件中的块定义主要步骤如下:
1.定义一个数据库对象,这个对象就是被导入的文件所对应的数据库
2.调用上面数据库的方法ReadDwgFile以找到被导入文件中的块定义
3.调用Database类的WblockCloneObjects方法将块定义加入到目标文件
ReadDwgFile与WblockCloneObjects方法定义如上图所示:
封装整个过程的方法代码如下图所示:
public static void ImportBlocksFromDwg(this Database destDb, string sourceFileName){ //创建一个新的数据库对象,作为源数据库,以读入外部文件中的对象 Database sourceDb = new Database(false, true); try { //把DWG文件读入到一个临时的数据库中 sourceDb.ReadDwgFile(sourceFileName, System.IO.FileShare.Read, true, null); //创建一个变量用来存储块的ObjectId列表 ObjectIdCollection blockIds = new ObjectIdCollection(); //获取源数据库的事务处理管理器 Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = sourceDb.TransactionManager; //在源数据库中开始事务处理 using (Transaction myT = tm.StartTransaction()) { //打开源数据库中的块表 BlockTable bt = (BlockTable)tm.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false); //遍历每个块 foreach (ObjectId btrId in bt) { BlockTableRecord btr = (BlockTableRecord)tm.GetObject(btrId, OpenMode.ForRead, false); //只加入命名块和非布局块到复制列表中 if (!btr.IsAnonymous && !btr.IsLayout) { blockIds.Add(btrId); } btr.Dispose(); } bt.Dispose(); } //定义一个IdMapping对象 IdMapping mapping = new IdMapping(); //从源数据库向目标数据库复制块表记录 sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { Application.ShowAlertDialog("复制错误: " + ex.Message); } //操作完成,销毁源数据库 sourceDb.Dispose();}
接下来来看今天的例子:
上图是在自控设计过程中绘制可燃有毒检测器平面敷设图可能用到的图例,其中的图形就是已经定义好的属性块和动态块,我们定义一个事件,把这些块定义和相关的图层加入到新打开的文件当中,关于事件的部分也会在本系列之后的篇章中涉及,这里关注添加块定义以及图层的过程。
这里由于篇幅有限,假定图例的路径与生成的dll的路径相同,在NETLOAD加载程序集的同时添加块定义和图层,代码如下:
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;public class AppEvent : IExtensionApplication{ObjectId oriLayerId; //释放源图层ObjectId cusLayerId; //可燃气体检测器ObjectId toxicLayerId; //有毒气体检测器ObjectId otherLayerId; // 其他仪表ObjectId tableLayerId; // 仪表信息public static string oriLayer = "释放源";public static string cusLayer = "可燃气体检测器";public static string toxicLayer = "有毒气体检测器";public static string otherLayer = "其他仪表设备";public static string tableLayer = "仪表信息";public void Initialize(){ Document doc = AcadApp.DocumentManager.MdiActiveDocument; Database db = doc.Database; string curPath = Path.GetDirectoryName(this.GetType().Assembly.Location); //获取当前路径 string signFilename = curPath + "\\图例.dwg"; using (Transaction trans = db.TransactionManager.StartTransaction()) { oriLayerId = db.AddLayer(oriLayer); //添加释放源图层 db.SetLayerColor(oriLayer, 5); cusLayerId = db.AddLayer(cusLayer);//添加可燃气体检测器层 db.SetLayerColor(cusLayer, 3); toxicLayerId = db.AddLayer(toxicLayer);//添加有毒气体检测器层 db.SetLayerColor(toxicLayer, 1); otherLayerId = db.AddLayer(otherLayer);//添加其他仪表层 db.SetLayerColor(otherLayer, 6); tableLayerId = db.AddLayer(tableLayer);//添加仪表信息层 db.SetLayerColor(tableLayer, 2); using (Transaction trans1 = db.TransactionManager.StartTransaction()) { // 导入外部文件中的块 db.ImportBlocksFromDwg(signFilename); //打开块表 BlockTable bt = (BlockTable)trans1.GetObject(db.BlockTableId, OpenMode.ForRead); ObjectId id = db.CurrentSpaceId; //Dictionary atts = new Dictionary(); //atts.Add("NUM", "1"); ////在当前空间加入块参照 //id.InsertBlockReference("0", "CombustibleGas", Point3d.Origin, new Scale3d(200), 0, atts); trans1.Commit(); } trans.Commit(); }}
代码运行效果如下面的视频所示:
视频中可以看到:关掉CAD程序后,打开一张空的CAD图纸,图层只有默认的0图层,没有块定义,在加入程序集之后,有了可燃有毒的相关图层,有了块定义并且可以插入。
今天的内容就先介绍到这里,有关CAD图块的内容就先告一段落,本系列之后的内容还请多多关注,如果有建议或是批评指教,欢迎在公众号内留言,谢谢!