|
楼主 |
发表于 2024-3-13 23:01:51
|
显示全部楼层
- 类文件修改
- CDatabaseReactor.h
- class /*DLLIMPEXP*/ CDatabaseReactor : public AcDbDatabaseReactor {
- ...
- public:
- ...
- // 重写基类AcDbDatabaseReactor 相应方法
- virtual void objectAppended(const AcDbDatabase* dwg, const AcDbObject* dbObj);
- virtual void objectModified(const AcDbDatabase* dwg, const AcDbObject* dbObj);
- virtual void objectErased(const AcDbDatabase* dwg, const AcDbObject* dbObj,
- Adesk::Boolean bErased);
- } ;
- ...
-
- CDatabaseReactor.cpp
- #include "StdAfx.h"
- #include "CDatabaseReactor.h"
- // 定义全局变量
- class CDatabaseReactor;
- CDatabaseReactor *pDRec = NULL;
- ...
- void printObj(const AcDbObject* pObj)
- { // 纠错:防止传入空对象
- if (pObj == NULL)
- {
- acutPrintf(采用T("(NULL)"));
- return;
- }
- // 句柄:用于获取对象句柄对象
- AcDbHandle objHand;
- // 句柄名称:用于获取对象句柄名称字符串
- ACHAR handbuf[128];
- // 获取 句柄对象 的方法
- pObj->getAcDbHandle(objHand);
- // 获取 对象句柄 名称字符串 方法:通过句柄对象
- objHand.getIntoAsciiBuffer(handbuf, 128);
- // s表示字符串,l表示数据为长整型,x表示输出十六进制
- acutPrintf(采用T("\n (类名:%s, 句柄:%s, 对象id:%lx)"),
- // 类名
- pObj->isA()->name(),
- // 句柄对象 名称
- handbuf,
- // asOldId方法:将对象id转换为长整型 long 格式
- pObj->objectId().asOldId());
- }
- // 新增实体后,反应器进行的操作
- void CDatabaseReactor::objectAppended(const AcDbDatabase* dwg,
- const AcDbObject* dbObj)
- {
- acutPrintf(采用T("\n调用反应器 对象新增 方法"));
- printObj(dbObj);
- }
- // 修改实体后,反应器进行的操作
- void CDatabaseReactor::objectModified(const AcDbDatabase* dwg,
- const AcDbObject* dbObj)
- {
- acutPrintf(采用T("\n调用反应器 对象修改 方法"));
- printObj(dbObj);
- }
- // 删除实体后,反应器进行的操作
- void CDatabaseReactor::objectErased(const AcDbDatabase* dwg,
- const AcDbObject* dbObj,
- Adesk::Boolean bErased)
- {
- if (bErased)
- {
- acutPrintf(采用T("\n调用反应器 对象删除 方法"));
- printObj(dbObj);
- }
- else
- {
- acutPrintf(采用T("\n调用反应器 对象删除 方法(恢复删除)"));
- printObj(dbObj);
- }
- }
-
- 2.3 注册卸载反应器
- Commands.h
- #include "stdafx.h"
- void AddCommands();
- void addReactor();
- void removeReactor();
-
- Commands.cpp
- #include "stdafx.h"
- #include "Commands.h"
- #include "Editor.h"
- #include "CDatabaseReactor.h"
- // 声明全局变量pDRec:数据库反应器指针
- extern CDatabaseReactor *pDRec;
- void AddCommands()
- {
- Editor::AddCommand(L"c-addReactor", ACRX采用CMD采用MODAL, addReactor);
- Editor::AddCommand(L"c-removeReactor", ACRX采用CMD采用MODAL, removeReactor);
- }
- void addReactor()
- {
- if (pDRec == NULL)
- {
- pDRec = new CDatabaseReactor();
- }
- // 在当前活动数据库中添加 数据库反应器
- acdbHostApplicationServices()->workingDatabase()->addReactor(pDRec);
- acutPrintf(采用T("\n反应器已经添加!"));
- }
- void removeReactor()
- {
- if (pDRec)
- {
- // 在当前活动数据库中删除 数据库反应器
- acdbHostApplicationServices()->workingDatabase()->removeReactor(pDRec);
- // 释放内存
- delete pDRec;
- // 重置指针
- pDRec = NULL;
- }
- acutPrintf(采用T("\n数据库反应器已经删除!"));
- }
-
- 遇到问题:拉伸操作,CAD也会调用反应器删除、修改函数
-
复制代码 |
|