Page 2 sur 2

Publié : mar. 09/déc./2008 17:54
par GUELLIL
Voila un sous programme qui ne fonctionne pas et qui me fait penser que je ne maitriserai jamais les fenêtres.
Après avoir taillé une dent par "génération" avec le programme qui la fait tangenter une crémaillère en translation, j'ai ajouté ce petit sous-programme voir visualiser à la fin du travail la roue complète reconstituée et pas seulement une dent. Ce sous-programme plante. Par contre si j'inhibe la grande boucle For Next, celle de 1 to N, il tourne et m'affiche la fenêtre, en ne montrant qu'une seule dent bien sûr).
(désolé je ne sais pas insérer un programme PB)


de Dobro :

Réedite ce message (bouton Editer)
pour voir comment j'ai ajouté les balises de code
[ code] et [ /code]
il te faut absolument utiliser ces balises pour présenter tes codes sur le Forum Merci ...

Code : Tout sélectionner

ReconstitutionRoue:
If OpenWindow(0, 500, 100, 800, 800, "2D Drawing Test")
  If CreateImage(0, 800, 800)
    If StartDrawing(ImageOutput(0))
      FrontColor(RGB(255,0,0)) ; Finally, red lines
      ;Dessin axes de coordonnées
      LineXY(400,0,400,800,RGB(255,0,0))
      LineXY(0,400,800,400,RGB(255,0,0))
      ;DESSIN DE LA ROUE COMPLETE;  
       For n=1 To N ;Boucle reconstitution des N dents
       ArotRE0=ArotRE0+2*pi/N
       For i=1 To DimTE ;Recalcul de tous les rayons 
       ArotRE(i)=ArepRE(i)+ArotRE0
       Next 
           For i=1 To DimTE ;Calcul coordonneés paramétriques de tous les rayons
           xCE.f=0         
           ArotRE(i)=ArepRE(i)+ArotRE0
           xRE(i)=xCE+LRE(i)*Cos(ArotRE(i))
           yRE(i)=yCE+LRE(i)*Sin(ArotRE(i))
           Next           
           For i=1 To 201   ;Mise à l'échelle des pixels de la fenêtre
           xRE(i)=40*xRE(i)+400
           yRE(i)=-40*yRE(i)+400
           Next
           For k=1 To DimTE-1  ;Dessin des segments qui lient les extrémités des rayons
           LineXY(xRE(k),yRE(k),xRE(k+1),yRE(k+1), RGB(0,255,0))                                                         
           Next
           For k=1 To DimTE  ;Dessin de tous les rayons
           LineXY(xRE(k),yRE(k),400,40*m*N/2+400, RGB(0,255,0))
           Next
      Next    
      DrawingMode(#PB_2DDrawing_Transparent)
      BackColor(RGB(0,155,155)) ; Change the text back and front colour
      FrontColor(RGB(255,255,255)) 
      StopDrawing()
    EndIf
  EndIf
  ImageGadget(0, 0, 0, 0, 0, ImageID(0))
  Repeat
    EventID = WaitWindowEvent() 
  Until EventID = #PB_Event_CloseWindow  ; If the user has pressed on the window close button
EndIf
Return

Publié : mar. 09/déc./2008 18:13
par Backup
ps dommage que ton code ne soit pas complet ... :?

prends l'habitude de mettre du code fonctionnel !!

la deja il nous manque ArotRE(i)

qui je supose doit etre un tableau... :?
mais quel dimension ??

bref , si tu veux un coup de main , essaye de mettre un code complet !!
meme avec des erreurs :)

Publié : mar. 09/déc./2008 18:13
par Stefou
Salut le traceur !

Bon voilà un petit exemple qui j'éspère te fera avançer (ou alors je n'ai rien compris à ton problème)

La thread te permet de faire un calcul en parallèle de l'affichage et l'inter activité avec la fenêtre.

Bon courage

Code : Tout sélectionner

Global para1

Procedure Calcul_long()
  i.f=0
  Repeat
    Delay(10) ;delay juste la pour allonger le calcul, il faudra bien sur le retirer
    i=i+0.1
    
    StartDrawing(ImageOutput(0))
      Plot(i,i*para1,$6ADEE8)
    StopDrawing()
    SetGadgetState(0,ImageID(0))
    
  Until i=200
EndProcedure

  

