块参照的自定义插入点
除了自定义夹具外,动态块应用程序还可以为块定义多个插入点。这些插入点是在运行时通过协议扩展发现的。为了提供自定义插入点,应用程序从类派生协议反应器并实现该函数。当块插入到当前图形中时,AcRx 框架会在已注册的反应器上调用此函数。AcDbBlockInsertionPointsAcDbBlockInsertionPoints::getInsertionPoints()AcDbBlockInsertionPoints 如果反应器返回插入点数组和匹配的对齐向量数组,则框架会使用它们来补充模块的默认插入点。对于插入点数组中的每个条目,必须在对齐数组的相应索引处指定对齐向量。AutoCAD 使用对齐矢量在块插入到支持对齐方向的另一个对象附近时自动旋转块。有关实现自定义图元的对齐向量的相关信息,请参阅自定义图元的对齐定义。 以下示例为块定义额外的插入点,该块由一个正方形组成,该正方形的左下角位于 0,0,右上角位于 2,2。在函数中,应用程序检查要插入的块的名称。如果块的名称与应用程序定义的名称匹配,则返回备用插入点列表以及对齐向量列表。AutoCAD 使插入点可供用户在插入过程中循环使用。getInsertionPoints()getInsertionPoints()
#include "StdAfx.h" #include "AsdkInsertionPoints.h" #include "AcString.h" #define DYNBLKSAMP_BLOCKNAME "ASDK_CUSTOM_BLOCK" Acad::ErrorStatus AsdkInsertionPoints::getInsertionPoints ( const AcDbBlockTableRecord* pBlock, AcGePoint3dArray& insPts) { AcString sName; Acad::ErrorStatus es = pBlock->getName(sName); if (stricmp(sName, DYNBLKSAMP_BLOCKNAME) != 0) { return Acad::eNotApplicable; } insPts.append(AcGePoint3d(1.0, 0.0, 0.0)); //midpoint of side insPts.append(AcGePoint3d(1.0, -1.0, 0.0)); //buffered midpoint insPts.append(AcGePoint3d(2.0, 0.0, 0.0)); //endpoint insPts.append(AcGePoint3d(2.0, 1.0, 0.0)); //midpoint of side insPts.append(AcGePoint3d(3.0, 1.0, 0.0)); //buffered midpoint insPts.append(AcGePoint3d(2.0, 2.0, 0.0)); //endpoint insPts.append(AcGePoint3d(1.0, 2.0, 0.0)); //midpoint of side insPts.append(AcGePoint3d(1.0, 3.0, 0.0)); //buffered midpoint insPts.append(AcGePoint3d(0.0, 2.0, 0.0)); //endpoint insPts.append(AcGePoint3d(0.0, 1.0, 0.0)); //midpoint of side insPts.append(AcGePoint3d(-1.0, 1.0, 0.0)); //buffered midpoint alignmentDirections.append(AcGeVector3d(0.0, 1.0, 0.0)); alignmentDirections.append(AcGeVector3d(0.0, 1.0, 0.0)); alignmentDirections.append(AcGeVector3d(-1.0, 0.0, 0.0)); alignmentDirections.append(AcGeVector3d(-1.0, 0.0, 0.0)); alignmentDirections.append(AcGeVector3d(-1.0, 0.0, 0.0)); alignmentDirections.append(AcGeVector3d(0.0, -1.0, 0.0)); alignmentDirections.append(AcGeVector3d(0.0, -1.0, 0.0)); alignmentDirections.append(AcGeVector3d(0.0, -1.0, 0.0)); alignmentDirections.append(AcGeVector3d(1.0, 0.0, 0.0)); alignmentDirections.append(AcGeVector3d(1.0, 0.0, 0.0)); alignmentDirections.append(AcGeVector3d(1.0, 0.0, 0.0)); return Acad::eOk; } 若要注册该类,请使用 ACRX_PROTOCOL_REACTOR_LIST_AT 协议 reactor 宏来调用 ,如以下代码示例所示:AsdkInsertionPointsAcRxObject::addReactor() AsdkInsertionPoints* pPts = NULL; //... pPts = new AsdkInsertionPoints(); ACRX_PROTOCOL_REACTOR_LIST_AT(AcDbBlockTableRecord::desc(), CAsdkInsertionPoints::desc())->addReactor(pPts); 当应用程序卸载时,它会在函数期间移除反应器。以下代码示例显示了此内容:CAsdkInsertionPointsAcRx::kUnloadAppMsgacrxEntryPoint() case AcRx::kUnloadAppMsg: acedRegCmds->removeGroup("DYNBLKAPP"); if (pPts) { ACRX_PROTOCOL_REACTOR_LIST_AT(AcDbBlockTableRecord::desc(), AsdkInsertionPoints::desc())->removeReactor(pPts); delete pPts; } break; 父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-3-5 17:44
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.