Makro EdgesToArc (Hrany do oblouku)
File:Text-x-python EdgesToArc |
Description |
---|
Pokud je to možné nahradí vybrané hrany kružnicovým obloukem. Užitečné pro obnovu oblouků rozpadlých do krátkých přímek. Author: Jreinhardt |
Author |
Jreinhardt |
Download |
None |
Links |
Macros recipes How to install macros How to customize toolbars |
Macro Version |
1.0 |
Date last modified |
None |
FreeCAD Version(s) |
None |
Default shortcut |
None |
See also |
None |
Občas někdo narazí na drát, který obsahuje oblouk vytvořený z malých přímých segmentů. Často se to stává při práci se soubory z jiných programů. Toto makro umožňuje relativně snadno konvertovat takový oblouk složený z přímek vrátit do kružnicového oblouku. Snižuje to velikost souboru a soubor to dělá mnohem snadněji zpracovatelným,
Pro použití tohoto makra musíte rozlámat drát do jednotlivých hran použitím funkce Draft Downgrade. Potom jen vyberete segmenty, které chcete nahradit kružnicovým obloukem a spustíte makro. Potřebujete minimálně 2 segmenty.
The macro will check whether the segments all lie on a common circle and will abort if this is not the case. Otherwise it will create the arc and remove the segments.
Because of small inaccuracies in the calculations, the Draft Upgrade function can sometimes fail to recombine the other edges and the arcs back into a wire. In this case the Macro_SuperWire provides a more robust way to do this.
import Draft
import FreeCADGui, FreeCAD
from FreeCAD import Base, Console
from math import atan2, pi, fabs
#This macro replaces a number of edges approximating a circular arc by a proper circular arc.
#It might be necessary to use the superwire macro to recombine the edges back to a wire, because of small errors in the calculations.
sel = FreeCADGui.Selection.getSelection()
if len(sel) < 2:
Console.PrintError("Too few edges are selected\n")
edges = [s.Shape for s in sel]
start_vertices = []
end_vertices = []
for edge in edges:
start_vertices.append(edge.Vertexes[0].Point)
end_vertices.append(edge.Vertexes[1].Point)
vertices = start_vertices + end_vertices
start,end,middle = None,None,None
#find start and end points
for edge in edges:
is_start = True
is_end = True
for point in end_vertices:
if edge.Vertexes[0].Point.distanceToPoint(point) < 1e-8:
is_start = False
for point in start_vertices:
if edge.Vertexes[1].Point.distanceToPoint(point) < 1e-8:
is_end = False
if is_start:
start = edge.Vertexes[0].Point
if is_end:
end = edge.Vertexes[1].Point
#find middle point, at least not too far away from the middle
for v in vertices:
ratio = v.distanceToPoint(start)/v.distanceToPoint(end)
if ratio > 0.5 and ratio < 2.:
middle = v
break
if middle is None:
Console.PrintError("Could not find suitable middle point\n")
arc = Part.ArcOfCircle(start,middle,end)
#Check circularity
circular = True
for v in vertices:
if fabs(v.distanceToPoint(arc.Center) - arc.Radius) > 1e-6:
Console.PrintError("Edges do not approximate a circular arc\n")
circular = False
break
if circular:
Part.show(arc.toShape())
for shape in sel:
FreeCAD.ActiveDocument.removeObject(shape.Name)