找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1038|回复: 8

[求助]:Hellow.XD各位前辈给解释一下啊(急急急)

[复制链接]
发表于 2005-12-28 22:36:13 | 显示全部楼层 |阅读模式

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

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

×
我创建了一个停靠对话框.点击按钮出现一模态的对话框.点击模态对话框上的按钮我想实现创建面域功能.函数中调用我注册的命令.但不能同步.
void CBlastRegion::OnOrerockregion() //模态对话框按钮响应函数
{
// TODO: Add your control notification handler code here
CDialog::OnOK();
SendCommandToAcad("createregion\n");
int rc = RTNORM;
char kw[2];
while(rc == RTNORM)
{
acedInitGet(NULL, "Y N");
rc = acedGetKword("\n指定完所有的矿岩分块吗?[Y/N]: ", kw);
switch(rc)
{
case RTERROR:
case RTCAN:
return;
break;

case RTNONE:
strcpy(kw, "Y");
rc = RTNORM;
break;
}
if(strcmp(kw, "Y") == 0)
{
rc = RTNONE;
}
else
{
// acDocManager->sendStringToExecute(pDoc,"createregion\n");
SendCommandToAcad("createregion\n");
}
}

acDocManager->unlockDocument(curDoc());
}

createregion是注册的命令.代码为:
void LLSUSTBCREATEREGION()
{
// TODO: Implement the command
ads_point pt;
ads_name entname;
AcDbObjectId entId;
AcDbEntity * pEnt;
// if(RTNORM != acedGetPoint(NULL, "请在爆区内任意指定一点以确定爆破等级: ", pt))
int i = acedGetPoint(NULL, "请在爆区内任意指定一点以确定爆破等级: ", pt);
if(i!=RTNORM)
return;
int nReturn = acedCommand(RTSTR, "-boundary",RTSTR,"A",RTSTR,"O",RTSTR,"R",RTSTR,"B",RTSTR,"E",RTSTR,"", RTPOINT, pt,RTSTR,"", RTNONE);

acdbEntLast(entname);
acdbGetObjectId(entId,entname);
acdbOpenAcDbEntity(pEnt,entId,AcDb::kForRead);

AcDbDatabase *pCurDb;
AcDbBlockTable *pBlkTable;
AcDbBlockTableRecord *pBlkTableRecord;
AcDbObjectId regionId;
pCurDb = acdbHostApplicationServices()->workingDatabase();
pCurDb->getBlockTable(pBlkTable, AcDb::kForRead);
pBlkTable->getAt(ACDB_MODEL_SPACE, pBlkTableRecord, AcDb::kForWrite);
pBlkTable->close();
pBlkTableRecord->appendAcDbEntity(regionId,pEnt);

pEnt->close();
pBlkTableRecord->close();

}
CAD中用createregion可以.但点击按钮时执行到这里:
int i = acedGetPoint(NULL, "请在爆区内任意指定一点以确定爆破等级: ", pt);
就不往下执行了(返回了).从而执行while循环了.


我那里没说清楚各位提出来。着急
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-12-29 17:24:50 | 显示全部楼层
准确的说法应该是:要知道被调用命令何时结束,然后在其结束后作其他工作。
处理这个问题可以这样:
从AcEditorReactor派生一个类,重写其中的commandCancelled、commandEnded及commandFailed三个与命令结束有关的函数,在函数中监视特定命令的结束,若监视到,则可以通过内部回调或其他方式通知外部处理器进行处理。
思路说的应该比较清楚了,试着实现一下吧:)
下面是我的实现,参考一下:
[PHP]
#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);
                }
        }
};
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-30 15:46:12 | 显示全部楼层
如何让CAD执行完第二句SendCommandToAcad("createregion\n"); 发送的命令后再往下执行?
道理明白但不知怎么实现.(惭愧学的烂)
应该如何重载commandEnded()函数呢? (时间紧,急)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-12-31 16:57:27 | 显示全部楼层
仔细读一下上面的代码,应该能看懂(只不过用了一点儿STL,而且几乎没有注释)。看懂了问题就解决了!毕竟只是让你学会用现成的代码,而不是设计代码。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-1 11:12:12 | 显示全部楼层
Hellow大哥您好:
  "可以通过内部回调或其他方式通知外部处理器进行处理。" 不知怎么写.就是
    如何在监测到命令结束时在回调函数  typedef void (*cmdCallBack)(cmdStatus stat);中转到某个语句,让其执行.  谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 17:22 , Processed in 0.391063 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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