macro pour poulie GT2

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

macro pour poulie GT2

Post by blonblon »

Bonsoir

J'arrive a modéliser et créer des fichiers stl.
Je vais avoir besoin de créer des poulies GT2 et j'ai trouvé une documentation sur le Web, je ne connais pas encore les différents diamétres.
Je pense utiliser une macro pour modéliser avec une boite de dialogue pour passer les paramétres.
J'ai des connaissances en programmation c++ builder6 et visual basic, avec Python j'ai quelques difficultés avec le code et l'éditeur.
J'ai commencé directement dans Freecad, j'ai une erreur sur close() (ligne 49) et je ne passe pas par le try, j'ai donc loupé quelque chose mais je ne vois pas ou

Code: Select all

#
# Dessin pignon GT2
#

#-*- coding: utf-8 -*-

import sys

try:

 	import PyQt4                     #  PyQt4
 	from PyQt4 import QtCore, QtGui  #  PyQt4
# 	App.Console.PrintMessage("PyQt4"+"\n")


except Exception:

 	import PySide                    #  PySide
 	from PySide import QtCore, QtGui #  PySide
# 	App.Console.PrintMessage("PySide"+"\n")
 

import FreeCAD, FreeCADGui, math
import Sketcher, PartDesign


def proceed():


	if FreeCAD.ActiveDocument == None:
		FreeCAD.newDocument("Pignon GT2")


try:
	nombre_de_dents = float(s1.text())
#	pas = 2
#	circonference = Nombre_de_dents * pas
#	diametre_primitif = circonference / math.pi
#	diametre_poulie = diametre_primitif - 0.51
#	rayon_poulie = diametre_poulie / 2

	App.Console.PrintMessage('valeur' + str(nombre_de_dents))

#	largeur_poulie = float(s2.text())
except:
	App.Console.PrintMessage('Erreur !')


close()


	def close():
		dialog.hide()


def __init__():
# Initialisation
	dialog = None
s1 = None
 
# Dimentionner la boite de dialogue
dialog = QtGui.QDialog()
dialog.resize(180,160)

# Titre de la boite
dialog.setWindowTitle("Poulie GT2")
la = QtGui.QVBoxLayout(dialog)

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

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

t2 = QtGui.QLabel("Largeur Courroie")
la.addWidget(t2)

# Affichage LineEdit
s2 = QtGui.QLineEdit()
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_()

Merci pour votre aide.

ma version de Freecad

OS: Windows 10
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.16.6704 (Git)
Build type: Release
Branch: releases/FreeCAD-0-16
Hash: 0c449d7e8f9b2b1fb93e3f8d1865e2f59d7ed253
Python version: 2.7.8
Qt version: 4.8.7
Coin version: 4.0.0a
OCC version: 6.8.0.oce-0.17
mario52
Veteran
Posts: 4692
Joined: Wed May 16, 2012 2:13 pm

Re: macro pour poulie GT2

Post by mario52 »

Bonjour

comparez :

Code: Select all

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


import sys

try:

    import PySide                     #  PyQt4
    from PyQt4 import QtCore, QtGui  #  PyQt4
#    App.Console.PrintMessage("PyQt4"+"\n")

except Exception:

    import PySide                    #  PySide
    from PySide import QtCore, QtGui #  PySide
#    App.Console.PrintMessage("PySide"+"\n")
 

import FreeCAD, FreeCADGui, math
import Sketcher, PartDesign


def proceed():
   if FreeCAD.ActiveDocument == None:
      FreeCAD.newDocument("Pignon GT2")

#   try:
   nombre_de_dents = float(s1.text())
   pas = 2
   circonference = nombre_de_dents * pas
   diametre_primitif = circonference / math.pi
   diametre_poulie = diametre_primitif - 0.51
   rayon_poulie = diametre_poulie / 2
   largeur_poulie = float(s2.text())

