diff --git a/src/ifcblenderexport/blenderbim/bim/import_ifc.py b/src/ifcblenderexport/blenderbim/bim/import_ifc.py index b5832183b4..8e16be9dc6 100644 --- a/src/ifcblenderexport/blenderbim/bim/import_ifc.py +++ b/src/ifcblenderexport/blenderbim/bim/import_ifc.py @@ -261,6 +261,7 @@ class IfcImporter(): self.native_data = {} self.groups = {} self.aggregates = {} + self.aggregate_collection = None self.aggregate_collections = {} self.material_creator = MaterialCreator(ifc_import_settings) @@ -1075,8 +1076,8 @@ class IfcImporter(): def add_project_to_scene(self): bpy.context.scene.collection.children.link(self.project['blender']) - for collection in self.aggregate_collections.values(): - bpy.context.view_layer.layer_collection.children[self.project['blender'].name].children[collection.name].hide_viewport = True + for collection in bpy.context.view_layer.layer_collection.children[self.project['blender'].name].children[self.aggregate_collection.name].children: + collection.hide_viewport = True bpy.context.view_layer.layer_collection.children[self.project['blender'].name].children[self.opening_collection.name].hide_viewport = True bpy.context.view_layer.layer_collection.children[self.project['blender'].name].children[self.type_collection.name].hide_viewport = True @@ -1416,12 +1417,20 @@ class IfcImporter(): def create_aggregates(self): rel_aggregates = [a for a in self.file.by_type('IfcRelAggregates') if a.RelatingObject.is_a('IfcElement')] + for collection in self.project['blender'].children: + if collection.name == 'Aggregates': + self.aggregate_collection = collection + break + if not self.aggregate_collection: + self.aggregate_collection = bpy.data.collections.new('Aggregates') + self.project['blender'].children.link(self.aggregate_collection) + for rel_aggregate in rel_aggregates: self.create_aggregate(rel_aggregate) def create_aggregate(self, rel_aggregate): collection = bpy.data.collections.new(f'IfcRelAggregates/{rel_aggregate.id()}') - self.project['blender'].children.link(collection) + self.aggregate_collection.children.link(collection) element = rel_aggregate.RelatingObject obj = bpy.data.objects.new('{}/{}'.format(element.is_a(), element.Name), None) diff --git a/src/ifcblenderexport/blenderbim/bim/operator.py b/src/ifcblenderexport/blenderbim/bim/operator.py index aca6e0bf76..0a72015865 100644 --- a/src/ifcblenderexport/blenderbim/bim/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/operator.py @@ -1622,7 +1622,12 @@ class CreateAggregate(bpy.types.Operator): aggregate = bpy.data.collections.new('IfcRelAggregates/{}'.format( bpy.context.scene.BIMProperties.aggregate_class)) - bpy.context.scene.collection.children.link(aggregate) + for project in [c for c in bpy.context.view_layer.layer_collection.children if 'IfcProject' in c.name]: + for aggregate_collection in [c for c in project.children if 'Aggregates' in c.name]: + aggregate_collection.collection.children.link(aggregate) + aggregate_collection.children[aggregate.name].hide_viewport = True + break + break for obj in bpy.context.selected_objects: for collection in obj.users_collection: collection.objects.unlink(obj) @@ -1635,8 +1640,6 @@ class CreateAggregate(bpy.types.Operator): instance.instance_type = 'COLLECTION' instance.instance_collection = aggregate spatial_container.objects.link(instance) - - bpy.context.view_layer.layer_collection.children[aggregate.name].hide_viewport = True return {'FINISHED'} class EditAggregate(bpy.types.Operator): @@ -1646,10 +1649,14 @@ class EditAggregate(bpy.types.Operator): def execute(self, context): obj = bpy.context.active_object if obj.instance_type != 'COLLECTION' \ - or 'IfcRelAggregates' not in obj.instance_collection.name: + or 'IfcRelAggregates' not in obj.instance_collection.name: return {'FINISHED'} bpy.context.view_layer.objects[obj.name].hide_viewport = True - bpy.context.view_layer.layer_collection.children[obj.instance_collection.name].hide_viewport = False + for project in [c for c in bpy.context.view_layer.layer_collection.children if 'IfcProject' in c.name]: + for aggregate_collection in [c for c in project.children if 'Aggregates' in c.name]: + for aggregate in [c for c in aggregate_collection.children if c.name == obj.instance_collection.name]: + aggregate.hide_viewport = False + break return {'FINISHED'} class SaveAggregate(bpy.types.Operator): @@ -1659,11 +1666,13 @@ class SaveAggregate(bpy.types.Operator): def execute(self, context): obj = bpy.context.active_object aggregate = None - for collection in obj.users_collection: - if 'IfcRelAggregates' in collection.name: - bpy.context.view_layer.layer_collection.children[collection.name].hide_viewport = True - aggregate = collection - break + names = [c.name for c in obj.users_collection] + for project in [c for c in bpy.context.view_layer.layer_collection.children if 'IfcProject' in c.name]: + for aggregate_collection in [c for c in project.children if 'Aggregates' in c.name]: + for collection in [c for c in aggregate_collection.children if c.name in names]: + collection.hide_viewport = True + aggregate = collection.collection + break if not aggregate: return {'FINISHED'} for obj in bpy.context.view_layer.objects: @@ -1679,7 +1688,7 @@ class ExplodeAggregate(bpy.types.Operator): def execute(self, context): obj = bpy.context.active_object if obj.instance_type != 'COLLECTION' \ - or 'IfcRelAggregates' not in obj.instance_collection.name: + or 'IfcRelAggregates' not in obj.instance_collection.name: return {'FINISHED'} aggregate_collection = bpy.data.collections.get(obj.instance_collection.name) spatial_collection = obj.users_collection[0]