#rR gscope_outils.tcl proc TestUpvar {} { #biotcl TestUpvar {} set T "Salut" AvecUpvar $T A return $A } proc AvecUpvar {T {aA ""} {aB ""}} { #biotcl WithUpvar {text adressOfA addressOfB} if {$aA!=""} { upvar $aA A } if {$aB!=""} { upvar $aB B } set A [string index $T 0] set B [string index $T end] return "c'est fait" } proc Tee Quoi { return $Quoi } proc Boum {} { if { ! [OuiOuNon "Do You want to exit Gscope" 0]} { return "" } exit } proc TwoPi {} { #biotcl TwoPi {} returns 2*Pi return [expr {2*acos(-1.)}] } proc FromProtUrl {url lolo papa} { #rR merci de me dupliquer dans ~ripp/msp/src/MisynpatTools.tcl et gscope_outils.tcl foreach X {lolo papa} { if {[regexp {^([0-9]+)([^0-9].+)$} [set $X] M K V]} { set N "" foreach p [split $K ""] { append N [string index $V $p] } set $X $N } } #rR from D. J. Hagberg Wiki Tcl set auth "Basic [Base64Encode $lolo:$papa]" set headerl [list Authorization $auth] Espionne $url set tok [http::geturl $url -headers $headerl] set res [http::data $tok] http::cleanup $tok return $res } proc Html_Chabada {Template args} { set Local [Chabada $Template {*}$args] return [Html_Append $Local] } proc Chabada {Template args} { #rR Chabada permet de remplacer des variables dans un template #rR Template peut aussi contenir le texte à modifier... #rR le dernier argument peut etre extract_body ou extract_head ... une balise quoi ... ;) if {[regexp "\n" $Template]} { set Texte $Template set FicTemplate "" } else { set TemplateAbsent 1 #rR On a toutes ces possiblilités pour trouver le fichier qu'on veut traiter foreach TemplatePath [list "" . /home/ripp/evocc/html /home/ripp/blox/html /home/ripp/bli/html /home/ripp/bli/js /home/ripp/bli/js [WaliSourceDir] [WaliSourceDir]/html [WaliSourceDir]/js [WaliSourceDir]/templates] { if {[file exists [set FicTemplate "$TemplatePath/$Template"]]} { set TemplateAbsent 0; break } } if {$TemplateAbsent} { LogWscope "Error Template not found : $Template"; return "" } set Texte [ContenuDuFichier $FicTemplate] } set Texte [encoding convertto "utf-8" $Texte] if {[regexp {^extract_(.+)$} [lindex $args end] Match Balise]} { set args [lrange $args 0 end-1] regsub ".*<$Balise>" $Texte "" Texte regsub ".*$" $Texte "" Texte } foreach KV $args { if { ! [regexp {([^=]+)=(.*)$} $KV Match K V] } { continue } if {[regexp {^\".*\"$} $V]} { set V [string trim $V "\""] } regsub -all {\&} $V {\\\&} V if {[regexp -nocase {^_[a-z0-9]+_$} $K]} { regsub -all $K $Texte $V Texte } else { regsub -all "\{\\\$$K\}" $Texte $V Texte regsub -all "" $Texte $V Texte ;#rR c'est mieux car invisible si pas remplacé } } if {[regexp {.js$} $FicTemplate] && ! [regexp {" } if {[regexp {.css$} $FicTemplate] && ! [regexp {" } return $Texte } proc RecureSubdirFrom {Dir} { set LesSubDir [lsort [glob -nocomplain -type d -directory $Dir *]] set List {} foreach SubDir $LesSubDir { if {[file type $SubDir]=="link"} { continue } lappend List $SubDir } set LesSubDir $List foreach SubDir $LesSubDir { LConcat List [RecureSubdirFrom $SubDir] } return $List } proc QGQ args { return [QuestionDeScience "GeneQuid" "ret [join $args { }]"] } proc MdP {{Qui ""} {Pass ""} {Trousseau ""} {Nouveau ""}} { package require md5crypt if {$Trousseau==""} { set Trousseau "/usr/local/apache2/users/TclPass" } foreach Ligne [LesLignesDuFichier $Trousseau] { lassign [split $Ligne ":"] Q P set MdP($Q) $P } if {$Nouveau!=""} { if { ! [MdP ripp $Pass]} { FaireLire "Désolé, pour en créer un nouveau, il faut le MdP pour l'administrateur" ; return 0 } set Nouveau [string range $Nouveau 0 7] set MD5Nouveau [md5crypt::md5crypt password $Nouveau] set iDollard [string last "\$" $MD5Nouveau] set Cle [string range $MD5Nouveau $iDollard+1 end] Espionne "$MD5Nouveau $iDollard $Cle" AppendAuFichier $Trousseau "$Qui:$Cle" return 1 } set Pass [string range $Pass 0 7] set Cle $MdP($Qui) set MD5 "\$1\$$Pass\$$Cle" if {[md5crypt::md5crypt password $Pass]!=$MD5} { return 0 } return 1 } proc Parle {TexteOuFichier {Langue ""}} { if {$Langue==""} { set Langue "en" } if { ! [regexp " " $TexteOuFichier] && [file exists $TexteOuFichier]} { exec espeak -f $TexteOuFichier -v $Langue } else { exec espeak $TexteOuFichier -v $Langue } return $TexteOuFichier } proc StatisticsFromList {Liste {GetWhat ""} {ExprFunction ""}} { #rR on rend les stats simples de lalliste des valeurs #rR sauf pour Iterate on on applique l'expression pour chaque valeur (par ex. log10) if {$GetWhat=="Iterate"} { set LeNew {} foreach V $Liste { set N [expr [set ExprFunction]($V)] lappend LeNew $N } return $LeNew } set Sum 0 set Length 0 set Min [lindex $Liste 0] set Max [lindex $Liste 0] foreach X $Liste { incr Length set Sum [expr $Sum + $X] if {$Min > $X} { set Min $X } if {$Max < $X} { set Max $X } } if {$Length==0} { return "" } set Average [expr 1.0*$Sum/$Length] set SumDeviation 0 foreach X $Liste { set SumDeviation [expr $SumDeviation + ($Average-$X)*($Average-$X)] } if {$Length==1} { set Deviation 0.0 } else { set Deviation [expr sqrt(1.0*$SumDeviation/($Length-1))] } if {[info exists $GetWhat]} { set Valeur [set $GetWhat] if {$ExprFunction!=""} { set Valeur [expr [set ExprFunction]($Valeur)] } return $Valeur } return "$Average $Deviation $Min $Max $Sum $Length" } proc MoyenneEcartMinMaxCumulLong {Liste {GetWhat ""} {ExprFunction ""}} { return [StatisticsFromList $Liste $GetWhat $ExprFunction] } proc Palette {{Qui ""} {Quoi ""}} { global Palette set Qui [string tolower $Qui] set Quoi [string tolower $Quoi] if {$Quoi==""} { set Quoi "rgb" } if {[info exists Palette($Qui,$Quoi)]} { return $Palette($Qui,$Quoi) } if {[info exists Palette("EstCharge")]} { if {[regexp {^[0-9]+ [0-9]+ [0-9]+$} $Qui] && [info exists Palette(black,$Quoi)]} { set NearestRGB [NearestColor $Qui] return [Palette $NearestRGB $Quoi] } if {[regexp "similar" $Quoi]} { set Copains {} foreach NomCouleur $Palette(listof,name) { if {[regexp -nocase $Qui $NomCouleur]} { lappend Copains $NomCouleur } } return $Copains } return "" } set Palette("EstCharge") 1 set Fichier [open "/etc/X11/rgb.txt" "r"] set Texte "" set OnAttendDebut 1 while {[gets $Fichier Ligne]>=0 } { if {$OnAttendDebut} { if { ! [regexp {^!} $Ligne]} { continue } set OnAttendDebut 0 continue } regsub -all {[ \t]+} $Ligne " " Ligne set Ligne [string trim $Ligne] set LesMots [split $Ligne " "] set NomCouleur [join [lrange $LesMots 3 end] " "] set nomcouleur [string tolower $NomCouleur] lappend Palette(listof,name) $NomCouleur set RGB [join [lrange $LesMots 0 2] " "] lappend Palette(listof,rgb) $RGB set Palette($RGB,rgb) $RGB lappend Palette($RGB,synonyms) $NomCouleur set Palette($nomcouleur,rgb) $RGB set Palette($nomcouleur,name) $NomCouleur } close $Fichier set Palette(listof,name) [lsort -unique $Palette(listof,name)] foreach RGB $Palette(listof,rgb) { set Palette($RGB,name) [lindex $Palette($RGB,synonyms) 0] foreach NomCouleur $Palette($RGB,synonyms) { set nomcouleur [string tolower $NomCouleur] set Palette($nomcouleur,synonyms) $Palette($RGB,synonyms) } } return [Palette $Qui $Quoi] } proc RecordsContaining {Query {FileOrList ""}} { #rR pour Faire une recherche dans un texte même s'il y a de accents if {$FileOrList == ""} { set FileOrList "/home/moumou/www/cgi-bin/all.csv" } if {! [string is list $FileOrList]} { set Text [ContenuDuFichierSansAccent $FileOrList] set List [split $Text "\n"] } else { set List $FileOrList } set QuerySansAccent [SansAccent $Query] set LesRecords {} foreach Ligne $List { if {[regexp -nocase $QuerySansAccent $Ligne]} { lappend LesRecords $Ligne } } return $LesRecords } proc ContenuDuFichierSansAccent Fichier { set R [exec uni2ascii -q -B $Fichier] return $R } proc SansAccent {Texte} { if {[catch {set R [exec tcsh -c "setenv LANG utf-8 ; echo '$Texte' | uni2ascii -q -B"]} Error]} { #puts "Error $Error pout '$Texte'" return $Texte } else { return $R } } proc Hostname {} { #return $::env(HOST) # modif AK (17/07/2020) pour Rivet return [info hostname] } proc HoteCourt {{N 3}} { return [string range [Hostname] 0 [incr N -1]] } proc ChatAlannot {args} { set R [eval $args] return $R } proc Dialog {HostPort args} { #rR on va discuter en client avec un serveur Gscope ou Ordali DecortiqueIpCafe $HostPort Host Port if {[catch {set Sockette [socket $Host $Port]} Message]} { return $Message } set Question [join $args " "] if {$Question=="" || $Question=="GetSocket"} { return $Sockette } append Question "\nFinDeMessage" puts $Sockette $Question flush $Sockette set LaReponse {} while {[gets $Sockette R]>=0} { lappend LaReponse $R } set Reponse [join $LaReponse "\n"] return $Reponse } proc Generaliste {CanalClient} { #rR procedure par défaut qui discute en tant que serveur de socket set CloseCanal 0 #rR le while ne sert qu'à faire break puisqu'on fait return à chaque fois ... #rR j'ai dû bidouiller pour que le php recoive quelque chose ...il faut fermer le canal ... mais attention y a eu modif ... while {[gets $CanalClient Question] >= 0} { #Espionne "Question en entree =$Question=" if {[regexp "\n?FinDeMessage\n?$" $Question]} { regsub "\n?FinDeMessage\n?$" $Question "" Question set CloseCanal 1 if {$Question==""} { break } } # puts $CanalClient "Question=$Question=" # flush $CanalClient if {$Question=="CloseCanal"} { set CloseCanal 1 ; break } # set R [eval $Question] #Espionne "Vais faire eval de =$Question=" if {[catch {set R [eval $Question]} Message]} { Espionne "recu message $Message" puts $CanalClient $Message close $CanalClient return $Message } #Espionne "Vais envoyer =$R=" puts $CanalClient $R flush $CanalClient if {$CloseCanal} { close $CanalClient } return $R } if {$CloseCanal || [eof $CanalClient]} { # puts $CanalClient "Salut" # flush $CanalClient close $CanalClient } return "$CanalClient is closed" } proc CreeOreilleGeneraliste {CanalClient IpLocal PortSavant} { fconfigure $CanalClient -blocking 0 -buffering line -eofchar \x04 fileevent $CanalClient readable [list Generaliste $CanalClient] return $CanalClient } proc TestDialogPort {} { Espionne [DialogPort] Espionne [DialogPort] Espionne [DialogPort GetFirst] Espionne [DialogPort New] Espionne [DialogPort GetAll] Espionne [DialogPort 21109] Espionne [DialogPort New] Espionne [DialogPort GetAll] Espionne [DialogPort] } proc DialogPort {{Action ""}} { #rR Crée un ou plusieurs serveur de socket #rR si Action est vide ou GetFirst (on en crée un si nécessaire et) on le rend #rR si Action est New on en crée un nouveau #rR si Action est un numéro de port on le crée (voir ci-dessous pour les détail s'il existe déjà) global DialogPort if {$Action==""} { set Action "GetFirst" } if {$Action=="GetFirst"} { if {[info exists DialogPort(ListOf,Port)]} { return [lindex $DialogPort(ListOf,Port) 0] } } if {[regexp "GetAll" $Action]} { if {[info exists DialogPort(ListOf,Port)]} { return $DialogPort(ListOf,Port) } else { if { ! [regexp "Create" $Action] } { return "" } DialogPort return [DialogPort "GetAll"] } } #rR Can be CreateAndDisplayAll if {[regexp "DisplayAll" $Action]} { if {[info exists DialogPort(ListOf,Port)]} { set ExistingPorts $DialogPort(ListOf,Port) FaireLire "Ports available on [Hostname]\n$ExistingPorts" set BoutonDialog "[Vitrine GetVitrine].dialog" if {[regexp "^\." $BoutonDialog]} { $BoutonDialog configure -text "Dialog sur [Hostname] $ExistingPorts /+" } return $DialogPort(ListOf,Port) } else { if { ! [regexp "Create" $Action] && ! [OuiOuNon "There is no port available on [Hostname].\nDo I create it ?"]} { return "" } DialogPort return [DialogPort "DisplayAll"] } } set NbTentatives 2 set StartingPort 21100 set Port $StartingPort if {$Action=="New"} { set ExistingPorts [DialogPort "GetAll"] while {[lsearch $Port $ExistingPorts]>=0} { incr Port } } set ForcePort 0 if {[regexp {^[0-9]+$} $Action]} { set ForcePort 1 set Port $Action set NbTentatives 1 } while {1} { if {$NbTentatives < 1 } { return "Error : Trop de tentatives infructueuses de création de socket serveur port $Port" } incr NbTentatives if {[catch {set Socket [socket -server CreeOreilleGeneraliste $Port]} Message]} { if {[regexp -nocase "Already in use" $Message]} { if {$ForcePort} { return $Message } ;#rR le port existe déjà mais on rend quand même le message d'erreur incr Port continue } } lappend DialogPort(ListOf,Port) $Port return $Port } } proc SubmitGscope {{Commande ""} {NbProc ""} {RunningDir ""} {Log ""}} { set NbP 4 set RDir "[RepertoireDuGenome]/Running" set HoteCourt [HoteCourt] set LogR "${HoteCourt}_date.log" if {$Commande==""} { return [Espionne "Usage SubmitGscope BlastPPourTous \{NbProc $NbP\} \{RunningDir $RDir\} \{Log $LogR\}"] } if {$NbProc==""} { set NbProc $NbP } if {$Log==""} { set Log [HoteCourt] } if {$RunningDir==""} { set RunningDir $RDir } if { ! [file exists $RunningDir]} { file mkdir $RunningDir } NousAllonsAuBoulot $RunningDir set LesSoumis {} foreach N [NombresEntre 1 $NbProc] { while {1} { set LogFile "${Log}_[Date %m%d_%H%M%S]" if { ! [file exists $LogFile]} { break } after 500 } set Message "$Commande lance sur $HoteCourt [Date NiceSeconds]" lappend LesSoumis $Message Sauve $Message dans $LogFile eval exec gscope yes $Commande >& $LogFile & } OnRevientDuBoulot return $LesSoumis } proc MailLbgi {{Qui ""} {Quoi ""}} { global MailLbgi if {$Qui=="" && $Quoi==""} { set Qui "ListOf" ; set Quoi "nmpnlb" } set Qui [string toupper $Qui] set Quoi [string toupper $Quoi] if {$Qui=="LIST"} { set Qui "LISTOF" } if {$Qui=="RELOAD" && [info exists MailLbgi]} { unset MailLbgi set Qui "" set Quoi "" return [MailLbgi] } regsub -all "LOGIN" $Quoi "L" Quoi regsub -all "PRENOM" $Quoi "P" Quoi regsub -all "NOM" $Quoi "N" Quoi regsub -all "MAIL" $Quoi "M" Quoi if {[info exists MailLbgi($Qui,$Quoi)]} { if {[PourWscope] && $Qui=="LISTOF"} { return "
\n[join $MailLbgi($Qui,$Quoi) \n]\n
" } return $MailLbgi($Qui,$Quoi) } if {[info exists MailLbgi("EstCharge")]} { if {[regexp {^[LNPMB]+$} $Quoi]} { set LesL $MailLbgi(LISTOF,L) set LesN $MailLbgi(LISTOF,N) set LesP $MailLbgi(LISTOF,P) set LesM $MailLbgi(LISTOF,M) set LeToutBeau {} foreach X [split $Qui ","] { set PourQui($X) 1 } EspionneL [array get PourQui] foreach L $LesL N $LesN P $LesP M $LesM { set B "$P.$N" if {$Qui!="LISTOF" && ! [info exists PourQui([string toupper $L])] && ! [info exists PourQui([string toupper $N])] && ! [info exists PourQui([string toupper $M])] && ! [info exists PourQui([string toupper $B])]} { continue } set LaLigne {} foreach X [split $Quoi ""] { set F "%-18s" if {$X=="M"} { set F "%40s" } if {$X=="B"} { set F "%-30s" } lappend LaLigne [format $F [set $X]] } lappend LeToutBeau [join $LaLigne " "] } set LeToutBeau [lsort $LeToutBeau] if {[PourWscope]} { return "
\n[join $LeToutBeau \n]\n
" } return $LeToutBeau } return "" } set MailLbgi("EstCharge") 1 set MailLbgi(FILENAME,) "[HomeRipp]/rh/maillbgi.txt" set LesLNPM [LesLignesDuFichier $MailLbgi(FILENAME,)] set LeToutBeau {} foreach LNPM $LesLNPM { regsub -all {[ ]+} $LNPM " " LNPM lassign [split $LNPM " "] l n p m set b "$p.$n" lappend LeToutBeau [format "%-18s %-18s %-18s %40s %-30s" $l $n $p $m $b] set L [string toupper $l] set N [string toupper $n] set P [string toupper $p] set B [string toupper $b] set M [string toupper $m] set MailLbgi($L,L) $l set MailLbgi($L,N) $n set MailLbgi($L,P) $p set MailLbgi($L,M) $m set MailLbgi($L,B) $b set MailLbgi($N,L) $l set MailLbgi($N,N) $n set MailLbgi($N,P) $p set MailLbgi($N,M) $m set MailLbgi($N,B) $b set MailLbgi($B,L) $l set MailLbgi($B,N) $n set MailLbgi($B,P) $p set MailLbgi($B,M) $m set MailLbgi($B,B) $b set MailLbgi($M,L) $l set MailLbgi($M,N) $n set MailLbgi($M,P) $p set MailLbgi($M,M) $m set MailLbgi($M,B) $b lappend MailLbgi($P,L) $l lappend MailLbgi($P,N) $n lappend MailLbgi($P,P) $p lappend MailLbgi($P,B) $b lappend MailLbgi($P,M) $m lappend MailLbgi(LISTOF,L) $l lappend MailLbgi(LISTOF,N) $n lappend MailLbgi(LISTOF,P) $p lappend MailLbgi(LISTOF,B) $b lappend MailLbgi(LISTOF,M) $m } set MailLbgi(LISTOF,ALL) $LeToutBeau return [MailLbgi $Qui $Quoi] } proc NOp args { #rR No Operation : la proc qui ne fait rien } proc Which {Exe {AsRealpath ""}} { set AsRealpath [string equal -nocase "AsRealpath" $AsRealpath ] if {[catch {set Path [exec which $Exe]} ] } { return "" } Espionne $Path if {$AsRealpath} { return [Realpath $Path] } return $Path } proc Realpath Path { #rR suit tous les liens et enleve les .. #rR on essaye realpath if { ! [catch { set P [exec realpath $Path] }] } { return $P } #rR sinon on le fait nous meme while {[file type $Path]=="link"} { Espionne $Path set Li [file readlink $Path] if {[regexp "^/" $Li]} { set Path $Li; continue } set PathDir [file dirname $Path] set Path $PathDir/$Li } while {[regexp {/[^/]+/../} $Path]} { Espionne $Path regsub {/[^/]+/../} $Path "/" Path } return $Path } proc FindTcl {fic {dir "."}} { set LesTrouves {} set LesF [lsort [glob -nocomplain -- [file join $dir $fic]]] foreach F $LesF { lappend LesTrouves $F } set Ld [lsort [glob -directory $dir -type d -nocomplain -- *]] foreach d $Ld { if {[file type $d]=="link"} { continue } set LesR [FindTcl $fic $d] foreach R $LesR { lappend LesTrouves $R } } return $LesTrouves } proc RecupereR_AEffacer {} { set rep "" if {! [eof $::CnlR]} { gets $::CnlR rep } if {[string first "TURLUTUTU" $rep] != -1} { set ::ReponseR $::tmp_RepR set ::tmp_RepR {} } else { lappend ::tmp_RepR $rep } return } proc Rpipe_AEffacer {Commande} { global CnlR ReponseR if {! [info exists CnlR]} { set CnlR [open "|R_surf --vanilla " r+] fconfigure $CnlR -blocking 0 -buffering none fileevent $CnlR readable RecupereR puts $CnlR "# TURLUTUTU" flush $CnlR vwait ReponseR set ReponseR "" } puts $CnlR $Commande puts $CnlR "# TURLUTUTU" flush $CnlR vwait ReponseR return $ReponseR } proc LesFichiersDe {Rep {RegExp ""}} { if {$RegExp==""} { set RegExp "*" } regsub -all "@" $RegExp "*" RegExp if { ! [regexp "^/" $Rep]} { set Rep "[RepertoireDuGenome]/$Rep" } return [glob -nocomplain "$Rep/$RegExp"] } proc Phix args { catch {[eval exec phix $args]} Message set Retour $Message regsub {\n\-*\nNe pas tenir compte .*} $Retour "" Retour return $Retour } proc Base64Test {{Texte "TRULULU"}} { Espionne "Texte >>>$Texte<<<" set B64 [Base64Encode $Texte] Espionne "B64 >>>$B64<<< [string length $B64]" set D64 [Base64Decode $B64] Espionne "DecB64 >>>$D64<<<" set B64 [Base64Encode $Texte KeepEqual] Espionne "B64 >>>$B64<<< KeepEqual [string length $B64]" set D64 [Base64Decode $B64] Espionne "DecB64 >>>$D64<<< KeepEqual" } proc Base64Encode {Texte {KeepEqual ""}} { #rR depuis 20150310 le defaut est d'enlever les trailing = #rR les = sont rajoutes pour qu'il y ait un mltiple de 4 octets set KeepEqual [string equal -nocase "KeepEqual" $KeepEqual] package require base64 set B64 [::base64::encode -wrapchar "" $Texte] if { ! $KeepEqual } { set B64 [string trim $B64 "="] } return $B64 } proc Base64Decode Texte { package require base64 return [::base64::decode $Texte] } proc TestIt {} { set Name [Iterator New "Init" {a b c} {1 2 3}] Espionne "name=$Name" Espionne [Iterator $Name Get Total Iter] while {[Iterator $Name "Next" A N]} { Espionne "$A $N" } Iterator $Name Reset while {[Iterator $Name "Next" A N]} { Espionne "$A $N" } set Name [Iterator New "Init" {A B C D} {1 2 3}] Espionne "Iterator New Init {A B C D} {1 2 3} = $Name" Espionne "while \{\[Iterator $Name Next A N\]\} \{ Espionne \$A \$N \}" while {[Iterator $Name "Next" A N]} { Espionne "$A $N" } Espionne "Iterator $Name Reset" Iterator $Name Reset while {[Iterator $Name "Next" A N]} { Espionne "$A $N" if {$A=="C" && $N==2} { Espionne "break pour C et 2"; break } } Espionne "Iterator $Name Get Current All = [Iterator $Name Get Current All]" Espionne "Iterator $Name Get Current 2 = [Iterator $Name Get Current 2]" Espionne "Iterator $Name Get Current 0 = [Iterator $Name Get Current 0]" Espionne "Iterator Iterator Get ListOf Name = [Iterator Iterator Get ListOf Name]" exit } proc Iterator {Name Action args} { global Iterator #rR Il arrive qu'on veuille imbriquer des boucles ... c'est fastidieux ... #rR Iterator permet de la faire en deux lignes #rR Il faut d'abord le créer : #rR set Name [Iterator New Init $L0 $L1 $L2] #rR Puis l'utiliser : #rR while {[Iterator $Name Next v0 v1 v2]} { ... } #rR attention les v sont sans $ #rR Le dernier indice (v2) va le plus vite !!!!!!!!!!!!!!!!!!!! #rR Attention les listes sont numerotees de 0 a 2 a l'exterieur (pour le user) #rR mais elles sont indexees de 2 a 0 dans la proc (en interne) #rR Iterator $Name Reset #rR Iterator $Name Destroy #rR set Info [Iterator Iterator Get ListOf Name] #rR set Info [Iterator $Name Get Current 2] #rR current index de L2 #rR set Info [Iterator $Name Get Current All] #rR tous les current L0 L1 L2 #rR set Info [Iterator $Name Get Max 0] #rR set Info [Iterator $Name Get Max All] #rR set Info [Iterator $Name Get Total Iter] #rR Pour les puristes on pourrait le faire en une ligne ... : #rR while {[Iterator [Iterator New Init $L0 $L1 $L2] Next v0 v1 v2]} { ... } if {$Action=="Get"} { set Qui [lindex $args 0] set Quoi [lindex $args 1] if {[regexp {^[0-9]+$} $Quoi]} { set Quoi [expr [llength $Iterator($Name,ListOf,Index)] - $Quoi -1] } if {[info exists Iterator($Name,$Qui,$Quoi)]} { return $Iterator($Name,$Qui,$Quoi) } if {$Quoi=="All"} { set LeAll {} foreach iL [RetourneLaListe $Iterator($Name,ListOf,Index)] { lappend LeAll $Iterator($Name,$Qui,$iL) } return $LeAll } return "" } if {$Action=="Next"} { set LesP $args set LesP [RetourneLaListe $LesP] set iP 0 if {$Iterator($Name,WaitsFor,Start)} { set incrNext 0 } else { set incrNext 1 } set Iterator($Name,WaitsFor,Start) 0 foreach aP $LesP { upvar $aP P set k $Iterator($Name,Current,$iP) incr k $incrNext set incrNext 0 if {$k>$Iterator($Name,Max,$iP)} { set k 0 ; set incrNext 1 } set P [lindex $Iterator($Name,List,$iP) $k] set Iterator($Name,Current,$iP) $k incr iP } if { $incrNext==0 } { return 1 } foreach iP Iterator($Name,ListOf,Index) { set Iterator($Name,Current,$iP) 0 } return 0 } if {$Name=="New"} { set Name [NomDe "iterator"] set Action "Init" } if { $Action=="Init"} { set LesL $args set LesL [RetourneLaListe $LesL] if {[info exists Iterator($Name,ListOf,Index)]} { foreach L $Iterator($Name,ListOf,Index) { unset Iterator($Name,List,$iL) unset Iterator($Name,Max,$iL) unset Iterator($Name,Current,$iL) } unset Iterator($Name,ListOf,Index) } set iL 0 set Total 1 foreach L $LesL { lappend Iterator($Name,ListOf,Index) $iL set Iterator($Name,List,$iL) $L set Iterator($Name,Max,$iL) [expr [llength $L] - 1] set Iterator($Name,Current,$iL) 0 set Total [expr $Total * [llength $L]] incr iL } set Iterator($Name,Total,Iter) $Total lappend Iterator(Iterator,ListOf,Name) $Name set Iterator($Name,WaitsFor,Start) 1 return $Name } if { $Action=="Reset"} { foreach iP $Iterator($Name,ListOf,Index) { set Iterator($Name,Current,$iP) 0 } set Iterator($Name,WaitsFor,Start) 1 return $Name } if { $Action=="Destroy"} { if {[info exists Iterator($Name,ListOf,Index)]} { foreach iL $Iterator($Name,ListOf,Index) { unset Iterator($Name,List,$iL) unset Iterator($Name,Max,$iL) unset Iterator($Name,Current,$iL) } unset Iterator($Name,ListOf,Index) unset Iterator($Name,WaitsFor,Start) return "" } set i [lsearch $Iterator(Iterator,ListOf,Name) $Name] set Iterator(Iterator,ListOf,Name) [lreplace $Iterator(Iterator,ListOf,Name) $i $i] return 1 } return "" } proc KeyList K { global KeyList if {$K=="PleaseReset"} { if {[info exists KeyList]} { unset KeyList } return "" } if {$K=="PleaseGetKeys"} { if {[info exists KeyList]} { return $KeyList } return {} } lappend KeyList $K return $K } # Splits the text into words # @param 1 text to split # @param 2 separator # @return list of words proc LesMotsDeLaLigneTabulee {Ligne {Tab ""}} { #biotcl wordsFromTextWithTab {line tab} extracts words from ntext and joins them with the tab (, default) if {$Tab==""} { set Tab "," } set LesC [split $Ligne ""] set LesP [concat [list " "] [lrange $LesC 0 end-1]] set InQuote 0 set Mot "" lappend LesP " " lappend LesC $Tab set LesMots {} foreach P $LesP C $LesC { if {$C=="\"" && $P!="\\"} { if {$InQuote} { set InQuote 0 } else { set InQuote 1 } continue } if {$C==$Tab && ! $InQuote} { lappend LesMots $Mot ; set Mot "" ; continue } append Mot $C } return $LesMots } proc TabulonsSansQuote {Fichier {TabIn ""} {TabOut ""} {ReplaceTabOut ""} {GetWhat ""}} { if {$GetWhat==""} { set Getwhat "GetFilename" } if {[regexp -nocase "Tab" $TabIn]} { set TabIn "\t" } if {$TabOut==""} { set TabOut ";" } if {$ReplaceTabOut==""} { set ReplaceTabOut " " } set Nouveau "$Fichier.NEW" set Export "$Fichier.EXPORT" foreach Ligne [LesLignesDuFichier $Fichier] { if {[regexp "^#" $Ligne]} {continue} set LesMots [LesMotsDeLaLigneTabulee $Ligne $TabIn] set LesBons {} foreach Mot $LesMots { if {0 && [regexp $TabOut $Mot]} { FaireLire $Mot } regsub -all $TabOut $Mot $ReplaceTabOut Bon lappend LesBons $Bon } set Bons [join $LesBons $TabOut] lappend LeNouveau $Bons } if {$GetWhat=="GetListOfHeaderValues"} { return $LeNouveau } set Headers [lindex $LeNouveau 0] if {$GetWhat=="GetHeaders"} { return $Headers } if {$GetWhat=="GetListOfHeaders"} { return [split $Headers $TabOut] } set LesNouvellesValeurs [lrange $LeNouveau 1 end] if {$GetWhat=="GetListOfValues"} { return $LesNouvellesValeurs } SauveLesLignes $LesNouvellesValeurs dans $Export return [SauveLesLignes $LeNouveau dans $Nouveau] } proc GenomicsFree {{Qui ""}} { set LesDisques [GenomicsPossibles] lappend LesDisques "/" foreach GG $LesDisques { if {[FileAbsent $GG]} { continue } set G [file tail $GG] if {$G==""} { set G "/" } if {$GG!="/" && ! [regexp {^g[0-9]+$} $G]} {continue } set df [exec df -P -k $GG] set LesMots [LesMotsDeLaLigne $df] set LesBons [lrange $LesMots end-4 end] set g "/" ScanLaListe $LesBons T U F g set FF [format "%5.1f" [expr (1.0*$F)/1000000]] if {$Qui==$G} { return $FF } lappend LesFree "$GG $FF" } set Free [join $LesFree "\n"] if {[PourWscope]} { return "
$Free
" } if {$Qui=="GetText"} { return $Free } return $LesFree } proc GlobRecursif {{Pattern ""} {Directory ""} {DirOnly ""} {FollowLinks ""}} { #biotcl recursiveGlob {} returns the list of all directories set FollowLinks [string equal -nocase $FollowLinks "FollowLinks"] if {$Directory==""} { set Directory "." } if {$Pattern==""} { set Pattern "*" } set GlobRecursif {} if {$DirOnly=="DirOnly"} { foreach Dir [glob -nocomplain -type "d" -- [file join $Directory $Pattern]] { Espionne $Dir if { ! $FollowLinks && [file type $Dir]=="link"} { continue } lappend GlobRecursif $Dir } } else { #ici on peut aussi choper les dir si pattern matche une dir foreach Local [lsort -unique [glob -nocomplain -- [file join $Directory $Pattern]]] { if {! $FollowLinks && [file type $Local]=="link"} { continue } set Local [encoding convertto [encoding system] $Local] lappend GlobRecursif $Local } } foreach Dir [lsort -unique [glob -nocomplain -type "d" -- [file join $Directory *]]] { if { ! $FollowLinks && [file type $Dir]=="link"} { continue } set Dir [encoding convertto [encoding system] $Dir] foreach SousLocal [GlobRecursif $Pattern $Dir $DirOnly] { lappend GlobRecursif $SousLocal } } return $GlobRecursif } proc TestListMix {} { set A [list 1 2 3 4 5 6 7 8 9] set B [list 2 4 6 8] set C [list 3 6] Espionne [MixLists $A No $C In $B] } proc ListMix {MainList args} { if {[lindex $args 0]=="WithLists"} { set args [lindex $args 1] } set Nu 0 foreach {Op Li} $args { incr Nu foreach E $Li { set IsIn($Nu,$E) 1 } } set LesBons $MainList set Nu 0 foreach {Op Li} $args { incr Nu set LesNouveaux {} foreach E $LesBons { if {$Op=="In" && [info exists IsIn($Nu,$E)]} { lappend LesNouveaux $E } if {$Op=="No" && ! [info exists IsIn($Nu,$E)]} { lappend LesNouveaux $E } } set LesBons [lsort -unique $LesNouveaux] } return $LesBons } proc SauveTDom {IdXML EnteteXML Fichier} { set f [open $Fichier w] puts $f $EnteteXML puts $f [$IdXML asXML -doctypeDeclaration 1 -indent 2] close $f return $Fichier } proc AllGlobals {{Show ""}} { set Show [string equal -nocase $Show "Show"] set LeTexte {} foreach G [lsort [info globals]] { global $G if {[array exists $G]} { lappend LeTexte "****************************** array $G" foreach {C V} [lrange [array get $G] 0 19] { lappend LeTexte " $C [string range $V 0 60]" } lappend LeTexte "************************************ $G" } else { lappend LeTexte "$G [string range [set $G] 0 60]" } } set Texte [join $LeTexte "\n"] if {$Show} { return [AfficheVariable $Texte "" "AllGlobals"] } return $Texte } proc Delimite {} { Espionne [string repeat "\n[Date NiceSeconds]" 10] } proc RenaissanceDuWidget {K Id {Action ""}} { global BufferMainLevee set Type [$K type $Id] set LesOptions {} foreach OptionValeurs [$K itemconfigure $Id] { set Option [lindex $OptionValeurs 0] set Valeur [lindex $OptionValeurs 4] if {$Valeur=={}} { set Valeur "\{\}" } if {[regexp " " $Valeur]} { set Valeur "\{$Valeur\}" } lappend LesOptions "$Option $Valeur" } set Ancien "$K create $Type [$K coords $Id] [join $LesOptions " "]" if {$Action=="Copy"} { set BufferMainLevee $Ancien return $Ancien } while 1 { set Nouveau [Entre $Ancien] if {$Nouveau==$Ancien} { return $Id } if {$Nouveau==""} { return "" } catch {set NouveauId [eval $Nouveau]} Message if { ! [regexp {[^0-9]} $Message]} { break } FaireLire "I got this message : \n$Message" if {[OuiOuNon "Do I keep the widget ?"]} { return $Id } } if {[OuiOuNon "Do I delete the old Widget ? "]} { $K delete $Id } return $Nouveau } proc CreerUnWidget {K} { set Type [ChoixParmi {"Arc" "Line" "Oval" "Polygon" "Rectangle" "Text" "Fleche"}] switch $Type { "Arc" { } "Line" { return [$K create line 50 50 100 100 100 200] } "Oval" { } "Polygon" { return [$K create polygon 50 50 100 100 100 200 50 50] } "Rectangle" { return [$K create rectangle 50 50 100 100] } "Text" { set Texte [Entre "Your text"] return [$K create text 100 100 -text $Texte] } } return $Nouveau } proc UneTaillePourMainLevee {{TailleParDefaut ""}} { global LesTaillesPourMainLevee JeMeSignale set TailleParDefautParDefaut 1.1 if { ! [info exists LesTaillesPourMainLevee] } { set LesTaillesPourMainLevee [list 0.1 0.5 0.9 1.0 1.1 2.0 10. -1 "Other" "Default"] } if {$TailleParDefaut=="LaListe"} { return $LesTaillesPourMainLevee } if {$TailleParDefaut==""} { set TailleParDefaut $TailleParDefautParDefaut } set Taille [ChoixParmi $LesTaillesPourMainLevee] if {$Taille == ""} { return "" } if {$Taille == "Default"} { return $TailleParDefaut } if {$Taille == "Other"} { set Taille [Entre $TailleParDefaut] if {$Taille == ""} { return "" } lappend LesTaillesPourMainLevee $Taille return $Taille } return $Taille } proc UneCouleurPourMainLevee {{CouleurParDefaut ""}} { global CouleurDuFond global LesCouleursPourMainLevee set CouleurParDefautParDefaut "grey" if { ! [info exists LesCouleursPourMainLevee]} { if {[info exists CouleurDuFond]} { set CdF $CouleurDuFond } else { set CdF "white" } set LesCouleursPourMainLevee [list "black" "grey" "white" "blue" \ "lightblue" "yellow" "green" "orange" "red" "purple" $CdF "-Transparent-" "-NewColor-" "-Default-"] } if {$CouleurParDefaut=="LaListe"} { return $LesCouleursPourMainLevee } if {$CouleurParDefaut==""} { set CouleurParDefaut $CouleurParDefautParDefaut } foreach C $LesCouleursPourMainLevee { if {$C=="-Default-"} { set C $CouleurParDefaut } if {[regexp {^\-} $C]} { set C "grey" } lappend LesCouleursColorees $C } set Couleur [ChoixParmi $LesCouleursPourMainLevee $LesCouleursColorees] if {$Couleur == ""} { return "Cancel" } if {$Couleur == "-Transparent-"} { return "" } if {$Couleur == "-Default-"} { return $CouleurParDefaut } if {$Couleur == "-NewColor-"} { set Couleur [PaletteDeCouleurs] if {$Couleur == ""} { return "" } lappend LesCouleursPourMainLevee $Couleur return $Couleur } return $Couleur } proc MainLevee {K x y Action} { global IdScrollRectangle global LesCouleursPourMainLevee global LesTaillesPourMainLevee global DernierXDuTouche DernierYDuTouche global BufferMainLevee set X [$K canvasx $x] set Y [$K canvasy $y] set Touche [$K find withtag current] if {[info exists IdScrollRectangle($K)] && $Touche==[set IdScrollRectangle($K)]} { if {[regexp "Point|Motion" $Action]} { return } } set ItemType [$K type $Touche] if {$Action == "Motion"} { $K move $Touche [expr $x-$DernierXDuTouche] [expr $y-$DernierYDuTouche] set DernierXDuTouche $x set DernierYDuTouche $y return } if {$Action == "Point"} { set DernierXDuTouche $x set DernierYDuTouche $y return } if {$Action=="Modif"} { set LesActions {"Erase" "Size" "Color" "Raise" "Lower" "Copy" "Paste" "EditWidget" "New"} if {$ItemType=="text"} { lappend $LesActions "Text" } set Action [ChoixParmi $LesActions] if {$Action == "" } { return } } if {$Action == "Erase"} { if { ! [OuiOuNon "Do you really want to erase this $ItemType"]} { return 0 } $K delete $Touche return 1 } if {$Action == "Raise"} { $K raise $Touche return "Raise" } if {$Action == "Lower"} { $K lower $Touche if {[info exists IdScrollRectangle($K)]} { $K lower [set IdScrollRectangle($K)]} return "Lower" } if {$Action == "Color"} { set OldCouleurFill [$K itemcget $Touche -fill] if {[set CouleurFill [UneCouleurPourMainLevee $OldCouleurFill]]=="Cancel"} { return "" } $K itemconfigure $Touche -fill $CouleurFill if { ! [regexp "arc|polygon|rectangle" $ItemType] || \ ! [OuiOuNon "Do You want to change the Outline Color ?"]} { return $CouleurFill } set OldCouleurOutline [$K itemcget $Touche -outline] if {[set CouleurOutline [UneCouleurPourMainLevee $OldCouleurOutline]]=="Cancel"} { return "" } $K itemconfigure $Touche -outline $CouleurOutline return $CouleurFill } if {$Action == "Size"} { if {[set Taille [UneTaillePourMainLevee]]==""} { return } ScanLaListe [Barycentre [$K coords $Touche]] CX CY $K scale $Touche $CX $CY $Taille $Taille if {$ItemType == "arc" && $Taille == "Copy"} { set Extent [$K itemcget $Touche -extent] $K itemconfigure $Touche -extent [expr $Extent*[Entre 0.9]] return } if {$ItemType == "arc" && $Taille == "Extent"} { set Extent [$K itemcget $Touche -extent] $K itemconfigure $Touche -extent [expr $Extent*[Entre 0.9]] return } if {$ItemType == "line" && $Taille == "Arrow"} { set AvAr [$K itemcget $Touche -arrow] if {$AvAr=="first"} { set AvAr "last" } else { set AvAr "first" } $K itemconfigure $Touche -arrow $AvAr return } if {$Taille == "Other"} { set Taille [Entre 21] if {$Taille == ""} { return "" } lappend LesTaillesPourMainLevee $Taille } if { $ItemType=="arc" || $ItemType=="line" } { $K itemconfigure $Touche -width $Taille return $Taille } if { $ItemType=="text"} { $K itemconfigure $Touche -font [list Courier $Taille] return $Taille } } if {$Action == "Text"} { set Texte [Entre [$K itemcget $Touche -text]] if {$Texte == ""} { return "" } if { $ItemType=="text"} { $K itemconfigure $Touche -text $Texte return $Texte } } if {$Action == "Copy"} { set Nouveau [RenaissanceDuWidget $K $Touche "Copy"] return $Nouveau } if {$Action == "Paste"} { if { ! [info exists BufferMainLevee]} { FaireLire "You never made a Copy" return "" } regsub {^[^ ]+ } $BufferMainLevee "$K " Nouveau catch {set NouveauId [eval $Nouveau]} Message if {[regexp {[^0-9]} $Message]} { FaireLire "I got this message : \n$Message" return "" } return $NouveauId } if {$Action == "EditWidget"} { set Nouveau [RenaissanceDuWidget $K $Touche] return $Nouveau } if {$Action == "New"} { set Nouveau [CreerUnWidget $K] return $Nouveau } } proc MainLeveeSurUnCanva K { global IdScrollRectangle $K bind "all" <1> "MainLevee $K %x %y Point" $K bind "all" "MainLevee $K %x %y Motion" $K bind "all" "MainLevee $K %x %y Relache" $K bind "all" "MainLevee $K %x %y Modif" regsub {\.[a-z_0-9]+$} $K "" w set Bouton [BoutonneLaFenetre $w "Save/Restore/Erase"] $Bouton configure -background "green" bind $Bouton <1> "SauveLeCanva $K all" bind $Bouton <2> "RestaureLeCanva $K" bind $Bouton <3> "EraseLeCanva $K" set Bouton [BoutonneLaFenetre $w "Paste"] $Bouton configure -background "orange" bind $Bouton <1> "MainLevee $K 0 0 Paste" } proc ShowListbox {Page args} { global ShowListbox Wup "Cette proc est issue de AfficheVariable ... en plus simple" if { ! [info exists ShowListbox]} { set ShowListbox(wNumber) 0 } foreach {A B} $args { regsub -- {^\-} $A "" A eval set $A $B } if { ! [info exists w]} { set w ".slb[incr ShowListbox(wNumber)]" } if { ! [info exists Titre]} { set Titre "$w" } if { ! [info exists Maniere]} { set Maniere "" } toplevel $w wm title $w "$Titre" wm iconname $w "$Titre" regsub -all {\t} $Page " " PagePropre set ShowListbox(Page,$w) $PagePropre label $w.msg -wraplength 4i -justify left -text "$Titre" pack $w.msg -side top set Clavier $w.buttons frame $Clavier pack $Clavier -side bottom -fill x -padx 3m -pady 1m TouchePour $Clavier NouvelleGamme TouchePour $Clavier NouvelleCouleur "red" TouchePour $Clavier "Dismiss" "unset ShowListbox(Page,$w) ; after 10 destroy $w" TouchePour $Clavier NouvelleCouleur "grey" TouchePour $Clavier "Save all" "SaveAs \[set ShowListbox(Page,$w)\]" TouchePour <2> "/sel." "SaveAs \[selection get\]" TouchePour <3> " /Edit" "EditAndShow \[set ShowListbox(Page,$w)\]" TouchePour $Clavier NouvelleGamme TouchePour $Clavier NouvelleCouleur "yellow" TouchePour $Clavier "Next" "Focalise $w" TouchePour <2> "/Top" "Focalise $w top" TouchePour <3> "/New" "Focalise $w ask" TouchePour $Clavier "High word" "Illumine \[Entre\] $w" frame $w.frame -borderwidth 10 pack $w.frame -side top -expand yes -fill both scrollbar $w.frame.yscroll -command "$w.frame.list yview" scrollbar $w.frame.xscroll -command "$w.frame.list xview" \ -orient horizontal set Largeur 80 set Hauteur 35 if { [regexp "GrandeLargeur" $Maniere] } { set Largeur 128 } listbox $w.frame.list -width $Largeur -height $Hauteur -setgrid 1 \ -yscroll "$w.frame.yscroll set" \ -xscroll "$w.frame.xscroll set" \ -selectmode extended \ -background "LightGrey" \ -foreground "Black" \ -selectbackground "LightYellow" \ -selectforeground "Black" \ -font [list Courier [PolicePourListBox]] grid $w.frame.list -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky nsew grid $w.frame.yscroll -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky nsew grid $w.frame.xscroll -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky nsew grid rowconfig $w.frame 0 -weight 1 -minsize 0 grid columnconfig $w.frame 0 -weight 1 -minsize 0 set nLignes 0 foreach Ligne [split [set ShowListbox(Page,$w)] "\n"] { incr nLignes $w.frame.list insert end $Ligne } if {$nLignes<30} { $w.frame.list configure -height [expr $nLignes+3] } bind $w.frame.list <3> "DecrisLaLigne %W %x %y" bind $w.frame.list "DecrisLaLigne %W %x %y Efface" return $w } proc IllumineLaListe {Liste Fenetre} { set BonneListe {} foreach Element $Liste { regsub -all {\|} $Element "\\|" Element lappend BonneListe $Element } set Mot [join $BonneListe "|"] Illumine $Mot $Fenetre } proc Illumine {Mot Fenetre} { if {[PourWscope]} { return } if {[regexp ".list$" $Fenetre]} { set FenetreListBox $Fenetre } else { set FenetreListBox $Fenetre.frame.list } set i 0 set AttendDebutDeSequence 1 foreach Ligne [$FenetreListBox get 0 end] { if { [regexp $Mot $Ligne] } { if {$AttendDebutDeSequence && [regexp "$Mot\[ \.\]+\[A-Z\]" $Ligne]} { set Position $i set AttendDebutDeSequence 0 } $FenetreListBox selection set $i $FenetreListBox see $i } incr i } if {[info exists Position]} { set Position [Maxi 0 [expr $Position-20]] $FenetreListBox see $Position } } proc Month1to12 Texte { #biotcl month1to12 {text} returns the index of the month (english or french) set Mois "" scan $Texte "%s" Mois set Mois [string toupper $Mois] set LesMoisA [list JANUARY FEBRUARY MARCH APRIL MAY JUNE JULY AUGUST SEPTEMBER OCTOBER NOVEMBER DECEMBER] set LesMoisF [list JANVIER FEVRIER MARS AVRIL MAI JUIN JUILLET AOUT SEPTEMBRE OCTOBRE NOVEMBRE DECEMBRE] set I 0 foreach MoisA $LesMoisA MoisF $LesMoisF { incr I if {[regexp "^$Mois" $MoisA]} { return $I } if {[regexp "^$Mois" $MoisF]} { return $I } } return 0 } proc CompareDate {D1 D2} { #biotcl compareDate {} regsub -all {[\-\.\:/]} $D1 " " D1 regsub -all { +} [string trim $D1] " " D1 regsub -all {[\-\.\:/]} $D2 " " D2 regsub -all { +} [string trim $D2] " " D2 set J1 0; set M1 0; set A1 0 regexp {^([^ ]+)$} $D1 Match A1 regexp {^([^ ]+) ([^ ]+)$} $D1 Match M1 A1 regexp {^([^ ]+) ([^ ]+) ([^ ]+)$} $D1 Match J1 M1 A1 set J2 0; set M2 0; set A2 0 regexp {^([^ ]+)$} $D2 Match A2 regexp {^([^ ]+) ([^ ]+)$} $D2 Match M2 A2 regexp {^([^ ]+) ([^ ]+) ([^ ]+)$} $D2 Match J2 M2 A2 set Mois1 $M1 set Mois2 $M2 if {$A1<$A2} { return -1 } if {$A1>$A2} { return 1 } if {[regexp {^[0-9]+$} $Mois1]} {set M1 $Mois1} else { set M1 [Month1to12 $Mois1] } if {[regexp {^[0-9]+$} $Mois2]} {set M2 $Mois2} else { set M2 [Month1to12 $Mois2] } set M1 [Base10 $M1] set M2 [Base10 $M2] if {$M1<$M2} { return -1 } if {$M1>$M2} { return 1 } set J1 [Base10 $J1] set J2 [Base10 $J2] if {$J1<$J2} { return -1 } if {$J1>$J2} { return 1 } return 0 } proc GoodUnixFileNames {{Rep ""}} { if {$Rep==""} { set Rep "./" } foreach F [lsort [glob -nocomplain "$Rep/*"]] { regsub -nocase -all {[^A-Z0-9_\-\.\+\#\~\\]} $F "_" G Espionne "$F\n$G" file rename $F $G } return } proc ModifyGlobalArray Tab { global $Tab set Elem [ChoixParmi [array names $Tab]] if {$Elem==""} { return "" } while {1} { set NouvelleValeur [Entre [set [set Tab]($Elem)]] if {$NouvelleValeur!="" || [OuiOuNon "Do you want to set it to empty value ?"]} { break } } set [set Tab]($Elem) $NouvelleValeur return $Elem } proc ModifyGlobalVariables {{Var ""}} { if {$Var==""} { set LesGlobales [lsort [info globals]] set Var [ChoixParmi $LesGlobales] } if {$Var==""} { return "" } global $Var if {[array exists $Var]} { return [ModifyGlobalArray $Var] } while {1} { set NouvelleValeur [Entre [set $Var]] if {$NouvelleValeur!="" || [OuiOuNon "Do you want to set it to empty value ?"]} { break } } set $Var $NouvelleValeur return $Var } proc RequireOnce args { set LesPacks $args global RequireOnce foreach Pack $LesPacks { if {[info exists RequireOnce($Pack)]} {continue} set RequireOnce($Pack) 1 package require $Pack if {$Pack=="BLT"} {namespace import blt::*} } } proc PolicePourListBox {{PoliceOuAsk ""} {W ""}} { global PolicePourListBox Wup "returns or sets the current fontsize, asks if PoliceOuAsk is 'Ask' " if { ! [info exists PolicePourListBox]} { set PolicePourListBox 10 } if {[regexp {^[0-9]+$} $PoliceOuAsk]} { set PolicePourListBox $PoliceOuAsk } elseif {[regexp -nocase {^Ask$} $PoliceOuAsk]} { set Police [ChoixParmi {6 8 10 12 14 16 18 20 22 24}] if {$Police!=""} { set PolicePourListBox $Police } } if {$W!=""} { $W.frame.list configure -font [list Courier $PolicePourListBox] } return $PolicePourListBox } proc PolicePourEntreTexte {{PoliceOuAsk ""} {W ""}} { global PolicePourEntreTexte Wup "returns or sets the current fontsize, asks if PoliceOuAsk is 'Ask' " if { ! [info exists PolicePourEntreTexte]} { set PolicePourEntreTexte 10 } if {[regexp {^[0-9]+$} $PoliceOuAsk]} { set PolicePourEntreTexte $PoliceOuAsk } elseif {[regexp -nocase {^Ask$} $PoliceOuAsk]} { set Police [ChoixParmi {6 8 10 12 14 16 18 20 22 24}] if {$Police!=""} { set PolicePourEntreTexte $Police } } set Objet "$W.text" if {[winfo exists $Objet]} { $Objet configure -font [list Courier $PolicePourEntreTexte] } return $PolicePourEntreTexte } proc CopieVersFichierBienNommePourLeRep {} { foreach F [glob -nocomplain "./*"] { Espionne [CopieVersFichierBienNomme $F] } } proc CopieVersFichierBienNomme F { if {[regexp {\#} $F]} { regsub -all {\#} $F "_" BonF if {[file exists $BonF] && [OuiOuNon "$F\nwill be copied to\n$BonF\n\nIt already exists. Do I skipp ?"]} { return "" } if { ! [OuiOuNon "$F\nOk to copy it to\n$BonF"]} { return "" } file copy -force $F $BonF return $BonF } return $F } proc EstUnFichierImage Fichier { return [regexp -nocase {\.jpe?g$|\.gif$|.tif$|\.tiff$|\.pnm$|\.pbm$|\.tga$} $Fichier] } proc GetGlobal Var { global $Var if { ! [info exists $Var]} { return "NotExists" } return [set $Var] } proc FileExists Fichier { #biotcl fileExists {file} return [file exists $Fichier] } proc FileAbsent Fichier { #biotcl fileAbsent {file} if {[FileExists $Fichier]} { return 0 } else { return 1 } } proc DirExists Dir { #biotcl dirExists {dir} return [file exists $Dir] } proc DirAbsent Dir { #bioTcl dirAbsent {dir} if {[DirExists $Dir]} { return 0 } else { return 1 } } proc CreateDirIfAbsent Dir { if {[DirExists $Dir]} { return "" } file mkdir $Dir return $Dir } proc GscopeSubDir SousRep { return "[RepertoireDuGenome]/$SousRep" } proc GscopeFile {Nom {SousRep ""}} { #rR Si Nom est vide onrend repertoire avec / a la fin if {$SousRep==""} { if {[OnTraiteDesProteines]} { set SousRep "prottfa" } else { set SousRep "nuctfa" } } return "[GscopeSubDir $SousRep]/$Nom" } proc GscopeFileExists {Nom {SousRep ""}} { return [file exists [GscopeFile $Nom $SousRep]] } proc GscopeFileContent {Nom {SousRep ""} {EnPre ""} {I ""} {J ""}} { #rR on peut lire de la ligne I à J set EnPre [regexp -nocase "Pre" $EnPre] if {$Nom==""} { return "" } if {[regexp -nocase "^fiche" $Nom]} { set Fichier "[RepertoireDuGenome]/fiches/$SousRep" } else { set Fichier [GscopeFile $Nom $SousRep] } if {[FileAbsent $Fichier]} { return "" } set Contenu [ContenuDuFichier $Fichier] if {[regexp {^[0-9]+$} $I]} { if { ! [regexp {^[0-9]+$} $J]} { set J $I } set Contenu [join [lrange [split $Contenu "\n"] $I $J] "\n"] } if {$EnPre} { return "
$Contenu
" } return $Contenu } proc AllerRetour {In {Out ""} {N ""}} { if {$Out==""} { set Out "${In}_new" } if {$N==""} { set N 1 } set Liste [LesLignesDuFichier $In] set ListeRetourne [RetourneLaListe $Liste] set LiiL [concat $Liste $ListeRetourne] set Finale {} foreach i [NombresEntre 1 $N] { set Finale [concat $Finale $LiiL] } return [SauveLesLignes $Finale dans $Out] } proc AllToTitle Texte { set AlphAvant 0 foreach C [split $Texte ""] { if {$AlphAvant} { append Nouveau [string tolower $C] } else { append Nouveau [string toupper $C] } set AlphAvant [regexp -nocase {[a-z]} $C] } return $Nouveau } proc BonParenthesageDuFichier {Fichier} { return [BonParenthesage [ContenuDuFichier $Fichier]] } proc BonParenthesage {Texte {What ""}} { if {$What==""} { set What "GetOk" } if {[regexp -nocase "GetAll|GetX" $What]} { set What "GetX_GetC_GetA_GetP" } set GetC [regexp -nocase "GetC" $What] set GetA [regexp -nocase "GetA" $What] set GetP [regexp -nocase "GetP" $What] set GetX [regexp -nocase "GetX" $What] set LesC {} set LesA {} set LesP {} set iC 0 set iA 0 set iP 0 set DejaLu "" set YaBackSlash 0 set x -1 foreach C [split $Texte ""] { incr x append DejaLu $C if {$YaBackSlash} { set YaBackSlash 0 ; continue } if {$C=="\\"} { set YaBackSlash 1 ; continue} if {$C=="\["} { incr iC ; PushOnStack $x C ; continue} if {$C=="\{"} { incr iA ; PushOnStack $x A ; continue} if {$C=="\("} { incr iP ; PushOnStack $x P ; continue } if {$C=="\]"} { incr iC -1 ; lappend LesC "[set pC [PullFromStack C]] $x" ; lappend All "C $pC $x" } if {$C=="\}"} { incr iA -1 ; lappend LesA "[set pA [PullFromStack A]] $x" ; lappend All "A $pA $x" } if {$C=="\)"} { incr iP -1 ; lappend LesP "[set pP [PullFromStack P]] $x" ; lappend All "P $pP $x" } if {$iC<0} { return "Unexpected '\]' at [string range $DejaLu end-40 end]" } if {$iA<0} { return "Unexpected '\}' at [string range $DejaLu end-40 end]" } if {$iP<0} { return "Unexpected '\)' at [string range $DejaLu end-40 end]" } } if {$iC>0} { return "Missing '\]' at [string range $DejaLu end-40 end]" } if {$iA>0} { return "Missing '\}' at [string range $DejaLu end-40 end]" } if {$iP>0} { return "Missing '\)' at [string range $DejaLu end-40 end]" } if {[regexp -nocase "GetX" $What]} { return $All } if {[regexp -nocase "GetC" $What]} { return $LesC } if {[regexp -nocase "GetA" $What]} { return $LesA } if {[regexp -nocase "GetP" $What]} { return $LesP } return "" } proc AutorisationPourPsy {} { global AutorisationPourPsy if { ! [info exists AutorisationPourPsy]} { set AutorisationPourPsy -3 } if { $AutorisationPourPsy==1 } { return 1 } if { $AutorisationPourPsy==0 } { return 0 } set Cou [Entre "Donnez la plus belle couleur pour une 2cv : "] incr AutorisationPourPsy if { ! [regexp -nocase "rouge" $Cou] } { return 0 } set AutorisationPourPsy 1 return 1 } proc InteractiveMode {{Mode ""}} { global InteractiveMode if { ! [info exists InteractiveMode]} { set InteractiveMode 1 } if {$Mode==""} { return $InteractiveMode } set InteractiveMode 1 if {[regexp -nocase {(Batch|Off|0)} $Mode]} { set InteractiveMode 0 } set Chut [expr ! $InteractiveMode] global OuiOuNonToujoursParDefaut ; set OuiOuNonToujoursParDefaut $Chut global EspionneNon ; set EspionneNon $Chut global FaireLireNon ; set FaireLireNon $Chut global EntreToujoursDefaut ; set EntreToujoursDefaut $Chut return $InteractiveMode } proc GscopeEvaluates {LesMotsDeLaCommande {Master ""}} { LogWscope "dans GscopeEvaluates $LesMotsDeLaCommande" LogWscope [lindex $LesMotsDeLaCommande 0] if {$Master==""} { set Master "Gscope" } set UseTk 1 if {[lindex $LesMotsDeLaCommande 0]=="-notk"} { set UseTk 0 set LesMotsDeLaCommande [lreplace $LesMotsDeLaCommande 0 0] } if {[lindex $LesMotsDeLaCommande 0]=="data"} { set RG [lindex $LesMotsDeLaCommande 1] RepertoireDuGenome $RG set LesMotsDeLaCommande [lreplace $LesMotsDeLaCommande 0 1] } if {[lindex $LesMotsDeLaCommande 0]=="PourWscope"} { PourWscope 1 set UseTk 0 set LesMotsDeLaCommande [lreplace $LesMotsDeLaCommande 0 0 yes] } if {[regexp -nocase {[a-z]} $LesMotsDeLaCommande]} { set QuoiFaire [lindex $LesMotsDeLaCommande 0] if { ! [regexp "CreeLaCollection|CreeFichierMiniConfig|InitProject" [lrange $LesMotsDeLaCommande 0 1]]} { ChargeConfig } if {$QuoiFaire == "only"} { set Sortie [eval [lrange $LesMotsDeLaCommande 1 end]] return $Sortie } if {$UseTk} { set Commande [join $LesMotsDeLaCommande " "] set PreFixe "" if {[info procs "PreFixe"]!=""} { set PreFixe [PreFixe] } set Process "$Master $PreFixe on [info hostname]\n pid [pid] since [Date Nice]" package require Tk if { ! [winfo exists .] } { wm title . "$PreFixe [string range $Commande 0 20]" button .kill -text "$Process\n\nStop execution of : \n\n$Commande\n\nby pressing Me or killing this window" \ -background "yellow" -command "exit" pack .kill -fill both } } if {[regexp "^yes" $QuoiFaire]} { InteractiveMode "Off" regsub "^yes" $QuoiFaire "" QuoiFaire if {$QuoiFaire==""} { set QuoiFaire "exe" } if {$QuoiFaire=="con"} { set QuoiFaire "" set LesMotsDeLaCommande [lrange $LesMotsDeLaCommande 1 end] } } set GoAhead 0 if {[regexp -nocase "(and)*continue(and)*" $QuoiFaire]} { regsub -nocase "(and)*continue(and)*" $QuoiFaire "" QuoiFaire set GoAhead 1 } if {$QuoiFaire == "puts" || $QuoiFaire == "putb" || $QuoiFaire == "putl" || $QuoiFaire == "exe"} { set Sortie [eval [lrange $LesMotsDeLaCommande 1 end]] if {$QuoiFaire == "putb" } { fconfigure stdout -translation binary; puts stdout $Sortie ; exit } if {$QuoiFaire == "putl" && $Sortie!=""} { if {[string is list $Sortie]} { set Sortie [join $Sortie "\n"] set QuoiFaire "puts" } } if {$QuoiFaire == "puts" } { puts $Sortie } if {$GoAhead} { return } exit } eval $LesMotsDeLaCommande } return } proc NucOuProt Sequence { #biotcl sequenceIsNucOrProt {} returns Prot or Nuc if {[regexp "^>" $Sequence]} { set Sequence [QueLaSequenceDuTexteTFA $Sequence] } if {[regexp -nocase {[^ATGCNXMKRSYWVHDB]} $Sequence]} { return "Prot" } return "Nuc" } proc JeCommenceABosser {} { set LesBoulots [list \ "FantomisePourTous {} AskWhereToBegin" \ "EtudeCodonStart AskWhereToBegin" \ "CoupeAuBonMetPourTous AskWhereToBegin" \ ] set Boulot [ChoixParmi $LesBoulots] if {$Boulot==""} { return "" } JeVaisBosser $Boulot eval $Boulot } proc JeVaisBosser {Texte} { global Bosseurs set Moi [TmpFile Bosse] set Bosseurs($Texte) $Moi set Bosseurs($Moi) $Texte return $Moi } proc JArreteDeBosser Moi { global Bosseurs if { ! [file exists $Moi]} { return 0 } file delete -force $Moi set Texte [set Bosseurs($Moi)] unset Bosseurs($Moi) unset Bosseurs($Texte) return 1 } proc TuArretesDeBosser {} { global Bosseurs set LesTextes [list "Select the process you want to stop"] foreach Texte [array names Bosseurs] { if {[regexp "/" $Texte]} { continue } lappend LesTextes $Texte } set Texte [ChoixParmi $LesTextes] if {$Texte=="" || ! [info exists Bosseurs($Texte)]} { return "" } set Toi [set Bosseurs($Texte)] if {$Toi==""} { return "" } Sauve $Texte dans $Toi return $Toi } proc RenumeroteLesPABs {} { foreach Fichier [glob "[RepertoireDuGenome]/*/MSME*"] { if {[regexp {MSME[0-9]{4}$} $Fichier]} { set Nom [file tail $Fichier] set Rep [file dirname $Fichier] regsub "MSME" $Nom "MSME0" Bon file rename $Fichier "$Rep/$Bon" Espionne "[file tail $Rep] $Nom $Bon" } } exit } proc MailFichier {Fichier {Destinataire ""} {Sujet ""}} { global env if {$Destinataire==""} { set MySelf [set env(USER)] set Destinataire "$MySelf@lbgi.fr" } if { ! [file exists $Fichier]} { FaireLire "$Fichier doesn't exist. Sorry" return "" } if {$Sujet==""} { set Sujet [file tail $Fichier] regsub ".txt$" $Sujet "" Sujet set Subject "Commande oligos $Sujet" } else { set Subject $Sujet } set Message "" set CommandeMail "mail" if {[info exists env(HOSTTYPE)] && $env(HOSTTYPE)=="alpha"} { set CommandeMail "mailx" } if {[catch {exec $CommandeMail -s $Subject $Destinataire < $Fichier} Message]} { FaireLire "Error during mail. \nI got following error message :\n$Message" return $Message } return $Fichier } proc PlusProcheCodon {Ref LesPossibles} { #biotcl nearestCodon {ref possibleCodons} foreach Rare [CodonsRares LaListeMerci] { set EstRare($Rare) 1 } set Ref [string toupper $Ref] set PlusProche "" set OldEgaux -2 foreach Codon $LesPossibles { set Codon [string toupper $Codon] if {[info exists EstRare($Codon)]} { set nEgaux -1 } else { set nEgaux 0 foreach A [split $Ref ""] B [split $Codon ""] { if {$A==$B} { incr nEgaux } } } if {$nEgaux > $OldEgaux} { set OldEgaux $nEgaux set PlusProche $Codon } } return $PlusProche } proc LesCodesGenetiques P { global LesCodesGenetiques Wup "We replace O (the coding of STOP in MutaSequence) by * (O is not used as aa code)" if {$P=="O"} { set P "*" } set P [string toupper $P] if {$P=="STOP"} { set P "*" } if {[string length $P]==3} { set P [UT $P] } if {[info exists LesCodesGenetiques($P)]} { return [set LesCodesGenetiques($P)] } if {[info exists LesCodesGenetiques("EstCharge")]} { return "NNN" } set LesCodesGenetiques("EstCharge") 1 foreach A {A T G C} { foreach B {A T G C} { foreach C {A T G C} { set Codon "$A$B$C" set AA [AAduCodon $Codon] lappend LesCodesGenetiques($AA) $Codon lappend LesCodesGenetiques(LALISTEMERCI) "$Codon $AA" } } } return [LesCodesGenetiques $P] } proc TesteTouteLaBalise {} { Espionne [TouteLaBalise protein match.xml] Espionne [TouteLaBalise protein] Espionne [TouteLaBalise protein match.xml "CloseFileAfterRead"] Espionne [TouteLaBalise protein match.xml] Espionne [TouteLaBalise protein "" "CloseFileAfterRead"] Espionne [TouteLaBalise protein match.xml] } proc TouteLaBalise {Bal {Fichier ""} {Close ""}} { global CanalPourTouteLaBalise FichierPourTouteLaBalise if {$Bal=="CloseFilePlease"} { if {[info exists CanalPourTouteLaBalise]} { close $CanalPourTouteLaBalise unset CanalPourTouteLaBalise unset FichierPourTouteLaBalise } } set CloseFileIfEmpty [string equal $Close "CloseFileIfEmpty"] set CloseFileAfterRead [string equal $Close "CloseFileAfterRead"] if {[info exists FichierPourTouteLaBalise]} { if {$Fichier!="" && $FichierPourTouteLaBalise != $Fichier} { close $CanalPourTouteLaBalise unset CanalPourTouteLaBalise } } if { ! [info exists CanalPourTouteLaBalise] } { set FichierPourTouteLaBalise $Fichier set CanalPourTouteLaBalise [open $FichierPourTouteLaBalise "r"] } if {$Bal=="OpenFilePlease"} { return $CanalPourTouteLaBalise } set LesLignes {} while {[gets $CanalPourTouteLaBalise Ligne] >= 0} { if {[regexp "\<$Bal " $Ligne] || [regexp "\<$Bal *\>" $Ligne]} { set LesLignes [list $Ligne] ; break } } if {$LesLignes=={}} { if {$CloseFileIfEmpty} { if {[info exists CanalPourTouteLaBalise]} { close $CanalPourTouteLaBalise unset CanalPourTouteLaBalise unset FichierPourTouteLaBalise } } return "" } while {[gets $CanalPourTouteLaBalise Ligne] >= 0} { lappend LesLignes $Ligne if {[regexp "" $Ligne]} { break } } if {$CloseFileAfterRead} { if {[info exists CanalPourTouteLaBalise]} { close $CanalPourTouteLaBalise unset CanalPourTouteLaBalise unset FichierPourTouteLaBalise } } return [join $LesLignes "\n"] } proc LesBoutsDeLaLigneAvecTexteSeparateur {Ligne {Sep ""} {Trim ""}} { set LesBouts {} set LongSep [string length $Sep] while 1 { if {$Ligne=="" } { break } set i [string first $Sep $Ligne] if {$i<0} { set Bout $Ligne } else { set Bout [string range $Ligne 0 [expr $i - 1]] } if {$Trim!=""} { set Bout [string $Trim $Bout] } lappend LesBouts $Bout if {$i<0} { break } set Ligne [string range $Ligne [expr $i + $LongSep] end] } return $LesBouts } proc LesMotsDuTexte Texte { #biotcl wordsFromText {text} regsub -all {[ \t\,\;\n\r]+} $Texte " " Texte set Texte [string trim $Texte] set LesMots [split $Texte " "] return $LesMots } proc LigneDesMots {Ligne {REX ""}} { if {$REX==""} { set REX "\;" } regsub -all "$REX|\t" $Ligne " " Ligne if {$REX!=" "} { while {[regexp " " $Ligne]} { regsub -all " " $Ligne " " Ligne } } set Ligne [string trim $Ligne] return $Ligne } proc LesMotsDeLaLigne {Ligne {REX ""}} { return [split [LigneDesMots $Ligne $REX] " "] } proc IntegerToAscii I { #biotcl integerToAscii {} set Ascii [format "%c" $I] return $Ascii } proc AsciiToInteger A { #biotcl asciiToInteger {} set I -1 scan $A "%c" I return $I } proc HexaToAscii Hex { #biotcl hexaToAscii {} regsub "^%" $Hex "" Hex regsub -nocase "^ox" $Hex "" Hex set Ascii [format "%c" 0x$Hex] return $Ascii } proc LesCaracteresAscii {} { #biotcl asciiCharacters {} foreach n [NombresEntre 32 256] { lappend LesCars "[IntegerToAscii $n] $n" } return $LesCars } proc TexteAscii Texte { #biotcl textToAscii {text} regsub -all {\+} $Texte " " Texte regsub -all "%0D" $Texte "%0A" Texte while {[regexp -nocase {%[0-9a-h]{2}} $Texte Hexa]} { set Car [HexaToAscii $Hexa] if {$Car=="&"} { set Car "\\&" } regsub -all $Hexa $Texte $Car Texte } regsub -all "\<" $Texte "<" Texte regsub -all "\>" $Texte ">" Texte return $Texte } proc SousListe ListeDepart { set ListeDepart [ListeDesPABs] if {$ListeDepart=={}} { return {} } FaireLire "Please select two elements within following elements" while 1 { set BornesSubList [Entre "[lindex $ListeDepart 0] [lindex $ListeDepart end]"] if {$BornesSubList==""} { return "" } scan $BornesSubList "%s %s" Prems Derns set D [lsearch -exact $ListeDepart $Prems] set F [lsearch -exact $ListeDepart $Derns] if {$D<0 || $F<0} { FaireLire "Please select two elements within\n$ListeDeDepart" continue } set Liste [lrange $ListeDepart $D $F] if {$Liste!={} || [OuiOuNon "I got an empty list ... is it OK ?"]} { break } } return $Liste } proc TouchePour {Clavier {Texte ""} {Commande ""} {Action ""} {Couleur ""}} { global TouchePour if {[regexp -nocase "GetPostpone" $Clavier]} { if { ! [info exists TouchePour(Postpone)]} { set TouchePour(Postpone) {} } set Memo $TouchePour(Postpone) if {[regexp -nocase "Reset" $Clavier]} { set TouchePour(Postpone) {} set TouchePour(ClavierCourant) "" } return $Memo } if { ! [info exists TouchePour(ClavierCourant)]} { set TouchePour(ClavierCourant) "" } set CC $Clavier if {[regexp "^<" $CC]} { set CC $TouchePour(ClavierCourant) } else { set TouchePour(ClavierCourant) $CC } if {$CC=="Postpone"} { if {[regexp "^<" $Clavier]} { lappend TouchePour(Postpone) [list $Clavier $Texte $Commande $Action $Couleur] } else { lappend TouchePour(Postpone) [list $Texte $Commande $Action $Couleur] } return $TouchePour(Postpone) } if {$Texte=="ReAcceptAll" && [info exists TouchePour($CC,RefuseAll)]} { unset TouchePour($CC,RefuseAll) return "" } if {$Texte=="RefuseAll"} { set TouchePour($CC,RefuseAll) 1 } if {[info exists TouchePour($CC,RefuseAll)]} { return "" } #rR if {[PourWscope]} { return [TouchePourWscope $Clavier $Texte $Commande $Action $Couleur] } #rR #????? if {[regexp "NoWeb" $Action]} { return "" } if {[regexp "^<" $Clavier]} { set Bouton [set TouchePour(BoutonCourant)] set NewTexte [lindex [$Bouton configure -text] 4] append NewTexte $Texte $Bouton configure -text $NewTexte bind $Bouton $Clavier $Commande return $Bouton } if {$Texte=="NouvelleCouleur"} { set TouchePour($Clavier,Couleur) $Commande return [set TouchePour($Clavier,Couleur)] } if {$Texte=="NouvelleGamme"} { if {[PourWscope]} { return } if { ! [info exists TouchePour($Clavier,Gamme)]} { set TouchePour($Clavier,Gamme) -1 } set Gamme [incr TouchePour($Clavier,Gamme)] set DestFrame "$Clavier.gamme$Gamme" frame $DestFrame pack $DestFrame -side "left" -fill x -pady 0 -anchor "n" set TouchePour($Clavier,DestFrame) $DestFrame return $DestFrame } if {$Action=="NoWeb"} { set NoWeb 1 } else { set NoWeb 0 } if {$NoWeb && [PourWscope]} { return "" } if { ! [info exists TouchePour($Clavier,nTouches)]} { set TouchePour($Clavier,nTouches) -1 } if { ! [info exists TouchePour($Clavier,Couleur)]} { set TouchePour($Clavier,Couleur) "grey" } set B [incr TouchePour($Clavier,nTouches)] if {$Couleur==""} { set Couleur [set TouchePour($Clavier,Couleur)] } set Bouton "$Clavier.touche$B" set WidthButton 15 if {[regexp "\.board\." $Bouton]} { set WidthButton 25 } button $Bouton -text $Texte -background $Couleur -foreground black -relief raise -width $WidthButton -height 1 -pady 0 bind $Bouton <1> $Commande if { ! [PourWscope]} { pack $Bouton -in [set TouchePour($Clavier,DestFrame)] -side "top" -expand 1 } set TouchePour(BoutonCourant) $Bouton return $Bouton } proc CreeLeRepertoire Rep { if {$Rep=="" || [file exists $Rep]} { return $Rep } set Parent [file dirname $Rep] if { ! [file exists $Parent]} { set Parent [CreeLeRepertoire $Parent] } if {$Parent=="" || ! [file exists $Parent]} { return "" } file mkdir $Rep if {[file exists $Rep]} { return $Rep } return "" } proc ChoixDuRepertoire {{RepInitial ""}} { global OuiOuNonToujoursParDefaut if {[info exists OuiOuNonToujoursParDefaut] && $OuiOuNonToujoursParDefaut} { if {$RepInitial!="" && [file exists $RepInitial]} { return $RepInitial } } if {$RepInitial==""} { set RepInitial "./" } # BUG dans Tk ... initialdir n'est pas pris set Rep [tk_chooseDirectory -initialdir $RepInitial] if {$Rep==""} { return "" } if {[file exists $Rep]} { return $Rep } if { ! [OuiOuNon "Do I create the directory\n$Rep ?"]} { FaireLire "Tant pis" ; return $Rep } set RepCree [CreeLeRepertoire $Rep] if {$RepCree!=""} { FaireLire "I created $Rep" return $RepCree } FaireLire "I couldn't create $Rep\nWe'll try again" return [ChoixDuRepertoire $RepInitial] } proc LesFichiersQuiCommencentPar {Texte {Rep ""} {Extension ""}} { if {$Rep!="" && [regexp "/$" $Rep]} { append Rep "/" } set LesBons {} foreach Fichier [glob -nocomplain "${Rep}*$Extension"] { if {[regexp -nocase -- "^$Texte" [file tail $Fichier]]} { lappend LesBons $Fichier } } return "$LesBons" } proc Tx {{D ""} {F ""}} { global Tx TxD TxF if {$D==""} { set D $TxD } if {$F==""} { set F $TxF } return [string range $Tx $D $F] } proc PrintEnv Variable { global env if {$Variable=="all"} { return [array get env] } if {[info exists env($Variable)]} { return $env($Variable) } return "$Variable iiiiiiiiiiiiiiiiiiiiinconnu" } proc LesBoutonsDeLaFrame F { set LesBoutons {} foreach Bouton [winfo children $F] { if {[winfo class $Bouton]!="Button"} { continue } lappend LesBoutons $Bouton } return $LesBoutons } proc PourWscope {{NouvelleValeur ""}} { global PourWscope if {$NouvelleValeur!=""} { set PourWscope $NouvelleValeur } if { ! [info exists PourWscope]} { set PourWscope 0 } return $PourWscope } proc thtml {} { set T [ContenuDuFichier trp7_human.blastp] set B [ProchaineBalise T Attrib "Rogner"] Espionne "Attributs de $B : $Attrib" set B [ProchaineBalise T Attrib "Rogner"] Espionne "Attributs de $B : $Attrib" set Iter [ValeurDeLaBalise "Iteration" T] set Num [ValeurDeLaBalise "Iteration_iter-num" Iter] set Hits [ValeurDeLaBalise "Iteration_hits" Iter] set Stat [ValeurDeLaBalise "Iteration_stat" Iter] Espionne "Num =$Num=" Espionne $Stat while 1 { set Hit [ValeurDeLaBalise "Hit" Hits "" "Rogner"] set Hit_def [ValeurDeLaBalise "Hit_def" Hit "NePasRogner"] set Hit_id [ValeurDeLaBalise "Hit_id" Hit "NePasRogner"] Espionne "$Hit_id $Hit_def" while 1 { set BH [ProchaineBalise Hit "" "Rogner"] if {$BH==""} { break } Espionne " $BH" } } exit exit foreach BornesDuHit [LesSousChamps $Hits] { scan $BornesDuHit "%d %d" D F set Hit [string range $Hits $D $F] Espionne [string range $Hit 0 300] set Hit_def [ValeurDeLaBalise "Hit_def" Hit "NePasRogner"] set Hit_id [ValeurDeLaBalise "Hit_id" Hit "NePasRogner"] Espionne "$Hit_id $Hit_def" while 1 { set BH [ProchaineBalise Hit "" "Rogner"] if {$BH==""} { break } Espionne " $BH" } } exit Recure $T while 1 { set Bal [ProchaineBalise T Attrib] if {$Bal==""} { break } set Val [ValeurDeLaBalise $Bal T] Espionne "=$Bal=[string range $Val 0 50]" } exit } proc LesSousChamps {T {Champ ""}} { set Balise [ProchaineBalise T] if {$Champ!="" && ! [string equal -nocase $Balise $Champ]} { return {}} Espionne $Balise set LesValeurs {} set i 5 while 1 { if {[incr i -1]==0} { break } set Valeur [ValeurDeLaBalise $Balise T] if {$Valeur==""} { break } lappend LesValeurs $Valeur # Espionne [string range $Valeur 0 300] } return $LesValeurs } proc Recure W { global Indentation while 1 { set B [ProchaineBalise W] if {$B==""} { Espionne "[string repeat " " $Indentation] $W" ; break } set V [ValeurDeLaBalise $B W] if { ! [info exists Indentation]} { set Indentation 1 } Espionne "[string repeat " " $Indentation] ($B)" if {$V==""} { continue } incr Indentation Recure $V incr Indentation -1 } return "" } proc RRGardeLesEucaryotes {Fichier} { set LesEucaryotes {} set Texte [ContenuDuFichier $Fichier] while {[set BH [ValeurDeLaBalise "BlastHit" Texte]]!=""} { set AC [ValeurDeLaBalise AC BH NePasRogner] set OX [ValeurDeLaBalise OX BH NePasRogner] set DE [ValeurDeLaBalise DE BH NePasRogner] Espionne "OX $OX" set HasEuka 0 foreach TaxId [split $OX " "] { regsub {[^0-9]} $TaxId "" TaxId if { ! [EstUnEucaryote $TaxId]} { continue } set HasEuka 1 break } Espionne "$HasEuka $BH" if {$OX!="" && ! $HasEuka} { continue } # AppendAuFichier les_eucaryotes $Ligne lappend LesEucaryotes $BH } return $LesEucaryotes } proc TesteValeurDeLaBalise {} { set Texte " " set V [ValeurDeLaBalise BlastHit Texte "NePasRogner" A] Espionne "Valeur >$V<" Espionne "Attrib >$A<" Espionne "/$Texte/" set V [ValeurDeLaBalise DE Texte "NePasRogner" A] Espionne "Valeur >$V<" Espionne "Attrib >$A<" Espionne "/$Texte/" set V [ValeurDeLaBalise AC Texte "NePasRogner" A] Espionne "Valeur >$V<" Espionne "Attrib >$A<" Espionne "/$Texte/" Espionne [AttributsDeLaBalise DE Texte] exit } proc ValeurDeLaBalise {Item aTexte {Rogner "Rogner"} {aAttributs ""} {Vide ""}} { upvar $aTexte Texte if {$aAttributs!=""} { upvar $aAttributs Attributs } set Rogner [expr ! [string equal -nocase $Rogner "NePasRogner"]] regsub -all -- "-" $Item "\-" ItemX if { ! [regexp -indices -nocase "<${ItemX}(>| )" $Texte Indices]} { return $Vide } set FinItem [lindex $Indices 1] set NouveauTexte [string range $Texte [expr $FinItem] end] set iChevronFermant [string first ">" $NouveauTexte] if {$iChevronFermant<0} { return "" } set Attributs [string range $NouveauTexte 0 $iChevronFermant] set LongAttributs [string length $Attributs] regsub ">" $Attributs "" Attributs set Attributs [string trim $Attributs] set NouveauTexte [string trim [string range $NouveauTexte $LongAttributs end]] set Fermant [ItemHTMLFermant $Item] if {$Fermant==">"} { set Valeur $Attributs set Derriere 0 } else { regsub -all -- "-" $Fermant "\-" FermantX if { ! [regexp -indices -nocase "$FermantX" $NouveauTexte Indices]} { return $Vide } set iFin [lindex $Indices 0] if {[regexp {<[^/]} $FermantX]} { set Derriere [expr $iFin - 1] } else { set Derriere [expr [lindex $Indices 1] + 1] } set Valeur [string range $NouveauTexte 0 [expr $iFin - 1]] } if {$Rogner} { set Texte [string range $NouveauTexte $Derriere end] } if {$Valeur==""} { set Valeur $Vide } return $Valeur } proc ProchaineBalise {aTexte {aAttributs ""} {Rogner "NePasRogner"}} { upvar $aTexte Texte if {$aAttributs!=""} { upvar $aAttributs Attributs ; set Attributs ""} set Rogner [expr ! [string equal $Rogner "NePasRogner"]] if { ! [regexp -indices -nocase {<[^ >]+} $Texte Indices]} { return "" } set DebItem [lindex $Indices 0] set FinItem [lindex $Indices 1] set Balise [string range $Texte [incr DebItem] $FinItem] set NouveauTexte [string range $Texte $FinItem+1 end] set iChevronFermant [string first ">" $NouveauTexte] if {$iChevronFermant<0} { return "" } set Attributs [string range $NouveauTexte 0 $iChevronFermant] set LongAttributs [string length $Attributs] set Attributs [string trim $Attributs " />"] set NouveauTexte [string range $NouveauTexte $LongAttributs-1 end] set Fermant [ItemHTMLFermant $Balise] regsub -all -- "-" $Fermant "\-" FermantX if { ! [regexp -indices -nocase "$FermantX" $NouveauTexte Indices]} { return "" } set iFin [lindex $Indices 0] set Derriere [expr [lindex $Indices 1] + 1] set Valeur [string range $NouveauTexte 0 [expr $iFin - 1]] if {$Rogner} { set Texte [string range $NouveauTexte $Derriere end] } return $Balise } proc ItemHTMLFermant Item { global ItemHTMLFermant if {[info exists ItemHTMLFermant($Item)]} { return $ItemHTMLFermant($Item) } set Item [string tolower $Item] set LesSimples {area img ox os oc ac de gn id pn rect polyline path} if {[lsearch -exact $LesSimples $Item]>=0} { return ">" } # if {[string equal -nocase $Item "LI"]} { return "
  • " } return "" } proc AttributsDeLaBalise {Item aTexte {Rogner "NePasRogner"}} { upvar $aTexte Texte ValeurDeLaBalise $Item $aTexte $Rogner A return $A } proc Garde {Fichier {Granularity "Seconde"} {AndDelete ""} {GetName ""}} { #biotcl keepFile {} if { ! [file exists $Fichier]} { return "" } #rR on peut ne demander que le nom if {[regexp -nocase "=GetName=" "=$Granularity=$AndDelete=$GetName="]} { set GetName "GetName" } if {[regexp -nocase "AndDelete" $Granularity]} { set AndDelete $Granularity set Ganularity "" } if {$Granularity=="Minute"} { set Time 60000 set Extension [Date] } else { set Time 1000 set Extension [Date "Seconds"] } set Nouveau "$Fichier.$Extension" if {[file exists $Nouveau]} { after $Time ; return [Garde $Fichier $Granularity $AndDelete $GetName] } if {$GetName=="GetName"} { return $Nouveau } File copy -force $Fichier $Nouveau if {[file exists $Nouveau]} { if {[regexp -nocase "AndDelete" $AndDelete] && [file exists $Fichier]} { file delete $Fichier } return $Nouveau } return "" } proc Zippe {ListeA ListeB} { set LongPetite [Mini [llength $ListeA] [llength $ListeB]] foreach A [lrange $ListeA 0 $LongPetite] B [lrange $ListeB 0 $LongPetite] { lappend ListeAB $A $B } incr LongPetite if {[llength $ListeA] > $LongPetite} { return [concat $ListeAB [lrange $ListeA $LongPetite end]] } if {[llength $ListeB] > $LongPetite} { return [concat $ListeAB [lrange $ListeB $LongPetite end]] } return $ListeAB } proc LesLignesVitales {Fichier {SansVide ""} {SansBlanc ""}} { #biotcl validLinesFromFile {file withoutEmpty withoutSpace} set SansVide [string equal -nocase $SansVide "SansVide"] set SansBlanc [string equal -nocase $SansBlanc "SansBlanc"] Wup "Returns the lists of the lines from Fichier, accepts continuation and ignores # or empty lines" set LesVitales {} set Lu "" foreach Ligne [LesLignesDuFichier $Fichier] { if {$SansBlanc} { regsub -all " " $Ligne "" Ligne } if {[regexp {\#} $Ligne]} { regsub {\#.*$} $Ligne "" Ligne } if {$SansVide && [string trim $Ligne]==""} { continue } if { ! [regexp -nocase {[^ ]} $Ligne]} { continue } if {[regexp {\\$} $Ligne]} { regsub {\\$} $Ligne "" Ligne append Lu $Ligne } else { append Lu $Ligne lappend LesVitales $Lu set Lu "" } } return $LesVitales } proc AttendreLeFichier {Fichier {TimeOut ""}} { set Attente 1000 while { 1 } { if {[file exists $Fichier]} { return $Fichier } if {$TimeOut != "" } { set TimeOut [expr $TimeOut-$Attente] if {$TimeOut<0} { return "" } } after $Attente } } proc PourGscopeServer {} { return [PourWscope] } proc NextALPHA S { #biotcl nextAlpha {} if {$S==""} { return "A" } set F [string index $S end] if {$F < "A" || "Z" < $F} { return "${S}A" } if {$F < "Z"} { scan $F "%c" I set N [format "%c" [incr I]] return [string replace $S end end $N] } set Avant [string range $S 0 end-1] return "[NextALPHA $Avant]A" } proc Echange {aA aB} { upvar $aA A upvar $aB B set W $A set A $B set B $W return } proc ImprimeLeTexte {Texte {Commande ""}} { set Fichier "[TmpFile].txt" set Fichier [Sauve $Texte dans $Fichier] if {$Fichier==""} { FaireLire "I couldn't create $Fichier for printing" return "" } if {$Commande==""} { set Commande "renoir" } return [ImprimeLeFichier $Fichier $Commande] } proc ImprimeLeFichier {Fichier {Commande ""}} { global CommandePrint Gs "Ignorer" if { ! [info exists CommandePrint]} { set CommandePrint "renoir" } if {$Commande==""} { set Commande $CommandePrint } set CommandePrint "$Commande $Fichier" if {[OuiOuNon "$CommandePrint\n\nDo You want to edit this print command ?" 0]} { set CommandePrint [Entre $CommandePrint] } eval exec $CommandePrint return $Fichier } proc SubstitueAvecBlancsDevant {Texte A B} { regexp -indices $A $Texte Indices scan $Indices "%d %d" d f incr d -1 while {$d>0 && [string index $Texte $d]==" "} { incr d -1 } incr d 2 set LongBlancAvant [expr $f-$d+1-[string length $B]] set Platre "[string repeat " " $LongBlancAvant]$B" set NouveauTexte [string replace $Texte $d $f $Platre] return $NouveauTexte } proc ChoixParmiJoliDansListe Liste { set LesClefs {} set LesCouleurs {} set LesTextes {} foreach {Clef Couleur Texte} $Liste { lappend LesClefs $Clef lappend LesCouleurs $Couleur if {$Texte==""} { set Texte $Clef } lappend LesTextes $Texte } return [ChoixParmiJoli $LesClefs $LesCouleurs $LesTextes] } proc TCPJ {} { set L {a b c d} set A {Arnaud Bob Claude Denis} set C {red blue yellow green} return [ChoixParmiJoli $L $C $A] } proc ChoixParmiJoli {Liste {ListeDeCouleurs {}} {ListeAAfficher {}}} { global retourChoixParmi if {[llength $Liste] == 0 } { return "" } if {[llength $Liste] == 1 && [lindex $Liste 0]!="Other"} { return [lindex $Liste 0] } global ChoixParmiDansListBox if {([info exists ChoixParmiDansListBox] && $ChoixParmiDansListBox) || [llength $Liste]>40} { return [ChoixParmiDansListBox $Liste $ListeAAfficher] } set w [NomDe fenetre] catch {destroy $w} catch {unset retourChoixParmi} toplevel $w wm geometry $w +300+100 set Invite "Choose ..." set InListBox "Same display in a listbox" set Salut "... DISMISS" if {$ListeAAfficher=={}} { set ListeAAfficher $Liste } tk_optionMenu $w.o retourChoixParmi $Invite $w.o.menu add radiobutton -label $InListBox -background "orange" -variable retourChoixParmi $w.o configure -background "Seagreen" -foreground "black" -bd 20 foreach Element $Liste Couleur $ListeDeCouleurs Affiche $ListeAAfficher { while {[info exists MonRetour($Affiche)]} { append Affiche "_" } set MonRetour($Affiche) $Element if { $Couleur == "" } { set Couleur "Seagreen" } $w.o.menu add radiobutton -background $Couleur -foreground "black" \ -label $Affiche -variable retourChoixParmi } $w.o.menu add radiobutton -label $Salut -background "red" -variable retourChoixParmi pack $w.o tkwait variable retourChoixParmi destroy $w if { $retourChoixParmi == $InListBox } { set retourChoixParmi [ChoixParmiDansListBox $ListeAAfficher] } if { $retourChoixParmi == $Invite || $retourChoixParmi == $Salut } { set retourChoixParmi "" } if {$retourChoixParmi==""} { return "" } set Retour [set MonRetour($retourChoixParmi)] return $Retour } proc ChoixParmi {Liste {ListeDeCouleurs {}}} { global retourChoixParmi if {[llength $Liste] == 0 } { return "" } if {[llength $Liste] == 1 && [lindex $Liste 0]!="Other"} { return [lindex $Liste 0] } global ChoixParmiDansListBox if {[PourWscope] \ || [info exists ChoixParmiDansListBox] && $ChoixParmiDansListBox \ || [llength $Liste]>40} { return [ChoixParmiDansListBox $Liste] } set w [NomDe fenetre] catch {destroy $w} catch {unset retourChoixParmi} set GW 300 set GH 100 set SW [winfo screenwidth .] set SH [winfo screenheight .] set OffX [expr ($SW - $GW)/2] set OffY [expr ($SH - $GH)/4] toplevel $w -borderwidth 20 wm geometry $w ${GW}x${GH}+${OffX}+${OffY} $w configure -background orange set Invite " Please select within the list ... " set InListBox "Same display in a listbox" set Salut "... DISMISS (select nothing)" tk_optionMenu $w.o retourChoixParmi $Invite $w.o.menu add radiobutton -label $InListBox -background "orange" -variable retourChoixParmi $w.o configure -background "Seagreen" -foreground "black" -bd 10 -width 30 -height 2 foreach Element $Liste Couleur $ListeDeCouleurs { if { $Couleur=="" } { set Couleur "Seagreen" } $w.o.menu add radiobutton -background $Couleur -foreground "black" \ -label $Element -variable retourChoixParmi } $w.o.menu add radiobutton -label $Salut -background "red" -variable retourChoixParmi pack $w.o tkwait variable retourChoixParmi destroy $w if { $retourChoixParmi == $InListBox } { return [ChoixParmiDansListBox $Liste] } if { $retourChoixParmi == $Invite || $retourChoixParmi == $Salut } { set retourChoixParmi "" } return $retourChoixParmi } proc ChoixParmiDansListBox {Liste {ListeAAfficher {}}} { set Choose "Select ONE of the following lines and press ACCEPT. Press DISMISS to cancel." if {$ListeAAfficher=={}} { set ListeA $Liste } else { set ListeA $ListeAAfficher } set ListeE [concat [list ""] $Liste] set ListeA [concat [list $Choose] $ListeA] foreach E $ListeE A $ListeA { while {[info exist ARetourner($A)]} { set A "$A (bis)" } set ARetourner($A) $E lappend BonneListeA $A } set Texte [join $BonneListeA "\n"] set Retour [Affiche $Texte "AvecRienSansFetchAvecRetour" "SelectAndAccept"] if {$Retour==$Choose || $Retour==""} { return "" } if { ! [info exists ARetourner($Retour)]} { error $Retour } ;#rR ... error le transmet directement a Wscope return $ARetourner($Retour) } proc WrapLeTexte {Texte {Largeur 50}} { if {[string length $Texte]<=$Largeur} { return [list $Texte] } set Entamme [string range $Texte 0 [expr $Largeur-1]] set DernierBlanc [string last " " $Entamme] if {$DernierBlanc<0} { set DernierBlanc $Largeur } set Entamme [string range $Texte 0 [expr $DernierBlanc - 1]] set Reste [string trim [string range $Texte $DernierBlanc end]] return [concat [list $Entamme] [WrapLeTexte $Reste $Largeur]] } proc LesLignesEntreExpressionsDuFichier {Fichier A B {BExclu "SecondExcluded"}} { if {$BExclu=="SecondIncluded"} { set BExclu 1 } else { set BExclu 0 } set OnYEst 0 set LesBonnes {} foreach Ligne [LesLignesDuFichier $Fichier] { if {[regexp $A $Ligne]} { set OnYEst 1 } if {[regexp $B $Ligne] && $BExclu} { break } if {$OnYEst} { lappend LesBonnes $Ligne } if {[regexp $B $Ligne]} { break } } return $LesBonnes } proc SqueletteDeProc {} { lappend LeSquel "proc ChangeMyName \{\} \{" lappend LeSquel " global RepertoireDuGenome" lappend LeSquel " " lappend LeSquel " " lappend LeSquel "\}" return [join $LeSquel "\n"] } proc CreeUneNouvelleProcedure {{Texte ""}} { global LesProceduresExistantes regsub {^[ \t]*} $Texte "" Texte if {$Texte==""} { set Texte [SqueletteDeProc] } else { if { ! [regexp "^proc " $Texte]} { set Texte "proc $Texte" } } set Nouveau [EntreTexte $Texte] if {$Nouveau==""} { return "" } scan $Nouveau "%s %s" P N source [Sauve $Nouveau dans [TmpFile ".tcl"]] set LesProceduresExistantes [linsert $LesProceduresExistantes 0 $N] AfficheLaProc $N } proc ModeInteractif {} { global RepertoireDuGenome global GscopeDir set Fin 0 while {!$Fin} { if {[gets stdin Ligne]==-1} { set Fin 1 } else { if {[catch {puts [eval $Ligne]} Message]} { puts stderr $Message } } } } proc SplitOrgas Organismes { set OrgaJoinCar ":" return [split $Organismes $OrgaJoinCar] } proc ContenuSubstitueDuFichier {Fichier args} { if { $Fichier == "" } {return ""} set f [open $Fichier r] set Texte [read -nonewline $f] close $f set I 0 foreach argument $args { set VariableN "(\[^\\\\])\\$${I}(\[^0-9\])" regsub -all {&} $argument {\\&} argument regsub -all $VariableN $Texte "\\1$argument\\2" Texte incr I } regsub -all {\\(\$[0-9])} $Texte "\\1" Texte return $Texte } proc PaqTexte {Label Texte} { return "Text: $Label $Texte" } proc PaqListe {Label Liste} { return "List: $Label [SeriaList $Liste]" } proc PaqArray {Label {aArray ""}} { if {$aArray==""} { set aArray $Label } upvar $aArray Array set Liste [array get Array] return "Array: $Label [SeriaList $Liste]" } proc SeriaList args { return "$args" } proc ListSeria Texte { return [eval list $Texte] } proc AffecteLesVariablesDeReponse {Reponse {Level ""}} { if {$Level==""} { set Level 2 } else { if { ! [regexp {^\#} $Level]} { incr Level } } return [AffecteLesVariablesDeLaListe [split $Reponse "\n"] $Level] } proc AffecteLesVariablesDeLaListe {Liste {Level 1}} { # JeMeSignale foreach Ligne $Liste { if { ! [regexp {^(Text|List|Array): } $Ligne]} { continue } set Type "" set NomDeVariable "" scan $Ligne "%s %s" Type NomDeVariable if { ! [regexp -nocase {^[a-z_]} $NomDeVariable] } { continue } lappend LesVariables $NomDeVariable regsub {\(} $NomDeVariable {\\(} NomDeVariable regsub {\)} $NomDeVariable {\\)} NomDeVariable regsub "^$Type $NomDeVariable " $Ligne "" Ligne # puts stderr [string range $Ligne 0 80] set Commande "" switch $Type { "Text:" { set Commande "set $NomDeVariable $Ligne" } "List:" { set Commande "set $NomDeVariable [ListSeria $Ligne]" } "Array:" { regsub "^_x_" $NomDeVariable "" NomDeVariable set Commande "array set $NomDeVariable [ListSeria $Ligne]" } } if {[regexp bonjour $Commande]} { Espionne $Commande } if {$Commande!=""} { uplevel $Level $Commande } } return $LesVariables } proc EtendAuxPremiersTermes LesTermes { if {[llength $LesTermes]<=1} { return $LesTermes } if {[lindex $LesTermes 0]!=""} { return $LesTermes } set LaSuite [EtendAuxPremiersTermes [lrange $LesTermes 1 end]] set Premier [lindex $LaSuite 0] return [concat [list $Premier] $LaSuite] } proc EtendAuxDerniersTermes LesTermes { if {[llength $LesTermes]<=1} { return $LesTermes } set Premier [lindex $LesTermes 0] foreach Terme $LesTermes { if {$Terme==""} { set Terme $Premier } lappend LesBonsTermes $Terme } return $LesBonsTermes } proc GscopeLangue {{Langue ""}} { set Langue [string tolower $Langue] global GscopeLangue if {$Langue!=""} { set LesPossibles [list gscope english francais elsassich] if {[lsearch $LesPossibles $Langue]<0} { set Langue "" } set GscopeLangue $Langue } if { ! [info exists GscopeLangue] || $GscopeLangue==""} { set GscopeLangue "english" } return $GscopeLangue } proc Teste_LaTraduction {} { set Liste [ColorationsPossibles] foreach X $Liste T [LaTraduction $Liste "english" "SansBlanc"] { Espionne "$X $T" } exit } proc LaTraduction {Liste {Sortie ""} {SansBlanc ""}} { global GscopeDico if {$Sortie==""} { set Sortie [GscopeLangue] } set SansBlanc [string equal -nocase $SansBlanc "SansBlanc"] if { ! [info exists GscopeDico]} { foreach FichierDico [glob -nocomplain "[GscopeEtc]/gscope_*.dic"] { if {[file exists $FichierDico]} { if {[info exists LesLangues]} { unset LesLangues } foreach Ligne [LesLignesDuFichier $FichierDico] { if {[regexp {^[ \t]*\#} $Ligne]} { continue } set LesTermes {} foreach Terme [split $Ligne ":"] { regsub -all {^[ \t]+} $Terme "" Terme regsub -all {[ \t]+$} $Terme "" Terme lappend LesTermes $Terme } if { ! [info exists LesLangues]} { set LesLangues $LesTermes set NombreDeLangues [llength $LesLangues] continue } while {[llength $LesTermes] < $NombreDeLangues} { lappend LesTermes "" } set LesTermes [EtendAuxPremiersTermes $LesTermes] set LesTermes [lrange $LesTermes 0 [expr $NombreDeLangues-1]] set LesTermes [EtendAuxDerniersTermes $LesTermes] foreach Terme $LesTermes { foreach Langue $LesLangues TermeTraduit $LesTermes { if {$Terme==""} { continue } if {$SansBlanc} { regsub -all " " $TermeTraduit "_" TermeTraduit } set GscopeDico($Terme:$Langue) $TermeTraduit } } } } } } foreach Terme $Liste { if {[info exists GscopeDico($Terme:$Sortie)]} { lappend LaTraduction [set GscopeDico($Terme:$Sortie)] } else { lappend LaTraduction $Terme } } return $LaTraduction } proc Traduction {Terme {Sortie ""}} { return [lindex [LaTraduction [list $Terme] $Sortie] 0] } proc NombresEntre {D F {Pas 1}} { #biotcl numbersBetween {start end step} if {$D==$F} { return [list $D] } set LesX {} for {set X $D} {[expr $Pas*$X <= $Pas*$F]} { set X [expr $X+$Pas]} { lappend LesX $X } return $LesX } proc Base10 Texte { #biotcl base10 {text} regsub " " $Texte "" Texte if {[regexp "^\-" $Texte]} { set PlusOuMoins "-" } else { set PlusOuMoins "" } regsub {^[\-0]*} $Texte "" Texte if {$Texte==""} { set Texte 0 } return "$PlusOuMoins$Texte" } proc FilenameWithDate {File {Format ""} {WhichTime ""}} { #biotcl fileNameWithDate {} if {[FileAbsent $File]} { return -1 } set DoF [DateOfFile $File $Format $WhichTime] set NewName "$File.$DoF" set N 1 while {[file exists $NewName]} { set NewName "$File.$DoF.$N" incr N } return $NewName } proc DateOfFile {File {Format ""} {WhichTime ""}} { #biotcl dateOfFile {} if {[FileAbsent $File]} { return -1 } if {$WhichTime==""} { set WhichTime "mtime" } set TopChrono [file $WhichTime $File] return [Date $Format $TopChrono] } proc Date {{Format ""} {TopChrono ""}} { #biotcl date {} if {$Format==""} { set Format "%Y%m%d%H%M" } if {$Format=="_"} { set Format "YMD_HMS" } if {[string equal -nocase "YMD" $Format]} { set Format "%Y%m%d" } if {[string equal -nocase "YMD_HM" $Format]} { set Format "%Y%m%d_%H%M" } if {[string equal -nocase "YMD_HMS" $Format]} { set Format "%Y%m%d_%H%M%S" } if {[string equal -nocase $Format "Nice_"]} { set Format "%Y_%m_%d_%H_%M" } if {[string equal -nocase $Format "Nice_H"]} { set Format "%Y_%m_%d_%Hh%M" } if {[string equal -nocase $Format "Nice"]} { set Format "%Y/%m/%d %H:%M" } if {[string equal -nocase $Format "NiceSeconds"]} { set Format "%Y/%m/%d %H:%M:%S" } if {[string equal -nocase $Format "NiceSeconds-"]} { set Format "%Y/%m/%d-%H:%M:%S" } if {[string equal -nocase $Format "NiceYMD"]} { set Format "%Y/%m/%d" } if {[string equal -nocase $Format "Seconds"]} { set Format "%Y%m%d%H%M%S" } if {$TopChrono==""} { set TopChrono [clock scan now] } if {$Format=="TimeStamp"} { return $TopChrono } return [clock format $TopChrono -format $Format] } proc LesLigneesUsageUnique {} { foreach AppeleeAppelante [LesProceduresUsageUnique] { scan $AppeleeAppelante "%s %s" Appelee Appelante set AppelanteDe($Appelee) $Appelante lappend AppeleePar($Appelante) $Appelee # Espionne "set AppelanteDe($Appelee) $Appelante" # Espionne "lappend AppeleePar($Appelante) $Appelee > [set AppeleePar($Appelante)]" lappend LesUsageUnique $Appelee } foreach Procedure $LesUsageUnique { if {[info exists AppeleePar($Procedure)]} { # Espionne "j'abandonne $Procedure car appelante de [set AppeleePar($Procedure)]" continue } set LaLignee {} lappend LaLignee $Procedure while 1 { if {[info exists AppelanteDe($Procedure)]} { set Procedure [set AppelanteDe($Procedure)] lappend LaLignee $Procedure } else { break } } Espionne "[llength $LaLignee] [join $LaLignee " "]" } } proc LesProceduresUsageUnique {} { global GscopeDir set FichierLesProceduresUsageUnique "$GscopeDir/lesproceduresusageunique" if {[file exists $FichierLesProceduresUsageUnique]} { return [LesLignesDuFichier $FichierLesProceduresUsageUnique] } foreach Procedure [LesProceduresExistantes] { set LesAppelantes [QuiMAppel $Procedure "LaListeMerci"] if {[llength $LesAppelantes] > 1} { continue } if {[llength $LesAppelantes] == 0} { set Appelante "PERSONNE" } else { set Appelante [lindex $LesAppelantes 0] } lappend LesProceduresUsageUnique "$Procedure $Appelante" } SauveLesLignes $LesProceduresUsageUnique dans $FichierLesProceduresUsageUnique return $LesProceduresUsageUnique } proc LesProceduresNonAppelantes {} { foreach Procedure [LesProceduresExistantes] { set LesAppelees [QuiJAppel $Procedure "LaListeMerci"] if {$LesAppelees != {}} { continue } lappend LesProceduresNonAppelantes $Procedure } return $LesProceduresNonAppelantes } proc AppendAuFichier {Fichier Ligne} { #biotcl appendToFile {file text} set Canal [open $Fichier "a"] puts $Canal $Ligne close $Canal return $Fichier } proc Barycentre LesXY { #biotcl centerOfMass {listOfXY} set SX 0 set SY 0 set N [expr [llength $LesXY]/2] if {$N<1} { return {0. 0.} } foreach {X Y} $LesXY { set SX [expr $SX+$X] set SY [expr $SY+$Y] } return [list [expr 1.0*$SX/$N] [expr 1.0*$SY/$N]] } proc Teste_ScanLaListe {} { set L {1 2 3 4 5 6 7 } puts [ScanLaListe $L a b c] puts $a puts $b puts $c exit } proc ScanLaListe {Liste args} { set i 0 set Long [llength $Liste] foreach aV $args { upvar $aV V if {$i >= $Long} { break } set V [lindex $Liste $i] incr i } return $i } proc FouR {Debut Fin} { if {$Debut <= $Fin} { return "F" } else { return "R" } } proc Teste_Fleche {} { set K [UnCanva 600 600] Fleche $K 200 100 430 100 -width 50 -outlinewidth 1 -fill "red" -outline "blue" -arrowdirection "both" -flatside "left" Fleche $K 200 300 230 300 -width 50 -outlinewidth 1 -outline "green" -arrowdirection "both" Fleche $K 200 400 230 400 -width 50 -outlinewidth 1 -fill "" -outline "orange" -arrowdirection "start" Fleche $K 200 500 230 500 -width 50 -outlinewidth 1 -fill "red" -outline "grey" -arrowdirection "none" $K create oval 10 10 100 200 MainLeveeSurUnCanva $K regsub ".canvas" $K "" w Gonfle $w all 1. 1. set K [UnCanva 600 600] Fleche $K 200 100 230 100 -width 50 -outlinewidth 1 -fill "red" -outline "blue" -arrowdirection "end" Fleche $K 200 300 230 300 -width 50 -outlinewidth 1 -fill "red" -outline "blue" -arrowdirection "both" Fleche $K 200 400 230 400 -width 50 -outlinewidth 1 -fill "red" -outline "blue" -arrowdirection "start" Fleche $K 200 500 230 500 -width 50 -outlinewidth 1 -fill "red" -outline "blue" -arrowdirection "none" $K create oval 10 10 100 200 MainLeveeSurUnCanva $K regsub ".canvas" $K "" w Gonfle $w all 1. 1. } proc Fleche {K DebX DebY FinX FinY args} { Wup "Je crains que Fleche demande un canvas avec X et Y de meme nature ... isotropes" Wup " => meme facteurs d'echelle sur X et Y." set Width 6. set Fill "grey" set OutLineWidth 1 set OutLine "black" set ArrowWidth 2 set ArrowDirection "end" set FlatSide "none" foreach {Option Valeur} $args { if {$Valeur==""} { set Valeur "\"\"" } switch -regexp -- $Option { "-width$" { set Width $Valeur } "-outlinewidth$" { set OutLineWidth $Valeur } "-outline$" { set OutLine $Valeur } "-fill$" { set Fill $Valeur } "-arrowwidth$" { set ArrowWidth $Valeur } "-arrowwidthstart$" { set ArrowWidthStart $Valeur } "-arrowwidthend$" { set ArrowWidthEnd $Valeur } "-arrowdirection$" { set ArrowDirection $Valeur } "-flatside$" { set FlatSide $Valeur } } } if { ! [info exists ArrowWidthStart]} { if {[regexp "both|start" $ArrowDirection]} { set ArrowWidthStart $ArrowWidth } else { set ArrowWidthStart 0 } } if { ! [info exists ArrowWidthEnd]} { if {[regexp "both|end" $ArrowDirection]} { set ArrowWidthEnd $ArrowWidth } else { set ArrowWidthEnd 0 } } set w [expr $Width/2.] set fStart [expr -$ArrowWidthStart*$w] set fEnd [expr $ArrowWidthEnd*$w] set Long [expr sqrt(($FinX-$DebX)*($FinX-$DebX) + ($FinY-$DebY)*($FinY-$DebY))] if {$Long==0} { return "" } if {[expr abs($fStart)] > $Long} { set fStart [expr $Long*$fStart/abs($fStart)] } if {[expr abs($fEnd)] > $Long} { set fEnd [expr $Long*$fEnd /abs($fEnd)] } if {[expr abs($fEnd)+abs($fStart)] > $Long} { set fEnd [expr $Long*$fEnd /(2*abs($fEnd)) ] set fStart [expr $Long*$fStart/(2*abs($fStart))] set w [expr abs($fEnd)] } set AxeX [expr ($FinX-$DebX)/$Long] set AxeY [expr ($FinY-$DebY)/$Long] set PerX [expr -$AxeY] set PerY [expr $AxeX] set MemoPerY $PerY set aX [expr $DebX+$w*$PerX] set aY [expr $DebY+$w*$PerY] set GardeS 0 Wup "Si on fait une fleche arriere et si ... " set sX [expr ($DebX+$FinX)/2] set sY [expr ($DebY+$FinY)/2] set mX [expr $DebX-$fStart*$AxeX] set mY [expr $DebY-$fStart*$AxeY] if {[expr ($DebX-$sX)*($DebX-$sX)+($DebY-$sY)*($DebY-$sY)] < \ [expr ($DebX-$mX)*($DebX-$mX)+($DebY-$mY)*($DebY-$mY)]} { set sX $mX set sY $mY set GardeS 1 } set f $fEnd set mX [expr $FinX-$f*$AxeX] set mY [expr $FinY-$f*$AxeY] if { ! $GardeS } { set sX [expr ($DebX+$FinX)/2] set sY [expr ($DebY+$FinY)/2] if {[expr ($FinX-$sX)*($FinX-$sX)+($FinY-$sY)*($FinY-$sY)] < \ [expr ($FinX-$mX)*($FinX-$mX)+($FinY-$mY)*($FinY-$mY)]} { set sX $mX set sY $mY set GardeS 1 } } if {[regexp "right$" $FlatSide]} { set PerY 0 } lappend Trace [expr $sX+$w*$PerX] lappend Trace [expr $sY+$w*$PerY] lappend Trace [expr $mX+$w*$PerX] lappend Trace [expr $mY+$w*$PerY] lappend Trace [expr $mX+$f*$PerX] lappend Trace [expr $mY+$f*$PerY] lappend Trace $FinX lappend Trace $FinY set PerY $MemoPerY if {[regexp "left$" $FlatSide]} { set PerY 0 } lappend Trace [expr $mX-$f*$PerX] lappend Trace [expr $mY-$f*$PerY] lappend Trace [expr $mX-$w*$PerX] lappend Trace [expr $mY-$w*$PerY] set f [expr $fStart] set w [expr -$w] set mX [expr $DebX-$f*$AxeX] set mY [expr $DebY-$f*$AxeY] if { ! $GardeS} { set sX [expr ($DebX+$FinX)/2] set sY [expr ($DebY+$FinY)/2] if {[expr ($DebX-$sX)*($DebX-$sX)+($DebY-$sY)*($DebY-$sY)] < \ [expr ($DebX-$mX)*($DebX-$mX)+($DebY-$mY)*($DebY-$mY)]} { set sX $mX set sY $mY } } set PerY $MemoPerY if {[regexp "^left" $FlatSide]} { set PerY 0 } lappend Trace [expr $sX+$w*$PerX] lappend Trace [expr $sY+$w*$PerY] lappend Trace [expr $mX+$w*$PerX] lappend Trace [expr $mY+$w*$PerY] lappend Trace [expr $mX+$f*$PerX] lappend Trace [expr $mY+$f*$PerY] lappend Trace $DebX lappend Trace $DebY set PerY $MemoPerY if {[regexp "^right" $FlatSide]} { set PerY 0 } lappend Trace [expr $mX-$f*$PerX] lappend Trace [expr $mY-$f*$PerY] lappend Trace [expr $mX-$w*$PerX] lappend Trace [expr $mY-$w*$PerY] lappend Trace [lindex $Trace 0] lappend Trace [lindex $Trace 1] return [eval $K create polygon $Trace \ -width $OutLineWidth -fill $Fill -outline $OutLine] } proc TestUnCanva {} { set K [UnCanva 600 400 300 200] $K configure -background red $K create rectangle 100 100 200 250 -fill green set G [Graphe {10 20}] $G configure -background red return $K } proc UnCanva {{LargeurMaxi ""} {HauteurMaxi ""} {LargeurVoulue ""} {HauteurVoulue ""} {GonfleAussiY ""} {Titre ""} {AvecMainLevee ""} } { if {$LargeurVoulue==""} { set LargeurVoulue 512 } if {$HauteurVoulue==""} { set HauteurVoulue [expr ($LargeurVoulue*3)/4] } if {$LargeurMaxi==""} { set LargeurMaxi 512 } if {$HauteurMaxi==""} { set HauteurMaxi [expr ($LargeurMaxi*3)/4] } if {$GonfleAussiY==""} { set GonfleAussiY "GonfleAussiY" } Espionne "$LargeurMaxi $HauteurMaxi $LargeurVoulue $HauteurVoulue" global ScrollRectangleOriginal IdScrollRectangle global CouleurDuFondDeUnCanva if { ! [info exists CouleurDuFondDeUnCanva]} { set CouleurDuFondDeUnCanva "white" } if {[regexp "MainLevee" $AvecMainLevee]} { set AvecMainLevee 1 } else { set AvecMainLevee 0 } if {$GonfleAussiY=="NoY"} { set GonfleY 1.0 set DegonfleY 1.0 } else { set GonfleY "gonfle" set DegonfleY "degonfle" } set w [NomDe canva] if {$Titre==""} { set Titre $w } catch {destroy $w} toplevel $w wm title $w $Titre wm iconname $w $Titre set CanvaScroMinX 0 set CanvaScroMinY 0 set CanvaScroMaxX $LargeurMaxi set CanvaScroMaxY $HauteurMaxi set K $w.canvas set ScroHor $w.hscroll set ScroVer $w.vscroll set KShSv $w.grid set Boutons $w.buttons frame $Boutons pack $Boutons -side bottom -fill x -pady 2m button $Boutons.dismiss -text "Dismiss" -background "red" -command "destroy $w" bind $Boutons.dismiss "MainLeveeSurUnCanva $K" bind $Boutons.dismiss "FaireLire \[$KShSv configure\]" pack $Boutons.dismiss -side left -expand 1 button $Boutons.postscript -text "Zoom/UnZoom/Reset\nPNG/Postscript/Print\nFull PNG/Postscript/Print" -background "yellow" if { ! [string equal -nocase "NoZoom" $GonfleAussiY]} { bind $Boutons.postscript <1> "Gonfle $w all gonfle $GonfleY" bind $Boutons.postscript <2> "Gonfle $w all degonfle $DegonfleY" bind $Boutons.postscript <3> "Gonfle $w all reset reset" } bind $Boutons.postscript "CanvaEnPNG $K Visible" bind $Boutons.postscript "CanvaEnPostscript $K Visible AskForFile" bind $Boutons.postscript "CanvaEnImpression $K Visible" bind $Boutons.postscript "CanvaEnPNG $K OnVeutTout" bind $Boutons.postscript "CanvaEnPostscript $K OnVeutTout AskForFile" bind $Boutons.postscript "CanvaEnImpression $K OnVeutTout" pack $Boutons.postscript -side left -expand 1 button $Boutons.jpg -text "Create Jpg file" -background "yellow" bind $Boutons.jpg <1> "CanvaEnJpg $K \[FichierPourSaveAs\]" pack $Boutons.jpg -side left -expand 1 frame $KShSv scrollbar $ScroHor -orient horiz -command "$K xview" scrollbar $ScroVer -command "$K yview" canvas $K \ -width $LargeurVoulue \ -height $HauteurVoulue Espionne "$LargeurVoulue $HauteurVoulue" $K configure \ -scrollregion [list $CanvaScroMinX $CanvaScroMinY $CanvaScroMaxX $CanvaScroMaxY] \ -xscrollcommand "$ScroHor set" \ -yscrollcommand "$ScroVer set" \ -background $CouleurDuFondDeUnCanva set IdScrollRectangle($K) [$K create rect $CanvaScroMinX $CanvaScroMinY $CanvaScroMaxX $CanvaScroMaxY \ -tags [list "Cadre"] -outline $CouleurDuFondDeUnCanva] set ScrollRectangleOriginal($K) "[$K coords [set IdScrollRectangle($K)]]" grid rowconfig $KShSv 0 -weight 1 -minsize 0 grid columnconfig $KShSv 0 -weight 1 -minsize 0 grid $K -in $KShSv -padx 1 -pady 1 -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky nsew grid $ScroVer -in $KShSv -padx 1 -pady 1 -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky nsew grid $ScroHor -in $KShSv -padx 1 -pady 1 -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky nsew pack $KShSv -expand yes -fill both -padx 1 -pady 1 if {$AvecMainLevee} { MainLeveeSurUnCanva $K } return $K } proc Gonfle {w Tag {ScaleX "gonfle"} {ScaleY 1.0}} { global ScaleCumuleDeGonfle OrigXCumuleDeGonfle OrigYCumuleDeGonfle global ScrollRectangleOriginal IdScrollRectangle Gs "UpdateK" if {[regexp "rond" $w]} { FaireLire "Sorry, the Zoom doesn't work for Rosace." return } set K $w.canvas set ScroHor $w.hscroll set ScroVer $w.vscroll scan "[$ScroHor get]" "%f %f" g d scan "[$ScroVer get]" "%f %f" b h set RatioHor [expr ($g + $d)/2] set RatioVer [expr ($b + $h)/2] scan [$K cget -scrollregion] "%f %f %f %f" xMin yMin xMax yMax set CentreHor [expr $xMin + $RatioHor*($xMax-$xMin)] set CentreVer [expr $yMin + $RatioVer*($yMax-$yMin)] if {[regexp "expo" $K]} { set CentreHor 0 set CentreVer 0 } if {[PourWscope]} { set ScaleGonfle 2.0 } else { set ScaleGonfle 1.1 } if { $ScaleY == "gonfle" } { set Scaley $ScaleGonfle } if { $ScaleY == "degonfle" } { set Scaley [expr 1./$ScaleGonfle] } if { $ScaleX == "gonfle" } { set Scalex $ScaleGonfle set Scaley 1.0 } else { set Scalex $ScaleX set Scaley 1.0 } if { $ScaleX == "degonfle" } { set Scalex [expr 1./$ScaleGonfle] set Scaley 1.0 } if { $ScaleY != "1.0"} { set Scaley $ScaleY } if { $ScaleY == "gonfle" } { set Scaley $ScaleGonfle } if { $ScaleY == "degonfle" } { set Scaley [expr 1./$ScaleGonfle] } if { $ScaleX == "reset" } { scan [$K coords [set IdScrollRectangle($K)]] "%f %f %f %f" xMin yMin xMax yMax scan [set ScrollRectangleOriginal($K)] "%f %f %f %f" xMinO yMinO xMaxO yMaxO set Scalex [expr ($xMaxO-$xMinO)*1.0/($xMax-$xMin)] set Scaley [expr ($yMaxO-$yMinO)*1.0/($yMax-$yMin)] } $K scale $Tag $CentreHor $CentreVer $Scalex $Scaley $K configure -scrollregion [$K coords [set IdScrollRectangle($K)]] return $K } proc ListeSansDoublon {Liste {NoCase ""} {NoEmpty ""}} { set NoEmpty [string equal -nocase $NoEmpty "NoEmpty"] set NoCase [string equal -nocase $NoCase "NoCase"] set SansDoublon {} set I -1 foreach Element $Liste { if {$NoEmpty && [string trim $Element]==""} { continue } set ELEMENT $Element if {$NoCase} { set ELEMENT [string toupper $Element] } if { [info exists DejaVu($ELEMENT)] } { set Ancien $DejaVu($ELEMENT) if {[regexp {[a-z]} $Element]} { set SansDoublon [lreplace $SansDoublon $Ancien $Ancien $Element] } continue } set DejaVu($ELEMENT) [incr I] lappend SansDoublon $Element } return $SansDoublon } proc QuiJAppelRecursif Procedure { global DejaVuCetteProcedure global Tabulation if { ! [info exists Tabulation]} { set Tabulation "" } set LesAppelees [QuiJAppel $Procedure "LaListeMerci"] if {$LesAppelees == {}} { return } foreach Appelee $LesAppelees { if {[info exists DejaVuCetteProcedure($Appelee)]} { continue } Espionne "$Tabulation $Appelee" set DejaVuCetteProcedure($Appelee) 1 set Tabulation "$Tabulation " QuiJAppelRecursif $Appelee set Tabulation [string range $Tabulation 4 end] } } proc TestNousAllonsAuBoulot {} { Espionne on demarre en [pwd] OnRevientDuBoulot ; #si on n'y était pas ca marche quand meme Espionne [pwd] NousAllonsAuBoulot /home/ripp Espionne 1 [pwd] NousAllonsAuBoulot /genomics Espionne 22 [pwd] OnRevientDuBoulot Espionne 1 [pwd] NousAllonsAuBoulot Espionne 22 [pwd] NousAllonsAuBoulot /usr/local Espionne 333 [pwd] OnRevientDuBoulot Espionne 22 [pwd] OnRevientDuBoulot Espionne 1 [pwd] OnRevientDuBoulot Espionne [pwd] } proc OnRevientDuBoulot {} { return [NousAllonsAuBoulot "DepileRep"] } proc NousAllonsAuBoulot {{RepTrav ""}} { global MemorisePWD #rR depuis 20200120 j'empile les pwd et j'ai mis DepileRep ici if {$RepTrav==""} { set RepTrav [RepertoireDeTravail] } if { ! [info exists MemorisePWD]} { set MemorisePWD {} } if {$RepTrav=="DepileRep"} { set RepPrecedent [lindex $MemorisePWD end] set MemorisePWD [lrange $MemorisePWD 0 end-1] if {$RepPrecedent!=""} { cd $RepPrecedent } return $RepPrecedent } #rR il se peut qu'il n'y ait pas de wd if {[catch {set PWD [pwd]}]} { set PWD $RepTrav } lappend MemorisePWD $PWD cd $RepTrav return $RepTrav } proc RetourneLaListe Liste { #lM change le 18/05/2009 #lM utilise lreverse (tcl 8.5) return [lreverse $Liste] if {[llength $Liste] < 2} { return $Liste } set X [lindex $Liste 0] set ResteRetourne [RetourneLaListe [lrange $Liste 1 end]] return [lappend ResteRetourne $X] } proc ButineEtAjoute Texte { set NouveauTexte [ContenuDuFichier [ButineArborescence All]] if { $NouveauTexte != "" } { $Texte insert end $NouveauTexte } } proc ButineEtRemplace Texte { set NouveauTexte [ContenuDuFichier [ButineArborescence All]] if { $NouveauTexte != "" } { $Texte delete 0.0 end $Texte insert end $NouveauTexte } } proc ButineArborescence {{Type ""} {RepertoireEtFichier ""}} { global RepertoireInitialDeButine global FichierInitialDeButine if {$Type==""} { set Type "All" } global OuiOuNonToujoursParDefaut if {[info exists OuiOuNonToujoursParDefaut] && $OuiOuNonToujoursParDefaut} { if {[file exists $RepertoireEtFichier]} { return $RepertoireEtFichier } } if {[regexp {/$} $RepertoireEtFichier]} { regsub {/$} $RepertoireEtFichier "" Rep set Fic "" } else { set Rep [file dirname $RepertoireEtFichier] set Fic [file tail $RepertoireEtFichier] } if {$Rep!=""} { set RepertoireInitialDeButine $Rep } if {$Fic!=""} { set FichierInitialDeButine $Fic } if { ! [info exists RepertoireInitialDeButine]} { set RepertoireInitialDeButine [pwd] } if { ! [info exists FichierInitialDeButine]} { set FichierInitialDeButine "" } set Types(All) { {{All files} * } } set Types(MSF) { {{Alignment output} {.msf}} {{All files} * } } set Types(Blastp) { {{Blast output} {.blastp}} {{All files} * } } set Types(FOF) { {{File Of Filenames} {.fof}} {{All files} * } } set Types(ps) { {{Postcript file} {.ps}} {{All files} * } } set Types(Sequence) { {{All files} * } {{Raw} {.seq}} {{Fasta} {.tfa}} {{GCG} {.ged}} } set NomDeFichier [tk_getOpenFile -title "Fichier a ouvrir" \ -initialdir $RepertoireInitialDeButine \ -initialfile $FichierInitialDeButine \ -defaultextension "" \ -filetypes $Types($Type)] if { $NomDeFichier == "" } { return ""} set RepertoireInitialDeButine [file dirname $NomDeFichier] return $NomDeFichier } proc JunkDir {{JunkDir ""}} { return [RepertoireDeTravail $JunkDir] } proc RepertoireDeTravail {{JunkDir ""}} { global RepertoireDeTravail global env if {[info exists RepertoireDeTravail]} { return $RepertoireDeTravail } if {$JunkDir == ""} { if {[PourWscope]} { set JunkDir "[HomeRipp]/junkdir" } else { if {[info exists env(HOME)]} { set JunkDir "$env(HOME)/junkdir" } else { #rR set JunkDir "/tmp/tmp[pid]" set JunkDir "[HomeRipp]/junkdir" } } } if {[file isdirectory $JunkDir]} { set RepertoireDeTravail $JunkDir return $RepertoireDeTravail } #rR on ne pose plus la question !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2021/03/12 if { 1 || [OuiOuNon "Can I create a Working directory\n$JunkDir\n ?"]} { File mkdir $JunkDir set RepertoireDeTravail $JunkDir return $RepertoireDeTravail } if {[OuiOuNon "Do You want to choose an other Working directory ?"]} { set AutreJunkDir [Entre [pwd]] } else { set AutreJunkDir "" } set RepertoireDeTravail [RepertoireDeTravail $AutreJunkDir] return $RepertoireDeTravail } proc CanvaEnImpression {K CeQuOnVeut} { set NomDuFichierPS [CanvaEnPostscript $K $CeQuOnVeut "[RepertoireDeTravail]/tmp[NomDe ""].ps"] if {$NomDuFichierPS==""} { return } return [ImprimeLeFichier $NomDuFichierPS] } proc CanvaEnPostscript {K {CeQuOnVeut "Visible"} {QuoiRetourner "RetourOrdres"} {Anchor "center"}} { Gs "File" if { $QuoiRetourner == "AskForFile" || $QuoiRetourner=="" } { set NomDuFichierPS [FichierPourSaveAs] if {$NomDuFichierPS==""} { return "" } } else { set NomDuFichierPS $QuoiRetourner } set Largeur [lindex [$K configure -width] 4] set Hauteur [lindex [$K configure -height] 4] set PortraitOuLandscape [expr $Largeur > $Hauteur] if {[regexp "rond" $K]} { set OptionWH "-width 768 -x 0" } else { if {$CeQuOnVeut=="Visible"} { set OptionWH "" } else { # scan [lindex [$K configure -scrollregion] 4] "%f %f %f %f" minX minY maxX maxY scan [$K bbox all] "%d %d %d %d" minX minY maxX maxY set OptionWH "-width $maxX -height $maxY" } } if {$QuoiRetourner=="RetourOrdres"} { set Retour [eval $K postscript $OptionWH -rotate $PortraitOuLandscape] } else { eval $K postscript -file $NomDuFichierPS $OptionWH -rotate $PortraitOuLandscape set Retour $NomDuFichierPS } return $Retour } proc CanvaEnPostscriptPourGif {K {CeQuOnVeut "Visible"}} { return [CanvaEnPostscript $K $CeQuOnVeut "RetourOrdres"] } proc OldCanvaEnPostscriptPourGif {K {CeQuOnVeut "Visible"}} { set Largeur [lindex [$K configure -width] 4] set Hauteur [lindex [$K configure -height] 4] set PortraitOuLandscape [expr $Largeur > $Hauteur] set lePostscript "" if {[regexp "rond" $K]} { set lePostscript [$K postscript -width 768 -x 0 -rotate $PortraitOuLandscape] } else { if {$CeQuOnVeut=="Visible"} { set lePostscript [$K postscript -rotate $PortraitOuLandscape] } else { Espionne [$K configure -scrollregion] scan [lindex [$K configure -scrollregion] 4] "%f %f %f %f" minX minY maxX maxY Espionne "$minX $minY $maxX $maxY" set lePostscript [$K postscript -width $maxX -height $maxY -rotate $PortraitOuLandscape] } } return $lePostscript } proc OldCanvaEnGIF {K {CeQuOnVeut ""} {NomDuFichierGIF ""}} { if {$NomDuFichierGIF==""} { set NomDuFichierGIF [FichierPourSaveAs] } if {$NomDuFichierGIF==""} { return "" } Wup "On cree un fichier avec les ordres du canva K" return [CreeLesOrdresPourGIF $K $CeQuOnVeut $NomDuFichierGIF] } proc CanvaEnGIF {K {CeQuOnVeut ""} {NomDuFichierGIF ""}} { Gs "File" if {$NomDuFichierGIF=="" || $NomDuFichierGIF=="AskForFile"} { set NomDuFichierGIF [FichierPourSaveAs] } if {$NomDuFichierGIF==""} { return "" } Wup "On cree un fichier avec les ordres du canva K" set lePostscript [CanvaEnPostscript $K $CeQuOnVeut "RetourOrdres" "w"] Sauve $lePostscript dans lePostscript.ps image create photo laPhoto -data $lePostscript -format [list postscript "-zoom 5 5"] laPhoto write $NomDuFichierGIF -format gif return $NomDuFichierGIF } proc CanvaEnJpg {K {NomDuFichierJpg ""}} { Gs "File" package require Img if {$NomDuFichierJpg=="" || $NomDuFichierJpg=="AskForFile"} { set NomDuFichierJpg [FichierPourSaveAs] } if {$NomDuFichierJpg==""} { return "" } set IdImage [image create photo -format window -data $K] $IdImage write $NomDuFichierJpg -format jpeg return $NomDuFichierJpg } proc CanvaEnPNG {K {CeQuOnVeut ""} {NomDuFichierPNG ""}} { Gs "File" #rR on prend le PrintCanvas de Luc if {$CeQuOnVeut=="OnVeutTout"} { package require Img return [PrintCanvasFromLuc $K "" $NomDuFichierPNG] } Wup "Ca merde un peu ... refaire ce qu'il y a dans CanvaEnJpg. Ici il cree toujours une page A4 ..." if {$NomDuFichierPNG=="" || $NomDuFichierPNG=="AskForFile"} { set NomDuFichierPNG [FichierPourSaveAs] } if {$NomDuFichierPNG==""} { return "" } Wup "On cree un fichier avec les ordres du canva K" # set lePostscript [CanvaEnPostscript $K $CeQuOnVeut "RetourOrdres" "w"] set lePostscript [$K postscript] Sauve $lePostscript dans $NomDuFichierPNG.ps if {1} { exec gs -sDEVICE=png256 -sOutputFile=$NomDuFichierPNG -q -dNOPAUSE -dBATCH $NomDuFichierPNG.ps # set PR [image create photo -file $NomDuFichierPNG] # $K create image 400 400 -image $PR return } laPhoto write $NomDuFichierPNG -format gif return $NomDuFichierGIF } proc PrintCanvasFromLuc {canvas {format ""} {imageFile ""}} { if {$format eq ""} { set format "png" } if {$imageFile eq ""} { set imageFile [DemandeEtSauveFichier $format] if {$imageFile eq ""} {return} } update idletasks after 500 ## Ensure that the window is on top of everything ## else, so as not to get white ranges ## in the image, due to overlapped portions ## of the window with ## other windows... raise [winfo toplevel $canvas] update set border [expr {[$canvas cget -borderwidth]+[$canvas cget -highlightthickness]}] set view_height [expr {[winfo height $canvas]-2*$border}] set view_width [expr {[winfo width $canvas]-2*$border}] lassign [$canvas bbox all] x1 y1 x2 y2 set x1 [expr {int($x1-10)}] set y1 [expr {int($y1-10)}] set x2 [expr {int($x2+10)}] set y2 [expr {int($y2+10)}] set width [expr {$x2-$x1}] set height [expr {$y2-$y1}] set image [image create photo \ -height $height -width $width] ## Arrange the scrollregion of the canvas ## to get the whole window visible, ## so as to grab it into an image... set scrollregion [$canvas cget -scrollregion] set xscrollcommand [$canvas cget -xscrollcommand] set yscrollcommand [$canvas cget -yscrollcommand] $canvas configure -xscrollcommand {} $canvas configure -yscrollcommand {} set grabbed_x $x1 set grabbed_y $y1 set image_x 0 set image_y 0 while {$grabbed_y < $y2} { while {$grabbed_x < $x2} { $canvas configure -scrollregion [list $grabbed_x $grabbed_y \ [expr {$grabbed_x+$view_width}] [expr {$grabbed_y+$view_height}]] update ## Take a screenshot of the visible canvas part... # image create photo ${image}_tmp -format window -data $canvas image create photo ${image}_tmp -data $canvas ## Copy the screenshot to the target image... $image copy ${image}_tmp \ -to $image_x $image_y -from $border $border incr grabbed_x $view_width incr image_x $view_width image delete ${image}_tmp } set grabbed_x $x1 set image_x 0 incr grabbed_y $view_height incr image_y $view_height } $canvas configure -scrollregion $scrollregion $canvas configure -xscrollcommand $xscrollcommand $canvas configure -yscrollcommand $yscrollcommand $image write $imageFile -format $format return $image } proc Photo {} { set K [GscopeBoard coucou] set lePostscript [CanvaEnPostscript $K "Visible" "RetourOrdres"] Espionne $lePostscript image create photo laPhoto -data $lePostscript -format postscript laPhoto write toto.gif -format gif exit } proc OuiOuNonMemo {Message {ReponseParDefaut ""} {Value 1}} { global OuiOuNonMemo if {$Message=="UnsetAllPlease"} { if {[info exists OuiOuNonMemo]} { unset OuiOuNonMemo } return 1 } if {$ReponseParDefaut=="SetItPleaseTo"} { if {[info exists OuiOuNonMemo($Message)]} { set OldRep [set OuiOuNonMemo($Message)] } else { set OldRep -1 } set OuiOuNonMemo($Message) $Value return $OldRep } if {$ReponseParDefaut=="UnsetItPlease"} { if { ! [info exists OuiOuNonMemo($Message)]} { return -1 } set OldRep [set OuiOuNonMemo($Message)] unset OuiOuNonMemo($Message) return $OldRep } if {[info exists OuiOuNonMemo($Message)]} { return [set OuiOuNonMemo($Message)] } set Reponse [OuiOuNon $Message $ReponseParDefaut] set OuiOuNonMemo($Message) $Reponse return $Reponse } proc OuiOuNonTempo {Message {ReponseParDefaut ""} {Tempo ""}} { global OuiOuNonToujoursParDefaut Gs "Rien" if {$ReponseParDefaut==""} { set ReponseParDefaut 1 } if {$ReponseParDefaut} { set IndexReponse 0 } else { set IndexReponse 1 } if {[info exists OuiOuNonToujoursParDefaut] && $OuiOuNonToujoursParDefaut} { return $ReponseParDefaut } set Demandeur "" catch {set Demandeur [PreFixe]} if {$Demandeur!=""} { set Demandeur "(for $Demandeur)" } set R [AfficheVariable "$Demandeur ... please answer within 10 seconds.\n$Message" AvecRetour OuiOuNonTempo] if {$R==2} { set L [info level] set CalledBy "" for {set L [info level]} {$L>0} {incr L -1} { lappend LeTexte "$CalledBy [info level $L]" set CalledBy "called by " } FaireLire [join $LeTexte "\n"] set Reponse [OuiOuNon $Message $ReponseParDefaut] } else { set Reponse [expr 1-$R] } destroy .ouiounon return $Reponse } proc TestOuiOuNon {} { set R [OuiOuNon "Je pose une question"] foreach I [NombresEntre 0 1000000] { Espionne $I } exit } proc OuiOuNon {Message {ReponseParDefaut ""} {Force ""}} { global OuiOuNonToujoursParDefaut Gs "Rien" set Force [regexp -nocase "1|Force" $Force] if {$ReponseParDefaut==""} { set ReponseParDefaut 1 } if {$ReponseParDefaut} { set IndexReponse 0 } else { set IndexReponse 1 } if { ! $Force && [info exists OuiOuNonToujoursParDefaut] && $OuiOuNonToujoursParDefaut} { return $ReponseParDefaut } set Demandeur "" catch {set Demandeur [PreFixe]} if {$Demandeur!=""} { set Demandeur "(for $Demandeur)" } package require Tk after idle {.ouiounon.msg configure -wraplength 10i -foreground white -background red} set R [tk_dialog .ouiounon "$Demandeur Please press Yes or No" "$Message" {} $IndexReponse "Yes" "No" "?"] if {$R==2} { set L [info level] set CalledBy "" for {set L [info level]} {$L>=0} {incr L -1} { lappend LeTexte "$CalledBy [info level $L]" set CalledBy "called by " } FaireLire [join $LeTexte "\n"] set Reponse [OuiOuNon $Message $ReponseParDefaut $Force] } else { set Reponse [expr 1-$R] } destroy .ouiounon update idletasks return $Reponse } proc TestWarne {} { global WarneEnPuts set WarneEnPuts 0 set WarneEnPuts 0 Warne salut Warne "Comment ca va ?" } proc Warne Texte { global WarneWindow global WarneEnPuts global WarneNon if {[info exists WarneNon] && $WarneNon} { return "" } if { ! [info exists WarneEnPuts]} { set WarneEnPuts 1 } if { [info exists WarneEnPuts] && $WarneEnPuts } { puts $Texte return $Texte } # return "" Wup "La suite est a revoir si Warne dans fenetre" if { ! [info exists WarneWindow] || ! [winfo exists $WarneWindow]} { set WarneWindow [AfficheVariable "Warnings..." "" "Warnings"] wm iconify $WarneWindow } $WarneWindow.frame.list insert end $Texte $WarneWindow.frame.list yview end update return $WarneWindow } proc Patience Commande { set w [NomDe fenetre] toplevel $w wm title $w "Patience ..." wm iconname $w "Patience ..." label $w.msg -text "$Commande \n Ca bosse ... Il faut attendre. " pack $w.msg update return $w } proc JeMeSignale {{Etat ""}} { global FenetreDePatience NiveauFenetreDePatience global JeMeSignaleInactif set Commande "\[[info level -1]\]" if { $Etat == "Get" } { return $Commande } set CommandeComplete "$Commande $Etat" if { $Etat == "GetAll" } { return $CommandeComplete } if { [info exists JeMeSignaleInactif] && $JeMeSignaleInactif } { return } if { ! [info exists NiveauFenetreDePatience] } { set NiveauFenetreDePatience 0 } Warne $CommandeComplete set Commande [lindex [split $CommandeComplete " "] 0] if { $Etat == "Patience" } { incr NiveauFenetreDePatience set FenetreDePatience($NiveauFenetreDePatience) [Patience $Commande] return [set FenetreDePatience($NiveauFenetreDePatience)] } if { $Etat == "FinPatience" } { Warne [set FenetreDePatience($NiveauFenetreDePatience)] destroy [set FenetreDePatience($NiveauFenetreDePatience)] incr NiveauFenetreDePatience -1 update return "" } return "" } proc TriDeFichiers {A B} { set DA [file dirname $A] set DB [file dirname $B] if {$DA<$DB} { return -1 } if {$DA>$DB} { return 1 } return [string compare [file tail $A] [file tail $B]] } proc ReSource {{Fichier ""}} { global ReSource if {$Fichier=="Precedent"} { if {[info exists ReSource]} { set Fichier $ReSource } else { set Fichier "" } } if {$Fichier==""} { set LesSourcesTcl {} foreach F [lsort -command TriDeFichiers [LesSourcesDuProgramme "Absolute"]] { if { ! [regexp ".tcl$" $F]} { continue } lappend LesSourcesTcl $F } set Fichier [ChoixParmi $LesSourcesTcl] if {$Fichier==""} { set ReSource "" ; return "" } } if {[FileAbsent $Fichier] && [FileExists [set Possible "[ProgSourceDir]/$Fichier"]]} { set Fichier $Possible } if {[FileAbsent $Fichier] && [FileExists [set Possible "[ProgSourceDir]/$Fichier.tcl"]]} { set Fichier $Possible } if {[FileAbsent $Fichier] && [FileExists [set Possible "[ProgSourceDir]/gscope_$Fichier.tcl"]]} { set Fichier $Possible } if {[FileAbsent $Fichier]} { FaireLire "$Fichier doesn't exist" set ReSource "" return "" } set ReSource $Fichier source $Fichier return $Fichier } proc DemandeEtExecute {{Commande ""}} { global RepertoireDuGenome global GscopeDir FaireLire "Please write your instructions on the interactiv terminal window. To finish type 'return'." set Commande "" while {1} { puts -nonewline stdout "Gscope_: " flush stdout set Ligne [gets stdin] if {$Commande==""} { set Commande $Ligne } else { append Commande "\n$Ligne" } if {[info complete $Commande]} { if {[regexp {^ *(return|stop) *$} $Commande]} { puts "Thanks for discussion. I close interaction. Bye bye !" return } if {[catch {eval $Commande} Message]} { puts $Message } set Commande "" } } } proc CompleteEtExecute Commande { regsub { +\{ *$} $Commande "" Commande Espionne ">$Commande<" if {[regexp -nocase {[a-z0-9_]+ +\{\}} $Commande]} { scan $Commande "%s" Complete } else { set Complete [Entre $Commande] } if {$Complete==""} { return "" } return [Execute $Complete] } proc Execute Commande { return [eval $Commande] } proc Entre {{Defo ""}} { global RetourEntre global EntreToujoursDefaut if {[info exists EntreToujoursDefaut] && $EntreToujoursDefaut} { return $Defo } set w [NomDe fenetre] toplevel $w wm title $w "To validate or " wm iconname $w "" wm geometry $w +300+300 entry $w.e -width 80 -borderwidth 10 -background red -foreground white -font {Courier 14} if { $Defo != "" } { $w.e insert 0 $Defo } pack $w.e -expand 1 -fill x focus $w.e bind $w.e "set RetourEntre($w) \[$w.e get\]" bind $w.e "set RetourEntre($w) \[$w.e get\]" tkwait variable RetourEntre($w) destroy $w set Retour [set RetourEntre($w)] unset RetourEntre($w) return $Retour } proc EditeEtCreeFichier {{Fichier ""} {Defo ""} {Ask ""}} { set Texte [EntreTexte $Defo] if {$Texte==""} { return "" } if {$Texte=="\n"} { if {[OuiOuNon "Do I cancel EditeEtCreeFichier ?"]} { return "" } if {[OuiOuNon "Do I save as an empty string (without \\n) ?"]} { set Texte "" } } if {$Fichier=="" || $Ask!=""} { set Fichier [FichierPourSaveAs $Fichier] } if {$Fichier==""} { return "" } return [Sauve $Texte dans $Fichier] } proc LocaText {t {Action ""}} { global LocaText if {$Action==""} { set Action "Next" } if {$Action=="Top"} { if { ! [info exists LocaText($t,Start)]} { unset LocaText($t,Start) } set Action "Next" } if {$Action=="New"} { if {[info exists LocaText($t,Text)]} { unset LocaText($t,Text) } if { ! [info exists LocaText($t,Start)]} { unset LocaText($t,Start) } } if { ! [info exists LocaText($t,Text)]} { set Texte [Entre] set LocaText($t,Text) $Texte } if { ! [info exists LocaText($t,Start)]} { set LocaText($t,Start) 1.0 } set Index [$t search $LocaText($t,Text) $LocaText($t,Start)] if {$Index == ""} { return "" } set Fin [expr $Index + 0.[string length $LocaText($t,Text)]] $t tag configure Spot -background red $t tag remove Spot 1.0 end $t tag add Spot $Index $Fin set LocaText($t,Start) [expr $Index + 0.1] return $Index } proc EntreTexte {{Defo ""} {BoutonsEnPlus ""} {FichierOriginePourInforme ""}} { global RetourEntreTexte global FenetreInfoOuverte global PolicePourEntreTexte if {[PourWscope]} { set Maniere $BoutonsEnPlus return [AfficheVariable $Defo $Maniere $FichierOriginePourInforme] } set w [NomDe fenetre] toplevel $w wm title $w "You can edit this text ... " wm iconname $w "Edit" set LesLignesDuTexte [split $Defo "\n"] set PremiereLigne [lindex $LesLignesDuTexte 0] if {[regexp {^Nom\: } $PremiereLigne]} { scan $PremiereLigne "%s %s" Bidon Nom set FenetreInfoOuverte($Nom) $w } set Hauteur [Maxi 10 [Mini 30 [llength $LesLignesDuTexte]]] set Largeur 80 foreach Ligne $LesLignesDuTexte { set Largeur [Maxi $Largeur [string length $Ligne]] } set Largeur [Mini $Largeur 180] set Police 12 if {[info exists PolicePourEntretexte]} { set Police $PolicePourEntreTexte } text $w.text -wrap none -relief sunken -bd 2 \ -font [list Courier $Police] \ -xscrollcommand "$w.xscroll set" \ -yscrollcommand "$w.yscroll set" \ -background "lightgreen" \ -width $Largeur -height $Hauteur $w.text insert 0.0 $Defo focus $w.text frame $w.buttons pack $w.buttons -side bottom -fill x -pady 2m button $w.buttons.dismiss -background red -text "Dismiss" bind $w.buttons.dismiss <1> "set RetourEntreTexte($w) \"\"" pack $w.buttons.dismiss -side left -expand 1 button $w.buttons.saveas -text "Save All/ Sel." bind $w.buttons.saveas <1> "SaveAs \[$w.text get 1.0 end\]" bind $w.buttons.saveas <2> "SaveAs \[$w.text get sel.first sel.last\]" pack $w.buttons.saveas -side left -expand 1 button $w.buttons.search -text "Next/Top/New" -background yellow -foreground black bind $w.buttons.search <1> "LocaText $w.text Next" bind $w.buttons.search <2> "LocaText $w.text Top" bind $w.buttons.search <3> "LocaText $w.text New" pack $w.buttons.search -side left -expand 1 button $w.buttons.aspect -text "Font" bind $w.buttons.aspect <1> "PolicePourEntreTexte Ask $w" pack $w.buttons.aspect -side left -expand 1 button $w.buttons.browse -text "Replace/Append/Choose\n(with other file)" bind $w.buttons.browse <1> "ButineEtRemplace $w.text" bind $w.buttons.browse <2> "ButineEtAjoute $w.text" bind $w.buttons.browse <3> "ChoisiEtAjouteChampsInfo $w.text" pack $w.buttons.browse -side left -expand 1 button $w.buttons.accept -text "Accept All / Selection" -background green -foreground black bind $w.buttons.accept <1> "set RetourEntreTexte($w) \[$w.text get 1.0 end\]" bind $w.buttons.accept <2> "set RetourEntreTexte($w) \[$w.text get sel.first sel.last\]" pack $w.buttons.accept -side left -expand 1 if {$BoutonsEnPlus!=""} { set I 0 foreach {T C} $BoutonsEnPlus { incr I button $w.buttons.plus$I -text $T -background orange -foreground black bind $w.buttons.plus$I <1> $C pack $w.buttons.plus$I -side left -expand 1 } } scrollbar $w.xscroll -command "$w.text xview" -orient "horizontal" pack $w.xscroll -side bottom -fill x scrollbar $w.yscroll -command "$w.text yview" pack $w.yscroll -side right -fill y pack $w.text -expand yes -fill both tkwait variable RetourEntreTexte($w) if {[info exists RetourEntreTexte($w)]} { set Retour [set RetourEntreTexte($w)] unset RetourEntreTexte($w) } else { set Retour "" } destroy $w regsub {\n$} $Retour "" Retour return $Retour } proc FaireLire {Message {Force ""} {Affiche "no"}} { global FaireLireNon global FaireLireSurEspionne #lm for debugging purposes if {$Affiche ne "no" || ([info exists FaireLireSurEspionne] && $FaireLireSurEspionne)} { Espionne "\n-------- FaireLire ----------" Espionne "| $Message" Espionne "\n" flush stdout } if {[info commands "PourWscope"]!={} && [info commands "OnTraite"]!={} && \ [PourWscope] && [OnTraite "RetGene"]} { return [AfficheVariable $Message] } set Force [regexp -nocase "1|Force" $Force] if { ! $Force && [info exists FaireLireNon] && $FaireLireNon} { return } if {[string length $Message] > 1500} { set Message "[string range $Message 0 499]\n ... \n ... [string range $Message end-499 end]" } package require Tk #rR 2014/08/13 rajout de NomDe set FL [NomDe faireLire] #lm pour pouvoir changer la fonte if {"FaireLireFonte" ni [font names]} { font create FaireLireFonte -family Helvetica -size 12 } after idle [list $FL.msg configure -wraplength 10i -foreground white -background red -font FaireLireFonte] tk_dialog $FL "Please press OK" "$Message" {} 0 Acknowledge catch {destroy $FL} update } proc BoutonneLaFenetre {Fenetre Texte {Commande ""}} { set NdB [NomDe bouton] if {$Commande==""} { button $Fenetre.buttons$NdB -text $Texte } else { button $Fenetre.buttons$NdB -text $Texte -command $Commande } pack $Fenetre.buttons$NdB -side right -expand 1 return "$Fenetre.buttons$NdB" } proc NomDe Machin { global NumeroDe if { ! [info exists NumeroDe] } {set NumeroDe 0000} incr NumeroDe return ".$Machin$NumeroDe" } proc TestTmpFile {} { set F1 "[TmpFile RRR ~ "" WithDateAndUniqueRoot]_F1" Sauve xxx dans $F1 set F2 "[TmpFile RRR ~ "" WithDateAndUniqueRoot]_F2" Sauve xxx dans $F2 exit } proc TmpFile {{Racine ""} {Rep ""} {Sep ""} {WithDate ""}} { #biotcl tmpFile {} global TmpFileNumber if {[regexp -nocase "Date" $Sep]} { set WithDate $Sep ; set Sep "" } set TestUniqueRoot [regexp -nocase "UniqueRoot" $WithDate] set WithDate [regexp -nocase "WithDate" $WithDate] if {$Rep=="envTEMP"} { global env if {[info exists env(TEMP)]} { set Rep [set env(TEMP)] } else { set Rep "" } } set MemoSep $Sep if {$Sep==""} { set Sep "." } if {[regexp "NoSep" $Sep]} { set Sep "" } if {$Rep==""} { set Rep [RepertoireDeTravail] } regsub -all {/*$} $Rep "" Rep if { ! [info exists TmpFileNumber]} { set TmpFileNumber 0 } if {$Racine==""} { set Racine "tmp" } if {$WithDate} { set Date [Date "Seconds"] set TmpFileName "$Rep/$Racine$Sep$Date" if {$TestUniqueRoot && [glob -nocomplain "$TmpFileName*"]!={}} { after 1000 return [TmpFile $Racine $Rep $MemoSep "WithDateAndUniqueRoot"] } return $TmpFileName } set Pid [pid] incr TmpFileNumber set TmpFileName "$Rep/$Racine$Sep$Pid$Sep$TmpFileNumber" return $TmpFileName } proc Focalise {Fenetre {Action ""}} { global MotFocalise global PositionFocalise if {$Action=="ask"} { if {[info exists MotFocalise]} { unset MotFocalise } } if {$Action=="top"} { set PositionFocalise -1 } if { ! [info exists MotFocalise] } { set MotFocalise [Entre ""] if {$MotFocalise==""} { return } set PositionFocalise -1 } incr PositionFocalise set FenetreListBox $Fenetre.frame.list foreach Ligne [$FenetreListBox get $PositionFocalise end] { if { [regexp -nocase $MotFocalise $Ligne] } { $FenetreListBox yview $PositionFocalise $FenetreListBox selection set $PositionFocalise return } incr PositionFocalise } set PositionFocalise -1 } proc EraseLeCanva {K {ListeDeTags ""} {Demander ""}} { if {$Demander==""} { set Demander 0 } if {$ListeDeTags==""} { set ListeDeTags [list "all"] if {[OuiOuNon "Do I erase ALL widgets ?"]} { set Demander 0 } elseif {[OuiOuNon "Do I ask for each widget ?"]} { set Demander 1 } } set IdCadre [$K find withtag "Cadre"] foreach Tag $ListeDeTags { set LesIds [$K find withtag $Tag] foreach Id $LesIds { if {$Id==$IdCadre} { continue } set Type [$K type $Id] if {$Demander && ! [OuiOuNon "Erase $Type ?"]} { continue } $K delete $Id } } return $K } proc RestaureLeCanva {K {ListeOuFichier {}}} { if {[llength $ListeOuFichier] > 1} { set LesCommandesDeCreation $ListeOuFichier } else { if {[llength $ListeOuFichier] == 1} { set Fichier $ListeOuFichier } else { set Fichier [ButineArborescence] if {$Fichier == ""} { return "" } } set LesCommandesDeCreation [LesLignesDuFichier $Fichier] } foreach CommandeDeCreation $LesCommandesDeCreation { eval $K $CommandeDeCreation } return $K } proc SauveLeCanva {K ListeDeTags {Fichier ""}} { Wup "Retourne le nom du fichier de sauvegarde. String vide si rien n'est sauve." set LesCommandesDeCreation {} foreach Tag $ListeDeTags { set LesIds [$K find withtag $Tag] foreach Id $LesIds { if {[info exists DejaVu($Id)]} { continue } set DejaVu($Id) 1 set CommandeDeCreation "create [$K type $Id] [join [$K coords $Id] " "] " Espionne "[$K itemconfigure $Id]" foreach Option [$K itemconfigure $Id] { set NomDOption [lindex $Option 0] set Valeur [lindex $Option end] if {$Valeur == ""} { set Valeur "\{\}" } if {[regexp " " $Valeur]} { set Valeur "\{$Valeur\}" } append CommandeDeCreation " $NomDOption $Valeur" } lappend LesCommandesDeCreation $CommandeDeCreation } } if {$Fichier != ""} { set Fichier $ListeOuFichier } else { set Fichier [FichierPourSaveAs] if {$Fichier == ""} { return "" } } return [SauveLesLignes $LesCommandesDeCreation dans $Fichier] } proc Mini {a b} { #biotcl mini {} if {$a<$b} { return $a } else { return $b } } proc Maxi {a b} { #biotcl maxi {} if {$a<$b} { return $b } else { return $a } } proc Wup Texte { } proc Gs TypeDeRetour { # Differents types de retour : # Rien # Text # Frame } proc File {Commande args} { Wup "Copyright 1999 Raymond Ripp" Wup "Tcl8.2 accepts much more 'file' commands then earlier versions" Wup " I wrote 'File' to try to run with these old versions" if {[info tclversion] >= 8.2} { return [eval file $Commande $args] } else { set Args $args if {[regexp -nocase "win" $tcl_platform(os)]} { if {[lindex $Args 0]=="-force"} { set Args [lreplace $args 0 0 "/Y"] } switch $Commande { "delete" { set Commande "erase" } } } else { if {[lindex $Args 0]=="-force"} { set Args [lreplace $args 0 0 "-f"] } switch $Commande { "delete" { set Commande "rm" } "rename" { set Commande "mv" } "copy" { set Commande "cp" } } } return [eval exec $Commande $Args] } } proc ComplementString S { #biotcl complementSequence {} regsub -all -- "A" $S "Z" S regsub -all -- "T" $S "A" S regsub -all -- "Z" $S "T" S regsub -all -- "G" $S "Z" S regsub -all -- "C" $S "G" S regsub -all -- "Z" $S "C" S regsub -all -- "a" $S "z" S regsub -all -- "t" $S "a" S regsub -all -- "z" $S "t" S regsub -all -- "g" $S "z" S regsub -all -- "c" $S "g" S regsub -all -- "z" $S "c" S return $S } proc ReverseString S { set Reverse "" for {set i [expr [string length $S]-1]} {$i>=0} {incr i -1} { append Reverse [string range $S $i $i] } return $Reverse } proc PremiereLigneDuFichier Fichier { #biotcl firstLineFromFile {file} if { $Fichier == "" } {return ""} set f [open $Fichier r] if {[gets $f Ligne]<0} { set Ligne "" } close $f return $Ligne } proc DerniereLigneDuFichier Fichier { #biotcl lastLineFromFile {file} return [lindex [LesLignesDuFichier $Fichier] end] } proc LesPremieresLignesDuFichier {Fichier n} { #biotcl fitsLinesFromFile {file n} if { $Fichier == "" } {return {}} if {$n<1} { return {}} set f [open $Fichier r] set LesLignes {} while {[gets $f Ligne]>=0} { lappend LesLignes $Ligne if { ! [incr n -1]} { break } } close $f return $LesLignes } proc IemeLigneDuFichier {Fichier i} { #biotcl lineIFromFile {file i} return [lindex [LesLignesDuFichier $Fichier] [incr i -1]] } proc LesLignesIaJDuFichier {Fichier i j} { #biotcl linesItoJFromFile {file i j} return [lrange [LesLignesDuFichier $Fichier] $i $j] # return [lrange [LesPremieresLignesDuFichier $Fichier $j] [incr i -1] end] } proc CompareLesFloatsEnDebut {TexteA TexteB} { #biotcl compareFloatsAtBegin {} scan $TexteA "%f" a scan $TexteB "%f" b if {[expr double($a) < double($b)]} { return -1} if {[expr double($a) == double($b)]} { return 0} if {[expr double($a) > double($b)]} { return 1} } proc DenicheEtCompareLesIntegersEnDebut {TexteA TexteB} { #biotcl findAndCompareFloatsAtBegin {} regsub -all {[^0-9]} $TexteA " " TexteA regsub -all {[^0-9]} $TexteB " " TexteB return [CompareLesIntegersEnDebut $TexteA $TexteB] } proc CompareLesIntegersEnDebut {TexteA TexteB} { #biotcl compareIntegersAtBegin {} scan $TexteA "%d" a scan $TexteB "%d" b if {[expr $a < $b]} { return -1} if {[expr $a == $b]} { return 0} if {[expr $a > $b]} { return 1} } proc CompareLesFloats {TexteA TexteB} { #biotcl compareFloats {} if { [llength [split [string trim $TexteA] " "]] > 1 } { scan $TexteA "%s %f" A a } else { scan $TexteA "%f" a } if { [llength [split [string trim $TexteB] " "]] > 1 } { scan $TexteB "%s %f" B b } else { scan $TexteB "%f" b } if {[expr double($a) < double($b)]} { return -1} if {[expr double($a) == double($b)]} { return 0} if {[expr double($a) > double($b)]} { return 1} } proc CompareLesIntegers {TexteA TexteB} { #biotcl compareIntegers {} if { [llength [split [string trim $TexteA] " "]] > 1 } { scan $TexteA "%s %f" A a } else { scan $TexteA "%f" a } if { [llength [split [string trim $TexteB] " "]] > 1 } { scan $TexteB "%s %f" B b } else { scan $TexteB "%f" b } if {[expr $a < $b]} { return -1} if {[expr $a == $b]} { return 0} if {[expr $a > $b]} { return 1} } proc CompareSansPremierChamp {TexteA TexteB} { #biotcl compareWithoutFirstField {} set iB [string first " " $TexteA] if {$iB < 0} { set a "" } else { set a [string trimleft [string range $TexteA $iB end]] } set iB [string first " " $TexteB] if {$iB < 0} { set b "" } else { set b [string trimleft [string range $TexteB $iB end]] } return [string compare $a $b] } proc CompareLeDeuxiemeChamp {LigneA LigneB} { #biotcl compareSecondField {} scan $LigneA "%s %f" A a scan $LigneB "%s %f" B b if {[expr $a < $b]} { return -1} if {[expr $a == $b]} { return 0} if {[expr $a > $b]} { return 1} } proc CompareLeTroisiemeChamp {LigneA LigneB} { #biotcl compareThirdField {} scan $LigneA "%s %s %f" A AA a scan $LigneB "%s %s %f" B BB b if {[expr $a < $b]} { return -1} if {[expr $a == $b]} { return 0} if {[expr $a > $b]} { return 1} } proc CompareLesMilieux {LigneA LigneB} { #biotcl compareMiddleFields {} scan $LigneA "%s %d %d" A DA FA scan $LigneB "%s %d %d" B DB FB set a [expr ($DA+$FA)/2] set b [expr ($DB+$FB)/2] if {[expr $a < $b]} { return -1} if {[expr $a == $b]} { return 0} if {[expr $a > $b]} { return 1} } proc EditAndShow {Texte {FichierPourSave ""} {Maniere ""}} { return [AfficheVariable [EntreTexte $Texte] "AvecFormate$Maniere" $FichierPourSave] } proc IntegerEnFin {de Texte} { #biotcl integerAtEnd {of text} return [ValeurEnFin de $Texte "%d"] } proc FloatEnFin {de Texte} { #biotcl floatAtEnd {of text} return [ValeurEnFin de $Texte "%f"] } proc ValeurEnFin {de Texte Format} { #biotcl valueAtEnd {of text format} set BonTexte [string trim $Texte] set iZone [expr [string last " " $BonTexte]+1] scan [string range $BonTexte $iZone end] "$Format" Valeur return $Valeur } proc ValeurApres {Champ dans Texte Format} { #biotcl valueAfter {field in text format} set iZone [string first $Champ $Texte] if {$iZone<0} { return "" } incr iZone [string length $Champ] if { $Format == "ExposantEventuellementMalFoutu" } { set sPN [string trim [string range $Texte $iZone end] " '"] regsub {^[eE]} $sPN "1.0e" sPN scan $sPN "%f" PN if {[catch { expr $PN > 0.001 } ]} { Warne "Oh le vilain $sPN trop petit, je prends 1.0E-200" set PN 1.0E-200 } set Valeur $PN } else { if {$iZone<0} {return ""} set Valeur "" scan [string range $Texte $iZone end] "$Format" Valeur } return $Valeur } proc StringSuivant {Champ dans Texte} { #biotcl stringFollowing {field in text} set i [string first $Champ $Texte] if {$i==-1} { return "" } incr i [string length $Champ] return [string range $Texte $i end] } proc StringApres {Champ dans Texte} { #biotcl stringAfter {field in text} return [ValeurApres $Champ dans $Texte "%s"] } proc IntegerApres {Champ dans Texte} { #biotcl integerAfter {field in text} return [ValeurApres $Champ dans $Texte "%d"] } proc FloatApres {Champ dans Texte} { #biotcl floatAfter {field in text} return [ValeurApres $Champ dans $Texte "%f"] } proc LIndexes {Liste args} { set L {} foreach I $args { lappend L [lindex $Liste $I] } return $L } proc LConcatTest {} { set L {a b c} return [LConcat L {d e f}] } proc LConcat {aListe ListeB} { upvar $aListe Liste if { ! [info exists Liste]} { set Liste {} } set Liste [concat $Liste $ListeB] return $Liste } proc LogWscopeL Liste { return [LogWscope [join $Liste "\n"]] } proc LogWscope Texte { return [Log $Texte "gscopehtmlserver.log" "DoNotMemo"] } proc LogL {{Liste ""} {FichierLog ""}} { return [Log [join $Liste "\n"] $FichierLog] } proc Log {{Texte ""} {FichierLog ""} {DoNotMemo ""}} { global FichierLogMemo if {$FichierLog==""} { if {[info exists FichierLogMemo]} { set FichierLog $FichierLogMemo } else { set FichierLog "gscope.log" } } if { ! [regexp {^/} $FichierLog]} { if {[info proc LogDir]==""} { #rR pour pouvoir être indépendatn de gscope_topographe.tcl set FichierLog "~/$FichierLog" } else { set FichierLog "[LogDir]/$FichierLog" } } if { ! [string equal -nocase $DoNotMemo "DoNotMemo"]} { set FichierLogMemo $FichierLog } return [AppendAuFichier $FichierLog $Texte] } proc EspionneL {{Liste ""}} { Espionne [join $Liste "\n"] } proc EspionneOldVoirPlusBasAvecArgs {{Texte ""}} { global EspionneNon if {$Texte=="SetEspionneNON"} { set EspionneNon 1 } if {$Texte=="SetEspionneOUI"} { set EspionneNon 0 } if {[info exists EspionneNon] && $EspionneNon} { return } puts $Texte return $Texte } proc Espionne {args} { global EspionneNon if {$args=="SetEspionneNON"} { set EspionneNon 1 } if {$args=="SetEspionneOUI"} { set EspionneNon 0 } if {[info exists EspionneNon] && $EspionneNon} { return } if {$args==""} { puts "" } puts [join $args " "] return $args } proc ContenuDuFichier {{Fichier ""}} { #biotcl textFromFile if { $Fichier == "" } {return ""} if {[regexp -nocase {https?\://|ftp\://} $Fichier]} { return [HttpCopy $Fichier] } ;#rR 2014/07/02 if {[regexp {\.gz$} $Fichier]} { return [exec zcat $Fichier] } if {[regexp -nocase {(\.jpg|\.gif|\.png)$} $Fichier]} { set f [open $Fichier r] fconfigure $f -translation binary set Texte [read $f] } else { set f [open $Fichier r] set Texte [read -nonewline $f] } close $f return $Texte } proc LesLignesDuFichier {{Fichier ""}} { #biotcl linesFromFile {file} if { $Fichier == "" } {return {}} if {[regexp -nocase {https?\://|ftp\://} $Fichier]} { return [split [HttpCopy $Fichier] "\n"] } ;#rR 2014/07/02 if {[regexp {\.gz$} $Fichier]} { return [split [exec zcat $Fichier] "\n"] } set LesLignes {} set f [open $Fichier r] while {[gets $f Ligne]>=0} { lappend LesLignes $Ligne } close $f return $LesLignes } proc SauveLesLignes {LesLignes dans Fichier} { #biotcl linesToFile {lines to file} set f [open $Fichier w] foreach Ligne $LesLignes { puts $f $Ligne } close $f file attribute $Fichier -permissions 0664 return $Fichier } proc Sauve {Texte dans Fichier} { #biotcl textToFile {text to file} set f [open $Fichier w] if { $Texte != "" } { puts $f $Texte } close $f if {[file owned $Fichier]} { file attribute $Fichier -permissions 0664 } return $Fichier } proc FichierPourSaveAs {{RepertoireEtFichier ""}} { global RepertoireInitial if {[info exists OuiOuNonToujoursParDefaut] && $OuiOuNonToujoursParDefaut} { if { $RepertoireEtFichier!="" && ! [file isdirectory $RepertoireEtFichier]} { return $RepertoireEtFichier } } if {$RepertoireEtFichier==""} { set RepertoireEtFichier "unnamed" } if {[regexp {/$} $RepertoireEtFichier]} { regsub {/$} $RepertoireEtFichier "" Rep set Fic "" } else { set Rep [file dirname $RepertoireEtFichier] set Fic [file tail $RepertoireEtFichier] } if {$Rep!=""} { set RepertoireInitial $Rep } if {$Fic!=""} { set FichierInitial "$Fic" } if { ! [info exists RepertoireInitial]} { set RepertoireInitial [pwd] } if { ! [info exists FichierInitial]} { set FichierInitial "unnamed"} set Fichier [tk_getSaveFile -title "File to create" \ -initialfile $FichierInitial \ -initialdir $RepertoireInitial] if { $Fichier == "" } { return ""} set RepertoireInitial [file dirname $Fichier] return $Fichier } proc SaveAs {Page {RepertoireEtFichier "unnamed"}} { set Fichier [FichierPourSaveAs $RepertoireEtFichier] if {$Fichier==""} { return "" } return [Sauve $Page dans $Fichier] } proc IntegerToRGB Couleur { #biotcl integerToRGB {} binary scan [binary format "i*" $Couleur] "c1c1c1c1" b g r v set r [expr ( $r + 0x100 ) % 0x100] set g [expr ( $g + 0x100 ) % 0x100] set b [expr ( $b + 0x100 ) % 0x100] return "$r $g $b" } proc RGBToInteger {r g b} { #biotcl rgbToInteger {} binary scan [binary format "c1c1c1c1" $b $g $r 0] "i" Couleur return $Couleur } proc CouleurDuNuancier {Ieme NombreDeCouleurs {UnPeu ""} {Passion ""} {Format ""} {Saturation ""} {Brightness ""}} { #biotcl colorsFromChart {} if {$NombreDeCouleurs<1} { set NombreDeCouleurs 1 } incr Ieme -1 if {$NombreDeCouleurs<2} { set Amour 0 } else { set Amour [expr 1.0*$Ieme/($NombreDeCouleurs-1)] } set Couleur [Nuance $Amour $UnPeu $Passion $Format $Saturation $Brightness] return $Couleur } proc CouleurFormat {rgb Format {InputFormat ""}} { #biotcl colorFormat {} #rR rajoute 2016/01/21 .. ça ne fait pas de mal ;) if {[regexp -nocase {[a-z]} $rgb]} { lassign [FromTkCol $rgb rgb] r g b set r [expr $r*256] set g [expr $g*256] set b [expr $b*256] set rgb [list $r $g $b] } if {$InputFormat=="3x8"} { lassign $rgb r g b set r [expr $r*256] set g [expr $g*256] set b [expr $b*256] set rgb [list $r $g $b] } if {[llength $rgb]==1 && [string length $rgb]>=12} { regsub "#" $rgb "" rgb scan $rgb "%04x%04x%04x" r g b set rgb [list $r $g $b] } elseif {[llength $rgb]==1 && [string length $rgb]>=6} { regsub "#" $rgb "" rgb scan $rgb "%02x%02x%02x" r g b set r [expr $r*256] set g [expr $g*256] set b [expr $b*256] set rgb [list $r $g $b] } lassign $rgb r g b if {$Format=="3x16"} { return "$r $g $b" } if {$Format=="3x8" } { return [format "%d %d %d" [expr $r/256] [expr $g/256] [expr $b/256]] } if {$Format=="hexa"} { return [format "#%04x%04x%04x" $r $g $b] } if {$Format=="hexa2"} { return [format "#%02x%02x%02x" [expr $r/256] [expr $g/256] [expr $b/256]] } if {[regexp -nocase "n" $Format] } { set Proche [PlusProcheCouleur [list [expr $r/256] [expr $g/256] [expr $b/256]] "3x8"] if {[regexp -nocase "all" $Format]} { return [FromTkCol $Proche "Nom"] } set Nom [lindex [FromTkCol $Proche "Nom"] 0] return $Nom } return $rgb } proc Nuance3x8 {Amour {UnPeu ""} {Passion ""} {Saturation ""} {Brightness ""}} { #biotcl color3x8 {} return [Nuance $Amour $UnPeu $Passion "3x8" $Saturation $Brightness] } proc Nuance {Amour {UnPeu ""} {Passion ""} {Format ""} {Saturation ""} {Brightness ""}} { #biotcl shade {} #rR réécrit 2014/11/17 #rR Amour va de 0 à 1 et de ca fait correspondra à Hue de UnPeu à Passion if {$Saturation==""} { set Saturation 1. } if {$Brightness==""} { set Brightness 1. } if {$UnPeu ==""} { set UnPeu 0.1 } if {$Passion ==""} { set Passion 0.6 } if {$Format ==""} { set Format "hexa" } if {$UnPeu<=$Passion} { set Hue [expr {$UnPeu + ($Passion-$UnPeu)*$Amour}] } else { set Hue [expr {$UnPeu - ($UnPeu-$Passion)*$Amour}] } set rgb [hsbToRgb $Hue $Saturation $Brightness] return [CouleurFormat $rgb $Format] } proc Sature {Amour {UnPeu ""} {Passion ""} {Format ""} {Hue ""} {Brightness ""}} { #biotcl sature {} #rR réécrit 2014/11/17 #rR Amour va de 0 à 1 et de ce fait correspondra à Saturation de UnPeu à Passion if {$Hue ==""} { set Hue 0.5 } if {$Brightness==""} { set Brightness 1. } if {$UnPeu ==""} { set UnPeu 0.1 } if {$Passion ==""} { set Passion 0.6 } if {$Format ==""} { set Format "hexa" } set Saturation [expr $UnPeu + ($Passion-$UnPeu)*$Amour] set rgb [hsbToRgb $Hue $Saturation $Brighness] return [CouleurFormat $rgb $Format] } proc ColorFromHSB {H S B} { #biotcl colorFromHSB {} set rgb [hsbToRgb $H $S $B] lassign $rgb r g b set color [format "#%04x%04x%04x" $r $g $b] return $color } proc oldhsbToRgb {hue sat value} { # The procedure converts an HSB value to RGB. It takes hue, saturation, # and value components (floating-point, 0-1.0) as arguments, and returns a # list containing RGB components (integers, 0-65535) as result. The code # here is a copy of the code on page 616 of "Fundamentals of Interactive # Computer Graphics" by Foley and Van Dam. set v [format %.0f [expr 65535.0*$value]] if {$sat == 0} { return "$v $v $v" } else { set hue [expr $hue*6.0] if {$hue >= 6.0} { set hue 0.0 } scan $hue. %d i set f [expr $hue-$i] set p [format %.0f [expr {65535.0*$value*(1 - $sat)}]] set q [format %.0f [expr {65535.0*$value*(1 - ($sat*$f))}]] set t [format %.0f [expr {65535.0*$value*(1 - ($sat*(1 - $f)))}]] case $i \ 0 {return "$v $t $p"} \ 1 {return "$q $v $p"} \ 2 {return "$p $v $t"} \ 3 {return "$p $q $v"} \ 4 {return "$t $p $v"} \ 5 {return "$v $p $q"} error "i value $i is out of range" } } proc PlusProcheCouleur {Couleur {Format ""}} { #biotcl nearestColor {} set MaxDist2 99999999999 foreach Rgb [FromTkCol ListOf rgb] { set Dist2 0 foreach c $Couleur r $Rgb { set Dist2 [expr $Dist2 + ($c-$r)**2] } if {$Dist2>=$MaxDist2} { continue } set MaxDist2 $Dist2 set PlusProcheCouleur $Rgb } return [CouleurFormat $PlusProcheCouleur $Format "3x8"] } proc FromTkCol {{Qui ""} {Quoi ""}} { #rR TkCol connait toutes les couleurs TkCol(aquamarine) = 127 255 212 #rR FromTkCol fournit l'un en fonction de l'autre et aussi les listes #rR nom est le nom de la couleur n le meme sans blanc #rR FromTkCol répond même avec une mauvaise casse ;-) global TkCol FromTkCol set Quoi [string tolower $Quoi] if {[info exists FromTkCol($Qui,$Quoi)]} { return $FromTkCol($Qui,$Quoi) } if {[info exists FromTkCol("EstCharge")]} { set QUI [string toupper $Qui] regsub -all " " $QUI "" QUI if {[info exists FromTkCol($QUI,$Quoi)]} { return $FromTkCol($QUI,$Quoi) } return "" } set FromTkCol("EstCharge") 1 if { ! [info exists TkCol]} { InitTkCol } foreach {Nom Rgb} [array get TkCol] { regsub -all " " $Nom "" n set NOM [string toupper $Nom] set N [string toupper $n] set FromTkCol($Nom,rgb) $Rgb set FromTkCol($n,rgb) $Rgb set FromTkCol($NOM,rgb) $Rgb set FromTkCol($N,rgb) $Rgb set FromTkCol($Nom,nom) $Nom set FromTkCol($n,nom) $Nom set FromTkCol($NOM,nom) $Nom set FromTkCol($N,nom) $Nom set FromTkCol($Nom,n) $n set FromTkCol($n,n) $n set FromTkCol($NOM,n) $n set FromTkCol($N,n) $n lappend FromTkCol($Rgb,nom) $Nom lappend FromTkCol($Rgb,n) $n lappend FromTkCol(LISTOF,nom) $Nom lappend FromTkCol(LISTOF,n) $n lappend FromTkCol(LISTOF,rgb) $Rgb } set FromTkCol(LISTOF,nom) [concat $FromTkCol(LISTOF,nom) $FromTkCol(LISTOF,n)] set FromTkCol(LISTOF,nom) [lsort -unique $FromTkCol(LISTOF,nom)] set FromTkCol(LISTOF,n) [lsort -unique $FromTkCol(LISTOF,n)] return [FromTkCol $Qui $Quoi] } proc PaletteDeCouleurs {{CouleurParDefaut ""} {FichierRgbTxt ""} {titre ""}} { global red green blue colorSpace color updating autoUpdate global LaCouleurDePaletteDeCouleurs global PEnGlobalPourPaletteDeCouleurs global CouleurNommeePourPaletteDeCouleurs if {$CouleurParDefaut == ""} { set CouleurParDefaut "black" } if {$FichierRgbTxt==""} { set FichierRgbTxt "[GscopeEtc]/rgb.txt" } set P [NomDe palette] toplevel $P if {$titre ne ""} { wm title $P $titre } else { wm title $P "This widget is taken from the TK8.2's demos. Adapted for GScope by Raymond Ripp." } set PEnGlobalPourPaletteDeCouleurs $P # Global variables that control the program: # # colorSpace - Color space currently being used for # editing. Must be "rgb", "cmy", or "hsb". # label1, label2, label3 - Labels for the scales. # red, green, blue - Current color intensities in decimal # on a scale of 0-65535. # color - A string giving the current color value # in the proper form for x: # #RRRRGGGGBBBB # updating - Non-zero means that we're in the middle of # updating the scales to load a new color,so # information shouldn't be propagating back # from the scales to other elements of the # program: this would make an infinite loop. # command - Holds the command that has been typed # into the "Command" entry. # autoUpdate - 1 means execute the update command # automatically whenever the color changes. # name - Name for new color, typed into entry. set colorSpace hsb set red 65535 set green 0 set blue 0 set list [winfo rgb $P $CouleurParDefaut] set red [lindex $list 0] set green [lindex $list 1] set blue [lindex $list 2] set CouleurParDefaut [format "#%04x%04x%04x" $red $green $blue] set color $CouleurParDefaut set updating 0 set autoUpdate 0 set CouleurNommeePourPaletteDeCouleurs "" # Create the menu bar at the top of the window. frame $P.menu -relief raised -borderwidth 2 pack $P.menu -side top -fill x menubutton $P.menu.file -text "ColorSpace : RGB, CMY or HSB" -menu $P.menu.file.m -underline 0 menu $P.menu.file.m $P.menu.file.m add radio -label "RGB color space" -variable colorSpace \ -value rgb -underline 0 -command "changeColorSpace rgb $P" $P.menu.file.m add radio -label "CMY color space" -variable colorSpace \ -value cmy -underline 0 -command "changeColorSpace cmy $P" $P.menu.file.m add radio -label "HSB color space" -variable colorSpace \ -value hsb -underline 0 -command "changeColorSpace hsb $P" # $P.menu.file.m add separator # $P.menu.file.m add radio -label "Automatic updates" -variable autoUpdate \ # -value 1 -underline 0 # $P.menu.file.m add radio -label "Manual updates" -variable autoUpdate \ # -value 0 -underline 0 # $P.menu.file.m add separator # $P.menu.file.m add command -label "Exit program" -underline 0 \ # -command { set LaCouleurDePaletteDeCouleurs "" } pack $P.menu.file -side left # Create the command entry window at the bottom of the window, along # with the update button. frame $P.bot -relief raised -borderwidth 2 pack $P.bot -side bottom -fill x label $P.commandLabel -text "Command:" entry $P.command -relief sunken -borderwidth 2 -textvariable command \ -font -Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-* button $P.update -text "Accept" -background "green" -command {set LaCouleurDePaletteDeCouleurs $color} button $P.dismiss -text "Dismiss" -background "red" -command {set LaCouleurDePaletteDeCouleurs ""} # pack $P.commandLabel -in $P.bot -side left pack $P.dismiss -in $P.bot -side left -pady .1c -padx .25c pack $P.update -in $P.bot -side right -pady .1c -padx .25c # pack $P.command -in $P.bot -expand yes -fill x -ipadx 0.25c # Create the listbox that holds all of the color names in rgb.txt, # if an rgb.txt file can be found. frame $P.middle -relief raised -borderwidth 2 pack $P.middle -side top -fill both #lm enleve la boucle sur les fichiers X11 Linux pour #lm la remplacer par la liste des coulerus reconnues #lm par Tk sur toutes les plates-formes # foreach i [list $FichierRgbTxt /usr/local/lib/X11/rgb.txt /usr/lib/X11/rgb.txt \ # /X11/R5/lib/X11/rgb.txt /X11/R4/lib/rgb/rgb.txt \ # /usr/openwin/lib/X11/rgb.txt] { # if ![file readable $i] { continue } # set f [open $i] global TkCol if {! [info exists TkCol]} {InitTkCol} frame $P.middle.left pack $P.middle.left -side left -padx .25c -pady .25c listbox $P.names -width 20 -height 12 \ -yscrollcommand "$P.scroll set" \ -relief sunken -borderwidth 2 \ -exportselection false bind $P.names "tc_loadNamedColor \[$P.names get \[$P.names curselection\]\] $P" scrollbar $P.scroll -orient vertical \ -command "$P.names yview" \ -relief sunken -borderwidth 2 pack $P.names -in $P.middle.left -side left pack $P.scroll -in $P.middle.left -side right -fill y foreach e [lsort [array names TkCol]] { regsub -all "_" $e " " e $P.names insert end $e } #lm je commentarise ... ##while {[gets $f line] >= 0} { # if {[llength $line] == 4} { #$P.names insert end [lindex $line 3] # } #} # close $f # break # } # Create the three scales for editing the color, and the entry for # typing in a color value. frame $P.middle.middle pack $P.middle.middle -side left -expand yes -fill y frame $P.middle.middle.1 frame $P.middle.middle.2 frame $P.middle.middle.3 frame $P.middle.middle.4 pack $P.middle.middle.1 $P.middle.middle.2 $P.middle.middle.3 -side top -expand yes pack $P.middle.middle.4 -side top -expand yes -fill x foreach i {1 2 3} { label $P.label$i -textvariable label$i scale $P.scale$i -from 0 -to 1000 -length 6c -orient horizontal \ -command "tc_scaleChanged $P" pack $P.scale$i $P.label$i -in $P.middle.middle.$i -side top -anchor w } label $P.nameLabel -text "Name:" entry $P.name -relief sunken -borderwidth 2 -textvariable CouleurNommeePourPaletteDeCouleurs -width 10 \ -font -Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-* pack $P.nameLabel -in $P.middle.middle.4 -side left pack $P.name -in $P.middle.middle.4 -side right -expand 1 -fill x bind $P.name {tc_loadNamedColor $CouleurNommeePourPaletteDeCouleurs $PEnGlobalPourPaletteDeCouleurs} # Create the color display swatch on the right side of the window. frame $P.middle.right pack $P.middle.right -side left -pady .25c -padx .25c -anchor s frame $P.swatch -width 2c -height 5c -background $color label $P.value -textvariable color -width 13 \ -font -Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-* pack $P.swatch -in $P.middle.right -side top -expand yes -fill both pack $P.value -in $P.middle.right -side bottom -pady .25c #lm rajoute grab update idletasks set OldGrab [grab current] grab set $P wm attributes $P -topmost 1 wm transient $P . changeColorSpace hsb $P tkwait variable LaCouleurDePaletteDeCouleurs destroy $P #lm remet le grab si necessaire if {$OldGrab ne ""} {grab [lindex $OldGrab 0]} return $LaCouleurDePaletteDeCouleurs } # The procedure below is invoked when one of the scales is adjusted. # It propagates color information from the current scale readings # to everywhere else that it is used. proc tc_scaleChanged {P args} { global red green blue colorSpace color updating autoUpdate global LaCouleurDePaletteDeCouleurs if $updating { return } if {$colorSpace == "rgb"} { set red [format %.0f [expr [$P.scale1 get]*65.535]] set green [format %.0f [expr [$P.scale2 get]*65.535]] set blue [format %.0f [expr [$P.scale3 get]*65.535]] } else { if {$colorSpace == "cmy"} { set red [format %.0f [expr {65535 - [$P.scale1 get]*65.535}]] set green [format %.0f [expr {65535 - [$P.scale2 get]*65.535}]] set blue [format %.0f [expr {65535 - [$P.scale3 get]*65.535}]] } else { set list [hsbToRgb [expr {[$P.scale1 get]/1000.0}] \ [expr {[$P.scale2 get]/1000.0}] \ [expr {[$P.scale3 get]/1000.0}]] set red [lindex $list 0] set green [lindex $list 1] set blue [lindex $list 2] } } set color [format "#%04x%04x%04x" $red $green $blue] $P.swatch config -bg $color if { $autoUpdate } { set LaCouleurDePaletteDeCouleurs $color } update idletasks } # The procedure below is invoked to update the scales from the # current red, green, and blue intensities. It's invoked after # a change in the color space and after a named color value has # been loaded. proc tc_setScales P { global red green blue colorSpace updating set updating 1 if {$colorSpace == "rgb"} { $P.scale1 set [format %.0f [expr $red/65.535]] $P.scale2 set [format %.0f [expr $green/65.535]] $P.scale3 set [format %.0f [expr $blue/65.535]] } else { if {$colorSpace == "cmy"} { $P.scale1 set [format %.0f [expr (65535-$red)/65.535]] $P.scale2 set [format %.0f [expr (65535-$green)/65.535]] $P.scale3 set [format %.0f [expr (65535-$blue)/65.535]] } else { set list [rgbToHsv $red $green $blue] $P.scale1 set [format %.0f [expr {[lindex $list 0] * 1000.0}]] $P.scale2 set [format %.0f [expr {[lindex $list 1] * 1000.0}]] $P.scale3 set [format %.0f [expr {[lindex $list 2] * 1000.0}]] } } set updating 0 } # The procedure below is invoked when a named color has been # selected from the listbox or typed into the entry. It loads # the color into the editor. proc tc_loadNamedColor {name P} { global red green blue color autoUpdate global LaCouleurDePaletteDeCouleurs if {[string index $name 0] != "#"} { if {[catch {set list [winfo rgb $P.swatch $name]} Message]} { FaireLire "Error in color name with message\n$Message" return "" } set red [lindex $list 0] set green [lindex $list 1] set blue [lindex $list 2] } else { case [string length $name] { 4 {set format "#%1x%1x%1x"; set shift 12} 7 {set format "#%2x%2x%2x"; set shift 8} 10 {set format "#%3x%3x%3x"; set shift 4} 13 {set format "#%4x%4x%4x"; set shift 0} default {error "syntax error in color name \"$name\""} } if {[scan $name $format red green blue] != 3} { error "syntax error in color name \"$name\"" } set red [expr $red<<$shift] set green [expr $green<<$shift] set blue [expr $blue<<$shift] } tc_setScales $P set color [format "#%04x%04x%04x" $red $green $blue] $P.swatch config -bg $color if { $autoUpdate } { set LaCouleurDePaletteDeCouleurs $color } } # The procedure below is invoked when a new color space is selected. # It changes the labels on the scales and re-loads the scales with # the appropriate values for the current color in the new color space proc changeColorSpace {space P} { global label1 label2 label3 if {$space == "rgb"} { set label1 Red set label2 Green set label3 Blue tc_setScales $P return } if {$space == "cmy"} { set label1 Cyan set label2 Magenta set label3 Yellow tc_setScales $P return } if {$space == "hsb"} { set label1 Hue set label2 Saturation set label3 Brightness tc_setScales $P return } } # The procedure below converts an RGB value to HSB. It takes red, green, # and blue components (0-65535) as arguments, and returns a list containing # HSB components (floating-point, 0-1) as result. The code here is a copy # of the code on page 615 of "Fundamentals of Interactive Computer Graphics" # by Foley and Van Dam. proc rgbToHsv {red green blue} { #biotcl rgbToHsv {} if {$red > $green} { set max $red.0 set min $green.0 } else { set max $green.0 set min $red.0 } if {$blue > $max} { set max $blue.0 } else { if {$blue < $min} { set min $blue.0 } } set range [expr $max-$min] if {$max == 0} { set sat 0 } else { set sat [expr {($max-$min)/$max}] } if {$sat == 0} { set hue 0 } else { set rc [expr {($max - $red)/$range}] set gc [expr {($max - $green)/$range}] set bc [expr {($max - $blue)/$range}] if {$red == $max} { set hue [expr {.166667*($bc - $gc)}] } else { if {$green == $max} { set hue [expr {.166667*(2 + $rc - $bc)}] } else { set hue [expr {.166667*(4 + $gc - $rc)}] } } if {$hue < 0.0} { set hue [expr $hue + 1.0] } } return [list $hue $sat [expr {$max/65535}]] } # The procedure below converts an HSB value to RGB. It takes hue, saturation, # and value components (floating-point, 0-1.0) as arguments, and returns a # list containing RGB components (integers, 0-65535) as result. The code # here is a copy of the code on page 616 of "Fundamentals of Interactive # Computer Graphics" by Foley and Van Dam. proc hsbToRgb {hue sat value} { #biotcl hsbToRgb {} set v [format %.0f [expr {65535.0*$value}]] if {$sat == 0} { return "$v $v $v" } else { set hue [expr {$hue*6.0}] if {$hue >= 6.0} { set hue 0.0 } scan $hue. %d i set f [expr {$hue-$i}] set p [format %.0f [expr {65535.0*$value*(1 - $sat)}]] set q [format %.0f [expr {65535.0*$value*(1 - ($sat*$f))}]] set t [format %.0f [expr {65535.0*$value*(1 - ($sat*(1 - $f)))}]] case $i \ 0 {return "$v $t $p"} \ 1 {return "$q $v $p"} \ 2 {return "$p $v $t"} \ 3 {return "$p $q $v"} \ 4 {return "$t $p $v"} \ 5 {return "$v $p $q"} error "i value $i is out of range" } } proc TuMontrerasCeQueFaitLeBouton Bouton { global QuelBouton return [set QuelBouton [after 1000 MontreCeQueFaitLeBouton $Bouton]] } proc MontreCeQueFaitLeBouton Bouton { global LeBoutonQuiEstMontre catch {destroy $LeBoutonQuiEstMontre} set LesActions [QueFaitLeBouton $Bouton] if {$LesActions == {} } { return "" } global RapetisseLesBoutonsDe if {[info exists RapetisseLesBoutonsDe($Bouton)]} { set TexteActions "[set RapetisseLesBoutonsDe($Bouton)]\n\n[join $LesActions "\n"]" } else { set TexteActions [join $LesActions "\n"] } regsub -nocase {\.[a-z_0-9]*$} $Bouton "" FdB if {$FdB==""} { return "" } regsub -nocase {\.[a-z_0-9]*$} $FdB "" FdFdB if {$FdFdB==""} { return "" } set x [winfo x $FdB] set y [winfo y $FdB] incr x [winfo x $Bouton] incr y [winfo y $Bouton] incr y -10 set M ${FdFdB}[NomDe message] message $M -borderwidth 3 -relief raise -width 800 -text $TexteActions -background "lightyellow" -foreground "black" if {[expr $x > 400]} { set Anchor se } else { set Anchor sw } place $M -x $x -y $y -anchor $Anchor -in $FdFdB set LeBoutonQuiEstMontre $M return $LeBoutonQuiEstMontre } proc LacheLeBouton w { global QuelBouton global LeBoutonQuiEstMontre catch {after cancel $QuelBouton} catch {destroy $LeBoutonQuiEstMontre} } proc QueFaitLeBouton Bouton { set LesActions {} foreach Sequence {<1> <2> <3> } { set Action {} catch {set Action [bind $Bouton $Sequence]} if {$Action == {} } { continue } lappend LesActions "$Sequence $Action" } return $LesActions } proc QueFontLesBoutonsDe w { set LesActions [list " "] foreach Bouton [LesBoutonsDeLaFrame $w.buttons] { foreach SeqAct [QueFaitLeBouton $Bouton] { lappend LesActions "$Bouton $SeqAct" } } Espionne [join $LesActions "\n"] # ShowText [join $LesActions "\n"] "AvecCallProc" } proc ExecuteUnBoutonDe w { set Tabulation [string repeat " " [string length "Button"]] set Sel "" catch {set Sel [selection get]} foreach Bouton [LesBoutonsDeLaFrame $w.buttons] { set Texte [lindex [$Bouton configure -text] 4] regsub -all "\n" $Texte " ++ " Texte lappend LesActions "Button $Bouton $Texte" foreach SeqAct [QueFaitLeBouton $Bouton] { regsub -nocase {<[a-z0-9\-]*> } $SeqAct "" Act regsub {\[selection get\]} $Act "\{$Sel\}" Act lappend LesActions "$Tabulation $Act" } } set Action [ChoixParmi $LesActions] if {$Action=="" || [regexp "^Button" $Action]} { return "" } return [eval $Action] } proc OldRapetisseLesBoutonsDe {w {FonteVoulue ""}} { if {$FonteVoulue!=""} { set Fonte $FonteVoulue } foreach Bouton [LesBoutonsDeLaFrame $w.buttons] { if { ! [info exists Fonte]} { set OldFonte [lindex [$Bouton configure -font] 4] ScanLaListe $OldFonte Police Size Style set NewSize [expr $Size + 1] if {$NewSize==-5} { set NewSize -14 } set Fonte [list "tiny" $NewSize "normal"] Espionne $Fonte } $Bouton configure -font $Fonte } return $Fonte } proc RapetisseLesBoutonsDe {w {Reset ""}} { global RapetisseLesBoutonsDe if {$Reset=="Reset" && ! [info exists RapetisseLesBoutonsDe($w)]} { return "" } set RapetisseLesBoutonsDe($w) 1 foreach Bouton [LesBoutonsDeLaFrame $w.buttons] { set NewWidth [lindex [$Bouton configure -width] 4] incr NewWidth -3 if {$NewWidth < 3} { set NewWidth 20 } $Bouton configure -width $NewWidth continue if { ! [info exists RapetisseLesBoutonsDe($w,$Bouton)]} { set Texte [lindex [$Bouton configure -text] 4] set RapetisseLesBoutonsDe($w,$Bouton) $Texte set RapetisseLesBoutonsDe($Bouton) $Texte regsub -all {[a-z]} $Texte "" NewTexte } else { set NewTexte [set RapetisseLesBoutonsDe($w,$Bouton)] unset RapetisseLesBoutonsDe($w,$Bouton) if {[info exists RapetisseLesBoutonsDe($w)]} { unset RapetisseLesBoutonsDe($w) } } $Bouton configure -text $NewTexte } return $w } proc DetruitUnBoutonDe w { set LesBoutons {} set Bouton [ChoixParmi [LesBoutonsDeLaFrame $w.buttons]] if {$Bouton==""} { return "" } if { ! [OuiOuNon "Do You want to remove the button $Bouton ?"]} { return "" } destroy $Bouton return $Bouton } proc ShowText {Page Maniere {NomDuFichierOrigine ""}} { Wup "Shows the text Page in a listbox, with a lot of buttons." Wup "Copyright 1999 Raymond Ripp" global PagePropre set w [NomDe fenetre] regsub -all {\t} $Page " " PagePropre($w) if { $NomDuFichierOrigine == "" } { set NomDuFichierOrigine "Tsointsoin" } toplevel $w set Titre "$NomDuFichierOrigine" wm title $w "$Titre" wm iconname $w "$Titre" label $w.msg -wraplength 4i -justify left -text "$Titre" pack $w.msg -side top frame $w.buttons pack $w.buttons -side bottom -fill x -pady 2m button $w.buttons.dismiss -text "Dismiss//?" -background "red" -command "destroy $w" bind $w.buttons.dismiss <3> "QueFontLesBoutonsDe $w" pack $w.buttons.dismiss -side left -expand 1 button $w.buttons.save -text "Save\nAll/Sel/Edit" bind $w.buttons.save <1> "SaveAs \[set PagePropre($w)\]" bind $w.buttons.save <2> "SaveAs \[selection get\]" bind $w.buttons.save <3> "EditAndShow \[set PagePropre($w)\]" bind $w.buttons.save "destroy $w.buttons.save" pack $w.buttons.save -side left -expand 1 button $w.buttons.focalise -text "Nex/Top/New" bind $w.buttons.focalise <1> "Focalise $w" bind $w.buttons.focalise <2> "Focalise $w top" bind $w.buttons.focalise <3> "Focalise $w ask" pack $w.buttons.focalise -side left -expand 1 if { [regexp "AvecShow" $Maniere] } { button $w.buttons.show -text "Show" -background green -foreground black bind $w.buttons.show <1> {AfficheLesFichiers "[selection get]" "GrandeLargeur"} pack $w.buttons.show -side right -expand 1 } if {[regexp "AvecAffiProc" $Maniere]} { button $w.buttons.affiproc -text "Show" -background "green" bind $w.buttons.affiproc <1> "AfficheLaProc \[selection get\]" pack $w.buttons.affiproc -side left -expand 1 } if {[regexp "AvecCallProc" $Maniere]} { button $w.buttons.quijappel -text "Called Procs sel./all" -background "green" bind $w.buttons.quijappel <1> "QuiJAppel $NomDuFichierOrigine \[selection get\] " bind $w.buttons.quijappel <2> "AfficheLesProcs NameIsIn \[QuiJAppel $NomDuFichierOrigine LaListeMerci\]" pack $w.buttons.quijappel -side left -expand 1 button $w.buttons.quimappel -text "Calling Procs" -background "yellow" bind $w.buttons.quimappel <1> "QuiMAppel $NomDuFichierOrigine" pack $w.buttons.quimappel -side left -expand 1 button $w.buttons.execute -text "Execute\nEdit\nNew proc" -background "orange" bind $w.buttons.execute <1> "CompleteEtExecute \[selection get\]" bind $w.buttons.execute "CreeUneNouvelleProcedure \[set PagePropre($w)\]" bind $w.buttons.execute "CreeUneNouvelleProcedure" pack $w.buttons.execute -side left -expand 1 } frame $w.frame -borderwidth 5 pack $w.frame -side top -expand yes -fill both scrollbar $w.frame.yscroll -command "$w.frame.list yview" scrollbar $w.frame.xscroll -command "$w.frame.list xview" \ -orient horizontal set Largeur 80 set Hauteur 30 if { [regexp "GrandeLargeur" $Maniere] } { set Largeur 128 } listbox $w.frame.list -width $Largeur -height $Hauteur -setgrid 1 \ -yscroll "$w.frame.yscroll set" \ -xscroll "$w.frame.xscroll set" \ -selectmode extended \ -background "deepskyblue4" \ -foreground "white" \ -font {Courier 10} grid $w.frame.list -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky nsew grid $w.frame.yscroll -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky nsew grid $w.frame.xscroll -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky nsew grid rowconfig $w.frame 0 -weight 1 -minsize 0 grid columnconfig $w.frame 0 -weight 1 -minsize 0 foreach Ligne [split [set PagePropre($w)] "\n"] { $w.frame.list insert end $Ligne } return $w } proc AfficheLaRechercheDansLesBody {{Texte ""}} { set LesTrouvees [RechercheDansLesBody $Texte] if {$LesTrouvees=={}} { return "" } return [ShowText [join $LesTrouvees "\n"] \ "SansFetchAvecRienAvecAffiProc" "Procs containing your text."] } proc RechercheDansLesBody {{Texte ""}} { Wup "Asks which text is to search in all proc bodies" if {$Texte==""} { set Texte [Entre ""] if {$Texte==""} { return ""} } set LesTrouvees {} foreach Proc [LesProceduresExistantes] { set Body [info body $Proc] if {[regexp -nocase $Texte $Body]} { lappend LesTrouvees $Proc } } return $LesTrouvees } proc LesProceduresExistantes {} { Wup "Returns the list of existing procs ... begining with Uppercase" global LesProceduresExistantes if { ! [info exists LesProceduresExistantes]} { set LesProceduresExistantes [lsort [info procs {[A-Z]*}]] } return $LesProceduresExistantes } proc AfficheLaProc Procedure { Wup "Shows the proc Procedure or lappend to the called procs" scan [string trim $Procedure] "%s" Procedure if {[info procs $Procedure]=={}} { return "" } set Args [info args $Procedure] set Body [info body $Procedure] set TexteProc "$Procedure {$Args} {\n$Body\n}" if {[PourWscope]} { return [Html_DuTexteTelQuel $TexteProc] } return [ShowText $TexteProc "SansFetchAvecRienAvecCallProcGrandeLargeur" $Procedure] } proc AppendLaProc {SousProcedure Procedure} { global LesSousProcedures if {[info procs $SousProcedure]=={}} { return } lappend LesSousProcedures($Procedure) $SousProcedure } proc AfficheLesProcs {{LesQuelles ""} {Liste {}}} { Wup "Shows the names and args of all Procs" Gs "Frame" if { ! [PourWscope] && ! [AutorisationPourPsy] } { return "" } set WithRef [PourWscope] set LesBonnes {} foreach Procedure [LesProceduresExistantes] { set Args [info args $Procedure] #AAAAAAAAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFFIIIIIIIIIIIIIIIIIINNNNNNNNNNNNNNNNNNNIIIIIIIIIIIIIRRR set MotProc $Procedure # if {$WithRef} { set MotProc "