Rigify: fix generation if a hidden collection is selected.

Only visible and selectable collections can be used for temporary
objects during generation due to the way operators work.
This commit is contained in:
Alexander Gavrilov 2019-03-24 16:12:50 +03:00
parent cb0a9902f5
commit 51ceed0bfb
2 changed files with 40 additions and 2 deletions

View File

@ -29,7 +29,7 @@ from collections import OrderedDict
from .utils import MetarigError, new_bone
from .utils import MCH_PREFIX, DEF_PREFIX, WGT_PREFIX, ROOT_NAME, make_original_name
from .utils import create_root_widget
from .utils.collections import ensure_widget_collection
from .utils.collections import ensure_widget_collection, list_layer_collections, filter_layer_collections_by_object
from .utils import random_id
from .utils import copy_attributes
from .utils import gamma_correct
@ -73,10 +73,17 @@ def generate_rig(context, metarig):
scene = context.scene
view_layer = context.view_layer
collection = context.collection
layer_collection = context.layer_collection
id_store = context.window_manager
usable_collections = list_layer_collections(view_layer.layer_collection, selectable=True)
if layer_collection not in usable_collections:
metarig_collections = filter_layer_collections_by_object(usable_collections, metarig)
layer_collection = (metarig_collections + [view_layer.layer_collection])[0]
collection = layer_collection.collection
#------------------------------------------
# Create/find the rig object and set it up
@ -96,6 +103,11 @@ def generate_rig(context, metarig):
obj = scene.objects[name]
rig_old_name = name
obj.name = rig_new_name or name
rig_collections = filter_layer_collections_by_object(usable_collections, obj)
layer_collection = (rig_collections + [layer_collection])[0]
collection = layer_collection.collection
except KeyError:
rig_old_name = name
name = rig_new_name or name

View File

@ -39,6 +39,32 @@ def find_layer_collection_by_collection(layer_collection, collection):
return layer_collection
def list_layer_collections(layer_collection, visible=False, selectable=False):
"""Returns a list of the collection and its children, with optional filtering by settings."""
if layer_collection.exclude:
return []
collection = layer_collection.collection
is_visible = not (layer_collection.hide_viewport or collection.hide_viewport)
is_selectable = is_visible and not collection.hide_select
if (selectable and not is_selectable) or (visible and not is_visible):
return []
found = [layer_collection]
for child in layer_collection.children:
found += list_layer_collections(child, visible, selectable)
return found
def filter_layer_collections_by_object(layer_collections, obj):
"""Returns a subset of collections that contain the given object."""
return [lc for lc in layer_collections if obj in lc.collection.objects.values()]
def ensure_widget_collection(context):
wgts_collection_name = "Widgets"