使用RealDWG加载DWG格式图纸文件参考:http://t.csdn.cn/QxXhf

根据不同的使用需求,可做不同方式的各类型图元提取,话不多说直接上代码;

using (Transaction acTrans = db.TransactionManager.StartTransaction())
{//解锁所有图层using (LayerTable aclt = (LayerTable)acTrans.GetObject(db.LayerTableId, OpenMode.ForRead)){foreach (ObjectId ltrId in aclt){using (LayerTableRecord acltr = (LayerTableRecord)acTrans.GetObject(ltrId, OpenMode.ForWrite)){if (acltr.IsLocked){acltr.IsLocked = false;}}}}//按照布局using (DBDictionary layoutDict = (DBDictionary)acTrans.GetObject(db.LayoutDictionaryId, OpenMode.ForRead)){foreach (DBDictionaryEntry lytEnt in layoutDict){string layoutName = lytEnt.Key;using (Layout layout = (Layout)acTrans.GetObject(lytEnt.Value, OpenMode.ForRead)){using (BlockTableRecord acBlkRecord = (BlockTableRecord)acTrans.GetObject(layout.BlockTableRecordId, OpenMode.ForRead, false)){ObjectIdCollection btrObjIds = new ObjectIdCollection();// 根据绘图次序返回图元var orderTable = acBlkRecord.GetDrawOrderTable();if (orderTable != null){try{btrObjIds = orderTable.GetFullDrawOrder(0);}catch (System.Exception ex){//当系统方法无法获取块定义内的图元Id时手动返回foreach (ObjectId id in acBlkRecord){btrObjIds.Add(id);}}}else{foreach (ObjectId id in acBlkRecord){btrObjIds.Add(id);}}foreach (ObjectId objId in btrObjIds){using (Entity acEnt = (Entity)acTrans.GetObject(objId, OpenMode.ForRead)){if (acEnt is DBText dbText){//单行文字if (dbText is AttributeReference attrRef){//属性定义}}else if (acEnt is MText mText){//多行文字}else if (acEnt is Line line){//直线}else if (acEnt is Polyline polyline){//多段线}else if (acEnt is Hatch hatch){//图案填充}else if (acEnt is BlockReference bkRef){//块参照}else{//更多类型参考实际运用}}}}}}}//按照块表using (BlockTable acBlockTable = (BlockTable)acTrans.GetObject(db.BlockTableId, OpenMode.ForRead)){foreach (ObjectId brcId in acBlockTable){using (BlockTableRecord acBlkRecord = (BlockTableRecord)acTrans.GetObject(brcId, OpenMode.ForRead)){//具体图元提取同上述布局提取}}}
}

