AutoCad提供COM调用互操作,但是通过VC调用的相关资料少的可怜,在网上基本查不到,去Autodesk官网上找居然也没有相应的说明,都得靠自个儿摸索呀。

第一步,建立一个VC的工程, 不多说了。

第二步,导入相关的AutoCAD相关的COM类型库,在工程文件加上电机右键,选择添加 -> 类 -> C++ -> VisulC++ -> MFC -> TypeLibvs 的MFC类, 如下图:

需要从三个类型库中导入, 下图中画框的部分

里面有很多个接口头文件,选中我们需要的几个头文件导入即可,或者全部选中导入。本次工作用到的只有如下的9个:

#include "CAcadApplication.h"
#include "CAcadDocument.h"
#include "CAcadModelSpace.h"
#include "CAcadDocuments.h"
#include "CAcadEntity.h"
#include "CMcadPartList.h"
#include "CMcadBOMItems.h"
#include "CMcadBOMItem.h"

#include "CMcadBOM.h"

第三部:建立AutoCAD的COM实例

CAcadApplication* m_pAcadApplication = NULL;BOOL OpenAutoCAD()
{BOOL bResult = FALSE;CString strId = _T("AutoCAD.Application");    // 默认版本CLSID clsid;HRESULT hRlt = ::CLSIDFromProgID(strId, &clsid);if (FAILED(hRlt)){AfxMessageBox(_T("当前机器上没有安装 AutoCAD 软件, 或没有指定的版本号。"));}ASSERT(NULL == m_pAcadApplication);m_pAcadApplication = new CAcadApplication();// 检查是否已经有ACAD进程打开了IUnknown* pUnknown = NULL;hRlt = ::GetActiveObject(clsid, NULL, &pUnknown);if (SUCCEEDED(hRlt) ) {hRlt = pUnknown->QueryInterface(IID_IDispatch, (LPVOID*)m_pAcadApplication);bResult = SUCCEEDED(hRlt);if (!bResult){pUnknown->Release();pUnknown = NULL;}}if (!bResult) {bResult = m_pAcadApplication->CreateDispatch(strId);}if (!bResult) {AfxMessageBox(_T("起动 AutoCAD 软件失败。"));}return bResult;
}

第四步:读入BOM数据

