# Makrodefinicja: Okrąg na podstawie trzech punktów

This page is a translated version of the page Macro Draft Circle 3 Points and the translation is 10% complete.
Other languages:
Description Macro Make Circle 3 Points 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.Macro version: 01.00Last modified: 2013-03-11FreeCAD version: AllDownload: ToolBar IconAuthor: Mario52 Mario52 ToolBar Icon Macros recipesHow to install macrosHow to customize toolbars 01.00 2013-03-11 All None None

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

Circle built on 3 selected points

## Usage

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

ToolBar Icon

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)
#
from math import sqrt, pi, sin, cos

# prendre les objets sélectionnés
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.Rotation.Q=(0.0,-0.0,-0.0,1.0)
Draft.makeCircle((rayon),placement=pl,face=False,support=None)
# Affiche le résultat dans la Vue rapport de FreeCAD
else:
# Si la condition n'est pas remplie, recommencer

## Improved version

In addition to the previous features, this example is used to align an orthogonal circle on each shape in the selection, and the plan "'XY, YZ, XZ ' ' chosen.
The circle takes the color of the axis dedicated regardless of current color, and the center point of the circle is drawn (option O/N).

The settings to change.

```# Change the values here below
# mode by default vueChoix = 0 and alignerSur = 0
vueChoix=0	# choice of the top view = 1 XY, view Front = 2 ZX, Right view = 3 ZY
alignerSur=0	# Aligns the circle shaped the choice (1,2 or 3) or Z = 0
afficherPoint=1	# Displays the center point of the circle```
```# -*- 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 , 07/09/2018 replace PyQt4 to PySide
# 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)
#
from math import sqrt, pi, sin, cos
from PySide 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):
Draft.makeCircle((rayon),placement=pl,face=False,support=None)
if afficherPoint==1:
Draft.makePoint(x,y,z)
diag = QtGui.QMessageBox(QtGui.QMessageBox.Information,u"Coordinates",u"Coordinates X : "+str(x)+"\r\n"+u"Coordinates Y : "+str(y)+"\n"+u"Coordinates Z : "+str(z)+"\nRayon\t     : "+str(rayon))
diag.setWindowModality(QtCore.Qt.ApplicationModal)
diag.exec_()

# prendre les objets selectionnes
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
# Change the values here below
# mode by default vueChoix = 0 and alignerSur = 0
vueChoix=0	# choice of the top view = 1 XY, view Front = 2 ZX, Right view = 3 ZY
alignerSur=0	# Aligns the circle shaped the choice (1,2 or 3) or Z = 0
afficherPoint=1	# Displays the center point of the circle

# Affectation des variables
if vueChoix==3:		# View of right ZY (Red)
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:	# Front view ZX (Green)
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:			# Top view XY (blue)
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]

# Calculation of coordinates of the center of the circle
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"Impossible calculation too aligned elements")
else:
#finally: sera TOUJOURS exécuté
# Definition of the coordinate Z
centreZ=0
# Création du cercle
if vueChoix==1:	# Plan XY Dessus
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"Select 3 points and repeat")