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!
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 »

blonblon wrote: Wed Jul 24, 2019 7:28 am Comment faire une répétition circulaire à partir de l'outil Part.
Il faut utiliser l'outil Draft Array en mode polaire (je fusille celui qui fait un jeu de mot entre "canicule" et "polaire"... :lol: )
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 »

openBrain en suivant tes conseils j'ai refait les boites de dialogues, voici 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()
Je verrais par la suite comment tout connecter avec le code
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

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

Post by mario52 »

Bonjour
blonblon wrote: Tue Jul 23, 2019 9:23 am J'ai tente de récupérer la position d'un pignon sur l'axe Z, en fait je ne récupére que sa hauteur
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
et ici un petit code pour positionner votre objet (dans la macro crée un cylindre) au centre de la face sélectionnée

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")



mario
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.
User avatar
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

Post by papyblaise »

je fusille celui qui fait un jeu de mot entre "canicule" et "polaire"... :lol: )
Pan :lol:
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 »

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.

Code: Select all

        MainWindow.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)                # PySide cette fonction met la fenetre en avant
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
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 »

voici le teste de la version PySide présente

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()
Je vais regarder à partir de ton code comment dessiner une dent
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 »

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

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'
###
le texte de l'erreur
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
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.
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 trouvé je ne passais pas les paramètres

Code: Select all

MonCylindre(self,myDoc,rayon_poulie)
et
def MonCylindre(self,myDoc,rayon_poulie):
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 »

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. ;)
Post Reply