乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 12|回复: 0

使用AcDbGripOver规则创建自定义手柄

[复制链接]

1

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
5
发表于 2011-5-14 10:53:04 | 显示全部楼层 |阅读模式
首先:大家好
现在,我的问题是我是否可以为具有grip overrules的实体创建额外的Grip点。文档中说“它旨在作为一个基类,供想要改变给定AcDbEntity派生类的部分或全部行为的客户使用。”所以我尽我所能。
到目前为止我的代码- GripOverrule.h:
  1. #include "dbentityoverrule.h"
  2. #pragma once
  3. class GripOverrule : public AcDbGripOverrule
  4. {
  5. public:
  6.         GripOverrule(void);
  7.         virtual ~GripOverrule(void);
  8.         virtual ACDB_PORT Acad::ErrorStatus getGripPoints(
  9.                 const AcDbEntity* pSubject,
  10.                 AcDbGripDataPtrArray& grips,
  11.                 const double curViewUnitSize,
  12.                 const int gripSize,
  13.                 const AcGeVector3d& curViewDir,
  14.                 const int bitflags
  15.         );
  16.         virtual bool isApplicable(const AcRxObject *pOverruledSubject) const;
  17. };

GripOverrule.cpp代码1]
和main
  1. static GripOverrule* gripOverrule = NULL;
  2. //-----------------------------------------------------------------------------
  3. //----- ObjectARX EntryPoint
  4. class CArxResizeApp : public AcRxArxApp {
  5. public:
  6.         CArxResizeApp () : AcRxArxApp () {}
  7.         virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  8.                 // TODO: Load dependencies here
  9.                 // You *must* call On_kInitAppMsg here
  10.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  11.                
  12.                 // TODO: Add your initialization code here
  13.                 gripOverrule = new GripOverrule();
  14.                 return (retCode) ;
  15.         }
  16.         virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  17.                 // TODO: Add your code here
  18.                 // You *must* call On_kUnloadAppMsg here
  19.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  20.                 // TODO: Unload dependencies here
  21.                 delete gripOverrule;
  22.                 return (retCode) ;
  23.         }
  24.         virtual void RegisterServerComponents () {
  25.         }
  26.         static void ArxResize_doit(void)
  27.         {
  28.                 MessageBox(NULL, (LPCWSTR)L"doit", (LPCWSTR)"", MB_OK);
  29.                 GripOverrule::setIsOverruling(Adesk::kTrue);
  30.                 GripOverrule::addOverrule(AcDbPolyline::desc(), gripOverrule, false);
  31.                
  32.         }
  33.         static void ArxResize_undoit(void)
  34.         {
  35.                 MessageBox(NULL, (LPCWSTR)L"undoit", (LPCWSTR)"", MB_OK);
  36.                 GripOverrule::setIsOverruling(false);
  37.                 GripOverrule::removeOverrule(AcDbPolyline::desc(), gripOverrule);
  38.         }
  39. } ;
  40. //-----------------------------------------------------------------------------
  41. IMPLEMENT_ARX_ENTRYPOINT(CArxResizeApp)
  42. ACED_ARXCOMMAND_ENTRY_AUTO(CArxResizeApp, ArxResize, _doit, doit, ACRX_CMD_TRANSPARENT, NULL);
  43. ACED_ARXCOMMAND_ENTRY_AUTO(CArxResizeApp, ArxResize, _undoit, undoit, ACRX_CMD_TRANSPARENT, NULL);

显示了夹点,但是当我尝试移动它时,立即出现访问冲突异常。试图读取的地址与通过
AcDbGripData::setAppData(void *)
存储的值相同,所以我认为我只是弄乱了指针,但我找到的关于
AcDbGripData
的示例使用了相同的方式(不过这些都是使用
AcDbEntity::getgripdates()
,而不是重写)。当我使用类而不是单值时,结果相同:
  1. MyAppData* mad = new MyAppData();
  2. mad->val = 123456;
  3. g1->setAppData((void*)mad);

这会不会是因为没有设置
AcDbGripData::m _ pappdata class
而导致的samohow?
使用
AcDbGripOverrule::getgripfoints()

AcDbEntity::getgripfoints()
有区别吗?
或者最简单的方法是——有没有使用“抓地力否决”的例子?
或者我做错了什么?
谢谢。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 16:51 , Processed in 0.269039 second(s), 54 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表