Macro Draft Circle 3 Points

Description
This macro creates a circle on 3 selected points. The points can be objects such as cubes, cylinder, then selected coordinates will be the centre of these forms.

Use
Select 3 points, or forms in the 3D view and run the macro.

If the shape is a line, the coordinate will be the center of the line.

Options
If the selected objects are on different planes, (xy Z10, xy Z2, xy Z5) the circle will be built on the map x,y Z=0.

If all of the selected objects have their equal Z coordinates (xy Z5, xy Z5, xy Z5), circle will be built to the plan x,y Z=5.

Script
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

Credits
The genesis of the macro Draft_Circle_3_Points on the forum (PYTHON) coordonnées d'un point helped flachyjoe thanks.

The formula comes from cercle_3pts.pdf and used with the kind permission of its author.