Is it possible to simulate the Shift+LMB for hiding a parent object with its children as in the outliner. Now based on this and this I am iterating over the children objects and hide_set(True) them individually:
def toggle_hide (list, mode=True):
children_list = []
for obj in list:
if obj.children:
children_list.append(obj.children)
obj.hide_set(mode)
if children_list:
for child in children_list:
toggle_hide (child)
bpy.data.objects["parent"].hide_set(True)
toggle_hide(bpy.data.objects["parent"].children)
bpy.data.objects["parent"].hide_set(True) hides only the parent object leaving the children unhidden, which I need to do it afterwards recursively.
My guess is that under the hood might be the same procedure that is happening but I was wondering if someone can just call the corresponding outliner build in function instead of re-implementing it or by passing some flag to the hide_set() though as I see it takes only a view_layer id.
Update (not working):
Now I want to add the solution from @batFINGER to a class, e.g.
import bpy
from bpy.props import BoolProperty
class Utility:
class AddHidingProperty:
def __init__(self):
bpy.types.Object.hide_children = BoolProperty(update=self.hide_children)
bpy.types.TEXT_HT_footer.append(self.draw)
def hide_children(self, obj, context):
obj.hide_set(obj.hide_children)
for o in obj.children:
o.hide_children = obj.hide_children
# function to draw the checkbox in the editor footer
def draw(self, obj, context):
layout = obj.layout
ob = context.object
layout.prop(ob, "hide_children")
However when I call the Utility.AddHidingProperty(), this gives me the following error: ValueError: bpy_struct "Object" registration error: hide_children could not register.
Update 2 (working):
The following seems to work but I am not sure whether it is a good approach:
class Utility:
class AddHidingProperty:
def __init__(self):
def hide_children(obj, context):
obj.hide_set(obj.hide_children)
for o in obj.children:
o.hide_children = obj.hide_children
# function to draw the checkbox in the editor footer
def draw(obj, context):
layout = obj.layout
ob = context.object
layout.prop(ob, "hide_children")
bpy.types.Object.hide_children = BoolProperty(update=hide_children)
bpy.types.TEXT_HT_footer.append(draw)

hide_children(). You create this boolean property but how do I call/toggle it for a parent object. Also does the object needs to be selected first each time or I can call it by the name? If you don't mind I would appreciate if you could please provide a calling example. Btw I've run the script but I cannot see any window manager context toggle operator... – ttsesm Oct 08 '20 at 14:37bpy.ops.wm.context_toggle(data_path="object.hide_children")I am getting{'PASS_THROUGH'}instead of {'FINISHED'} as in your case. – ttsesm Oct 08 '20 at 14:37selfin the update method. Blender's context operator paradigm rarely passes an object to a method, instead operates on context – batFINGER Oct 08 '20 at 14:53ValueError: bpy_struct "Object" registration error: hide_children could not register. Check on my update section, in the initial post. – ttsesm Oct 12 '20 at 13:46self.hide_children(context)in this case has one, with self being an instance of your class. One way would be to definedef hide_children(self, ob, context)making the distinction that when used as an update property theobis the object. – batFINGER Oct 12 '20 at 13:54obindividually or not? I do not get it. – ttsesm Oct 12 '20 at 14:10AddHidingProperty.hide_childrenis a method definition that has two arguments, whereas in the init methodself.hide_childrenis a method with one, eg if you were to call it it would beself.hide_method(context)because it belongs to the class instance the self is implied by the owner. Becauseself.hide_renderonly has one argument it fails to register. Use eitherupdate=hide_renderorupdate=AddHidingClass.hide_render. This is basic python class method stuff. If you use withobas suggested, thenselfis your class, andobwill be treated as the object with the property – batFINGER Oct 12 '20 at 14:21__init__(for example) usingself.hide_render(ob, context)ie a method that takes two arguments. If you don't need to discern between your class instance and the object instance, don't do it this way.\ You are going to have issues with draw next for same reasons.... – batFINGER Oct 12 '20 at 14:28selfclass instance withselfobject with the property. I've updated the code with the suggesteddef hide_children(self, ob, context)approach. I still get the error though. – ttsesm Oct 12 '20 at 15:57TypeError: update keyword: expected a function type, not a methodIn python a function defined on a class is a method. Hence the registration error. Printingself.hide_children...><bound method Utility.AddHidingProperty.hide_children of <__main__.Utility.AddHidingProperty object at 0x7f658bb72fa0>>This makes sense since could del that class instance but the object would still be looking for an update method. Your last edit is using the function def, and hence is Ok. – batFINGER Oct 12 '20 at 16:39