CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2023 开发者帮助

技巧和窍门

2024-5-18 19:02| 发布者: admin| 查看: 113| 评论: 0|原作者: admin|来自: AutoCAD

技巧和窍门

本主题概述了在编写 ObjectARX 应用程序时应注意的事项。

开发人员应选择退出客户参与计划

开发人员应选择退出客户参与计划,以防止在从调试器运行 AutoCAD 时导致此类崩溃。

通过网络使用 .NET 程序集文件

默认情况下,不能通过网络使用 .NET 程序集文件。只有在授予特殊权限的情况下,才能通过网络将其加载到 AutoCAD 中。

递增的 AutoCAD 注册表号

对于基于 AutoCAD 的产品和 RealDWG 主机应用程序的每个新版本,注册表编号都将递增,以确保继续提供并行安装支持。仅当引入与先前版本不兼容的 API 时,主内部版本号才会递增。当该版本与以前的版本二进制兼容时,次要内部版本号将递增。

ObjectARX/ObjectDBX 加载机制仅检查与主机应用程序版本匹配的注册表部分。它不会在多个位置查看。因此,如果您的产品需要支持多个不同版本的需求加载,则必须将需求加载条目添加到每个版本的注册表部分。

理想情况下,注册表号的更改不应对应用程序的代码产生影响,因为此编号不应在任何地方进行硬编码。相反,如果应用程序需要在运行时知道正确的注册表项,则应使用相应的 API。ObjectARX 应用程序(换言之,扩展名为 .arx 的应用程序)应使用 and 函数或全局函数。ObjectDBX 模块(换句话说,扩展名为 .dbx 的模块)应使用全局函数来获取正确的注册表项。这些函数始终返回主机应用程序版本的正确注册表项。AcDbHostApplicationServices::getUserProductRegistryRootKey()AcDbHostApplicationServices::getMachineProductRegistryRootKey()acrxProductKey()acrxObjectDBXRegistryKey()

AcDbBlockReference::appendAttribute()在派生类中不受支持

派生自 的类不能追加属性。这是设计使然。对 -派生类的对象的调用将导致错误。AcDbBlockReferenceappendAttribute()AcDbBlockReferenceeIllegalEntityType

注册工作空间和 CUI 对话框的类

派生自 的对象(包括调色板集和工具调色板集)可以编写注册表项,以确保对工作区进行安全操作,并使它们显示在“自定义用户界面”对话框中。有关更多信息,请参阅《ObjectARX 开发人员指南》中的“注册派生自 CAdUiDockControlBar 的对象”。CAdUiDockControlBar

自定义对象的所有权层次结构

在自定义对象的所有权层次结构中,请务必调用以正确建立每个对象的所有者后台指针。AutoCAD/ObjectDBX 的未来版本可能会停止在增量存储中写入具有 NULL 所有者 ID 的对象。setOwnerId()

发布对象启用程序

ADN 网站不再包含对象启用器部分。开发人员应该在他们自己的网站上发布他们的对象启用器,并让客户知道它们在哪里可用。

维度文本和定义点行为

尺寸定义点和文本位置均受尺寸布局要求的约束。通过以下任何功能,可以更改传入的位置,以适应尺寸的布局需求,由尺寸类型和当前 dimvar 设置确定。

AcDbDimension::setTextPosition()
AcDbAlignedDimension::setDimLinePoint()
AcDbRotatedDimension::setDimLinePoint()
AcDb3PointAngularDimension::setArcPoint()
AcDb2LineAngularDimension::setArcPoint()

例如,当 DIMFIT = 3 时,对于定义点为径向线与 X 轴成 15 度角的径向尺寸,可以设置文本位置的 X 坐标,但始终调整 Y 坐标以沿尺寸的径向线定位文本。

kLoadDwgMsg 和 acedCommand()

它们在两个基本上下文中工作:在 RQXLOAD 和 RQSUBR 请求代码上操作时。但是,在 ObjectARX 中,它不适用于 ObjectARX 应用程序消息,该消息是 RQXLOAD 的 ObjectARX 等效项。它适用于消息,这相当于 RQSUBR。acedCommand()AcRx::kLoadDwgMsgAcRx::kInvkSubr

对于许多应用程序来说,在每个图形编辑会话开始时执行一些 AutoCAD 命令非常重要。这可以通过对 AutoLISP 表达式进行排队来实现,包括在执行后使用函数 using ,以便在编辑会话初始化期间执行。(command)ads_queueexpr()(s::startup)

请注意,在调用 期间不会执行排队的表达式。它们将在应用程序从其消息调用返回后发生。ads_queueexpr()kLoadDwgMsgacrxEntryPoint()

使用 时,输入的字符串必须完全展开,并用外括号括起来。以前作为链传入的任何内容都必须转换为 ASCII 才能使用此机制。ads_queueexpr()resbuf

从回调多次调用是完全可以接受的。他们按照呼叫的顺序排队。ads_queueexpr()kLoadDwgMsg

请勿在任何其他上下文中使用。这样做将产生不可预知的结果,甚至可能具有破坏性,因为在活动的 AutoLISP 求值、MENU 项和/或 SCRIPT 执行全部处于静止状态之前,可能不会查看队列。请谨慎使用此功能,因为一旦可以实现原始设计,它就会被删除。ads_queueexpr()

不要 #define ACAD_OBJID_INLINE_INTERNAL

