Gestion d'une fenetre et des variables destinées au dessin

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Gestion d'une fenetre et des variables destinées au dessin

Post by blonblon »

Je poursuit mon programme, voici comment je procède pour gérer les menus de la fenétre de dialogue et les variables du programme.

Code: Select all

#-*- coding: utf-8 -*-
#
# Dessin pignon GT2
#

import Draft, Part
import sys
import math
import Part
import sys
import FreeCAD, FreeCADGui
import Sketcher, PartDesign
import ProfileLib.RegularPolygon
from FreeCAD import Base
from PySide import QtCore, QtGui

def proceed():

# Données nécessaires au dessin
 Type = t0.currentText()
# App.Console.PrintMessage('Type = ' + str(Type)+"\n")
 nombre_de_dents = float(s1.text())
# App.Console.PrintMessage('nb dents = ' + str(nombre_de_dents)+"\n")
 pas = 2
# App.Console.PrintMessage('Pas = ' + str(pas)+"\n")
 PLD = 0.255
# App.Console.PrintMessage('PLD = ' + str(PLD)+"\n")
 h = 0.75
# App.Console.PrintMessage('h = ' + str(h)+"\n")
 circonference = nombre_de_dents * pas
# App.Console.PrintMessage('circonference = ' + str(circonference)+"\n")
 diametre_primitif = circonference / math.pi
# App.Console.PrintMessage('diametre_primitif = ' + str(diametre_primitif)+"\n")
 diametre_poulie = diametre_primitif - (PLD * 2)
# App.Console.PrintMessage('diametre_poulie = ' + str(diametre_poulie)+"\n")
 rayon_poulie = diametre_poulie / 2
# App.Console.PrintMessage('rayon_poulie = ' + str(rayon_poulie)+"\n")
 largeur_poulie = float(s2.text())
# App.Console.PrintMessage('largeur_poulie = ' + str(largeur_poulie)+"\n")
 rayon_R1 = 0.15
# App.Console.PrintMessage('rayon_R1 = ' + str(rayon_R1)+"\n")
 positionX = rayon_poulie
# App.Console.PrintMessage('positionX = ' + str(positionX)+"\n")
 rayon_R2 = 1
# App.Console.PrintMessage('rayon_R2 = ' + str(rayon_R2)+"\n")
 positionX_R2 = 0.4
# App.Console.PrintMessage('positionX_R2 = ' + str(positionX_R2)+"\n")
 rayon_R3 = 0.555
# App.Console.PrintMessage('rayon_R3 = ' + str(rayon_R3)+"\n")
 positionX_R3 = rayon_poulie - (h - rayon_R3)
# App.Console.PrintMessage('positionX_R3 = ' + str(positionX_R3)+"\n")


###
# ici on insére le teste de présence nouveau fichier part body sketch
###


###
# ici on insére le dessin
###


 close()

def close():
      dialog.hide()
      dialog.close()
      print('Terminé')


def __init__():
# Initialisation
   dialog = None
s1 = None

dialog = QtGui.QDialog()
dialog.resize(180,160) # Dimentionner la boite de dialogue
dialog.setWindowTitle("Poulie GT2") # Titre de la fenetre
la = QtGui.QVBoxLayout(dialog)

t0 = QtGui.QLabel("Type de poulie") # Affichage Label
la.addWidget(t0)

t0 = QtGui.QComboBox() # Affichage ComboBox
la.addWidget(t0)
t0.addItems(["GT2", "GT3", "GT5"])

t2 = QtGui.QLabel("Nombre de Dents") # Affichage Label
la.addWidget(t2)

s1 = QtGui.QLineEdit() # Affichage LineEdit
s1.setText("16.0")
s1.setFixedWidth(100)
la.addWidget(s1)

t3 = QtGui.QLabel("Largeur Poulie") # Affichage Label
la.addWidget(t3)

s2 = QtGui.QLineEdit() # Affichage LineEdit
s2.setText("8.0")
s2.setFixedWidth(100)
la.addWidget(s2)

# Gestion boutons OK / Cancel
okbox = QtGui.QDialogButtonBox(dialog)
okbox.setOrientation(QtCore.Qt.Horizontal)
okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
la.addWidget(okbox)
QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), proceed)
QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), close)
QtCore.QMetaObject.connectSlotsByName(dialog)
dialog.show()
dialog.exec_()
Je ne sais pas si c'est la bonne solution?
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by openBrain »

