Afsim插件自定义脚本开发指南

目录

前言

使用步骤

1.继承WsfApplicationExtension

2.撰写自己的功能类

3.包装自定义类

4.使用效果

总结


前言

基于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>());
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值