So I was making node groups the other day, and had a thought... "Hey, could I put these into one of blender's premade categories?" I searched far and wide, climbed mountains, ventured across multiple landscapes, but found no answer. So what I want to do, is put these node groups into the default blender categories, or possibly make my own category. I do not want to go into "Group" every time. How can I do this?
-
$\begingroup$ AFAIK Can only be done using python and I guess that isn't worth it ... $\endgroup$– brockmannApr 13, 2021 at 21:18
-
$\begingroup$ Well I would like to know how to do it, even if it's a little complicated. $\endgroup$– Zany_Zachary1Apr 13, 2021 at 21:19
-
$\begingroup$ @Zany_Zachary1 you'll need to override some functions of nodeitems_utils and nodeitems_builtins modules. It's not a simple thing but it's possible. $\endgroup$– SecropApr 14, 2021 at 7:05
-
$\begingroup$ only batFinger can help here... ;) $\endgroup$– ChrisApr 14, 2021 at 7:17
-
$\begingroup$ batFinger the GitHubber? Also, I'm a total noob at coding, so I'll probably not modify any modules or anything. $\endgroup$– Zany_Zachary1Apr 14, 2021 at 12:41
1 Answer
The simplest way to do it is using a python script.
First thing to do is to changing your node group name to have a '.'
at the start, i.e: myXptoNodeGroup
>> .myXptoNodeGroup
. This way, the nodegroup will no longer appear in the "Group" menu.
The second thing to do is editing the following script by adding your nodegroup(s) to the items list of the ShaderNodeCategory
instead of '.myXptoNodeGroup'
, and run the script:
import bpy
from nodeitems_utils import register_node_categories, unregister_node_categories, NodeItem
from nodeitems_builtins import ShaderNodeCategory
node_categories = [
ShaderNodeCategory('SOMENODES', "Some Nodes", items=[
NodeItem('ShaderNodeGroup', "myXptoNodeGroup", {"node_tree": "bpy.data.node_groups['.myXptoNodeGroup']"} ),
]),
]
def register():
register_node_categories('MYGROUPNODES', node_categories)
def unregister():
unregister_node_categories('MYGROUPNODES')
if __name__ == "__main__":
register()
Of course, this is not exclusive to ShaderNodeGroups
, it's just a matter to change the corresponding NodeCategory
, and the NodeGroup
type for the NodeItem
.
-
$\begingroup$ This is great!!! Is there any way that I can reorder it, to put it above the "Textures" Category? $\endgroup$ Apr 14, 2021 at 18:11
-
$\begingroup$ Humm.. yes there is, but it's a bit hidden... The order of shadernodes is stored in a list inside the _node_categories in the nodeitems_utils module... in there you can use
L.insert(3, L.pop())
right after registering.. (3 is the index of the TextureCategory, andL=nodeitems_utils._node_categories['SHADER'][0]
) $\endgroup$– SecropApr 14, 2021 at 18:37 -
$\begingroup$ So I tried to add that, right after the registration, and it broke the addon. I deleted it, and it still didn't install. I guess it isn't really a big deal though, I'll just remake the addon. $\endgroup$ Apr 15, 2021 at 13:00
-
$\begingroup$ I know why, but it's difficult to explain it in just a small comment.. If you can digest the structure of the
_nodes_categories
dictionary, and how thedraw_node_categories_menu
calls each category, you'll find that your nodes aren't stored in the same place where builtin nodes are. It's quite tricky to change this without breaking everything (though it's surely possible to do it). $\endgroup$– SecropApr 15, 2021 at 13:25 -
$\begingroup$ I've written some functions that manipulate the
_node_categories
directly, that you can also take a look; though I don't advise you to use them without understanding what each line of code does.. You could check [github.com/Secrop/ShaderNodesExtra2.80/blob/master/__init__.py] , specially theaddCat
anddelCat
functions in the end of that file $\endgroup$– SecropApr 15, 2021 at 13:38