OpenWindow(0,0,0,400,400,"Calcul",#PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
ImageGadget(0,0,20,10,10,0)
ButtonGadget(1,0,0,80,18,"Lancer")

StringGadget(2,100,0,40,18,"1")
ButtonGadget(3,150,0,80,18,"Stop")

Repeat
  event=WaitWindowEvent()
  Select event
    Case #PB_Event_Gadget
      id_gadget=EventGadget()
      Select id_gadget
        Case 1
          para1=Val(GetGadgetText(2))
          CreateImage(0,300,300)
          thread=CreateThread(@Calcul_long(),1)
        Case 3
          If IsThread(thread)
            KillThread(thread)
          EndIf
          
          
      EndSelect
  EndSelect
  
  
Until event=#WM_CLOSE
    
    


Publié : mar. 09/déc./2008 20:01
par djes
A priori le programme a l'air bon. Un moyen simple de trouver l'erreur est de commenter qq lignes, d'essayer, et de décommenter au fur et à mesure jusqu'à ce que tu trouves le fautif. Là, je pense à un dépassement des limites de l'image. Les coordonnées d'une image 800x800 vont de 0 à 799. Si tu dépasses, il y a risque d'écrasement d'autres données en mémoire.
Sinon, avec le debugger activé, tu ajoutes un calldebugger au début de la boucle, tu lances ton programme, et quand il a stoppé sur le calldebugger tu exécutes la suite pas à pas pour trouver quelle ligne est en cause. Tu peux aussi visualiser tes variables et tes tableaux.

Publié : mar. 09/déc./2008 23:12
par GUELLIL
Merci d’avoir cherché djes.
Je viens de trouver l’erreur. Elle est stupide de stupide et j’en ai honte. :oops:
C’est toujours pareil : pour le programme principal qui consiste à gérer l’intersection entre deux objets 2D et qui est difficile, j’ai fait un dossier d’analyse très solide et je l'ai bien vérifié avant d’attaquer le code.
Pour le petit sous-programme auxiliaire que je vous ai soumis parce qu’il ne marchait pas, je n’ai pas fait d’analyse et j’ai pondu directement les lignes, parce que je le jugeais facile. Résultat : la boucle For Next plantait parce que j’ai utilisé « n » comme indice de la boucle, alors que N est déjà une variable du programme principal (c’est le nombre de dents des engrenages à tailler). On prend toujours N en mécanique. C’est embêtant parce que en Maths n est souvent pris comme indice. J’ai remis une autre lettre et ça marche. Comme je n’ai pas confiance dans ma connaissance des fenêtres j'ai pensé à quelque chose de plus subtile et j'ai capitulé.

Mon programme de génération d’engrenages en développante de cercle par engrènement d’un disque à tailler avec la crémaillère de référence marche du feu de Dieu. Je suis fier comme Bartabac !
En résolvant ainsi le problème de la collision en 2D de deux mobiles définis en vectoriel, j’ai créé un cœur de programme qui va me permettre de créer plein d’autres pièces en horlogerie : Came d’Equation du Temps, limaçon des heures, etc.

Ces fonctionnalités existent dans les logiciels de CAO comme TellWatch, mais ils ne me sont pas accessibles. De plus en créant moi-même mes outils informatiques et en rédigeant un solide dossier d’analyse je ne dépends pas des changements de version de logiciel, d’OS, d’incompatibilité, etc. Je pourrai toujours réécrire rapidement mon programme dans un autre langage si PureBasic me laisse tomber un jour (mais nous avons tous confiance en Fred ; don’t we ?)
Je vous posterai des images de la « collision en direct» de mes deux pièces quand je saurai sortir des fichiers .bmp ou .jpeg avec PB.

Autre question : comment remplir de couleur un surface définie par un polygone ?
Encore merci à tous.

Publié : mer. 10/déc./2008 0:09
par djes
Ça a l'air vraiment génial! J'ai hâte de voir le résultat de ton programme! L'horlogerie semble tellement mystérieuse, si complexe, et puis elle est à l'origine de nos ordinateurs :) Je me souviens quand tout gamin j'avais démonté l'horloge de mes grands parents pour en récupérer les rubis (je voulais faire un laser) ; devant la complexité de la tâche j'avais bien sûr renoncé et tenté de remonter l'engin, sans succès, comme toujours! :lol:

Pour les polygones, regarde là : http://www.purebasic.fr/english/viewtop ... ed+polygon
Il y a d'autres trucs pour le faire, Dobro doit avoir des codes miracle planqués quelque part.

Publié : mer. 10/déc./2008 7:56
par Backup
....

Publié : mer. 10/déc./2008 15:11
par kernadec
bonjour Cool Dji
Pour remplacer la fonction drawmode(x) de PB avec les fonctions API
Il faut utiliser avec la fonction API « SetROP2 «
Exemple :

Code : Tout sélectionner

