Implemented Show() method for the connector base class; all inheriting connectors no longer need to maintain their own separate Show() methods. && Assigned distinct drawing colors for exclusive input type connectors and their associated connections. && Improved the workflow packet passing execution process among existing connectors. && Removed some redundant code.

This commit is contained in:
LuChiChick 2026-05-19 20:18:50 +08:00
parent 35636fd438
commit 80a18b6a79
4 changed files with 101 additions and 130 deletions

View File

@ -84,8 +84,8 @@ public:
// 获取套接字字符串
virtual const char *Get_Socket_Str(void);
// 绘制连接点
virtual void Show(void) = 0;
// 默认风格连接点绘制
virtual void Show(void);
};
// =====================================节点抽象======================================================
@ -156,20 +156,6 @@ public:
// ====================================接口类声明================================================
// Boolean 状态输出接口
class Boolean_OutPut_Connector : public Abs_Connector
{
public:
// 显式禁用默认构造
Boolean_OutPut_Connector() = delete;
// 必要构造
explicit Boolean_OutPut_Connector(Independent_ID_Generator *ID_Generator);
// 绘制接口
virtual void Show(void);
};
// Boolean 状态输入接口
class Boolean_InPut_Connector : public Abs_Connector
{
@ -178,24 +164,18 @@ public:
Boolean_InPut_Connector() = delete;
// 必要构造
explicit Boolean_InPut_Connector(Independent_ID_Generator *ID_Generator, bool exclusive_flag = false);
// 绘制接口
virtual void Show(void);
explicit Boolean_InPut_Connector(Independent_ID_Generator *ID_Generator, bool exclusive_flag = false) : Abs_Connector(ID_Generator, exclusive_flag ? CONNECTOR_TYPE_INPUT_EXCLUSIVE : CONNECTOR_TYPE_INPUT, "Boolean") {}
};
// DLT信息输出接口
class MSG_OutPut_Connector : public Abs_Connector
// Boolean 状态输出接口
class Boolean_OutPut_Connector : public Abs_Connector
{
public:
// 显式禁用默认构造
MSG_OutPut_Connector() = delete;
Boolean_OutPut_Connector() = delete;
// 必要构造
explicit MSG_OutPut_Connector(Independent_ID_Generator *ID_Generator);
// 绘制接口
virtual void Show(void);
explicit Boolean_OutPut_Connector(Independent_ID_Generator *ID_Generator) : Abs_Connector(ID_Generator, CONNECTOR_TYPE_OUTPUT, "Boolean") {}
};
// DLT信息输入接口
@ -206,10 +186,18 @@ public:
MSG_InPut_Connector() = delete;
// 必要构造
explicit MSG_InPut_Connector(Independent_ID_Generator *ID_Generator, bool exclusive_flag = false);
explicit MSG_InPut_Connector(Independent_ID_Generator *ID_Generator, bool exclusive_flag = false) : Abs_Connector(ID_Generator, exclusive_flag ? CONNECTOR_TYPE_INPUT_EXCLUSIVE : CONNECTOR_TYPE_INPUT, "DLT MSG") {}
};
// 绘制接口
virtual void Show(void);
// DLT信息输出接口
class MSG_OutPut_Connector : public Abs_Connector
{
public:
// 显式禁用默认构造
MSG_OutPut_Connector() = delete;
// 必要构造
explicit MSG_OutPut_Connector(Independent_ID_Generator *ID_Generator) : Abs_Connector(ID_Generator, CONNECTOR_TYPE_OUTPUT, "DLT MSG") {}
};
// CSV 列输入接口
@ -220,10 +208,7 @@ public:
CSV_Column_Input_Connector() = delete;
// 必要构造
explicit CSV_Column_Input_Connector(Independent_ID_Generator *ID_Generator, bool exclusive_flag = false);
// 绘制接口
virtual void Show(void);
explicit CSV_Column_Input_Connector(Independent_ID_Generator *ID_Generator, bool exclusive_flag = false) : Abs_Connector(ID_Generator, exclusive_flag ? CONNECTOR_TYPE_INPUT_EXCLUSIVE : CONNECTOR_TYPE_INPUT, "CSV Column") {}
};
// CSV 列输出接口
@ -234,10 +219,7 @@ public:
CSV_Column_Output_Connector() = delete;
// 必要构造
explicit CSV_Column_Output_Connector(Independent_ID_Generator *ID_Generator);
// 绘制接口
virtual void Show(void);
explicit CSV_Column_Output_Connector(Independent_ID_Generator *ID_Generator) : Abs_Connector(ID_Generator, CONNECTOR_TYPE_OUTPUT, "CSV Column") {}
};
// ====================================节点类声明================================================

