Macro EdgesToArc/it


Text-x-python.png Da Segmento a Arco

Descrizione
Sostituisce, se possibile, i segmenti selezionati con un arco di cerchio. Utile per il ripristino di archi discretizzati.
Autore
Jreinhardt
Link
Esempi di macro
Come installare le Macro
Personalizzare la barra degli strumenti
Versione
1.0
Data ultima modifica
2014-01-02


A volte si incontrano contorni che contengono archi composti da piccoli segmenti retti. Questo accade spesso quando si lavora con i file di altri programmi. Questa macro rende relativamente facile riconvertire questi archi discretizzati in archi di cerchio. L'operazione riduce la dimensione del file e lo rende più gestibile.

Per utilizzare questa macro, è necessario degradare il contorno e scomporlo in singoli segmenti con la funzione Draft Downgrade.png Draft Downgrade. Dopo basta selezionare i segmenti che si desidera sostituire con un arco di cerchio ed eseguire la macro. Servono almeno due segmenti.

La macro controlla se tutti i segmenti si trovano su un cerchio comune e in questo caso crea l'arco e rimuove i segmenti, altrimenti si interrompe.

A causa di piccole imprecisioni nei calcoli, la funzione Draft Upgrade.png Draft Upgrade può talvolta non riuscire a ricombinare gli altri bordi e gli archi in un unico contorno. In questo caso la Macro_SuperWire fornisce un modo più efficace per fare questo.


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) 
Online version: "http://www.freecadweb.org/wiki/index.php?title=Macro_EdgesToArc/it&oldid=240414"

Navigation menu