通过COM调用, 读取AutoCAD机械版Bom表

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

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值