2025-07-01
This commit is contained in:
@@ -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}]"
|
||||
+18
@@ -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})"
|
||||
+60
@@ -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")
|
||||
Reference in New Issue
Block a user