Re: Comment faire des tracés sur image - Taillage d'engrenages.
Publié : ven. 26/févr./2010 22:32
Forums PureBasic - Français
https://www.purebasic.fr/french/
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
#G_Module
#G_Z
#G_Angle_Pression
#G_D_primitif
#G_D_pied
#G_D_tete
#G_H_dent
#G_Pas
#G_Zoom
#G_Dessin
#G_Angle
EndEnumeration
#Engrenage_ResolutionDent = 200
#Equation_Degree = 2
#Engrenage_Couleur = $FF00FFFF
#Engrenage_Diametre = $200000FF
#Engrenage2_Couleur = $FF0000FF
#Cremaillere_Couleur = $40FFFFFF
#Cremaillere_Hauteur = $400000FF
Structure Structure_Equation
x1.d
x2.d
v.d[#Equation_Degree + 1]
EndStructure
Structure Structure_Rayon
R.d
Angle.d
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
Contour.Structure_Rayon[#Engrenage_ResolutionDent]
Cremaillere.Structure_Equation[5]
Outil.Structure_Equation[5]
EndStructure
Global Engrenage.Structure_Engrenage
Procedure.s AfficheValeur(Valeur.d)
ProcedureReturn Trim(Trim(Trim(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 * \Module
\D_pied = \D_primitif - 2.5 * \Module
\Pas = #PI * \Module
\H_dent = 2.25 * \Module
;- Equation de la crémaillère
Largeur_zone_inclinee.d = 2.25 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_tete.d = \Pas / 2 - 2 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_pied.d = \Pas / 2 - 2.5 * \Module * Sin(\Angle_pression * #PI / 180)
; 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] = -2.25 * \Module / Largeur_zone_inclinee
\Cremaillere[1]\v[0] = \H_dent - \Cremaillere[1]\v[1] * Largeur_zone_tete / 2
; zone 3
\Cremaillere[2]\x1 = \Cremaillere[1]\x2
\Cremaillere[2]\x2 = \Cremaillere[2]\x1 + Largeur_zone_pied
; \Cremaillere[2]\v[2] = 2 * \Module / Largeur_zone_inclinee / Largeur_zone_pied
; \Cremaillere[2]\v[1] = \Cremaillere[1]\v[1] - 2 * \Cremaillere[2]\v[2] * \Cremaillere[2]\x1
; \Cremaillere[2]\v[0] = 0.25 * \Module - \Cremaillere[2]\v[2] * \Cremaillere[2]\x1 * \Cremaillere[2]\x1 - \Cremaillere[2]\v[1] * \Cremaillere[2]\x1
; Zone 4
\Cremaillere[3]\x1 = \Cremaillere[2]\x2
\Cremaillere[3]\x2 = \Cremaillere[3]\x1 + Largeur_zone_inclinee
\Cremaillere[3]\v[1] = 2.25 * \Module / Largeur_zone_inclinee
\Cremaillere[3]\v[0] = -\Cremaillere[3]\v[1] *(Largeur_zone_tete / 2 + Largeur_zone_inclinee + Largeur_zone_pied)
; Zone 5
\Cremaillere[4]\x1 = \Cremaillere[3]\x2
\Cremaillere[4]\x2 = \Pas
\Cremaillere[4]\v[0] = \H_dent
Largeur_zone_inclinee.d = 2.25 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_tete.d = \Pas / 2 - 2.5 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_pied.d = \Pas / 2 - 2 * \Module * Sin(\Angle_pression * #PI / 180)
; Zone 1
\Outil[0]\x1 = 0
\Outil[0]\x2 = Largeur_zone_tete / 2
\Outil[0]\v[0] = \H_dent + 0.25 * \Module
; zone 2
\Outil[1]\x1 = \Outil[0]\x2
\Outil[1]\x2 = \Outil[1]\x1 + Largeur_zone_inclinee
\Outil[1]\v[1] = -2.25 * \Module / Largeur_zone_inclinee
\Outil[1]\v[0] = \H_dent + 0.25 * \Module - \Outil[1]\v[1] * Largeur_zone_tete / 2
; zone 3
\Outil[2]\x1 = \Outil[1]\x2
\Outil[2]\x2 = \Outil[2]\x1 + Largeur_zone_pied
\Outil[2]\v[0] = 0.25 * \Module
; Zone 4
\Outil[3]\x1 = \Outil[2]\x2
\Outil[3]\x2 = \Outil[3]\x1 + Largeur_zone_inclinee
\Outil[3]\v[1] = 2.25 * \Module / Largeur_zone_inclinee
\Outil[3]\v[0] = 0.25 * \Module - \Outil[3]\v[1] *(Largeur_zone_tete / 2 + Largeur_zone_inclinee + Largeur_zone_pied)
; Zone 5
\Outil[4]\x1 = \Outil[3]\x2
\Outil[4]\x2 = \Pas
\Outil[4]\v[0] = \H_dent + 0.25 * \Module
; 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
;- Affichage des résultats
SetGadgetText(#G_D_primitif, AfficheValeur(Engrenage\D_primitif))
SetGadgetText(#G_D_tete, AfficheValeur(Engrenage\D_tete))
SetGadgetText(#G_D_pied, AfficheValeur(Engrenage\D_pied))
SetGadgetText(#G_H_dent, AfficheValeur(Engrenage\H_dent))
SetGadgetText(#G_Pas, AfficheValeur(Engrenage\Pas))
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
Angle_reel.d = x * 2 * #PI / #Engrenage_ResolutionDent / \Z
x_reel.d = \D_primitif * Angle_reel / 2
While x_reel >= \Pas And \Pas > 0
x_reel - \Pas
Wend
If x_reel < 0
x_reel = 0
EndIf
For n = 0 To 4
If x_reel >= \Outil[n]\x1 And x_reel < \Outil[n]\x2
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
Break
EndIf
Next
\Contour[x]\R =(\D_primitif / 2 + 1.25 * \Module) - y_reel
If \Contour[x]\R > \D_tete / 2
\Contour[x]\R = \D_tete / 2
EndIf
If \Contour[x]\R < \D_pied / 2
\Contour[x]\R = \D_pied / 2
EndIf
\Contour[x]\Angle = x * 2 * #PI / #Engrenage_ResolutionDent / \Z
Next
;- Correction de l'angle
; Centre de l'engrenage
x_reel.d = 0
y_reel.d =(\D_primitif / 2 + 1.25 * \Module)
Correction.d = 1 / #Engrenage_ResolutionDent / \Z
For Z = -#Engrenage_ResolutionDent * \Z / 8 To #Engrenage_ResolutionDent * \Z / 8
Angle.d = Z * 2 * #PI / #Engrenage_ResolutionDent / \Z
For x = 0 To #Engrenage_ResolutionDent - 1
Repeat
Angle_reel.d = \Contour[x]\Angle + Angle
x1_reel.d = x_reel + \Contour[x]\R * Sin(Angle_reel) - \D_primitif * Angle / 2
y1_reel.d = y_reel - \Contour[x]\R * Cos(Angle_reel)
While x1_reel >= \Pas And \Pas > 0
x1_reel - \Pas
Wend
If x1_reel < 0
x1_reel = 0
EndIf
For n = 0 To 4
If x1_reel >= \Outil[n]\x1 And x1_reel < \Outil[n]\x2
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
Break
EndIf
Next
If y1_reel < y2_reel
If x1_reel < \Pas / 2
\Contour[x]\Angle + Correction
Else
\Contour[x]\Angle - Correction
EndIf
EndIf
Until y1_reel >= y2_reel
Next
Next
EndIf
EndWith
EndProcedure
Procedure Engrenage_Dessin(Gadget, Image, *Calcul.Structure_Engrenage, Angle.d, Zoom.d = 0)
; Calcul du diamètre de l'engrenage
; Engrenage_Diametre(@*Calcul.Structure_Engrenage, Angle.d)
LoadFont(1, "Tahoma", 9 * FiltreAA, #PB_Font_HighQuality)
With * Calcul
Largeur = ImageWidth(Image) * FiltreAA
Hauteur = ImageHeight(Image) * FiltreAA
Echelle.d =(2 * \Pas *(1 - Zoom) + \D_tete * Zoom) /(Largeur - 32 * FiltreAA)
x0 = Largeur / 2
y0 = Hauteur / 3 - 1.25 * \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
; Centre de l'engrenage
x_reel.d = 0
y_reel.d =(\D_primitif / 2 + 1.25 * \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
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
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)
; 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)
; Dessin de la crémaillère et de l'outil
For x = 0 To Largeur - 1
x_reel.d =(x - x0) * Echelle - Avance
If x_reel < 0
x_reel = -x_reel
EndIf
While x_reel >= \Pas And \Pas > 0
x_reel - \Pas
Wend
If x_reel < 0
x_reel = 0
EndIf
; Dessin de la crémaillère
For n = 0 To 4
If x_reel >= \Cremaillere[n]\x1 And x_reel < \Cremaillere[n]\x2
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
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 4
If x_reel >= \Outil[n]\x1 And x_reel < \Outil[n]\x2
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
Break
EndIf
Next
y = y_reel / Echelle + y0
LineXY(x, y, x, 0, #Cremaillere_Couleur)
Next
; Centre de l'engrenage
x_reel.d = 0
y_reel.d =(\D_primitif / 2 + 1.25 * \Module)
; Dessin du diametre de pied
Circle(x0, y0 + y_reel / Echelle,(\D_pied / 2) / 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 +(1.25 * \Module) / Echelle - FiltreAA / 2, Largeur, FiltreAA, #Cremaillere_Hauteur)
; Dessin du diametre de tête
Circle(x0, y0 + y_reel / Echelle,(\D_tete / 2) / 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)
; Centre de l'engrenage
x_reel.d = 0
y_reel.d = (1.25 * \Module - \D_primitif / 2)
; 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
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
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)
; 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
StopDrawing()
If FiltreAA > 1
ResizeImage(Image, Largeur / FiltreAA, Hauteur / FiltreAA, #PB_Image_Smooth)
EndIf
SetGadgetState(#G_Dessin, ImageID(0))
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
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 = 13
Engrenage\Angle_pression = 20
x = 4
y = 4
Largeur = 192
TextGadget(#PB_Any, x, y, Largeur, 16, "Module")
y + 16
StringGadget(#G_Module, x, y, Largeur, 24, AfficheValeur(Engrenage\Module))
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Z (Nombre de dents)")
y + 16
StringGadget(#G_Z, x, y, Largeur, 24, AfficheValeur(Engrenage\Z))
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Angle de pression (en °)")
y + 16
StringGadget(#G_Angle_Pression, x, y, Largeur, 24, AfficheValeur(Engrenage\Angle_pression))
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Diamètre primitif")
y + 16
StringGadget(#G_D_primitif, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Diamètre de tête")
y + 16
StringGadget(#G_D_tete, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Diamètre de pied")
y + 16
StringGadget(#G_D_pied, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Hauteur de dent")
y + 16
StringGadget(#G_H_dent, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Pas")
y + 16
StringGadget(#G_Pas, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
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, 36, #PB_TrackBar_Ticks)
Dessin_Angle.d = 0
y + 32
CreateImage(0, 600 - 8, 600 - 8, 24)
ImageGadget(#G_Dessin, 204, 4, 0, 0, ImageID(0))
Engrenage_Calcul(@Engrenage)
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
If EventType() = #PB_EventType_Change
Engrenage\Module = ValD(GetGadgetText(#G_Module))
Engrenage\Z = ValD(GetGadgetText(#G_Z))
Engrenage\Angle_pression = ValD(GetGadgetText(#G_Angle_Pression))
Engrenage_Calcul(@Engrenage)
Engrenage_Diametre(@Engrenage)
Dessin + 1
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
; Fermeture de thread
Dessin = -1
While IsThread(Thread)
Delay(10)
Wend
On peut descendre à 6 dents dans le profil en développante de cercle. Il y en a à 6 dents dans les ponts roulants. En voici un (qui va intriguer le Soldat):De mémoire, les pignons de vélos des roues arrières ne descendaient guère au dessous des 11 dents
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
#G_Module
#G_Z
#G_Angle_Pression
#G_D_primitif
#G_D_pied
#G_D_tete
#G_H_dent
#G_Pas
#G_Zoom
#G_Dessin
#G_Angle
EndEnumeration
#Engrenage_ResolutionDent = 200
#Equation_Degree = 2
#Engrenage_Couleur = $FF00FFFF
#Engrenage_Diametre = $200000FF
#Engrenage2_Couleur = $FF0000FF
#Cremaillere_Couleur = $40FFFFFF
#Cremaillere_Hauteur = $400000FF
Structure Structure_Equation
x1.d
x2.d
v.d[#Equation_Degree + 1]
EndStructure
Structure Structure_Rayon
R.d
Angle.d
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
Contour.Structure_Rayon[#Engrenage_ResolutionDent]
Cremaillere.Structure_Equation[5]
Outil.Structure_Equation[5]
EndStructure
Global Engrenage.Structure_Engrenage
Procedure.s AfficheValeur(Valeur.d)
ProcedureReturn Trim(Trim(Trim(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 * \Module
\D_pied = \D_primitif - 2.5 * \Module
\Pas = #PI * \Module
\H_dent = 2.25 * \Module
;- Equation de la crémaillère
Largeur_zone_inclinee.d = 2.25 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_tete.d = \Pas / 2 - 2 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_pied.d = \Pas / 2 - 2.5 * \Module * Sin(\Angle_pression * #PI / 180)
; 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] = -2.25 * \Module / Largeur_zone_inclinee
\Cremaillere[1]\v[0] = \H_dent - \Cremaillere[1]\v[1] * Largeur_zone_tete / 2
; zone 3
\Cremaillere[2]\x1 = \Cremaillere[1]\x2
\Cremaillere[2]\x2 = \Cremaillere[2]\x1 + Largeur_zone_pied
; \Cremaillere[2]\v[2] = 2 * \Module / Largeur_zone_inclinee / Largeur_zone_pied
; \Cremaillere[2]\v[1] = \Cremaillere[1]\v[1] - 2 * \Cremaillere[2]\v[2] * \Cremaillere[2]\x1
; \Cremaillere[2]\v[0] = 0.25 * \Module - \Cremaillere[2]\v[2] * \Cremaillere[2]\x1 * \Cremaillere[2]\x1 - \Cremaillere[2]\v[1] * \Cremaillere[2]\x1
; Zone 4
\Cremaillere[3]\x1 = \Cremaillere[2]\x2
\Cremaillere[3]\x2 = \Cremaillere[3]\x1 + Largeur_zone_inclinee
\Cremaillere[3]\v[1] = 2.25 * \Module / Largeur_zone_inclinee
\Cremaillere[3]\v[0] = -\Cremaillere[3]\v[1] *(Largeur_zone_tete / 2 + Largeur_zone_inclinee + Largeur_zone_pied)
; Zone 5
\Cremaillere[4]\x1 = \Cremaillere[3]\x2
\Cremaillere[4]\x2 = \Pas
\Cremaillere[4]\v[0] = \H_dent
Largeur_zone_inclinee.d = 2.25 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_tete.d = \Pas / 2 - 2.5 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_pied.d = \Pas / 2 - 2 * \Module * Sin(\Angle_pression * #PI / 180)
; Zone 1
\Outil[0]\x1 = 0
\Outil[0]\x2 = Largeur_zone_tete / 2
\Outil[0]\v[0] = \H_dent + 0.25 * \Module
; zone 2
\Outil[1]\x1 = \Outil[0]\x2
\Outil[1]\x2 = \Outil[1]\x1 + Largeur_zone_inclinee
\Outil[1]\v[1] = -2.25 * \Module / Largeur_zone_inclinee
\Outil[1]\v[0] = \H_dent + 0.25 * \Module - \Outil[1]\v[1] * Largeur_zone_tete / 2
; zone 3
\Outil[2]\x1 = \Outil[1]\x2
\Outil[2]\x2 = \Outil[2]\x1 + Largeur_zone_pied
\Outil[2]\v[0] = 0.25 * \Module
; Zone 4
\Outil[3]\x1 = \Outil[2]\x2
\Outil[3]\x2 = \Outil[3]\x1 + Largeur_zone_inclinee
\Outil[3]\v[1] = 2.25 * \Module / Largeur_zone_inclinee
\Outil[3]\v[0] = 0.25 * \Module - \Outil[3]\v[1] *(Largeur_zone_tete / 2 + Largeur_zone_inclinee + Largeur_zone_pied)
; Zone 5
\Outil[4]\x1 = \Outil[3]\x2
\Outil[4]\x2 = \Pas
\Outil[4]\v[0] = \H_dent + 0.25 * \Module
; CopyMemory(@\Cremaillere, @\Outil, SizeOf(Structure_Equation) * 5)
; 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
;- Affichage des résultats
SetGadgetText(#G_D_primitif, AfficheValeur(Engrenage\D_primitif))
SetGadgetText(#G_D_tete, AfficheValeur(Engrenage\D_tete))
SetGadgetText(#G_D_pied, AfficheValeur(Engrenage\D_pied))
SetGadgetText(#G_H_dent, AfficheValeur(Engrenage\H_dent))
SetGadgetText(#G_Pas, AfficheValeur(Engrenage\Pas))
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
Angle_reel.d = x * 2 * #PI / #Engrenage_ResolutionDent / \Z
x_reel.d = \D_primitif * Angle_reel / 2
While x_reel >= \Pas And \Pas > 0
x_reel - \Pas
Wend
If x_reel < 0
x_reel = 0
EndIf
For n = 0 To 4
If x_reel >= \Outil[n]\x1 And x_reel < \Outil[n]\x2
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
Break
EndIf
Next
\Contour[x]\R =(\D_primitif / 2 + 1.25 * \Module) - y_reel
If \Contour[x]\R > \D_tete / 2
\Contour[x]\R = \D_tete / 2
EndIf
If \Contour[x]\R < \D_pied / 2
\Contour[x]\R = \D_pied / 2
EndIf
\Contour[x]\Angle = x * 2 * #PI / #Engrenage_ResolutionDent / \Z
Next
;- Correction de l'angle
; Centre de l'engrenage
x_reel.d = 0
y_reel.d =(\D_primitif / 2 + 1.25 * \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
; Correction positive
Angle_correction_p.d = \Contour[x]\Angle
Repeat
Angle_reel.d = Angle_correction_p + 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 4
If x1_reel >= \Outil[n]\x1 And x1_reel < \Outil[n]\x2
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
Break
EndIf
Next
If y1_reel < y2_reel
Angle_correction_p + Correction
EndIf
Until y1_reel >= y2_reel
; Correction négative
Angle_correction_n.d = \Contour[x]\Angle
Repeat
Angle_reel.d = Angle_correction_n + 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 4
If x1_reel >= \Outil[n]\x1 And x1_reel < \Outil[n]\x2
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
Break
EndIf
Next
If y1_reel < y2_reel
Angle_correction_n - Correction
EndIf
Until y1_reel >= y2_reel
; Choix de la corretion
If \Contour[x]\Angle - Angle_correction_n < Angle_correction_p - \Contour[x]\Angle
\Contour[x]\Angle = Angle_correction_n
Else
\Contour[x]\Angle = Angle_correction_p
EndIf
Next
Next
EndIf
EndWith
EndProcedure
Procedure Engrenage_Dessin(Gadget, Image, *Calcul.Structure_Engrenage, Angle.d, Zoom.d = 0)
; Calcul du diamètre de l'engrenage
; Engrenage_Diametre(@*Calcul.Structure_Engrenage, Angle.d)
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 - 1.25 * \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 + 1.25 * \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
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
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 4
If x_reel >= \Cremaillere[n]\x1 And x_reel < \Cremaillere[n]\x2
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
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 4
If x_reel >= \Outil[n]\x1 And x_reel < \Outil[n]\x2
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
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 + 1.25 * \Module)
; Dessin du diametre de pied
Circle(x0, y0 + y_reel / Echelle,(\D_pied / 2) / 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 +(1.25 * \Module) / Echelle - FiltreAA / 2, Largeur, FiltreAA, #Cremaillere_Hauteur)
; Dessin du diametre de tête
Circle(x0, y0 + y_reel / Echelle,(\D_tete / 2) / 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 =(1.25 * \Module - \D_primitif / 2)
; 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
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
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
x = 4
y = 4
Largeur = 192
TextGadget(#PB_Any, x, y, Largeur, 16, "Module")
y + 16
StringGadget(#G_Module, x, y, Largeur, 24, AfficheValeur(Engrenage\Module))
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Z (Nombre de dents)")
y + 16
StringGadget(#G_Z, x, y, Largeur, 24, AfficheValeur(Engrenage\Z))
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Angle de pression (en °)")
y + 16
StringGadget(#G_Angle_Pression, x, y, Largeur, 24, AfficheValeur(Engrenage\Angle_pression))
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Diamètre primitif")
y + 16
StringGadget(#G_D_primitif, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Diamètre de tête")
y + 16
StringGadget(#G_D_tete, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Diamètre de pied")
y + 16
StringGadget(#G_D_pied, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Hauteur de dent")
y + 16
StringGadget(#G_H_dent, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Pas")
y + 16
StringGadget(#G_Pas, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
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, 36, #PB_TrackBar_Ticks)
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_Calcul(@Engrenage)
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
If EventType() = #PB_EventType_Change
Engrenage\Module = ValD(GetGadgetText(#G_Module))
Engrenage\Z = ValD(GetGadgetText(#G_Z))
Engrenage\Angle_pression = ValD(GetGadgetText(#G_Angle_Pression))
Engrenage_Calcul(@Engrenage)
Engrenage_Diametre(@Engrenage)
Dessin + 1
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
Vas bien sûr chercher des infos sur le sujet, ne serait-ce que pour vérifier ce que je dis, car nul, n’est à l’ abri d’une erreur, même un gars rigoureux. Quand j’ai eu à faire ces recherches il y a une paire d’années, j’y ai passé beaucoup de temps parce qu’il n’existait aucun document de synthèse. La norme AFNOR que j’ai n’en parle pas non plus.par contre, moi, je n'ai pas de déport. Mais ça peut s'intégrer. Faut que je fouille.
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
#G_Module
#G_Z
#G_Angle_Pression
#G_D_primitif
#G_D_pied
#G_D_tete
#G_H_dent
#G_Pas
#G_Deport
#G_Zoom
#G_Dessin
#G_Angle
EndEnumeration
#Engrenage_ResolutionDent = 314
#Equation_Degree = 2
#Engrenage_Couleur = $FF00FFFF
#Engrenage_Diametre = $200000FF
#Engrenage2_Couleur = $FF0000FF
#Cremaillere_Couleur = $40FFFFFF
#Cremaillere_Hauteur = $400000FF
Structure Structure_Cercle
x.d
y.d
R.d
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
Contour.Structure_Rayon[#Engrenage_ResolutionDent]
Cremaillere.Structure_Equation[5]
Outil.Structure_Equation[5]
EndStructure
Global Engrenage.Structure_Engrenage
Procedure.s AfficheValeur(Valeur.d)
ProcedureReturn Trim(Trim(Trim(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 * \Module
\D_pied = \D_primitif - 2.5 * \Module
\Pas = #PI * \Module
\H_dent = 2.25 * \Module
;- Equation de la crémaillère
Largeur_zone_inclinee.d = 2.25 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_tete.d = \Pas / 2 - 2 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_pied.d = \Pas / 2 - 2.5 * \Module * Sin(\Angle_pression * #PI / 180)
; 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] = -2.25 * \Module / Largeur_zone_inclinee
\Cremaillere[1]\v[0] = \H_dent - \Cremaillere[1]\v[1] * Largeur_zone_tete / 2
; zone 3
\Cremaillere[2]\x1 = \Cremaillere[1]\x2
\Cremaillere[2]\x2 = \Cremaillere[2]\x1 + Largeur_zone_pied
; \Cremaillere[2]\v[2] = 2 * \Module / Largeur_zone_inclinee / Largeur_zone_pied
; \Cremaillere[2]\v[1] = \Cremaillere[1]\v[1] - 2 * \Cremaillere[2]\v[2] * \Cremaillere[2]\x1
; \Cremaillere[2]\v[0] = 0.25 * \Module - \Cremaillere[2]\v[2] * \Cremaillere[2]\x1 * \Cremaillere[2]\x1 - \Cremaillere[2]\v[1] * \Cremaillere[2]\x1
; Zone 4
\Cremaillere[3]\x1 = \Cremaillere[2]\x2
\Cremaillere[3]\x2 = \Cremaillere[3]\x1 + Largeur_zone_inclinee
\Cremaillere[3]\v[1] = 2.25 * \Module / Largeur_zone_inclinee
\Cremaillere[3]\v[0] = -\Cremaillere[3]\v[1] *(Largeur_zone_tete / 2 + Largeur_zone_inclinee + Largeur_zone_pied)
; Zone 5
\Cremaillere[4]\x1 = \Cremaillere[3]\x2
\Cremaillere[4]\x2 = \Pas
\Cremaillere[4]\v[0] = \H_dent
Largeur_zone_inclinee.d = 2.25 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_tete.d = \Pas / 2 - 2.5 * \Module * Sin(\Angle_pression * #PI / 180)
Largeur_zone_pied.d = \Pas / 2 - 2 * \Module * Sin(\Angle_pression * #PI / 180)
; Zone 1
\Outil[0]\x1 = 0
\Outil[0]\x2 = Largeur_zone_tete / 2
\Outil[0]\v[0] = \H_dent + 0.25 * \Module
; zone 2
\Outil[1]\x1 = \Outil[0]\x2
\Outil[1]\x2 = \Outil[1]\x1 + Largeur_zone_inclinee
\Outil[1]\v[1] = -2.25 * \Module / Largeur_zone_inclinee
\Outil[1]\v[0] = \H_dent + 0.25 * \Module - \Outil[1]\v[1] * Largeur_zone_tete / 2
; zone 3
\Outil[2]\x1 = \Outil[1]\x2
\Outil[2]\x2 = \Outil[2]\x1 + Largeur_zone_pied
\Outil[2]\v[0] = 0.25 * \Module
; Zone 4
\Outil[3]\x1 = \Outil[2]\x2
\Outil[3]\x2 = \Outil[3]\x1 + Largeur_zone_inclinee
\Outil[3]\v[1] = 2.25 * \Module / Largeur_zone_inclinee
\Outil[3]\v[0] = 0.25 * \Module - \Outil[3]\v[1] *(Largeur_zone_tete / 2 + Largeur_zone_inclinee + Largeur_zone_pied)
; Zone 5
\Outil[4]\x1 = \Outil[3]\x2
\Outil[4]\x2 = \Pas
\Outil[4]\v[0] = \H_dent + 0.25 * \Module
; CopyMemory(@\Cremaillere, @\Outil, SizeOf(Structure_Equation) * 5)
; 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
;- Affichage des résultats
SetGadgetText(#G_D_primitif, AfficheValeur(Engrenage\D_primitif))
SetGadgetText(#G_D_tete, AfficheValeur(Engrenage\D_tete))
SetGadgetText(#G_D_pied, AfficheValeur(Engrenage\D_pied))
SetGadgetText(#G_H_dent, AfficheValeur(Engrenage\H_dent))
SetGadgetText(#G_Pas, AfficheValeur(Engrenage\Pas))
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 4
If x_reel >= \Outil[n]\x1 And x_reel < \Outil[n]\x2
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
Break
EndIf
Next
\Contour[x]\R =(\D_primitif / 2 + 1.25 * \Module) + \Deport - y_reel
If \Contour[x]\R > \D_tete / 2 + \Deport
\Contour[x]\R = \D_tete / 2 + \Deport
EndIf
If \Contour[x]\R < \D_pied / 2 + \Deport
\Contour[x]\R = \D_pied / 2 + \Deport
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 + 1.25 * \Module) + \Deport
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 4
If x1_reel >= \Outil[n]\x1 And x1_reel < \Outil[n]\x2
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
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)
; Calcul du diamètre de l'engrenage
; Engrenage_Diametre(@*Calcul.Structure_Engrenage, Angle.d)
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 - 1.25 * \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 + 1.25 * \Module) + \Deport
; 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 4
If x_reel >= \Cremaillere[n]\x1 And x_reel < \Cremaillere[n]\x2
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
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 4
If x_reel >= \Outil[n]\x1 And x_reel < \Outil[n]\x2
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
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 + 1.25 * \Module) + \Deport
; Dessin du diametre de pied
Circle(x0, y0 + y_reel / Echelle,(\D_pied / 2) / 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 +(1.25 * \Module) / Echelle - FiltreAA / 2, Largeur, FiltreAA, #Cremaillere_Hauteur)
; Dessin du diametre de tête
Circle(x0, y0 + y_reel / Echelle,(\D_tete / 2) / 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 =(1.25 * \Module - \D_primitif / 2) - \Deport
; 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
x = 4
y = 4
Largeur = 192
TextGadget(#PB_Any, x, y, Largeur, 16, "Module")
y + 16
StringGadget(#G_Module, x, y, Largeur, 24, AfficheValeur(Engrenage\Module))
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Z (Nombre de dents)")
y + 16
StringGadget(#G_Z, x, y, Largeur, 24, AfficheValeur(Engrenage\Z))
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Angle de pression (en °)")
y + 16
StringGadget(#G_Angle_Pression, x, y, Largeur, 24, AfficheValeur(Engrenage\Angle_pression))
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Déport (en mm)")
y + 16
StringGadget(#G_Deport, x, y, Largeur, 24, AfficheValeur(Engrenage\Deport))
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Diamètre primitif")
y + 16
StringGadget(#G_D_primitif, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Diamètre de tête")
y + 16
StringGadget(#G_D_tete, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Diamètre de pied")
y + 16
StringGadget(#G_D_pied, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Hauteur de dent")
y + 16
StringGadget(#G_H_dent, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
y + 8
TextGadget(#PB_Any, x, y, Largeur, 16, "Pas")
y + 16
StringGadget(#G_Pas, x, y, Largeur, 24, "", #PB_String_ReadOnly)
y + 24
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_Calcul(@Engrenage)
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
If EventType() = #PB_EventType_Change
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))
Engrenage_Calcul(@Engrenage)
Engrenage_Diametre(@Engrenage)
Dessin + 1
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