插件 API 详解
ToolBaseNative 基类
类定义
class DLJ_DLL_EXPORT ToolBaseNative
{
public:
ToolBaseNative();
virtual ~ToolBaseNative();
// === 必须重写 ===
virtual const std::string& GetName() const = 0;
virtual ECode Apply(ProjectControl& ctx) = 0;
// === 可选重写 ===
virtual const ToolCategory GetCategory() const;
// === 框架方法 ===
ECode ParseInputs();
ECode Outputs();
ECode RunTool(ProjectControl& ctx);
protected:
void setupInput(const std::string& name, DataType type,
const std::string& defaultVal, const std::string& options,
void* linkTo, const VAR_MODE& mode = VAR_MODE::ALLOW_EMPTY,
const std::string& description = "");
void setupOutput(const std::string& name, DataType type,
const std::string& defaultVal, void* linkTo,
const std::string& description = "");
void SetupDone();
};
输入设置参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
name | string | 参数名称(英文,用于变量绑定) |
type | DataType | 数据类型枚举 |
defaultVal | string | 默认值字符串 |
options | string | 选项列表,格式:"0_选项1,1_选项2" |
linkTo | void* | 指向实际变量成员的指针 |
mode | VAR_MODE | 输入模式(空/单/多) |
description | string | 参数说明(支持中文) |
选项格式
"0_Nearest,1_Bilinear,2_Bicubic"
- 数字前缀:选项值
- 下划线
_:分隔值和显示文本 - 逗号
,:分隔选项
DataType 枚举
完整类型列表
| 枚举值 | 说明 | 字符串转换 |
|---|---|---|
INTEGER | 32位整数 | "Integer" |
DOUBLE | 64位浮点 | "Double" |
STRING | 字符串 | "String" |
BOOL | 布尔值 | "Bool" |
POINT2D | 二维点 (X, Y) | "Point2D" |
POINT3D | 三维点 (X, Y, Z) | "Point3D" |
LINE2D | 二维直线 | "Line2D" |
RECTANGLE2D | 矩形 (X, Y, W, H) | "Rectangle2D" |
CIRCLE2D | 圆形 (Cx, Cy, R) | "Circle2D" |
POLYGON2D | 多边形顶点列表 | "Polygon2D" |
REGION | 区域集合 | "Region" |
IMAGE | 2D 图像 | "Image" |
v* 前缀 | 对应 List 类型 | 同上 |
VAR_MODE 枚举
| 模式 | 说明 | 适用场景 |
|---|---|---|
ALLOW_EMPTY | 允许空值、单值、列表 | 可选参数 |
ALLOW_SINGLE | 仅允许单个值 | 必须单值输入 |
ALLOW_MANY | 允许单值或列表 | 批量处理 |
OUT_IS_EMPTY | 输出可为空 | 可选输出 |
ECode 错误码
成功
| 错误码 | 值 | 说明 |
|---|---|---|
ALL_OK | 1 | 执行成功 |
参数错误
| 错误码 | 说明 |
|---|---|
VARIABLE_NAME_EMPTY | 变量名为空 |
VARIABLE_DOES_NOT_EXIST | 变量不存在 |
VARIABLE_TYPE_MISMATCH | 变量类型不匹配 |
VARIABLE_LENGTH_ERROR | 变量长度错误 |
DATA_TYPE_NO_MATCH | 数据类型不匹配 |
INCOMPATIBLE_ARGUMENTS | 参数不兼容 |
LOGIC_ERROR | 逻辑错误 |
运行时错误
| 错误码 | 说明 |
|---|---|
NULL_REFERENCE | 空引用 |
OUT_OF_MEMORY | 内存不足 |
ALGORITHM_ERROR | 算法错误 |
BAD_DATA_FORMAT | 数据格式错误 |
ProjectControl 接口
变量访问
// 获取变量
template<typename T>
T* Get(const std::string& name);
// 设置变量
template<typename T>
void AddVariable(const std::string& name, const std::vector<T>& value);
// 清除所有变量
void ClearAllVariables();
// 重命名变量
bool RenameVariable(const std::string& oldName, const std::string& newName);
// 删除变量
bool RemoveVariable(const std::string& name);
Job 管理
// 获取 Job 数量
int JobsCount();
// 运行指定 Job
ECode RunJob(int jobIdx, int toolStart, int toolEnd);
// 获取迭代计数
int GetIterationCounter();
void SetIterationCounter(int value);
日志与调试
日志宏
// 推入调用栈信息(调试用)
DLJ_PUSH_CALLSTACK("函数入口");
// 推入警告
DLJ_PUSH_CALLSTACK_W("警告信息");
// 推入错误
DLJ_PUSH_CALLSTACK_E("错误信息");
// 设置最后错误
SET_ERROR("错误描述");
日志示例
ECode MyFilter::do_Filter()
{
DLJ_PUSH_CALLSTACK("开始执行滤波");
if (m_InputImage.empty())
{
DLJ_PUSH_CALLSTACK_E("输入图像为空");
SET_ERROR("InputImage 不能为空");
return ECode::VARIABLE_DOES_NOT_EXIST;
}
DLJ_PUSH_CALLSTACK("滤波完成");
return ECode::ALL_OK;
}
输入解析格式
标量值
"123" // 整数
"3.14" // 浮点数
"hello" // 字符串
"true" // 布尔
列表值
"1,2,3,4,5" // 整数列表
"1.1,2.2,3.3" // 浮点列表
"a,b,c" // 字符串列表
几何类型
"(10,20)" // Point2D
"(10,20,30)" // Point3D
"(10,20,100,80)" // Rectangle2D (X,Y,W,H)
"(50,50,25)" // Circle2D (Cx,Cy,R)
"(0,0),(100,0),(100,100),(0,100)" // Polygon2D
Region 类型
"Rect(10,20,100,80)"
"Circle(50,50,25)"
"Line(0,0,100,100)"
"Polygon((0,0),(100,0),(100,100))"
ExportDll C 接口
| 导出函数 | 返回类型 | 说明 |
|---|---|---|
RegisterAllTools() | int | 注册所有算子 |
DeregisterAllTools() | int | 注销所有算子 |
GetAllToolsNames(count) | const char** | 获取所有算子名 |
GetToolInput(password, name) | const char* | 获取输入 JSON |
GetToolOutput(password, name) | const char* | 获取输出 JSON |
GetToolCategory(password, name) | int | 获取算子分类 |
ProjectRunJob(idx, start, end, ...) | bool | 运行指定 Job |
ProjectGetProgramStructure() | const char* | 获取程序结构 JSON |
程序结构 JSON 格式
{
"jobs": [
{
"name": "Main",
"tools": [
{"idx": 0, "name": "LoadImage"},
{
"idx": 1, "name": "IF", "type": "ControlFlow",
"subJobs": {"then": "Job_Pass", "else": "Job_Fail"}},
{"idx": 2, "name": "SaveResult"}
]
}
]
}