mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-20 20:22:09 +00:00
Flow segments are now created at a specific RL above the active storey in the BIM Tool
This commit is contained in:
@@ -131,19 +131,17 @@ class AddConstrTypeInstance(bpy.types.Operator):
|
|||||||
if self.from_invoke:
|
if self.from_invoke:
|
||||||
props.relating_type_id = str(self.relating_type_id)
|
props.relating_type_id = str(self.relating_type_id)
|
||||||
|
|
||||||
self.file = IfcStore.get_file()
|
relating_type = tool.Ifc.get().by_id(int(relating_type_id))
|
||||||
relating_type = self.file.by_id(int(relating_type_id))
|
|
||||||
ifc_class = relating_type.is_a()
|
ifc_class = relating_type.is_a()
|
||||||
instance_class = ifcopenshell.util.type.get_applicable_entities(ifc_class, self.file.schema)[0]
|
instance_class = ifcopenshell.util.type.get_applicable_entities(ifc_class, tool.Ifc.get().schema)[0]
|
||||||
material = ifcopenshell.util.element.get_material(relating_type)
|
material = ifcopenshell.util.element.get_material(relating_type)
|
||||||
|
|
||||||
if material and material.is_a("IfcMaterialProfileSet"):
|
if material and material.is_a("IfcMaterialProfileSet"):
|
||||||
if obj := profile.DumbProfileGenerator(relating_type).generate():
|
if obj := profile.DumbProfileGenerator(relating_type).generate():
|
||||||
if not relating_type.is_a("IfcFlowSegmentType"):
|
if relating_type.is_a("IfcFlowSegmentType"):
|
||||||
return {"FINISHED"}
|
self.set_flow_segment_rl(obj)
|
||||||
mep.MepGenerator(relating_type).setup_ports(obj)
|
mep.MepGenerator(relating_type).setup_ports(obj)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
elif material and material.is_a("IfcMaterialLayerSet"):
|
elif material and material.is_a("IfcMaterialLayerSet"):
|
||||||
if self.generate_layered_element(ifc_class, relating_type):
|
if self.generate_layered_element(ifc_class, relating_type):
|
||||||
tool.Blender.select_and_activate_single_object(context, context.selected_objects[-1])
|
tool.Blender.select_and_activate_single_object(context, context.selected_objects[-1])
|
||||||
@@ -189,6 +187,7 @@ class AddConstrTypeInstance(bpy.types.Operator):
|
|||||||
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)
|
||||||
|
|
||||||
# Update required as core.type.assign_type may change obj.data
|
# Update required as core.type.assign_type may change obj.data
|
||||||
|
# TODO: This is inefficient. It literally creates a mesh, then potentially removes it.
|
||||||
context.view_layer.update()
|
context.view_layer.update()
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -230,7 +229,7 @@ class AddConstrTypeInstance(bpy.types.Operator):
|
|||||||
# TODO For now we are hardcoding windows and doors as a prototype
|
# TODO For now we are hardcoding windows and doors as a prototype
|
||||||
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 collection_obj.BIMObjectProperties.ifc_definition_id:
|
if collection_obj and tool.Ifc.get_entity(collection_obj):
|
||||||
obj.location[2] = collection_obj.location[2] - min([v[2] for v in obj.bound_box])
|
obj.location[2] = collection_obj.location[2] - min([v[2] for v in obj.bound_box])
|
||||||
|
|
||||||
unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
|
unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
|
||||||
@@ -250,6 +249,13 @@ class AddConstrTypeInstance(bpy.types.Operator):
|
|||||||
tool.Blender.select_and_activate_single_object(context, obj)
|
tool.Blender.select_and_activate_single_object(context, obj)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
def set_flow_segment_rl(self, obj):
|
||||||
|
collection = bpy.context.view_layer.active_layer_collection.collection
|
||||||
|
collection_obj = collection.BIMCollectionProperties.obj
|
||||||
|
|
||||||
|
if collection_obj and tool.Ifc.get_entity(collection_obj):
|
||||||
|
obj.location[2] = collection_obj.location[2] + bpy.context.scene.BIMModelProperties.rl2
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def generate_layered_element(ifc_class, relating_type):
|
def generate_layered_element(ifc_class, relating_type):
|
||||||
layer_set_direction = None
|
layer_set_direction = None
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ class BIMModelProperties(PropertyGroup):
|
|||||||
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")
|
||||||
# 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
|
# Used for things like windows, other hosted furniture, and MEP
|
||||||
rl2: bpy.props.FloatProperty(name="RL", default=1, subtype="DISTANCE", description="Z offset for windows")
|
rl2: bpy.props.FloatProperty(name="RL", default=1, subtype="DISTANCE", description="Z offset for windows")
|
||||||
# Used for plan calculation points such as in room generation
|
# Used for plan calculation points such as in room generation
|
||||||
rl3: bpy.props.FloatProperty(name="RL", default=1, subtype="DISTANCE", description="Z offset for space calculation")
|
rl3: bpy.props.FloatProperty(name="RL", default=1, subtype="DISTANCE", description="Z offset for space calculation")
|
||||||
|
|||||||
@@ -248,7 +248,16 @@ class BimToolUI:
|
|||||||
elif cls.props.ifc_class in ("IfcDoorType", "IfcDoorStyle"):
|
elif cls.props.ifc_class in ("IfcDoorType", "IfcDoorStyle"):
|
||||||
row = cls.layout.row(align=True)
|
row = cls.layout.row(align=True)
|
||||||
row.prop(data=cls.props, property="rl1", text="RL")
|
row.prop(data=cls.props, property="rl1", text="RL")
|
||||||
elif cls.props.ifc_class in ("IfcWindowType", "IfcWindowStyle", "IfcDoorType", "IfcDoorStyle"):
|
elif cls.props.ifc_class in (
|
||||||
|
"IfcWindowType",
|
||||||
|
"IfcWindowStyle",
|
||||||
|
"IfcDoorType",
|
||||||
|
"IfcDoorStyle",
|
||||||
|
"IfcDuctSegmentType",
|
||||||
|
"IfcPipeSegmentType",
|
||||||
|
"IfcCableCarrierSegmentType",
|
||||||
|
"IfcCableSegmentType",
|
||||||
|
):
|
||||||
row = cls.layout.row(align=True)
|
row = cls.layout.row(align=True)
|
||||||
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"):
|
||||||
|
|||||||
Reference in New Issue
Block a user