mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 14:41:25 +00:00
#1153 Utility to convert an edge to an arc in preparation for angular dimensions
This commit is contained in:
@@ -34,6 +34,7 @@ classes = (
|
|||||||
operator.BuildSchedule,
|
operator.BuildSchedule,
|
||||||
operator.CleanWireframes,
|
operator.CleanWireframes,
|
||||||
operator.ContractSheet,
|
operator.ContractSheet,
|
||||||
|
operator.ConvertEdgeToArc,
|
||||||
operator.CopyGrid,
|
operator.CopyGrid,
|
||||||
operator.CreateDrawing,
|
operator.CreateDrawing,
|
||||||
operator.CreateSheets,
|
operator.CreateSheets,
|
||||||
|
|||||||
@@ -191,9 +191,7 @@ class CreateDrawing(bpy.types.Operator):
|
|||||||
return
|
return
|
||||||
svg_path = os.path.join(context.scene.BIMProperties.data_dir, "cache", self.drawing_name + "-underlay.svg")
|
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"
|
context.scene.render.filepath = svg_path[0:-4] + ".png"
|
||||||
drawing_style = context.scene.DocProperties.drawing_styles[
|
drawing_style = context.scene.DocProperties.drawing_styles[self.cprops.active_drawing_style_index]
|
||||||
self.cprops.active_drawing_style_index
|
|
||||||
]
|
|
||||||
|
|
||||||
if drawing_style.render_type == "DEFAULT":
|
if drawing_style.render_type == "DEFAULT":
|
||||||
bpy.ops.render.render(write_still=True)
|
bpy.ops.render.render(write_still=True)
|
||||||
@@ -420,9 +418,7 @@ class CreateDrawing(bpy.types.Operator):
|
|||||||
camera = self.camera
|
camera = self.camera
|
||||||
svg_writer = svgwriter.SvgWriter()
|
svg_writer = svgwriter.SvgWriter()
|
||||||
|
|
||||||
drawing_style = context.scene.DocProperties.drawing_styles[
|
drawing_style = context.scene.DocProperties.drawing_styles[self.cprops.active_drawing_style_index]
|
||||||
self.cprops.active_drawing_style_index
|
|
||||||
]
|
|
||||||
|
|
||||||
render = context.scene.render
|
render = context.scene.render
|
||||||
if self.is_landscape(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)))
|
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))
|
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.metadata = tool.Drawing.get_drawing_metadata(self.camera_element)
|
||||||
|
|
||||||
svg_writer.write("annotation")
|
svg_writer.write("annotation")
|
||||||
@@ -1317,3 +1313,44 @@ class ContractSheet(bpy.types.Operator):
|
|||||||
sheet.is_expanded = False
|
sheet.is_expanded = False
|
||||||
core.load_sheets(tool.Drawing)
|
core.load_sheets(tool.Drawing)
|
||||||
return {"FINISHED"}
|
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"}
|
||||||
|
|||||||
Reference in New Issue
Block a user