头文件 acdb.hdbidar.h 包含一个部分,该部分选择基于 的标头。应用程序不应使用此值。轻量级 ID 类型有并行标题,其中一些仅供 AutoCAD 内部使用。尝试编译的应用程序将无法成功编译。#ifdef#includeACAD_OBJID_INLINE_INTERNAL#define#defineACAD_OBJID_INLINE_INTERNAL

释放作为非常量指针返回的字符串

调用返回非常量字符串指针的方法(例如,),应释放返回的字符串占用的内存。例如:AcDbSymbolTable::getName(char&* pName)

// The getName() call should be followed by a call to
acutDelString(pLtName);pLtTableRcd->getName(pLtName);

// ... other code
acutDelString(pLtName);

请注意,某些 ObjectARX 示例文件缺少释放内存的调用,因此它们会出现内存泄漏。在自己的代码中使用示例时,请确保正确释放内存。

ObjectARX 不支持多线程编程

如果在应用程序中生成多个线程,请确保一次调用 ObjectARX 系统中的任何内容的线程不超过一个。

在中止事务之前删除选择

事务、撤消命令和对象特性工具栏 (OPT) 之间的某些交互可能会使 AutoCAD 处于不稳定状态。为避免此类情况,ObjectARX 应用程序应始终在中止事务之前删除 pickfirst 选择,如下所示:

acedSSSetFirst(NULL, NULL);
actrTransactionManager->abortTransaction();

使用 ObjectARX 的 MFC PropertySheets

选项卡式对话框应使用 acui24.lib MFC 扩展 DLL 库中定义的基类。不要使用 MFC 类和 .请改用 和 。有关详细信息,请参阅《ObjectARX 开发人员指南》和《ObjectARX 参考》。CPropertySheetCPropertyPageCAcUiTabMainDialogCAcUiTabChildDialog

使用 on 类定义是危险的__declspec(dllimport)

在导出到其他应用程序的类上使用构造可能会导致 vtables 驻留在实例化该类的所有 DLL 中。如果卸载了这些实例化 DLL 中的任何一个,则该 DLL 创建的所有实例都将无效。随后尝试访问这些无效实例上的虚拟功能会触发内存故障。__declspec(dllimport)

因此,将此指令用于派生自 的类的唯一安全方法是强制要求任何实例化类的应用程序都不能卸载。若要强制执行此授权,必须清晰、直观地记录它,或者提供驻留在无法卸载的 DLL 或应用程序中的伪构造函数。最好的策略是完全避免使用这种结构。AcDbObject

如果类导出静态数据成员,则此警告的唯一例外情况适用。在这种情况下,必须仅在该数据成员上使用,但应避免将构造应用于整个类。不建议导出静态数据成员。__declspec(dllimport)

此警告仅适用于 。它不适用于 。__declspec(dllimport)__declspec(dllexport)

推荐用法如下:

#pragma warning( disable: 4275 4251 )
#ifdef POLYSAMP
#define DLLIMPEXP __declspec( dllexport )
#else
#define DLLIMPEXP
#endif

// The "DLLIMPEXP" is only required for exporting a poly API or using
// the exported API.  It is not necessary for any custom classes that
// are not exporting an API of their own.
//
class DLLIMPEXP AsdkPoly: public  AcDbCurve
{
public:
    ACRX_DECLARE_MEMBERS(AsdkPoly);
//*****************************************************************
// Constructors and destructor
//*****************************************************************

在调试配置中构建 ObjectARX 应用程序时的 PDB 警告

在构建 ObjectARX 应用程序的调试版本时,您可能会看到类似于以下内容LNK4099链接器警告:

rxapi.lib(libinit.obj):警告LNK4099:PDB“acdbhdr.pdb”未找到“..\..\..\lib\rxapi.lib“或”C:\ObjectARX\samples\editor\mfcsamps\dynamic_dg\Debug\acdbhdr.pdb“;链接对象,就好像没有调试信息一样

出现此警告的原因是 ObjectARX 库是使用 ObjectARX SDK 未附带的 PDB 文件构建的。忽略这些警告是安全的。

标准C++标头和_DEBUG预处理器符号

如果在定义_DEBUG预处理器符号时包含任何标准C++标头,则通过编译指示强制调试C++运行时。(在 Visual C++ 中查看 use_ansi.h。您不希望在 ObjectARX 应用程序中使用调试 C++ 运行时。

若要避免这种情况,请应用以下解决方法:

#ifdef _DEBUG
#undef _DEBUG
#endif

不必要的需求加载活动

AutoCAD 有时可能会要求加载定义类的应用程序,即使正在加载的 DWG 或 DXF 文件中没有该类的对象也是如此。如果您注意到这一点,并希望防止不必要的 .dbx.arx 应用程序需求加载,只需将图形保存为 DWG 或 DXF 格式,然后重新打开文件即可。此过程可以在有或没有可用应用程序的情况下完成。

在重新加载文件之前,使用完全打开,然后完全保存。

AcGiGeometry::pline()功能支持代理图形

在以前的版本中,代理图形 DWG 数据结构无法处理折线(pline)基元的复杂性。自 AutoCAD 2004 起,此限制已得到解决。因此,该函数现在支持代理图形上下文。AcGiGeometry::pline()


路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1   苏公网安备32011402011833)

GMT+8, 2025-3-5 15:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部