bl_info = {"name": "Test2.8", "category": "Node"}
import bpy
import nodeitems_utils
class CustomNodeTree(bpy.types.NodeTree):
"""Custom Node Tree"""
bl_idname = "CustomNodeTree"
bl_label = "Custom Node Tree"
bl_icon = "NODETREE"
@classmethod
def poll(tree_class, context):
return True
# class CustomProperty(bpy.types.PropertyGroup):
# pass
# class CustomSocket(byp.types.NodeSocket):
# pass
class CustomNode(bpy.types.Node, CustomNodeTree):
"""Custom Node"""
bl_idname = "CustomNode"
bl_label = "Custom Node"
bl_icon = "OBJECT_DATA"
color: bpy.props.FloatVectorProperty(name="color", size=4, subtype='COLOR')
# socket_value_update(context)
# Update after property changes
def socket_value_update(self, context):
print(str(self) + ": socket_value_update")
def read_input(self, name):
if name not in self.inputs:
return None
for link in self.inputs[name].links:
if link.is_valid:
return link.from_socket.default_value
return self.inputs[name].default_value
# update()
# Update on editor changes
def update(self):
print(str(self) + ": update")
self.color = self.read_input("Input")
self.outputs["Output"].default_value = self.color
print(str(self.inputs["Input"]))
print(str(self.color))
print(str(self.outputs["Output"]))
# init(context)
# Initialize a new instance of this node
def init(self, context):
print("init")
self.inputs.new("NodeSocketColor", "Input")
self.outputs.new("NodeSocketColor", "Output")
# copy(node)
# Initialize a new instance of this node from an existing node
# Parameters: node (Node, (never None)) - Node, Existing node to copy
def copy(self, node):
print(str(self) + ": copy from " + str(node))
self.inputs["Input"].default_value = node.inputs["Input"].default_value
self.color = node.color
# draw_buttons(context, layout)
# Draw node buttons
# Parameters: layout (UILayout, (never None)) - Layout, Layout in the UI
def draw_buttons(self, context, layout):
layout.prop(self, "color")
# draw_buttons_ext(context, layout)
# Draw node buttons in the sidebar
# Parameters: layout (UILayout, (never None)) - Layout, Layout in the UI
def draw_buttons_ext(self, context, layout):
layout.prop(self, "color")
# draw_label()
# Returns a dynamic label string
# Returns: Label
# Return type: string, (never None)
def draw_label(self):
return "Custom Node"
@classmethod
def poll(node_class, context):
return True
class CustomNodeCategory(nodeitems_utils.NodeCategory):
@classmethod
def poll(category_class, context):
return True
node_categories = [
CustomNodeCategory(
"CUSTOM",
"Custom",
items = [
nodeitems_utils.NodeItem("CustomNode")
]
)
]
registered = False
classes = (
CustomNodeTree,
CustomNode,
)
class_reg, class_unreg = bpy.utils.register_classes_factory(classes)
def register():
class_reg()
nodeitems_utils.register_node_categories("CUSTOM", node_categories)
registered = True
def unregister():
try:
nodeitems_utils.unregister_node_categories("CUSTOM")
except:
print("Failed to unregister CUSTOM")
class_unreg()
registered = False
if __name__ == "__main__":
print("\n")
try:
unregister()
except:
print("Failed to unregister")
# try:
# register()
# except:
# print("Failed to register")
register()
Comments