Administrator
Administrator
发布于 2019-03-07 / 83 阅读 / 0 评论 / 0 点赞

subGetGripPoints、subMoveGripPointsAt与AcDbGripData类实现自定义夹点

AcDbGripData类:

这个类用来描述定义实体一些特定的夹点,它允许程序控制夹点的下列行为:

1.绘制夹点自定义的显示图形

2.当用户选择或略过夹点时执行自定义的一些操作

3.控制专用于夹点的右击菜单

4.接收关于夹点编辑操作的通知信息细节

通过以上定义我们可以发现,自定义实体通过AcDbGripData类可以实现很多专用的特性操作。

当我们实现一个自定义实体对象的getGripPoints()函数时, 通过 AcDbGripData 对象来填写AcDbGripDataArray 参数,每个夹点对应一个AcDbGripData 对象。

AcDbGripData 对象包含两个成员变量来定义夹点,一个实际3d点对象代表夹点的位置,以及一个自定义对象指定的指针结构对象来区分夹点。这两个成员变量 必须同时定义返回。

AcDbGripData 对象同时还可以包含一系列回调函数指针(可选),应该就是钩子函数,当夹点编辑或其他操作时由程序来调用这个回调函数实现自定义实体的一些自定义行为。当然如果没有这个需求,指针可以为NULL。

AcDbGripData对象还包含了一个可选的位码来控制当夹点进行拖拽操作时夹点的外观,这些位置应该通过或操作来合并。

AcDbGripData 对象有其他的成员变量,以下是AcDbGripData对象的成员变量说明:

1.对应的夹点位置

AcGePoint3d         m_gripPt;

2.设置夹点编辑操作时,拖动的基点

AcGePoint3d*        m_pAltBasePt;

3.自定义数据的指针,用来保存用户自定义数据的地址

void*               m_pAppData;

4.夹点被拉伸时的回调函数,在这里,返回不同的值,将导致夹点进行不同的操作,比如返回eGetNewGripPoints将导致重新调用实体的getGripPoints ,typedef AcDbGripOperations::ReturnValue (*GripOperationPtr)(AcDbGripData* pThis,    const AcDbObjectId entId, int contextFlags);

GripOperationPtr    m_pHotGripFunc;

5.鼠标放在夹点上时的回调函数,这里,返回不同的值,将导致夹点进行不同的操作,比如返回eRedrawGrip将导致重新调用夹点的WORLDDRAW和VIEWPORTDRAW回调函数typedef AcDbGripOperations::ReturnValue (*GripOperationPtr)(AcDbGripData* pThis,    const AcDbObjectId entId, int contextFlags);

GripOperationPtr    m_pHoverFunc;

6.当选中一个夹点,点击右键时,触发,在这里,你可以给定一个MENU的句柄,使其在不同的夹点上右击,弹出不同的菜单typedef AcDbGripOperations::ReturnValue (*GripRtClkHandler)(AcDbGripDataArray& hotGrips,    const AcDbObjectIdArray ents, ACHAR * menuName, HMENU& menu,    ContextMenuItemIndexPtr& cb);

GripRtClkHandler    m_pRtClk;

7.夹点WorldDraw回调函数,像十字型、三角型等不同类型的夹点形状,可以在这里定义(默认的为方型)typedef bool (*GripWorldDrawPtr)(AcDbGripData* pThis, AcGiWorldDraw* pWd,    const AcDbObjectId& entId, AcDbGripOperations::DrawType type,    AcGePoint3d* imageGripPoint, double dGripSize);

GripWorldDrawPtr    m_pWorldDraw;

8.夹点ViewportDraw回调函数typedef void (*GripViewportDrawPtr)(AcDbGripData* pThis, AcGiViewportDraw* pWd,    const AcDbObjectId& entId, AcDbGripOperations::DrawType type,    AcGePoint3d* imageGripPoint, int gripSize);

GripViewportDrawPtr m_pViewportDraw;

9.夹点操作时的回调函数,判断当前是对夹点进行什么操作,返回操作状态

typedef void (*GripOpStatusPtr)(AcDbGripData* pThis, const AcDbObjectId entId,    AcDbGripOperations::GripStatus stat);

GripOpStatusPtr     m_pGripOpStatFunc;

10.夹点提示回调函数,像那什么按CTRL切换的,就是在这里设置的提示语

typedef const ACHAR (GripToolTipPtr)(AcDbGripData* pThis);

GripToolTipPtr      m_pToolTipFunc;

11.鼠标放在夹点的标注回调函数,在这里也可以定义标注,但一般与被拉伸时定义成一样的typedef void (*GripDimensionPtr)(AcDbGripData* pThis, const AcDbObjectId entId,    double dimScale, AcDbDimDataPtrArray dimData);

GripDimensionPtr    m_pHoverDimensionFunc;

12.夹点被拉伸的标注回调函数,一般的动态标注在这里定义。

typedef void (*GripDimensionPtr)(AcDbGripData* pThis, const AcDbObjectId entId,    double dimScale, AcDbDimDataPtrArray dimData);

GripDimensionPtr    m_pHotGripDimensionFunc;

13.用来设置夹点的一些动作特征标志,比如可以设置夹点被拉伸时,是否出现橡皮条、是否有关键字提示等

unsigned int        m_bitFlags;

14.在夹点编辑状态输入一个三维点时触发,从而可以做到控制用户的操作,其中的这些参数有点类似于CAD的用户输入点过滤或监视类的参数typedef AcDbGripOperations::ReturnValue (*GripInputPointPtr)(

AcDbGripData* pThis, const AcDbObjectId entId, bool changedPoint,

AcGePoint3d newPoint, const AcGiViewport viewContext,

const AcDbObjectId viewportId, bool pointComputed, int history,

const AcGePoint3d lastPoint, const AcGePoint3d rawPoint,

const AcGePoint3d grippedPoint, const AcGePoint3d cartesianSnappedPoint,

const AcGePoint3d osnappedPoint, AcDb::OsnapMask osnapMask,

const AcArray AcDbCustomOsnapMode* customOsnapModes,

AcDb::OsnapMask osnapOverrides,

const AcArray AcDbCustomOsnapMode* customOsnapOverrides,

const AcArray AcDbObjectId pickedEntities,

const AcArray AcDbObjectIdArray,

AcArrayObjectCopyReallocator< AcDbObjectIdArray > nestedPickedEntities,

const AcArray<Adesk::GsMarker> gsSelectionMark,

const AcArray<AcDbObjectId> keyPointEntities,

const AcArray<AcDbObjectIdArray>,

AcArrayObjectCopyReallocator<AcDbObjectIdArray> nestedKeyPointEntities,

const AcArray<Adesk::GsMarker> keyPointGsSelectionMark,

const AcArray<AcGeCurve3d*> alignmentPaths, const AcGePoint3d computedPoint);

GripInputPointPtr   m_pInputPointFunc;


评论