void ReadBomData()
{CString strFile;HMODULE hModule = ::GetModuleHandle(NULL);::GetModuleFileName(hModule, strFile.GetBuffer(MAX_PATH), MAX_PATH);strFile.ReleaseBuffer();int iPos = strFile.ReverseFind('\\');if (iPos > 1)strFile.Truncate(iPos);strFile += _T("\\读入Bom示例.dwg");if (OpenAutoCAD()){// 添加一个新的页面CAcadDocuments clDocs  = m_pAcadApplication->get_Documents();clDocs.Open(strFile, _variant_t(FALSE), COleVariant(_T("")));CAcadDocument m_pAcadDocument  = m_pAcadApplication->get_ActiveDocument();CAcadModelSpace m_pAcadModelSpace = m_pAcadDocument.get_ModelSpace();for (int i=0; i<m_pAcadModelSpace.get_Count(); i++){CAcadEntity clEntity = m_pAcadModelSpace.Item(_variant_t(i));CString str;if (clEntity.get_EntityName() == _T("AcmPartList")){CMcadPartList clPartList = clEntity.DetachDispatch();CMcadBOMItems clItems =  clPartList.get_ItemList();for (long j=0; j<clItems.get_Count(); j++){CMcadBOMItem clItem = clItems.Item(j);COleSafeArray arData = clItem.get_Data();long lBound1 = -1;long uBound1 = -1;long lBound2 = -1;long uBound2 = -1;arData.GetLBound(1, &lBound1);arData.GetUBound(1, &uBound1);arData.GetLBound(2, &lBound2);arData.GetUBound(2, &uBound2);BSTR *pbstr;arData.AccessData((LPVOID*)&pbstr);int idx = 0;for (int r=0; r<uBound2-lBound2+1; r++){str.Format(_T("%s\t"), clItem.get_ItemNumber());for (int c=0; c<uBound1-lBound1+1; c++){str.AppendFormat(_T("%s\t"), pbstr[idx++]);}str += '\n';OutputDebugString(str);}ASSERT(uBound1-lBound1+1 == 9);ASSERT(uBound2-lBound2+1 == 2);pbstr += 9;str.Format(_T("%s"), clItem.get_ItemNumber());m_lstBom.SetItemText(j, 0, str);m_lstBom.SetItemText(j, 1, pbstr[4]);m_lstBom.SetItemText(j, 2, pbstr[7]);m_lstBom.SetItemText(j, 3, pbstr[8]);m_lstBom.SetItemText(j, 4, pbstr[6]);m_lstBom.SetItemText(j, 5, pbstr[1]);m_lstBom.SetItemText(j, 6, pbstr[0]);m_lstBom.SetItemText(j, 7, pbstr[5]);arData.UnaccessData();}}}}delete m_pAcadApplication;
}
m_lstBom是个listCtrl控件

详细请参考示例代码: https://download.csdn.net/download/yzhuang/10449286

通过COM调用, 读取AutoCAD机械版Bom表相关推荐

  1. CAD Mechanical机械版安装失败,怎么完全彻底卸载删除清理干净CAD Mechanical机械版各种残留注册表和文件?【转载】

    CAD Mechanical机械版卸载工具,完全彻底删除干净CAD Mechanical机械版各种残留注册表和文件.CAD Mechanical机械版安装失败,怎么完全彻底删除清理干净CAD Mech ...

  2. 用VC读写机械版AutoCAD标题栏数据

    开发环境,VS2015 & AutoCAD Mechanical 2018 1.建立一个对话框工程,上面放一个列表控件和两个按钮. 2.从AutoCAD的类型库中导入相关头文件. 在解决方案管 ...

  3. AutoCAD Mechanical v2022.1.2 CAD机械版简体中文精简直装版

    AutoCAD软件是由美国欧特克有限公司(Autodesk)出品的一款自动计算机辅助设计软件,可以用于绘制二维制图和基本三维设计,通过它无需懂得编程,即可自动制图,因此它在全球广泛使用,可以用于土木建 ...

  4. 中望cad机械版2021中文版 知名的机械设计应用

    中望cad机械版2021是由广州中望龙腾软件股份有限公司全新打造的一款功能强大的CAD机械设计软件,是众多国内外机械设计师们首选的一款软件之一,它拥有人们最为熟悉的操作界面和绘图命令,用户无需改变以往 ...

  5. python处理cad_python3读取autocad图形文件.py实例

    废话不多说,看代码吧! ''' 待完善. 此代码实现了,根据标注文本的 属性,数值,位置,及 容差, 去判断 设计 和 实测两图中的同一位置的尺寸. 如果是同一位置的尺寸,则进行比较, 并把结果存成表 ...

  6. python读取cad_python3读取autocad图形文件.py实例

    废话不多说,看代码吧! ''' 待完善. 此代码实现了,根据标注文本的 属性,数值,位置,及 容差, 去判断 设计 和 实测两图中的同一位置的尺寸. 如果是同一位置的尺寸,则进行比较, 并把结果存成表 ...

  7. python dwg文件 读取_python3读取autocad图形文件.py实例

    废话不多说,看代码吧! ''' 待完善. 此代码实现了,根据标注文本的 属性,数值,位置,及 容差, 去判断 设计 和 实测两图中的同一位置的尺寸. 如果是同一位置的尺寸,则进行比较, 并把结果存成表 ...

  8. 计算机应用技术学autoCAD,21世纪高等学校计算机应用技术规划教材:AutoCAD机械设计项目式教程...

    21世纪高等学校计算机应用技术规划教材:AutoCAD机械设计项目式教程 语音 编辑 锁定 讨论 上传视频 <21世纪高等学校计算机应用技术规划教材AutoCAD机械设计项目式教程>是20 ...

  9. CAXA电子图板2013机械版下载及安装教程详解

    资源共享:https://download.csdn.net/download/wise18146705004/10755317,欢迎大家下载,保证全套有用.本人亲测 参考链接为:https://ji ...

最新文章

  1. 多键开关 android8.0,手机桌面多键开关(SwitchPro Widget )
  2. 【跃迁之路】【425天】刻意练习系列184—SQL(2018.04.06)
  3. BERT在小米NLP业务中的实战探索
  4. 实验协作的时候需要做什么?
  5. c/c++整理--c++面向对象(2)
  6. NVIDIA Jetson Nano B01 安装Ubuntu 18.04.3 LTS
  7. 全排列问题(洛谷P1706题题解,Java语言描述)
  8. 解决TypeError: string indices must be integers, not str
  9. 用Python给你的女神带上口罩~
  10. 原生JS实现简易转盘抽奖
  11. 初学Kotlin——在自定义View里的应用
  12. 移动支付到底有多美?
  13. linux 文件大小 自动变化 写,Linux下自动清理超过指定大小文件的方法
  14. 华为java安全编程规范考试答案
  15. 百度AI输入法发布全感官输入2.0版本,语音技术取得世界级突破...
  16. 蒙特卡罗模拟/蒙特卡罗方法
  17. 求最大李雅普诺夫指数(Largest Lyapunov Exponents,LLE)的 Rosenstein 算法
  18. 《五月集训》第二日——字符串
  19. springcloud中feign调用的权限认证
  20. java mocked,JMockit 中被 Mocked 的对象属性及方法的默认值

热门文章

  1. Visual C#实现Windows信使服务(转载)
  2. 美食杰----菜谱大全
  3. 计算机视觉与图形学-神经渲染专题-NeRF-SR
  4. 李开复:未来10年AI将取代人类?AI已让这7种职业加速消失
  5. 【校招VIP】数据库基础之sql五十道题
  6. 帮我写一篇感谢母校的小作文
  7. WPF Event事件
  8. CSS 实现日历样式
  9. HBase数据库默认配置参数
  10. Thinkvantage system update删除更新储存文件解决办法...