@@ -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" ) ]
210217public 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>
0 commit comments