使用AcDbGripOver规则创建自定义手柄
首先:大家好现在,我的问题是我是否可以为具有grip overrules的实体创建额外的Grip点。文档中说“它旨在作为一个基类,供想要改变给定AcDbEntity派生类的部分或全部行为的客户使用。”所以我尽我所能。
到目前为止我的代码- GripOverrule.h:
#include "dbentityoverrule.h"
#pragma once
class GripOverrule : public AcDbGripOverrule
{
public:
GripOverrule(void);
virtual ~GripOverrule(void);
virtual ACDB_PORT Acad::ErrorStatus getGripPoints(
const AcDbEntity* pSubject,
AcDbGripDataPtrArray& grips,
const double curViewUnitSize,
const int gripSize,
const AcGeVector3d& curViewDir,
const int bitflags
);
virtual bool isApplicable(const AcRxObject *pOverruledSubject) const;
};
GripOverrule.cpp代码1]
和main
static GripOverrule* gripOverrule = NULL;
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CArxResizeApp : public AcRxArxApp {
public:
CArxResizeApp () : AcRxArxApp () {}
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
// TODO: Load dependencies here
// You *must* call On_kInitAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
// TODO: Add your initialization code here
gripOverrule = new GripOverrule();
return (retCode) ;
}
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
// TODO: Add your code here
// You *must* call On_kUnloadAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
// TODO: Unload dependencies here
delete gripOverrule;
return (retCode) ;
}
virtual void RegisterServerComponents () {
}
static void ArxResize_doit(void)
{
MessageBox(NULL, (LPCWSTR)L"doit", (LPCWSTR)"", MB_OK);
GripOverrule::setIsOverruling(Adesk::kTrue);
GripOverrule::addOverrule(AcDbPolyline::desc(), gripOverrule, false);
}
static void ArxResize_undoit(void)
{
MessageBox(NULL, (LPCWSTR)L"undoit", (LPCWSTR)"", MB_OK);
GripOverrule::setIsOverruling(false);
GripOverrule::removeOverrule(AcDbPolyline::desc(), gripOverrule);
}
} ;
//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CArxResizeApp)
ACED_ARXCOMMAND_ENTRY_AUTO(CArxResizeApp, ArxResize, _doit, doit, ACRX_CMD_TRANSPARENT, NULL);
ACED_ARXCOMMAND_ENTRY_AUTO(CArxResizeApp, ArxResize, _undoit, undoit, ACRX_CMD_TRANSPARENT, NULL);
显示了夹点,但是当我尝试移动它时,立即出现访问冲突异常。试图读取的地址与通过
AcDbGripData::setAppData(void *)
存储的值相同,所以我认为我只是弄乱了指针,但我找到的关于
AcDbGripData
的示例使用了相同的方式(不过这些都是使用
AcDbEntity::getgripdates()
,而不是重写)。当我使用类而不是单值时,结果相同:
MyAppData* mad = new MyAppData();
mad->val = 123456;
g1->setAppData((void*)mad);
这会不会是因为没有设置
AcDbGripData::m _ pappdata class
而导致的samohow?
使用
AcDbGripOverrule::getgripfoints()
和
AcDbEntity::getgripfoints()
有区别吗?
或者最简单的方法是——有没有使用“抓地力否决”的例子?
或者我做错了什么?
谢谢。
**** Hidden Message *****
页:
[1]