Macro Draft Circle 3 Points/it

= Macro Draft Circle 3 Points=

Descrizione
Questa macro crea un cerchio passante per tre punti selezionati. I punti possono anche essere oggetti quali cubi, cilindri, ecc., in questi casi sono considerate e utilizzate le coordinate del centro di queste forme.

Utilizzo
Selezionare 3 punti o forme nella vista 3D ed eseguire la macro.

Se la forma è una linea, le coordinate sono date dal punto centrale della linea.

Opzioni
Se gli oggetti selezionati sono su piani diversi, (xy Z10,xy Z2,xy Z5) il cerchio viene costruito sul piano x,y Z=0.

Se tutti gli oggetti selezionati hanno la stessa coordinata Z (xy Z5,xy Z5,xy Z5), il cerchio viene costruito sul piano della coordinata Z comune (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) creare un cerchio da tre punti selezionati nel piano X,Y
 * 3) 04/03/2013
 * 4) la formula è presa da
 * 5) http://www-obs.univ-lyon1.fr/labo/fc/Ateliers_archives/ateliers_2005-06/cercle_3pts.pdf
 * 6) leggere le note nel pdf, sull'ordine di selezione dei punti,
 * 7) oppure se la formula restituisce un errore (per esempio nel caso di tre punti allineati)

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("Selezionare 3 punti e ripetere\r\n")
 * 1) acquisire gli oggetti selezionati
 * 1) Se ci sono 3 punti selezionati, allora..
 * 1) Assegnazione delle variabili
 * 1) Calcolo delle coordinate del centro del cerchio
 * 1) Definizione della coordinata Z
 * 2) Se tutte le coordinate Z sono uguali il centro Z vale Z
 * 1) Se una delle coordinate Z è diversa dalle altre allora  Z=0
 * 1) Creazione del cerchio
 * 1) Visualizzare il risultato nel Rapporto di FreeCAD
 * 1) ... se la condizione (tre punti selezionati) non è soddisfatta, ripetere

Contributi
La genesi della macro Draft_Circle_3_Points nel forum (PYTHON) coordonnées d'un point aiutato de flachyjoe che ringrazio.

La formula è presa da cercle_3pts.pdf e utilizzata per gentile concessione dell'autore.