Graph_Code

Programmation d'applications complexes
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Graph_Code

Message par Zorro »

bon j'ai finalement decidé de vous refiler mon petit gadget

Image



Rappel , il sert a voir surtout , les appels de procedures , (gros rectangle bleu a droite )

la zone Grise représente le listing
la zone rouge foncé représente l'emplacement de la boucle des events (s'il y en a une ..)
les petites zone bleues représente l'emplacement des procedures ...
les petites zone "carré" rose, représente l'emplacement des boucles For-Next
les petites zone "ligne" jaune-orange représente l'emplacement des IF-Endif ...

le but de ce Gadget, est surtout de voir les liens vers les procédures
si ça part de la zone Grise , ce sont des appels a partir du listing
si ça part d'une Procedure (Gros Rectangle BLeu) c'est que l'appel a lieu a partir de la procedure
un lien qui part d'une procedure, et qui y reviens, est typique d'un appel Recursif

bien sur plusieurs appels peuvent Partir ou arriver d'une procedure ....
les Procedures sans Liens ... sont des procedures qui ne sont pas utilisées....

Note : ne chargez pas de trop Gros listing .. il pourrai y avoir un bug d'affichage (chevauchements des liens sur les Bloc de procedures...
dans ce cas precis , il faut changer la ligne 621

Code : Tout sélectionner

Spr_procedure()\posx.l=600
qui donne la position X des blocs de procedures
en augmentant sa valeur ... il est actuellement reglé pour que la majorités des listing s'affichent comme il faut ...



voici le code :

Code : Tout sélectionner



;***********************************************
;Titre  :*graph_Code2
;Auteur  : Dobro
;Date  :10/07/2019
;Heure  :13:02:30
;Version Purebasic :  PureBasic 5.70 LTS (Windows - x86)
;Version de l'editeur :EPB PHOENIX V2.68
; Libairies necessaire : Aucune 
;***********************************************



Enumeration
		#win
		#Panel
		#Cont
		#load
		#text_procedure
		#text_For
		#text_If
EndEnumeration

Enumeration
		; ***** ces sprites n'utilisent qu'une seule images *****
		#Spr_attente
		#spr_listing
		#spr_boucle
		#spr_procedure_appel
		#spr_procedure_list
		#spr_procedure_appel_arr
		#spr_procedure_appel_arrd
		#spr_boucle_for
		#spr_boucle_next
		#spr_IF
		#spr_Endif
		
		; ***********************************************
		#spr_procedure ; doit rester le dernier puisque le numero va augmenter en fonction du nombre de procedure et que l'image du sprite change (Texte)
EndEnumeration

Declare Button_action()
Declare.s Load()
Declare Dessine (listing.s)
Declare Cherche_mot(ligne.s,mot_a_chercher.s)


Global compteur_procedure,name_file.s, Flag_procedure

structure Spr_listing
		num_sprite.l
		posx.l
		posy.l
		hauteur.l
		Largeur.l
		couleur.l
		name.s
EndStructure
Global NewList Spr_listing.Spr_listing()
;
structure Spr_boucle
		num_sprite.l
		posx.l
		posy.l
		hauteur.l
		Largeur.l
		couleur.l
		name.s
EndStructure
Global  NewList Spr_boucle.Spr_boucle()

structure spr_procedure
		num_sprite.l
		posx.l
		posy.l
		hauteur.l
		Largeur.l
		couleur.l
		name.s
		name_par.s
		num_ligne_deb.i
		num_ligne_fin.i
EndStructure
Global NewList spr_procedure.spr_procedure()
;
structure spr_procedure_list
		num_sprite.l
		posx.l
		posy.l
		hauteur.l
		Largeur.l
		couleur.l
		name.s
		name_par.s
		num_ligne_deb.i
		num_ligne_fin.i
EndStructure
Global NewList spr_procedure_list.spr_procedure_list()
;

;
structure spr_procedure_appel
		num_sprite.l
		posx.l
		posy.l
		hauteur.l
		Largeur.l
		couleur.l
		name.s
		numero_ligne.l
		arrx.i ; les coordonées de la procedure pointé !!
		arry.i
		long1.i
		couleur_fil.i
		type.b ; determine l'image employé pour afficher l'entrée
		Entree.i
EndStructure
Global NewList spr_procedure_appel.spr_procedure_appel()


structure spr_procedure_appel_arr ; pour le sprite d'arrivé de la ligne
		num_sprite.l
		posx.l
		posy.l
		hauteur.l
		Largeur.l
		couleur.l
EndStructure
Global NewList spr_procedure_appel_arr.spr_procedure_appel_arr()
;

structure spr_boucle_for_next
num_sprite.l
posx.l
posy.l
hauteur.l
Largeur.l
couleur.l
name.s
num_ligne_deb.i
num_ligne_fin.i
decal_for.l
decal_next.l
EndStructure
Global NewList spr_boucle_for_next.spr_boucle_for_next()
;
structure spr_If
		num_sprite.l
		posx.l
		posy.l
		hauteur.l
		Largeur.l
		couleur.l
		name.s
		num_ligne_deb.i
		num_ligne_fin.i
		decal_if.l
		decal_endif.l
EndStructure
Global NewList spr_If.spr_If()

Structure Spr_attente
		posx.l
		posy.l
EndStructure
global NewList Spr_attente.Spr_attente()







;- Les couleurs
global couleur_fond=$0
global couleur_listing=Rgb(125,125,125)
global couleur_boucle=RGB(118,58,0)
global couleur_appel=RGB(255,255,0)
global couleur_entree=RGB(0,255,0)
global couleur_procedures=RGB(0,111,209)
Global  Flag_affichage=#false