View File

@ -24,6 +24,11 @@ protected:
int id = -1; // 边ID
int source_connector_id = -1; // 源连接点
int target_connector_id = -1; // 目标连接点
enum Edge_Type_Enum
{
EDGE_TYPE_NORMAL, // 普通边
EDGE_TYPE_EXCLUSIVE, // 独占边
} type = EDGE_TYPE_NORMAL;
} Edge;
// 数据池

View File

@ -230,6 +230,45 @@ const char *Abs_Connector::Get_Socket_Str(void)
{
return this->socket_str;
}
// 默认风格连接点绘制
void Abs_Connector::Show(void)
{
switch (this->type)
{
case CONNECTOR_TYPE_OUTPUT: // 常规输出接口
ImNodes::BeginOutputAttribute(this->id, ImNodesPinShape_CircleFilled);
ImGui::Dummy(ImVec2(0.0f, ImGui::GetTextLineHeight())); // 填充高度为字符高度
ImNodes::EndOutputAttribute();
break;
case CONNECTOR_TYPE_INPUT: // 常规输入接口
ImNodes::BeginInputAttribute(this->id, ImNodesPinShape_CircleFilled);
ImGui::Dummy(ImVec2(0.0f, ImGui::GetTextLineHeight())); // 填充高度为字符高度
ImNodes::EndInputAttribute();
break;
case CONNECTOR_TYPE_INPUT_EXCLUSIVE: // 独占输入接口
ImNodes::PushColorStyle(ImNodesCol_Pin, IM_COL32(50, 120, 160, 160)); // 常规配色
ImNodes::PushColorStyle(ImNodesCol_PinHovered, IM_COL32(0, 110, 175, 255)); // Hover 配色
ImNodes::BeginInputAttribute(this->id, ImNodesPinShape_CircleFilled);
ImGui::Dummy(ImVec2(0.0f, ImGui::GetTextLineHeight())); // 填充高度为字符高度
ImNodes::EndInputAttribute();
ImNodes::PopColorStyle();
ImNodes::PopColorStyle();
break;
default:
break;
}
}
// =================================================================================================
// 必要构造
@ -301,86 +340,6 @@ std::vector<std::shared_ptr<Abs_Connector>> &Abs_Node::Get_Connector_List(void)
// =================================================================================================
// 必要构造
Boolean_InPut_Connector::Boolean_InPut_Connector(Independent_ID_Generator *ID_Generator, bool exclusive_flag) : Abs_Connector(ID_Generator, exclusive_flag ? CONNECTOR_TYPE_INPUT_EXCLUSIVE : CONNECTOR_TYPE_INPUT, "Boolean") {}
// 绘制接口
void Boolean_InPut_Connector::Show(void)
{
// 输出接口点
ImNodes::BeginInputAttribute(this->id, ImNodesPinShape_CircleFilled);
// 填充占位
ImGui::Dummy(ImVec2(0.0f, ImGui::GetTextLineHeight()));
ImNodes::EndInputAttribute();
}
// 必要构造
Boolean_OutPut_Connector::Boolean_OutPut_Connector(Independent_ID_Generator *ID_Generator) : Abs_Connector(ID_Generator, CONNECTOR_TYPE_OUTPUT, "Boolean") {}
// 绘制接口
void Boolean_OutPut_Connector::Show(void)
{
// 输出接口点
ImNodes::BeginOutputAttribute(this->id, ImNodesPinShape_CircleFilled);
// 填充占位
ImGui::Dummy(ImVec2(0.0f, ImGui::GetTextLineHeight()));
ImNodes::EndOutputAttribute();
}
// 必要构造
MSG_InPut_Connector::MSG_InPut_Connector(Independent_ID_Generator *ID_Generator, bool exclusive_flag) : Abs_Connector(ID_Generator, exclusive_flag ? CONNECTOR_TYPE_INPUT_EXCLUSIVE : CONNECTOR_TYPE_INPUT, "DLT MSG") {}
// 绘制接口
void MSG_InPut_Connector::Show(void)
{
// 输出接口点
ImNodes::BeginInputAttribute(this->id, ImNodesPinShape_CircleFilled);
// 填充占位
ImGui::Dummy(ImVec2(0.0f, ImGui::GetTextLineHeight()));
ImNodes::EndInputAttribute();
}
// 必要构造
MSG_OutPut_Connector::MSG_OutPut_Connector(Independent_ID_Generator *ID_Generator) : Abs_Connector(ID_Generator, CONNECTOR_TYPE_OUTPUT, "DLT MSG") {}
// 绘制接口
void MSG_OutPut_Connector::Show(void)
{
// 输出接口点
ImNodes::BeginOutputAttribute(this->id, ImNodesPinShape_CircleFilled);
// 填充占位
ImGui::Dummy(ImVec2(0.0f, ImGui::GetTextLineHeight()));
ImNodes::EndOutputAttribute();
}
// 必要构造
CSV_Column_Input_Connector::CSV_Column_Input_Connector(Independent_ID_Generator *ID_Generator, bool exclusive_flag) : Abs_Connector(ID_Generator, exclusive_flag ? CONNECTOR_TYPE_INPUT_EXCLUSIVE : CONNECTOR_TYPE_INPUT, "CSV Column") {}
// 绘制接口
void CSV_Column_Input_Connector::Show()
{
// 输出接口点
ImNodes::BeginInputAttribute(this->id, ImNodesPinShape_TriangleFilled);
// 填充占位
ImGui::Dummy(ImVec2(0.0f, ImGui::GetTextLineHeight()));
ImNodes::EndInputAttribute();
}
// 必要构造
CSV_Column_Output_Connector::CSV_Column_Output_Connector(Independent_ID_Generator *ID_Generator) : Abs_Connector(ID_Generator, CONNECTOR_TYPE_OUTPUT, "CSV Column") {}
// 绘制接口
void CSV_Column_Output_Connector::Show()
{
// 输出接口点
ImNodes::BeginOutputAttribute(this->id, ImNodesPinShape_TriangleFilled);
// 填充占位
ImGui::Dummy(ImVec2(0.0f, ImGui::GetTextLineHeight()));
ImNodes::EndOutputAttribute();
}
// =================================================================================================
// 必要构造
Connector_Test_Node::Connector_Test_Node(Independent_ID_Generator *Node_ID_Generator,
Independent_ID_Generator *Connector_ID_Generator,
@ -553,6 +512,8 @@ bool Connector_Test_Node::Execute_Process(void)
auto pkg = this->Connector_List[0]->Get_Related_List()[0]->Get_Package();
this->Connector_List[1]->Register_Package(pkg.p_content_mem, pkg.content_size, pkg.package_count, pkg.total_count);
}
else
this->Connector_List[1]->Register_Package(nullptr, 0, 0, 0);
// Boolean 相关接口
if (!this->Connector_List[2]->Get_Related_List().empty())
@ -562,6 +523,8 @@ bool Connector_Test_Node::Execute_Process(void)
auto pkg = this->Connector_List[2]->Get_Related_List()[0]->Get_Package();
this->Connector_List[3]->Register_Package(pkg.p_content_mem, pkg.content_size, pkg.package_count, pkg.total_count);
}
else
this->Connector_List[3]->Register_Package(nullptr, 0, 0, 0);
// CSV 相关接口
if (!this->Connector_List[4]->Get_Related_List().empty())
@ -571,6 +534,8 @@ bool Connector_Test_Node::Execute_Process(void)
auto pkg = this->Connector_List[4]->Get_Related_List()[0]->Get_Package();
this->Connector_List[5]->Register_Package(pkg.p_content_mem, pkg.content_size, pkg.package_count, pkg.total_count);
}
else
this->Connector_List[5]->Register_Package(nullptr, 0, 0, 0);
return true;
}
@ -774,7 +739,7 @@ Filter_Node::Filter_Node(Independent_ID_Generator *Node_ID_Generator,
if (this->id != -1)
{
// Boolean 输入节点
this->Connector_List.push_back(std::make_shared<Boolean_InPut_Connector>(Connector_ID_Generator, true)); // [0] -> Boolean
this->Connector_List.push_back(std::make_shared<Boolean_InPut_Connector>(Connector_ID_Generator)); // [0] -> Boolean
// 消息输出节点
this->Connector_List.push_back(std::make_shared<MSG_InPut_Connector>(Connector_ID_Generator, true)); // [1] -> MSG
@ -905,23 +870,22 @@ bool Filter_Node::Execute_Process(void)
bool pass_allow = false;
for (auto input : this->Connector_List[0]->Get_Related_List())
if (*((bool *)input->Get_Package().p_content_mem) == true)
{
auto pkg = input->Get_Package();
if ((pkg.content_size != 0) && ((*((bool *)pkg.p_content_mem)) == true))
{
pass_allow = true;
break;
}
auto pkg = this->Connector_List[1]->Get_Package();
}
if (pass_allow)
{
auto pkg = this->Connector_List[1]->Get_Package();
this->Connector_List[2]->Register_Package(pkg.p_content_mem, pkg.content_size, pkg.package_count, pkg.total_count);
}
else
{
}
// 注册产物
this->Connector_List[2]->Register_Package(pkg.p_content_mem, pkg.content_size, pkg.package_count, pkg.total_count);
this->Connector_List[2]->Register_Package(nullptr, 0, 0, 0);
return true;
}

View File

@ -102,8 +102,20 @@ void Workflow_Editor::Show(void)
// 显示所有的连线
for (auto Edge : this->Edge_Pool)
ImNodes::Link(Edge.id, Edge.source_connector_id, Edge.target_connector_id);
{
if (Edge.type == Edge::Edge_Type_Enum::EDGE_TYPE_EXCLUSIVE)
{
ImNodes::PushColorStyle(ImNodesCol_Link, IM_COL32(50, 120, 160, 160));
ImNodes::PushColorStyle(ImNodesCol_LinkHovered, IM_COL32(0, 110, 175, 255));
ImNodes::PushColorStyle(ImNodesCol_LinkSelected, IM_COL32(0, 110, 175, 255));
ImNodes::Link(Edge.id, Edge.source_connector_id, Edge.target_connector_id);
ImNodes::PopColorStyle();
ImNodes::PopColorStyle();
ImNodes::PopColorStyle();
}
else
ImNodes::Link(Edge.id, Edge.source_connector_id, Edge.target_connector_id);
}
// 缩略图
ImNodes::MiniMap(0.2f, ImNodesMiniMapLocation_TopRight);
}
@ -433,9 +445,13 @@ bool Workflow_Editor::Add_Link(int source_connector_id, int target_connector_id)
}
}
// 连接点独占标记
bool is_connector_exclusive = false;
// 独占输入类型,清除所有其它的连接
if (p_source_connector->Get_Type() == Abs_Connector::CONNECTOR_TYPE_INPUT_EXCLUSIVE)
{
is_connector_exclusive = true;
auto source_id = p_source_connector->Get_ID();
auto List = p_source_connector->Get_Related_List();
for (auto connector : List)
@ -445,6 +461,7 @@ bool Workflow_Editor::Add_Link(int source_connector_id, int target_connector_id)
// 独占输入类型,清除所有其它的连接
if (p_target_connector->Get_Type() == Abs_Connector::CONNECTOR_TYPE_INPUT_EXCLUSIVE)
{
is_connector_exclusive = true;
auto target_id = p_target_connector->Get_ID();
auto List = p_target_connector->Get_Related_List();
for (auto connector : List)
@ -453,7 +470,10 @@ bool Workflow_Editor::Add_Link(int source_connector_id, int target_connector_id)
// 先尝试连接,成功后再记录到边池
if (p_source_connector->Connect_To(p_target_connector.get()) == true)
this->Edge_Pool.push_back({this->Edge_ID_Generator.Request_ID(), source_connector_id, target_connector_id});
this->Edge_Pool.push_back({this->Edge_ID_Generator.Request_ID(),
source_connector_id,
target_connector_id,
is_connector_exclusive ? Edge::Edge_Type_Enum::EDGE_TYPE_EXCLUSIVE : Edge::Edge_Type_Enum::EDGE_TYPE_NORMAL});
return true;
}