[Bf-blender-cvs] [d2442ac] object_nodes: Registering an id property type for ObjectNode subclasses is optional.

Lukas Tönne noreply at git.blender.org
Tue Nov 24 09:42:35 CET 2015


Commit: d2442ac1cf5af13c28d22f3554dd0aa7dcc3a041
Author: Lukas Tönne
Date:   Fri Jul 17 15:39:06 2015 +0200
Branches: object_nodes
https://developer.blender.org/rBd2442ac1cf5af13c28d22f3554dd0aa7dcc3a041

Registering an id property type for ObjectNode subclasses is optional.

===================================================================

M	release/scripts/startup/bl_operators/object_nodes.py
M	source/blender/makesrna/intern/rna_nodetree.c

===================================================================

diff --git a/release/scripts/startup/bl_operators/object_nodes.py b/release/scripts/startup/bl_operators/object_nodes.py
index 161e782..10a6fbe 100644
--- a/release/scripts/startup/bl_operators/object_nodes.py
+++ b/release/scripts/startup/bl_operators/object_nodes.py
@@ -19,23 +19,128 @@
 # <pep8-80 compliant>
 
 import bpy
-from bpy.types import Operator
+import nodeitems_utils
+from bpy.types import Operator, ObjectNode, NodeTree, Node, NodeSocket
 from bpy.props import *
+from nodeitems_utils import NodeCategory, NodeItem
 
-from bpy.types import NodeTree, Node, NodeSocket
-class ObjectNodeTree(NodeTree):
+# our own base class with an appropriate poll function,
+# so the categories only show up in our own tree type
+class ObjectNodeCategory(NodeCategory):
+    @classmethod
+    def poll(cls, context):
+        return context.space_data.tree_type == 'ObjectNodeTree'
+
+node_categories = [
+    ObjectNodeCategory("COMPONENTS", "Components", items=[
+        NodeItem("ForceFieldNode"),
+        ]),
+    ]
+
+###############################################################################
+
+class ObjectNodeTreeBase():
+    @classmethod
+    def get_from_context(cls, context):
+        ob = context.object
+        if ob:
+            return ob.node_tree, ob.node_tree, ob
+        else:
+            return None, None, None
+
+
+class ObjectNodeTree(ObjectNodeTreeBase, NodeTree):
     '''Object component nodes'''
     bl_idname = 'ObjectNodeTree'
     bl_label = 'Object Nodes'
     bl_icon = 'OBJECT_DATA'
 
     @classmethod
-    def get_from_context(cls, context):
-    	ob = context.object
-    	if ob:
-    		return ob.node_tree, ob.node_tree, ob
-    	else:
-    		return None, None, None
+    def register(cls):
+        global node_categories
+        nodeitems_utils.register_node_categories("OBJECT_NODES", node_categories)
+
+    @classmethod
+    def unregister(cls):
+        nodeitems_utils.unregister_node_categories("OBJECT_NODES")
+
+
+class ObjectNodeBase():
+    @classmethod
+    def poll(cls, ntree):
+        return ntree.bl_idname == 'ObjectNodeTree'
+
+
+class ForceFieldNode(ObjectNodeBase, ObjectNode):
+    '''Force Field'''
+    bl_idname = 'ForceFieldNode'
+    bl_label = 'Force Field'
+    bl_icon = 'FORCE_FORCE'
+
+    bl_id_property_type = 'NODETREE'
+    @classmethod
+    def bl_id_property_poll(cls, ntree):
+        return ntree.bl_idname == 'ForceFieldNodeTree'
+
+    def draw_buttons(self, context, layout):
+        layout.template_ID(self, "id")
+
+###############################################################################
+
+class ForceFieldNodeTree(ObjectNodeTreeBase, NodeTree):
+    '''Force field nodes'''
+    bl_idname = 'ForceFieldNodeTree'
+    bl_label = 'Force Field Nodes'
+    bl_icon = 'FORCE_FORCE'
+
+
+class ForceNodeBase():
+    @classmethod
+    def poll(cls, ntree):
+        return ntree.bl_idname == 'ForceFieldNodeTree'
+
+
+class ForceForceNode(ForceNodeBase, ObjectNode):
+    '''Force'''
+    bl_idname = 'ForceForceNode'
+    bl_label = 'Force'
+    bl_icon = 'FORCE_FORCE'
+
+    def init(self, context):
+        self.inputs.new('NodeSocketFloat', "Strength")
+
+###############################################################################
+
+#class TestNode(ObjectNode):
+class TestNode():
+    '''A custom node'''
+    bl_idname = 'TestNode'
+    bl_label = 'Test Node'
+    bl_icon = 'SOUND'
+
+    bl_id_property_type = 'OBJECT'
+
+    myStringProperty = bpy.props.StringProperty()
+    myFloatProperty = bpy.props.FloatProperty(default=3.1415926)
+
+    @classmethod
+    def poll(cls, ntree):
+        return ntree.bl_idname == 'ObjectNodeTree'
+
+    def init(self, context):
+        self.inputs.new('NodeSocketFloat', "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")
+
+    def draw_buttons(self, context, layout):
+        layout.label("Node settings")
+        layout.prop(self, "myFloatProperty")
+        layout.template_ID(self, "id")
+
 
 class ObjectNodesNew(Operator):
     """Create new object node tree"""
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 0f31551..de703a2 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -6738,7 +6738,7 @@ static void rna_def_object_node(BlenderRNA *brna)
 	RNA_def_property_enum_sdna(prop, NULL, "typeinfo->id_property_type");
 	RNA_def_property_enum_items(prop, id_type_items);
 	RNA_def_property_enum_default(prop, ID_OB);
-	RNA_def_property_flag(prop, PROP_REGISTER);
+	RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
 	RNA_def_property_ui_text(prop, "ID Property Type", "Type of ID-block that is used as the id property");
 
 	/* poll */




More information about the Bf-blender-cvs mailing list