New convenient modifier to rotate beam/wall/column etc by 90 degrees

This commit is contained in:
Dion Moult
2022-09-24 21:46:32 +10:00
parent 76ce726f1d
commit 33ebcd7664
6 changed files with 49 additions and 3 deletions
@@ -190,18 +190,23 @@ class UpdateRepresentation(bpy.types.Operator):
def update_obj_mesh_representation(self, context, obj):
product = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)
material = ifcopenshell.util.element.get_material(product, should_skip_usage=True)
if not product.is_a("IfcGridAxis"):
tool.Geometry.clear_cache(product)
if product.is_a("IfcGridAxis"):
# Grid geometry does not follow the "representation" paradigm and needs to be treated specially
ifcopenshell.api.run("grid.create_axis_curve", self.file, **{"axis_curve": obj, "grid_axis": product})
return
if product.is_a("IfcRelSpaceBoundary"):
elif product.is_a("IfcRelSpaceBoundary"):
# TODO refactor
settings = tool.Boundary.get_assign_connection_geometry_settings(obj)
ifcopenshell.api.run("boundary.assign_connection_geometry", tool.Ifc.get(), **settings)
return
elif material and material.is_a() in ["IfcMaterialProfileSet", "IfcMaterialLayerSet"]:
# These objects are parametrically based on an axis and should not be modified as a mesh
return
core.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj)
@@ -39,6 +39,7 @@ classes = (
profile.ChangeProfileDepth,
profile.ExtendProfile,
profile.RecalculateProfile,
profile.Rotate90,
prop.BIMModelProperties,
prop.ConstrTypeInfo,
ui.BIM_PT_authoring,
@@ -482,6 +482,7 @@ class DumbProfileJoiner:
is_global=True,
should_sync_changes_first=False,
)
tool.Geometry.record_object_materials(obj)
def join(self, profile1, profile2, connection1, connection2, is_relating=True, description="BUTT"):
element1 = tool.Ifc.get_entity(profile1)
@@ -826,3 +827,26 @@ class ChangeCardinalPoint(bpy.types.Operator):
objs.append(obj)
DumbProfileRecalculator().recalculate(objs)
return {"FINISHED"}
class Rotate90(bpy.types.Operator):
bl_idname = "bim.rotate_90"
bl_label = "Rotate 90"
bl_options = {"REGISTER", "UNDO"}
axis: bpy.props.StringProperty()
@classmethod
def poll(cls, context):
return context.selected_objects
def execute(self, context):
objs = []
for obj in context.selected_objects:
element = tool.Ifc.get_entity(obj)
if element.ConnectedTo or element.ConnectedFrom:
objs.append(obj)
rotate_matrix = Matrix.Rotation(pi / 2, 4, self.axis)
obj.matrix_world @= rotate_matrix
bpy.context.view_layer.update()
DumbProfileRecalculator().recalculate(objs)
return {"FINISHED"}
@@ -1031,6 +1031,7 @@ class DumbWallJoiner:
is_global=True,
should_sync_changes_first=False,
)
tool.Geometry.record_object_materials(obj)
def create_matrix(self, p, x, y, z):
return Matrix(
@@ -46,6 +46,7 @@ class BimTool(WorkSpaceTool):
("bim.hotkey", {"type": "G", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_G")]}),
("bim.hotkey", {"type": "M", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_M")]}),
("bim.hotkey", {"type": "O", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_O")]}),
("bim.hotkey", {"type": "R", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_R")]}),
("bim.hotkey", {"type": "S", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_S")]}),
("bim.hotkey", {"type": "T", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_T")]}),
("bim.hotkey", {"type": "V", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_V")]}),
@@ -206,6 +207,10 @@ class BimTool(WorkSpaceTool):
row.operator("bim.hotkey", text="Mitre").hotkey = "S_Y"
row = layout.row(align=True)
row.label(text="", icon="EVENT_SHIFT")
row.label(text="", icon="EVENT_R")
row.operator("bim.hotkey", text="Rotate 90").hotkey = "S_R"
row = layout.row(align=True)
row.label(text="", icon="EVENT_SHIFT")
row.label(text="", icon="EVENT_G")
row.operator("bim.hotkey", text="Regen Connections").hotkey = "S_G"
row = layout.row(align=True)
@@ -319,6 +324,16 @@ class Hotkey(bpy.types.Operator):
else:
bpy.ops.bim.align_product(align_type="NEGATIVE")
def hotkey_S_R(self):
if not self.has_ifc_class:
return
if self.props.ifc_class == "IfcWallType":
bpy.ops.bim.rotate_90(axis="Z")
elif self.props.ifc_class == "IfcColumnType":
bpy.ops.bim.rotate_90(axis="Z")
elif self.props.ifc_class in ["IfcBeamType", "IfcMemberType"]:
bpy.ops.bim.rotate_90(axis="Y")
def hotkey_S_S(self):
if self.has_ifc_class and self.props.ifc_class == "IfcWallType":
bpy.ops.bim.split_wall()
@@ -132,7 +132,7 @@ class Usecase:
else:
settings = ifcopenshell.geom.settings()
settings.set(settings.INCLUDE_CURVES, True)
shape = ifcopenshell.geom.create_shape(settings, element)
shape = ifcopenshell.geom.create_shape(settings, self.settings["profile"])
x = [verts[i] for i in range(0, len(shape.verts), 3)]
return self.convert_si_to_unit(max(x) - min(x))
return 0.0
@@ -161,7 +161,7 @@ class Usecase:
else:
settings = ifcopenshell.geom.settings()
settings.set(settings.INCLUDE_CURVES, True)
shape = ifcopenshell.geom.create_shape(settings, element)
shape = ifcopenshell.geom.create_shape(settings, self.settings["profile"])
y = [verts[i + 1] for i in range(0, len(shape.verts), 3)]
return self.convert_si_to_unit(max(y) - min(y))
return 0.0