diff --git a/src/blenderbim/blenderbim/bim/module/model/product.py b/src/blenderbim/blenderbim/bim/module/model/product.py index 1427714b38..a3d75eefb8 100644 --- a/src/blenderbim/blenderbim/bim/module/model/product.py +++ b/src/blenderbim/blenderbim/bim/module/model/product.py @@ -189,12 +189,12 @@ class AddConstrTypeInstance(bpy.types.Operator): collection_obj = collection.BIMCollectionProperties.obj bpy.ops.bim.assign_class(obj=obj.name, ifc_class=instance_class) - tool.Blender.remove_data_block(mesh) # Remove "Instance" mesh + tool.Blender.remove_data_block(mesh) # Remove "Instance" mesh mesh_data = obj.data element = tool.Ifc.get_entity(obj) blenderbim.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type) - if obj.data != mesh_data: # remove orphaned mesh from "bim.assign_class" + if obj.data != mesh_data: # remove orphaned mesh from "bim.assign_class" tool.Blender.remove_data_block(mesh_data) # Update required as core.type.assign_type may change obj.data @@ -241,7 +241,12 @@ class AddConstrTypeInstance(bpy.types.Operator): bpy.ops.bim.add_filled_opening(voided_obj=building_obj.name, filling_obj=obj.name) else: if collection_obj and tool.Ifc.get_entity(collection_obj): - obj.location.z = collection_obj.location.z - tool.Blender.get_object_bounding_box(obj)["min_z"] + if props.rl_mode == "BOTTOM": + obj.location.z = collection_obj.location.z - tool.Blender.get_object_bounding_box(obj)["min_z"] + elif props.rl_mode == "CONTAINER": + obj.location.z = collection_obj.location.z + elif props.rl_mode == "CURSOR": + pass unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) for port in ifcopenshell.util.system.get_ports(relating_type): diff --git a/src/blenderbim/blenderbim/bim/module/model/prop.py b/src/blenderbim/blenderbim/bim/module/model/prop.py index 2049020ce2..f56428489b 100644 --- a/src/blenderbim/blenderbim/bim/module/model/prop.py +++ b/src/blenderbim/blenderbim/bim/module/model/prop.py @@ -132,6 +132,15 @@ class BIMModelProperties(PropertyGroup): x: bpy.props.FloatProperty(name="X", default=0.5, subtype="DISTANCE", description="Size by X axis for the opening") y: bpy.props.FloatProperty(name="Y", default=0.5, subtype="DISTANCE", description="Size by Y axis for the opening") z: bpy.props.FloatProperty(name="Z", default=0.5, subtype="DISTANCE", description="Size by Z axis for the opening") + rl_mode: bpy.props.EnumProperty( + items=( + ("BOTTOM", "Bottom", "Snaps the element's lowest geometry to the container's Z value."), + ("CONTAINER", "Container", "Positions the element's placement origin at the container's Z value."), + ("CURSOR", "Cursor", "Places the object placement at the 3D cursor's Z value."), + ), + name="RL Mode", + default="BOTTOM", + ) # Used for things like walls, doors, flooring, skirting, etc rl1: bpy.props.FloatProperty(name="RL", default=1, subtype="DISTANCE", description="Z offset for walls") # Used for things like windows, other hosted furniture, and MEP diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index 3077b65325..43b1fbf5b6 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -284,6 +284,9 @@ class BimToolUI: row.prop(data=cls.props, property="rl2", text="RL") elif cls.props.ifc_class in ("IfcSpaceType"): add_layout_hotkey_operator(cls.layout, "Generate", "S_G", bpy.ops.bim.generate_space.__doc__) + else: + row = cls.layout.row(align=True) + row.prop(data=cls.props, property="rl_mode", text="RL") @classmethod def draw_edit_object_interface(cls, context):