From 391e09c16c2d18f95ac562e54d78cec79c2a7606 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 29 Sep 2022 23:31:11 +1000 Subject: [PATCH] Convenience operator to draw rectangles when editing profiles --- .../blenderbim/bim/module/cad/__init__.py | 1 + .../blenderbim/bim/module/cad/operator.py | 30 +++++++++++++++++++ .../blenderbim/bim/module/cad/prop.py | 2 ++ .../blenderbim/bim/module/cad/workspace.py | 15 ++++++++++ 4 files changed, 48 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/cad/__init__.py b/src/blenderbim/blenderbim/bim/module/cad/__init__.py index 9cd2103ca9..a053e701c2 100644 --- a/src/blenderbim/blenderbim/bim/module/cad/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/cad/__init__.py @@ -23,6 +23,7 @@ classes = ( operator.AlignViewToProfile, operator.AddIfcArcIndexFillet, operator.AddIfcCircle, + operator.AddRectangle, operator.CadArcFrom2Points, operator.CadArcFrom3Points, operator.CadFillet, diff --git a/src/blenderbim/blenderbim/bim/module/cad/operator.py b/src/blenderbim/blenderbim/bim/module/cad/operator.py index 0e4e83bd77..b0c42f7369 100644 --- a/src/blenderbim/blenderbim/bim/module/cad/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cad/operator.py @@ -781,3 +781,33 @@ class AlignViewToProfile(bpy.types.Operator): region_3d.view_perspective = "ORTHO" bpy.ops.object.mode_set(mode="EDIT") return {"FINISHED"} + + +class AddRectangle(bpy.types.Operator): + bl_idname = "bim.add_rectangle" + bl_label = "Add Rectangle" + x: bpy.props.FloatProperty(name="X", default=0.1) + y: bpy.props.FloatProperty(name="Y", default=0.1) + + @classmethod + def poll(cls, context): + obj = context.active_object + return bool(obj) and obj.type == "MESH" + + def execute(self, context): + obj = context.active_object + bm = bmesh.from_edit_mesh(obj.data) + cursor = obj.matrix_world.inverted() @ context.scene.cursor.location + new_verts = [ + bm.verts.new((cursor[0], cursor[1], 0.0)), + bm.verts.new((cursor[0] + self.x, cursor[1], 0.0)), + bm.verts.new((cursor[0] + self.x, cursor[1] + self.y, 0.0)), + bm.verts.new((cursor[0], cursor[1] + self.y, 0.0)), + ] + [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)] + bm.edges.new((new_verts[len(new_verts) - 1], new_verts[0])) + + bm.verts.index_update() + bm.edges.index_update() + bmesh.update_edit_mesh(obj.data) + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/cad/prop.py b/src/blenderbim/blenderbim/bim/module/cad/prop.py index 4caab0629f..f26207224d 100644 --- a/src/blenderbim/blenderbim/bim/module/cad/prop.py +++ b/src/blenderbim/blenderbim/bim/module/cad/prop.py @@ -26,3 +26,5 @@ class BIMCadProperties(PropertyGroup): resolution: bpy.props.IntProperty(name="Arc Resolution", min=1, default=1) radius: bpy.props.FloatProperty(name="Radius", default=0.1) distance: bpy.props.FloatProperty(name="Distance", default=0.1) + x: bpy.props.FloatProperty(name="X", default=0.2) + y: bpy.props.FloatProperty(name="Y", default=0.1) diff --git a/src/blenderbim/blenderbim/bim/module/cad/workspace.py b/src/blenderbim/blenderbim/bim/module/cad/workspace.py index 91356412fa..ea495d79cc 100644 --- a/src/blenderbim/blenderbim/bim/module/cad/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/cad/workspace.py @@ -39,6 +39,7 @@ class CadTool(WorkSpaceTool): ("bim.cad_hotkey", {"type": "F", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_F")]}), ("bim.cad_hotkey", {"type": "O", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_O")]}), ("bim.cad_hotkey", {"type": "Q", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_Q")]}), + ("bim.cad_hotkey", {"type": "R", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_R")]}), ("bim.cad_hotkey", {"type": "T", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_T")]}), ("bim.cad_hotkey", {"type": "V", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_V")]}), ("bim.cad_hotkey", {"type": "X", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_X")]}), @@ -74,6 +75,11 @@ class CadTool(WorkSpaceTool): row.label(text="", icon="EVENT_O") row.operator("bim.cad_hotkey", text="Offset").hotkey = "S_O" + row = layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_R") + row.operator("bim.add_rectangle", text="Rectangle") + row = layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_C") @@ -145,6 +151,11 @@ class CadHotkey(bpy.types.Operator): elif self.hotkey == "S_O": row = self.layout.row() row.prop(props, "distance") + elif self.hotkey == "S_R": + row = self.layout.row() + row.prop(props, "x") + row = self.layout.row() + row.prop(props, "y") elif self.hotkey == "S_V": if not self.is_profile(): row = self.layout.row() @@ -171,6 +182,10 @@ class CadHotkey(bpy.types.Operator): def hotkey_S_Q(self): bpy.ops.bim.edit_extrusion_profile() + def hotkey_S_R(self): + if self.is_profile(): + bpy.ops.bim.add_rectangle(x=self.props.x, y=self.props.y) + def hotkey_S_T(self): bpy.ops.bim.cad_mitre()