From a88b83306e580210234c8e7cacf1732c85a30044 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 1 May 2022 14:43:00 +1000 Subject: [PATCH] #1153 New arc from 2 points command for 2D CAD (based on view direction) --- .../blenderbim/bim/module/cad/__init__.py | 5 +- .../blenderbim/bim/module/cad/operator.py | 50 +++++++++++++++++++ .../blenderbim/bim/module/cad/workspace.py | 9 +++- .../blenderbim/bim/module/drawing/__init__.py | 1 - .../blenderbim/bim/module/drawing/operator.py | 44 +--------------- 5 files changed, 61 insertions(+), 48 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cad/__init__.py b/src/blenderbim/blenderbim/bim/module/cad/__init__.py index e73d402ff5..179cf3005b 100644 --- a/src/blenderbim/blenderbim/bim/module/cad/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/cad/__init__.py @@ -20,9 +20,10 @@ import bpy from . import operator, workspace classes = ( - operator.CadTrimExtend, - operator.CadMitre, + operator.CadArcFrom2Points, operator.CadFillet, + operator.CadMitre, + operator.CadTrimExtend, workspace.CadHotkey, ) diff --git a/src/blenderbim/blenderbim/bim/module/cad/operator.py b/src/blenderbim/blenderbim/bim/module/cad/operator.py index b6f69284b1..8d1be13cbf 100644 --- a/src/blenderbim/blenderbim/bim/module/cad/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cad/operator.py @@ -20,6 +20,7 @@ import bpy import math import bmesh import mathutils +import bpy_extras import blenderbim.tool as tool messages = { @@ -205,3 +206,52 @@ class CadFillet(bpy.types.Operator): bmesh.update_edit_mesh(mesh) mesh.update() return {"FINISHED"} + + +class CadArcFrom2Points(bpy.types.Operator): + bl_idname = "bim.cad_arc_from_2_points" + bl_label = "CAD Arc from 2 Points" + bl_options = {"REGISTER", "UNDO"} + + resolution: bpy.props.IntProperty(name="Arc Resolution", min=1, default=1) + should_flip: bpy.props.BoolProperty(name="Flip", description="Flip arc", default=False) + + def draw(self, context): + layout = self.layout + for prop in self.__class__.__annotations__.keys(): + layout.prop(self, prop) + + def execute(self, context): + if bpy.context.mode != "EDIT_MESH": + return {"CANCELLED"} + obj = bpy.context.active_object + region = bpy.context.region + region_3d = bpy.context.area.spaces.active.region_3d + cursor = bpy.context.scene.cursor.location + center = bpy_extras.view3d_utils.location_3d_to_region_2d(region, region_3d, cursor) + if not center: + return {"CANCELLED"} + mesh = obj.data + bm = bmesh.from_edit_mesh(mesh) + selected_verts = [v for v in bm.verts if v.select] + if len(selected_verts) != 2: + return {"CANCELLED"} + v1 = bpy_extras.view3d_utils.location_3d_to_region_2d(region, region_3d, selected_verts[0].co) + v2 = bpy_extras.view3d_utils.location_3d_to_region_2d(region, region_3d, selected_verts[1].co) + l1 = v1 - center + l2 = v2 - center + angle = l1.angle_signed(l2) + + if self.should_flip: + if angle > 0: + angle = -((math.pi * 2) - angle) + else: + angle = (math.pi * 2) + angle + + v = selected_verts[0] + bm.verts.remove(selected_verts[1]) + axis = region_3d.view_rotation @ mathutils.Vector((0, 0, 1)) + bmesh.ops.spin(bm, geom=[v], axis=axis, cent=cursor, steps=self.resolution * 4, angle=-angle) + bmesh.update_edit_mesh(mesh) + mesh.update() + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/cad/workspace.py b/src/blenderbim/blenderbim/bim/module/cad/workspace.py index 5943ef57b0..df653ea33a 100644 --- a/src/blenderbim/blenderbim/bim/module/cad/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/cad/workspace.py @@ -37,9 +37,10 @@ class CadTool(WorkSpaceTool): bl_keymap = ( ("bim.cad_hotkey", {"type": "E", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_E")]}), ("bim.cad_hotkey", {"type": "T", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_T")]}), - ("bim.cad_fillet", {"type": "F", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_F")]}), + ("bim.cad_fillet", {"type": "F", "value": "PRESS", "shift": True}, {"properties": []}), # Enable Mesh Tools add-on to get this amazing tool - ("mesh.offset_edges", {"type": "O", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_O")]}), + ("mesh.offset_edges", {"type": "O", "value": "PRESS", "shift": True}, {"properties": []}), + ("bim.cad_arc_from_2_points", {"type": "C", "value": "PRESS", "shift": True}, {"properties": []}), ) def draw_settings(context, layout, tool): @@ -59,6 +60,10 @@ class CadTool(WorkSpaceTool): row.label(text="", icon="EVENT_SHIFT") row.label(text="Offset", icon="EVENT_O") + row = layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="2-Point Arc", icon="EVENT_C") + class CadHotkey(bpy.types.Operator): bl_idname = "bim.cad_hotkey" diff --git a/src/blenderbim/blenderbim/bim/module/drawing/__init__.py b/src/blenderbim/blenderbim/bim/module/drawing/__init__.py index ba5c0d3d97..62f56ae128 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/__init__.py @@ -34,7 +34,6 @@ classes = ( operator.BuildSchedule, operator.CleanWireframes, operator.ContractSheet, - operator.ConvertEdgeToArc, operator.CopyGrid, operator.CreateDrawing, operator.CreateSheets, diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index cae1419c51..d377c7a922 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -40,8 +40,7 @@ import blenderbim.bim.module.drawing.scheduler as scheduler import blenderbim.bim.module.drawing.helper as helper import blenderbim.bim.export_ifc from lxml import etree -from math import pi -from mathutils import Vector, Matrix, Euler, geometry +from mathutils import Vector from blenderbim.bim.module.drawing.prop import RasterStyleProperty from blenderbim.bim.ifc import IfcStore from ifcopenshell.api.group.data import Data as GroupData @@ -1357,44 +1356,3 @@ class ContractSheet(bpy.types.Operator): sheet.is_expanded = False core.load_sheets(tool.Drawing) return {"FINISHED"} - - -class ConvertEdgeToArc(bpy.types.Operator): - bl_idname = "bim.convert_edge_to_arc" - bl_label = "Convert Edge to Arc" - bl_options = {"REGISTER", "UNDO"} - - resolution: bpy.props.IntProperty(name="Arc Resolution", min=1, default=1) - should_flip: bpy.props.BoolProperty(name="Flip", description="Flip arc", default=False) - - def draw(self, context): - layout = self.layout - for prop in self.__class__.__annotations__.keys(): - layout.prop(self, prop) - - def execute(self, context): - if bpy.context.mode != "EDIT_MESH": - return {"CANCELLED"} - obj = bpy.context.active_object - cursor = obj.matrix_world.inverted() @ bpy.context.scene.cursor.location - mesh = obj.data - bm = bmesh.from_edit_mesh(mesh) - selected_verts = [v for v in bm.verts if v.select] - if len(selected_verts) != 2: - return {"CANCELLED"} - l1 = selected_verts[0].co - cursor - l2 = selected_verts[1].co - cursor - angle = l1.xy.angle_signed(l2.xy) - - if self.should_flip: - if angle > 0: - angle = -((pi * 2) - angle) - else: - angle = (pi * 2) + angle - - v = selected_verts[0] - bm.verts.remove(selected_verts[1]) - bmesh.ops.spin(bm, geom=[v], axis=(0, 0, 1), cent=cursor, steps=self.resolution * 4, angle=-angle) - bmesh.update_edit_mesh(mesh) - mesh.update() - return {"FINISHED"}