#### ajout ##################################
   c = App.ActiveDocument.addObject("Part::Cylinder","Cylinder")
   c.Label = "Pignon GT2"
   c.Height.Value = largeur_poulie
   c.Radius.Value = rayon_poulie
   comP     = []
   comP.append(c.Shape)

   pl=FreeCAD.Placement()
   pl.Rotation.Q=(0.0,-0.0,0.0,0.0)
   pl.Base=FreeCAD.Vector(0,0,0)
   dp = Draft.makeCircle(radius=(diametre_primitif/2),placement=pl,face=False,support=None)
   dp.Label = "diametre_primitif"
   comP.append(dp.Shape)

   ## Compound Part objet unique ##
   comp = Part.makeCompound(comP)
   Part.show(comp)

   ## Compound Part objets dans repertoire ##
   nameL  = []
   del nameL[:]
   App.activeDocument().addObject("Part::Compound","Compound")
   nameL.append(App.ActiveDocument.getObject(c.Name))
   nameL.append(App.ActiveDocument.getObject(dp.Name))
   App.activeDocument().Compound.Links = nameL

   App.activeDocument().recompute()

######################################
    
   App.Console.PrintMessage('valeur ' + str(nombre_de_dents)+"\n")
    
#   except:
#       App.Console.PrintMessage('Erreur !'+"\n")

def close():
      dialog.hide()
      print "à demain"

#close()




def __init__():
# Initialisation
   dialog = None
s1 = None
 
# Dimentionner la boite de dialogue
dialog = QtGui.QDialog()
dialog.resize(180,160)

# Titre de la boite
dialog.setWindowTitle("Poulie GT2")
la = QtGui.QVBoxLayout(dialog)

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

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

t2 = QtGui.QLabel("Largeur Courroie")
la.addWidget(t2)

# Affichage LineEdit
s2 = QtGui.QLineEdit()
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_()


personnellement j'utilise Qt ça donne des codes au km mais c'est plus facile (j'ai l'impression)

dans ma signature vous trouverez des liens intéressants avec du code exemple et ici pour Qt et PySide

bienvenue au club

EDIT: 27/09/2016 petit ajout dans le code

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
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: macro pour poulie GT2

Post by blonblon »

Merci mario52

je vais tester le code et je vous tient au courant
User avatar
flachyjoe
Veteran
Posts: 1891
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: macro pour poulie GT2

Post by flachyjoe »

Salut,
blonblon : en python l'indentation a un sens.
Ton fichier n'est pas homogène (utilisation d'espaces et de tabulations) ce n'est pas conseillé car pas facile à gérer.

Ta fonction __init__ doit-elle vraiment ne contenir que dialog = None ?

EDIT : ma version de ta macro, avec un peu de POO et des indentations qui vont bien
NB : la ligne #-*- coding: utf-8 -*- n'est valable qu'en 1ere ou 2d ligne du fichier (quand la première ligne est le hash-bang).

Code: Select all

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

import sys

try:
	import PyQt4                     #  PyQt4
	from PyQt4 import QtCore, QtGui  #  PyQt4
	#    App.Console.PrintMessage("PyQt4"+"\n")
except Exception:
	import PySide                    #  PySide
	from PySide import QtCore, QtGui #  PySide
	#    App.Console.PrintMessage("PySide"+"\n")
 
import FreeCAD, FreeCADGui, math
import Sketcher, PartDesign