Salut blonblon,

C'est très prometteur. ;)
Quelques trucs que j'ai vu au passage.

Je te conseille de te simplifier le debug. Par exemple en mettant en en-tête :

Code: Select all

__DBG__ = True #Mettre à False pour supprimer la sortie de debug

def pdbg(text)
    if __DBG__: #Si on est en mode debug
        App.Console.PrintMessage("\n")
        App.Console.PrintMessage(text)
Et ensuite tu utilises pdbg("Mon texte de debug ici") dans ton code. Comme ça si tu veux publier, tu mets juste __DBG__ à False, et les sorties de debug n'apparaissent plus. Ca évite de commenter toutes les lignes. ;)

A part ça, show() et exec_() à la fin font doublon. En fait, show() affiche le dialogue de manière non-modale, tandis que exec_() l'affiche de manière modale (c'est à dire que FreeCAD est "bloqué" tant que le dialogue est présent). Tu dois n'en garder qu'un des 2, à mon avis le exec_() vu ton but.
Pareil pour hide() et close() un peu plus haut. Garde uniquement le close().
Puis ton connectSlotsByName() ne sert à rien, tes signaux sont déjà connectés au-dessus. Cette fonction sert à faire une connexion automatique des signaux vers des slots déclarés dans les "child widgets", mais tu n'en as pas besoin ici. ;)
Enfin, la première fois que tu utilises la variable "t0", ça ne sert pour ainsi dire à rien car la variable est écrasée 2 lignes plus bas.
Donc soit tu utilises 2 variables, soit tu simplifies comme ça (possible car tu n'as pas besoin d'accéder par la suite au QLabel) :

Code: Select all

#t0 = QtGui.QLabel("Type de poulie") # Affichage Label
#la.addWidget(t0)

la.addWidget(QtGui.QLabel("Type de poulie"))
Dernier détail, sache qu'on utilise généralement des tabulations douces valant 4 espaces. Toi tu utilises 1 seul espace, ce qui est un peu juste pour bien voir les indentations. ;)
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by blonblon »

Bonsoir
Merci openBrain
J'ai modifié le code en suivant tes conseils, j'ai eut du mal avec dèbug, je ne suis pas sur de ce que j'ai écrit.

Code: Select all

#-*- coding: utf-8 -*-
#
# Dessin pignon GT2
#

import Draft, Part
import sys
import math
import Part
import sys
import FreeCAD, FreeCADGui
import Sketcher, PartDesign
import ProfileLib.RegularPolygon
from FreeCAD import Base
from PySide import QtCore, QtGui

__DBG__ = True #Mettre à False pour supprimer la sortie de debug

def proceed():

# Données nécessaires au dessin
   Type = t0.currentText()
   nombre_de_dents = float(s1.text())
   pas = 2
   PLD = 0.255
   h = 0.75
   circonference = nombre_de_dents * pas
   diametre_primitif = circonference / math.pi
   diametre_poulie = diametre_primitif - (PLD * 2)
   rayon_poulie = diametre_poulie / 2
   largeur_poulie = float(s2.text())
   rayon_R1 = 0.15
   positionX = rayon_poulie
   rayon_R2 = 1
   positionX_R2 = 0.4
   rayon_R3 = 0.555
   positionX_R3 = rayon_poulie - (h - rayon_R3)


   if __DBG__: #Si on est en mode debug
      App.Console.PrintMessage('Type = ' + str(Type)+"\n")
      App.Console.PrintMessage('nb dents = ' + str(nombre_de_dents)+"\n")
      App.Console.PrintMessage('Pas = ' + str(pas)+"\n")
      App.Console.PrintMessage('PLD = ' + str(PLD)+"\n")
      App.Console.PrintMessage('h = ' + str(h)+"\n")
      App.Console.PrintMessage('circonference = ' + str(circonference)+"\n")
      App.Console.PrintMessage('diametre_primitif = ' + str(diametre_primitif)+"\n")
      App.Console.PrintMessage('diametre_poulie = ' + str(diametre_poulie)+"\n")
      App.Console.PrintMessage('rayon_poulie = ' + str(rayon_poulie)+"\n")
      App.Console.PrintMessage('largeur_poulie = ' + str(largeur_poulie)+"\n")
      App.Console.PrintMessage('rayon_R1 = ' + str(rayon_R1)+"\n")
      App.Console.PrintMessage('positionX = ' + str(positionX)+"\n")
      App.Console.PrintMessage('rayon_R2 = ' + str(rayon_R2)+"\n")
      App.Console.PrintMessage('positionX_R2 = ' + str(positionX_R2)+"\n")
      App.Console.PrintMessage('rayon_R3 = ' + str(rayon_R3)+"\n")
      App.Console.PrintMessage('positionX_R3 = ' + str(positionX_R3)+"\n")

