Comment faire des tracés sur image - Taillage d'engrenages.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
SULREN
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.

Message par SULREN »

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.
Il faut savoir rire dans la tragédie et être profond dans la joie.
Le Soldat Inconnu
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.

Message par Le Soldat Inconnu »

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)]
SULREN
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.

Message par SULREN »

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
Il faut savoir rire dans la tragédie et être profond dans la joie.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Comment faire des tracés sur image - Taillage d'engrenages.

Message par Ollivier »

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.
Salut. ça ne pose pas de problèmes si les dents présentées dans le programme de LSI ne sont pas asymétriques?

Ollivier
SULREN
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.

Message par SULREN »

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
Il faut savoir rire dans la tragédie et être profond dans la joie.
Répondre