Il faut utiliser l'outil Draft Array en mode polaire (je fusille celui qui fait un jeu de mot entre "canicule" et "polaire"... )
Gestion d'une fenetre et des variables destinées au dessin
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Be nice to others! Read the FreeCAD code of conduct!
Re: Gestion d'une fenetre et des variables destinées au dessin
Re: Gestion d'une fenetre et des variables destinées au dessin
openBrain en suivant tes conseils j'ai refait les boites de dialogues, voici le code
Je verrais par la suite comment tout connecter avec le code
Code: Select all
# -*- coding: utf-8 -*-
# Create by flachyjoe
from PySide import QtCore, QtGui
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
###
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(400, 420)
self.centralWidget = QtGui.QWidget(MainWindow)
self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
###
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
###
self.checkBox = QtGui.QCheckBox(self.centralWidget)
self.checkBox.setGeometry(QtCore.QRect(30,25, 270, 30)) #
self.checkBox.setChecked(True)
self.checkBox.setObjectName(_fromUtf8("checkBoxON"))
self.checkBox.clicked.connect(self.on_checkBox_clicked) #connection checkBox
self.checkBox.setFont(font)
###
self.comboBox = QtGui.QComboBox(self.centralWidget) # Affichage ComboBox
self.comboBox.setGeometry(QtCore.QRect(30, 75, 81, 30))
self.comboBox.addItems(["GT2", "GT3", "GT5"])
self.comboBox.setFont(font)
###
self.lineEdit0 = QtGui.QLineEdit(self.centralWidget)
self.lineEdit0.setGeometry(QtCore.QRect(30, 150,100, 30))
self.lineEdit0.setObjectName(_fromUtf8("lineEdit"))
self.lineEdit0.returnPressed.connect(self.on_lineEdit_clicked) #connection lineEdit
self.lineEdit0.setFont(font)
###
self.label0 = QtGui.QLabel(self.centralWidget)
self.label0.setGeometry(QtCore.QRect(160, 150,100, 30))
self.label0.setObjectName(_fromUtf8("Nombre de dents"))
self.label0.setFont(font)
###
self.lineEdit1 = QtGui.QLineEdit(self.centralWidget)
self.lineEdit1.setGeometry(QtCore.QRect(30, 220, 100, 30))
self.lineEdit1.setObjectName(_fromUtf8("lineEdit"))
self.lineEdit1.returnPressed.connect(self.on_lineEdit_clicked) #connection lineEdit
self.lineEdit1.setFont(font)
###
self.label1 = QtGui.QLabel(self.centralWidget)
self.label1.setGeometry(QtCore.QRect(160, 220, 100, 30))
self.label1.setObjectName(_fromUtf8("label1"))
self.label1.setFont(font)
###
self.progressBar = QtGui.QProgressBar(self.centralWidget)
self.progressBar.setGeometry(QtCore.QRect(30,290, 370, 30))
self.progressBar.setFont(font)
###
self.pushButton0 = QtGui.QPushButton(self.centralWidget)
self.pushButton0.setGeometry(QtCore.QRect(30, 350, 93, 38))
self.pushButton0.setObjectName(_fromUtf8("pushButton"))
self.pushButton0.setFont(font)
self.pushButton0.clicked.connect(self.on_pushButton0_clicked) #connection pushButton
###
self.pushButton1 = QtGui.QPushButton(self.centralWidget)
self.pushButton1.setGeometry(QtCore.QRect(150, 350, 93,38))
self.pushButton1.setObjectName(_fromUtf8("pushButton"))
self.pushButton1.setFont(font)
self.pushButton1.clicked.connect(self.on_pushButton1_clicked) #connection pushButton
###
self.pushButton2 = QtGui.QPushButton(self.centralWidget)
self.pushButton2.setGeometry(QtCore.QRect(270, 350, 93, 38))
self.pushButton2.setObjectName(_fromUtf8("pushButton"))
self.pushButton2.setFont(font)
self.pushButton2.clicked.connect(self.on_pushButton2_clicked) #connection pushButton
###
MainWindow.setCentralWidget(self.centralWidget)
self.retranslateUi(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "Pignons - GT2 - GT3 - T5", None))
self.pushButton0.setText(_translate("MainWindow", "Quitter", None))
self.pushButton1.setText(_translate("MainWindow", "Modéliser", None))
self.pushButton2.setText(_translate("MainWindow", "Continuer", None))
self.lineEdit0.setText(_translate("MainWindow", "10", None))
self.lineEdit1.setText(_translate("MainWindow", "8", None))
self.label0.setText(_translate("MainWindow", "Nb dents", None))
self.label1.setText(_translate("MainWindow", "Largeur pignon", None))
self.checkBox.setText(_translate("MainWindow", "Body", None))
def on_checkBox_clicked(self):
if self.checkBox.checkState()==0:
App.Console.PrintMessage(str(self.checkBox.checkState())+" CheckBox OK\r\n")
else:
App.Console.PrintMessage(str(self.checkBox.checkState())+" CheckBox OK\r\n")
App.Console.PrintMessage(str(self.lineEdit0.displayText())+" LineEdit\r\n")
self.progressBar.setValue(70)
def on_lineEdit_clicked(self):
App.Console.PrintMessage(str(self.lineEdit.displayText())+" LineEdit Display\r\n")
def on_pushButton0_clicked(self):
App.Console.PrintMessage("Terminé\r\n")
self.window.hide()
def on_pushButton1_clicked(self):
App.Console.PrintMessage("Modéliser\r\n")
def on_pushButton2_clicked(self):
App.Console.PrintMessage("Modéliser et continuer\r\n")
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow(MainWindow)
MainWindow.show()
Re: Gestion d'une fenetre et des variables destinées au dessin
Bonjour
ici petit code pour mettre la fenêtre en avant
(à placer après " MainWindow.setWindowTitle("xxx")")
et ici un petit code pour positionner votre objet (dans la macro crée un cylindre) au centre de la face sélectionnée
mario
je me demande si ce n'est pas à cause que les objets sont dans la même body (seul le body a un placement)
ici petit code pour mettre la fenêtre en avant
(à placer après " MainWindow.setWindowTitle("xxx")")
Code: Select all
MainWindow.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # PySide cette fonction met la fenetre en avant
# MainWindow.setWindowFlags(PySide2.QtCore.Qt.WindowStaysOnTopHint) # PySide2 cette fonction met la fenetre en avant
Code: Select all
#23/07/2019
#mario52
import Draft, Part
selectedEdge = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0] # select one element
pl = FreeCAD.Placement()
if hasattr(selectedEdge,'Surface'):
########## section recherche la direction de la face
coorCenterFace = selectedEdge.CenterOfMass
uv = selectedEdge.Surface.parameter(coorCenterFace)
nv = selectedEdge.normalAt(uv[0], uv[1])
direction = coorCenterFace.sub(nv + coorCenterFace) #direction = FreeCAD.Vector(0,0,0) to FreeCAD.Vector(x,y,z)
r = App.Rotation(App.Vector(0,0,-1), direction) #pour inverser la direction modifier "-1" par "1"
pl.Rotation.Q = r.Q #Placement Rotation Q = FreeCAD.Rotation(FreeCAD.Vector(x,y,z),angle)
pl.Base = FreeCAD.Vector(coorCenterFace) #Placement Base = FreeCAD.Vector(x,y,z)
# cree un point au centre de la face selectionnee
Draft.makePoint(coorCenterFace)
#creation du cylindre dans la direction et position de la face avec "pl"
#donner le placement "pl" a votre roue dentee
roueDentee = App.ActiveDocument.addObject("Part::Cylinder","roueDentee")
roueDentee.Label = "roueDentee"
####
roueDentee.Placement = pl #donne le placement de la roue avec "pl" calcule plus haut
####
App.ActiveDocument.recompute()
else:
print("Selectionner une face")
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
My macros on Gist.github here complete macros Wiki and forum.
- papyblaise
- Veteran
- Posts: 7864
- Joined: Thu Jun 13, 2019 4:28 pm
- Location: France
Re: Gestion d'une fenetre et des variables destinées au dessin
Panje fusille celui qui fait un jeu de mot entre "canicule" et "polaire"... )
Re: Gestion d'une fenetre et des variables destinées au dessin
Merci mario52
C'est cette ligne qui place la fenetre au premier plan, je vais regarder pour mettre un teste en fonction de la version PySide installée.
J'ai testé ton code qui permet de placer des cylindre sur la face d'un cylindre existant, si j'ai bien compris on place un point qui a récupére la hauteur et le centre de la face sur laquelle on va redessiner le nouveau cylindre
C'est cette ligne qui place la fenetre au premier plan, je vais regarder pour mettre un teste en fonction de la version PySide installée.
Code: Select all
MainWindow.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # PySide cette fonction met la fenetre en avant
Re: Gestion d'une fenetre et des variables destinées au dessin
voici le teste de la version PySide présente
J'ai ajouté cette ligne pour paramétrer le rayon du cylindre
Je vais regarder à partir de ton code comment dessiner une dent
Code: Select all
MainWindow.setWindowTitle(_translate("MainWindow", "Pignons - GT2 - GT3 - T5", None))
try:
MainWindow.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # PySide cette fonction met la fenetre en avant
except AttributeError:
MainWindow.setWindowFlags(PySide2.QtCore.Qt.WindowStaysOnTopHint) # PySide2 cette fonction met la fenetre en avant
J'ai ajouté cette ligne pour paramétrer le rayon du cylindre
Code: Select all
roueDentee.Placement = pl #donne le placement de la roue avec "pl" calcule plus haut
####
FreeCAD.getDocument("Sans_nom").getObject("roueDentee").Radius = '40 mm' # rayon du cylindre
App.ActiveDocument.recompute()
Re: Gestion d'une fenetre et des variables destinées au dessin
A partir des conseils d'openBrain, j'ai modifié la boite de dialogue, là je regarde comment exploiter le code posté par mario52.
Je cherche à faire des sous programmes, mais j'ai une erreur de passage des paramétres.
La partie de code qui génére l'erreur
le texte de l'erreur
Je cherche à faire des sous programmes, mais j'ai une erreur de passage des paramétres.
La partie de code qui génére l'erreur
Code: Select all
# -*- coding: utf-8 -*-
#Gestion fenetre
# Create by flachyjoe
###
import Draft, Part
import sys
import math
import sys
import PartDesignGui
import FreeCAD, FreeCADGui
import Sketcher, PartDesign
import ProfileLib.RegularPolygon
from FreeCAD import Base
from PySide import QtCore, QtGui
###
__DBG__ = False #True #Mettre à False pour supprimer la sortie de debug
def pdbg(text):
###
if __DBG__: #Si on est en mode debug
App.Console.PrintMessage(text)
###
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)
###
def proceed(self):
###
Type =self.comboBox.currentText() # on récupére le type de poulie
self.progressBar.setValue(5)
# Données nécessaires au dessin poulie GT2
if 'GT2' == Type:
pdbg('Type = ' + str(Type)+"\n")
nombre_de_dents = float(self.lineEdit0.text())
pdbg('Nb dents = ' + str(nombre_de_dents)+"\n")
pas = 2
pdbg('Pas = ' + str(pas)+"\n")
PLD = 0.254
pdbg('PLD = ' + str(PLD)+"\n")
h = 0.75
pdbg('h = ' + str(h)+"\n")
circonference = nombre_de_dents * pas
pdbg('circonference = ' + str(circonference)+"\n")
diametre_primitif = circonference / math.pi
pdbg('diametre_primitif = ' + str(diametre_primitif)+"\n")
diametre_poulie = diametre_primitif - (PLD * 2)
pdbg('diametre_poulie = ' + str(diametre_poulie)+"\n")
rayon_poulie = diametre_poulie / 2
pdbg('rayon_poulie = ' + str(rayon_poulie)+"\n")
largeur_poulie = float(self.lineEdit1.text())
pdbg('largeur_poulie = ' + str(largeur_poulie)+"\n")
R1 = 0.15
pdbg('rayon_R1 = ' + str(R1)+"\n")
R2 = 1
pdbg('rayon_R2 = ' + str(R2)+"\n")
R3 = 0.555
pdbg('rayon_R3 = ' + str(R3)+"\n")
b = 0.4
b2 = b*2
###
# ici on insére le teste de présence nouveau fichier part body sketch
myDoc = App.ActiveDocument
if myDoc == None: #il n'y a pas de Document on le crée
myDoc = App.newDocument("Pignon" + Type)
###
objs = [obj for obj in myDoc.Objects if str(obj) == "<Part object>"]
if len(objs) == 0: #Il n'y a pas de Part on le crée
myPart = myDoc.addObject('App::Part','Part')
myPart.Label = "Pièce"
MonCylindre(self)# [color=#FF0000]<------------------on va executer un sous programme[/color]
# myDoc.addObject("Part::Cylinder","Cylinder")
# myDoc.ActiveObject.Label = "Cylindre"
# print("R =" + str(rayon_poulie))
# myDoc.getObject("Cylinder").Radius = rayon_poulie
# myDoc.getObject("Cylinder").Height = '8 mm'
else: #Il y a (au moins) un Part dans le document
myPart = objs[0] #On utilise par ex. le premier Part dans la suite
pass # Par ex. on ne fait rien :
###
def MonCylindre(self):# [color=#FF0000]<------------------sous programme qui provoque une erreur[/color]
myDoc.addObject("Part::Cylinder","Cylinder")
myDoc.ActiveObject.Label = "Cylindre"
# print("R =" + str(rayon_poulie))
myDoc.getObject("Cylinder").Radius = rayon_poulie
myDoc.getObject("Cylinder").Height = '8 mm'
###
myDoc est défini dans le programme appelant, c'est donc un passage de paramétres qui ne se fait pas ou se fait mal, je ne sais pas comment le résoudre.File "C:/Users/B/AppData/Roaming/FreeCAD/Macro/DialogPoulie-V1.FCMacro", line 139, in MonCylindre
myDoc.addObject("Part::Cylinder","Cylinder")
NameError: name 'myDoc' is not defined
Re: Gestion d'une fenetre et des variables destinées au dessin
J'ai trouvé je ne passais pas les paramètres
Code: Select all
MonCylindre(self,myDoc,rayon_poulie)
et
def MonCylindre(self,myDoc,rayon_poulie):
Re: Gestion d'une fenetre et des variables destinées au dessin
Tu peux enlever le paramètre "self" de tes fonctions. Il n'a d'intérêt que lorsque tes fonctions sont dans une classe. Ce qui, sauf erreur, n'est pas le cas ici.