Macro Draft Circle 3 Points
File:Macro Draft Circle 3 Points Macro_Draft_Circle_3_Points |
Description |
---|
Crée un cercle à partir de 3 points sélectionnés. Auteur: Mario52 |
Auteur |
Mario52 |
Téléchargement |
None |
Liens |
Page des macros Comment installer une macro Comment créer une barre d'outils |
Version Macro |
1.0 |
Dernière modification |
None |
Version(s) FreeCAD |
None |
Raccourci clavier |
None |
Voir aussi |
None |
Description
Cette macro crée un cercle circonscrit orthogonal sur 3 points sélectionnés. Les points peuvent être des objets comme des cubes, cylindres, . . . les coordonnées alors retenues seront le centre de ces formes.
Utilisation
Sélectionnez 3 points, ou formes dans la vue 3D et exécutez la macro.
Si la forme est une ligne, la coordonnée sera le centre de la ligne.
Options
Si les objets sélectionnés sont sur des plans différents, (xy Z10,xy Z2,xy Z5) le cercle sera construit sur le plan x,y Z=0.
Si tous les objets sélectionnés ont leurs coordonnées Z égales (xy Z5,xy Z5,xy Z5) , le cercle sera construit au plan x,y Z=5.
Script 1
Draft_Circle_3_Points.FCMacro
# -*- coding: utf-8 -*-
# créer un cercle à partir de 3 points sélectionnés sur le plan X,Y
# 04/03/2013
# la formule provient de
# http://www-obs.univ-lyon1.fr/labo/fc/Ateliers_archives/ateliers_2005-06/cercle_3pts.pdf
# lire la note dans le pdf, sur l'ordre de sélection des points,
# si la formule renvoie une erreur (exemple les 3 points dans le même alignement)
#
import Draft, Part, FreeCAD, math, PartGui, FreeCADGui
from math import sqrt, pi, sin, cos
from FreeCAD import Base
# prendre les objets sélectionnés
sel = FreeCADGui.Selection.getSelection()
i=0
centreX=0
centreY=0
rayon=0
# S'il y a 3 points sélectionnés alors..
if len(sel)==3 :
i=0
ta=[0,0,0,0,0,0,0,0,0]
for obj in sel:
x=(obj.Shape.BoundBox.Center)
ta[i+0]=(x.x)
ta[i+1]=(x.y)
ta[i+2]=(x.z)
i=i+3
# Affectation des variables
x_point_1=ta[0]
y_point_1=ta[1]
z_point_1=ta[2]
x_point_2=ta[3]
y_point_2=ta[4]
z_point_2=ta[5]
x_point_3=ta[6]
y_point_3=ta[7]
z_point_3=ta[8]
# Calcul des coordonnées du centre du cercle
centreX =((x_point_3**2-x_point_2**2+y_point_3**2-y_point_2**2)/(2*(y_point_3-y_point_2))-(x_point_2**2-x_point_1**2+y_point_2**2-y_point_1**2)/(2*(y_point_2-y_point_1)))/((x_point_3-x_point_2)/(y_point_3-y_point_2)-(x_point_2-x_point_1)/(y_point_2-y_point_1))
centreY =-(x_point_2-x_point_1)/(y_point_2-y_point_1)*centreX+(x_point_2**2-x_point_1**2+y_point_2**2-y_point_1**2)/(2*(y_point_2-y_point_1))
rayon =sqrt((x_point_1-centreX)**2+(y_point_1-centreY)**2)
# Définition de la coordonnée Z
# Si toutes les coordonnées Z sont égales le centreZ s'aligne à la coordonnée Z
if z_point_1==z_point_2 and z_point_2==z_point_3:
centreZ=z_point_1
else:
# Si une coordonnée est différente alors Z=0
centreZ=0
# Création du cercle
pl=FreeCAD.Placement()
pl.Rotation.Q=(0.0,-0.0,-0.0,1.0)
pl.Base=FreeCAD.Vector(centreX,centreY,centreZ)
Draft.makeCircle((rayon),placement=pl,face=False,support=None)
# Affiche le résultat dans la Vue rapport de FreeCAD
FreeCAD.Console.PrintMessage("Coordonnée X : "+str(centreX)+"\r\n")
FreeCAD.Console.PrintMessage("Coordonnée Y : "+str(centreY)+"\r\n")
FreeCAD.Console.PrintMessage("Coordonnée Z : "+str(centreZ)+"\r\n")
FreeCAD.Console.PrintMessage("Rayon : "+str(rayon )+"\r\n")
else:
# Si la condition n'est pas remplie, recommencer
FreeCAD.Console.PrintError("Sélectionnez 3 points et recommencez\r\n")
Version améliorée
En plus des fonctions précédentes, cet exemple permet d'aligner un cercle orthogonal sur chaque forme au choix, et sur le plan XY, YZ, XZ choisi.
De plus le cercle prend la couleur de l'axe dédié indépendamment de la couleur en cours, et le point central du cercle est tracé (option O/N).
-
Cercle circonscrit sur 3 formes (vue de face),
-
de manière orthogonale sur la forme choisie (vue de droite)
-
-
Trois cercles orthogonaux passants par la forme choisie.
Les paramètres à modifier dans le corps du programme.
# Modifier les valeurs ci dessous
# par défaut vueChoix=0 et alignerSur=0 mode
vueChoix=0 # choix de la vue Dessus=1 XY, vue Face=2 ZX, vue Droite=3 ZY
alignerSur=0 # aligne le cercle sur une forme au choix (1,2 ou 3) ou sur Z=0
afficherPoint=1 # affiche le point central du cercle
Script 2
# -*- coding: utf-8 -*-
# créer un cercle à partir de 3 points séléctionnés
# avec comme options le cercle peut être construit sur un plans au choix
# à la coordonnée d'une des trois formes sélectionnées au choix
# et création du point central O/N
# 04/03/2013
# la formule provient de
# http://www-obs.univ-lyon1.fr/labo/fc/Ateliers_archives/ateliers_2005-06/cercle_3pts.pdf
# lire la note dans le pdf, sur l'ordre de sélection des points,
# si la formule renvoie une erreur (exemple les 3 points dans le même alignement)
#
import Draft, Part, FreeCAD, math, PartGui, FreeCADGui
from math import sqrt, pi, sin, cos
from FreeCAD import Base
from PyQt4 import QtCore, QtGui
def errorDialog(msg):
# Create a simple dialog QMessageBox
# The first argument indicates the icon used: one of QtGui.QMessageBox.{NoIcon, Information, Warning, Critical, Question}
diag = QtGui.QMessageBox(QtGui.QMessageBox.Critical,u"Error Message",msg)
diag.setWindowModality(QtCore.Qt.ApplicationModal)
diag.exec_()
def affiche(x,y,z,rayon,r,v,b,afficherPoint):
pl.Base=FreeCAD.Vector(x,y,z)
Draft.makeCircle((rayon),placement=pl,face=False,support=None)
FreeCADGui.activeDocument().activeObject().LineColor = (r,v,b)
if afficherPoint==1:
Draft.makePoint(x,y,z)
diag = QtGui.QMessageBox(QtGui.QMessageBox.Information,u"Coordonnées",u"Coordonnée X : "+str(x)+"\r\n"+u"Coordonnée Y : "+str(y)+"\n"+u"Coordonnée Z : "+str(z)+"\nRayon\t : "+str(rayon))
diag.setWindowModality(QtCore.Qt.ApplicationModal)
diag.exec_()
# prendre les objets selectionnes
sel = FreeCADGui.Selection.getSelection()
i=0
centreX=0;centreY=0;rayon=0
# S'il y a 3 points sélectionnés alors..
if len(sel)==3 :
i=0
ta=[0,0,0,0,0,0,0,0,0]
for obj in sel:
x=(obj.Shape.BoundBox.Center)
ta[i+0]=(x.x)
ta[i+1]=(x.y)
ta[i+2]=(x.z)
i=i+3
# Modifier les valeurs ci dessous
# vueChoix=0 et alignerSur=0 mode par défaut
vueChoix=0 # choix de la vue Dessus=1 XY, vue Face=2 ZX, vue Droite=3 ZY
alignerSur=0 # aligne le cercle sur une forme au choix (1,2 ou 3) ou sur Z=0
afficherPoint=1 # affiche le point central du cercle
# Affectation des variables
if vueChoix==3: # Vue de droite ZY (Rouge)
z_point_1=ta[0]
x_point_1=ta[1]
y_point_1=ta[2]
z_point_2=ta[3]
x_point_2=ta[4]
y_point_2=ta[5]
z_point_3=ta[6]
x_point_3=ta[7]
y_point_3=ta[8]
elif vueChoix==2: # Vue de face ZX (Vert)
y_point_1=ta[0]
z_point_1=ta[1]
x_point_1=ta[2]
y_point_2=ta[3]
z_point_2=ta[4]
x_point_2=ta[5]
y_point_3=ta[6]
z_point_3=ta[7]
x_point_3=ta[8]
else: # Vue de dessus XY (Bleu)
x_point_1=ta[0]
y_point_1=ta[1]
z_point_1=ta[2]
x_point_2=ta[3]
y_point_2=ta[4]
z_point_2=ta[5]
x_point_3=ta[6]
y_point_3=ta[7]
z_point_3=ta[8]
# Calcul des coordonnées du centre du cercle
try:
centreX =((x_point_3**2-x_point_2**2+y_point_3**2-y_point_2**2)/(2*(y_point_3-y_point_2))-(x_point_2**2-x_point_1**2+y_point_2**2-y_point_1**2)/(2*(y_point_2-y_point_1)))/((x_point_3-x_point_2)/(y_point_3-y_point_2)-(x_point_2-x_point_1)/(y_point_2-y_point_1))
centreY =-(x_point_2-x_point_1)/(y_point_2-y_point_1)*centreX+(x_point_2**2-x_point_1**2+y_point_2**2-y_point_1**2)/(2*(y_point_2-y_point_1))
rayon =sqrt((x_point_1-centreX)**2+(y_point_1-centreY)**2)
except:
errorDialog(u"Calcul impossible trop d'élements alignés")
else:
#finally: sera TOUJOURS exécuté
# Définition de la coordonnée Z
centreZ=0
# Création du cercle
pl=FreeCAD.Placement()
if vueChoix==1: # Plan XY Dessus affiche(x,y,z,rayon,r,v,b,afficherPoint)
pl.Rotation.Q=(0,0,0,1.0)
if alignerSur==1:
affiche(centreX,centreY,z_point_1,rayon,0.0,0.0,1.0,afficherPoint)
elif alignerSur==2:
affiche(centreX,centreY,z_point_2,rayon,0.0,0.0,1.0,afficherPoint)
elif alignerSur==3:
affiche(centreX,centreY,z_point_3,rayon,0.0,0.0,1.0,afficherPoint)
elif vueChoix==2: # Plan XZ Face
pl.Rotation.Q=(1,0,0,1.0)
if alignerSur==1:
affiche(centreY,z_point_1,centreX,rayon,0.0,1.0,0.0,afficherPoint)
elif alignerSur==2:
affiche(centreY,z_point_2,centreX,rayon,0.0,1.0,0.0,afficherPoint)
elif alignerSur==3:
affiche(centreY,z_point_3,centreX,rayon,0.0,1.0,0.0,afficherPoint)
elif vueChoix==3: # Plan YZ Droite
pl.Rotation.Q=(0,1,0,1.0)
if alignerSur==1:
affiche(z_point_1,centreX,centreY,rayon,1.0,0.0,0.0,afficherPoint)
elif alignerSur==2:
affiche(z_point_2,centreX,centreY,rayon,1.0,0.0,0.0,afficherPoint)
elif alignerSur==3:
affiche(z_point_3,centreX,centreY,rayon,1.0,0.0,0.0,afficherPoint)
else: # modifier pour avoir XYZ
# si les coordonnées Z sont égales alors le cercle s'aligne à Z
if z_point_1==z_point_2 and z_point_2==z_point_3:
centreZ=z_point_1
affiche(centreX,centreY,z_point_1,rayon,0.0,0.0,0.0,afficherPoint)
else:
# Si une coordonnée est différente alors Z=0
affiche(centreX,centreY,0,rayon,0.0,0.0,0.0,afficherPoint)
else:
# Si la condition n'est pas remplie, recommencer
errorDialog(u"Sélectionnez 3 points et recommencez")
#FreeCAD.Console.PrintError("Sélectionnez 3 points et recommencez\r\n")
Anaglyphe
Ici une vue anaglyphe qui permet de voir deux positions différentes de la vue à l'aide de lunettes munies filtres Rouge et Cyan .
Regardez alternativement avec l'œil gauche, puis l'œil droit pour voir les vues séparément.
Crédits
La genèse de la macro Draft_Circle_3_Points sur le forum (PYTHON) coordonnées d'un point aidé de flachyjoe merci.
La formule provient de cercle_3pts.pdf et utilisée avec l'aimable autorisation de son auteur.