找回密码 注册 QQ登录
开思网工业级高精度在线3D打印服务

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 23306|回复: 13
打印 上一主题 下一主题

【求助】CAA中对话框界面问题

[复制链接]
跳转到指定楼层
1
发表于 2005-1-3 13:00:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位高手:
      我做了一个工具条,上面有几个命令,我发现我的命令完成后或者我点击了我的命令后再点击取消按钮,我的命令仍然处于选中状态,如图1(点这个命令用完后);可是我看了CATIA自身的命令当点击一次ok按钮完成命令后,该命令就不再处于选中状态了,而是默认的Select命令(箭头)处于选中状态,如图2(用完导角命令后)。请问我怎么样才能使我的命令和catia中一样?

本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2005-1-3 13:03:16 | 只看该作者
图2:

本帖子中包含更多资源

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

x
3
发表于 2005-1-3 15:46:09 | 只看该作者
試試RequestDelayedDestruction()?...
  
SDK.
4
发表于 2005-1-3 16:13:44 | 只看该作者
你的命令的基底class是什么?
CATMMUIPanelStateCmd?
buildgraph里设好到NULL的transition了?
5
发表于 2005-1-3 17:01:27 | 只看该作者
用了RequestDelayedDestruction()了,还是不行。
命令的基类是CATStateCommand,BuildGraph()里面没有设好到NULL的transition,不知道该怎么写,请acoka指教。我的BuildGraph函数如下:
void pointCmd::BuildGraph()
{
  pi=new pointBox();
  pi->Build();
  pi->SetVisibility(CATDlgShow);
                _daPathElement = new CATPathElementAgent("GetSurface");
  _daPathElement->AddElementType("CATSurface");
               _daPathElement2 = new CATPathElementAgent("GetCurve");
  _daPathElement2->AddElementType("CATSurface");
  _daPathElement3 = new CATPathElementAgen("GetSurface");
  _daPathElement3->AddElementType("CATCurve");
  _daPathElement->SetBehavior(CATDlgEngWithPSOHSO |  
    CATDlgEngWithPrevaluation);  
  _daPathElement2->SetBehavior(CATDlgEngWithPSOHSO |  
    CATDlgEngWithPrevaluation);
  _daPathElement3->SetBehavior(CATDlgEngWithPSOHSO |  
    CATDlgEngWithPrevaluation);
  
  CATDialogState *stStartState = GetInitialState("stPointId");
  CATDialogState *stSecondState =AddDialogState("stSecondPointId");
  CATDialogState *stThirdState =AddDialogState("stThirdPointId");
  
  
  stStartState->AddDialogAgent(_daPathElement);
  stSecondState->AddDialogAgent(_daPathElement2);
  stThirdState->AddDialogAgent(_daPathElement3);
    
  _daPathElement->InitializeAcquisition();  
  _daPathElement2->InitializeAcquisition();  
  _daPathElement3->InitializeAcquisition();  
  
  CATDialogTransition *pThirdTransition =AddTransition
    (
    stStartState,
    stSecondState,
    IsOutputSetCondition(_daPathElement),
    Action((ActionMethod) & pointCmd::GetpointCoordination)
    ) ;   
  
  CATDialogTransition *p4thTransition =AddTransition
    (
    stSecondState,
    stThirdState,
    IsOutputSetCondition(_daPathElement2),
    Action((ActionMethod) & pointCmd::Action2)
    ) ;   
  
  CATDialogTransition *p5thTransition =AddTransition
    (
    stThirdState,
    stThirdState,
    IsOutputSetCondition(_daPathElement3),
    Action((ActionMethod) & pointCmd::Action3)
    ) ;   
  
  
}
  
  CATDialogTransition *p5thTransition =AddTransition
    (
    stThirdState,
    stThirdState,
    IsOutputSetCondition(_daPathElement3),
    Action((ActionMethod) & pointCmd::Action3)
    ) ;   
  
  
}
请问下来应该怎样写才能达到我的要求?
6
发表于 2005-1-4 10:31:12 | 只看该作者
呵呵,遇到同样的问题。请acoka指点。
7
发表于 2005-1-4 23:44:16 | 只看该作者
帮助里有例子吧
关于state-chart的
最近手头没有caa环境,没Encyclopedia我也记不住
8
发表于 2005-1-5 14:58:15 | 只看该作者
你的command不會結束掉的原因是你的dialog是自己建的..
而你沒有加入當ok鍵或cancel鍵按下去的transition
自然也不會結束...
  
