天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 169|回复: 1

objectarx 常用反应器种类

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

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

     

     

     

     

    objectarx 常用反应器种类
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
     楼主| 发表于 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也会调用反应器删除、修改函数
    复制代码

     

     

     

     

    objectarx 常用反应器种类
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 08:02 , Processed in 0.188924 second(s), 27 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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