找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 177|回复: 1

objectarx 常用反应器种类

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-13 23:01:02 | 显示全部楼层 |阅读模式
常用反应器种类
类型        派生        示例
数据库反应器        派生于AcDbDatabaseReactor,负责接收与数据库状态相关的事件        对象被加入、删除、修改到数据库中,这种反应器的通知发送者是数据库,此种反应器被加入到数据库的反应器列表中
对象反应器(自定义类中详述)        派生于AcDbObjectReactor,
负责接收对象(object)级别的事件        复制、删除、修改一个对象,它也可以被加入到任何AcDbObject对象的反应器列表中
编辑反应器        派生于AcEditorReactor,
负责接收AutoCAD的特殊事件        例如加载或卸载一张图,开始或结束一个命令以及其他类型的用户交互。AcEditor对象是AcEditorReactor反应器的唯一通知发送者
配置文件管理器反应器        派生于AcApProfileManagerReactor,负责接收配置文件操作的事件        例如对配置文件的增删改查
输入上下文反应器        派生于AcEdInputContextReactor,负责接收用户输入动作的事件        例如:用户在屏幕上点选、获取角度、获取距离等
反应器使用原则
不要依赖反应器激活的顺序
不要依赖通知间操作的顺序:通知只负责告知有无,不负责先后
不要在通知回调函数中使用任何用户交互函数
临时反应器
使用过程:从ARX内建的一系列反应器类中挑选一个合适的类派生,实现相关函数并注册反应器。
特点:非数据库对象,由开发者负责注册、卸载
包含:数据库反应器、编辑反应器
永久反应器
特点:永久反应器由AutoCAD负责删除
包含:对象反应器

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-3-13 23:01:51 | 显示全部楼层
  1. 类文件修改
  2. CDatabaseReactor.h
  3. class /*DLLIMPEXP*/ CDatabaseReactor : public AcDbDatabaseReactor {
  4.         ...       
  5. public:
  6.         ...       
  7.         // 重写基类AcDbDatabaseReactor 相应方法
  8.         virtual void objectAppended(const AcDbDatabase* dwg, const AcDbObject* dbObj);
  9.         virtual void objectModified(const AcDbDatabase* dwg, const AcDbObject* dbObj);
  10.         virtual void objectErased(const AcDbDatabase* dwg, const AcDbObject* dbObj,
  11.                                                            Adesk::Boolean bErased);
  12. } ;
  13. ...
  14. CDatabaseReactor.cpp
  15. #include "StdAfx.h"
  16. #include "CDatabaseReactor.h"
  17. // 定义全局变量
  18. class CDatabaseReactor;
  19. CDatabaseReactor *pDRec = NULL;
  20. ...       
  21. void printObj(const AcDbObject* pObj)
  22. {        // 纠错:防止传入空对象
  23.         if (pObj == NULL)
  24.         {
  25.                 acutPrintf(采用T("(NULL)"));
  26.                 return;
  27.         }
  28.         // 句柄:用于获取对象句柄对象
  29.         AcDbHandle objHand;
  30.         // 句柄名称:用于获取对象句柄名称字符串
  31.         ACHAR handbuf[128];
  32.         // 获取 句柄对象 的方法
  33.         pObj->getAcDbHandle(objHand);
  34.         // 获取 对象句柄 名称字符串 方法:通过句柄对象
  35.         objHand.getIntoAsciiBuffer(handbuf, 128);
  36.         // s表示字符串,l表示数据为长整型,x表示输出十六进制
  37.         acutPrintf(采用T("\n (类名:%s, 句柄:%s, 对象id:%lx)"),
  38.                            // 类名
  39.                            pObj->isA()->name(),
  40.                            // 句柄对象 名称
  41.                            handbuf,
  42.                            // asOldId方法:将对象id转换为长整型 long 格式
  43.                            pObj->objectId().asOldId());
  44. }
  45. // 新增实体后,反应器进行的操作
  46. void CDatabaseReactor::objectAppended(const AcDbDatabase* dwg,
  47.                                                                           const AcDbObject* dbObj)
  48. {
  49.         acutPrintf(采用T("\n调用反应器 对象新增 方法"));
  50.         printObj(dbObj);
  51. }
  52. // 修改实体后,反应器进行的操作
  53. void CDatabaseReactor::objectModified(const AcDbDatabase* dwg,
  54.                                                                           const AcDbObject* dbObj)
  55. {
  56.         acutPrintf(采用T("\n调用反应器 对象修改 方法"));
  57.         printObj(dbObj);
  58. }
  59. // 删除实体后,反应器进行的操作
  60. void CDatabaseReactor::objectErased(const AcDbDatabase* dwg,
  61.                                                                     const AcDbObject* dbObj,
  62. Adesk::Boolean bErased)
  63. {
  64.         if (bErased)
  65.         {
  66.                 acutPrintf(采用T("\n调用反应器 对象删除 方法"));
  67.                 printObj(dbObj);
  68.         }
  69.         else
  70.         {
  71.                 acutPrintf(采用T("\n调用反应器 对象删除 方法(恢复删除)"));
  72.                 printObj(dbObj);
  73.         }
  74. }
  75. 2.3 注册卸载反应器
  76. Commands.h
  77. #include "stdafx.h"
  78. void AddCommands();
  79. void addReactor();
  80. void removeReactor();
  81. Commands.cpp
  82. #include "stdafx.h"
  83. #include "Commands.h"
  84. #include "Editor.h"
  85. #include "CDatabaseReactor.h"
  86. // 声明全局变量pDRec:数据库反应器指针
  87. extern CDatabaseReactor *pDRec;
  88. void AddCommands()
  89. {       
  90.         Editor::AddCommand(L"c-addReactor", ACRX采用CMD采用MODAL, addReactor);
  91.         Editor::AddCommand(L"c-removeReactor", ACRX采用CMD采用MODAL, removeReactor);
  92. }
  93. void addReactor()
  94. {
  95.         if (pDRec == NULL)
  96.         {                     
  97.                 pDRec = new CDatabaseReactor();
  98.         }
  99.         // 在当前活动数据库中添加 数据库反应器
  100.         acdbHostApplicationServices()->workingDatabase()->addReactor(pDRec);
  101.         acutPrintf(采用T("\n反应器已经添加!"));
  102. }
  103. void removeReactor()
  104. {
  105.         if (pDRec)
  106.         {
  107.                 // 在当前活动数据库中删除 数据库反应器
  108.                 acdbHostApplicationServices()->workingDatabase()->removeReactor(pDRec);
  109.                 // 释放内存
  110.                 delete pDRec;
  111.                 // 重置指针
  112.                 pDRec = NULL;
  113.         }
  114.         acutPrintf(采用T("\n数据库反应器已经删除!"));
  115. }
  116. 遇到问题:拉伸操作,CAD也会调用反应器删除、修改函数
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 23:17 , Processed in 0.132220 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表