上一篇文章介绍了在 3DE 平台创建 CAA 项目的基本步骤(CAA 二次开发 —— 创建项目),在此基础上继续介绍如何在 CAA 二次开发中创建交互式用户界面。本文通过一个简单的用户界面显示用户所选对象的名称,并通过按钮实现名称修改。
1、创建步骤(Step-by-Step)
1.1 新建命令
我们这里再新建一个命令,修改 Component 源文件(TestAddin.cpp)
在 CreateCommands 函数添加以下内容:
CATAfrCommandHeader::CATCreateCommandHeader(
"TestRename",
"TestMdl",
"TestRenameCmd",
(void*)NULL,
"TestAddinHeader",
CATFrmAvailable);
在 CreateToolbars 函数添加以下内容:
NewAccess(CATCmdStarter, pTestRenameCmd, TestRenameCmd);
SetAccessCommand(pTestRenameCmd, "TestRename");
SetAccessNext(pTestCommandCmd, pTestRenameCmd);
完成后如下图:
1.2 新建 CATStateCommand
右键单击解决方案的 TestMdl.m(Module),新建 CATStateCommand,输入名称(如 TestRenameCmd),完成后如下图:
1.3 编写 CATStateCommand 头文件
编辑 TestRenameCmd.h 文件,修改前向声明:
class CATIndicationAgent; // 删除这一句
class CATPathElementAgent; // 添加这一句
在 private 域修改数据成员:
CATIndicationAgent* _Indication; // 删除这一句
CATPathElementAgent* _pElementAgent; // 添加这一句
完成后如下图:
1.4 编写 CATStateCommand 源文件
编辑 TestRenameCmd.cpp 文件,修改包含的头文件:
// 删除以下语句
#include "CATIndicationAgent.h"
#include "CATMathPlane.h"
// 添加以下语句
#include "CATPathElementAgent.h"
修改构造函数和析构函数中的数据成员名称(_Indication 改为 _pElementAgent),
然后注释 BuildGraph 函数的所有语句。
完成后如下图:
1.5 新建对话框
右键单击解决方案的 TestMdl.m(Module),然后点击 添加 - 新建项 :
在 3DS Templates 中选择 IDDTemplates ,再选中 Dassault Systemes Code Gen Creation Wizard,输入名称(如 TestRenameDlg),然后点击添加:
然后点击 Next:
然后点击 Finish:
完成后进入可视化编辑界面,如下图:
1.6 编辑对话框
右键单击对话框,选择 Properties Window 打开属性编辑窗口:
修改对话框的标题、按钮,如下图:
点击 视图 - 工具箱 ,打开控件工具箱:
添加两个控件:文本框 - CATDlgEditor,按钮 - CATDlgPushButton,修改按钮的名称:
右键单击对话框,选择 View Header Code 打开对话框头文件:
在头文件添加以下函数声明(public 域):
public:
CATDlgEditor* GetEditor();
CATDlgPushButton* GetButton();
完成后如下图:
右键单击对话框,选择 View Implementation Code 打开对话框源文件:
在源文件添加以下函数实现:
CATDlgEditor* TestRenameDlg::GetEditor() { return _Editor1; }
CATDlgPushButton* TestRenameDlg::GetButton() { return _PushButton1; }
完成后如下图:
至此完成一个简单对话框的设计,为确保编译后不再提示错误,可以将对话框头文件拷贝到 Local 目录(注意:如果修改对话框,需重新拷贝)。
头文件所在位置:D:\CAATest\TestFrame\TestMdl.m\LocalGenerated\win_b64
Local 目录位置:D:\CAATest\TestFrame\TestMdl.m\LocalInterfaces
1.7 添加对话框事件响应
对话框响应是在命令中实现的,打开命令的头文件(TestRenameCmd.h)修改如下:
添加前向声明:
class TestRenameDlg;
添加成员函数(public 域):
CATBoolean Rename(void* data); // 响应重命名
CATBoolean Cancel(void* data); // 响应取消命令
添加数据成员(private 域):
TestRenameDlg* _pDlg;
CATBaseUnknown* _pObject; // 保存选择对象
完成后如下图:
打开命令的源文件(TestRenameCmd.cpp)修改如下:
包含以下头文件:
#include "TestRenameDlg.h"
#include "CATDlgEditor.h"
#include "CATDlgPushButton.h"
#include "CATApplicationFrame.h"
#include "CATIAlias.h"
由于新增了数据成员,修改构造函数和析构函数相应内容。
修改 BuildGraph 函数,添加以下内容:
// 显示对话框
CATApplicationFrame* pAppFrame = CATApplicationFrame::GetFrame();
if (NULL != pAppFrame)
{
CATDlgWindow* pWindow = pAppFrame->GetMainWindow();
if (NULL != pWindow)
{
_pDlg = new TestRenameDlg(pWindow, "Rename");
_pDlg->Build();
_pDlg->SetVisibility(CATDlgShow);
}
}
// 响应取消命令(关闭窗口、点击取消、点击确定)
AddAnalyseNotificationCB(_pDlg, _pDlg->GetWindCloseNotification(),
(CATCommandMethod)&TestRenameCmd::Cancel, NULL);
AddAnalyseNotificationCB(_pDlg, _pDlg->GetDiaOKNotification(),
(CATCommandMethod)&TestRenameCmd::Cancel, NULL);
AddAnalyseNotificationCB(_pDlg, _pDlg->GetDiaCANCELNotification(),
(CATCommandMethod)&TestRenameCmd::Cancel, NULL);
// 响应重命名(点击按钮)
AddAnalyseNotificationCB(_pDlg->GetButton(), _pDlg->GetButton()->GetPushBActivateNotification(),
(CATCommandMethod)&TestRenameCmd::Rename, NULL);
// 选择对象代理
_pElementAgent = new CATPathElementAgent("SelectElement");
// 选择状态
CATDialogState* initialState = GetInitialState("initialState");
initialState->AddDialogAgent(_pElementAgent);
// 状态转换(将对象名称显示在文本框)
AddTransition(initialState, initialState,
IsOutputSetCondition(_pElementAgent),
Action((ActionMethod)&TestRenameCmd::ActionOne));
修改 ActionOne 函数,添加以下内容:
_pObject = _pElementAgent->GetElementValue();
_pElementAgent->InitializeAcquisition();
CATIAlias* piAlias = NULL;
_pObject->QueryInterface(IID_CATIAlias, (void**)&piAlias);
if (NULL != piAlias)
{
_pDlg->GetEditor()->SetText(piAlias->GetAlias());
}
添加 Rename 和 Cancel 函数实现:
CATBoolean TestRenameCmd::Rename(void* data)
{
if (NULL != _pObject)
{
CATIAlias* piAlias = NULL;
_pObject->QueryInterface(IID_CATIAlias, (void**)&piAlias);
if (NULL != piAlias)
{
piAlias->SetAlias(_pDlg->GetEditor()->GetText());
}
}
return TRUE;
}
CATBoolean TestRenameCmd::Cancel(void* data)
{
RequestDelayedDestruction();
return TRUE;
}
1.8 添加依赖
建议在编写代码过程中导入头文件时就立即添加相应依赖,否则后面很容易忘记。下面直接给出本例完整的依赖,有些是之前已经加了的。
模块依赖
#INSERTION ZONE NOT FOUND, MOVE AND APPEND THIS VARIABLE IN YOUR LINK STATEMENT
LINK_WITH = $(WIZARD_LINK_MODULES)
# DO NOT EDIT :: 3DS WIZARDS WILL ADD CODE HERE
WIZARD_LINK_MODULES = JS0FM \
JS0GROUP CATAfrFoundation CATAfrItf CATDialogEngine CATMathematics DI0PANV2 \
ObjectModelerSystem
# END WIZARD EDITION ZONE
框架依赖
<prerequisite name="AfrFoundation" access="Public" expose="ExposePrereq" />
<prerequisite name="AfrInterfaces" access="Public" expose="ExposePrereq" />
<prerequisite name="DialogEngine" access="Public" expose="ExposePrereq" />
<prerequisite name="Mathematics" access="Public" expose="ExposePrereq" />
<prerequisite name="SpecialAPI" access="Public" expose="ExposePrereq" />
<prerequisite name="System" access="Public" expose="ExposePrereq" />
<prerequisite name="SystemTS" access="Public" expose="ExposePrereq" />
<prerequisite name="Dialog" access="Public" expose="ExposePrereq" />
<prerequisite name="ObjectModelerSystem" access="Public" expose="ExposePrereq" />
1.9 修改资源文件
给新命令添加相应的图标文件,并修改 CATNls 和 CATRsc 文件添加相应内容,具体方法请参考 (CAA 二次开发 —— 创建项目) 2.14 节。
1.10 编译运行
这里不再重复编译运行的方法了,直接看一下本例的运行效果:
好啦,一个简单的 交互式用户界面程序 完成啦。如有错漏,欢迎留言指正。
版权归原作者 沃特曼达 所有, 如有侵权,请联系我们删除。