###
# ici on insére le teste de présence nouveau fichier part body sketch
###


###
# ici on insére le dessin
###


   close()

def close():
      dialog.close()
      print('Terminé')

def __init__():
# Initialisation
   dialog = None
s1 = None

dialog = QtGui.QDialog()
dialog.resize(180,160) # Dimentionner la boite de dialogue
dialog.setWindowTitle("Poulie GT2") # Titre de la fenetre
la = QtGui.QVBoxLayout(dialog)

la.addWidget(QtGui.QLabel("Type de poulie")) # Affichage Label

t0 = QtGui.QComboBox() # Affichage ComboBox
la.addWidget(t0)
t0.addItems(["GT2", "GT3", "GT5"])

la.addWidget(QtGui.QLabel("Nombre de Dents")) # Affichage Label)

s1 = QtGui.QLineEdit() # Affichage LineEdit
s1.setText("16.0")
s1.setFixedWidth(100)
la.addWidget(s1)

la.addWidget(QtGui.QLabel("Largeur Poulie")) # Affichage Label

s2 = QtGui.QLineEdit() # Affichage LineEdit
s2.setText("8.0")
s2.setFixedWidth(100)
la.addWidget(s2)

# Gestion boutons OK / Cancel
okbox = QtGui.QDialogButtonBox(dialog)
okbox.setOrientation(QtCore.Qt.Horizontal)
okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
la.addWidget(okbox)
QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), proceed)
QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), close)
dialog.exec_()
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by openBrain »

C'est pas vraiment ce que j'entendais. :lol: L'idée c'est de définir une fonction (pdbg() dans l'exemple que j'ai donné) qui affichera le texte uniquement quand __DBG__ est à True. Ensuite tu utilises la fonction où tu veux dans le code pour afficher tes lignes de debug. ;)
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by blonblon »

Je n'ai pas réussi a faire fonctionner " __DBG__ - pdbg() " autrement :oops:
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by openBrain »

