Skip to content

Instantly share code, notes, and snippets.

@vankessel
Last active September 27, 2020 22:35
Show Gist options
  • Save vankessel/b49b96b2be3f6974ad9f866c46402700 to your computer and use it in GitHub Desktop.
Save vankessel/b49b96b2be3f6974ad9f866c46402700 to your computer and use it in GitHub Desktop.
"""Blender add-on that selects all nodes in the current node editor view of the same type as the active node.
Default shortcut is Shift Ctrl Q.
"""
import bpy
bl_info = {
"name": "Select Similar Nodes",
"author": "Kevin van Kessel",
"description": "Select nodes of the same type as the active node",
"version": (1, 0, 0),
"blender": (2, 80, 0),
"category": "Node",
}
class SelectSimilarNodes(bpy.types.Operator):
"""Select nodes of the same type as the active node"""
bl_idname = "node.select_similar_nodes"
bl_label = bl_info["name"]
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def select_similar_nodes_in_same_group(cls, target_node, node_tree):
node_type = target_node.bl_static_type
tree_contains_target_node = False
group_nodes = []
similar_nodes = []
for node in node_tree.nodes:
if node == target_node:
tree_contains_target_node = True
if node.bl_static_type == 'GROUP':
group_nodes.append(node)
if node.bl_static_type == node_type:
similar_nodes.append(node)
if tree_contains_target_node:
for node in similar_nodes:
node.select = True
else:
for group in group_nodes:
cls.select_similar_nodes_in_same_group(target_node, group.node_tree)
def execute(self, context):
target_node = context.active_node
node_tree = context.material.node_tree
SelectSimilarNodes.select_similar_nodes_in_same_group(target_node, node_tree)
return {'FINISHED'}
def menu_func(self, context):
self.layout.operator(SelectSimilarNodes.bl_idname)
addon_keymaps = []
def register():
bpy.utils.register_class(SelectSimilarNodes)
bpy.types.NODE_MT_node.append(menu_func)
wm = bpy.context.window_manager
kc = wm.keyconfigs.addon
if kc:
km = wm.keyconfigs.addon.keymaps.new(name='Node Editor', space_type='NODE_EDITOR')
kmi = km.keymap_items.new(SelectSimilarNodes.bl_idname, 'Q', 'PRESS', shift=True, ctrl=True)
addon_keymaps.append((km, kmi))
def unregister():
addon_keymaps.reverse()
for km, kmi in addon_keymaps:
km.keymap_items.remove(kmi)
addon_keymaps.clear()
bpy.utils.unregister_class(SelectSimilarNodes)
bpy.types.NODE_MT_node.remove(menu_func)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment