目录
前言
基于Afsim插件实现在wizard编辑器中,添加自定义的脚本类和函数,进而实现自己的算法或者其他操作等。
使用步骤
1.继承WsfApplicationExtension
继承WsfApplicationExtension并实现重载接口,代码如下(示例):
#ifndef __PLUGINREGISTRATION_H__
#define __PLUGINREGISTRATION_H__
#include "WsfApplicationExtension.hpp"
class PluginRegistration : public WsfApplicationExtension
{
public:
PluginRegistration() = default;
~PluginRegistration() noexcept override = default;
void AddedToApplication(WsfApplication& aApplication) override;
};
#endif // !__PLUGINREGISTRATION_H__
#include "PluginRegistration.h"
#include "CustomScript.h"
#include "UtPlugin.hpp"
#include "UtScriptTypes.hpp"
#include "WsfApplication.hpp"
#include "WsfPlugin.hpp"
#include "customscript_export.h"
void PluginRegistration::AddedToApplication(WsfApplication& aApplication)
{
aApplication.GetScriptTypes()->Register(ut::make_unique<ScriptCustomScriptClass>
("CCustomScript", GetApplication().GetScriptTypes()));
}
extern "C"
{
CUSTOMSCRIPT_EXPORT void WsfPluginVersion(UtPluginVersion& v)
{
v = UtPluginVersion(WSF_PLUGIN_API_MAJOR_VERSION,WSF_PLUGIN_API_MINOR_VERSION,WSF_PLUGIN_API_COMPILER_STRING);
}
CUSTOMSCRIPT_EXPORT void WsfPluginSetup(WsfApplication& app)
{
app.RegisterExtension("customscript",ut::make_unique<PluginRegistration>());
}
}
2.撰写自己的功能类
代码如下(示例):
#include "WsfObject.hpp"
class CCustomScript : public WsfObject
{
public:
CCustomScript();
~CCustomScript() = default;
int Add(int a, int b);
int Plus(int a, int b);
const char* GetScriptClassName() const override;
};
#include "CustomScript.h"
CCustomScript::CCustomScript()
{
}
const char* CCustomScript::GetScriptClassName() const
{
return "CCustomScript";
}
int CCustomScript::Add(int a, int b)
{
return a + b;
}
int CCustomScript::Plus(int a, int b)
{
return a * b;
}
注意:需要继承WsfObject类,重载GetScriptClassName接口。
3.包装自定义类
代码如下(示例):
class ScriptCustomScriptClass : public WsfScriptObjectClass
{
public:
ScriptCustomScriptClass(const std::string& aClassName,
UtScriptTypes* aTypesPtr);
~ScriptCustomScriptClass() noexcept override = default;
UT_DECLARE_SCRIPT_METHOD(Add);
UT_DECLARE_SCRIPT_METHOD(Plus);
UT_DECLARE_SCRIPT_METHOD(Add_1);
UT_DECLARE_SCRIPT_METHOD(Plus_1);
UT_DECLARE_SCRIPT_METHOD(GetPlatformName_1);
UT_DECLARE_SCRIPT_METHOD(GetPlatformName_2);
};
// ***************************************************************************
#include "script/WsfScriptContext.hpp"
#include "WsfPlatform.hpp"
#include "WsfSimulation.hpp"
ScriptCustomScriptClass::ScriptCustomScriptClass(const std::string& aClassName, UtScriptTypes* aTypesPtr)
: WsfScriptObjectClass(aClassName, aTypesPtr)
{
SetClassName("CCustomScript");
mConstructible = true;
AddMethod(ut::make_unique<Add>());
AddMethod(ut::make_unique<Plus>());
AddStaticMethod(ut::make_unique<Add_1>("Add"));
AddStaticMethod(ut::make_unique<Plus_1>("Plus"));
AddMethod(ut::make_unique<GetPlatformName_1>("GetPlatformName"));
AddMethod(ut::make_unique<GetPlatformName_2>("GetPlatformName"));
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, Add, 2, "int", "int, int")
{
aReturnVal.SetInt(aObjectPtr->Add(aVarArgs[0].GetInt(), aVarArgs[1].GetInt()));
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, Plus, 2, "int", "int, int")
{
aReturnVal.SetInt(aObjectPtr->Plus(aVarArgs[0].GetInt(), aVarArgs[1].GetInt()));
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, Add_1, 2, "int", "int, int")
{
aReturnVal.SetInt(aVarArgs[0].GetInt() + aVarArgs[1].GetInt());
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, Plus_1, 2, "int", "int, int")
{
aReturnVal.SetInt(aVarArgs[0].GetInt() * aVarArgs[1].GetInt());
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, GetPlatformName_1, 1, "string", "WsfPlatform")
{
WsfPlatform* pPlatform = aVarArgs[0].GetPointer()->GetAppObject<WsfPlatform>();
if(NULL == pPlatform)
{
aReturnVal.SetString("");
}
aReturnVal.SetString(pPlatform->GetName());
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, GetPlatformName_2, 1, "string", "int")
{
WsfSimulation* simPtr = WsfScriptContext::GetSIMULATION(aContext);
if (NULL == simPtr)
{
aReturnVal.SetString("");
}
WsfPlatform* pPlatform = simPtr->GetPlatformByIndex(aVarArgs[0].GetInt());
if (NULL == pPlatform)
{
aReturnVal.SetString("");
}
aReturnVal.SetString(pPlatform->GetName());
}
注意:需要继承WsfScriptObjectClass,使用UT_DECLARE_SCRIPT_METHOD声明函数,在构造函数中添加为成员方法或者静态方法,SetClassName("CCustomScript")和GetScriptClassName()返回值保持一致,如果自定义类需要在脚本中构造需要mConstructible 设置为True;
mConstructible 为false(默认为false)的情况;
4.使用效果
编译生成后放在如下目录
运行wizard,写入测试代码
# File generated by Wizard 2.9.0 on Sep 14, 2025.
platform B WSF_PLATFORM
end_platform
script_variables
CCustomScript customScript = CCustomScript();
end_script_variables
script void AddStatic()
int re = CCustomScript.Add(1, 2);
writeln("AddStatic: ", re);
end_script
script void PlusStatic()
int re = CCustomScript.Plus(1, 2);
writeln("PlusStatic: ", re);
end_script
script void Add()
int re = CCustomScript.Add(1, 3);
writeln("Add: ", re);
end_script
script void Plus()
int re = CCustomScript.Plus(1, 3);
writeln("Plus: ", re);
end_script
script void PlatformName()
WsfPlatform platform = WsfSimulation.FindPlatform(1);
string name0 = customScript.GetPlatformName(platform);
writeln("name0: ", name0);
string name1 = customScript.GetPlatformName(platform.Index());
writeln("name1: ", name1);
end_script
execute at_time 0.1 s absolute
AddStatic();
PlusStatic();
Add();
Plus();
PlatformName();
end_execute
执行结果
总结
通过自定义脚本类和方法可以很方便的在二次开发环境和脚本之间传递信息。
完整代码:
CustomScript.h
#ifndef __UDPOBSERVER_H__
#define __UDPOBSERVER_H__
#include "script/WsfScriptObjectClass.hpp"
#include "WsfObject.hpp"
class CCustomScript : public WsfObject
{
public:
CCustomScript();
~CCustomScript() = default;
int Add(int a, int b);
int Plus(int a, int b);
const char* GetScriptClassName() const override;
};
class ScriptCustomScriptClass : public WsfScriptObjectClass
{
public:
ScriptCustomScriptClass(const std::string& aClassName,
UtScriptTypes* aTypesPtr);
~ScriptCustomScriptClass() noexcept override = default;
UT_DECLARE_SCRIPT_METHOD(Add);
UT_DECLARE_SCRIPT_METHOD(Plus);
UT_DECLARE_SCRIPT_METHOD(Add_1);
UT_DECLARE_SCRIPT_METHOD(Plus_1);
UT_DECLARE_SCRIPT_METHOD(GetPlatformName_1);
UT_DECLARE_SCRIPT_METHOD(GetPlatformName_2);
};
#endif // !__UDPOBSERVER_H__
CustomScript.cpp
#include "CustomScript.h"
CCustomScript::CCustomScript()
{
}
const char* CCustomScript::GetScriptClassName() const
{
return "CCustomScript";
}
int CCustomScript::Add(int a, int b)
{
return a + b;
}
int CCustomScript::Plus(int a, int b)
{
return a * b;
}
// ***************************************************************************
#include "script/WsfScriptContext.hpp"
#include "WsfPlatform.hpp"
#include "WsfSimulation.hpp"
ScriptCustomScriptClass::ScriptCustomScriptClass(const std::string& aClassName, UtScriptTypes* aTypesPtr)
: WsfScriptObjectClass(aClassName, aTypesPtr)
{
SetClassName("CCustomScript");
mConstructible = true;
AddMethod(ut::make_unique<Add>());
AddMethod(ut::make_unique<Plus>());
AddStaticMethod(ut::make_unique<Add_1>("Add"));
AddStaticMethod(ut::make_unique<Plus_1>("Plus"));
AddMethod(ut::make_unique<GetPlatformName_1>("GetPlatformName"));
AddMethod(ut::make_unique<GetPlatformName_2>("GetPlatformName"));
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, Add, 2, "int", "int, int")
{
aReturnVal.SetInt(aObjectPtr->Add(aVarArgs[0].GetInt(), aVarArgs[1].GetInt()));
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, Plus, 2, "int", "int, int")
{
aReturnVal.SetInt(aObjectPtr->Plus(aVarArgs[0].GetInt(), aVarArgs[1].GetInt()));
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, Add_1, 2, "int", "int, int")
{
aReturnVal.SetInt(aVarArgs[0].GetInt() + aVarArgs[1].GetInt());
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, Plus_1, 2, "int", "int, int")
{
aReturnVal.SetInt(aVarArgs[0].GetInt() * aVarArgs[1].GetInt());
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, GetPlatformName_1, 1, "string", "WsfPlatform")
{
WsfPlatform* pPlatform = aVarArgs[0].GetPointer()->GetAppObject<WsfPlatform>();
if(NULL == pPlatform)
{
aReturnVal.SetString("");
}
aReturnVal.SetString(pPlatform->GetName());
}
UT_DEFINE_SCRIPT_METHOD(ScriptCustomScriptClass, CCustomScript, GetPlatformName_2, 1, "string", "int")
{
WsfSimulation* simPtr = WsfScriptContext::GetSIMULATION(aContext);
if (NULL == simPtr)
{
aReturnVal.SetString("");
}
WsfPlatform* pPlatform = simPtr->GetPlatformByIndex(aVarArgs[0].GetInt());
if (NULL == pPlatform)
{
aReturnVal.SetString("");
}
aReturnVal.SetString(pPlatform->GetName());
}
PluginRegistration.h
#ifndef __PLUGINREGISTRATION_H__
#define __PLUGINREGISTRATION_H__
#include "WsfApplicationExtension.hpp"
class PluginRegistration : public WsfApplicationExtension
{
public:
PluginRegistration() = default;
~PluginRegistration() noexcept override = default;
void AddedToApplication(WsfApplication& aApplication) override;
};
#endif // !__PLUGINREGISTRATION_H__
PluginRegistration.cpp
#include "PluginRegistration.h"
#include "CustomScript.h"
#include "UtPlugin.hpp"
#include "UtScriptTypes.hpp"
#include "WsfApplication.hpp"
#include "WsfPlugin.hpp"
#include "customscript_export.h"
void PluginRegistration::AddedToApplication(WsfApplication& aApplication)
{
aApplication.GetScriptTypes()->Register(ut::make_unique<ScriptCustomScriptClass>
("CCustomScript", GetApplication().GetScriptTypes()));
}
extern "C"
{
CUSTOMSCRIPT_EXPORT void WsfPluginVersion(UtPluginVersion& v)
{
v = UtPluginVersion(WSF_PLUGIN_API_MAJOR_VERSION,WSF_PLUGIN_API_MINOR_VERSION,WSF_PLUGIN_API_COMPILER_STRING);
}
CUSTOMSCRIPT_EXPORT void WsfPluginSetup(WsfApplication& app)
{
app.RegisterExtension("customscript",ut::make_unique<PluginRegistration>());
}
}