mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-17 14:02:27 +00:00
Fix #4186. Support different RL insertion modes when adding occurrences of a type.
This commit is contained in:
@@ -189,12 +189,12 @@ class AddConstrTypeInstance(bpy.types.Operator):
|
|||||||
collection_obj = collection.BIMCollectionProperties.obj
|
collection_obj = collection.BIMCollectionProperties.obj
|
||||||
|
|
||||||
bpy.ops.bim.assign_class(obj=obj.name, ifc_class=instance_class)
|
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
|
mesh_data = obj.data
|
||||||
element = tool.Ifc.get_entity(obj)
|
element = tool.Ifc.get_entity(obj)
|
||||||
blenderbim.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type)
|
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)
|
tool.Blender.remove_data_block(mesh_data)
|
||||||
|
|
||||||
# Update required as core.type.assign_type may change obj.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)
|
bpy.ops.bim.add_filled_opening(voided_obj=building_obj.name, filling_obj=obj.name)
|
||||||
else:
|
else:
|
||||||
if collection_obj and tool.Ifc.get_entity(collection_obj):
|
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())
|
unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
|
||||||
for port in ifcopenshell.util.system.get_ports(relating_type):
|
for port in ifcopenshell.util.system.get_ports(relating_type):
|
||||||
|
|||||||
@@ -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")
|
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")
|
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")
|
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
|
# Used for things like walls, doors, flooring, skirting, etc
|
||||||
rl1: bpy.props.FloatProperty(name="RL", default=1, subtype="DISTANCE", description="Z offset for walls")
|
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
|
# Used for things like windows, other hosted furniture, and MEP
|
||||||
|
|||||||
@@ -284,6 +284,9 @@ class BimToolUI:
|
|||||||
row.prop(data=cls.props, property="rl2", text="RL")
|
row.prop(data=cls.props, property="rl2", text="RL")
|
||||||
elif cls.props.ifc_class in ("IfcSpaceType"):
|
elif cls.props.ifc_class in ("IfcSpaceType"):
|
||||||
add_layout_hotkey_operator(cls.layout, "Generate", "S_G", bpy.ops.bim.generate_space.__doc__)
|
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
|
@classmethod
|
||||||
def draw_edit_object_interface(cls, context):
|
def draw_edit_object_interface(cls, context):
|
||||||
|
|||||||
Reference in New Issue
Block a user