Macro EdgesToArc/fr: Difference between revisions

From FreeCAD Documentation
No edit summary
No edit summary
 
Line 19: Line 19:
La macro va vérifier si les segments se situent tous sur un cercle commun (segments contigus) et s'arrêtera si ce n'est pas le cas. Sinon, un arc sera créé et les segments enlevés.
La macro va vérifier si les segments se situent tous sur un cercle commun (segments contigus) et s'arrêtera si ce n'est pas le cas. Sinon, un arc sera créé et les segments enlevés.


En raison de petites erreurs dans les calculs, de la fonction {{KEY|[[Image:Draft_Upgrade.svg|16px]] [[Draft Upgrade/fr|Draft Upgrade]]}} la macro peut parfois ne pas de reconstituer toutes les arêtes et arcs. Dans ce cas, la macro [[Macro_SuperWire/fr|Macro_SuperWire]] offre un moyen plus robuste pour le faire.
<div class="mw-translate-fuzzy">
En raison de petites erreurs dans les calculs, de la fonction {{KEY|[[Image:Draft Upgrade.png|16px]] [[Draft Upgrade/fr|Draft Upgrade]]}} la macro peut parfois ne pas de reconstituer toutes les arêtes et arcs. Dans ce cas, la macro [[Macro_SuperWire/fr|Macro_SuperWire]] offre un moyen plus robuste pour le faire.
</div>


==Script==
==Script==

Latest revision as of 13:31, 23 May 2020

Other languages:

EdgesToArc

Description
Transforme les arêtes sélectionnées si possible en un Arc circulaire. Utile pour restaurer des arcs discrétisés.

Version macro : 1.0
Date dernière modification : 2014-01-02
Version FreeCAD : Toutes versions
Téléchargement : Icône pour votre barre d'outils
Auteur: Jreinhardt
Auteur
Jreinhardt
Téléchargement
Icône pour votre barre d'outils
Liens
Version Macro
1.0
Dernière modification
2014-01-02
Version(s) FreeCAD
Toutes versions
Raccourci clavier
None
Voir aussi
Macro SuperWire

Description

Parfois, on rencontre des fils qui contiennent des arcs composés de petits segments de droites. Cela se produit souvent lorsque vous travaillez avec des fichiers provenant d'autres programmes. Cette macro permet de reconvertir relativement facilement ces arcs "discrétisés" en arcs circulaires. Cela réduit la taille du fichier et rend sa gestion plus facile.

Pour utiliser cette macro, vous devez briser le fil en bords individuels à l'aide de la fonction Draft Downgrade. Ensuite il suffit de sélectionner les segments que vous voulez convertir en arc circulaire et exécuter la macro. Vous avez besoin d'au moins deux segments pour exécuter la fonction.

La macro va vérifier si les segments se situent tous sur un cercle commun (segments contigus) et s'arrêtera si ce n'est pas le cas. Sinon, un arc sera créé et les segments enlevés.

En raison de petites erreurs dans les calculs, de la fonction Draft Upgrade la macro peut parfois ne pas de reconstituer toutes les arêtes et arcs. Dans ce cas, la macro Macro_SuperWire offre un moyen plus robuste pour le faire.

Script

ToolBar Icon

Macro_EdgesToArc.FCMacro

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)