From bd16345b7622c1b26135d08ff28e47cabffd7e90 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 23 Apr 2022 17:25:39 +1000 Subject: [PATCH] #1153 Utility to convert an edge to an arc in preparation for angular dimensions --- .../blenderbim/bim/module/drawing/__init__.py | 1 + .../blenderbim/bim/module/drawing/operator.py | 51 ++++++++++++++++--- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/__init__.py b/src/blenderbim/blenderbim/bim/module/drawing/__init__.py index 0eaf27f532..5b18d9b10f 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/__init__.py @@ -34,6 +34,7 @@ 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 4b491b22bb..b92240b1ab 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -191,9 +191,7 @@ class CreateDrawing(bpy.types.Operator): return svg_path = os.path.join(context.scene.BIMProperties.data_dir, "cache", self.drawing_name + "-underlay.svg") context.scene.render.filepath = svg_path[0:-4] + ".png" - drawing_style = context.scene.DocProperties.drawing_styles[ - self.cprops.active_drawing_style_index - ] + drawing_style = context.scene.DocProperties.drawing_styles[self.cprops.active_drawing_style_index] if drawing_style.render_type == "DEFAULT": bpy.ops.render.render(write_still=True) @@ -420,9 +418,7 @@ class CreateDrawing(bpy.types.Operator): camera = self.camera svg_writer = svgwriter.SvgWriter() - drawing_style = context.scene.DocProperties.drawing_styles[ - self.cprops.active_drawing_style_index - ] + drawing_style = context.scene.DocProperties.drawing_styles[self.cprops.active_drawing_style_index] render = context.scene.render if self.is_landscape(render): @@ -443,7 +439,7 @@ class CreateDrawing(bpy.types.Operator): svg_writer.camera_projection = tuple(camera.matrix_world.to_quaternion() @ Vector((0, 0, -1))) elements = tool.Drawing.get_group_elements(tool.Drawing.get_drawing_group(self.camera_element)) - svg_writer.annotations = sorted(elements, key=lambda a : tool.Drawing.get_annotation_z_index(a)) + svg_writer.annotations = sorted(elements, key=lambda a: tool.Drawing.get_annotation_z_index(a)) svg_writer.metadata = tool.Drawing.get_drawing_metadata(self.camera_element) svg_writer.write("annotation") @@ -1317,3 +1313,44 @@ 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"}