Makro Vytvoř kružnici ze 3 bodů
File:Macro Draft Circle 3 Points Macro_Make_Circle_3_Points |
Popis |
---|
Vytváří kružnici ze 3 vybraných bodů nebo tvarů. Autor: Mario52 |
Autor |
Mario52 |
Download |
None |
Odkazy |
Makro recepty| Jak nainstalovat makra Jak přizpůsobit panely nástrojů |
Verze |
1.0 |
Datum poslední úpravy |
None |
Verze FreeCAD |
None |
Výchozí zástupce |
None |
Viz též |
None |
Popis
Toto makro vytváří kružnici opsanou 3 vybraným bodům na kolmicích nebo ve 3D zvoleném prostoru. Body mohou být objekty jako jsou krychle, válce,..., potom souřadnicemi budou středy vybraných tvarů.
Použití
Vyberte 3 body nebo tvary ve 3D pohledu a spusťte makro.
Je-li tvarem přímka, souřadnicí bude střed přímky.
Volby
Mód :
Defaut(přednastavený) :
- Defaultní mód vytváří kružnici podle 3 bodů nebo tvarů ve 3D prostoru.
- Pořadí vybíraných bodů u tvarů ovlivňuje úhly odklonu OS a zpětně odklon kružnice. V případě potřeby se lze vrátit a změnit pořadí výběru tvarů.
- Souřadnice X, Y, Z s hodnotou 0 nebo zarovnání, které neumožňuje výpočet, může vrátit chybu dělení nulou se zprávou Tyto tři body jsou vyrovnány
Vue Face :
- Vytváří kružnici v nárysu vybraného tvaru, 1, 2 or 3
Vue Dessus :
- Vytváří kružnici v půdorysu vybraného tvaru, 1, 2 or 3
Vue Droite :
- Vytváří kružnici v bokorysu vybraného tvaru, 1, 2 or 3
Alignement sur :
Forme 1, 2, 3
- Tvary podle jejich výběru.
Afficher le centre :
- Je-li políčko zakliknuto, bude vytvořen i středový bod kružnice
Associer les couleurs
- Je-li políčko zakliknuto, kružnice přebere barvu aktuálního pohledu,
- Pohled shora (X,Y) = Modrá(osa Z)
- Pohled zepředu (Z,X) = Zelená(osa Y)
- Pohled zleva (Z,Y) = Červená(osa X)
-
Kružnice na 3 tvarech (pohled zepředu),
-
na kolmicích na vybraném tvaru (pohled zprava)
-
-
Tři nezávislé kolmé kružnice na vybraném tvaru.
Skript
Soubor by měl být zkopírován do " C:/Program Files/FreeCAD0.13/ " Chcete-li jej uložit do jiného adresáře, upravte cestu k němu na řádku 53
path = FreeCAD.ConfigGet("AppHomePath") # chemin
Tyto tři ikony musejí být ve stejném adresáři jako makro.
Stáhněte je kliknutím pravou myší na obrázek a dejte Uložit obrázek jako ...
The file Make_Circle_3_Points/fr.FCMacro:
# -*- coding: utf-8 -*-
# Cercle sur 3 points.py
# create a circle from 3 points selected
# combination of the two programs 'create a circle from 3 points selected'
# with as options (orthogonal) circle can be built on a choice plans
# to coordinate one of the three selected choice shapes
# mode by default, creates the circle in 3D space
# the options create the circle of orthogonal way on the map and view the choice
# with the creation of a central color related to the axes Y/N Y/N
# 04/03/2013 # 24/03/2013 # by mario52
# the formula adapted (with permission of its author) by "mario52" for orthogonal circles comes from
# http://www-obs.univ-lyon1.fr/labo/fc/Ateliers_archives/ateliers_2005-06/cercle_3pts.pdf
# read the note in pdf, on the order of selection points,
# If the formula returns an error (example the 3 points in the same alignment)
# the formula adapted by "galou_breizh" for the cecle in 3D space comes from
# http://en.wikipedia.org/wiki/Circumscribed_circle
# the window is always visible and allows you to work on other programs
# as for example to select other items in FreeCAD
import Draft, Part, FreeCAD, math, PartGui, FreeCADGui, PyQt4
from math import sqrt, pi, sin, cos, asin
from FreeCAD import Base
from PyQt4 import QtCore, QtGui
# vueChoix = 0 et alignerSur = 0 , mode par défaut
global vueChoix # choix de la vue Dessus=1 XY, vue Face=2 ZX, vue Droite=3 ZY (Orthogonal)
global alignerSur # aligne le cercle sur une forme au choix (1,2 ou 3) ou sur Z=0 (Orthogonal)
global afficherPoint# affiche le point central du cercle
global colorer # colorer suivant l'axe 1=Ok 0=Couleur courante uniquement Orthogonal !
vueChoix = 0
alignerSur = 0
afficherPoint = 1
colorer = 1
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def __init__(self, MainWindow):
self.window = MainWindow
path = FreeCAD.ConfigGet("AppHomePath") # chemin
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(490, 302)
MainWindow.setWindowIcon(QtGui.QIcon(path+'View-C3P.png'))
self.centralWidget = QtGui.QWidget(MainWindow)
self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
self.groupBox = QtGui.QGroupBox(self.centralWidget)
self.groupBox.setGeometry(QtCore.QRect(20, 10, 130, 161))
self.groupBox.setObjectName(_fromUtf8("groupBox_1"))
self.radioButton_1 = QtGui.QRadioButton(self.groupBox)
self.radioButton_1.setGeometry(QtCore.QRect(10, 30, 130, 20))
self.radioButton_1.setChecked(True)
self.radioButton_1.setObjectName(_fromUtf8("radioButton_1"))
self.radioButton_1.clicked.connect(self.on_radioButton_1_clicked) #connection radioButton_1
self.radioButton_1.setToolTip(_translate("MainWindow", "Cercle sur 3 points dans l'espace", None))
self.radioButton_2 = QtGui.QRadioButton(self.groupBox)
self.radioButton_2.setGeometry(QtCore.QRect(10, 60, 130, 20))
self.radioButton_2.setObjectName(_fromUtf8("radioButton_2"))
self.radioButton_2.clicked.connect(self.on_radioButton_2_clicked) #connection radioButton_2
self.radioButton_2.setToolTip(_translate("MainWindow", "Cercle orthogonal sur la vue de face", None))
#self.image_01 = "C:\Program Files\FreeCAD0.13\View-Front.png"
self.image_01 = path+"View-Front.png"
icon01 = QtGui.QIcon()
icon01.addPixmap(QtGui.QPixmap(self.image_01),QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.radioButton_2.setIcon(icon01)
self.radioButton_3 = QtGui.QRadioButton(self.groupBox)
self.radioButton_3.setGeometry(QtCore.QRect(10, 90, 130, 20))
self.radioButton_3.setObjectName(_fromUtf8("radioButton_3"))
self.radioButton_3.clicked.connect(self.on_radioButton_3_clicked) #connection radioButton_3
self.radioButton_3.setToolTip(_translate("MainWindow", "Cercle orthogonal sur la vue de dessus", None))
#self.image_02 = "C:\Program Files\FreeCAD0.13\View-Top.png"
self.image_02 = path+"View-Top.png"
icon02 = QtGui.QIcon()
icon02.addPixmap(QtGui.QPixmap(self.image_02),QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.radioButton_3.setIcon(icon02)
self.radioButton_4 = QtGui.QRadioButton(self.groupBox)
self.radioButton_4.setGeometry(QtCore.QRect(10, 120, 130, 20))
self.radioButton_4.setObjectName(_fromUtf8("radioButton_4"))
self.radioButton_4.clicked.connect(self.on_radioButton_4_clicked) #connection radioButton_4
self.radioButton_4.setToolTip(_translate("MainWindow", "Cercle orthogonal sur la vue de droite", None))
#self.image_03 = "C:\Program Files\FreeCAD0.13\View-Left.png"
self.image_03 = path+"View-Left.png"
icon03 = QtGui.QIcon()
icon03.addPixmap(QtGui.QPixmap(self.image_03),QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.radioButton_4.setIcon(icon03)
self.groupBox_2 = QtGui.QGroupBox(self.centralWidget)
self.groupBox_2.setGeometry(QtCore.QRect(170, 10, 120, 161))
self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))
self.radioButton_5 = QtGui.QRadioButton(self.groupBox_2)
self.radioButton_5.setGeometry(QtCore.QRect(10, 30, 95, 20))
self.radioButton_5.setChecked(True)
self.radioButton_5.setObjectName(_fromUtf8("radioButton_5"))
self.radioButton_5.clicked.connect(self.on_radioButton_5_clicked) #connection radioButton_5
self.radioButton_5.setToolTip(_translate("MainWindow", "Cercle sur 3 points dans l'espace", None))
self.radioButton_6 = QtGui.QRadioButton(self.groupBox_2)
self.radioButton_6.setGeometry(QtCore.QRect(10, 60, 95, 20))
self.radioButton_6.setObjectName(_fromUtf8("radioButton_6"))
self.radioButton_6.clicked.connect(self.on_radioButton_6_clicked) #connection radioButton_6
self.radioButton_6.setToolTip(_translate("MainWindow", "Cercle orthogonal sur la forme 1", None))
self.radioButton_7 = QtGui.QRadioButton(self.groupBox_2)
self.radioButton_7.setGeometry(QtCore.QRect(10, 90, 95, 20))
self.radioButton_7.setObjectName(_fromUtf8("radioButton_7"))
self.radioButton_7.clicked.connect(self.on_radioButton_7_clicked) #connection radioButton_7
self.radioButton_7.setToolTip(_translate("MainWindow", "Cercle orthogonal sur la forme 2", None))
self.radioButton_8 = QtGui.QRadioButton(self.groupBox_2)
self.radioButton_8.setGeometry(QtCore.QRect(10, 120, 95, 20))
self.radioButton_8.setObjectName(_fromUtf8("radioButton_8"))
self.radioButton_8.clicked.connect(self.on_radioButton_8_clicked) #connection radioButton_8
self.radioButton_8.setToolTip(_translate("MainWindow", "Cercle orthogonal sur la forme 3", None))
self.checkBox_1 = QtGui.QCheckBox(self.centralWidget)
self.checkBox_1.setGeometry(QtCore.QRect(20, 190, 140, 20))
self.checkBox_1.setChecked(True)
self.checkBox_1.setObjectName(_fromUtf8("checkBox_1"))
self.checkBox_1.setToolTip(_translate("MainWindow", "Affiche un point sur le centre du cercle", None))
# self.checkBox_1.clicked.connect(self.on_checkBox_1_clicked) #connection checkBox_1
self.checkBox_2 = QtGui.QCheckBox(self.centralWidget)
self.checkBox_2.setGeometry(QtCore.QRect(170, 190, 150, 20))
self.checkBox_2.setChecked(True)
self.checkBox_2.setObjectName(_fromUtf8("checkBox_2"))
self.checkBox_2.setToolTip(_translate("MainWindow", "Associe la couleur du cercle à la couleur des axes X,Y,Z (Orthogonal)", None))
# self.checkBox_2.clicked.connect(self.on_checkBox_2_clicked) #connection checkBox_1
self.lineEdit_1 = QtGui.QLineEdit(self.centralWidget)
self.lineEdit_1.setGeometry(QtCore.QRect(320, 30, 151, 22))
self.lineEdit_1.setObjectName(_fromUtf8("lineEdit_1"))
self.lineEdit_1.setReadOnly(True)
self.lineEdit_2 = QtGui.QLineEdit(self.centralWidget)
self.lineEdit_2.setGeometry(QtCore.QRect(320, 80, 151, 22))
self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
self.lineEdit_2.setReadOnly(True)
self.lineEdit_3 = QtGui.QLineEdit(self.centralWidget)
self.lineEdit_3.setGeometry(QtCore.QRect(320, 130, 151, 22))
self.lineEdit_3.setObjectName(_fromUtf8("lineEdit_3"))
self.lineEdit_3.setReadOnly(True)
self.lineEdit_4 = QtGui.QLineEdit(self.centralWidget)
self.lineEdit_4.setGeometry(QtCore.QRect(320, 180, 151, 22))
self.lineEdit_4.setObjectName(_fromUtf8("lineEdit_4"))
self.lineEdit_4.setReadOnly(True)
self.lineEdit_5 = QtGui.QLineEdit(self.centralWidget)
self.lineEdit_5.setGeometry(QtCore.QRect(320, 230, 151, 22))
self.lineEdit_5.setObjectName(_fromUtf8("lineEdit_5"))
self.lineEdit_5.setReadOnly(True)
self.label_1 = QtGui.QLabel(self.centralWidget)
self.label_1.setGeometry(QtCore.QRect(320, 10, 91, 16))
self.label_1.setObjectName(_fromUtf8("label_1"))
self.label_2 = QtGui.QLabel(self.centralWidget)
self.label_2.setGeometry(QtCore.QRect(320, 60, 91, 16))
self.label_2.setObjectName(_fromUtf8("label_2"))
self.label_3 = QtGui.QLabel(self.centralWidget)
self.label_3.setGeometry(QtCore.QRect(320, 110, 91, 16))
self.label_3.setObjectName(_fromUtf8("label_3"))
self.label_4 = QtGui.QLabel(self.centralWidget)
self.label_4.setGeometry(QtCore.QRect(320, 160, 53, 16))
self.label_4.setObjectName(_fromUtf8("label_4"))
self.label_5 = QtGui.QLabel(self.centralWidget)
self.label_5.setGeometry(QtCore.QRect(320, 210, 81, 16))
self.label_5.setObjectName(_fromUtf8("label_5"))
self.pushButton_1 = QtGui.QPushButton(self.centralWidget)
self.pushButton_1.setGeometry(QtCore.QRect(20, 230, 90, 28))
self.pushButton_1.setObjectName(_fromUtf8("pushButton_1"))
self.pushButton_1.clicked.connect(self.on_pushButton_1_clicked) #connection pushButton_1
self.pushButton_1.setToolTip(_translate("MainWindow", "Quitte la fonction", None))
self.pushButton_2 = QtGui.QPushButton(self.centralWidget)
self.pushButton_2.setGeometry(QtCore.QRect(110, 230, 90, 28))
self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
self.pushButton_2.clicked.connect(self.on_pushButton_2_clicked) #connection pushButton_2
self.pushButton_2.setToolTip(_translate("MainWindow", "Applique la fonction sans quitter", None))
#self.pushButton_2.setStyleSheet("background-color: red") #cette fonction donne une couleur au bouton
#self.pushButton_2.setStyleSheet("color : #ff0000") #cette fonction donne une couleur au texte du bouton
#self.pushButton_2.setStyleSheet("color : #ff0000; background-color : #0000ff;" ) #combinaison des deux
self.pushButton_3 = QtGui.QPushButton(self.centralWidget)
self.pushButton_3.setGeometry(QtCore.QRect(200, 230, 90, 28))
self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
self.pushButton_3.clicked.connect(self.on_pushButton_3_clicked) #connection pushButton_3
self.pushButton_3.setToolTip(_translate("MainWindow", "Définit le mode par défaut (Cercle sur 3 points dans l'espace)", None))
MainWindow.setCentralWidget(self.centralWidget)
self.statusBar = QtGui.QStatusBar(MainWindow)
self.statusBar.setObjectName(_fromUtf8("statusBar"))
MainWindow.setStatusBar(self.statusBar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowFlags(PyQt4.QtCore.Qt.WindowStaysOnTopHint) # cette fonction met la fenêtre en avant
#MainWindow.setStyleSheet("background-color: red") #cette fonction donne une couleur à la fenêtre
#MainWindow.setWindowOpacity(0.5) #cette fonction donne une transparence à la fenêtre
MainWindow.setWindowTitle(_translate("MainWindow", "Cercle sur 3 points", None))
self.groupBox.setTitle(_translate("MainWindow", "Mode", None))
self.radioButton_1.setText(_translate("MainWindow", "Défaut", None))
self.radioButton_2.setText(_translate("MainWindow", "Vue Face", None))
self.radioButton_3.setText(_translate("MainWindow", "Vue Dessus", None))
self.radioButton_4.setText(_translate("MainWindow", "Vue Droite", None))
self.groupBox_2.setTitle(_translate("MainWindow", "Alignement sur", None))
self.radioButton_5.setText(_translate("MainWindow", "Défaut", None))
self.radioButton_6.setText(_translate("MainWindow", "Forme 1", None))
self.radioButton_7.setText(_translate("MainWindow", "Forme 2", None))
self.radioButton_8.setText(_translate("MainWindow", "Forme 3", None))
self.checkBox_1.setText(_translate("MainWindow", "Afficher le centre", None))
self.checkBox_2.setText(_translate("MainWindow", "Associer les couleurs", None))
self.label_1.setText(_translate("MainWindow", "Coordonnée X", None))
self.label_2.setText(_translate("MainWindow", "Coordonnée Y", None))
self.label_3.setText(_translate("MainWindow", "Coordonnée Z", None))
self.label_4.setText(_translate("MainWindow", "Rayon", None))
self.label_5.setText(_translate("MainWindow", "Angle", None))
self.pushButton_1.setText(_translate("MainWindow", "Quitter", None))
self.pushButton_2.setText(_translate("MainWindow", "Appliquer", None))
self.pushButton_3.setText(_translate("MainWindow", "Défaut", None))
# première série de radioboutons
def on_radioButton_1_clicked(self):
if self.radioButton_1.isChecked():
self.radioButton_5.setChecked(True)
def on_radioButton_2_clicked(self):
if self.radioButton_5.isChecked():
self.radioButton_6.setChecked(True)
def on_radioButton_3_clicked(self):
if self.radioButton_5.isChecked():
self.radioButton_6.setChecked(True)
def on_radioButton_4_clicked(self):
if self.radioButton_5.isChecked():
self.radioButton_6.setChecked(True)
# deuxième série de radioboutons
def on_radioButton_5_clicked(self):
if self.radioButton_5.isChecked():
self.radioButton_1.setChecked(True)
def on_radioButton_6_clicked(self):
if self.radioButton_1.isChecked():
self.radioButton_2.setChecked(True)
def on_radioButton_7_clicked(self):
if self.radioButton_1.isChecked():
self.radioButton_2.setChecked(True)
def on_radioButton_8_clicked(self):
if self.radioButton_1.isChecked():
self.radioButton_2.setChecked(True)
# Boutons
def on_pushButton_1_clicked(self): # Bouton Quitte la fonction
App.Console.PrintMessage("Terminé\r\n")
self.window.hide()
def on_pushButton_2_clicked(self): # Bouton Appliquer
if self.radioButton_1.isChecked():
vueChoix=0
if self.radioButton_2.isChecked():
vueChoix=1
if self.radioButton_3.isChecked():
vueChoix=2
if self.radioButton_4.isChecked():
vueChoix=3
if self.radioButton_5.isChecked():
alignerSur=0
if self.radioButton_6.isChecked():
alignerSur=1
if self.radioButton_7.isChecked():
alignerSur=2
if self.radioButton_8.isChecked():
alignerSur=3
if self.checkBox_1.checkState()==0:
afficherPoint=0
else:
afficherPoint=1
if self.checkBox_2.checkState()==0:
colorer=0
else:
colorer=1
# App.Console.PrintMessage("Appliquer\r\n")
# App.Console.PrintMessage(str(vueChoix)+" \t")
# App.Console.PrintMessage(str(alignerSur)+" \t")
# App.Console.PrintMessage(str(afficherPoint)+" \t")
# App.Console.PrintMessage(str(colorer)+" \r\n")
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.setWindowFlags(PyQt4.QtCore.Qt.WindowStaysOnTopHint) # cette fonction met la fenêtre en avant
#diag.setWindowModality(QtCore.Qt.ApplicationModal) # la fonction a été désactivée pour favoriser "WindowStaysOnTopHint"
diag.exec_()
def affiche(x,y,z,rayon,r,v,b,afficherPoint,angle):
pl.Base=FreeCAD.Vector(x,y,z)
Draft.makeCircle((rayon),placement=pl,face=False,support=None)
if colorer==1:
FreeCADGui.activeDocument().activeObject().LineColor = (r,v,b)
if afficherPoint==1:
Draft.makePoint(x,y,z)
if colorer==1:
FreeCADGui.activeDocument().activeObject().PointColor = (r,v,b)
str(self.lineEdit_1.setText(str(x)))
str(self.lineEdit_2.setText(str(y)))
str(self.lineEdit_3.setText(str(z)))
str(self.lineEdit_4.setText(str(rayon)))
str(self.lineEdit_5.setText(str(angle)))
# 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
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: # si finally est présent, il 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
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,0)
elif alignerSur==2:
affiche(centreX,centreY,z_point_2,rayon,0.0,0.0,1.0,afficherPoint,0)
elif alignerSur==3:
affiche(centreX,centreY,z_point_3,rayon,0.0,0.0,1.0,afficherPoint,0)
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,0)
elif alignerSur==2:
affiche(centreY,z_point_2,centreX,rayon,0.0,1.0,0.0,afficherPoint,0)
elif alignerSur==3:
affiche(centreY,z_point_3,centreX,rayon,0.0,1.0,0.0,afficherPoint,0)
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,0)
elif alignerSur==2:
affiche(z_point_2,centreX,centreY,rayon,1.0,0.0,0.0,afficherPoint,0)
elif alignerSur==3:
affiche(z_point_3,centreX,centreY,rayon,1.0,0.0,0.0,afficherPoint,0)
else: # 3D XYZ
P1 = sel[0].Shape.BoundBox.Center
P2 = sel[1].Shape.BoundBox.Center
P3 = sel[2].Shape.BoundBox.Center
P1P2 = (P2 - P1).Length
P2P3 = (P3 - P2).Length
P3P1 = (P1 - P3).Length
# Circle radius.
l = ((P1 - P2).cross(P2 - P3)).Length
try:
#if l < 1e-8:
# errorDialog("The three points are aligned")
r = P1P2 * P2P3 * P3P1 / 2 / l
except:
errorDialog("The three points are aligned")
else:
# Sphere center.
a = P2P3**2 * (P1 - P2).dot(P1 - P3) / 2 / l**2
b = P3P1**2 * (P2 - P1).dot(P2 - P3) / 2 / l**2
c = P1P2**2 * (P3 - P1).dot(P3 - P2) / 2 / l**2
P1.multiply(a)
P2.multiply(b)
P3.multiply(c)
PC = P1 + P2 + P3
# Creation of a circle
pl = Base.Placement()
v = (P1 - P2).cross(P3 - P2)
v.normalize()
axis = Base.Vector(0, 0, 1).cross(v)
angle = asin(axis.Length) * 180 / pi
axis.normalize()
pl = Base.Placement(PC, axis, angle)
affiche((PC.x),(PC.y),(PC.z),r,0.0,0.0,0.0,afficherPoint,angle)
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")
#________________________________________________________________________________
def on_pushButton_3_clicked(self): # Valeurs d'origine
App.Console.PrintMessage("Défaut\r\n")
vueChoix=0 # choix de la vue Dessus=1 XY, vue Face=2 ZX, vue Droite=3 ZY
self.radioButton_1.setChecked(True)
alignerSur=0 # aligne le cercle sur une forme au choix (1,2 ou 3) ou sur Z=0
self.radioButton_5.setChecked(True)
afficherPoint=1 # affiche le point central du cercle
self.checkBox_1.setChecked(True)
colorer=1 # colorer suivant l'axe 1=Ok 0=Couleur courante uniquement Orthogonal !
self.checkBox_2.setChecked(True)
#______________________________________________________________________________________
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow(MainWindow)
MainWindow.show()
Anaglyphe (3D zobrazení)
Zde je 3D zobrazení, které umožňuje vidět 2 různé pozice pohledu použitím brýlí s filtry pro červenou a cyan barvu .
Podívejte se střídavě pravým a levým okem abyste viděli pohledy samostatně.
Crédits
The genesis of the macro Draft_Circle_3_Points sur le 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.
The formula adapted by " galou_breizh " circle in 3D space comes from
Circumscribed_circle
Separate programs are located here,
Macro Draft Circle 3 Points
Macro Draft Circle 3 Points 3D