开发环境,VS2015 & AutoCAD Mechanical 2018
1、建立一个对话框工程,上面放一个列表控件和两个按钮。
2、从AutoCAD的类型库中导入相关头文件。
在解决方案管理器中的工程标题上右键菜单,选添加,选类,在新建类的界面上选MFC,再选TypeLib中的MFC类
点击添加按钮,弹出类型库向导对话框,来源选文件:
从 C:\Program Files\Common Files\Autodesk Shared\acax22enu.tlb 类型库中导入如下9个头文件:
CAcadApplication.h
CAcadDocument.h
CAcadModelSpace.h
CAcadDocuments.h
CAcadEntity.h
CAcadBlock.h
CAcadBlockReference.h
CAcadAttribute.h
CAcadAttributeReference.h
注意:AutoCAD的版本不同,类型库文件路径和文件名也可能不同。
3、建立COM调用
先要打开AutoCAD进程
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);
if(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)
m_pAcadApplication->put_Visible(TRUE);
else
AfxMessageBox(_T("起动 AutoCAD 软件失败。"));
return bResult;
}
读写数据:
void OnBnClickedOk()
{
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("\\读写标题栏示例.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 = clEntity.get_ObjectName();
OutputDebugString(str);
if (str == _T("AcDbBlockReference"))
{
CAcadBlockReference clBlock = clEntity;
str = clBlock.get_Name();
OutputDebugString(str);
if (str.Find(_T("WSACAD_TILE")) == 0)
{
COleSafeArray arAttributes = clBlock.GetAttributes();
long lBound1 = -1;
long uBound1 = -1;
arAttributes.GetLBound(1, &lBound1);
arAttributes.GetUBound(1, &uBound1);
IDispatch** ppAttrObj = (IDispatch**)((*arAttributes.parray).pvData);
for (int i= lBound1; i<= uBound1; i++)
{
CAcadAttributeReference clAttribute = (LPDISPATCH)(ppAttrObj[i]);
LV_ITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.iItem = i;
lvi.iSubItem = 0;
lvi.pszText = _T("");
lvi.iImage = 0;
lvi.stateMask = LVIS_STATEIMAGEMASK;
lvi.state = INDEXTOSTATEIMAGEMASK(1);
m_lstBom.InsertItem(&lvi);
// 显示原值
m_lstBom.SetItemText(i, 0, clAttribute.get_TagString());
m_lstBom.SetItemText(i, 1, clAttribute.get_TextString());
// 设置新值
str.Format(_T("%2d"), i);
clAttribute.put_TextString(str);
}
}
}
}
m_pAcadApplication->Update();
}
delete m_pAcadApplication;
m_pAcadApplication = NULL;
}
4、运行结果
上述代码可以正常读写机械版的标题栏了。
详细代码在 https://download.csdn.net/download/yzhuang/12593234 处下载