2
$\begingroup$

I found out that I can remove panels via python with these command:

bpy.utils.unregister_class(bpy.types.SCENE_PT_physics)
bpy.utils.unregister_class(bpy.types.VIEW3D_MT_add)
...

Ican then customize my interface with an addon. My problem is that I get an error if the panel is already unregistrered. Is there a way to check before unreg? like so:

if bpy.types.SCENE_PT_physics not None:
   bpy.utils.unregister_class(bpy.types.SCENE_PT_physics) 

EDIT (after reply):

Ok so I try do it as posted by Duarte Farrajota Ramos. But would like to automate it so I don't have to write in a console - like this:

import bpy

all_classes = (
bpy.types.VIEW3D_PT_snapping,
)

for single_class in all_classes:
    module = single_class.__module__

    from module.name import single_class

    if module.single_class.is_registered:
    #Do stuff

This doesn't work and I'm not sure how to handle pythons types. That is I'm confused when I have a string of the name of the module or when I have the object it self and what I'm supposed to use when importing several variable modules ect.

$\endgroup$
1
  • 4
    $\begingroup$ hasattr(bpy.types, "SCENE_PT_physics") $\endgroup$
    – lemon
    Nov 23, 2020 at 15:04

1 Answer 1

12
$\begingroup$

Import the class def

If a type is in bpy.types.FOO it implies it is registered.

Wouldn't recommend unregistering using

bpy.utils.unregister_class(bpy.types.FOO)

particularly if you wish to re-register it, as unregistering it removes it from bpy.types.

Rather, would recommend importing them. If you are not sure where the classes are defined, turn on developer extras and view source or check the classes module property

>>> bpy.types.SCENE_PT_physics.__module__
'bl_ui.properties_scene'

Hence can import it, check if it is registered by looking at its is_registered property

>>> from bl_ui.properties_scene import SCENE_PT_physics
>>> SCENE_PT_physics.is_registered
True

>>> bpy.utils.unregister_class(SCENE_PT_physics)

and then re-register if need be to "uncustomize"

>>> SCENE_PT_physics.is_registered
False

>>> bpy.utils.register_class(SCENE_PT_physics)

Note, since most Blender UI code sticks to the convention of putting registerable classes in a list named classes can use this, or the modules register methods.

>>> from bl_ui.properties_scene import classes
>>> classes
(<class 'bl_ui.properties_scene.SCENE_UL_keying_set_paths'>, <class 'bl_ui.properties_scene.SCENE_PT_scene'>, <class 'bl_ui.properties_scene.SCENE_PT_unit'>, <class 'bl_ui.properties_scene.SCENE_PT_physics'>, <class 'bl_ui.properties_scene.SCENE_PT_keying_sets'>, <class 'bl_ui.properties_scene.SCENE_PT_keying_set_paths'>, <class 'bl_ui.properties_scene.SCENE_PT_keyframing_settings'>, <class 'bl_ui.properties_scene.SCENE_PT_audio'>, <class 'bl_ui.properties_scene.SCENE_PT_rigid_body_world'>, <class 'bl_ui.properties_scene.SCENE_PT_rigid_body_world_settings'>, <class 'bl_ui.properties_scene.SCENE_PT_rigid_body_cache'>, <class 'bl_ui.properties_scene.SCENE_PT_rigid_body_field_weights'>, <class 'bl_ui.properties_scene.SCENE_PT_custom_props'>)

Note.

The module bl_ui is blenders UI written in python. The classes listed above are all the UI elements listed in bl_ui.properties_scene ie the PROPERTIES area in SCENE tab.

The idea here is to not use the class from bpy.types rather import it from its appropriate UI submodule.

Hence in your addon code would

from bl_ui.properties_scene import SCENE_PT_physics

As an example, to take out all panels in the Scene Properties

import bpy
from bpy.types import Panel

import bl_ui
# all panels in PROPERTIES > SCENE
scene_prop_panels = [cls for cls in bl_ui.properties_scene.classes
        if issubclass(cls, Panel)]
    
def register():
    # unregister default scene props panels
    for cls in scene_prop_panels:
        if cls.is_registered:
            bpy.utils.unregister_class(cls)

def unregister():
    # unregister default scene props panels
    for cls in scene_prop_panels.reversed():
        if not cls.is_registered:
            bpy.utils.register_class(cls)
            
if __name__ == "__main__":
    register() 
$\endgroup$
2

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .