From 3fe01ecfd9bb9cd9a2cff5cf27c32cdaace95400 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Sun, 9 Jun 2013 09:49:44 +0000 Subject: Removed the unused draw_add_menu function from pynodes template. This was previously used to extend the node Add menu, now the node categories system is used instead. --- release/scripts/templates_py/custom_nodes.py | 9 -- .../scripts/templates_py/custom_nodes_groups.py | 178 +++++++++++++++++++++ 2 files changed, 178 insertions(+), 9 deletions(-) create mode 100644 release/scripts/templates_py/custom_nodes_groups.py (limited to 'release') diff --git a/release/scripts/templates_py/custom_nodes.py b/release/scripts/templates_py/custom_nodes.py index 48dbfd4749a..d5bb71416c9 100644 --- a/release/scripts/templates_py/custom_nodes.py +++ b/release/scripts/templates_py/custom_nodes.py @@ -4,10 +4,6 @@ from bpy_types import NodeTree, Node, NodeSocket # Implementation of custom nodes from Python -# Shortcut for node type menu -def add_nodetype(layout, type): - layout.operator("node.add_node", text=type.bl_label).type = type.bl_rna.identifier - # Derived from the NodeTree base type, similar to Menu, Operator, Panel, etc. class MyCustomTree(NodeTree): # Description string @@ -22,11 +18,6 @@ class MyCustomTree(NodeTree): # Only one base tree class is needed in the editor for selecting the general category bl_icon = 'NODETREE' - def draw_add_menu(self, context, layout): - layout.label("Hello World!") - add_nodetype(layout, bpy.types.CustomNodeType) - add_nodetype(layout, bpy.types.MyCustomGroup) - # Custom socket type class MyCustomSocket(NodeSocket): diff --git a/release/scripts/templates_py/custom_nodes_groups.py b/release/scripts/templates_py/custom_nodes_groups.py new file mode 100644 index 00000000000..48dbfd4749a --- /dev/null +++ b/release/scripts/templates_py/custom_nodes_groups.py @@ -0,0 +1,178 @@ +import bpy +from bpy_types import NodeTree, Node, NodeSocket + +# Implementation of custom nodes from Python + + +# Shortcut for node type menu +def add_nodetype(layout, type): + layout.operator("node.add_node", text=type.bl_label).type = type.bl_rna.identifier + +# Derived from the NodeTree base type, similar to Menu, Operator, Panel, etc. +class MyCustomTree(NodeTree): + # Description string + '''A custom node tree type that will show up in the node editor header''' + # Optional identifier string. If not explicitly defined, the python class name is used. + bl_idname = 'CustomTreeType' + # Label for nice name display + bl_label = 'Custom Node Tree' + # Icon identifier + # NOTE: If no icon is defined, the node tree will not show up in the editor header! + # This can be used to make additional tree types for groups and similar nodes (see below) + # Only one base tree class is needed in the editor for selecting the general category + bl_icon = 'NODETREE' + + def draw_add_menu(self, context, layout): + layout.label("Hello World!") + add_nodetype(layout, bpy.types.CustomNodeType) + add_nodetype(layout, bpy.types.MyCustomGroup) + + +# Custom socket type +class MyCustomSocket(NodeSocket): + # Description string + '''Custom node socket type''' + # Optional identifier string. If not explicitly defined, the python class name is used. + bl_idname = 'CustomSocketType' + # Label for nice name display + bl_label = 'Custom Node Socket' + + # Enum items list + my_items = [ + ("DOWN", "Down", "Where your feet are"), + ("UP", "Up", "Where your head should be"), + ("LEFT", "Left", "Not right"), + ("RIGHT", "Right", "Not left") + ] + + myEnumProperty = bpy.props.EnumProperty(name="Direction", description="Just an example", items=my_items, default='UP') + + # Optional function for drawing the socket input value + def draw(self, context, layout, node, text): + if self.is_linked: + layout.label(text) + else: + layout.prop(self, "myEnumProperty", text=text) + + # Socket color + def draw_color(self, context, node): + return (1.0, 0.4, 0.216, 0.5) + +# Mix-in class for all custom nodes in this tree type. +# Defines a poll function to enable instantiation. +class MyCustomTreeNode : + @classmethod + def poll(cls, ntree): + return ntree.bl_idname == 'CustomTreeType' + +# Derived from the Node base type. +class MyCustomNode(Node, MyCustomTreeNode): + # === Basics === + # Description string + '''A custom node''' + # Optional identifier string. If not explicitly defined, the python class name is used. + bl_idname = 'CustomNodeType' + # Label for nice name display + bl_label = 'Custom Node' + # Icon identifier + bl_icon = 'SOUND' + + # === Custom Properties === + # These work just like custom properties in ID data blocks + # Extensive information can be found under + # http://wiki.blender.org/index.php/Doc:2.6/Manual/Extensions/Python/Properties + myStringProperty = bpy.props.StringProperty() + myFloatProperty = bpy.props.FloatProperty(default=3.1415926) + + # === Optional Functions === + # Initialization function, called when a new node is created. + # This is the most common place to create the sockets for a node, as shown below. + # NOTE: this is not the same as the standard __init__ function in Python, which is + # a purely internal Python method and unknown to the node system! + def init(self, context): + self.inputs.new('CustomSocketType', "Hello") + self.inputs.new('NodeSocketFloat', "World") + self.inputs.new('NodeSocketVector', "!") + + self.outputs.new('NodeSocketColor', "How") + self.outputs.new('NodeSocketColor', "are") + self.outputs.new('NodeSocketFloat', "you") + + # Copy function to initialize a copied node from an existing one. + def copy(self, node): + print("Copying from node ", node) + + # Free function to clean up on removal. + def free(self): + print("Removing node ", self, ", Goodbye!") + + # Additional buttons displayed on the node. + def draw_buttons(self, context, layout): + layout.label("Node settings") + layout.prop(self, "myFloatProperty") + + # Detail buttons in the sidebar. + # If this function is not defined, the draw_buttons function is used instead + def draw_buttons_ext(self, context, layout): + layout.prop(self, "myFloatProperty") + # myStringProperty button will only be visible in the sidebar + layout.prop(self, "myStringProperty") + + +### Node Categories ### +# Node categories are a python system for automatically +# extending the Add menu, toolbar panels and search operator. +# For more examples see release/scripts/startup/nodeitems_builtins.py + +import nodeitems_utils +from nodeitems_utils import NodeCategory, NodeItem + +# our own base class with an appropriate poll function, +# so the categories only show up in our own tree type +class MyNodeCategory(NodeCategory): + @classmethod + def poll(cls, context): + return context.space_data.tree_type == 'CustomTreeType' + +# all categories in a list +node_categories = [ + # identifier, label, items list + MyNodeCategory("SOMENODES", "Some Nodes", items=[ + # our basic node + NodeItem("CustomNodeType"), + ]), + MyNodeCategory("OTHERNODES", "Other Nodes", items=[ + # the node item can have additional settings, + # which are applied to new nodes + # NB: settings values are stored as string expressions, + # for this reason they should be converted to strings using repr() + NodeItem("CustomNodeType", label="Node A", settings={ + "myStringProperty" : repr("Lorem ipsum dolor sit amet"), + "myFloatProperty" : repr(1.0), + }), + NodeItem("CustomNodeType", label="Node B", settings={ + "myStringProperty" : repr("consectetur adipisicing elit"), + "myFloatProperty" : repr(2.0), + }), + ]), + ] + + +def register(): + bpy.utils.register_class(MyCustomTree) + bpy.utils.register_class(MyCustomSocket) + bpy.utils.register_class(MyCustomNode) + + nodeitems_utils.register_node_categories("CUSTOM_NODES", node_categories) + + +def unregister(): + nodeitems_utils.unregister_node_categories("CUSTOM_NODES") + + bpy.utils.unregister_class(MyCustomTree) + bpy.utils.unregister_class(MyCustomSocket) + bpy.utils.unregister_class(MyCustomNode) + + +if __name__ == "__main__": + register() -- cgit v1.2.3