class GT2dialog (QtGui.QDialog) :
	def proceed(self):
		if FreeCAD.ActiveDocument == None:
			FreeCAD.newDocument("Pignon GT2")
	
		try:
			nombre_de_dents = int(self.s1.text())
		except ValueError:
		   App.Console.PrintMessage('Erreur ! Entrez un nombre entier.')

		try:
		   largeur_poulie = float(self.s2.text())
		except ValueError:
		   App.Console.PrintMessage('Erreur ! Entrez un nombre.')

		#   pas = 2
		#   circonference = Nombre_de_dents * pas
		#   diametre_primitif = circonference / math.pi
		#   diametre_poulie = diametre_primitif - 0.51
		#   rayon_poulie = diametre_poulie / 2
		
		App.Console.PrintMessage('valeur' + str(nombre_de_dents))
		
		self.close()
	
	def close(self):
		self.hide()
	
	def __init__(self):
		# Initialisation
		super(GT2dialog, self).__init__()
		# Dimentionner la boite de dialogue
		self.resize(180,160)
		
		# Titre de la boite
		self.setWindowTitle("Poulie GT2")
		la = QtGui.QVBoxLayout(self)
		
		# Affichage Label
		t1 = QtGui.QLabel("Nombre de Dents")
		la.addWidget(t1)
		
		# Affichage LineEdit
		s1 = QtGui.QLineEdit()
		s1.setText("16")
		s1.setFixedWidth(100)
		la.addWidget(s1)
		self.s1=s1
		
		t2 = QtGui.QLabel("Largeur Courroie")
		la.addWidget(t2)
		
		# Affichage LineEdit
		s2 = QtGui.QLineEdit()
		s2.setText("8.0")
		s2.setFixedWidth(100)
		la.addWidget(s2)
		self.s2=s2
		
		# Gestion boutons OK / Cancel
		okbox = QtGui.QDialogButtonBox(self)
		okbox.setOrientation(QtCore.Qt.Horizontal)
		okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
		la.addWidget(okbox)
		QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), self.proceed)
		QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), self.close)
		QtCore.QMetaObject.connectSlotsByName(self)
		self.show()

d=GT2dialog()
- Flachy Joe -
Image
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: macro pour poulie GT2

Post by blonblon »

Bonsoir

Mario2
J'ai testé ton code j'ai les memes erreurs, désolé.

Merci flachyjoe
pour ton code et tes explications, je débute en python, j'ai besoin de quelques explication sur l'indentation que doit on utiliser tabulation ou espace

Que doit on trouver dans la fonction __init__ , je pensais qu'elle servait pour la definition de la boite de dialogue.

Voici en gros comment devrait s'articuler le programme

Creation boite de dialogue pour saisir le Nb de dents et la Largeur courroie
Calcul des divers coordonnées des 5 courbes utilisées et d'une droite ou d'une courbe pour fermer le dessin.
Créer 1 sketch pour ensuite créer une protusion
Créer 1 sketch pour ensuite créer un pocket
Créer un polar pattern feature

doit on créer des def ou peut on tout intégrer dans def process():, si on doit en créer comment fait on et comment on les appel dans le programme

encore une fois merci
mario52
Veteran
Posts: 4692
Joined: Wed May 16, 2012 2:13 pm

Re: macro pour poulie GT2

Post by mario52 »

Bonjour
essayez celui ci j'ai fat une petite correction "import Draft,Part"

Code: Select all

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

import Draft, Part
import sys

try:

    import PySide                     #  PyQt4
    from PyQt4 import QtCore, QtGui  #  PyQt4
#    App.Console.PrintMessage("PyQt4"+"\n")

except Exception:

    import PySide                    #  PySide
    from PySide import QtCore, QtGui #  PySide
#    App.Console.PrintMessage("PySide"+"\n")
 

import FreeCAD, FreeCADGui, math
import Sketcher, PartDesign


def proceed():
   if FreeCAD.ActiveDocument == None:
      FreeCAD.newDocument("Pignon GT2")

#   try:
   nombre_de_dents = float(s1.text())
   pas = 2
   circonference = nombre_de_dents * pas
   diametre_primitif = circonference / math.pi
   diametre_poulie = diametre_primitif - 0.51
   rayon_poulie = diametre_poulie / 2
   largeur_poulie = float(s2.text())