Voilà ce que ça donnerait avec ton code un peu plus haut (je n'ai repris que le début) :

Code: Select all

#-*- coding: utf-8 -*-
#
# Dessin pignon GT2
#

import Draft, Part
import sys
##import Blablabla

__DBG__ = True #Mettre à False pour supprimer la sortie de debug

def pdbg(text)
    if __DBG__: #Si on est en mode debug
        App.Console.PrintMessage("\n")
        App.Console.PrintMessage(text)

def proceed():

# Données nécessaires au dessin
 Type = t0.currentText()
 pdbg('Type = ' + str(Type)+"\n")
 nombre_de_dents = float(s1.text())
 pdbg('nb dents = ' + str(nombre_de_dents)+"\n")
 pas = 2
 pdbg('Pas = ' + str(pas)+"\n")
 PLD = 0.255
 pdbg('PLD = ' + str(PLD)+"\n")
 h = 0.75
 pdbg('h = ' + str(h)+"\n")
 circonference = nombre_de_dents * pas
 pdbg('circonference = ' + str(circonference)+"\n")
 ##blablabla
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by blonblon »

J'ai réussi à comprendre comment gérer les messages à l'aide de Débug

Le code gérant la boite de dialogue et les variables que l'on va utiliser

Code: Select all

#-*- coding: utf-8 -*-
#
# Dessin pignon GT2
#

import Draft, Part
import sys
import math
import Part
import sys
import FreeCAD, FreeCADGui
import Sketcher, PartDesign
import ProfileLib.RegularPolygon
from FreeCAD import Base
from PySide import QtCore, QtGui


__DBG__ = True #Mettre à False pour supprimer la sortie de debug
def pdbg(text):
   if __DBG__: #Si on est en mode debug
      App.Console.PrintMessage(text)

def proceed():

# Données nécessaires au dessin
   Type = t0.currentText()
   pdbg('Type = ' + str(Type)+"\n")
   nombre_de_dents = float(s1.text())
   pdbg('Nb dents = ' + str(nombre_de_dents)+"\n")
   pas = 2
   pdbg('Pas = ' + str(pas)+"\n")
   PLD = 0.255
   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(s2.text())
   pdbg('largeur_poulie = ' + str(largeur_poulie)+"\n")
   rayon_R1 = 0.15
   pdbg('rayon_R1 = ' + str(rayon_R1)+"\n")
   positionX = rayon_poulie
   pdbg('positionX = ' + str(positionX)+"\n")
   rayon_R2 = 1
   pdbg('rayon_R2 = ' + str(rayon_R2)+"\n")
   positionX_R2 = 0.4
   pdbg('positionX_R2 = ' + str(positionX_R2)+"\n")
   rayon_R3 = 0.555
   pdbg('rayon_R3 = ' + str(rayon_R3)+"\n")
   positionX_R3 = rayon_poulie - (h - rayon_R3)
   pdbg('positionX_R3 = ' + str(positionX_R3)+"\n")



###
# ici on insére le teste de présence nouveau fichier part body sketch
###


###
# ici on insére le dessin
###


   close()

def close():
      dialog.close()
      print('Terminé')

def __init__():
# Initialisation
   dialog = None
s1 = None

dialog = QtGui.QDialog()
dialog.resize(180,160) # Dimentionner la boite de dialogue
dialog.setWindowTitle("Poulie GT2") # Titre de la fenetre
la = QtGui.QVBoxLayout(dialog)

la.addWidget(QtGui.QLabel("Type de poulie")) # Affichage Label

t0 = QtGui.QComboBox() # Affichage ComboBox
la.addWidget(t0)
t0.addItems(["GT2", "GT3", "GT5"])

la.addWidget(QtGui.QLabel("Nombre de Dents")) # Affichage Label)

s1 = QtGui.QLineEdit() # Affichage LineEdit
s1.setText("16.0")
s1.setFixedWidth(100)
la.addWidget(s1)

la.addWidget(QtGui.QLabel("Largeur Poulie")) # Affichage Label

s2 = QtGui.QLineEdit() # Affichage LineEdit
s2.setText("8.0")
s2.setFixedWidth(100)
la.addWidget(s2)

# Gestion boutons OK / Cancel
okbox = QtGui.QDialogButtonBox(dialog)
okbox.setOrientation(QtCore.Qt.Horizontal)
okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
la.addWidget(okbox)
QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), proceed)
QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), close)
dialog.exec_()
Je vais intégrer le code testant la présence de nouveau dossier, Part, Body, Sketch
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by openBrain »

Nickel blonblon. ;) C'est une peu bizarre ta fonction __init__()... Pas sûr à 100%, mais je ne vois pas l'intérêt si tu ne le définis pas dans une classe. A mon avis c'est superflu. ;)
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by blonblon »

Nickel blonblon. C'est une peu bizarre ta fonction __init__()... Pas sûr à 100%, mais je ne vois pas l'intérêt si tu ne le définis pas dans une classe. A mon avis c'est superflu.
Je pensais que cela servait pour la gestion de la fenetre
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by openBrain »

Non. :) En fait la fonction __init__() d'une classe est appelée automatiquement quand tu l'instancies. On appelle ça le constructeur de la classe.

Par exemple, quand tu fais :

Code: Select all

dialog = QtGui.QDialog()
Tu instancies la classe QDialog => "dialog" est une instance de (un objet de type) QDialog. Quand tu fais ça, en réalité Python va appeler le constructeur de la classe en lui passant l'instance en paramètre. C'est-à-dire que ça "équivaut" à appeler "QtGui.QDialog.__init__(dialog)".
Je pense que tu peux oublier tout ça pour l'instant si ça t'embrouille. :)
Post Reply