mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-30 03:59:55 +00:00
refactor: generalize layer set class and method names
Rename wall/slab-specific identifiers to layer-direction-neutral equivalents: - DumbWallPlaner → Layer2Planer - DumbSlabPlaner → Layer3Planer - recalculate_walls() → recalculate_layer2_elements() - regenerate_slab() → regenerate_layer3_element() - wall_objs → axis2_objs (material/operator.py)
This commit is contained in:
@@ -386,8 +386,8 @@ class AddLayer(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
layer_set=layer_set,
|
layer_set=layer_set,
|
||||||
material=tool.Ifc.get().by_id(int(omprops.material)),
|
material=tool.Ifc.get().by_id(int(omprops.material)),
|
||||||
)
|
)
|
||||||
slab.DumbSlabPlaner().regenerate_from_layer_set(layer_set)
|
slab.Layer3Planer().regenerate_from_layer_set(layer_set)
|
||||||
wall.DumbWallPlaner().regenerate_from_layer_set(layer_set)
|
wall.Layer2Planer().regenerate_from_layer_set(layer_set)
|
||||||
|
|
||||||
|
|
||||||
class ReorderMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator):
|
class ReorderMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator):
|
||||||
@@ -425,8 +425,8 @@ class RemoveLayer(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
return {"CANCELLED"}
|
return {"CANCELLED"}
|
||||||
ifcopenshell.api.material.remove_layer(tool.Ifc.get(), layer=layer)
|
ifcopenshell.api.material.remove_layer(tool.Ifc.get(), layer=layer)
|
||||||
for material_set in material_sets:
|
for material_set in material_sets:
|
||||||
slab.DumbSlabPlaner().regenerate_from_layer_set(material_set)
|
slab.Layer3Planer().regenerate_from_layer_set(material_set)
|
||||||
wall.DumbWallPlaner().regenerate_from_layer_set(material_set)
|
wall.Layer2Planer().regenerate_from_layer_set(material_set)
|
||||||
|
|
||||||
|
|
||||||
class DuplicateLayer(bpy.types.Operator, tool.Ifc.Operator):
|
class DuplicateLayer(bpy.types.Operator, tool.Ifc.Operator):
|
||||||
@@ -615,8 +615,8 @@ class EditAssignedMaterial(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
attributes=attributes,
|
attributes=attributes,
|
||||||
)
|
)
|
||||||
|
|
||||||
slab_planer = slab.DumbSlabPlaner()
|
slab_planer = slab.Layer3Planer()
|
||||||
wall_objs = []
|
axis2_objs = []
|
||||||
|
|
||||||
for obj in objects:
|
for obj in objects:
|
||||||
obj_element = tool.Ifc.get_entity(obj)
|
obj_element = tool.Ifc.get_entity(obj)
|
||||||
@@ -634,10 +634,10 @@ class EditAssignedMaterial(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
if obj_material_usage.LayerSetDirection == "AXIS3":
|
if obj_material_usage.LayerSetDirection == "AXIS3":
|
||||||
slab_planer.regenerate_from_occurence(obj_element, obj_material_usage)
|
slab_planer.regenerate_from_occurence(obj_element, obj_material_usage)
|
||||||
elif obj_material_usage.LayerSetDirection == "AXIS2":
|
elif obj_material_usage.LayerSetDirection == "AXIS2":
|
||||||
wall_objs.append(obj)
|
axis2_objs.append(obj)
|
||||||
|
|
||||||
if wall_objs:
|
if axis2_objs:
|
||||||
tool.Model.recalculate_walls(wall_objs)
|
tool.Model.recalculate_layer2_elements(axis2_objs)
|
||||||
|
|
||||||
if material_set_usage.is_a("IfcMaterialProfileSetUsage"):
|
if material_set_usage.is_a("IfcMaterialProfileSetUsage"):
|
||||||
if "CardinalPoint" in attributes:
|
if "CardinalPoint" in attributes:
|
||||||
@@ -785,8 +785,8 @@ class EditMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
attributes=attributes,
|
attributes=attributes,
|
||||||
material=self.file.by_id(int(props.material_set_item_material)),
|
material=self.file.by_id(int(props.material_set_item_material)),
|
||||||
)
|
)
|
||||||
slab.DumbSlabPlaner().regenerate_from_layer(layer)
|
slab.Layer3Planer().regenerate_from_layer(layer)
|
||||||
wall.DumbWallPlaner().regenerate_from_layer(layer)
|
wall.Layer2Planer().regenerate_from_layer(layer)
|
||||||
elif material.is_a("IfcMaterialProfileSet"):
|
elif material.is_a("IfcMaterialProfileSet"):
|
||||||
profile_def = None
|
profile_def = None
|
||||||
if mprops.profiles:
|
if mprops.profiles:
|
||||||
|
|||||||
@@ -948,7 +948,7 @@ class Rotate90(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
obj.matrix_world @= rotate_matrix
|
obj.matrix_world @= rotate_matrix
|
||||||
bpy.context.view_layer.update()
|
bpy.context.view_layer.update()
|
||||||
DumbProfileRecalculator().recalculate(profile_objs)
|
DumbProfileRecalculator().recalculate(profile_objs)
|
||||||
tool.Model.recalculate_walls(layer2_objs)
|
tool.Model.recalculate_layer2_elements(layer2_objs)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ class DumbSlabGenerator:
|
|||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
class DumbSlabPlaner:
|
class Layer3Planer:
|
||||||
def regenerate_from_layer_set_usage(self, usecase_path, ifc_file, settings):
|
def regenerate_from_layer_set_usage(self, usecase_path, ifc_file, settings):
|
||||||
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file)
|
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file)
|
||||||
obj = bpy.context.active_object
|
obj = bpy.context.active_object
|
||||||
@@ -901,7 +901,7 @@ class DrawPolylineSlab(bpy.types.Operator, PolylineOperator, tool.Ifc.Operator):
|
|||||||
usage=material_set_usage,
|
usage=material_set_usage,
|
||||||
attributes=attributes,
|
attributes=attributes,
|
||||||
)
|
)
|
||||||
DumbSlabPlaner().regenerate_from_occurence(element, material_set_usage)
|
Layer3Planer().regenerate_from_occurence(element, material_set_usage)
|
||||||
|
|
||||||
def modal(self, context, event):
|
def modal(self, context, event):
|
||||||
return IfcStore.execute_ifc_operator(self, context, event, method="MODAL")
|
return IfcStore.execute_ifc_operator(self, context, event, method="MODAL")
|
||||||
@@ -1003,5 +1003,5 @@ class RecalculateSlab(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement.is_a("IfcWall"):
|
if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement.is_a("IfcWall"):
|
||||||
walls.append(tool.Ifc.get_object(rel.RelatedElement))
|
walls.append(tool.Ifc.get_object(rel.RelatedElement))
|
||||||
|
|
||||||
tool.Model.recalculate_walls(walls)
|
tool.Model.recalculate_layer2_elements(walls)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|||||||
@@ -372,7 +372,7 @@ class RecalculateWall(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
|
|
||||||
def _execute(self, context):
|
def _execute(self, context):
|
||||||
objects = tool.Model.get_selected_mesh_ifc_objects()
|
objects = tool.Model.get_selected_mesh_ifc_objects()
|
||||||
tool.Model.recalculate_walls(objects)
|
tool.Model.recalculate_layer2_elements(objects)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -420,7 +420,7 @@ class ChangeExtrusionDepth(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
layer2_objs.append(obj)
|
layer2_objs.append(obj)
|
||||||
|
|
||||||
if layer2_objs:
|
if layer2_objs:
|
||||||
tool.Model.recalculate_walls(layer2_objs)
|
tool.Model.recalculate_layer2_elements(layer2_objs)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -529,7 +529,7 @@ class ChangeExtrusionXAngle(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
obj.rotation_euler.z = current_z_rot
|
obj.rotation_euler.z = current_z_rot
|
||||||
|
|
||||||
if layer2_objs:
|
if layer2_objs:
|
||||||
tool.Model.recalculate_walls(layer2_objs)
|
tool.Model.recalculate_layer2_elements(layer2_objs)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -641,7 +641,7 @@ class DrawPolylineWall(bpy.types.Operator, PolylineOperator, tool.Ifc.Operator):
|
|||||||
# if material.is_a("IfcMaterialLayerSetUsage"):
|
# if material.is_a("IfcMaterialLayerSetUsage"):
|
||||||
attributes = {"OffsetFromReferenceLine": offset, "DirectionSense": direction_sense}
|
attributes = {"OffsetFromReferenceLine": offset, "DirectionSense": direction_sense}
|
||||||
ifcopenshell.api.material.edit_layer_usage(model, usage=material_set_usage, attributes=attributes)
|
ifcopenshell.api.material.edit_layer_usage(model, usage=material_set_usage, attributes=attributes)
|
||||||
tool.Model.recalculate_walls([wall["obj"]])
|
tool.Model.recalculate_layer2_elements([wall["obj"]])
|
||||||
|
|
||||||
if walls:
|
if walls:
|
||||||
if is_polyline_closed:
|
if is_polyline_closed:
|
||||||
@@ -1034,7 +1034,7 @@ class DumbWallGenerator:
|
|||||||
return next(c for c in classes if "StandardCase" not in c)
|
return next(c for c in classes if "StandardCase" not in c)
|
||||||
|
|
||||||
|
|
||||||
class DumbWallPlaner:
|
class Layer2Planer:
|
||||||
def regenerate_from_layer(self, layer: ifcopenshell.entity_instance) -> None:
|
def regenerate_from_layer(self, layer: ifcopenshell.entity_instance) -> None:
|
||||||
for layer_set in layer.ToMaterialLayerSet:
|
for layer_set in layer.ToMaterialLayerSet:
|
||||||
self.regenerate_from_layer_set(layer_set)
|
self.regenerate_from_layer_set(layer_set)
|
||||||
@@ -1055,7 +1055,7 @@ class DumbWallPlaner:
|
|||||||
else:
|
else:
|
||||||
for rel in inverse.AssociatedTo:
|
for rel in inverse.AssociatedTo:
|
||||||
walls.extend([tool.Ifc.get_object(e) for e in rel.RelatedObjects])
|
walls.extend([tool.Ifc.get_object(e) for e in rel.RelatedObjects])
|
||||||
tool.Model.recalculate_walls([w for w in set(walls) if w])
|
tool.Model.recalculate_layer2_elements([w for w in set(walls) if w])
|
||||||
|
|
||||||
|
|
||||||
class DumbWallJoiner:
|
class DumbWallJoiner:
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ def offset_walls(ifc: type[tool.Ifc], blender: type[tool.Blender], model: type[t
|
|||||||
]
|
]
|
||||||
for obj in objs:
|
for obj in objs:
|
||||||
model.offset_wall(obj, offset_type)
|
model.offset_wall(obj, offset_type)
|
||||||
model.recalculate_walls(objs)
|
model.recalculate_layer2_elements(objs)
|
||||||
|
|
||||||
|
|
||||||
def align_walls(
|
def align_walls(
|
||||||
|
|||||||
@@ -44,9 +44,9 @@ def assign_type(
|
|||||||
if (usage := model.get_usage_type(type)) == "PROFILE":
|
if (usage := model.get_usage_type(type)) == "PROFILE":
|
||||||
model.regenerate_profile(obj)
|
model.regenerate_profile(obj)
|
||||||
elif usage == "LAYER2":
|
elif usage == "LAYER2":
|
||||||
model.recalculate_walls([obj])
|
model.recalculate_layer2_elements([obj])
|
||||||
elif usage == "LAYER3":
|
elif usage == "LAYER3":
|
||||||
model.regenerate_slab(obj)
|
model.regenerate_layer3_element(obj)
|
||||||
else:
|
else:
|
||||||
type_data = type_tool.get_object_data(ifc.get_object(type))
|
type_data = type_tool.get_object_data(ifc.get_object(type))
|
||||||
if type_data:
|
if type_data:
|
||||||
|
|||||||
@@ -2717,41 +2717,41 @@ class Model(bonsai.core.tool.Model):
|
|||||||
tool.Geometry.record_object_position(obj)
|
tool.Geometry.record_object_position(obj)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def recalculate_walls(cls, walls: list[bpy.types.Object]) -> None:
|
def recalculate_layer2_elements(cls, objs: list[bpy.types.Object]) -> None:
|
||||||
queue: set[tuple[ifcopenshell.entity_instance, bpy.types.Object]] = set()
|
queue: set[tuple[ifcopenshell.entity_instance, bpy.types.Object]] = set()
|
||||||
for wall in walls:
|
for obj in objs:
|
||||||
element = tool.Ifc.get_entity(wall)
|
element = tool.Ifc.get_entity(obj)
|
||||||
if tool.Ifc.is_moved(wall):
|
if tool.Ifc.is_moved(obj):
|
||||||
bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=wall)
|
bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj)
|
||||||
queue.add((element, wall))
|
queue.add((element, obj))
|
||||||
for rel in getattr(element, "ConnectedTo", []):
|
for rel in getattr(element, "ConnectedTo", []):
|
||||||
obj = tool.Ifc.get_object(rel.RelatedElement)
|
connected_obj = tool.Ifc.get_object(rel.RelatedElement)
|
||||||
if tool.Ifc.is_moved(obj):
|
if tool.Ifc.is_moved(connected_obj):
|
||||||
bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj)
|
bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=connected_obj)
|
||||||
queue.add((rel.RelatedElement, obj))
|
queue.add((rel.RelatedElement, connected_obj))
|
||||||
for rel in getattr(element, "ConnectedFrom", []):
|
for rel in getattr(element, "ConnectedFrom", []):
|
||||||
obj = tool.Ifc.get_object(rel.RelatingElement)
|
connected_obj = tool.Ifc.get_object(rel.RelatingElement)
|
||||||
if tool.Ifc.is_moved(obj):
|
if tool.Ifc.is_moved(connected_obj):
|
||||||
bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj)
|
bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=connected_obj)
|
||||||
queue.add((rel.RelatingElement, obj))
|
queue.add((rel.RelatingElement, connected_obj))
|
||||||
for element, wall in queue:
|
for element, obj in queue:
|
||||||
if tool.Model.get_usage_type(element) == "LAYER2" and wall:
|
if tool.Model.get_usage_type(element) == "LAYER2" and obj:
|
||||||
# Use layer custom offset
|
# Use layer custom offset
|
||||||
custom_offset = tool.Model.get_material_layer_custom_offset(element, wall)
|
custom_offset = tool.Model.get_material_layer_custom_offset(element, obj)
|
||||||
material = ifcopenshell.util.element.get_material(element)
|
material = ifcopenshell.util.element.get_material(element)
|
||||||
if material.is_a("IfcMaterialLayerSetUsage") and custom_offset is not None:
|
if material.is_a("IfcMaterialLayerSetUsage") and custom_offset is not None:
|
||||||
material.OffsetFromReferenceLine = custom_offset
|
material.OffsetFromReferenceLine = custom_offset
|
||||||
|
|
||||||
cls.recreate_wall(element, wall)
|
cls.recreate_wall(element, obj)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def regenerate_slab(cls, obj: bpy.types.Object) -> None:
|
def regenerate_layer3_element(cls, obj: bpy.types.Object) -> None:
|
||||||
from bonsai.bim.module.model.slab import DumbSlabPlaner
|
from bonsai.bim.module.model.slab import Layer3Planer
|
||||||
|
|
||||||
element = tool.Ifc.get_entity(obj)
|
element = tool.Ifc.get_entity(obj)
|
||||||
material_set = ifcopenshell.util.element.get_material(element, should_skip_usage=True)
|
material_set = ifcopenshell.util.element.get_material(element, should_skip_usage=True)
|
||||||
new_thickness = sum([l.LayerThickness for l in material_set.MaterialLayers])
|
new_thickness = sum([l.LayerThickness for l in material_set.MaterialLayers])
|
||||||
DumbSlabPlaner().change_thickness(element, new_thickness)
|
Layer3Planer().change_thickness(element, new_thickness)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def regenerate_profile(cls, obj: bpy.types.Object) -> None:
|
def regenerate_profile(cls, obj: bpy.types.Object) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user