Group all aggregates into a single collection and update aggregate operators

This commit is contained in:
Dion Moult
2020-07-10 13:52:34 +10:00
parent fd283b9c84
commit 65821c4367
2 changed files with 32 additions and 14 deletions
@@ -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)
+20 -11
View File
@@ -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]