#1153 Utility to convert an edge to an arc in preparation for angular dimensions

This commit is contained in:
Dion Moult
2022-04-23 17:25:39 +10:00
parent 3264f338c7
commit bd16345b76
2 changed files with 45 additions and 7 deletions
@@ -34,6 +34,7 @@ classes = (
operator.BuildSchedule,
operator.CleanWireframes,
operator.ContractSheet,
operator.ConvertEdgeToArc,
operator.CopyGrid,
operator.CreateDrawing,
operator.CreateSheets,
@@ -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"}