[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49755] trunk/blender/release/scripts/ startup/bl_operators/node.py: Extended the search operator for nodes to also support node groups.

Lukas Toenne lukas.toenne at googlemail.com
Fri Aug 10 09:22:36 CEST 2012


Revision: 49755
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49755
Author:   lukastoenne
Date:     2012-08-10 07:22:36 +0000 (Fri, 10 Aug 2012)
Log Message:
-----------
Extended the search operator for nodes to also support node groups. The basic node group type is not included in the node items list, instead all existing node groups are added to the items list in the callback. A prefix is used to distinguish base node types from node groups.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_operators/node.py

Modified: trunk/blender/release/scripts/startup/bl_operators/node.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_operators/node.py	2012-08-10 07:22:33 UTC (rev 49754)
+++ trunk/blender/release/scripts/startup/bl_operators/node.py	2012-08-10 07:22:36 UTC (rev 49755)
@@ -32,6 +32,24 @@
 # lazy init
 node_type_items_dict = {}
 
+# Prefixes used to distinguish base node types and node groups
+node_type_prefix = 'NODE_'
+node_group_prefix = 'GROUP_'
+
+# Generate a list of enum items for a given node class
+# Copy existing type enum, adding a prefix to distinguish from node groups
+# Skip the base node group type, node groups will be added below for all existing group trees
+def node_type_items(node_class):
+    return [(node_type_prefix + item.identifier, item.name, item.description)
+                    for item in node_class.bl_rna.properties['type'].enum_items if item.identifier != 'GROUP']
+
+# Generate items for node group types
+# Filter by the given tree_type 
+# Node group trees don't have a description property yet (could add this as a custom property though)
+def node_group_items(tree_type):
+    return [(node_group_prefix + group.name, group.name, '')
+                    for group in bpy.data.node_groups if group.type == tree_type]
+
 # Returns the enum item list for the edited tree in the context
 def node_type_items_cb(self, context):
     snode = context.space_data
@@ -41,21 +59,19 @@
     if not tree:
         return []
 
+    # Lists of basic node types for each 
     if not node_type_items_dict:
         node_type_items_dict.update({
-            'SHADER': [(item.identifier, item.name, item.description, item.value)
-                    for item in bpy.types.ShaderNode.bl_rna.properties['type'].enum_items],
-            'COMPOSITING': [(item.identifier, item.name, item.description, item.value)
-                    for item in bpy.types.CompositorNode.bl_rna.properties['type'].enum_items],
-            'TEXTURE': [(item.identifier, item.name, item.description, item.value)
-                    for item in bpy.types.TextureNode.bl_rna.properties['type'].enum_items],
+            'SHADER': node_type_items(bpy.types.ShaderNode),
+            'COMPOSITING': node_type_items(bpy.types.CompositorNode),
+            'TEXTURE': node_type_items(bpy.types.TextureNode),
             })
 
     # XXX Does not work correctly, see comment above
     #return [(item.identifier, item.name, item.description, item.value) for item in tree.nodes.bl_rna.functions['new'].parameters['type'].enum_items]
 
     if tree.type in node_type_items_dict:
-        return node_type_items_dict[tree.type]
+        return node_type_items_dict[tree.type] + node_group_items(tree.type)
     else:
         return []
 
@@ -79,7 +95,17 @@
         space = context.space_data
         tree = space.edit_tree
 
-        node = tree.nodes.new(type=self.type)
+        # Enum item identifier has an additional prefix to distinguish base node types from node groups
+        item = self.type
+        if (item.startswith(node_type_prefix)):
+            # item means base node type
+            node = tree.nodes.new(type=item[len(node_type_prefix):])
+        elif (item.startswith(node_group_prefix)):
+            # item means node group type
+            node = tree.nodes.new(type='GROUP', group=bpy.data.node_groups[item[len(node_group_prefix):]])
+        else:
+            return None
+
         for n in tree.nodes:
             if n == node:
                 node.select = True




More information about the Bf-blender-cvs mailing list