Global Flag_creation_sprite_procedure_List=#false
Global Flag_creation_sprite_procedure_appel=#false
Global Flag_creation_sprite_Fleche_appel_arr=#false
Global Flag_creation_sprite_Fleche_appel_arrd=#false


;********** attention tout ceci existe aussi dans "LOAD" , pour initialiser une valeur, il faut allez dans "LOAD" ****************************************
Global Compteur_fil=15  ; determine l'ecartement horizontal du depart des lignes plus c'est grand, plus ça s'eloigne du listing (a gauche) 
Global Compteur_fil2=15 ; determine l'ecartement horizontal du depart des lignes a partir des procedures (a droite )
Global compteur_1=8 ; determine l'ecartement entre les lignes horizontale  a gauche des procedures et aide a eloigner les procedures si beaucoups d'appels evite ainsi le chevauchement des sprites..
Global compteur_2=8 ; determine l'ecartement entre les lignes horizontale  a droite des procedures 
; ****************************************************************************************************************************************

Global Compteur_de_for=0
Global Compteur_de_if=0



;- Ouverture de la fenètre et de l'écran
hwnd = OpenWindow(#win, 0, 0, 1024,800, "GraphCode  By Dobro      ",#PB_Window_TitleBar | #PB_Window_ScreenCentered|#PB_Window_SystemMenu  )

;- Initialisation de DirectX
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
		MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
		CloseWindow(#win) : End
EndIf
larg=8000
haut=8000
ButtonGadget(#load,10,760, 150,30,"Load")
BindGadgetEvent(#load, @Button_action())

TextGadget(#text_procedure, 200, 760,250, 30, "procedure")
TextGadget(#text_For, 200+250, 760,250, 30, "Nb de For")
TextGadget(#text_If, 200+500, 760,250, 30, "Nb de If")


ScrollAreaGadget(#Panel,10, 10,1010,750, larg,haut, 30)
hCont = ContainerGadget(#Cont,10,10,larg,haut,#PB_Container_Double)
OpenWindowedScreen(hCont,  0, 0,larg,haut, 0, 0,0)
CloseGadgetList()

CreateSprite(#Spr_attente,128,64)
If issprite(#Spr_attente)
		StartDrawing(SpriteOutput(#Spr_attente))
				BackColor(Rgb(255,255,255))
				DrawText(10,1, "Je dessine...", RGB(0, 0, 255))
		StopDrawing()
Endif




Procedure Button_action()
		listing.s=Load()
		dessine(listing.s)
EndProcedure

Dep = 8
;- début de la boucle
Repeat
		Select WaitWindowEvent(20)
		Case #PB_Event_Gadget     
				Select EventGadget()
						;Case #load
						;listing.s=Load()
						
						;dessine(listing.s)
						
				EndSelect
		Case #PB_Event_CloseWindow
				End
		EndSelect
		
		; ***************************************************************************************************************
		;-affichage
		
		
		;-aff listing
		IF ListSize(spr_listing())
				If IsSprite(#spr_listing)
						DisplaySprite (#spr_listing,spr_listing()\posx.l,spr_listing()\posy.l)
				Endif
		Endif
		
		;-aff boucle
		If ListSize(Spr_boucle())
				If IsSprite(#Spr_boucle)
						if ListSize(Spr_boucle())>0
								DisplaySprite (#Spr_boucle,Spr_boucle()\posx.l,Spr_boucle()\posy.l)
						Endif
				Endif
		Endif
		
		;-aff boucle for
		
		If ListSize(spr_boucle_for_next()) >0
				If IsSprite(spr_boucle_for_next()\num_sprite.l) ;>2
						ForEach spr_boucle_for_next();>3
								DisplaySprite (spr_boucle_for_next()\num_sprite.l,spr_boucle_for_next()\posx.l,spr_boucle_for_next()\num_ligne_deb);>4
						Next  ;>3
				Endif;>2
		;
				If IsSprite(spr_boucle_for_next()\num_sprite.l) ;>2
						ForEach spr_boucle_for_next();>3
								DisplaySprite (spr_boucle_for_next()\num_sprite.l,spr_boucle_for_next()\posx.l,spr_boucle_for_next()\num_ligne_fin);>4
						Next  ;>3
				Endif;>2
		Endif;>1
		
		;-aff IF ENDIF
		If ListSize(spr_If()) >0
						If IsSprite(spr_IF()\num_sprite.l) ;>2
								ForEach spr_IF();>3
										DisplaySprite (spr_IF()\num_sprite.l,spr_IF()\posx.l,spr_IF()\num_ligne_deb);>4
								Next  ;>3
						Endif;>2
				;
						If IsSprite(spr_IF()\num_sprite.l) ;>2
								ForEach spr_IF();>3
										DisplaySprite (spr_IF()\num_sprite.l,spr_IF()\posx.l,spr_IF()\num_ligne_fin);>4
								Next  ;>3
						Endif;>2
				Endif;>1
				
				
				
				;-aff procedures
				IF ListSize(Spr_procedure()) 
						If IsSprite(Spr_procedure()\num_sprite.l)
								ForEach Spr_procedure()
										DisplaySprite(Spr_procedure()\num_sprite.l,Spr_Procedure()\posx.l,Spr_Procedure()\posy.l)
								Next 
						Endif
				Endif
				;-aff procedures_list
				IF ListSize(Spr_procedure_list()) 
						If IsSprite(Spr_procedure_list()\num_sprite.l)
								ForEach Spr_procedure_list()
										DisplaySprite(Spr_procedure_list()\num_sprite.l,Spr_Procedure_list()\posx.l,Spr_Procedure_list()\posy.l)
								Next 
						Endif
				Endif
				;RandomSeed(13)
				
				;-aff les Appels des procedures et les Arrivée ainsi que la ligne
				IF ListSize(Spr_procedure_appel()) 
						If IsSprite(Spr_procedure_appel()\num_sprite.l)
								
								ForEach Spr_procedure_appel()
										Foreach spr_procedure()
												
												;{ **************Event Gadget suplementaire pour eviter le Freeze*************
												Select WaitWindowEvent(20)
												Case #PB_Event_Gadget     
														Select EventGadget()
														EndSelect
												Case #PB_Event_CloseWindow
														End
												EndSelect
												
												;}
												;- affiche le sprite d'appel
												If ListSize(Spr_procedure_appel())
														if Issprite(Spr_procedure_appel()\num_sprite.l)
																DisplaySprite(Spr_procedure_appel()\num_sprite.l,Spr_Procedure_appel()\posx.l,Spr_Procedure_appel()\posy.l-2)
														Endif
												Endif
												if ListSize(spr_procedure())>0
														IF spr_procedure()\name.s =Spr_procedure_appel()\name.s
																StartDrawing(ScreenOutput())
																		; part a l'horizontale
																		LineXY(Spr_procedure_appel()\posx,Spr_procedure_appel()\posy, Spr_procedure_appel()\posx+spr_procedure_appel()\long1,Spr_procedure_appel()\posy , spr_procedure_appel()\couleur_fil.i)
																		
																		; ça monte ou descend
																		LineXY(Spr_procedure_appel()\posx+spr_procedure_appel()\long1,Spr_procedure_appel()\posy, Spr_procedure_appel()\posx+spr_procedure_appel()\long1,spr_procedure_appel()\entree, spr_procedure_appel()\couleur_fil.i)
																		
																		; fini la ligne vers la procedure
																		LineXY(Spr_procedure_appel()\posx+spr_procedure_appel()\long1,spr_procedure_appel()\entree, Spr_procedure_appel()\arrx.i,spr_procedure_appel()\entree ,spr_procedure_appel()\couleur_fil.i)
																		;LineXY(Spr_procedure_appel()\posx,Spr_procedure_appel()\posy, spr_procedure()\posx, spr_procedure()\posy , couleur_liens_procedures) ; anciennes ligne qui font les diagonales
																StopDrawing()
																index=ListIndex(Spr_procedure_appel())
																SelectElement(Spr_procedure_appel_arr(),index)
																
																;-dessin des petites fleches
																if issprite(spr_procedure_appel_arr()\num_sprite.l)
																		DisplaytransparentSprite(spr_procedure_appel_arr()\num_sprite.l,Spr_Procedure_appel_arr()\posx.l,spr_procedure_appel()\entree-3); le "-3" recentre la sprite sur la ligne
																Endif
														Endif
												Endif
										Next
								Next 
						Endif
				Endif
				FlipBuffers() 
				
				; ***************************************************************************************************************
				
		Forever
		
		;- *********** Procedures ZONE ***************²
		
		Procedure.s Load()
				;-LOAD
				ClearScreen(couleur_fond)
				ClearList(Spr_Procedure()) 
				ClearList(Spr_Procedure_appel())
				ClearList(Spr_Procedure_appel_arr())
				ClearList( spr_boucle())
				ClearList( spr_listing())
				ClearList(spr_procedure_list())
				ClearList(spr_boucle_for_next())
				ClearList(spr_If())
				
				Compteur_de_for=0
				Compteur_de_if=0
				
				Compteur_fil=80 ; determine l'ecartement horizontal du depart des lignes
				Compteur_fil2=32 ; pareil mais coté droit des procedures
				
				compteur_1=8 ; determine l'ecartement entre les lignes horizontale  a gauche des procedures et aide a eloigner les procedures si beaucoups d'appels evite ainsi le chevauchement des sprites..
				compteur_2=8 ; determine l'ecartement entre les lignes horizontale  a droite des procedures 
				
				
				Dep =8: compteur_procedure=0
				file.s=OpenFileRequester("ouvrir un PB",GetCurrentDirectory(),"*.pb",1)
				if file.s<>""
						name_file.s=GetFilePart(file.s,#PB_FileSystem_NoExtension)
						SetWindowTitle(#win,  "GraphCode  By Dobro      "+name_file.s) 
						If OpenFile(0, file.s)    ; Ouvre un fichier existant ou en crée un nouveau s'il n'existait pas
								
								While Eof(0) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
										listing.s=listing.s+ReadString(0,#PB_UTF8 )+chr(10)   ; Affiche ligne par ligne le contenu du fichier
								Wend  
								CloseFile(0);>
								SetGadgetAttribute( #Panel,#PB_ScrollArea_X ,0  )
								SetGadgetAttribute(#Panel, #PB_ScrollArea_Y ,0  )
								
						EndIf
						ProcedureReturn listing.s
				Else
						listing.s=""
						ProcedureReturn listing.s
				Endif
		EndProcedure
		;
		Procedure Dessine (listing.s)
				AddElement(Spr_attente())
				Spr_attente()\posx.l = -128
				Spr_attente()\posy.l=50
				
				;-create listing
				nb_ligne=CountString(listing.s,chr(10))
				AddElement(spr_listing())
				Spr_listing()\hauteur.l=nb_ligne*2
				;debug "numero de ligne fin de listing :"+str(nb_ligne)
				Spr_listing()\num_sprite.l=#spr_listing
				Spr_listing()\posx.l=10
				Spr_listing()\posy.l=10
				Spr_listing()\couleur.l=couleur_listing
				Spr_listing()\largeur.l=200
				Spr_listing()\name.s=name_file.s
				;-create_sprite_listing
				CreateSprite(Spr_listing()\num_sprite.l,Spr_listing()\largeur.l,Spr_listing()\hauteur.l)
				If issprite(Spr_listing()\num_sprite.l)
						StartDrawing(SpriteOutput(Spr_listing()\num_sprite.l))
								Box(0,0,Spr_listing()\largeur.l,Spr_listing()\hauteur.l,Spr_listing()\couleur.l)
								BackColor(Rgb(255,255,255))
								DrawText(10,1, Spr_listing()\name.s, RGB(0, 0, 255))
						StopDrawing()
				Endif
				;- **********************************
				;-Passe 1
				;- **********************************
				
				For i=1 to nb_ligne
						yoyo=yoyo+1
						Ligne.s=StringField(listing.s,i,chr(10))
						gros_decal=CountString(Ligne.s,chr(9))*10 ; fonctionne aussi
						Ligne.s=trim(Ligne.s) :Ligne.s=Trim(Ligne.s,chr(9))
						if Ligne.s<>""
								
								Spr_attente()\posx.l=Spr_attente()\posx.l+1
								IF Spr_attente()\posx.l>WindowWidth(#win)
										Spr_attente()\posx.l=-128
								Endif
								
								;********* Traitement **********
								;- recherche la boucle principale
								If FindString(Lcase(Ligne.s),"windowevent",1,#PB_String_NoCase) >0
										flag_c_boucle=#True
										AddElement(Spr_boucle())
										Spr_boucle()\posy.l=i*2
								Endif
								
								IF Lcase(left(Ligne.s,5))="until" or Lcase(left(Ligne.s,7))="forever";or Lcase(left(Ligne.s,12))="endprocedure"
								;debug "numero de ligne fin de boucle :"+str(i)
								;calldebugger
								If flag_c_boucle=#True
										Flag_c_boucle=#False
										Spr_boucle()\hauteur.l=(i*2 - Spr_boucle()\posy.l):compteur_boucle=0
										Spr_boucle()\num_sprite.l=#spr_boucle
										Spr_boucle()\posx.l=20
										
										Spr_boucle()\couleur.l=couleur_boucle
										Spr_boucle()\largeur.l=180
										Spr_boucle()\name.s="Boucle"
										;-Create_sprite_boucle principale
										CreateSprite(Spr_boucle()\num_sprite.l,Spr_boucle()\largeur.l,Spr_boucle()\hauteur.l)
										
										StartDrawing(SpriteOutput(Spr_boucle()\num_sprite.l))
												Box(0,0,Spr_boucle()\largeur.l,Spr_boucle()\hauteur.l,Spr_boucle()\couleur.l)
												DrawingMode(#PB_2DDrawing_Transparent )
												DrawText(1,1, Spr_boucle()\name.s,  RGB(255,255,255))
										StopDrawing()
								Endif
						Endif
						; *********** boucle For  ***************
						;-recherche boucle For
						If Left( Lcase(Ligne.s),4)="for " 
								AddElement(spr_boucle_for_next())
								spr_boucle_for_next()\posy.l=i*2
								spr_boucle_for_next()\hauteur.l=8
								spr_boucle_for_next()\num_sprite.l=#spr_boucle_for
								spr_boucle_for_next()\posx.l=20+gros_decal;decal_for.l ;gros_decal;
								spr_boucle_for_next()\couleur.l=rgb(255,120,255)
								spr_boucle_for_next()\largeur.l=8
								spr_boucle_for_next()\num_ligne_deb=i*2
								spr_boucle_for_next()\name.s="Boucle_for"
								Compteur_de_for=Compteur_de_for+1
								decal_for.l=decal_for+5
								SetGadgetText(#text_For, "Nbr de For :"+str(Compteur_de_For))
								;-Create_sprite_boucle_for
								CreateSprite(#spr_boucle_for,spr_boucle_for_next()\largeur.l,spr_boucle_for_next()\hauteur.l)
								StartDrawing(SpriteOutput(#spr_boucle_for))
										Box(0,0,spr_boucle_for_next()\largeur.l,spr_boucle_for_next()\hauteur.l,spr_boucle_for_next()\couleur.l)
										DrawingMode(#PB_2DDrawing_Transparent )
								StopDrawing()
						Endif
						;-recherche Next
						IF Lcase(left(Ligne.s,5))="next "
						AddElement(spr_boucle_for_next())
						
						spr_boucle_for_next()\posy.l=i*2
						spr_boucle_for_next()\hauteur.l=8
						spr_boucle_for_next()\num_sprite.l=#spr_boucle_next
						decal_for.l=decal_for.l-5
						spr_boucle_for_next()\posx.l=20+gros_decal;decal_for.l;gros_decal;
						
						spr_boucle_for_next()\couleur.l=rgb(255,0,255)
						spr_boucle_for_next()\largeur.l=8
						spr_boucle_for_next()\name.s="Boucle_next"
						spr_boucle_for_next()\num_ligne_fin=i*2
						
						;-Create_sprite_boucle_Next
						CreateSprite(#spr_boucle_next,spr_boucle_for_next()\largeur.l,spr_boucle_for_next()\hauteur.l)
						StartDrawing(SpriteOutput(#spr_boucle_next))
						Box(0,0,spr_boucle_for_next()\largeur.l,spr_boucle_for_next()\hauteur.l,spr_boucle_for_next()\couleur.l)
						DrawingMode(#PB_2DDrawing_Transparent )
				StopDrawing()
				
		Endif
		
		; *********** IF/ENdif***************
		;-recherche Endif
		If Left( Lcase(Ligne.s),5)="endif" 
		AddElement(spr_if())
		spr_If()\posy.l=i*2
		spr_If()\hauteur.l=3
		spr_If()\num_sprite.l=#spr_Endif
		decal_If=decal_If-5
		spr_If()\posx.l=20+gros_decal;decal_IF;gros_decal;
		spr_If()\couleur.l=rgb(255,100,0)
		spr_If()\largeur.l=25
		spr_If()\num_ligne_fin=i*2
		spr_If()\name.s="Endif"
		
		;-Create_sprite_for
		CreateSprite(#spr_endif,spr_If()\largeur.l,spr_If()\hauteur.l)
		StartDrawing(SpriteOutput(#spr_endif))
		Box(0,0,spr_If()\largeur.l,spr_If()\hauteur.l,spr_If()\couleur.l)
		DrawingMode(#PB_2DDrawing_Transparent )
StopDrawing()
Endif
;-recherche If
IF Lcase(left(Ligne.s,3))="if "
		AddElement(spr_If())
		
		spr_If()\posy.l=i*2
		spr_If()\hauteur.l=3
		spr_If()\num_sprite.l=#spr_If
		spr_If()\posx.l=20+gros_decal;decal_IF ;gros_decal
		spr_If()\couleur.l=rgb(255,150,0)
		spr_If()\largeur.l=25
		spr_If()\name.s="If"
		spr_If()\num_ligne_deb=i*2
		decal_IF=decal_IF+5
		Compteur_de_If=Compteur_de_If+1
		SetGadgetText(#text_If, "Nbr de IF :"+str(Compteur_de_If))
		;-Create_sprite_Next
		CreateSprite(#spr_IF,spr_If()\largeur.l,spr_If()\hauteur.l)
		StartDrawing(SpriteOutput(#spr_If))
				Box(0,0,spr_If()\largeur.l,spr_If()\hauteur.l,spr_If()\couleur.l)
				DrawingMode(#PB_2DDrawing_Transparent )
		StopDrawing()
		
Endif

;********************************************************************************
;-Les procedures 

If Lcase(left(Ligne.s,9))="procedure" and  Lcase(left(Ligne.s,15))<>"procedurereturn" ;|

		compteur_procedure=compteur_procedure+1 ;>
AddElement(Spr_procedure())
Spr_Procedure()\name_par.s=stringfield(Ligne.s,1,"(")+"("
Spr_Procedure()\name_par.s=RemoveString(Spr_Procedure()\name_par.s,"procedure",#PB_String_NoCase)
Spr_Procedure()\name_par.s=RemoveString(Spr_Procedure()\name_par.s,".s",#PB_String_NoCase)
Spr_Procedure()\name_par.s=RemoveString(Spr_Procedure()\name_par.s,".l",#PB_String_NoCase)
Spr_Procedure()\name_par.s=RemoveString(Spr_Procedure()\name_par.s,".i",#PB_String_NoCase)
Spr_Procedure()\name_par.s=RemoveString(Spr_Procedure()\name_par.s,".f",#PB_String_NoCase)
Spr_Procedure()\name_par.s=Trim(Spr_Procedure()\name_par.s)
;
;
Spr_Procedure()\name.s=stringfield(Ligne.s,1,"(")
Spr_Procedure()\name.s=RemoveString(Spr_Procedure()\name.s,"procedure",#PB_String_NoCase)
Spr_Procedure()\name.s=RemoveString(Spr_Procedure()\name.s,".s",#PB_String_NoCase)
Spr_Procedure()\name.s=RemoveString(Spr_Procedure()\name.s,".l",#PB_String_NoCase)
Spr_Procedure()\name.s=RemoveString(Spr_Procedure()\name.s,".i",#PB_String_NoCase)
Spr_Procedure()\name.s=RemoveString(Spr_Procedure()\name.s,".f",#PB_String_NoCase)
Spr_Procedure()\name.s=Trim(Spr_Procedure()\name.s)
Spr_Procedure()\num_ligne_deb.i=i*2 ; recup le numero de ligne du debut de la procedure
flag_c_procedure=#True


;-create Sprite Procedure
Spr_procedure()\num_sprite.l=#spr_procedure+compteur_procedure
Spr_Procedure()\posy.l=Spr_Procedure()\posy.l+compteur_procedure*90
Spr_procedure()\posx.l=600
Spr_procedure()\couleur.l=couleur_procedures
Spr_procedure()\Largeur.l=200
Spr_procedure()\hauteur.l=60
;
CreateSprite(Spr_procedure()\num_sprite.l,spr_procedure()\largeur.l,Spr_procedure()\hauteur.l)
StartDrawing(SpriteOutput(Spr_procedure()\num_sprite.l))
		Box(0,0,Spr_procedure()\largeur.l,Spr_procedure()\hauteur.l,Spr_procedure()\couleur.l)
		DrawingMode(#PB_2DDrawing_Transparent )
		DrawText(1,1, Spr_Procedure()\name.s, $0)
StopDrawing()
SetGadgetText(#text_procedure, "Nbr Procedures :"+str(compteur_procedure))

AddElement(spr_procedure_list())
spr_procedure_list()\num_ligne_deb.i=Spr_Procedure()\num_ligne_deb.i
spr_procedure_list()\num_sprite.l=#spr_procedure_list
spr_procedure_list()\posy.l=spr_procedure_list()\num_ligne_deb.i
spr_procedure_list()\posx.l=20
spr_procedure_list()\couleur.l=couleur_procedures
spr_procedure_list()\Largeur.l=(Spr_listing()\largeur.l-spr_procedure_list()\posx.l)
spr_procedure_list()\hauteur.l=5


;-create Sprite procedure_list
If Flag_creation_sprite_Procedure_list=#false
		Flag_creation_sprite_Procedure_list=#True
		CreateSprite(Spr_procedure_list()\num_sprite.l,spr_procedure_list()\largeur.l,Spr_procedure_list()\hauteur.l)
		StartDrawing(SpriteOutput(Spr_procedure_list()\num_sprite.l))
				Box(0,0,Spr_procedure_list()\largeur.l,Spr_procedure_list()\hauteur.l,Spr_procedure_list()\couleur.l)
				DrawingMode(#PB_2DDrawing_Transparent )
				;;;DrawText(1,1, Spr_Procedure_list()\name.s, $0)
		StopDrawing()
Endif
Endif

If Lcase(left(Ligne.s,12))="endprocedure" ;
Spr_Procedure()\num_ligne_fin.i=i*2 
spr_procedure_list()\num_ligne_deb.i=Spr_Procedure()\num_ligne_fin.i
Endif 

;********************************************************************************
Endif
If Flag_c_boucle=#true
		compteur_boucle=i
Endif

If yoyo=>10
		yoyo=0
		DisplayTransparentSprite(#Spr_attente,Spr_attente()\posx.l,Spr_attente()\posy.l)
		FlipBuffers() :ClearScreen($0)
Endif

Next i

yoyo=0
Spr_attente()\posx.l=-128
DisplayTransparentSprite(#Spr_attente,Spr_attente()\posx.l,Spr_attente()\posy.l)
FlipBuffers() :ClearScreen($0)




;- **********************************
;-Passe 2
;- **********************************
For i=1 to nb_ligne
		yoyo=yoyo+1
		Spr_attente()\posx.l=Spr_attente()\posx.l+1
		IF Spr_attente()\posx.l>WindowWidth(#win)
				Spr_attente()\posx.l=-128
		Endif
		
		Ligne.s=StringField(listing.s,i,chr(10))
		Ligne.s=trim(Ligne.s) :Ligne.s=Trim(Ligne.s,chr(9))
		if Ligne.s<>""
				;-appel des procedures
				;-entrée dans procedure detecté
				If Left(Lcase(Ligne.s),9)="procedure" ; on entre dans une procedure
						
						; on recupe le nom de la procedure "mere"
						nom_de_la_procedure_mere.s=stringfield(Ligne.s,1,"(")
						nom_de_la_procedure_mere.s=RemoveString(nom_de_la_procedure_mere.s,"procedure",#PB_String_NoCase)
						nom_de_la_procedure_mere.s=RemoveString(nom_de_la_procedure_mere.s,".s",#PB_String_NoCase)
						nom_de_la_procedure_mere.s=RemoveString(nom_de_la_procedure_mere.s,".l",#PB_String_NoCase)
						nom_de_la_procedure_mere.s=RemoveString(nom_de_la_procedure_mere.s,".i",#PB_String_NoCase)
						nom_de_la_procedure_mere.s=RemoveString(nom_de_la_procedure_mere.s,".f",#PB_String_NoCase)
						nom_de_la_procedure_mere.s=Trim(nom_de_la_procedure_mere.s)
						Flag_procedure=#true
						; on recup les coordonées de la procedure "Mere"
						ForEach Spr_procedure()
								If spr_procedure()\name.s=nom_de_la_procedure_mere.s
										position_y=spr_procedure()\posy.l                  
										position_x=spr_procedure()\posx.l
										largeur_procedure=Spr_procedure()\Largeur.l
								Endif
						Next
				Endif
				If Left(Lcase(Ligne.s),12)="endprocedure"
				Flag_procedure=#False
				
		Endif
		
		;-appel de procedure detecté
		If left( Lcase(Ligne.s),9)<>"procedure" and  Left(Lcase(Ligne.s),7)<>"declare"
				
				ForEach Spr_procedure()
						if Cherche_mot(Lcase(Ligne.s),Spr_Procedure()\name_par.s)=#true
								compteur_procedure_appel=compteur_procedure_appel+1
								; if Spr_Procedure()\name_par.s="toto("
								; calldebugger
								; Endif
								
								
								If Flag_procedure=#false ;- l'appel a lieu dans le listing
										compteur_1=compteur_1+6
										if compteur_1>40:compteur_1=8:Endif
										AddElement(spr_procedure_appel())
										spr_procedure_appel()\num_sprite.l=#spr_procedure_appel
										spr_procedure_appel()\posy.l=i *2                    
										spr_procedure_appel()\posx.l=(Spr_listing()\largeur.l-20)
										spr_procedure_appel()\couleur.l=couleur_appel
										spr_procedure_appel()\Largeur.l=5
										spr_procedure_appel()\hauteur.l=5
										spr_procedure_appel()\name.s=Spr_Procedure()\name.s
										spr_procedure_appel()\numero_ligne.l=i*2
										spr_procedure_appel()\arrx.i=Spr_Procedure()\posx.l
										spr_procedure_appel()\arry.i=Spr_Procedure()\posy.l
										spr_procedure_appel()\long1=Compteur_fil ;random(random(100,31),30)
										Compteur_fil=compteur_fil+10
										spr_procedure_appel()\couleur_fil.i=RGB(random(255,127),random(255,127),random(255,127))
										spr_procedure_appel()\type=#False
										spr_procedure_appel()\entree=Spr_Procedure()\posy.l+compteur_1
										
										; creation sprite
										AddElement(spr_procedure_appel_arr())
										spr_procedure_appel_arr()\num_sprite.l=#spr_procedure_appel_arr
										spr_procedure_appel_arr()\posy.l=Spr_Procedure()\posy.l                  
										spr_procedure_appel_arr()\posx.l=Spr_Procedure()\posx.l
										spr_procedure_appel_arr()\couleur.l=spr_procedure_appel()\couleur_fil.i
										spr_procedure_appel_arr()\Largeur.l=7
										spr_procedure_appel_arr()\hauteur.l=7
										
								Else ;- l'appel a lieu au sein d'une procedure
										compteur_2=compteur_2+6
										if compteur_2>40:compteur_2=8:Endif
										AddElement(spr_procedure_appel())
										spr_procedure_appel()\num_sprite.l=#spr_procedure_appel
										; ici on prend les coordonée de la procedure mere pour le dessins de l'appel
										spr_procedure_appel()\posy.l=position_y   
										spr_procedure_appel()\posx.l=spr_procedure()\posx.l+largeur_procedure
										spr_procedure_appel()\couleur.l=couleur_appel
										spr_procedure_appel()\Largeur.l=5
										spr_procedure_appel()\hauteur.l=5
										spr_procedure_appel()\name.s=Spr_Procedure()\name.s ; vers la procedure de destination
										spr_procedure_appel()\numero_ligne.l=i
										
										spr_procedure_appel()\arrx.i=Spr_Procedure()\posx.l+largeur_procedure
										spr_procedure_appel()\arry.i=Spr_Procedure()\posy.l
										
										
										spr_procedure_appel()\long1=Compteur_fil2;random(random(150,16),15)
										Compteur_fil2=compteur_fil2+15
										spr_procedure_appel()\couleur_fil.i=RGB(random(255,50),random(255,50),random(255,50))
										spr_procedure_appel()\type=#true
										spr_procedure_appel()\entree=Spr_Procedure()\posy.l+compteur_2
										
										; creation sprite
										AddElement(spr_procedure_appel_arr())
										spr_procedure_appel_arr()\num_sprite.l=#spr_procedure_appel_arrd
										spr_procedure_appel_arr()\posy.l=Spr_Procedure()\posy.l                  
										spr_procedure_appel_arr()\posx.l=spr_procedure_appel()\arrx.i
										spr_procedure_appel_arr()\couleur.l=spr_procedure_appel()\couleur_fil.i
										spr_procedure_appel_arr()\Largeur.l=7
										spr_procedure_appel_arr()\hauteur.l=7
										
								Endif
								
								;-create Sprite Procedure appel depart
								If Flag_creation_sprite_procedure_appel=#false ; comme ça on ne creer le sprite qu'une seule fois ;)
										Flag_creation_sprite_procedure_appel=#True
										CreateSprite(spr_procedure_appel()\num_sprite.l,spr_procedure_appel()\largeur.l,spr_procedure_appel()\hauteur.l)
										StartDrawing(SpriteOutput(spr_procedure_appel()\num_sprite.l))
												Box(0,0,spr_procedure_appel()\largeur.l,spr_procedure_appel()\hauteur.l,spr_procedure_appel()\couleur.l)
												;DrawText(1,1, spr_procedure_appel()\name.s, RGB(0, 255, 0))
										StopDrawing()
								Endif
								;
								;-create Sprite Fleche arrivée gauche
								If Flag_creation_sprite_Fleche_appel_arr=#false ; comme ça on ne creer le sprite qu'une seule fois ;)
										Flag_creation_sprite_Fleche_appel_arr=#True
										spr_procedure_appel_arr()\num_sprite.l=#spr_procedure_appel_arr
										CreateSprite(spr_procedure_appel_arr()\num_sprite.l,spr_procedure_appel_arr()\largeur.l,spr_procedure_appel_arr()\hauteur.l)
										StartDrawing(SpriteOutput(spr_procedure_appel_arr()\num_sprite.l))
												xsprdess.s="0,1,2,3,2,1,0"
												;CallDebugger
												for u=1 to 7
														vv=val(StringField(xsprdess.s,u,","))
														plot(vv,u-1,spr_procedure_appel_arr()\couleur.l)
												Next u
										StopDrawing()
								Endif
								
								;- create Sprite Fleche arrivée droite
								If Flag_creation_sprite_Fleche_appel_arrd=#false ; comme ça on ne creer le sprite qu'une seule fois ;)
										Flag_creation_sprite_Fleche_appel_arrd=#True
										spr_procedure_appel_arr()\num_sprite.l=#spr_procedure_appel_arrd
										CreateSprite(spr_procedure_appel_arr()\num_sprite.l,spr_procedure_appel_arr()\largeur.l,spr_procedure_appel_arr()\hauteur.l)
										StartDrawing(SpriteOutput(spr_procedure_appel_arr()\num_sprite.l))
												xsprdess.s="3,2,1,0,1,2,3"
												;CallDebugger
												for u=1 to 7
														vv=val(StringField(xsprdess.s,u,","))
														plot(vv,u-1,spr_procedure_appel_arr()\couleur.l)
												Next u
										StopDrawing()
								Endif
						Endif
				Next
		Endif
Endif

if yoyo>=10
		yoyo=0
		DisplayTransparentSprite(#Spr_attente,Spr_attente()\posx.l,Spr_attente()\posy.l)
		FlipBuffers() :ClearScreen($0)
Endif
Next i

Spr_attente()\posx.l=-1280
debug  #Spr_attente
EndProcedure



Procedure Cherche_mot(ligne.s,mot_a_chercher.s)
		; by Dobro
		pos = FindString(lcase(ligne.s),lcase(mot_a_chercher.s),1,#PB_String_NoCase)
		; recherche arriere
		if pos>0
				For i=1 to 35
						car.s=mid(ligne.s,pos-i,1)
						cc=asc(car.s)
						If (cc >64 and cc<91) or (cc>47 and cc<58) or (cc>96 and cc<123) or (cc>223 and cc<255) or cc=95 ; si c'est une lettre on continue
						else
								Dep=pos-i
								Break
						Endif
				Next i
				
				;recherche avant
				For i=1 to 50
						car.s=mid(ligne.s,Dep+i,1)
						cc=asc(car.s)
						If (cc >64 and cc<91) or (cc>47 and cc<58) or (cc>96 and cc<123) or (cc>223 and cc<255) or cc=95 or cc=32; si c'est une lettre on continue
								longueur=longueur+1
						Else
								Break
						Endif
				Next i
				
				;debug Mid(Ligne.s,Dep+1,longueur)
				; renvoi le mot
				;ProcedureReturn Mid(Ligne.s,Dep+1,longueur)
				;renvoi la position et la longueur
				;ProcedureReturn str(Dep+1)+","+str(longueur)
				;renvoi Vrais ou faux 
				mot_trouve.s=Mid(Ligne.s,Dep+1,longueur)
				long=len(mot_a_chercher.s)
				;calldebugger
				; if longueur<long
				; ;ProcedureReturn #False
				; Endif
				
				if longueur>0
						;CallDebugger
						mot_a_chercher.s=Left(mot_a_chercher.s,Len(mot_a_chercher.s)-1)
						
						;debug mot_trouve.s
						;debug mot_a_chercher.s
						If lCase(mot_trouve.s)=Lcase(mot_a_chercher.s)
								ProcedureReturn #True
						Else
								ProcedureReturn #False
						Endif
				endif
		Else
				ProcedureReturn #False
		Endif			
EndProcedure
; Epb
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Graph_Code

Message par MLD »

Merci Zorro
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Graph_Code

Message par Kwai chang caine »

Marche bien ici
J'ai testé avec un petit code de 4 procédures
On se demande d’où t'es venu cette idée de coder ça, mais c'est cool :wink:
Ca existe peut être dans des gros IDE ?
Merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Graph_Code

Message par Zorro »

bah , les idées me tombent dessus, comme la fiantes des pigeons :lol:

Pour ceux qui ont EPB , il suffit de compiler Graph_code , et le poser dans le dossier "Outils" de EPB
pour avoir celui-ci, dispo dans le menu "outils"

Ps sur certains "gros" code, il peut arriver que l'affichage ne se fasse pas tout de suite
utilisez la molette pour rafraichir l'ecran ... ou bien patientez un moment ..
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Graph_Code

Message par G-Rom »

@Zobrro tu devrais utilisé les courbes de bezier pour le lien entre "les nodes"


@Kcc
Oui, pour ta question sur "les gros ide", ca existe depuis longtemps, par exemple , sous godot , tu as le visual designer pour les shaders ,voici ce que j'ai fait :

Image

ce qui donne :
https://images-ext-2.discordapp.net/ext ... /giphy.mp4
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Graph_Code

Message par Zorro »

@G-Rom
ce serai cool de respecter au minimum mon pseudo ;)

ce sont des nodes en fait ?

j'utilise ça avec blender 2.80 :)

moi je me contente d'afficher un graph du listing, j'en suis pas a pourvoir Coder avec :)

sous Blender 2.8 les nodes pour definir une matiere c'est le top ... perso j'adore :)

il y a MicroDevWeb qui tente un truc dans le genre
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Graph_Code

Message par G-Rom »

Oui, après tu les appellent comme tu veut.
j'ai pas regarder ton code, mais je les définirais simplement ainsi :

Code : Tout sélectionner

Structure sNode
  title.s
  List *in.sNode()
  List *out.sNode()
  value.d[32]
  *operation
EndStructure
ou le pointeur pointe vers une fonction qui execute ce que doit faire le noeud et envois le resultat aux *out , etc...
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Graph_Code

Message par Zorro »

oui donc tu parle bien de "node" pour programmer ....

Blender 2.80 utilise des Nodes pour Definir des parametres d'une matiere ....

mon programme lui n'a rien a voir avec ça :)
c'est simplement une façon de représenter les appels au procedures d'un listing ...
un Graph quoi :)
par contre Microdevweb apparemment bosse sur des Nodes
https://www.purebasic.fr/french/viewtop ... =4&t=17746

mais son image n'est plus apparente dans son message

exemple de nodes sous blender

ici un cube tout simple , j'applique un shader de "Verre" bleu , puis une texture voronoi sur le deplacement :) (voir les nodes dessous )
ensuite j'ai juste ajouté une lumiere point Rose a l'interieur :)

je pouvais pas blairer Blender (je n'utilisai QUE C4D) , mais depuis sa version 2.80 j'adore !! :)
je m’émerveille devant un truc tout con (mon cube) :)
Image
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Graph_Code

Message par microdevweb »

@Zorro,

Je bosse sur une nouvelle version plus propre et le plus générique possible. Je devrai la publiée d'ici quelques jours.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Graph_Code

Message par Zorro »

bonne nouvelle, et bon courage a toi :)

je suis juste curieux de savoir quel moyen (Librairie ? ) tu utilises pour generer tes Nodes ???
le GDI ??
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Graph_Code

Message par microdevweb »

@Zorro,

Juste Vector
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Graph_Code

Message par Ollivier »

Zorro a écrit :il y a MicroDevWeb qui tente un truc dans le genre
Perso, le truc dans le genre je l'ai pondu sur le site DarkBasic en 2003...
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Graph_Code

Message par Ollivier »

Et le plus difficile à faire, uniquement sur ce que j'ai pu faire (appels des procédures), c'est le choix de cheminement : c'est du pathfinding.

J'avais, de souvenir, évité ça en restant sur de l'arborescent. Ça aide déjà pas mal pour retrouver l'origine des appels. Mais ça se limite quand même pour informer. Et puis ça bugue si les récursivités ne sont pas détectées.

Les courbes, je n'en parle même pas : c'est le plus rapproché de la perception humaine. Mais c'est pour éviter quoi ? (Beaucoup de calculs surtout quand on veut anticiper l'évitement des noeuds, ces beaux meli-melo pas classe...)
C'est design mais ça se limite. Et puis à l'époque, avant de faire un aa sur des courbes...
Répondre