#### ajout ##################################
   c = App.ActiveDocument.addObject("Part::Cylinder","Cylinder")
   c.Label = "Pignon GT2"
   c.Height.Value = largeur_poulie
   c.Radius.Value = rayon_poulie
   comP     = []
   comP.append(c.Shape)

   pl=FreeCAD.Placement()
   pl.Rotation.Q=(0.0,-0.0,0.0,0.0)
   pl.Base=FreeCAD.Vector(0,0,0)
   dp = Draft.makeCircle(radius=(diametre_primitif/2),placement=pl,face=False,support=None)
   dp.Label = "diametre_primitif"
   comP.append(dp.Shape)

   ## Compound Part objet unique ##
   comp = Part.makeCompound(comP)
   Part.show(comp)

   ## Compound Part objets dans repertoire ##
   nameL  = []
   del nameL[:]
   App.activeDocument().addObject("Part::Compound","Compound")
   nameL.append(App.ActiveDocument.getObject(c.Name))
   nameL.append(App.ActiveDocument.getObject(dp.Name))
   App.activeDocument().Compound.Links = nameL

   App.activeDocument().recompute()

######################################
    
   App.Console.PrintMessage('valeur ' + str(nombre_de_dents)+"\n")
    
#   except:
#       App.Console.PrintMessage('Erreur !'+"\n")

def close():
      dialog.hide()
      print "à demain"

#close()




def __init__():
# Initialisation
   dialog = None
s1 = None
 
# Dimentionner la boite de dialogue
dialog = QtGui.QDialog()
dialog.resize(180,160)

# Titre de la boite
dialog.setWindowTitle("Poulie GT2")
la = QtGui.QVBoxLayout(dialog)

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

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

t2 = QtGui.QLabel("Largeur Courroie")
la.addWidget(t2)

# Affichage LineEdit
s2 = QtGui.QLineEdit()
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_()

poulie00.png
poulie00.png (26.86 KiB) Viewed 4110 times
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
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: macro pour poulie GT2

Post by blonblon »

Merci mario 52

Le code fonctionne et c'est exactement ce que le premier sketch doit faire, je dois calculer les points X et Y des 5 arcs de cercle pour dessiner la dent pour faire un pocket
mario52
Veteran
Posts: 4692
Joined: Wed May 16, 2012 2:13 pm

Re: macro pour poulie GT2

Post by mario52 »

Bonjour
vous pouvez adapter le code entre :

Code: Select all

#### ajout ##################################
######################################
à la même place dans le code cohérent de flachyjoe c'est la section qui crée le cylindre et le cercle
puis j'ai mis deux exemples de composé des objets le premier crée un composé unique le deuxième crée un composé en conservant noms et objets séparés et attention à la position et aux indentations qui font partie du code dans Python

si rien ne se passe commentez les "try:" et "except:" pour voir s'il y a des erreurs
si vous avez une erreur comparez les positions dans mon code qui fonctionne
vous programmez en C vous ne devez pas avoir de difficultés

pour calculer les positions vous devrez travailler avec "Placement"

pour voir toutes les infos et le code Python dans FreeCAD informations

bon amusement
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
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: macro pour poulie GT2

Post by blonblon »

Merci Mario52
J'ai de la lecture en perspective
Je vais tenter d'expliquer comment dessiner une poulie GT2
Belt GT2.jpg
Belt GT2.jpg (29.15 KiB) Viewed 4087 times
A l'aide du schéma et des valeurs dans le dessin joint, voici comment calculer le diamètre que doit faire la poulie, le nombre de dents que multiplie le pas (P sur le dessin donne) la circonférence représenté par le repère 3 sur le dessin ce qui permet de calculer le diamètre de la poulie
diamètre calculé - (PLD * 2) ( PLD * 2 arrondi à 0.51)
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: macro pour poulie GT2

Post by blonblon »

Voici le sketch pour dessiner une poulie GT2 de 16 dents, en utilisant les données postées précèdemment
SketchPoulie.FCStd
Sketch dessin poulie 16 dents GT2
(29.03 KiB) Downloaded 219 times
Ce soir je définirais les dernières variables et tenterais de coder le dessin
Post Reply