admin管理员组文章数量:1604460
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/download/yzhuang/10449286
版权声明:本文标题:通过COM调用, 读取AutoCAD机械版Bom表 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1728461743a1159029.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论