0


CAA 二次开发 —— 创建交互式用户界面

上一篇文章介绍了在 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 编译运行

这里不再重复编译运行的方法了,直接看一下本例的运行效果:


好啦,一个简单的 交互式用户界面程序 完成啦。如有错漏,欢迎留言指正。

标签: c++

本文转载自: https://blog.csdn.net/Watermanda/article/details/141359992
版权归原作者 沃特曼达 所有, 如有侵权,请联系我们删除。

“CAA 二次开发 —— 创建交互式用户界面”的评论:

还没有评论