1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
!if $wims_read_parm!=slib_header
!goto proc
!endif
slib_author=Bernadette, Perrin-Riou
slib_example=5,3,3,,perfect middle\
5,3,3,,perfect middle html\
12,2,4,[A,B,C,D],point html\
70,2,10,,point html
!exit
:proc
!reset slib_segments slib_dessin
!distribute item $wims_read_parm into slib_N,slib_s,slib_h,slib_text
slib_option = !item 5 to -1 of $wims_read_parm
!default slib_s=5
!default slib_h=8
!default slib_color1=blue
!default slib_color2=green
!default slib_color3=yellow
slib_text=!declosing $slib_text
slib_G = 1
slib_cnt = 1
slib_n = $[2*$slib_N]
slib_A1 =0
slib_height1=1
slib_sizey=1
slib_cnt1=0
slib_width1=15
slib_Sizey=$[$slib_h+1]
slib_height=5
slib_choix1=!values 1 for x=1 to $[$slib_s+3]
slib_choix0=!values 0 for x=1 to $[$slib_s-3]
slib_noeud= !random 0,1 repeat $n
#permet d'assurer que l'arbre ne part pas avec une seule branche (inutile dans le cas parfait)
slib_noeud=1,$slib_noeud
slib_choix=$slib_choix1, $slib_choix0
slib_position=$empty
slib_milieu=0,-1
!for slib_k=1 to $slib_n
slib_L=!line $slib_k of $slib_G
!if $slib_L<>$empty
slib_i=!item 1 of $slib_L
slib_position_prov=$(slib_A$slib_i),$[-$(slib_height$slib_i)]
slib_position=!append line $slib_position_prov to $slib_position
!if $slib_cnt > $[$slib_N] or $slib_sizey > $slib_Sizey
!else
#choix des fils (position et nombre : la position est-elle intressante pour un arbre non binaire ? )
slib_c=!item $slib_k of $slib_noeud
!if perfect iswordof of $slib_option or $slib_c=1
slib_a=!item 1 to $slib_s of $slib_choix1
!else
slib_a=!shuffle $slib_choix
slib_a=!item 1 to $slib_s of $slib_a
!endif
slib_Li=
!for slib_j=1 to $slib_s
slib_b=!item $slib_j of $slib_a
!if $slib_b <> 0
#creation d'un fils
slib_jj=$[$slib_cnt+1]
#sa hauteur
slib_height$slib_jj= $[$(slib_height$slib_i)+1]
#la hauteur de l'arbre
slib_sizey=$[max($slib_sizey, $(slib_height$slib_jj))]
# Ne sert rien ?
slib_cnt$(slib_height$slib_jj)=$[$(slib_cnt$(slib_height$slib_jj))+1]
#on rajoute une ligne pour le fils
slib_G=!append line $slib_jj to $slib_G
#nombre de sommets
slib_cnt=$[$slib_cnt +1]
!else
slib_jj=sentinelle
!endif
#on rajoute le fils sur la ligne du pre, rien s'il n'y a rien cette position
slib_Li=!append item $slib_jj to $slib_Li
#le calcul suivant sert pour le dessin. Faut-il le mettre ici ?
!if $slib_b <> 0
#position
slib_A$slib_jj=$[$(slib_A$slib_i)+($slib_j-($slib_s+1)/2)*$(slib_width$slib_i)]
#calcul de la largeur donne au sommet $slib_jj pour ses fils ventuels
slib_width$slib_jj=$[$(slib_width$slib_i)/min($slib_s,$slib_s+1)]
slib_milieu_prov=$[($(slib_A$slib_i)+2*$(slib_A$slib_jj))/3],$[-($(slib_height$slib_i) +2*$(slib_height$slib_jj))/3]
slib_milieu=!append line $slib_milieu_prov to $slib_milieu
!endif
!next slib_j
#on met la ligne $slib_k dfinitive
slib_G=!replace line number $slib_k by $slib_L,$slib_Li in $slib_G
!endif
!endif
!next slib_k
#Trace du dessin
!set slib_xrange=$[-$slib_s*$slib_width1/2],$[$slib_s*$slib_width1/2]
!set slib_yrange=$[-$slib_sizey-0.5],-0.5
slib_cnt=!linecnt $slib_G
!for slib_k=1 to $slib_cnt
slib_u=!line $slib_k of $slib_G
slib_i=!item 1 of $slib_u
slib_position_prov=!line $slib_k of $slib_position
!for slib_j in $slib_u
!if $slib_j notsametext sentinelle
#trace de la droite
slib_position_prov1=!line $slib_j of $slib_position
slib_segments=!append item $slib_position_prov,$slib_position_prov1 to $slib_segments
#on coupe les segments au milieu pour mettre un cercle et ventuellement du texte
!if middle iswordof $slib_option
slib_milieu_prov=!line $slib_j of $slib_milieu
slib_dessin = !append line disk $slib_milieu_prov,30,white\
circle $slib_milieu_prov, 30,$slib_color3 to $slib_dessin
!endif
!endif
!next slib_j
!if point iswordof $slib_option
slib_dessin =!append line disk $slib_position_prov,30,white\
circle $slib_position_prov,30,$slib_color2 to $slib_dessin
!endif
!if $slib_text <> $empty
slib_textk=!item $slib_k of $slib_text
slib_dessin =!append line text black,$slib_position_prov, medium,$slib_textk to $slib_dessin
!endif
!next slib_k
slib_dessin=xrange $slib_xrange\
yrange $slib_yrange\
linewidth 2\
segments $slib_color1,$slib_segments\
$slib_dessin
slib_out=$slib_dessin
!if url iswordof $slib_option or html iswordof $slib_option
!set slib_tmp=400
!set insdraw_size=$slib_tmp,$[($(slib_yrange[2])-($(slib_yrange[1])))/($(slib_xrange[2])-($(slib_xrange[1])))*$slib_tmp*$slib_height]
!set insdraw_size=$[min(1500,($(slib_xrange[2])-($(slib_xrange[1])))/($(slib_yrange[2])-($(slib_yrange[1])))*$slib_tmp)],$slib_tmp
!insdraw $slib_out
slib_out=$ins_url
!if html iswordof $slib_option
slib_out=<img src="$ins_url" alt="">
!else
slib_out=$slib_out,[$slib_G],[$slib_position],[$slib_milieu],$insdraw_size
!endif
!else
slib_out=[$slib_dessin],[$slib_G],[$slib_position],[$slib_milieu]
!endif
|