diff --git a/src/blenderbim/blenderbim/bim/module/model/__init__.py b/src/blenderbim/blenderbim/bim/module/model/__init__.py index a0328588ae..7227c6694d 100644 --- a/src/blenderbim/blenderbim/bim/module/model/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/model/__init__.py @@ -1,5 +1,5 @@ import bpy -from . import operator, prop, ui, grid, stair, door, window, slab, opening, pie, workspace +from . import operator, prop, ui, grid, stair, door, window, opening, pie, workspace classes = ( operator.AddTypeInstance, @@ -16,7 +16,6 @@ classes = ( stair.BIM_OT_add_object, door.BIM_OT_add_object, window.BIM_OT_add_object, - slab.BIM_OT_add_object, opening.BIM_OT_add_object, pie.OpenPieClass, pie.PieUpdateContainer, @@ -42,7 +41,6 @@ def register(): bpy.types.VIEW3D_MT_mesh_add.append(stair.add_object_button) bpy.types.VIEW3D_MT_mesh_add.append(door.add_object_button) bpy.types.VIEW3D_MT_mesh_add.append(window.add_object_button) - bpy.types.VIEW3D_MT_mesh_add.append(slab.add_object_button) bpy.types.VIEW3D_MT_mesh_add.append(opening.add_object_button) wm = bpy.context.window_manager if wm.keyconfigs.addon: @@ -59,7 +57,6 @@ def unregister(): bpy.types.VIEW3D_MT_mesh_add.remove(stair.add_object_button) bpy.types.VIEW3D_MT_mesh_add.remove(door.add_object_button) bpy.types.VIEW3D_MT_mesh_add.remove(window.add_object_button) - bpy.types.VIEW3D_MT_mesh_add.remove(slab.add_object_button) bpy.types.VIEW3D_MT_mesh_add.remove(opening.add_object_button) wm = bpy.context.window_manager kc = wm.keyconfigs.addon diff --git a/src/blenderbim/blenderbim/bim/module/model/operator.py b/src/blenderbim/blenderbim/bim/module/model/operator.py index f69e268da0..a11176da0b 100644 --- a/src/blenderbim/blenderbim/bim/module/model/operator.py +++ b/src/blenderbim/blenderbim/bim/module/model/operator.py @@ -30,6 +30,10 @@ class AddTypeInstance(bpy.types.Operator): obj = DumbWallGenerator(self.file.by_id(int(relating_type))).generate() if obj: return {"FINISHED"} + elif ifc_class == "IfcSlabType": + obj = DumbSlabGenerator(self.file.by_id(int(relating_type))).generate() + if obj: + return {"FINISHED"} # A cube verts = [ Vector((-1, -1, -1)), @@ -735,3 +739,67 @@ class DumbWallGenerator: MaterialData.load(self.file) obj.select_set(True) return obj + + +class DumbSlabGenerator: + def __init__(self, relating_type): + self.relating_type = relating_type + + def generate(self): + self.file = IfcStore.get_file() + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(IfcStore.get_file()) + thicknesses = [] + for rel in self.relating_type.HasAssociations: + if rel.is_a("IfcRelAssociatesMaterial"): + material = rel.RelatingMaterial + if material.is_a("IfcMaterialLayerSet"): + thicknesses = [l.LayerThickness for l in material.MaterialLayers] + break + if not thicknesses: + return + + self.collection = bpy.context.view_layer.active_layer_collection.collection + self.collection_obj = bpy.data.objects.get(self.collection.name) + self.depth = sum(thicknesses) * unit_scale + self.width = 3 + self.length = 3 + self.rotation = 0 + self.location = Vector((0, 0, 0)) + return self.derive_from_cursor() + + def derive_from_cursor(self): + self.location = bpy.context.scene.cursor.location + return self.create_slab() + + def create_slab(self): + verts = [ + Vector((0, 0, 0)), + Vector((0, self.width, 0)), + Vector((self.length, self.width, 0)), + Vector((self.length, 0, 0)), + ] + edges = [] + faces = [[0, 3, 2, 1]] + + mesh = bpy.data.meshes.new(name="Dumb Slab") + mesh.from_pydata(verts, edges, faces) + obj = bpy.data.objects.new("Slab", mesh) + modifier = obj.modifiers.new("Slab Depth", "SOLIDIFY") + modifier.use_even_offset = True + modifier.offset = 1 + modifier.thickness = self.depth + obj.name = "Slab" + if self.collection_obj and self.collection_obj.BIMObjectProperties.ifc_definition_id: + obj.location[2] = self.collection_obj.location[2] - self.depth + else: + obj.location[2] -= self.depth + self.collection.objects.link(obj) + bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcSlab", predefined_type="FLOOR") + bpy.ops.bim.assign_type(relating_type=self.relating_type.id(), related_object=obj.name) + element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) + pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric") + ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "BlenderBIM.DumbSlab"}) + ifcopenshell.api.run("material.assign_material", self.file, product=element, type="IfcMaterialLayerSetUsage") + MaterialData.load(self.file) + obj.select_set(True) + return obj diff --git a/src/blenderbim/blenderbim/bim/module/model/slab.py b/src/blenderbim/blenderbim/bim/module/model/slab.py deleted file mode 100644 index 7e510abb38..0000000000 --- a/src/blenderbim/blenderbim/bim/module/model/slab.py +++ /dev/null @@ -1,46 +0,0 @@ -import bpy -from bpy.types import Operator -from bpy.props import FloatProperty -from mathutils import Vector -from blenderbim.bim.ifc import IfcStore - - -def add_object(self, context): - verts = [ - Vector((0, 0, 0)), - Vector((0, self.width, 0)), - Vector((self.length, self.width, 0)), - Vector((self.length, 0, 0)), - ] - edges = [] - faces = [[0, 1, 2, 3]] - - mesh = bpy.data.meshes.new(name="Dumb Slab") - mesh.from_pydata(verts, edges, faces) - obj = bpy.data.objects.new("Slab", mesh) - modifier = obj.modifiers.new("Slab Depth", "SOLIDIFY") - modifier.use_even_offset = True - modifier.offset = 1 - modifier.thickness = self.depth - obj.name = "Slab" - context.view_layer.active_layer_collection.collection.objects.link(obj) - if IfcStore.get_file(): - bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcSlab", predefined_type="FLOOR") - obj.location = context.scene.cursor.location - - -class BIM_OT_add_object(Operator): - bl_idname = "mesh.add_slab" - bl_label = "Dumb Slab" - - length: FloatProperty(name="Length", default=2) - width: FloatProperty(name="Width", default=2) - depth: FloatProperty(name="Depth", default=0.2) - - def execute(self, context): - add_object(self, context) - return {"FINISHED"} - - -def add_object_button(self, context): - self.layout.operator(BIM_OT_add_object.bl_idname, icon="PLUGIN") diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index 9b9790a002..9aff9e848c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -60,8 +60,8 @@ def remove_pre_listener(callback, usecase_path=""): for fun in callbacks: if fun == callback: pre_listeners[listener_key].remove(callback) - - + + def remove_post_listener(callback, usecase_path=""): for listener_key, callbacks in post_listeners.items(): if not listener_key.endswith(usecase_path): @@ -69,8 +69,8 @@ def remove_post_listener(callback, usecase_path=""): for fun in callbacks: if fun == callback: post_listeners[listener_key].remove(callback) - - + + def remove_all_listeners(): registered_ifcs.clear() pre_listeners.clear()