2025-07-01

This commit is contained in:
2026-03-17 14:30:01 -06:00
parent f9a22056dd
commit 62b5978595
4579 changed files with 1257472 additions and 0 deletions
@@ -0,0 +1,64 @@
import bpy
from ..base_node import SN_ScriptingBaseNode
from ..templates.VariableReferenceNode import VariableReferenceNode
class SN_ChangeVariableByNode(SN_ScriptingBaseNode, bpy.types.Node, VariableReferenceNode):
bl_idname = "SN_ChangeVariableByNode"
bl_label = "Change Variable By"
node_color = "PROPERTY"
def on_create(self, context):
self.add_execute_input()
self.add_execute_output()
self.add_data_input("Change By")
self.ref_ntree = self.node_tree
operation: bpy.props.EnumProperty(items=[("+=", "Add", "Add to variable value"),
("-=", "Subtract", "Subtract from variable value")],
name="Operation",
description="Operation to perform with the input data",
update=SN_ScriptingBaseNode._evaluate)
def on_var_changed(self):
var = self.get_var()
if var and var.variable_type in ["String", "Integer", "Float"]:
if var.variable_type == "String":
self.operation = "+="
self.convert_socket(self.inputs[1], self.socket_names[var.variable_type])
else:
self.convert_socket(self.inputs[1], self.socket_names["Data"])
def evaluate(self, context):
var = self.get_var()
if var:
if not var.variable_type in ["String", "Integer", "Float"]:
self.code = f"""
{self.indent(self.outputs[0].python_value, 7)}
"""
else:
self.code = f"""
{var.data_path} {self.operation} {self.inputs[1].python_value}
{self.indent(self.outputs[0].python_value, 7)}
"""
else:
self.code = f"""
{self.indent(self.outputs[0].python_value, 6)}
"""
def draw_node(self, context, layout):
self.draw_variable_reference(layout)
var = self.get_var()
if var and var.variable_type in ["Integer", "Float"]:
layout.prop(self, "operation", expand=True)
if var and not var.variable_type in ["String", "Integer", "Float"]:
row = layout.row()
row.alert = True
row.label(text="Not a string, integer or float variable!", icon="ERROR")
@@ -0,0 +1,36 @@
import bpy
from ..base_node import SN_ScriptingBaseNode
from ..templates.VariableReferenceNode import VariableReferenceNode
class SN_GetVariableNode(SN_ScriptingBaseNode, bpy.types.Node, VariableReferenceNode):
bl_idname = "SN_GetVariableNode"
bl_label = "Get Variable"
node_color = "PROPERTY"
def on_create(self, context):
self.add_data_output("Variable")
self.ref_ntree = self.node_tree
def on_var_changed(self):
var = self.get_var()
if var:
self.convert_socket(self.outputs[0], self.socket_names[var.variable_type])
else:
self.convert_socket(self.outputs[0], self.socket_names["Data"])
def evaluate(self, context):
var = self.get_var()
if var:
self.outputs[0].python_value = var.data_path
else:
self.outputs[0].reset_value()
def draw_node(self, context, layout):
self.draw_variable_reference(layout)
@@ -0,0 +1,72 @@
import bpy
from ...base_node import SN_ScriptingBaseNode
from ...templates.VariableReferenceNode import VariableReferenceNode
class SN_AddToListNode(SN_ScriptingBaseNode, bpy.types.Node, VariableReferenceNode):
bl_idname = "SN_AddToListNode"
bl_label = "Add To List"
node_color = "PROPERTY"
def on_create(self, context):
self.add_execute_input()
self.add_execute_output()
self.add_data_input("Item")
self.add_integer_input("Index").set_hide(True)
self.add_list_input("List").set_hide(True)
self.ref_ntree = self.node_tree
def update_method(self, context):
self.inputs["Index"].set_hide(self.method != "Insert")
self._evaluate(context)
method: bpy.props.EnumProperty(name="Method",
description="Method to add the item to the list",
items=[("Append", "Append", "Append"),
("Prepend", "Prepend", "Prepend"),
("Insert", "Insert", "Insert"),
("Extend", "Extend", "Extend")],
update=update_method)
def evaluate(self, context):
var = self.get_var()
if var:
if self.method == "Append":
self.code = f"""
{var.data_path}.append({self.inputs[1].python_value})
{self.indent(self.outputs[0].python_value, 7)}
"""
elif self.method == "Prepend":
self.code = f"""
{var.data_path}.insert(0, {self.inputs[1].python_value})
{self.indent(self.outputs[0].python_value, 7)}
"""
elif self.method == "Insert":
self.code = f"""
{var.data_path}.insert({self.inputs['Index'].python_value}, {self.inputs[1].python_value})
{self.indent(self.outputs[0].python_value, 7)}
"""
elif self.method == "Extend":
self.code = f"""
{var.data_path}.extend({self.inputs[1].python_value})
{self.indent(self.outputs[0].python_value, 7)}
"""
else:
self.code = f"""
{self.indent(self.outputs[0].python_value, 6)}
"""
def draw_node(self, context, layout):
self.draw_variable_reference(layout)
var = self.get_var()
if var and not var.variable_type == "List":
row = layout.row()
row.alert = True
row.label(text="Not a list variable!", icon="ERROR")
layout.prop(self, "method")
@@ -0,0 +1,18 @@
import bpy
from ...base_node import SN_ScriptingBaseNode
class SN_IndexListNode(SN_ScriptingBaseNode, bpy.types.Node):
bl_idname = "SN_IndexListNode"
bl_label = "Index List"
node_color = "LIST"
def on_create(self, context):
self.add_list_input()
self.add_integer_input("Index")
self.add_data_output().changeable = True
def evaluate(self, context):
self.outputs[0].python_value = f"{self.inputs[0].python_value}[{self.inputs[1].python_value}]"
@@ -0,0 +1,18 @@
import bpy
from ...base_node import SN_ScriptingBaseNode
class SN_IndexOfElementNode(SN_ScriptingBaseNode, bpy.types.Node):
bl_idname = "SN_IndexOfElementNode"
bl_label = "Index Of List Element"
node_color = "LIST"
def on_create(self, context):
self.add_list_input()
self.add_data_input("Element")
self.add_integer_output("Index")
def evaluate(self, context):
self.outputs[0].python_value = f"{self.inputs[0].python_value}.index({self.inputs[1].python_value})"
@@ -0,0 +1,18 @@
import bpy
from ...base_node import SN_ScriptingBaseNode
class SN_IsInListNode(SN_ScriptingBaseNode, bpy.types.Node):
bl_idname = "SN_IsInListNode"
bl_label = "Element In List"
node_color = "LIST"
def on_create(self, context):
self.add_list_input()
self.add_data_input("Element")
self.add_boolean_output("Is In List")
def evaluate(self, context):
self.outputs[0].python_value = f"{self.inputs[1].python_value} in {self.inputs[0].python_value}"
@@ -0,0 +1,17 @@
import bpy
from ...base_node import SN_ScriptingBaseNode
class SN_ListLengthNode(SN_ScriptingBaseNode, bpy.types.Node):
bl_idname = "SN_ListLengthNode"
bl_label = "List Length"
node_color = "LIST"
def on_create(self, context):
self.add_list_input()
self.add_integer_output("Length")
def evaluate(self, context):
self.outputs[0].python_value = f"len({self.inputs[0].python_value})"
@@ -0,0 +1,60 @@
from xml.dom.minidom import Element
import bpy
from ...base_node import SN_ScriptingBaseNode
from ...templates.VariableReferenceNode import VariableReferenceNode
class SN_RemoveFromListNode(SN_ScriptingBaseNode, bpy.types.Node, VariableReferenceNode):
bl_idname = "SN_RemoveFromListNode"
bl_label = "Remove From List"
node_color = "PROPERTY"
def on_create(self, context):
self.add_execute_input()
self.add_execute_output()
self.add_data_input("Element")
self.ref_ntree = self.node_tree
def update_method(self, context):
if self.method == "INDEX":
self.convert_socket(self.inputs[1], self.socket_names["Integer"])
self.inputs[1].name = "Index"
else:
self.convert_socket(self.inputs[1], self.socket_names["Data"])
self.inputs[1].name = "Element"
self._evaluate(context)
method: bpy.props.EnumProperty(name="Method",
description="How to find the element to delete",
items=[("ELEMENT", "Element", "Use the elements value to delete it"),
("INDEX", "Index", "Use the elements index to delete it")],
update=update_method)
def evaluate(self, context):
method = "pop" if self.method == "INDEX" else "remove"
var = self.get_var()
if var and var.variable_type == "List":
self.code = f"""
{var.data_path}.{method}({self.inputs[1].python_value})
{self.indent(self.outputs[0].python_value, 6)}
"""
else:
self.code = f"""
{self.indent(self.outputs[0].python_value, 6)}
"""
def draw_node(self, context, layout):
self.draw_variable_reference(layout)
var = self.get_var()
if var and not var.variable_type == "List":
row = layout.row()
row.alert = True
row.label(text="Not a list variable!", icon="ERROR")
elif var:
layout.prop(self, "method", expand=True)
@@ -0,0 +1,18 @@
import bpy
from ...base_node import SN_ScriptingBaseNode
class SN_SortListNode(SN_ScriptingBaseNode, bpy.types.Node):
bl_idname = "SN_SortListNode"
bl_label = "Sort List"
node_color = "LIST"
def on_create(self, context):
self.add_list_input()
self.add_boolean_input("Reverse").default_value = False
self.add_list_output()
def evaluate(self, context):
self.outputs[0].python_value = f"sorted({self.inputs[0].python_value}, reverse={self.inputs['Reverse'].python_value})"
@@ -0,0 +1,35 @@
import bpy
from ..base_node import SN_ScriptingBaseNode
from ..templates.VariableReferenceNode import VariableReferenceNode
class SN_ResetVariableNode(SN_ScriptingBaseNode, bpy.types.Node, VariableReferenceNode):
bl_idname = "SN_ResetVariableNode"
bl_label = "Reset Variable"
node_color = "PROPERTY"
def on_create(self, context):
self.add_execute_input()
self.add_execute_output()
self.ref_ntree = self.node_tree
def evaluate(self, context):
var = self.get_var()
if var:
self.code = f"""
{var.data_path} = {var.var_default}
{self.indent(self.outputs[0].python_value, 6)}
"""
else:
self.code = f"""
{self.indent(self.outputs[0].python_value, 6)}
"""
def draw_node(self, context, layout):
self.draw_variable_reference(layout)
@@ -0,0 +1,43 @@
import bpy
from ..base_node import SN_ScriptingBaseNode
from ..templates.VariableReferenceNode import VariableReferenceNode
class SN_SetVariableNode(SN_ScriptingBaseNode, bpy.types.Node, VariableReferenceNode):
bl_idname = "SN_SetVariableNode"
bl_label = "Set Variable"
node_color = "PROPERTY"
def on_create(self, context):
self.add_execute_input()
self.add_execute_output()
self.add_data_input("Value")
self.ref_ntree = self.node_tree
def on_var_changed(self):
var = self.get_var()
if var:
self.convert_socket(self.inputs[1], self.socket_names[var.variable_type])
else:
self.convert_socket(self.inputs[1], self.socket_names["Data"])
def evaluate(self, context):
var = self.get_var()
if var:
self.code = f"""
{var.data_path} = {self.inputs[1].python_value}
{self.indent(self.outputs[0].python_value, 6)}
"""
else:
self.code = f"""
{self.indent(self.outputs[0].python_value, 6)}
"""
def draw_node(self, context, layout):
self.draw_variable_reference(layout)
@@ -0,0 +1,44 @@
import bpy
from ..base_node import SN_ScriptingBaseNode
from ..templates.VariableReferenceNode import VariableReferenceNode
class SN_ToggleVariableNode(SN_ScriptingBaseNode, bpy.types.Node, VariableReferenceNode):
bl_idname = "SN_ToggleVariableNode"
bl_label = "Toggle Variable"
node_color = "PROPERTY"
def on_create(self, context):
self.add_execute_input()
self.add_execute_output()
self.ref_ntree = self.node_tree
def evaluate(self, context):
var = self.get_var()
if var:
if var.variable_type != "Boolean":
self.code = f"""
{self.indent(self.outputs[0].python_value, 7)}
"""
else:
self.code = f"""
{var.data_path} = not {var.data_path}
{self.indent(self.outputs[0].python_value, 7)}
"""
else:
self.code = f"""
{self.indent(self.outputs[0].python_value, 6)}
"""
def draw_node(self, context, layout):
self.draw_variable_reference(layout)
var = self.get_var()
if var and not var.variable_type == "Boolean":
row = layout.row()
row.alert = True
row.label(text="Not a boolean variable!", icon="ERROR")