找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 719|回复: 7

[ARX函数]:问个应该有点难度的问题

[复制链接]
发表于 2006-5-28 21:21:34 | 显示全部楼层 |阅读模式

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

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

×
arx 怎么去截获一个命令?

  我所谓的截获是这个意思:  比如说 画线(line)命令 , 我通过反应器知道什么时候触发该命

令, 这个命令什么时候结束,  但是,我现在想截获这个命令, 在这个命令结束之前做 一些我

想做的事情, 比如说 将两条直线之间用 弧线 连接等等

   有高手知道吗?

    注意:我想在命令中止之前插入我想做的的事情, 及暂时的 延迟 这个命令的触发, 做完

我的事情后, 再让他结束
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-5-28 21:25:05 | 显示全部楼层
等待高手的答案,共同学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-29 08:28:46 | 显示全部楼层
转贴:论坛里有人发过这样一个贴子,看看对你是否有帮助:

准确的说法应该是:要知道被调用命令何时结束,然后在其结束后作其他工作。
处理这个问题可以这样:
从AcEditorReactor派生一个类,重写其中的commandCancelled、commandEnded及commandFailed三个与命令结束有关的函数,在函数中监视特定命令的结束,若监视到,则可以通过内部回调或其他方式通知外部处理器进行处理。
思路说的应该比较清楚了,试着实现一下吧:)
下面是我的实现,参考一下:

#include <list>
#include <string>
#include <algorithm>
using namespace std;

//命令执行状态枚举
typedef enum
{
    cmdEnded,
    cmdCancelled,
    cmdFailed
}cmdStatus;

typedef void (*cmdCallBack)(cmdStatus stat);

//命令执行跟踪器
class CCmdTracker: public AcEditorReactor
{
public:
    CCmdTracker()
    {
        acedEditor->addReactor(this);
    }
    ~CCmdTracker()
    {
        acedEditor->removeReactor(this);
    }
    void addCommand(const char *lpszCmd,cmdCallBack pfnCallback,BOOL bAutoRelease=TRUE)
    {
        if(lpszCmd!=NULL     &&
           lpszCmd[0]!=0     &&
           pfnCallback!=NULL &&
           FindCmd(lpszCmd)==m_Cmds.end())
        {
            cmdItem Item;
            Item.strCmd=lpszCmd;
            Item.pfnCallback=pfnCallback;
            Item.bAutoRelease=bAutoRelease;
            m_Cmds.push_back(Item);
        }
    }
    void removeCommand(const char *lpszCmd)
    {
        cmdItemIter pos;
        if(lpszCmd!=NULL     &&
           lpszCmd[0]!=0     &&            
           (pos=FindCmd(lpszCmd))!=m_Cmds.end())
           m_Cmds.erase(pos);
    }
protected:
    virtual void commandCancelled(const char* cmdStr)
    {
        ProcessCmd(cmdStr,cmdCancelled);
    }
    virtual void commandEnded(const char* cmdStr)
    {
        ProcessCmd(cmdStr,cmdEnded);
    }
    virtual void commandFailed(const char* cmdStr)
    {
        ProcessCmd(cmdStr,cmdFailed);
    }

private:     
    typedef struct
    {
        string      strCmd;
        cmdCallBack pfnCallback;
        BOOL        bAutoRelease;
    }cmdItem;

    typedef list<cmdItem> cmdItems;
    typedef cmdItems::iterator cmdItemIter;
    cmdItems m_Cmds;

    cmdItemIter FindCmd(const char *lpszCmd)
    {
        cmdItemIter iter;
        for(iter=m_Cmds.begin();iter!=m_Cmds.end();++iter)
        {
            if( lstrcmpi((*iter).strCmd.c_str(),lpszCmd)==0 )
                break;
        }
        return iter;
    }
    void ProcessCmd(const char *cmdStr,cmdStatus stat)
    {
        cmdItemIter pos=FindCmd(cmdStr);
        if(pos!=m_Cmds.end())
        {
            (*pos).pfnCallback(stat);
            if( (*pos).bAutoRelease )
                m_Cmds.erase(pos);
        }
    }
};

把在指定命令后要执行的代码做成一个函数,然后把此函数和命令追加到命令跟踪器中就可以了。这样,当指定命令结束后与其关联的后调函数会自动被调用。
应该明白了吧!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-29 09:32:53 | 显示全部楼层
这个正好和我说的有点反了吧? " 在指定命令后要执行的代码做成一个函数"------这个是在当前命令结束了以后再去做我要做的事情(比如说我要画的线已经画好了),,, 但我想要的是在命令结束前做我要的事情(系统已经结束画线, 我先不要画好的线显示出来, 而是先插入一些我要做的事情,再让直线显示出来)

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

使用道具 举报

发表于 2006-5-30 15:16:11 | 显示全部楼层
那您为何不重新定义这些命令呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-30 15:20:51 | 显示全部楼层
missyou,,,, 你说的重新定义这些命令是什么意思? 是指重新定义cad的内部命令吗? 这样不好吧? 很多复杂的功能,重新定义命令是很麻烦的。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-30 16:41:18 | 显示全部楼层
commandend函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-30 20:31:29 | 显示全部楼层
呜呜.....没有人知道吗?很急啊.....呼唤大侠........不过我想想也有可能是根本就不可能实现的....只有自己开发一个相同的命令出来解决
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 12:33 , Processed in 0.185787 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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