ahojko 发表于 2011-5-14 10:53:04

使用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]
查看完整版本: 使用AcDbGripOver规则创建自定义手柄