iCAx开思网

标题: 【求助】CAA中对话框界面问题 [打印本页]

作者: cupcake    时间: 2005-1-3 13:00
标题: 【求助】CAA中对话框界面问题
各位高手:
      我做了一个工具条,上面有几个命令,我发现我的命令完成后或者我点击了我的命令后再点击取消按钮,我的命令仍然处于选中状态,如图1(点这个命令用完后);可是我看了catia自身的命令当点击一次ok按钮完成命令后,该命令就不再处于选中状态了,而是默认的Select命令(箭头)处于选中状态,如图2(用完导角命令后)。请问我怎么样才能使我的命令和catia中一样?
作者: cupcake    时间: 2005-1-3 13:03
图2:
作者: nctusdk    时间: 2005-1-3 15:46
試試RequestDelayedDestruction()?...
  
SDK.
作者: acoka    时间: 2005-1-3 16:13
你的命令的基底class是什么?
CATMMUIPanelStateCmd?
buildgraph里设好到NULL的transition了?
作者: cupcake    时间: 2005-1-3 17:01
用了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)
    ) ;   
  
  
}
请问下来应该怎样写才能达到我的要求?
作者: bright1206    时间: 2005-1-4 10:31
呵呵,遇到同样的问题。请acoka指点。
作者: acoka    时间: 2005-1-4 23:44
帮助里有例子吧
关于state-chart的
最近手头没有caa环境,没Encyclopedia我也记不住
作者: nctusdk    时间: 2005-1-5 14:58
你的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.
作者: cupcake    时间: 2005-1-5 21:21
    非常感谢高手指点,我初学,所以错误很多。我的本意是这样的:这个对话框接收3个输入:两个曲面,1个曲线。用了3个state确实不对,因为假如第一个曲面选错了,由于已经跳到第2个state了,所以不能修改第1各选错的曲面,用1个state应该能解决这个问题吧。我想当对话框的ok按钮被点击后,执行一些对所选的曲面以及曲线的操作,操作结束后就结束这个命令。能不能关于这个要求再给点提示?
    至于CATMMUIPanelStateCmd这个类,好像用那个wizard不能直接选定,得先把command的基类设为CATStateCommand后再手工改成CATMMUIPanelStateCmd这个类,我的猜测,如果错了请指正。
:)
作者: acoka    时间: 2005-1-5 23:40
是要手改
  
通常你的情况是1个state, 3个selectlist, 可以设focus, 点哪个selectlist设它为current,就可以re-select了
  
DS推荐用CATMMUIPanelStateCmd
作者: cupcake    时间: 2005-1-6 16:20
谢谢acoka兄了。
“通常你的情况是1个state, 3个selectlist, 可以设focus, 点哪个selectlist设它为current,就可以re-select了“
能不能说的具体一些啊?怎么样设focus呢?
作者: cupcake    时间: 2005-1-7 16:00
再问一下这个问题,还没有解决。我手工把基类改成了CATMMUIPanelStateCmd,编译也没有问题,可是 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 CATPathElementAgent("GetSurface");
  _daPathElement3->AddElementType("CATCurve");
  
  _daPathElement->SetBehavior(CATDlgEngWithPSOHSO |  
    CATDlgEngWithPrevaluation);  
  _daPathElement2->SetBehavior(CATDlgEngWithPSOHSO |  
    CATDlgEngWithPrevaluation);
  _daPathElement3->SetBehavior(CATDlgEngWithPSOHSO |  
    CATDlgEngWithPrevaluation);
  
  CATDialogState *MainState = GetInitialState("stPointId");
  
  
  MainState->AddDialogAgent(_daPathElement);
  MainState->AddDialogAgent(_daPathElement2);
  MainState->AddDialogAgent(_daPathElement3);
    
  _daPathElement->InitializeAcquisition();  
  _daPathElement2->InitializeAcquisition();  
  _daPathElement3->InitializeAcquisition();  
  
  CATDialogTransition *pThirdTransition =AddTransition
    (
    MainState,
    MainState,
    IsOutputSetCondition(_daPathElement),
    Action((ActionMethod) & pointCmd::GetpointCoordination)
    ) ;   
  
  CATDialogTransition *p4thTransition =AddTransition
    (
    MainState,
    MainState,
    IsOutputSetCondition(_daPathElement2),
    Action((ActionMethod) & pointCmd::Action2)
    ) ;   
  
  CATDialogTransition *p5thTransition =AddTransition
    (
    MainState,
    MainState,
    IsOutputSetCondition(_daPathElement3),
    Action((ActionMethod) & pointCmd::Action3)
    ) ;   
  
}
改成了只有一个MainState,3个agnet,3个Transition。目的是要这个对话框接收3个输入:两个曲面,1个曲线。运行以后发现只能选第1个曲面和曲线,第2个曲面选择不了,在对话框中表示曲面选择的CATDlgEditor上点了也不行。对话框的定义和布局(见图3)如下:
//CAA2 WIZARD WIDGET DECLARATION SECTION
  CATDlgLabel*      _Label001;
  CATDlgEditor*      _Editor002;
  CATDlgLabel*      _Label002;
  CATDlgEditor*      _Editor004;
  CATDlgLabel*      _Label005;
  CATDlgEditor*      _Editor006;
//END CAA2 WIZARD WIDGET DECLARATION SECTION
请高手们继续指点,多谢了。
作者: acoka    时间: 2005-1-9 00:36
当你点了1个曲面的时候,按你AddDialogAgent
的顺序来定优先级别的,所以daPathElement2 抢不过daPathElement,实际是无效的
  
解决方法
  
1)用multi-state,state-switch也是DS推荐的编程方式,回到3或2state,添加panel的selectorlist被点击的agent来实现state的来回切换
  
2)不过因为你的命令选项少,如果用个flag来简单切换也是可以的
设curve和surface的agent各1个,加个 int _Flag = 1 or 2, 在surface-agent的action里如果 _Flag==1 , 就赋值给 _面1,然后 _Flag -= 3, 反之亦然。当然这种编程方式不是太好,不过你可以改几行就实现要的功能
  
3)各个选择只能选一次,不许改选了话最简单(不过这样功能太差), 用过agent后把它从state里RemoveAgent掉就好,你在各个action里最后加1行就好
  
multi-state的效果可以参考catia的draft命令的样式
作者: cupcake    时间: 2005-1-9 11:36
谢谢高手继续予以指点。解决办法(1)应该可以实现改选吧?那像我这个对话框应该有3个state吧?请问这句话 “添加panel的selectorlist被点击的agent来实现state的来回切换“具体应该怎么做呢?怎么样在state之间来回切换呢?能不能给出代码示例?:)




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3