此处补充一个扩展类,包含两个扩展方法:

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.DatabaseServices.Filters;namespace CAD_DataExtract
{public static class Extensions{/// <summary>/// 获取块定义内图元绘图顺序表对象/// </summary>/// <param name="btRec">一个需要提取信息的块定义</param>/// <returns>返回一个绘图顺序表</returns>public static DrawOrderTable GetDrawOrderTable(this BlockTableRecord btRec){if (btRec != null){using (var trans = btRec.Database.TransactionManager.StartTransaction()){if (ObjectId.Null != btRec.ExtensionDictionary){DBDictionary pExt = trans.GetObject(btRec.ExtensionDictionary, OpenMode.ForRead) as DBDictionary;if (pExt != null){if (pExt.Contains("ACAD_SORTENTS")){ObjectId draworderId = pExt.GetAt("ACAD_SORTENTS");if (ObjectId.Null != draworderId){DBObject pObj = trans.GetObject(draworderId, OpenMode.ForRead);if (pObj is DrawOrderTable orderTable){trans.Commit();return orderTable;}}}}}}}return null;}/// <summary>/// 获取块引用的裁剪范围/// </summary>/// <param name="bref">块引用</param>/// <returns></returns>public static void GetBlockClip(BlockReference bref){if (bref == null || !bref.ExtensionDictionary.IsValid)return;var acTrans = bref.Database.TransactionManager.TopTransaction;try{using (var extensionDict = (DBDictionary)acTrans.GetObject(bref.ExtensionDictionary, OpenMode.ForRead)){if (extensionDict != null && extensionDict.Contains("ACAD_FILTER")){var filterDictId = extensionDict.GetAt("ACAD_FILTER");if (filterDictId.IsValid){using (var filterDict = (DBDictionary)acTrans.GetObject(filterDictId, OpenMode.ForRead)){ObjectId filterId;if (filterDict.Contains("SPATIAL") && (filterId = filterDict.GetAt("SPATIAL")).IsValid){using (var filter = (SpatialFilter)acTrans.GetObject(filterId, OpenMode.ForRead)){if (filter.Definition.Enabled){var pts = filter.Definition.GetPoints();var mat = bref.BlockTransform * (filter.OriginalInverseBlockTransform * filter.ClipSpaceToWorldCoordinateSystemTransform);//其他更多操作......}}}}}}}}catch{// ignore}return;}}
}

提取DWG图纸中的图元信息相关推荐

  1. 利用Python提取PDF文件中的文本信息

    如何利用Python提取PDF文件中的文本信息 日常工作中我们经常会用到pdf格式的文件,大多数情况下是浏览或者编辑pdf信息,但有时候需要提取pdf中的文本,如果是单个文件的话还可以通过复制粘贴来直 ...

  2. 如何使用python提取dwg文件中的坐标信息

    如果要使用 Python 提取 DWG 文件中的坐标信息,你需要使用专业的 CAD 读取工具,例如 Autodesk AutoCAD.Teigha File Converter 等.这些工具可以将 D ...

  3. 读取DWG文件中的文本信息(CAD2004)

    还是那句话,工作需要,不然是不会研究这个的.也许有的人会遇到跟我一样的问题,有兴趣看看,可以节约点时间.运行时要引用CAD2004的COM,这种读取文本的方式并不好,需要机器上装有AUTOCAD200 ...

  4. 怎样提取CAD图纸中的标注文字到文件

    我们在日常CAD制图的时候,常常需要对CAD图纸的标注文字进行检查,这时候若是每张图纸的每个标注文字都一个一个的检查会非 常的麻烦,耗费时间精力.若是能够一键提取CAD图纸中的标注文字到文件,就能够清 ...

  5. 提取FBX文件中mesh的信息

    Background 由于毕设需要,最近在做FBX文件的解析工作,即解析由3dsmax导出的fbx文件模型,并在openGL中重新显示,到目前为止已经断断续续做了半个月了.根据我前期的调研来看,FBX ...

  6. 将dwg图纸中的块切出来进行保存

    //切出块public void wblockEntity(){Document doc = Application.DocumentManager.MdiActiveDocument;Databas ...

  7. 提取PDF文件中的文本信息

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43527755 我们从网上下载的PDF文件有的是加密处理过的,无法复制其中的内容, ...

  8. python程序中想使用正则表达式_如何在python中使用正则表达式提取每行中需要的信息...

    展开全部 >>> s='''21899   6% S    15 173928K  38024K  fg app_108  com.tencent.qq 21899  34% S   ...

  9. 机械CAD标注技巧:如何在DWG图纸文件中添加序号?

    为了便于看图,做好生产准备工作.管理图样和零件或编制其它技术文件,经常需要在DWG图纸中对每个零件进行编号.那么如何使用浩辰机械CAD软件在DWG图纸文件中标注序号呢?接下来给大家分享一下CAD标注序 ...

最新文章

  1. 年仅 16 岁的黑客少年,竟是搅乱 IT 巨头的幕后主使?
  2. 单调递增最长子序列(南阳理工ACM)
  3. CMake使用介绍(1)
  4. .NET方法演化史 从Delegate到Lambda再到LINQ
  5. c++ sort 从大到小排序_C语言必学的12个排序算法:堆排序(第7篇)
  6. 顺序堆栈实现数制转换以十进制数转化为八进制数为例
  7. 【POJ 3281】Dining【最大匹配、拆点】
  8. Windows 8.1 安装Ruby on Rails手记
  9. 非平凡的函数依赖、平凡函数依赖
  10. python基础语法结构图(简单明了)
  11. Docker - 常见操作命令篇
  12. 宏观经济及贵金属年报:经济温和复苏,金银宽幅震荡-20210104.PDF
  13. python中in是什么意思中文_python中的in是什么意思
  14. arm汇编中DCB、DCW、DCD、DCQ指令
  15. 文档转换 云服务器,文档转换服务
  16. 微软TTS语音引擎编程入门
  17. Hugging face 的入门使用
  18. Impala 三大组件:Impala Daemon, Impala Statestore, Impala Catelog
  19. LeetCode算法 删除有序数组中的重复项 删除有序数组中的重复项|| C++
  20. c语言编码7 3循环码码组,信息论循环码报告

热门文章

  1. 赛后总结2018-08-25
  2. NOIP2018普及赛后总结
  3. 别做被大公司毁掉的年轻人
  4. 腾讯TDSQL全时态数据库系统论文入选VLDB
  5. 2019 年 (C题) 线路负载及故障检测装置
  6. tracepro应用实例详解_腾讯云服务器计费模式包年包月、按量计费和竞价实例选择建议...
  7. javascript js jsp接收servlet传送的数组ArrayList的一种简单的非ajax方法
  8. 面试官常问的设计模式及常用框架中设计模式的使用(一)
  9. 面试吹牛B,入职就倒霉了
  10. linux设备号——常见设备的主次设备号