SelectObject_(hdc,brush
nDrawMode=SetROP2_(hdc,#R2_MASKPEN)

 PolyBezier_(hdc,*points,4)

SetROP2_(hdc,nDrawMode)
DeleteObject_(pen)

setROP2()
setROP2(hdc,int nROP)
identificateur couleur du point

R2_BLACK toujours noire (valeur 0)
R2_COPYPEN fournie par le stylo (valeur par defaut
R2_MASKCOPEN fournie par la couleur commune a l’écran et à l’inverse du stylo
R2_MASKPEN fournie par la couleur commune a l’écran et de celle du stylo
R2_MASKPENNOT fournie par la couleur commune à l’inverse de l’écran et au stylo
R2_MERGENOTPEN fournie par la combinaison de la couleur écran et de l’inverse du stylo
R2_MERGEPEN fournie par la combinaison de la couleur de l’écran et de celle du stylo
R2_MERGEPENNOT fournie par la combinaison de l’inverse de la couleur de l’écran de celle du stylo
R2_NOP inchangée
R2_NOT inverse la couleur de l’écran
R2_NOTCOPYPEN inverse la couleur du stylo
R2_NOTMASKPEN inverse la couleur fournie par R2_MASKPEN
R2_NOTMERGEPEN inverse la couleur fournie par R2_MERGEPEN
R2_NOTXORPEN inverse la couleur fournie par R2_XORPEN
R2_WHITE toujours blanche (valeur 1)
R2_XORPEN est fournie par la combinaison des couleurs de l’écran et du stylo
Mais pas les deux en même temps

Publié : dim. 14/déc./2008 19:59
par GUELLIL
Bonjour à tous,

En remerciement pour l'aide que j'ai reçue de vous et particulièrement de djes et Dobro, j'avais promis de montrer les résultats de mon dernier programme en PB.
Vous les trouverez dans le fichier ".pdf" ci joint, si j'ai bien mis le lien et si vous arrivez à l'ouvrir. Si vous n'y arrivez pas dites le moi SVP. J'essaierai de rectifier.
A partir de la deuxième page vous verrez les "belles images" de cette application de taillage d'engrenages.

Mon pseudo dans le fichier ci-joint apparait comme TOKEI et pas Guellil, parce que c'est celui que j'utilise sur mon forum horloger ou ces images devront aussi aller un jour. Quand je me suis inscrit sur le forum PB je me suis fait jeter avec mon pseudo, je ne sais pas pourquoi et j'ai pris Guellil, un peu au hasard.
Les images sont en basse résolution pour des questions de place.

http://tokei.ifrance.com/GenFly_Cutter.pdf

@+

Publié : dim. 14/déc./2008 23:22
par djes
C'est super gentil! La plupart du temps, les sujets restent ouverts car les gens ne prennent pas le temps de remercier ou de dire où ils en sont. Là, on voit! En plus c'est beau!
Je suis assez spécialisé en programmation graphique, même si j'utilise plus particulièrement les sprites et mes propres routines de ligne/3D etc. Cependant il doit être possible de t'aider pour ton projet. Je pense que quelques gadgets avec un écran graphique à côté te permettraient de peaufiner ton interface.
Pour la création de fichiers AVI, je n'en sais strictement rien! Il faudrait faire une recherche, peut-être sur le forum anglais. Au pire il doit être possible de sauver une suite d'images et de piloter un programme genre vlc qui recollerait tout ça.

Publié : dim. 14/déc./2008 23:40
par GUELLIL
Merci pour ton gentil message.
Au pire il doit être possible de sauver une suite d'images et de piloter un programme genre vlc qui recollerait tout ça.
Oui je pense m'en sortir comme cela.

Quant au programme dont j'ai montré le résultat dans mon post précédent je n'ai pas besoin d'en améliorer le graphisme car maintenant que l'applique est au point seul le fichier de sortie qui définit le profil du fly-cutter m'intéresse.
Je lance le programme, rentre mes deux données et récupère de fichier de sortie pour exploitation dans la suite du processus de fabrication.
@+

Publié : lun. 15/déc./2008 22:07
par comtois
pour les fichiers AVI l'ami Nico avait pondu ça

http://www.purebasic.fr/french/viewtopi ... hlight=avi

Publié : lun. 15/déc./2008 22:56
par GUELLIL
Bonsoir,

Comme vous êtes tous sympas sur se forum je vous montre un montage photo qui juxtapose de dessin de deux dents d'un pignon de 20 dents module 1 en développante de cercle produit par mon programme en PB et la photo d'un pignon réel de 20 dents.

Image

Merci comtois, je vais étudier ce que Nico a pondu et je vous tiendrai au courant.
Cordialement.[/img]

Publié : lun. 15/déc./2008 23:00
par Cls
Juste en passant, c'est très sympa de donner des nouvelles de tes projets. C'est intéressant de voir quelles sont les applications réelles liées à des projets numériques. :D

Publié : mar. 16/déc./2008 10:17
par djes
comtois a écrit :pour les fichiers AVI l'ami Nico avait pondu ça

http://www.purebasic.fr/french/viewtopi ... hlight=avi
Ah génial, j'avais oublié!