Premiers tours de Pure_moulinette v0.0 !+questions
Publié : lun. 06/nov./2006 23:09
OBJECTIF : voir rapidemment la structure d'un programme.
La moulinette récolte les commentaires principaux et détecte les procédures ainsi que les liens qui existent entre-elles.
Chaque zone du programme est repérée par ses numéros de lignes
Pour l'instant c'est un embryon, faut pas trop le secouer(noms de procedures ou commentaires trop longs...)
PRINCIPE: avec les fonctions de la bibliothèque STRING, je récupère tous les infos sur les procédures, puis je scanne le programme principal pour voir de quelle manière elles interviennent.
La grosse difficulté revient à remplir puis à dessiner des blocs du type:
bloc(generation,noeud,branche)
(sachant qu'il existe des liens entre ces blocs)
EXEMPLE: programme passé à la moulinette
RESULTAT:(aucun icône n'est actif pour le moment

[EDIT] modifié le 7/11 suppression des 4 lignes de code
qui s'ajoutent automatiquement à la fin du programme
J'ai utilisé les datas(pure_post de DOBRO
) pour fabriquer un sprite qui contient tous les icônes(je l'ai clippé ensuite)
Pour les branches j'ai bricolé une fonction du genre:
ybranche=ypère+(2*(n°branche-1)-(n°maxbranche-1))*delta/2
branche varie de 1 à maxbranche
BILAN: la partie graphique était plus compliquée que prévue
(il y a encore des petits trucs à corriger
, des petits décalages peuvent apparaître dans certains cas car j'additionne des fractions pour calculer la position des blocs)
Fabriquer un arbre ça pourrait être un challenge du forum!
Si quelqu'un a déjà essayé, son avis m'interesse(tous les avis m'interessent:P !)
Mon erreur a été de vouloir tout faire en une seule procédure (ça marchait presque!)
J'ai du créer des branches fantômes pour ne pas avoir de problèmes dans les décalages des blocs!
La partie détection des procédures n'est pas au point(si les noms des procédures sont voisins par exemple, dessin_z() et dessin_x())
J'ai dû utiliser la récursivité(il y a peut-être des variables inutiles (newnoeud1 et newnoeud) mais c'est par sécurité que je les ai mises, la récursivité c'est un peu mystique(pour moi)!)
Quand les icônes seront actifs, je compte ouvrir des petites fenêtre au format .text où le bout de code concerné apparaîtra.
Pour l'instant les tableaux sont limités : (20,300;100)
QUESTIONS:
-peut-on récuperer le nom des procédures proprement?(j'ai fouillé dans la bibliothèque PROCESS, mais c'est trop hot pour moi!)
-idem pour les variables utilisées dans le programme
La moulinette récolte les commentaires principaux et détecte les procédures ainsi que les liens qui existent entre-elles.
Chaque zone du programme est repérée par ses numéros de lignes
Pour l'instant c'est un embryon, faut pas trop le secouer(noms de procedures ou commentaires trop longs...)
PRINCIPE: avec les fonctions de la bibliothèque STRING, je récupère tous les infos sur les procédures, puis je scanne le programme principal pour voir de quelle manière elles interviennent.
La grosse difficulté revient à remplir puis à dessiner des blocs du type:
bloc(generation,noeud,branche)
(sachant qu'il existe des liens entre ces blocs)
EXEMPLE: programme passé à la moulinette
Code : Tout sélectionner
Procedure p3()
EndProcedure
Procedure p4()
EndProcedure
Procedure p5()
EndProcedure
Procedure p2()
p3()
p4()
p5()
EndProcedure
Declare p6()
Procedure p1()
p2()
EndProcedure
Procedure p6()
p2()
p3()
p1()
EndProcedure
;programme principal
;action 1
;action 2
p1()
;action 3
;action 5
p6()
p2()
;action 6
[EDIT] modifié le 7/11 suppression des 4 lignes de code
qui s'ajoutent automatiquement à la fin du programme
Code : Tout sélectionner
;**********************************
Enumeration
#spr_icones
#spr_code_var
#spr_arbre
#spr_fermer
#spr_souris
#spr_panorama
#spr_bloc
#spr_sprite_final
EndEnumeration
#Longueur=128 ;longueur d'un bloc
#hbloc=18; hauteur d'un bloc
;**********************
Structure infos
nom.s
enfant.l
nom_enfant.s
ligne_debut_code.l
ligne_fin_code.l
occupe.b
visible.b
origine.s
descendance.s
decalage_y.d
delta.d ;grandeur de reference pour dessiner les branches
EndStructure
;variables**********************
ligne.l=0
ligne_max.l=0
compteur_procedure.l=0
arret_comptage.b=0
branche.l=0
generation.l=0
Global noeud.l, compteur_procedure_max.l,generation_max.l,enfant_max.l,noeud_max.l
Global Largeur.l,Hauteur.l,delta.l,branche_max.l
delta=#hbloc+1;ecart minimal entre deux blocs
Largeur=48;dimensions du sprite qui sera "clipper" pour faire les icones 16*16
Hauteur=32
;tableau********************************
Global Dim tableau(Largeur-1, Hauteur-1)
Global Dim info_procedure.infos(100); info_procedure.infos(compteur_procedure)
Global Dim bloc.infos(20,300,100);bloc.infos(generation,noeud,branche)
Global Dim memo_generation.l(20,300,100)
Global Dim memo_noeud.l(20,300,100)
Global Dim memo_branche.l(20,300,100)
;procedures************************
Procedure.l initialisation()
For i=1 To generation_max
For j=1 To noeud_max
For k=1 To enfant_max
bloc(i,j,k)\enfant=0
bloc(i,j,k)\nom=""
bloc(i,j,k)\nom_enfant=""
Next k
Next j
Next i
For i=1 To generation_max
For j=1 To noeud_max
bloc(i,j,0)\occupe=0
Next j
Next i
EndProcedure
Procedure dessin_icones()
CreateSprite(#spr_icones, Largeur, Hauteur,0)
StartDrawing(SpriteOutput(#spr_icones))
; mise en tableau ************
For i = 0 To Largeur -1
For j = 0 To Hauteur -1
Read donnees.l
tableau(i, j)=donnees.l
Next j
Next i
; dessin point par point**************************
For i = 0 To Largeur -1
For j = 0 To Hauteur -1
Plot(i,j,tableau(i,j))
Next j
Next i
StopDrawing()
EndProcedure
Procedure dessin(nom.b,x.b,y.b,w.b,h.b)
CopySprite(#spr_icones,nom,0)
ClipSprite(nom,x,y,w,h)
EndProcedure
Procedure.l detection_enfant(detect_gen.l,detect_noeud.l,detect_branche.l)
;variables de mémorisation des blocs testés
memo_generation(detect_gen,detect_noeud,detect_branche)=detect_gen
memo_noeud(detect_gen,detect_noeud,detect_branche)=detect_noeud
memo_branche(detect_gen,detect_noeud,detect_branche)=detect_branche
mgen.l=memo_generation(detect_gen,detect_noeud,detect_branche)
mnoeud.l=memo_noeud(detect_gen,detect_noeud,detect_branche)
mbranche.l=memo_branche(detect_gen,detect_noeud,detect_branche)
;on vérifie que les coordonnées du noeud de la generation suivante ne sont pas déjà attribuées
newnoeud.l=1
While bloc(mgen+1,newnoeud,0)\occupe=1
newnoeud=newnoeud+1; on change de noeud si ce nom de noeud est déjà pris
If newnoeud>noeud_max;calcul du nombre max de noeuds
noeud_max=newnoeud
EndIf
Wend
bloc(mgen+1,newnoeud,0)\occupe=1 ;validation des coordonnées du noeud
;création d'un nombre de blocs égal au nombre des descendants directs
For i= 1 To bloc(mgen,mnoeud,mbranche)\enfant; i compteur de branches nouvelles
bloc(mgen+1,newnoeud,i)\nom=StringField(bloc(mgen,mnoeud,mbranche)\nom_enfant,i,"|");récupération des noms des descendants(liste de noms séparés par "|")
For j =1 To compteur_procedure_max;mise à jour des renseignements du bloc avec procedure_info
If bloc(mgen+1,newnoeud,i)\nom=info_procedure(j)\nom
bloc(mgen+1,newnoeud,i)\enfant=info_procedure(j)\enfant
bloc(mgen+1,newnoeud,i)\nom_enfant=info_procedure(j)\nom_enfant
EndIf
Next j
If bloc(mgen+1,newnoeud,i)\enfant<>0 ;test du bloc crée(récursivité!)
detection_enfant(mgen+1,newnoeud,i)
EndIf
Next i
EndProcedure
Procedure.l detectionbis_enfant(detect_gen.l,detect_noeud.l,detect_branche.l)
;variables de mémorisation des blocs testés
memo_generation(detect_gen,detect_noeud,detect_branche)=detect_gen
memo_noeud(detect_gen,detect_noeud,detect_branche)=detect_noeud
memo_branche(detect_gen,detect_noeud,detect_branche)=detect_branche
mgen.l=memo_generation(detect_gen,detect_noeud,detect_branche)
mnoeud.l=memo_noeud(detect_gen,detect_noeud,detect_branche)
mbranche.l=memo_branche(detect_gen,detect_noeud,detect_branche)
If bloc(mgen,mnoeud,mbranche)\enfant=0 And mgen<generation_max;gestion des blocs sans enfants
;on vérifie que les coordonnées du noeud de la generation suivante ne sont pas déjà attribuées
newnoeud1.l=1
While bloc(mgen+1,newnoeud1,0)\occupe=1
newnoeud1=newnoeud1+1; on change de noeud si ce nom de noeud est déjà pris
Wend
bloc(mgen+1,newnoeud1,0)\occupe=1
bloc(mgen+1,newnoeud1,0)\enfant=0
bloc(mgen+1,newnoeud1,0)\nom=Str(mgen+1)+"#"+Str(newnoeud1)
bloc(mgen+1,newnoeud1,0)\origine=bloc(mgen,mnoeud,0)\origine+bloc(mgen,mnoeud,0)\nom+"|"
detectionbis_enfant(mgen+1,newnoeud1,0)
Else; si le bloc a des descendants
;on vérifie que les coordonnées du noeud de la generation suivante ne sont pas déjà attribuées
newnoeud.l=1
While bloc(mgen+1,newnoeud,0)\occupe=1
newnoeud=newnoeud+1; on change de noeud si ce nom de noeud est déjà pris
Wend
bloc(mgen+1,newnoeud,0)\occupe=1 ;validation des coordonnées du noeud
bloc(mgen+1,newnoeud,0)\enfant=bloc(mgen,mnoeud,mbranche)\enfant
bloc(mgen+1,newnoeud,0)\nom=Str(mgen+1)+"#"+Str(newnoeud)
bloc(mgen+1,newnoeud,0)\origine=bloc(mgen,mnoeud,0)\origine+bloc(mgen,mnoeud,0)\nom+"|"
;création d'un nombre de blocs égal au nombre des descendants directs
For i= 1 To bloc(mgen,mnoeud,mbranche)\enfant; i compteur de branches nouvelles
bloc(mgen+1,newnoeud,i)\nom=StringField(bloc(mgen,mnoeud,mbranche)\nom_enfant,i,"|");récupération des noms des descendants(liste de noms séparés par "|")
For j =1 To compteur_procedure_max;mise à jour des renseignements du bloc avec procedure_info
If bloc(mgen+1,newnoeud,i)\nom=info_procedure(j)\nom
bloc(mgen+1,newnoeud,i)\enfant=info_procedure(j)\enfant
bloc(mgen+1,newnoeud,i)\nom_enfant=info_procedure(j)\nom_enfant
bloc(mgen+1,newnoeud,i)\ligne_debut_code=info_procedure(j)\ligne_debut_code
bloc(mgen+1,newnoeud,i)\ligne_fin_code=info_procedure(j)\ligne_fin_code
EndIf
Next j
If mgen<generation_max
detectionbis_enfant(mgen+1,newnoeud,i)
EndIf
Next i
EndIf
If mnoeud>noeud_max;calcul du nombre max de noeuds
noeud_max=mnoeud
EndIf
EndProcedure
Procedure.l traitement_du_programme_choisi()
fichier_choisi$=OpenFileRequester("prog_detection","C:\Documents and Settings\Ploucky\Bureau\programmation\programmation_PBv4.0","Fichiers Purebasic|*.pb",0)
a$="fichier_a_traiter.text"
CreateFile(0,a$);on crée le fichier .text à partir du prog .pb choisi
CloseFile(0);fermer le fichier crée avant de le modifier!
CopyFile(fichier_choisi$,a$);on copie le fichier crée précedemment pour pouvoir le manipuler sans risques
;premier passage pour detecter les procedures et leur emplacement(ligne de debut de code)
ligne=0
OpenFile(0,a$)
While Eof(0)=0
ligne=ligne+1
texte$=LCase(Trim((ReadString(0,#PB_Ascii )))); lecture avec espace devant et derrière supprimés+tout en minuscule
If FindString(texte$,"endprocedure",1)=0 And FindString(texte$,";",1)=0 And FindString(texte$,"endprocedure",1)=0 And FindString(texte$,"_procedure",1)=0 And FindString(texte$,"procedure",1)<>0
compteur_procedure+1
info_procedure(compteur_procedure)\nom=StringField(texte$,2," ")
info_procedure(compteur_procedure)\ligne_debut_code=ligne
EndIf
Wend
ligne_max=ligne
compteur_procedure_max=compteur_procedure
CloseFile(0)
;deuxième passage pour trouver la descendance et la ligne de fin de code
For compteur_procedure=1 To compteur_procedure_max
ligne=0
arret_comptage=0
OpenFile(0,a$)
While Eof(0)=0
ligne=ligne+1
texte$=LCase(Trim((ReadString(0,#PB_Ascii ))))
;detection de la ligne de fin de code de la procedure
If ligne>=info_procedure(compteur_procedure)\ligne_debut_code And arret_comptage=0
info_procedure(compteur_procedure)\ligne_fin_code=ligne
;recherche des descendants directs dans la procedure
For i=1 To compteur_procedure_max
;pour la recherche on prend le nom de la procedure débarassée de ses parenthèses
If i<> compteur_procedure And FindString(texte$,StringField(info_procedure(i)\nom,1,"("),1)<>0
info_procedure(compteur_procedure)\enfant=info_procedure(compteur_procedure)\enfant+1
;listes des procedures filles séparées par un caractère "|"
info_procedure(compteur_procedure)\nom_enfant= info_procedure(compteur_procedure)\nom_enfant+info_procedure(i)\nom+"|"
EndIf
Next i
If FindString(texte$,"endprocedure",1)<>0
arret_comptage=1
EndIf
EndIf
Wend
CloseFile(0)
Next compteur_procedure
;troisième passage pour détecter les bloc.infos(generation=0, noeud=1,branche )
ligne=0
generation=0
noeud=1
branche=0
; OpenFile(0,a$)
; While Eof(0)=0
; ligne=ligne+1
; texte$=LCase(Trim((ReadString(0,#PB_Ascii ))))
;
;
; If ligne>info_procedure(compteur_procedure_max)\ligne_fin_code
;
; If FindString(texte$,";",1)=1
; branche=branche+1
; bloc(generation,noeud,branche)\nom=texte$
; bloc(generation,noeud,branche)\ligne_debut_code=ligne
; EndIf
;
; EndIf
; Wend
; CloseFile(0)
;********************modif Dobro********************
OpenFile (0,a$)
While Eof (0)=0
ligne=ligne+1
texte$= LCase ( Trim (( ReadString (0, #PB_Ascii ))))
If Left (texte$,13)= "; japbe versi" Or Left (texte$,12)= "; ide option"
Break 1
EndIf
If ligne>info_procedure(compteur_procedure_max)\ligne_fin_code
If FindString (texte$, ";" ,1)=1
branche=branche+1
bloc(generation,noeud,branche)\nom= texte$
bloc(generation,noeud,branche)\ligne_debut_code=ligne
EndIf
EndIf
Wend
CloseFile (0)
branche_max=branche
;**************************************
;calcul des lignes de fin de blocs
For branche=1 To branche_max-1
bloc(generation,noeud,branche)\ligne_fin_code=bloc(generation,noeud,branche+1)\ligne_debut_code-1
Next branche
bloc(generation,noeud,branche_max)\ligne_fin_code=ligne_max
;quatrième passage, detection des descendances des bloc(0,1,branche)
generation=0
noeud=1
For branche=1 To branche_max
ligne=0
OpenFile(0,a$)
While Eof(0)=0
ligne=ligne+1
texte$=LCase(Trim((ReadString(0,#PB_Ascii ))))
If ligne>=bloc(generation,noeud,branche)\ligne_debut_code And ligne<=bloc(generation,noeud,branche)\ligne_fin_code
For i=1 To compteur_procedure_max
chaine_de_recherche$=StringField(info_procedure(i)\nom,1,"(")+"("
If FindString(texte$,chaine_de_recherche$,1)<>0
bloc(generation,noeud,branche)\enfant=bloc(generation,noeud,branche)\enfant+1
bloc(generation,noeud,branche)\nom_enfant=bloc(generation,noeud,branche)\nom_enfant+info_procedure(i)\nom+"|"
EndIf
Next i
EndIf
Wend
CloseFile(0)
Next branche
; remplissage des blocs, appel de la procedure detection_enfant
For branche = 1 To branche_max
If bloc(0,1,branche)\enfant<>0
detection_enfant(0,1,branche)
EndIf
Next branche
;recherche du nombre max d'enfants
enfant_max=0
For compteur_procedure=1 To compteur_procedure_max
If info_procedure(compteur_procedure)\enfant>enfant_max
enfant_max= info_procedure(compteur_procedure)\enfant
EndIf
Next compteur_procedure
;detection du nombre max de generations
generation_max=0
While bloc(generation_max,1,1)\nom<>""
generation_max=generation_max+1
Wend; il y a (generation-1) noeuds!
;nouveau passage pour combler les branches vides jusqu'a generation_max=>renumérotation
initialisation()
noeud_max=0
bloc(0,1,0)\origine="0#1"
For branche = 1 To branche_max
detectionbis_enfant(0,1,branche);gestion des blocs avec ou sans enfants dans la procedure
Next branche
EndProcedure
Procedure decalage_des_blocs()
;remplissage de la structure descendance
For generation=0 To generation_max-1
For noeud=0 To noeud_max
bloc(generation,noeud,0)\descendance="|"
If bloc(generation,noeud,0)\nom<>""
nom$="|"+Str(generation)+"#"+Str(noeud)+"|"
For i=0 To generation_max-1
For j=0 To noeud_max
If FindString(bloc(i,j,0)\origine,nom$,1)<>0
bloc(generation,noeud,0)\descendance= bloc(generation,noeud,0)\descendance+Str(i)+"#"+Str(j)+"|"
EndIf
Next j
Next i
EndIf
Next noeud
Next generation
;decalage des noeuds de la derniere generation + remplissage des delta(voir plus loin)
generation_noeud.l=generation_max-1; il y a (generation-1) noeuds!
bloc(generation_noeud,1,0)\decalage_y=0
For noeud=2 To noeud_max; on decale les blocs de delta puis on tient compte des voisins du dessus et du dessous!
If bloc(generation_noeud,noeud,0)\nom<>""
bloc(generation_noeud,noeud,0)\decalage_y=bloc(generation_noeud,noeud-1,0)\decalage_y+delta
If bloc(generation_noeud,noeud-1,0)\enfant<>0
bloc(generation_noeud,noeud,0)\decalage_y=bloc(generation_noeud,noeud,0)\decalage_y+(bloc(generation_noeud,noeud-1,0)\enfant-1)*delta/2
EndIf
If bloc(generation_noeud,noeud,0)\enfant<>0
bloc(generation_noeud,noeud,0)\decalage_y=bloc(generation_noeud,noeud,0)\decalage_y+(bloc(generation_noeud,noeud,0)\enfant-1)*delta/2
EndIf
EndIf
bloc(generation_noeud,noeud,0)\delta=delta
Next noeud
;decalage des noeuds
For generation=generation_noeud-1 To 0 Step -1
For noeud=1 To noeud_max
If bloc(generation,noeud,0)\nom<>""
i=generation+1
For j=1 To noeud_max
If bloc(i,j,0)\nom<>""
nom$="|"+Str(i)+"#"+Str(j)+"|"
If FindString(bloc(generation,noeud,0)\descendance,nom$,1)<>0
If bloc(generation,noeud,0)\enfant<>0
bloc(generation,noeud,0)\decalage_y=bloc(generation,noeud,0)\decalage_y+bloc(i,j,0)\decalage_y/bloc(generation,noeud,0)\enfant
Else
bloc(generation,noeud,0)\decalage_y=bloc(generation,noeud,0)\decalage_y+bloc(i,j,0)\decalage_y
EndIf
EndIf
EndIf
Next j
EndIf
Next noeud
Next generation
;calcul des delta des noeuds(dimension de reference des branches pour les noeuds)
For generation=generation_noeud-1 To 1 Step -1
For noeud=1 To noeud_max
If bloc(generation,noeud,0)\nom<>"" And bloc(generation,noeud,0)\enfant<>0
noeudmin$="|"+StringField(bloc(generation,noeud,0)\descendance,2,"|")+"|";pour calculer delta on a besoin des branches extremes du noeud
noeudmax$="|"+StringField(bloc(generation,noeud,0)\descendance,bloc(generation,noeud,0)\enfant+1,"|")+"|"
i=generation+1;on s'interresse juste à la generation suivante
For j=1 To noeud_max
If bloc(i,j,0)\nom<>"" And noeudmax$<>noeudmin$
If FindString("|"+bloc(i,j,0)\nom+"|",noeudmin$,1)<>0
bloc(generation,noeud,0)\delta=bloc(generation,noeud,0)\delta-bloc(i,j,0)\decalage_y/(bloc(generation,noeud,0)\enfant-1)
EndIf
If FindString("|"+bloc(i,j,0)\nom+"|",noeudmax$,1)<>0
bloc(generation,noeud,0)\delta=bloc(generation,noeud,0)\delta+bloc(i,j,0)\decalage_y/(bloc(generation,noeud,0)\enfant-1)
EndIf
EndIf
Next j
EndIf
Next noeud
Next generation
;decalage des blocs de generation 0
For branche=1 To branche_max
If bloc(0,1,branche)\nom<>""
bloc(0,1,branche)\decalage_y=bloc(1,branche,0)\decalage_y
EndIf
Next branche
;decalage des autres blocs (prise en compte des enfants donc des bloc(g,n,0)\delta)
For generation=1 To generation_max
For noeud=1 To noeud_max
If bloc(generation,noeud,0)\enfant<>0
For branche=1 To bloc(generation,noeud,0)\enfant
bloc(generation,noeud,branche)\decalage_y=bloc(generation,noeud,0)\decalage_y+(2*(branche-1)-(bloc(generation,noeud,0)\enfant-1))*bloc(generation,noeud,0)\delta/2
Next branche
EndIf
Next noeud
Next generation
EndProcedure
Procedure dessin_bloc(nom_bloc.s,parent.b)
CreateSprite(#spr_bloc,#Longueur,#hbloc)
UseBuffer(#spr_bloc)
StartDrawing(SpriteOutput(#spr_bloc))
Box(0,0,128,18,RGB(255,255,0))
DrawText(49,1,nom_bloc)
StopDrawing()
DisplayTransparentSprite(#spr_code_var ,1,1)
Select parent ;affichage d'icones differents en fonction de la variable "parent"
Case 1
DisplayTransparentSprite(#spr_arbre ,33,1)
Case 2
DisplayTransparentSprite(#spr_fermer ,33,1)
EndSelect
UseBuffer(#spr_sprite_final)
EndProcedure
Procedure dessin_final()
CreateSprite(#spr_sprite_final,1024,768)
UseBuffer(#spr_sprite_final)
For generation=0 To 20
For noeud =0 To 300
For branche=1 To 100
If bloc(generation,noeud,branche)\nom<>""
dessin_bloc(bloc(generation,noeud,branche)\nom,1)
DisplaySprite(#spr_bloc,10+generation*3*#Longueur/2,bloc(generation,noeud,branche)\decalage_y)
StartDrawing(SpriteOutput(#spr_sprite_final))
If generation<>0
Line(10+generation*3*#Longueur/2-#Longueur/4,bloc(generation,noeud,branche)\decalage_y+#hbloc/2,#Longueur/4,0,RGB(255,255,255))
EndIf
If bloc(generation,noeud,branche)\enfant<>0 And branche<>0
Line(10+generation*3*#Longueur/2+#Longueur,bloc(generation,noeud,branche)\decalage_y+#hbloc/2,#Longueur/4,0,RGB(255,255,255))
EndIf
If bloc(generation,noeud,0)\enfant<>0
LineXY(10+generation*3*#Longueur/2-#Longueur/4,bloc(generation,noeud,1)\decalage_y+#hbloc/2,10+generation*3*#Longueur/2-#Longueur/4,bloc(generation,noeud,bloc(generation,noeud,0)\enfant)\decalage_y+#hbloc/2,RGB(255,255,255))
EndIf
StopDrawing()
EndIf
Next branche
Next noeud
Next generation
UseBuffer(-1)
EndProcedure
;initialisation*******************************
InitSprite()
InitMouse()
traitement_du_programme_choisi()
decalage_des_blocs()
;ouverture d'un écran 1024*768*********************
OpenScreen(1024,768,32,"icones")
TransparentSpriteColor(#PB_Default ,RGB(0,128,0))
;création du sprite #spr_icones***************************
dessin_icones()
;dessin des sprites
dessin(#spr_code_var,0,0,32,16)
dessin(#spr_arbre,0,16,16,16)
dessin(#spr_fermer,16,16,16,16)
dessin(#spr_souris,32,0,16,16)
dessin(#spr_panorama,32,16,16,16)
;programme principal*******************
dessin_final()
Repeat; tant que bouton droit relaché*******************
Delay(10)
ExamineMouse()
;affichage des sprites******************************
DisplaySprite(#spr_sprite_final,0,0)
DisplayTransparentSprite(#spr_souris,MouseX(),MouseY())
FlipBuffers()
Until MouseButton(#PB_MouseButton_Right )<>0
End
DataSection
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,12632256,8421504,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,16711680,8421376,8421376,8421376,8421376,8421376,16777215,16777215,16777215,16777215,16777215,16777215,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,12632256,8421504,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,16711680,16777215,16777215,16777215,16777215,16777215,16777215,16777215,0,16777215,16777215,16777215,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,12632256,8421504,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 16711680,8421376,16777215,16777215,0,16777215,16777215,0,16777215,0,16777215,16777215,16777215,8421376,8421376,8388608,16711680,8421376,8421376,12632256,12632256,12632256,12632256,12632256,12632256,12632256,12632256,12632256,8421504,8421376,8421376,8388608
Data.l 16711680,8421376,16777215,16777215,0,16777215,16777215,0,16777215,0,16777215,12632256,12632256,8421376,8421376,8388608,16711680,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,8388608
Data.l 16711680,8421376,16777215,16777215,0,16777215,16777215,0,16777215,0,0,12632256,12632256,8421376,8421376,8388608,16711680,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,8388608
Data.l 16711680,8421376,12632256,12632256,0,12632256,12632256,16777215,12632256,16777215,0,16777215,16777215,12632256,8421376,8388608,16711680,8421376,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,8421376,8388608
Data.l 16711680,8421376,8421376,12632256,16777215,0,12632256,16777215,0,16777215,0,16777215,16777215,12632256,8421376,8388608,16711680,8421376,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,8421376,8388608
Data.l 16711680,8421376,8421376,16777215,16777215,0,12632256,16777215,0,16777215,16777215,16777215,16777215,12632256,8421376,8388608,16711680,8421376,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,8421376,8388608
Data.l 32768,16711680,8421376,16777215,16777215,16777215,16777215,16777215,16777215,16777215,12632256,12632256,12632256,12632256,8388608,32768,32768,16711680,8421376,16777215,16777215,8421376,8421376,16777215,16777215,8421376,8421376,16777215,16777215,8421376,8388608,32768
Data.l 32768,16711680,8421376,16777215,16777215,12632256,12632256,12632256,12632256,12632256,12632256,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,16711680,8421376,12632256,12632256,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,65535,65535,32896,8421376,8388608,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,16711680,8421376,8421376,65535,65535,65535,65535,32896,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,16711680,8421376,65535,32896,8421376,8421376,65535,32896,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,255,255,128,8421376,8421376,8421376,255,255,128,8421376,8388608,32768
Data.l 16711680,8421376,8421376,8421376,65535,65535,65535,65535,32896,8421376,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,255,255,128,8421376,8421376,255,255,255,128,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,65535,65535,32896,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,255,255,128,8421376,255,128,8421376,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,8421376,8421376,255,255,128,8421376,8421376,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,65535,32896,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,8421376,8421376,255,255,128,8421376,8421376,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,8421376,255,128,8421376,255,255,128,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,65535,32896,8421376,65535,32896,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,255,255,255,128,8421376,8421376,255,255,128,8421376,8421376,8388608
Data.l 32768,16711680,8421376,8421376,8421376,65535,32896,65535,32896,65535,32896,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,255,255,128,8421376,8421376,8421376,255,255,128,8421376,8388608,32768
Data.l 32768,16711680,8421376,8421376,8421376,65535,32896,65535,32896,65535,32896,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,16711680,8421376,8421376,8421376,65535,65535,65535,65535,32896,8421376,8421376,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,128,255,255,255,255,255,255,255,255,255,255,255,255,255,128,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,0,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,128,255,255,255,255,255,255,255,255,255,255,255,128,32768,32768,32768,16711680,8421376,8421376,0,8421376,0,65535,0,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,128,255,255,255,255,255,255,255,255,255,128,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,65535,65535,65535,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,128,255,255,255,255,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,0,0,0,65535,16777215,16777215,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,32768,128,255,255,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,0,0,0,16777215,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,128,255,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,0,0,0,16777215,128,0,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,128,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,128,16777215,128,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,128,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,0,0,0,16777215,128,0,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,128,255,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,0,0,0,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,128,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,0,0,0,0,0,16777215,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,8421376,8421376,8421376,0,0,65535,16777215,65535,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,8421376,8421376,0,8421376,0,65535,65535,65535,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,65535,0,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,0,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
EndDataSection

Pour les branches j'ai bricolé une fonction du genre:
ybranche=ypère+(2*(n°branche-1)-(n°maxbranche-1))*delta/2
branche varie de 1 à maxbranche
BILAN: la partie graphique était plus compliquée que prévue

(il y a encore des petits trucs à corriger

Fabriquer un arbre ça pourrait être un challenge du forum!

Si quelqu'un a déjà essayé, son avis m'interesse(tous les avis m'interessent:P !)
Mon erreur a été de vouloir tout faire en une seule procédure (ça marchait presque!)
J'ai du créer des branches fantômes pour ne pas avoir de problèmes dans les décalages des blocs!
La partie détection des procédures n'est pas au point(si les noms des procédures sont voisins par exemple, dessin_z() et dessin_x())
J'ai dû utiliser la récursivité(il y a peut-être des variables inutiles (newnoeud1 et newnoeud) mais c'est par sécurité que je les ai mises, la récursivité c'est un peu mystique(pour moi)!)
Quand les icônes seront actifs, je compte ouvrir des petites fenêtre au format .text où le bout de code concerné apparaîtra.
Pour l'instant les tableaux sont limités : (20,300;100)
QUESTIONS:
-peut-on récuperer le nom des procédures proprement?(j'ai fouillé dans la bibliothèque PROCESS, mais c'est trop hot pour moi!)
-idem pour les variables utilisées dans le programme