Macro Draft Circle 3 Points/fr

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

import Draft, Part, FreeCAD, math, PartGui, FreeCADGui from math import sqrt, pi, sin, cos from FreeCAD import Base
 * 1) -*- coding: utf-8 -*-
 * 2) créer un cercle à partir de 3 points sélectionnés sur le plan X,Y
 * 3) 04/03/2013
 * 4) la formule provient de
 * 5) http://www-obs.univ-lyon1.fr/labo/fc/Ateliers_archives/ateliers_2005-06/cercle_3pts.pdf
 * 6) lire la note dans le pdf, sur l'ordre de sélection des points,
 * 7) si la formule renvoie une erreur (exemple les 3 points dans le même alignement)

sel = FreeCADGui.Selection.getSelection i=0 centreX=0 centreY=0 rayon=0 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 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] 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) if z_point_1==z_point_2 and z_point_2==z_point_3: centreZ=z_point_1 else: centreZ=0 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) 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: FreeCAD.Console.PrintError("Sélectionnez 3 points et recommencez\r\n")
 * 1) prendre les objets sélectionnés
 * 1) S'il y a 3 points sélectionnés alors..
 * 1) Affectation des variables
 * 1) Calcul des coordonnées du centre du cercle
 * 1) Définition de la coordonnée Z
 * 2) Si toutes les coordonnées Z sont égales le centreZ s'aligne à la coordonnée Z
 * 1) Si une coordonnée est différente alors Z=0
 * 1) Création du cercle
 * 1) Affiche le résultat dans la Vue rapport de FreeCAD
 * 1) Si la condition n'est pas remplie, recommencer

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).

Les paramètres à modifier dans le corps du programme.

# 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
 * 1) Modifier les valeurs ci dessous

Script 2
import Draft, Part, FreeCAD, math, PartGui, FreeCADGui from math import sqrt, pi, sin, cos from FreeCAD import Base from PyQt4 import QtCore, QtGui
 * 1) -*- coding: utf-8 -*-
 * 2) créer un cercle à partir de 3 points séléctionnés
 * 3) avec comme options le cercle peut être construit sur un plans au choix
 * 4) à la coordonnée d'une des trois formes sélectionnées au choix
 * 5) et création du point central O/N
 * 6) 04/03/2013
 * 7) la formule provient de
 * 8) http://www-obs.univ-lyon1.fr/labo/fc/Ateliers_archives/ateliers_2005-06/cercle_3pts.pdf
 * 9) lire la note dans le pdf, sur l'ordre de sélection des points,
 * 10) si la formule renvoie une erreur (exemple les 3 points dans le même alignement)

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_

sel = FreeCADGui.Selection.getSelection i=0 centreX=0;centreY=0;rayon=0
 * 1) prendre les objets selectionnes

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 # 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
 * 1) S'il y a 3 points sélectionnés alors..
 * 1) Modifier les valeurs ci dessous

# 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.