找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 412|回复: 5

[ARX函数]:求助:恢复modify前的状态

[复制链接]
发表于 2004-3-27 22:25:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我在程序中检测到对象被modified后,想恢复它原来的状态该怎么办?
我是cad arx新手,请说详细点,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-27 23:25:19 | 显示全部楼层

Re: [ARX函数]:求助:恢复modify前的状态

最初由 zhbs 发布
[B]我在程序中检测到对象被modified后,想恢复它原来的状态该怎么办?
我是cad arx新手,请说详细点,谢谢! [/B]


请把问题描述清楚,是什么对象?你想在什么时候检测到,是自动还是你做个程序运行检测?等等。

你最好据个具体的例子。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-28 07:42:29 | 显示全部楼层
这是一个多人并行工作的程序,每个人都被限定在自己的图层,不允许修改别人的图层。在数据库反映器中发现有对象被objectAppend、objectErased、objectModified时,首先判断是否在允许的图层,是就不做处理,不是就恢复原来的状态。append和erased都好办,只要pObj->Erase(true/false)就行了,唯独modify我不知道该怎么处理。我曾经试过在objectOpenedForModify中clone出对象,在objectModified中再恢复,但对一个对象只有第一次有效,再修改就不会触发objectModified事件了,而objectOpenedForModify还是会触发。
void ZhbAcDatabaseReactor::objectOpenedForModify(const AcDbDatabase* dwg,                              const AcDbObject* dbObj)
{
  if(DocVars.getGlobalModule().GetSysModify())        //程序内部引发,不做处理
    return;
  if(dbObj->isKindOf(AcDbEntity::desc()))
  {
    AcDbEntity* pEnt = AcDbEntity::cast(dbObj);
    if(pEnt->layer() != DocVars.getGlobalModule().GetUserName())//判断是否合法用户,不是则clone对象状态
    {
      DocVars.getGlobalModule().SetSysModify(TRUE);
      acutPrintf("不应该操作--objectOpenedForModify!\n");
      this->m_pBeforeModifiedObj = (AcDbObject *) dbObj->clone();
      DocVars.getGlobalModule().SetSysModify(FALSE);
      return;
    }
  }
}
void ZhbAcDatabaseReactor::objectModified(const AcDbDatabase* dwg,
                                          const AcDbObject* dbObj)
{
  acutPrintf("ObjModified called\n");//用于判断事件是否被触发
  if(DocVars.getGlobalModule().GetSysModify())        //程序内部引发,不做处理
    return;
  DocVars.getGlobalModule().SetSysModify(TRUE);
  if(dbObj->isKindOf(AcDbEntity::desc()))
  {
    //不是操作的层,应该做处理
    AcDbEntity* pEnt = AcDbEntity::cast(dbObj);
    if(pEnt->layer() != DocVars.getGlobalModule().GetUserName())
    {
      acutPrintf("不应该操作!\n");
      if(this->m_pBeforeModifiedObj != NULL)//恢复被修改的对象
      {
        if(!pEnt->isWriteEnabled())
        pEnt->upgradeOpen();
        pEnt->copyFrom(this->m_pBeforeModifiedObj);
        pEnt->close();
        delete this->m_pBeforeModifiedObj;
        this->m_pBeforeModifiedObj = NULL;
      }
      DocVars.getGlobalModule().SetSysModify(FALSE);
      return;
    }
  }
  DocVars.getGlobalModule().SetSysModify(FALSE);
}
//DocVars.getGlobalModule()返回的对象用于记录一些系统的全局状态,是自定义的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-28 11:30:46 | 显示全部楼层
给每一个用户分配一个全局函数,每次操作时对全局函数进行判断,是合法操作则执行,不是则不执行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-30 20:57:19 | 显示全部楼层
4楼的朋友,能说的详细一点吗,怎么对所有的操作提前进行判断,怎么取消操作?我是新手,没有找到这方面的资料。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-30 23:28:29 | 显示全部楼层
最初由 zhbs 发布
[B]4楼的朋友,能说的详细一点吗,怎么对所有的操作提前进行判断,怎么取消操作?我是新手,没有找到这方面的资料。 [/B]


换个思路,你通过程序能保证指定的层保证锁定不就可以了吗?即使用户通过LAYER命令修改为不锁定后,你的程序能马上在恢复它为锁定,不就让用户不能写实体到指定层了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 15:05 , Processed in 0.203858 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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