Skip to content

Commit 639b79d

Browse files
💾 Feat(Blueprint): 添加 BuiltinFunctionNode 类型及其在 INodeRegistry 中的创建方法
1 parent 27bbe78 commit 639b79d

2 files changed

Lines changed: 58 additions & 1 deletion

File tree

KitX Core Contracts/KitX.Core.Contract/Workflow/BlueprintModels.cs

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,13 @@ public enum BlueprintNodeType
8888
/// Variable declaration node (ConstBlock variables without initial values).
8989
/// A floating node with no ports — users can only change the data type.
9090
/// </summary>
91-
Variable
91+
Variable,
92+
93+
/// <summary>
94+
/// 通用内置函数节点。通过 <c>BuiltinFunctionNode.FunctionName</c> 区分具体函数。
95+
/// 新的内置函数统一使用此类型,无需为每个函数创建专用 enum 值。
96+
/// </summary>
97+
BuiltinFunction
9298
}
9399

94100
/// <summary>
@@ -207,6 +213,7 @@ public class BlueprintPin
207213
[JsonDerivedType(typeof(PrintNode), "Print")]
208214
[JsonDerivedType(typeof(PauseNode), "Pause")]
209215
[JsonDerivedType(typeof(VariableNode), "Variable")]
216+
[JsonDerivedType(typeof(BuiltinFunctionNode), "BuiltinFunction")]
210217
public abstract class BlueprintNode
211218
{
212219
/// <summary>
@@ -655,6 +662,46 @@ public VariableNode()
655662
public override string GetDisplayTitle() => $"Var: {VarName}";
656663
}
657664

665+
/// <summary>
666+
/// 通用内置函数节点。通过 <see cref="FunctionName"/> 区分具体函数。
667+
/// 引脚布局由 <see cref="IBuiltinFunctionDefinition"/> 驱动,
668+
/// 消除了为每个内置函数创建专用节点子类的需要。
669+
/// </summary>
670+
public class BuiltinFunctionNode : BlueprintNode
671+
{
672+
/// <summary>
673+
/// BlockScript 函数名(如 "Flip"),作为具体函数的唯一标识
674+
/// </summary>
675+
public string FunctionName { get; set; } = string.Empty;
676+
677+
/// <summary>
678+
/// 额外属性字典,用于特殊节点(如 Set 的 VarName、Get 的 VarName)
679+
/// </summary>
680+
public Dictionary<string, string> Properties { get; set; } = [];
681+
682+
private NodeDescriptor? _descriptor;
683+
684+
/// <summary>
685+
/// 由 BuiltinFunctionRegistry 在创建节点时设置,基于 IBuiltinFunctionDefinition 的引脚描述
686+
/// </summary>
687+
public void SetDescriptor(NodeDescriptor descriptor) => _descriptor = descriptor;
688+
689+
public override NodeDescriptor GetDescriptor() => _descriptor ?? new(
690+
Width: 120, Height: 60,
691+
InputPins: [],
692+
OutputPins: [],
693+
DisplayName: FunctionName
694+
);
695+
696+
public BuiltinFunctionNode()
697+
{
698+
NodeType = BlueprintNodeType.BuiltinFunction;
699+
Name = "BuiltinFunction";
700+
}
701+
702+
public override string GetDisplayTitle() => FunctionName;
703+
}
704+
658705
/// <summary>
659706
/// Connection between two pins
660707
/// </summary>

KitX Core Contracts/KitX.Core.Contract/Workflow/INodeRegistry.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,14 @@ public interface INodeRegistry
2525
/// Returns all registered node types.
2626
/// </summary>
2727
IReadOnlySet<BlueprintNodeType> RegisteredTypes { get; }
28+
29+
/// <summary>
30+
/// Creates a <see cref="BuiltinFunctionNode"/> pre-configured from an
31+
/// <see cref="IBuiltinFunctionDefinition"/>. The node's pins, dimensions,
32+
/// and display name are all driven by the definition.
33+
/// </summary>
34+
/// <param name="functionName">The built-in function name (must be registered in BuiltinFunctionRegistry)</param>
35+
/// <returns>A fully configured BuiltinFunctionNode</returns>
36+
/// <exception cref="ArgumentException">Thrown when the function name is not registered</exception>
37+
BlueprintNode CreateBuiltinFunctionNode(string functionName);
2838
}

0 commit comments

Comments
 (0)