使用 MFC 和“从 Typelib 添加类”向导访问 AutoCAD ActiveX Automation
此方法使用 MFC 和 Visual C++ 从 Typelib 向导添加类来读取 AutoCAD 类型库 (acax24enu.tlb)。示例程序使用 AutoCAD 的 COM ActiveX 自动化接口在模型空间中创建圆。以下各节提供了指导您完成程序设置和实施的过程:
设置新的 MFC 项目文件
要开始添加特定的 ObjectARX 功能,必须调整项目设置并添加样板代码。 添加 ObjectARX 兼容性将适当的值添加到项目属性中,以使项目生成为 ObjectARX 程序。确保 ObjectARX \inc 和 \lib 目录位于项目的搜索路径中。该程序需要链接到以下库: acad.lib
acdb24.lib
rxapi.lib
在项目的定义 (DEF) 文件中,将以下行添加到 EXPORTS 部分: acrxEntryPoint PRIVATE acrxGetApiVersion PRIVATE 打开AsdkMfcComSamp.cpp源文件并添加以下代码以使程序与 ObjectARX 兼容: #include <rxregsvc.h> #include <aced.h> #include <rxmfcapi.h> static void initApp() { acedRegCmds->addCommand( "ASDK_MFC_COM", "AsdkMfcComCircle", "MfcComCircle", ACRX_CMD_MODAL, addCircleThroughMfcCom); } static void unloadApp() { acedRegCmds->removeGroup("ASDK_MFC_COM"); } extern "C" AcRx::AppRetCode acrxEntryPoint (AcRx::AppMsgCode msg, void* appId) { switch(msg) { case AcRx::kInitAppMsg: acrxDynamicLinker->unlockApplication(appId); acrxDynamicLinker->registerAppMDIAware(appId); initApp(); break; case AcRx::kUnloadAppMsg: unloadApp(); break; default: break; } return AcRx::kRetOK; } 通过将以下代码添加到AsdkMfcComSamp.cpp源文件,在新的AutoCAD命令处理程序函数中存根: void addCircleThroughMfcCom() { } 为了在不显示链接器警告的情况下生成项目,必须使 MFC 知道调试项目链接到使用发行版 MFC 库生成的库。这是通过仅在编译器处理 MFC 头文件时挂起调试符号的定义来实现的。 从项目的调试版本中排除调试 MFC 代码在生成的 stdafx.h 文件中,在第一个 MFC include 语句(通常 ,#include <afxwin.h>)add the following code: #ifdef _DEBUG #undef _DEBUG #endif 从“生成”菜单中,选择“生成 AsdkMfcComSamp”以验证项目设置是否正确。 你的项目应该可以成功构建,但此时它不做任何事情。下一步是使用 ActiveX 自动化调用实现命令处理程序。 首先,您必须确定哪些接口是必需的。要向模型空间添加新圆,需要 、 和 接口。您可以使用 AutoCAD 类型库 acax24enu.tlb 获取这些接口的定义,如下一过程所示。IAcadApplicationIAcadDocumentIAcadModelSpace 导入 AutoCAD ActiveX 界面的步骤
现在,您已经导入了必要的接口,可以实现命令处理功能了。 实现 AutoCAD ActiveX Automation 调用的步骤
CAcadApplication IApp; CAcadDocument IDoc; CAcadModelSpace IMSpace; 使用 () 函数获取 AutoCAD 的 MFC 对象,并调用以下方法:acedGetAcadWinAppCWinAppGetIDispatch IDispatch *pDisp = acedGetAcadWinApp()-> GetIDispatch(TRUE); 获得对象后,将其附着到本地定义的对象,并确保AutoCAD可见:IDispatchCAcadApplication IApp.AttachDispatch(pDisp); IApp.put_Visible(true); 获取活动文档派单并将其附加到本地定义的对象:CAcadDocument pDisp = IApp.get_ActiveDocument(); IDoc.AttachDispatch(pDisp); 查询活动文档中的模型空间: pDisp = IDoc.get_ModelSpace(); IMSpace.AttachDispatch(pDisp); 圆需要中心点和半径。为了使此操作对不同的编程语言高效且透明,COM 接口使用 type 。一个点以 .添加以下代码以设置 a 并将其存储在 :VARIANTVARIANTSAFEARRAYSAFEARRAYVARIANT SAFEARRAYBOUND rgsaBound; rgsaBound.lLbound = 0L; rgsaBound.cElements = 3; SAFEARRAY* pStartPoint = NULL; pStartPoint = SafeArrayCreate(VT_R8, 1, &rgsaBound); // X value // long i = 0; double value = 4.0; SafeArrayPutElement(pStartPoint, &i, &value); // Y value // i++; value = 2.0; SafeArrayPutElement(pStartPoint, &i, &value); // Z value // i++; value = 0.0; SafeArrayPutElement(pStartPoint, &i, &value); VARIANT pt1; VariantInit(&pt1); V_VT(&pt1) = VT_ARRAY | VT_R8; V_ARRAY(&pt1) = pStartPoint; 从对象调用方法:AddCircleCAcadModelSpace IMSpace.AddCircle(pt1, 2.0); 下面是完成的函数,添加了清理代码和异常处理: void addCircleThroughMfcCom() { TRY { CAcadApplication IApp; CAcadDocument IDoc; CAcadModelSpace IMSpace; IDispatch *pDisp = acedGetAcadWinApp()-> GetIDispatch(TRUE); // AddRef is called on the // pointer IApp.AttachDispatch(pDisp); // does not call AddRef() IApp.put_Visible(true); pDisp = IApp.get_ActiveDocument(); // AddRef is called IDoc.AttachDispatch(pDisp); pDisp = IDoc.get_ModelSpace(); // AddRef is called IMSpace.AttachDispatch(pDisp); SAFEARRAYBOUND rgsaBound; rgsaBound.lLbound = 0L; rgsaBound.cElements = 3; SAFEARRAY* pStartPoint = NULL; pStartPoint = SafeArrayCreate(VT_R8, 1, &rgsaBound); // X value long i = 0; double value = 4.0; SafeArrayPutElement(pStartPoint, &i, &value); // Y value i++; value = 2.0; SafeArrayPutElement(pStartPoint, &i, &value); // Z value i++; value = 0.0; SafeArrayPutElement(pStartPoint, &i, &value); VARIANT pt1; VariantInit(&pt1); V_VT(&pt1) = VT_ARRAY | VT_R8; V_ARRAY(&pt1) = pStartPoint; IMSpace.AddCircle(pt1, 2.0); VariantClear(&pt1); // Release() is called implicitly on the local objects } CATCH(COleDispatchException,e) { e->ReportError(); e->Delete(); } END_CATCH; } 重新生成项目。 在AutoCAD中加载ARX文件,然后在命令行中输入MFCCOMCIRCLE以测试代码。 COM 程序员通常需要调用以前调用过的任何接口指针。在上面的示例中,MFC 通过内部调用其本地接口包装器对象来免除此责任。但是,您应该注意,在使用完 COM 接口指针后,需要释放它们。以下过程演示了显式释放接口指针的技术。Release()AddRef()Release() |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-3-5 17:46
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.