Je viens de faire une superposition de ton pignon de 15 dents sur le mien pris dans sa version sans déport.
Ils se recouvrent pile poil, sauf le creux de dents bien sûr, à cause de ta crémaillère génératrice par encore définitive.
Pour ce faire j'ai fait une capture d'écran du profil que ton codé génère pour 15 dents et j'ai pris l'image que le mie, génère pour 15 dents..
J'ai collé les deux images sur PowerPoint et je les ai mises à la même échelle.
Puis j'ai fait un "glisser" qui crée une semi transparence.
C'est assez normal qu'on trouve les mêmes profils, puisqu'on procède tous deux par génération à "l'outil crémaillère". Il faut juste que celles ci aient le même profil.
Comment faire des tracés sur image - Taillage d'engrenages.
-
- Messages : 56
- Inscription : mar. 27/janv./2009 12:07
- Localisation : Très proche de Toulouse, au nord-ouest
Re: Comment faire des tracés sur image - Taillage d'engrenages.
Il faut savoir rire dans la tragédie et être profond dans la joie.
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Re: Comment faire des tracés sur image - Taillage d'engrenages.
Bon alors, c'est tout finis. hormis que je n'ai pas de fichier de sortie

Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.40
;
; Explication du programme :
; Dessiner un engrenage
; Le filtre permet d'émuler de l'antialiasing sur le dessin de l'engrenage, ne pas mettre au dessus de 8
Global FiltreAA = 4, Dessin_Angle.d, Dessin_Zoom.d, Dessin.i
Enumeration
; Paramètres
#G_Module
#G_Z
#G_Angle_Pression
#G_D_primitif
#G_D_pied
#G_D_tete
#G_H_dent
#G_Pas
#G_Deport
; Norme
#G_H_pied
#G_H_tete
#G_R_chanfrein
; Autres
#G_Onglet
#G_Zoom
#G_Dessin
#G_Angle
EndEnumeration
#Engrenage_ResolutionDent = 314
#Equation_Degree = 1
#Cremaillere_NbEquation = 7
#Engrenage_Couleur = $FF00FFFF
#Engrenage_Diametre = $200000FF
#Engrenage2_Couleur = $FF0000FF
#Cremaillere_Couleur = $40FFFFFF
#Cremaillere_Hauteur = $400000FF
Structure Structure_Cercle
x.d
y.d
R.d
Interieur.b
Exterieur.b
EndStructure
Structure Structure_Equation
x1.d
x2.d
v.d[#Equation_Degree + 1]
c.Structure_Cercle
EndStructure
Structure Structure_Rayon
R.d
Angle.d
Zone.b
EndStructure
Structure Structure_Engrenage
Module.d
Z.d
D_primitif.d
D_tete.d
D_pied.d
H_dent.d
Angle_pression.d
Pas.d
Deport.d
H_tete.d
H_pied.d
R_chanfrein.d
Contour.Structure_Rayon[#Engrenage_ResolutionDent]
Cremaillere.Structure_Equation[#Cremaillere_NbEquation]
Outil.Structure_Equation[#Cremaillere_NbEquation]
EndStructure
Global Engrenage.Structure_Engrenage
Procedure.s AfficheValeur(Valeur.d)
ProcedureReturn RTrim(RTrim(RTrim(StrD(Valeur), "0"), "."), ",")
EndProcedure
Procedure Engrenage_Calcul(*Calcul.Structure_Engrenage)
With * Calcul
;- Paramètres de l'engrenage
\D_primitif = \Z * \Module
\D_tete = \D_primitif + 2 * \H_tete * \Module
\D_pied = \D_primitif - 2 * \H_pied * \Module
\Pas = #PI * \Module
\H_dent = (\H_tete + \H_pied) * \Module
;- Equation de la crémaillère
Largeur_zone_tete.d = \Pas / 2 - 2 * \H_tete * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_cercle.d = \R_chanfrein * \Module * Cos(\Angle_pression * #PI / 180)
Hauteur_zone_cercle.d = \R_chanfrein * \Module * (1-Sin(\Angle_pression * #PI / 180))
Largeur_zone_inclinee.d = (\H_dent - Hauteur_zone_cercle) * Sin(\Angle_pression * #PI / 180)
Largeur_zone_pied.d = \Pas - Largeur_zone_tete - 2 * Largeur_zone_cercle - 2 * Largeur_zone_inclinee
; Zone 1
\Cremaillere[0]\x1 = 0
\Cremaillere[0]\x2 = Largeur_zone_tete / 2
\Cremaillere[0]\v[0] = \H_dent
; zone 2
\Cremaillere[1]\x1 = \Cremaillere[0]\x2
\Cremaillere[1]\x2 = \Cremaillere[1]\x1 + Largeur_zone_inclinee
\Cremaillere[1]\v[1] = -1/Sin(\Angle_pression * #PI / 180)
\Cremaillere[1]\v[0] = \H_dent - \Cremaillere[1]\v[1] * \Cremaillere[1]\x1
; zone 3
\Cremaillere[2]\x1 = \Cremaillere[1]\x2
\Cremaillere[2]\x2 = \Cremaillere[2]\x1 + Largeur_zone_cercle
; \Cremaillere[2]\v[0] = Hauteur_zone_cercle
\Cremaillere[2]\c\x = \Cremaillere[2]\x2
\Cremaillere[2]\c\y = \R_chanfrein * \Module
\Cremaillere[2]\c\R = \R_chanfrein * \Module
\Cremaillere[2]\c\Interieur = 1
; zone 4
\Cremaillere[3]\x1 = \Cremaillere[2]\x2
\Cremaillere[3]\x2 = \Cremaillere[3]\x1 + Largeur_zone_pied
\Cremaillere[3]\v[0] = 0
; zone 5
\Cremaillere[4]\x1 = \Cremaillere[3]\x2
\Cremaillere[4]\x2 = \Cremaillere[4]\x1 + Largeur_zone_cercle
\Cremaillere[4]\c\x = \Cremaillere[4]\x1
\Cremaillere[4]\c\y = \R_chanfrein * \Module
\Cremaillere[4]\c\R = \R_chanfrein * \Module
\Cremaillere[4]\c\Interieur = 1
; Zone 6
\Cremaillere[5]\x1 = \Cremaillere[4]\x2
\Cremaillere[5]\x2 = \Cremaillere[5]\x1 + Largeur_zone_inclinee
\Cremaillere[5]\v[1] = 1/Sin(\Angle_pression * #PI / 180)
\Cremaillere[5]\v[0] = Hauteur_zone_cercle - \Cremaillere[5]\v[1] * \Cremaillere[5]\x1
; Zone 7
\Cremaillere[6]\x1 = \Cremaillere[5]\x2
\Cremaillere[6]\x2 = \Pas
\Cremaillere[6]\v[0] = \H_dent
;- Equation de l'outil
Largeur_zone_pied.d = \Pas / 2 - 2 * \H_tete * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_cercle.d = \R_chanfrein * \Module * Cos(\Angle_pression * #PI / 180)
Hauteur_zone_cercle.d = \R_chanfrein * \Module * (1-Sin(\Angle_pression * #PI / 180))
Largeur_zone_inclinee.d = (\H_dent - Hauteur_zone_cercle) * Sin(\Angle_pression * #PI / 180)
Largeur_zone_tete.d = \Pas - Largeur_zone_pied - 2 * Largeur_zone_cercle - 2 * Largeur_zone_inclinee
; Zone 1
\Outil[0]\x1 = 0
\Outil[0]\x2 = Largeur_zone_tete / 2
\Outil[0]\v[0] = \H_dent + (\H_pied - \H_tete) * \Module
; Zone 2
\Outil[1]\x1 = \Outil[0]\x2
\Outil[1]\x2 = \Outil[1]\x1 + Largeur_zone_cercle
\Outil[1]\c\x = \Outil[1]\x1
\Outil[1]\c\y = \H_dent + (\H_pied - \H_tete) * \Module - \R_chanfrein * \Module
\Outil[1]\c\R = \R_chanfrein * \Module
\Outil[1]\c\Exterieur = 1
; zone 3
\Outil[2]\x1 = \Outil[1]\x2
\Outil[2]\x2 = \Outil[2]\x1 + Largeur_zone_inclinee
\Outil[2]\v[1] = -1/Sin(\Angle_pression * #PI / 180)
\Outil[2]\v[0] = \H_dent + (\H_pied - \H_tete) * \Module - Hauteur_zone_cercle - \Outil[2]\v[1] * \Outil[2]\x1
; zone 4
\Outil[3]\x1 = \Outil[2]\x2
\Outil[3]\x2 = \Outil[3]\x1 + Largeur_zone_pied
\Outil[3]\v[0] = (\H_pied - \H_tete) * \Module
; Zone 5
\Outil[4]\x1 = \Outil[3]\x2
\Outil[4]\x2 = \Outil[4]\x1 + Largeur_zone_inclinee
\Outil[4]\v[1] = 1/Sin(\Angle_pression * #PI / 180)
\Outil[4]\v[0] = (\H_pied - \H_tete) * \Module - \Outil[4]\v[1] * \Outil[4]\x1
; Zone 6
\Outil[5]\x1 = \Outil[4]\x2
\Outil[5]\x2 = \Outil[5]\x1 + Largeur_zone_cercle
\Outil[5]\c\x = \Outil[5]\x2
\Outil[5]\c\y = \H_dent + (\H_pied - \H_tete) * \Module - \R_chanfrein * \Module
\Outil[5]\c\R = \R_chanfrein * \Module
\Outil[5]\c\Exterieur = 1
; Zone 7
\Outil[6]\x1 = \Outil[5]\x2
\Outil[6]\x2 = \Pas
\Outil[6]\v[0] = \H_dent + (\H_pied - \H_tete) * \Module
; CopyMemory(@\Cremaillere, @\Outil, SizeOf(Structure_Equation) * #Cremaillere_NbEquation)
; Reset de la taille de l'engrenage
For x = 0 To #Engrenage_ResolutionDent - 1
\Contour[x]\R = \D_tete / 2
\Contour[x]\Angle = x * 2 * #PI / #Engrenage_ResolutionDent / \Z
Next
EndWith
EndProcedure
Procedure Engrenage_Diametre(*Calcul.Structure_Engrenage)
With * Calcul
If \Module > 0 And \Z > 0 And \Angle_pression > 0 And \D_pied > 0
;- Calcul des rayons avec l'angle par défaut
For x = 0 To #Engrenage_ResolutionDent - 1
\Contour[x]\Angle.d = x * 2 * #PI / #Engrenage_ResolutionDent / \Z
x_reel.d = \D_primitif * \Contour[x]\Angle / 2
While x_reel >= \Pas And \Pas > 0
x_reel - \Pas
Wend
If x_reel < 0
x_reel = 0
EndIf
For n = 0 To #Cremaillere_NbEquation - 1
If x_reel >= \Outil[n]\x1 And x_reel < \Outil[n]\x2
If \Outil[n]\c\R ; Cercle
y_reel.d = \Outil[n]\c\y + \Outil[n]\c\R * (\Outil[n]\c\Exterieur - \Outil[n]\c\Interieur) * Sin(ACos((x_reel - \Outil[n]\c\x) / (\R_chanfrein *\Module)))
Else ; Courbe
CompilerIf #Equation_Degree = 1
y_reel.d = \Outil[n]\v[0] + \Outil[n]\v[1] * x_reel
CompilerElse
y_reel.d = \Outil[n]\v[0]
For nn = 1 To #Equation_Degree
y_reel.d + \Outil[n]\v[nn] * Pow(x_reel, nn)
Next
CompilerEndIf
EndIf
Break
EndIf
Next
\Contour[x]\R =(\D_primitif / 2 + \H_pied * \Module) + \Deport * \Module - y_reel
If \Contour[x]\R > \D_tete / 2 + \Deport * \Module
\Contour[x]\R = \D_tete / 2 + \Deport * \Module
EndIf
If \Contour[x]\R < \D_pied / 2 + \Deport * \Module
\Contour[x]\R = \D_pied / 2 + \Deport * \Module
EndIf
If \Contour[x]\Angle < #PI / \Z
\Contour[x]\Zone = 1
Else
\Contour[x]\Zone = 2
EndIf
Next
;- Correction de l'angle
; Centre de l'engrenage
x_reel.d = 0
y_reel.d =(\D_primitif / 2 + \H_pied * \Module) + \Deport * \Module
Correction.d = 1 / #Engrenage_ResolutionDent / \Z
Rotation.d = #Engrenage_ResolutionDent * \Z / 4
If Rotation < #Engrenage_ResolutionDent * 2
Rotation = #Engrenage_ResolutionDent * 2
EndIf
For Z = -Rotation To Rotation
Angle.d = Z * 2 * #PI / #Engrenage_ResolutionDent / \Z
Avance.d = \D_primitif * Angle / 2
For x = 0 To #Engrenage_ResolutionDent - 1
If \Contour[x]\R
Repeat
Angle_reel.d = \Contour[x]\Angle + Angle
x1_reel.d = x_reel + \Contour[x]\R * Sin(Angle_reel) - Avance
y1_reel.d = y_reel - \Contour[x]\R * Cos(Angle_reel)
While x1_reel < 0 And \Pas > 0
x1_reel + \Pas
Wend
While x1_reel >= \Pas And \Pas > 0
x1_reel - \Pas
Wend
For n = 0 To #Cremaillere_NbEquation - 1
If x1_reel >= \Outil[n]\x1 And x1_reel < \Outil[n]\x2
If \Outil[n]\c\R ; Cercle
y2_reel.d = \Outil[n]\c\y + \Outil[n]\c\R * (\Outil[n]\c\Exterieur - \Outil[n]\c\Interieur) * Sin(ACos((x1_reel - \Outil[n]\c\x) / (\R_chanfrein *\Module)))
Else ; Courbe
CompilerIf #Equation_Degree = 1
y2_reel.d = \Outil[n]\v[0] + \Outil[n]\v[1] * x1_reel
CompilerElse
y2_reel.d = \Outil[n]\v[0]
For nn = 1 To #Equation_Degree
y2_reel.d + \Outil[n]\v[nn] * Pow(x1_reel, nn)
Next
CompilerEndIf
EndIf
Break
EndIf
Next
If y1_reel < y2_reel
If \Contour[x]\Zone = 1
\Contour[x]\Angle + Correction
If \Contour[x]\Angle > #PI / \Z
\Contour[x]\R = 0
EndIf
Else
\Contour[x]\Angle - Correction
If \Contour[x]\Angle < #PI / \Z
\Contour[x]\R = 0
EndIf
EndIf
EndIf
Until y1_reel >= y2_reel
EndIf
Next
Next
EndIf
EndWith
EndProcedure
Procedure Engrenage_Dessin(Gadget, Image, *Calcul.Structure_Engrenage, Angle.d, Zoom.d = 0)
LoadFont(1, "Tahoma", 9 * FiltreAA, #PB_Font_HighQuality)
With * Calcul
Largeur = GadgetWidth(Gadget) * FiltreAA
Hauteur = GadgetHeight(Gadget) * FiltreAA
Echelle.d =(2 * \Pas *(1 - Zoom) + \D_tete * Zoom) /(Largeur - 32 * FiltreAA)
x0 = Largeur / 2
y0 = Hauteur / 3 - \H_pied * \Module / Echelle
; De combien la crémaillère se déplace pour l'angle donné
Avance.d = \D_primitif * Angle / 2
CreateImage(Image, Largeur, Hauteur, 24)
StartDrawing(ImageOutput(Image))
DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
Box(0, 0, Largeur, Hauteur, $FF000000)
If \Module > 0 And \Z > 0 And \Angle_pression > 0 And \D_pied > 0
If Dessin = 0 Or FiltreAA = 1
; Centre de l'engrenage
x_reel.d = 0
y_reel.d =(\D_primitif / 2 + \H_pied * \Module) + \Deport * \Module
; Dessin de l'engrenage
Angle_reel.d = \Contour[0]\Angle + Angle
x1_reel.d = x_reel + \Contour[0]\R * Sin(Angle_reel)
y1_reel.d = y_reel - \Contour[0]\R * Cos(Angle_reel)
For nn = 0 To \Z - 1
For n = 1 To #Engrenage_ResolutionDent - 1
If \Contour[n]\R
Angle_reel.d = \Contour[n]\Angle + 2 * #PI * nn / \Z + Angle
x2_reel.d = x_reel + \Contour[n]\R * Sin(Angle_reel)
y2_reel.d = y_reel - \Contour[n]\R * Cos(Angle_reel)
; Debug StrD(x2_reel, 4) + " / " + StrD(y2_reel, 4)
LineXY(x0 + x1_reel / Echelle, y0 + y1_reel / Echelle, x0 + x2_reel / Echelle, y0 + y2_reel / Echelle, #Engrenage_Couleur)
x1_reel = x2_reel
y1_reel = y2_reel
EndIf
Next
Next
Angle_reel.d = \Contour[0]\Angle + Angle
x2_reel.d = x_reel + \Contour[0]\R * Sin(Angle_reel)
y2_reel.d = y_reel - \Contour[0]\R * Cos(Angle_reel)
LineXY(x0 + x1_reel / Echelle, y0 + y1_reel / Echelle, x0 + x2_reel / Echelle, y0 + y2_reel / Echelle, #Engrenage_Couleur)
EndIf
If Dessin = 0 Or FiltreAA = 1
; Remplissage de l'engrenage
If y0 + y_reel / Echelle > Hauteur
y = Hauteur - 1
Else
y = y0 + y_reel / Echelle
EndIf
FillArea(x0, y, #Engrenage_Couleur, #Engrenage_Couleur)
EndIf
If Dessin = 0 Or FiltreAA = 1
; Dessin de la crémaillère et de l'outil
For x = 0 To Largeur - 1
x_reel.d =(x - x0) * Echelle - Avance
While x_reel < 0 And \Pas > 0
x_reel + \Pas
Wend
While x_reel >= \Pas And \Pas > 0
x_reel - \Pas
Wend
; Dessin de la crémaillère
For n = 0 To #Cremaillere_NbEquation - 1
If x_reel >= \Cremaillere[n]\x1 And x_reel < \Cremaillere[n]\x2
If \Cremaillere[n]\c\R ; Cercle
y_reel = \Cremaillere[n]\c\y + \Cremaillere[n]\c\R * (\Cremaillere[n]\c\Exterieur - \Cremaillere[n]\c\Interieur) * Sin(ACos((x_reel - \Cremaillere[n]\c\x) / (\R_chanfrein *\Module)))
Else ; Courbe
CompilerIf #Equation_Degree = 1
y_reel.d = \Cremaillere[n]\v[0] + \Cremaillere[n]\v[1] * x_reel
CompilerElse
y_reel.d = \Cremaillere[n]\v[0]
For nn = 1 To #Equation_Degree
y_reel.d + \Cremaillere[n]\v[nn] * Pow(x_reel, nn)
Next
CompilerEndIf
EndIf
Break
EndIf
Next
y = y_reel / Echelle + y0
LineXY(x, y, x, 0, #Cremaillere_Couleur)
; Dessin de l'outil d'usinage
For n = 0 To #Cremaillere_NbEquation - 1
If x_reel >= \Outil[n]\x1 And x_reel < \Outil[n]\x2
If \Outil[n]\c\R ; Cercle
y_reel = \Outil[n]\c\y + \Outil[n]\c\R * (\Outil[n]\c\Exterieur - \Outil[n]\c\Interieur) * Sin(ACos((x_reel - \Outil[n]\c\x) / (\R_chanfrein *\Module)))
Else ; Courbe
CompilerIf #Equation_Degree = 1
y_reel.d = \Outil[n]\v[0] + \Outil[n]\v[1] * x_reel
CompilerElse
y_reel.d = \Outil[n]\v[0]
For nn = 1 To #Equation_Degree
y_reel.d + \Outil[n]\v[nn] * Pow(x_reel, nn)
Next
CompilerEndIf
EndIf
Break
EndIf
Next
y = y_reel / Echelle + y0
LineXY(x, y, x, 0, #Cremaillere_Couleur)
Next
EndIf
If Dessin = 0 Or FiltreAA = 1
; Centre de l'engrenage
x_reel.d = 0
y_reel.d =(\D_primitif / 2 + \H_pied * \Module) + \Deport * \Module
; Dessin du diametre de pied
Circle(x0, y0 + y_reel / Echelle,(\D_pied / 2 + \Deport * \Module) / Echelle, #Engrenage_Diametre)
; Box(0, y0 +(2.5 * \Module) / Echelle - FiltreAA / 2, Largeur, FiltreAA, #Cremaillere_Hauteur)
; Dessin du diametre primitif
Circle(x0, y0 + y_reel / Echelle,(\D_primitif / 2) / Echelle, #Engrenage_Diametre)
Box(0, y0 +(\H_pied * \Module) / Echelle - FiltreAA / 2, Largeur, FiltreAA, #Cremaillere_Hauteur)
Box(0, y0 +(\H_pied * \Module + \Deport * \Module) / Echelle - FiltreAA / 2, Largeur, FiltreAA, #Cremaillere_Hauteur)
; Dessin du diametre de tête
Circle(x0, y0 + y_reel / Echelle,(\D_tete / 2 + \Deport * \Module) / Echelle, #Engrenage_Diametre)
; Box(0, y0 +(0.25 * \Module) / Echelle - FiltreAA / 2, Largeur, FiltreAA, #Cremaillere_Hauteur)
; pied de la crémaillère
; Box(0, y0 - FiltreAA / 2, Largeur, FiltreAA, #Cremaillere_Hauteur)
; Tête de la crémaillère
; Box(0, y0 +(2.25 * \Module) / Echelle - FiltreAA / 2, Largeur, FiltreAA, #Cremaillere_Hauteur)
; centre
Box(x0 - FiltreAA / 2, 0, FiltreAA, Hauteur, #Cremaillere_Hauteur)
EndIf
If Dessin = 0 Or FiltreAA = 1
; Centre de l'engrenage
x_reel.d = 0
y_reel.d =(\H_pied * \Module - \D_primitif / 2) - \Deport * \Module
; Dessin de l'engrenage
Angle_reel.d = -\Contour[0]\Angle + Angle + #PI / \Z
x1_reel.d = x_reel + \Contour[0]\R * Sin(Angle_reel)
y1_reel.d = y_reel + \Contour[0]\R * Cos(Angle_reel)
For nn = 0 To \Z - 1
For n = 1 To #Engrenage_ResolutionDent - 1
Angle_reel.d = \Contour[n]\Angle + 2 * #PI * nn / \Z + Angle + #PI / \Z
If \Contour[n]\R
x2_reel.d = x_reel + \Contour[n]\R * Sin(Angle_reel)
y2_reel.d = y_reel + \Contour[n]\R * Cos(Angle_reel)
; Debug StrD(x2_reel, 4) + " / " + StrD(y2_reel, 4)
LineXY(x0 + x1_reel / Echelle, y0 + y1_reel / Echelle, x0 + x2_reel / Echelle, y0 + y2_reel / Echelle, #Engrenage2_Couleur)
x1_reel = x2_reel
y1_reel = y2_reel
EndIf
Next
Next
Angle_reel.d = -\Contour[0]\Angle + Angle + #PI / \Z
x2_reel.d = x_reel + \Contour[0]\R * Sin(Angle_reel)
y2_reel.d = y_reel + \Contour[0]\R * Cos(Angle_reel)
LineXY(x0 + x1_reel / Echelle, y0 + y1_reel / Echelle, x0 + x2_reel / Echelle, y0 + y2_reel / Echelle, #Engrenage2_Couleur)
EndIf
If Dessin = 0 Or FiltreAA = 1
; Dessin de l'échelle
DrawingFont(FontID(1))
Longueur.d = 1 / Echelle
Texte.s = "1 mm"
If TextWidth(Texte + " ") > Longueur
Longueur.d = 5 / Echelle
Texte.s = "5 mm"
EndIf
If TextWidth(Texte + " ") > Longueur
Longueur.d = 10 / Echelle
Texte.s = "1 cm"
EndIf
If TextWidth(Texte + " ") > Longueur
Longueur.d = 50 / Echelle
Texte.s = "5 cm"
EndIf
If TextWidth(Texte + " ") > Longueur
Longueur.d = 100 / Echelle
Texte.s = "1 dm"
EndIf
If TextWidth(Texte + " ") > Longueur
Longueur.d = 500 / Echelle
Texte.s = "5 dm"
EndIf
If TextWidth(Texte + " ") > Longueur
Longueur.d = 1000 / Echelle
Texte.s = "1 m"
EndIf
DrawText(x0 +(Longueur - TextWidth(Texte)) / 2, Hauteur - 16 * FiltreAA - TextHeight(Texte), Texte, $FFFFFFFF)
Box(x0, Hauteur - 16 * FiltreAA, Longueur, FiltreAA, $FFFFFFFF)
Box(x0, Hauteur - 16 * FiltreAA - Longueur, FiltreAA, Longueur, $FFFFFFFF)
EndIf
EndIf
StopDrawing()
If Dessin = 0 Or FiltreAA = 1
If FiltreAA > 1
ResizeImage(Image, Largeur / FiltreAA, Hauteur / FiltreAA, #PB_Image_Smooth)
EndIf
SetGadgetState(#G_Dessin, ImageID(0))
EndIf
FreeFont(1)
EndWith
EndProcedure
Procedure Affichage(Parametre.i)
Repeat
While Dessin = 0 And Compteur < 50
Delay(20)
If FiltreAA = 1
Compteur + 1
EndIf
Wend
If Dessin > 0
Dessin = 0
FiltreAA = 1
Affichage = 1
EndIf
If Compteur >= 50
FiltreAA = 4
Compteur = 0
Affichage = 1
EndIf
If Affichage
Affichage = 0
Engrenage_Dessin(#G_Dessin, 0, @Engrenage, Dessin_Angle, Dessin_Zoom)
EndIf
Until Dessin < 0
MessageRequester("oups", "fin")
EndProcedure
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 800, 600, "Taillage d'engrenage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
LoadFont(0, "Tahoma", 9, #PB_Font_HighQuality)
SetGadgetFont(#PB_Default, FontID(0))
Engrenage\Module = 1
Engrenage\Z = 15
Engrenage\Angle_pression = 20
Engrenage\H_tete = 1
Engrenage\H_pied = 1.25
Engrenage\R_chanfrein = 0.38
Engrenage_Calcul(@Engrenage)
x = 4
y = 4
Largeur = 200 - 8
PanelGadget(#G_Onglet, 4, 4, Largeur, 600 - 8 - 96 - 8)
AddGadgetItem(#G_Onglet, -1, "Paramètres")
Largeur2 = GetGadgetAttribute(#G_Onglet, #PB_Panel_ItemWidth) - 8
x2 = 4
y2 = 4
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "Module")
y2 + 16
StringGadget(#G_Module, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\Module))
y2 + 24
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "Z (Nombre de dents)")
y2 + 16
StringGadget(#G_Z, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\Z))
y2 + 24
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "Angle de pression (en °)")
y2 + 16
StringGadget(#G_Angle_Pression, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\Angle_pression))
y2 + 24
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "Déport (* module)")
y2 + 16
StringGadget(#G_Deport, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\Deport))
y2 + 24
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "Diamètre primitif")
y2 + 16
StringGadget(#G_D_primitif, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\D_primitif), #PB_String_ReadOnly)
y2 + 24
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "Diamètre de tête")
y2 + 16
StringGadget(#G_D_tete, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\D_tete + 2 * Engrenage\Deport * Engrenage\Module), #PB_String_ReadOnly)
y2 + 24
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "Diamètre de pied")
y2 + 16
StringGadget(#G_D_pied, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\D_pied + 2 * Engrenage\Deport * Engrenage\Module), #PB_String_ReadOnly)
y2 + 24
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "Hauteur de dent")
y2 + 16
StringGadget(#G_H_dent, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\H_dent), #PB_String_ReadOnly)
y2 + 24
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "Pas")
y2 + 16
StringGadget(#G_Pas, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\Pas), #PB_String_ReadOnly)
y2 + 24
y2 + 8
AddGadgetItem(#G_Onglet, -1, "Norme")
x2 = 4
y2 = 4
TextGadget(#PB_Any, x2, y2, Largeur2, 32, "Les paramètres suivants sont définis par la norme.")
y2 + 32
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "H tête (* Module)")
y2 + 16
StringGadget(#G_H_tete, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\H_tete))
y2 + 24
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "H pied (* Module)")
y2 + 16
StringGadget(#G_H_pied, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\H_pied))
y2 + 24
y2 + 8
TextGadget(#PB_Any, x2, y2, Largeur2, 16, "R chanfrein (* Module)")
y2 + 16
StringGadget(#G_R_chanfrein, x2, y2, Largeur2, 24, AfficheValeur(Engrenage\R_chanfrein))
y2 + 24
y2 + 8
CloseGadgetList()
y + GadgetHeight(#G_Onglet)
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Zoom d'affichage")
y + 16
TrackBarGadget(#G_Zoom, x, y, Largeur, 32, 0, 10, #PB_TrackBar_Ticks)
Dessin_Zoom.d = 0
y + 32
TextGadget(#PB_Any, x, y, Largeur, 16, "Rotation de l'engrenage")
y + 16
TrackBarGadget(#G_Angle, x, y, Largeur, 32, 0, 72)
Dessin_Angle.d = 0
y + 32
CreateImage(0, 600 - 8, 600 - 8, 24)
ImageGadget(#G_Dessin, 204, 4, ImageWidth(0), ImageHeight(0), ImageID(0))
Engrenage_Diametre(@Engrenage)
Engrenage_Dessin(#G_Dessin, 0, @Engrenage, 0)
Dessin = 1
Thread = CreateThread(@Affichage(), 0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
Case #G_Module, #G_Z, #G_Angle_Pression, #G_Deport, #G_H_tete, #G_H_pied, #G_R_chanfrein
If EventType() = #PB_EventType_Change
; ^paramètres
Engrenage\Module = ValD(GetGadgetText(#G_Module))
Engrenage\Z = ValD(GetGadgetText(#G_Z))
Engrenage\Angle_pression = ValD(GetGadgetText(#G_Angle_Pression))
Engrenage\Deport = ValD(GetGadgetText(#G_Deport))
; Norme
Engrenage\H_tete = ValD(GetGadgetText(#G_H_tete))
Engrenage\H_pied = ValD(GetGadgetText(#G_H_pied))
Engrenage\R_chanfrein = ValD(GetGadgetText(#G_R_chanfrein))
Engrenage_Calcul(@Engrenage)
Engrenage_Diametre(@Engrenage)
Dessin + 1
; Affichage des résultats
SetGadgetText(#G_D_primitif, AfficheValeur(Engrenage\D_primitif))
SetGadgetText(#G_D_tete, AfficheValeur(Engrenage\D_tete + 2 * Engrenage\Deport * Engrenage\Module))
SetGadgetText(#G_D_pied, AfficheValeur(Engrenage\D_pied + 2 * Engrenage\Deport * Engrenage\Module))
SetGadgetText(#G_H_dent, AfficheValeur(Engrenage\H_dent))
SetGadgetText(#G_Pas, AfficheValeur(Engrenage\Pas))
EndIf
Case #G_Zoom
Dessin_Zoom = GetGadgetState(#G_Zoom) / 10
Dessin + 1
Case #G_Angle
Dessin_Angle.d = GetGadgetState(#G_Angle) * 2 * #PI /(36 * Engrenage\Z)
Dessin + 1
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
-
- Messages : 56
- Inscription : mar. 27/janv./2009 12:07
- Localisation : Très proche de Toulouse, au nord-ouest
Re: Comment faire des tracés sur image - Taillage d'engrenages.
Bonsoir,
Vraiment magnifique travail Le Soldat Inconnu !!! Tu peux prendre un repos bien mérité, car je sais ce que cela représente comme travail.
J'ai regardé ce que tu obtiens pour le pignon de 6 dents avec déport de 1. Cela semble être exactement le même profil que ce que j'obtiens pour le même cas:
PIGNON 6 DENTS DEPORT 1
La seule différence c'est que j'ai laissé le cercle de pied à la valeur qu'il aurait s'il n'y avait pas de déport, afin de voir son décalage avec le nouveau cercle de pied.
Autre différence: l'interface de saisie des données et la qualité du rendu. Les miens sont nuls, mais il faut dire que je n'avais besoin que du fichier de sortie pour usiner ma pièce. L'image m'a servi essentiellement au débuggage. Par ailleurs ma pauvre maîtrise de PureBasic m'aurait interdit de faire aussi bien dans ce domaine. Je me suis donc focalisé sur la partie fonctionnelle.
Encore bravo!
Cdlt
SULREN
Vraiment magnifique travail Le Soldat Inconnu !!! Tu peux prendre un repos bien mérité, car je sais ce que cela représente comme travail.
J'ai regardé ce que tu obtiens pour le pignon de 6 dents avec déport de 1. Cela semble être exactement le même profil que ce que j'obtiens pour le même cas:
PIGNON 6 DENTS DEPORT 1
La seule différence c'est que j'ai laissé le cercle de pied à la valeur qu'il aurait s'il n'y avait pas de déport, afin de voir son décalage avec le nouveau cercle de pied.
Autre différence: l'interface de saisie des données et la qualité du rendu. Les miens sont nuls, mais il faut dire que je n'avais besoin que du fichier de sortie pour usiner ma pièce. L'image m'a servi essentiellement au débuggage. Par ailleurs ma pauvre maîtrise de PureBasic m'aurait interdit de faire aussi bien dans ce domaine. Je me suis donc focalisé sur la partie fonctionnelle.
Encore bravo!
Cdlt
SULREN
Il faut savoir rire dans la tragédie et être profond dans la joie.
Re: Comment faire des tracés sur image - Taillage d'engrenages.
Salut. ça ne pose pas de problèmes si les dents présentées dans le programme de LSI ne sont pas asymétriques?SULREN a écrit :Je travaille actuellement sur un programme qui me permettrait de réaliser des engrenages pour de la restauration sur des horloges en mauvais état.
Ollivier
-
- Messages : 56
- Inscription : mar. 27/janv./2009 12:07
- Localisation : Très proche de Toulouse, au nord-ouest
Re: Comment faire des tracés sur image - Taillage d'engrenages.
Bonjour,
Ollivier, je n'ai pas compris ta question.
Les engrenages produits par le programme de LSI ont des dents symétriques et c'est le but recherché, comme ceux produits par le programme que j'avais moi-même écrit. Ces engrenages correspondent au profil dit en "développante de cercle", bien défini par une norme.
Si tu fais référence au programme sur lequel je travaille pour de la restauration d'engrenages je ne peux pas utiliser de qu'a fait LSI ni ce que j'avais fait sur le même sujet.
La restauration d'engrenages en horlogerie consiste à refaire des engrenages abîmés ou perdus. Ces engrenages sont de type "dit ogival". Sur les horloges anciennes ils ont des profils pas normalisés du tout car à l'époque chaque horloger avais sa propre norme. Il faut donc se créer u outil de taillage dans chaque cas rencontré.
Je viens de terminer le petit programme en PureBasic dont je parlais dans la citation que tu as faite.
Il permet a partir d'une photo de dents de l'engrenage à refaire de déterminer le profil du fly-cutter (outil de taillage) qui servira à tailler un engrenage identique.
Si cela t'intéresse vas voir:
ICI
Cdlt
Ollivier, je n'ai pas compris ta question.
Les engrenages produits par le programme de LSI ont des dents symétriques et c'est le but recherché, comme ceux produits par le programme que j'avais moi-même écrit. Ces engrenages correspondent au profil dit en "développante de cercle", bien défini par une norme.
Si tu fais référence au programme sur lequel je travaille pour de la restauration d'engrenages je ne peux pas utiliser de qu'a fait LSI ni ce que j'avais fait sur le même sujet.
La restauration d'engrenages en horlogerie consiste à refaire des engrenages abîmés ou perdus. Ces engrenages sont de type "dit ogival". Sur les horloges anciennes ils ont des profils pas normalisés du tout car à l'époque chaque horloger avais sa propre norme. Il faut donc se créer u outil de taillage dans chaque cas rencontré.
Je viens de terminer le petit programme en PureBasic dont je parlais dans la citation que tu as faite.
Il permet a partir d'une photo de dents de l'engrenage à refaire de déterminer le profil du fly-cutter (outil de taillage) qui servira à tailler un engrenage identique.
Si cela t'intéresse vas voir:
ICI
Cdlt
Il faut savoir rire dans la tragédie et être profond dans la joie.