因為我不知道你到底什麼時候去根據你的選取做一些動作的
是在Action3裡頭嗎?
如果是你其實可以在Action3()裡頭直接加RequestDelayedDestruction..
還是是放在dialog的code裡...?
直接用AddAnalyseNotificationCB設一個callback當ok鍵按下去之後去做那些動作?(我猜你這樣寫的可能性比較大)
  
總之有兩個改法...
  
最簡單的方式是改用CATMMUIPanelStateCmd...
他會自動幫你handle當dialog的ok or cancel鍵按下之後要將command結束掉..
然後要把你真正要做一些動作的code移到CATMMUIPanelStateCmd::OkAction()裡...
(不過記得跟CATStateCommand比起來...
CATMMUIPanelStateCmd多了CATMMUIPanelStateCmd::GiveMyPanel()這個method要寫喔...(只要把你的dialog指標return回去就好了))
  
另一個方式比較麻煩一點...
不過也許你會比較好改..?
因為問題在於你的dialog按ok之後並不會結束這個command
所以你只要在BuildGraph()中加入當dialog鍵按下去讓這個command結束的transition就好了...
所以你需要一個CATDialogAgent去accept dialog ok button的notification
然後再加一個transition到NULL state...
當transition發生時invoke一個method...
裡頭就寫RequestDelayedDestruction()...
這樣就好了...
Code大概長這樣:
.h:
CATDialogAgent *pOkButtonAgent;
CATDialogAgent *pCancelButtonAgent;
.cpp:
pOkButtonAgent = new CATDialogAgent("OkButtonAgent");
pOkButtonAgent->AcceptOnNotify(panel, panel->GetDiaOKNotification());
State->AddDialogAgent(pOkButtonAgent);
  
pCancelButtonAgent = new CATDialogAgent("CancelButtonAgent");
pCancelButtonAgent->AcceptOnNotify(panel, panel->GetDiaCANCELNotification());
State->AddDialogAgent(pCancelButtonAgent);
  
AddTransition(State, NULL, IsOutputSetCondition(pOkButtonAgent), Action((ActionMethod)[$pointCmd::OnOkButtonPressed))]
  
AddTransition(State, NULL, IsOutputSetCondition(pCancelButtonAgent), Action((ActionMethod)[$pointCmd::OnCancelButtonPressed))]
}
  
pointCmd::OnOkButtonPressed(void *data)
{
  RequestDelayedDestruction();
}
pointCmd::OnCancelButtonPressed(void *data)
{
  RequestDelayedDestruction();
}
  
以上我隨手寫的, 不保證對...
比較保險的方法還是改用CATMMUIPanelStateCmd啦...
也是一般寫有dialog介面的command比較常用的方法...
  
還有你用了3個state來表示沒有/第一/第二個物件被選取的狀態..
我是覺得一個state就夠了...也比較簡單...
(就是所有的transition都是MainState->MainState)
而上面的那兩個dialog agent也就不用都加到那三個state中了...
  
SDK.
9
发表于 2005-1-5 21:21:39 | 只看该作者
    非常感谢高手指点,我初学,所以错误很多。我的本意是这样的:这个对话框接收3个输入:两个曲面,1个曲线。用了3个state确实不对,因为假如第一个曲面选错了,由于已经跳到第2个state了,所以不能修改第1各选错的曲面,用1个state应该能解决这个问题吧。我想当对话框的ok按钮被点击后,执行一些对所选的曲面以及曲线的操作,操作结束后就结束这个命令。能不能关于这个要求再给点提示?
    至于CATMMUIPanelStateCmd这个类,好像用那个wizard不能直接选定,得先把command的基类设为CATStateCommand后再手工改成CATMMUIPanelStateCmd这个类,我的猜测,如果错了请指正。
:)
10
发表于 2005-1-5 23:40:03 | 只看该作者
是要手改
  
通常你的情况是1个state, 3个selectlist, 可以设focus, 点哪个selectlist设它为current,就可以re-select了
  
DS推荐用CATMMUIPanelStateCmd
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-12-23 21:40 , Processed in 0.027104 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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