


Code: Select all
#-*- coding: utf-8 -*-
#
# Dessin pignon GT2
#
import Draft, Part
import sys
import math
import Part
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)
###
def proceed():
###
Type = t0.currentText() # on récupére le type de poulie
progress.setValue(5)
###
###
# Données nécessaires au dessin poulie GT2
if 'GT2' == Type:
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.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(s2.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
elif 'GT3' == Type:
pdbg('Type = ' + str(Type)+"\n")
nombre_de_dents = float(s1.text())
pdbg('Nb dents = ' + str(nombre_de_dents)+"\n")
pas = 3
pdbg('Pas = ' + str(pas)+"\n")
PLD = 0.381
pdbg('PLD = ' + str(PLD)+"\n")
h = 1.14
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")
R1 = 0.25
pdbg('rayon_R1 = ' + str(R1)+"\n")
R2 = 1.52
pdbg('rayon_R2 = ' + str(R2)+"\n")
R3 = 0.85
pdbg('rayon_R3 = ' + str(R3)+"\n")
b = 0.61
b2 = b*2
elif 'GT5' == Type:
pdbg('Type = ' + str(Type)+"\n")
nombre_de_dents = float(s1.text())
pdbg('Nb dents = ' + str(nombre_de_dents)+"\n")
pas = 5
PLD = 0.43
pdbg('PLD = ' + str(PLD)+"\n")
h = 1.2
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")
largeurDent = 2.65
angleDent = 40
###
###
# 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"
else: #Il y a (au moins) un Part dans le document
myPart = objs[0] #On utilise par ex. le premier Part dans la suite
############
objs = [obj for obj in myDoc.Objects if str(obj) == "<body object>"]
if len(objs) != 0 and t1.isChecked() == False:
myBody = objs[ - 1]
mySketch = myBody.newObject('Sketcher::SketchObject','Sketch')
# mySketch.Support = (App.ActiveDocument.Pad,[''])
a = 0
a = App.ActiveDocument.Pad.Length
# App.activeDocument().Sketch.Placement = App.Placement(App.Vector(0.000000,0.000000,a),App.Rotation(0,00,1,0))
print('obj != 0')
print(str(a))
else:
myBody = myDoc.addObject('PartDesign::Body','Body')
# App.activeDocument().Part.addObject(App.ActiveDocument.Body)
mySketch = myBody.newObject('Sketcher::SketchObject','Sketch')
mySketch.Support = (myDoc.XY_Plane001, [''])
mySketch.MapMode = 'FlatFace'
a = 0
# App.activeDocument().Sketch.Placement = App.Placement(App.Vector(0.000000,0.000000,a),App.Rotation(0,00,1,0))
print('obj == 0')
print(str(a))
############
# premier Sketch ici on insére le code du dessin
# On place le cercle qui va servir pour le pignon en GT2, GT3, ou GT5
progress.setValue(20)
print(str(App.getDocument))
# FreeCAD.getDocument("PignonGT2").getObject("Sketch002").Placement = App.Placement(App.Vector(0,0,8),App.Rotation(App.Vector(0,0,1),0))
# App.activeDocument().Sketch001.Placement = App.Placement(App.Vector(0.000000,0.000000,0.000000),App.Rotation(-0.707107,0.000000,0.000000,-0.707107))
# App.getDocument("PignonGT2").getObject("Sketch002").Placement = App.Placement(App.Vector(0,0,a),App.Rotation(App.Vector(0,0,1),0))
mySketch.addGeometry(Part.Circle(App.Vector(-0.959298,0.986822,0),App.Vector(0,0,1),rayon_poulie),False)
mySketch.addConstraint(Sketcher.Constraint('Coincident',-1,1,0,3))
mySketch.addConstraint(Sketcher.Constraint('Radius',0,rayon_poulie))
# mySketch.Placement = App.Placement(App.Vector(0.000000,0.000000,a),App.Rotation(0,0,1,0))
App.ActiveDocument.recompute()
mySketch.ViewObject.Visibility = False
############
# On extrude le cercle
myPad = myBody.newObject("PartDesign::Pad","Pad")
# print(str(myPad.Length))
myPad.Profile = mySketch
myPad.Length = largeur_poulie
App.ActiveDocument.recompute()
# myPad.Length = (float(a) + largeur_poulie)
myPad.Length2 = 100.000000
myPad.Type = 0
myPad.UpToFace = None
myPad.Reversed = 1
myPad.Midplane = 0
myPad.Offset = 0.000000
# myPad.ViewObject.Visibility = False
App.ActiveDocument.recompute()
progress.setValue(30)
###
# on dessine une dent
###
if 'GT2' == Type or 'GT3' == Type:
mySketch1 = myBody.newObject('Sketcher::SketchObject','Sketch001')
# App.activeDocument().Sketch001.Support = (App.ActiveDocument.Pad,["Face5"])
mySketch1.Support = (App.ActiveDocument.Pad,["Face3"]) # (myDoc,["Face3"]) # myPad myDoc
mySketch1.MapMode = 'FlatFace'
# mySketch1.Placement = App.Placement(App.Vector(0.000000,0.000000,a),App.Rotation(0,0,1,0))
mySketch1.addGeometry(Part.LineSegment(App.Vector(-0.193479,5.124362,0),App.Vector(0.192029,5.124362,0)),False)
mySketch1.addConstraint(Sketcher.Constraint('Symmetric',0,1,0,2,-2))
mySketch1.toggleConstruction(0)
mySketch1.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,b2)) # Entraxe rayon R2
mySketch1.setDatum(1,App.Units.Quantity(str(b2) + ' mm')) # Entraxe rayon R2
geoList = []
geoList.append(Part.LineSegment(App.Vector(-0.733822,4.858931,0),App.Vector(0.675494,4.858931,0)))
geoList.append(Part.LineSegment(App.Vector(0.675494,4.858931,0),App.Vector(0.675494,4.707256,0)))
geoList.append(Part.LineSegment(App.Vector(0.675494,4.707256,0),App.Vector(-0.733822,4.707256,0)))
geoList.append(Part.LineSegment(App.Vector(-0.733822,4.707256,0),App.Vector(-0.733822,4.858931,0)))
mySketch1.addGeometry(geoList,False)
conList = []
conList.append(Sketcher.Constraint('Coincident',1,2,2,1))
conList.append(Sketcher.Constraint('Coincident',2,2,3,1))
conList.append(Sketcher.Constraint('Coincident',3,2,4,1))
conList.append(Sketcher.Constraint('Coincident',4,2,1,1))
conList.append(Sketcher.Constraint('Horizontal',1))
conList.append(Sketcher.Constraint('Vertical',2))
conList.append(Sketcher.Constraint('Vertical',4))
mySketch1.addConstraint(conList)
mySketch1.toggleConstruction(4)
mySketch1.toggleConstruction(1)
mySketch1.toggleConstruction(3)
mySketch1.toggleConstruction(2)
mySketch1.addConstraint(Sketcher.Constraint('DistanceY',3,2,1,1,R1)) # Arc cercle R1
mySketch1.setDatum(9,App.Units.Quantity(str(R1) + ' mm')) # Arc cercle R1
mySketch1.addConstraint(Sketcher.Constraint('Symmetric',3,2,2,2,-2))
mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(-0.661711,4.752790,0),App.Vector(0,0,1),0.192858),0.236851,1.887364),False)
mySketch1.addConstraint(Sketcher.Constraint('Coincident',3,2,5,3))
mySketch1.addConstraint(Sketcher.Constraint('Coincident',1,1,5,2))
mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.450575,5.100380,0),App.Vector(0,0,1),1.036934),-2.747505,-2.448713),False)
mySketch1.addConstraint(Sketcher.Constraint('Coincident',0,2,6,3))
mySketch1.addConstraint(Sketcher.Constraint('Tangent',5,1,6,1))
mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.068227,4.563197,0),App.Vector(0,0,1),0.468263),-2.587285,-1.242243),False)
mySketch1.addConstraint(Sketcher.Constraint('Tangent',6,2,7,1))
mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.668608,4.825469,0),App.Vector(0,0,1),0.204199),1.190289,2.657114),False)
mySketch1.addConstraint(Sketcher.Constraint('Coincident',8,3,2,2))
mySketch1.addConstraint(Sketcher.Constraint('Coincident',1,2,8,1))
mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(-0.465797,5.119339,0),App.Vector(0,0,1),1.025216),-0.712926,-0.365625),False)
mySketch1.addConstraint(Sketcher.Constraint('Coincident',9,3,0,1))
mySketch1.addConstraint(Sketcher.Constraint('Tangent',8,2,9,2))
mySketch1.addConstraint(Sketcher.Constraint('Tangent',7,2,9,1))
mySketch1.addConstraint(Sketcher.Constraint('Radius',6,R2)) # Arc cercle R2
mySketch1.setDatum(21,App.Units.Quantity(str(R2) + ' mm')) # Arc cercle R2
mySketch1.addConstraint(Sketcher.Constraint('Radius',7,R3)) # Arc cercle R3
mySketch1.setDatum(22,App.Units.Quantity(str(R3) + ' mm')) # Arc cercle R3
mySketch1.addGeometry(Part.Point(App.Vector(-0.150355,4.112466,0)))
mySketch1.addConstraint(Sketcher.Constraint('PointOnObject',10,1,-2))
mySketch1.addConstraint(Sketcher.Constraint('PointOnObject',10,1,7))
mySketch1.addConstraint(Sketcher.Constraint('DistanceY',10,1,8,1,h)) # Hauteur
mySketch1.setDatum(25,App.Units.Quantity(str(h) + ' mm'))
mySketch1.ViewObject.Visibility = True
App.ActiveDocument.recompute()
mySketch1.addExternal("Pad","Edge2")
mySketch1.addConstraint(Sketcher.Constraint('PointOnObject',5,2,-3))
mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.298317,3.331532,0),App.Vector(0,0,1),1.930821),1.288327,2.078132),False)
mySketch1.addConstraint(Sketcher.Constraint('Coincident',5,2,11,2))
mySketch1.addConstraint(Sketcher.Constraint('Coincident',8,1,11,1))
mySketch1.movePoint(11,0,App.Vector(-0.107088,4.967296,0),0)
mySketch1.addConstraint(Sketcher.Constraint('Tangent',-3,11))
mySketch1.ViewObject.Visibility = False
progress.setValue(50)
# Gui.getDocument("Pignon" + Type).getObject("Sketch001").Visibility=False
# mySketch1.addConstraint(Sketcher.Constraint('Tangent',-3,11)
# mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.298317,3.331532,0),App.Vector(0,0,1),1.930821),1.288327,2.078132),False)
# mySketch1.addConstraint(Sketcher.Constraint('Coincident',5,2,11,2))
# mySketch1.addConstraint(Sketcher.Constraint('Coincident',8,1,11,1))
# mySketch1.addConstraint(Sketcher.Constraint('Distance',-1,1,8,1,rayon_poulie))
# mySketch1.ViewObject.Visibility = False
# App.ActiveDocument.recompute()
elif 'GT5' == Type:
###
# On dessine une dent GT5
###
mySketch1 = myBody.newObject('Sketcher::SketchObject','Sketch')
# mySketch1.Support = (App.ActiveDocument.Pad,["Face2"])
# mySketch1.MapMode = 'FlatFace'
mySketch1.addGeometry(Part.LineSegment(App.Vector(-1.135752,12.395073,0),App.Vector(-1.122119,13.022206,0)),False)
mySketch1.addConstraint(Sketcher.Constraint('Vertical',0))
mySketch1.addGeometry(Part.LineSegment(App.Vector(-1.135752,13.022206,0),App.Vector(1.427315,13.144907,0)),False)
mySketch1.addConstraint(Sketcher.Constraint('Coincident',0,2,1,1))
mySketch1.addGeometry(Part.LineSegment(App.Vector(1.427315,13.144907,0),App.Vector(1.427315,12.531406,0)),False)
mySketch1.addConstraint(Sketcher.Constraint('Coincident',1,2,2,1))
mySketch1.addConstraint(Sketcher.Constraint('Vertical',2))
mySketch1.addGeometry(Part.LineSegment(App.Vector(1.427315,12.531406,0),App.Vector(0.759282,11.195339,0)),False)
mySketch1.addConstraint(Sketcher.Constraint('Coincident',2,2,3,1))
mySketch1.addGeometry(Part.LineSegment(App.Vector(0.759282,11.195339,0),App.Vector(-0.522252,11.099906,0)),False)
mySketch1.addConstraint(Sketcher.Constraint('Coincident',3,2,4,1))
mySketch1.addGeometry(Part.LineSegment(App.Vector(-0.522252,11.099906,0),App.Vector(-1.122119,12.081507,0)),False)
mySketch1.addConstraint(Sketcher.Constraint('Coincident',4,2,5,1))
mySketch1.addConstraint(Sketcher.Constraint('Coincident',5,2,0,1))
myPad.ViewObject.Visibility = True
App.ActiveDocument.recompute()
mySketch1.addExternal("Pad","Edge3")
mySketch1.addConstraint(Sketcher.Constraint('PointOnObject',0,1,-3))
mySketch1.addConstraint(Sketcher.Constraint('Equal',5,3))
mySketch1.addConstraint(Sketcher.Constraint('Symmetric',4,2,3,2,-2))
mySketch1.addConstraint(Sketcher.Constraint('Symmetric',0,2,1,2,-2))
mySketch1.addConstraint(Sketcher.Constraint('DistanceY',2,2,2,1,0.883285))
mySketch1.setDatum(12,App.Units.Quantity('1.000000 mm'))
mySketch1.addConstraint(Sketcher.Constraint('DistanceX',1,1,1,2,2.438514))
mySketch1.setDatum(13,App.Units.Quantity(str(largeurDent) + ' mm'))
mySketch1.addConstraint(Sketcher.Constraint('Angle',3,2,5,1,1.008739))
mySketch1.setDatum(14,App.Units.Quantity(str(angleDent) + ' deg'))
mySketch1.ViewObject.Visibility = False
App.ActiveDocument.recompute()
###
# On fait un Pocket de la dent GT2, GT3 ou GT5
###
myPocket = myBody.newObject("PartDesign::Pocket","Pocket")
myPocket.Profile = mySketch1
myPocket.Length = largeur_poulie
App.ActiveDocument.recompute()
myPocket.Length2 = 100.000000
myPocket.Type = 0
myPocket.UpToFace = None
myPocket.Reversed = 0
myPocket.Midplane = 0
myPocket.Offset = 0.000000
myPocket.ViewObject.Visibility = False
App.ActiveDocument.recompute()
progress.setValue(70)
###
# On dessine toutes les dents
###
myPolar = myBody.newObject("PartDesign::PolarPattern","PolarPattern")
myDoc.recompute()
myPolar.Originals = [myPocket]
myPolar.Axis = (mySketch1, ["N_Axis"])
myPolar.Angle = 360
myPolar.Occurrences = int(nombre_de_dents)
myDoc.recompute()
myBody.Tip = myPolar
myDoc.recompute()
myPolar.Originals = [myPocket,]
# myPolar.Visibility=True
Gui.getDocument(myDoc).getObject("PolarPattern").Visibility=True
myDoc.recompute()
progress.setValue(90)
###
close()
def fin():
close()
def close():
dialog.close()
print('Terminé')
###
# Gestion de la fenetre de dialogues
dialog = None
s1 = None
dialog = QtGui.QDialog()
dialog.resize(200,400) # Dimentionner la boite de dialogue
dialog.setWindowTitle("Poulie GT2") # Titre de la fenetre
la = QtGui.QVBoxLayout(dialog)
progress = QtGui.QProgressBar()
la.addWidget(progress)
progress.setGeometry(QtCore.QRect(0, 0, 200, 40))
t1 = QtGui.QCheckBox("cocher pour plusieurs Body")
la.addWidget(t1)
t1.setCheckState(QtCore.Qt.Unchecked) # Unchecked Checked
la.addWidget(QtGui.QLabel("Type de poulie")) # Affichage Label
t0 = QtGui.QComboBox() # Affichage ComboBox
la.addWidget(t0)
t0.addItems(["GT2", "GT3", "GT5"])
t0.setFixedWidth(100)
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_()
Pas simple. Quelques réflexions en vrac :
C'était quoi le principe et la(les) variable(s) que tu avais prévu dans le code pour faire ça ?Mais les pignons ne se superposent pas, il y a quelque chose qui m'échappe avec la position sur l'axe Z des pignons
Je travaille essentiellement avec PartDesign, je maitrise mal Part, quels outils utiliser pour créer une poulie.Est-ce que ce ne serait pas mieux de gérer ça avec des extrusions Part, plutôt que des fonctions PartDesign ?
Créer un outil, j'ai consulte les sources de FcGear, c'est je pense au dessus de mes compétences.Voire le truc ultime, ce serait de créer un nouveau type de pièce Part (du genre Gear) qui aurait comme propriétés le type de poulie, le nombre de dents, ... Ca ce serait la classe
Ou trouver de la documentation QDockWidget pour FreeCad.Dans un 1er temps pour faire simple, ce que je ferai c'est une interface graphique à 3 boutons : "Quitter", "Créer" et "Créer et continuer". Les 2 1ers boutons seraient les "Annuler" et "OK" d'aujourd'hui, le 3ème permettrait justement de créer des trains de pignons en ne fermant pas la fenêtre mais en enchainant sur les pignons précédents.
Ce serait peut-être mieux si ta fenêtre graphique dérivait de QDockWidget -- quitte à désactiver le docking --. Ca permetttrait de continuer à pouvoir faire tourner la vue 3D pendant qu'on se sert de la macro.
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 hauteurC'était quoi le principe et la(les) variable(s) que tu avais prévu dans le code pour faire ça ?
Tu crées ton sketch de la même façon sauf que tu n'as pas besoin de le mapper sur quelque chose (déjà c'est plus simple). Et tu n'as pas besoin de la mettre dans un Body (encore plus simple). Tu joues éventuellement avec son "Placement" pour le positionner.
Je suis d'accord que c'est un sacré boulot. Surtout que du coup tu te retrouves probablement à coder en C++.Créer un outil, j'ai consulte les sources de FcGear, c'est je pense au dessus de mes compétences.
QDockWidget n'est pas spécifique à FC. C'est simplement un type de fenêtre fourni par Qt.Ou trouver de la documentation QDockWidget pour FreeCad.
Code: Select all
dialog = QtGui.QDialog()
Code: Select all
dialog = QtGui.QDockWidget()
C'est encore un peu mystérieux. Je regarderai le code. Tu peux me donner le nom de la variable ?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