diff --git a/src/blenderbim/blenderbim/bim/module/model/wall.py b/src/blenderbim/blenderbim/bim/module/model/wall.py index a9fec06311..45a5b723bc 100644 --- a/src/blenderbim/blenderbim/bim/module/model/wall.py +++ b/src/blenderbim/blenderbim/bim/module/model/wall.py @@ -32,6 +32,7 @@ import blenderbim.bim.handler import blenderbim.core.type import blenderbim.core.root import blenderbim.core.geometry +import blenderbim.core.model as core import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore from math import pi, sin, cos, degrees @@ -80,14 +81,12 @@ class JoinWall(bpy.types.Operator, tool.Ifc.Operator): return {"FINISHED"} if self.join_type in ("L", "V"): - if len(selected_objs) != 2: - self.report({"ERROR"}, f"It requires 2 selected objects to do join of type {self.join_type}") + try: + core.join_wall_LV(tool.Blender, joiner, join_type=self.join_type) + except core.RequireTwoObjectsError: + join_type_name = {"L": "butt", "V": "mitre"}[self.join_type] + self.report({"ERROR"}, f"Please select 2 objects to do a {join_type_name} joint") return {"CANCELLED"} - another_selected_object = next(o for o in selected_objs if o != context.active_object) - if self.join_type == "L": - joiner.join_L(another_selected_object, context.active_object) - elif self.join_type == "V": - joiner.join_V(another_selected_object, context.active_object) return {"FINISHED"} if self.join_type == "T": diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index e76c819cd5..7b993df474 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -21,11 +21,11 @@ import bpy import ifcopenshell import ifcopenshell.util.unit import blenderbim.tool as tool -import blenderbim.bim.module.type.prop as type_prop +import blenderbim.core.model +from blenderbim.bim.module.model.wall import DumbWallJoiner from blenderbim.bim.helper import prop_with_search from bpy.types import WorkSpaceTool from blenderbim.bim.module.model.data import AuthoringData -from blenderbim.bim.module.drawing.data import DecoratorData from blenderbim.bim.module.system.data import PortData from blenderbim.bim.module.model.prop import get_ifc_class @@ -781,7 +781,11 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator): if not bpy.context.selected_objects: return if self.active_material_usage == "LAYER2": - bpy.ops.bim.join_wall(join_type="L") + try: + blenderbim.core.model.join_wall_LV(tool.Blender, DumbWallJoiner(), join_type="L") + except blenderbim.core.model.RequireTwoObjectsError: + self.report({"ERROR"}, "Please select 2 objects to do a butt joint") + return {"CANCELLED"} elif self.active_material_usage == "PROFILE": bpy.ops.bim.extend_profile(join_type="L") @@ -806,7 +810,11 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator): if not bpy.context.selected_objects: return if self.active_material_usage == "LAYER2": - bpy.ops.bim.join_wall(join_type="V") + try: + blenderbim.core.model.join_wall_LV(tool.Blender, DumbWallJoiner(), join_type="V") + except blenderbim.core.model.RequireTwoObjectsError: + self.report({"ERROR"}, "Please select 2 objects to do a mitre joint") + return {"CANCELLED"} elif self.active_class in ("IfcDuctSegment", "IfcPipeSegment", "IfcCableCarrierSegment", "IfcCableSegment"): bpy.ops.bim.fit_flow_segments() elif self.active_material_usage == "PROFILE": diff --git a/src/blenderbim/blenderbim/core/model.py b/src/blenderbim/blenderbim/core/model.py new file mode 100644 index 0000000000..7749f8c22a --- /dev/null +++ b/src/blenderbim/blenderbim/core/model.py @@ -0,0 +1,36 @@ +# BlenderBIM Add-on - OpenBIM Blender Add-on +# Copyright (C) 2021 Dion Moult +# +# This file is part of BlenderBIM Add-on. +# +# BlenderBIM Add-on is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# BlenderBIM Add-on is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with BlenderBIM Add-on. If not, see . + +import blenderbim.core.tool as tool +from typing import Literal + + +def join_wall_LV(blender: tool.Blender, joiner, join_type: Literal["L", "V"] = "L") -> None: + if len(selected_objs := blender.get_selected_objects()) != 2: + raise RequireTwoObjectsError() + + active_obj = blender.get_active_object() + another_selected_object = next(o for o in selected_objs if o != active_obj) + if join_type == "L": + joiner.join_L(another_selected_object, active_obj) + elif join_type == "V": + joiner.join_V(another_selected_object, active_obj) + + +class RequireTwoObjectsError(Exception): + pass