#!/bin/csh ####################################################################################################################################### # # # R E C O N S T I T U T I O N D ' U N E A R B O R E S C E N C E C O M P L E T E : # # # # # # Utilisation : # # # # $xci/valeurs_Arbre.01$Z <Arguments> [<Simplifier> [<ConserverSegments> [<Unique>]]] # # # # # # Fonction : # # # # La fonction de ce '$Z' est d'editer # # la definition "non optimisee" d'un arbre # # (la version "optimisee" etant produite par # # 'v $xci/valeurs_Arbre.01$K'). Cela signifie # # que l'on obtient ainsi une liste exhaustive # # de toutes les suites de branches menant de la # # racine aux feuilles. Cela implique evidemment # # qu'on voit alors apparaitre des redondances : # # par exemple, la racine de l'arbre apparait # # autant de fois qu'il y a de feuilles... # # # # # # Author of '$xci/valeurs_Arbre.01$Z' : # # # # Jean-Francois Colonna (LACTAMME, 20160209123809). # # # ####################################################################################################################################### set Arguments=($1) set Simplifier=$2 # Parametre introduit le 20160210091210... # set ConserverSegments=$3 # Parametre introduit le 20160210140821... # set Unique=$4 # Parametre introduit le 20200423104105... # setArgum Simplifier $NEXIST if ("$ConserverSegments" == "$K_VIDE") then set ConserverSegments=$EXIST # Ce parametre controle la nature de la liste des points obtenue et donc de l'usage # # qui en pourra en etre fait avec, par exemple, 'v $xrv/particule.10$K' : # # # # $NEXIST sur une ligne les points sont tous differents et sont # # donc chainables les uns aux autres grace a l'option : # # # # isoles=FAUX chainer=VRAI # # # # # # $EXIST sur une ligne les points sont en couples, chaque couple # # definissant un segment grace aux options : # # # # isoles=FAUX chainer=FAUX # # # # # # C'est cette derniere option qui est la plus utile car, en effet, la premiere conduit # # necessairement a des chainages intempestfis (par exemple d'une feuille appartenant a # # une certaine branche a la racine de la branche suivante...). # else endif setArgum Unique $NEXIST # La valeur par defaut garantit la compatibilite anterieure au 20200423104105... # FilSTmpB FArBrE_PaRtIeL # Fichiers de manoeuvre... # set FinDeBranche="FinDeBranche" $xci/valeurs_Arbre.01$X \ marquer_extremite_branches=VRAI \ ChiffresFlot=14 \ $Arguments | \ $xcp/substitue.01$X \ c01="\n\($FinDeBranche\n\)" s01="\1" \ >> $FArBrE_PaRtIeL # Recuperation de l'arbre avec marquage des fins de branche. # $CA $FArBrE_PaRtIeL | \ $NL | \ $R "$K_TAB" "$K_BLANC" | \ $SE -e "s/^ */+/" \ > $FArBrE_PaRtIeL.NUMEROS # Numerotage des lignes de l'arbre. # set LiStE_ArBoReScEnCeS=`$CA $FArBrE_PaRtIeL | $AW ' { print $1 } ' | $SE -e "s/^.*=//"` # Recuperation de la liste de toutes les arborescences sous-arborescences de l'arbre. # FilSTmpB FArBrE_CoMplEt set CoMpTeUr=1 foreach ArBoReScEnCe ($LiStE_ArBoReScEnCeS) set LiStE_BrAnChEs=`echo "$ArBoReScEnCe" | $R "/" " "` # Recuperation de la liste de toutes les branches de la sous-arborescence courante. # set FiN_BrAnChE=`$CA $FArBrE_PaRtIeL.NUMEROS | $GRE "^+$CoMpTeUr " | $GRE " $FinDeBranche"'$'` # L'arborescence courante est-elle une fin de branche ? # if ("$FiN_BrAnChE" != "$K_VIDE") then set FiN_BrAnChE=" $FinDeBranche" else set FiN_BrAnChE="$K_VIDE" endif if ($#LiStE_BrAnChEs > 1) then set NuMeRo=1 set SoUs_ArBoReScEnCe="$K_VIDE" while ($NuMeRo <= $#LiStE_BrAnChEs) set SoUs_ArBoReScEnCe=$SoUs_ArBoReScEnCe$LiStE_BrAnChEs[$NuMeRo]/ # Construction progressive en partant de la racine de toutes les sous-arborescences # # contenues (depuis la racine) dans '$SoUs_ArBoReScEnCe'. # set LiGnE=`$CA $FArBrE_PaRtIeL |$GRE "=$SoUs_ArBoReScEnCe "` # Recherche de la ligne de l'arbre contenant cette sous-arborescence. # if ("$LiGnE" != "$K_VIDE") then echo $LiGnE | \ $SE -e 's/$'"/$FiN_BrAnChE/" \ >> $FArBrE_CoMplEt # La ligne de l'arbre qui definit '$SoUs_ArBoReScEnCe' est introduite, avec ajout eventuel # # de la marque '$FiN_BrAnChE'. Il est donc possible qu'a ce stade une ligne possede deux # # telles marques (cela sera corrige plus tard). # else endif @ NuMeRo = $NuMeRo + 1 end else set LiGnE=`$CA $FArBrE_PaRtIeL.NUMEROS | $GRE "^+$CoMpTeUr " | $SE -e "s/^+$CoMpTeUr *//"` echo $LiGnE \ >> $FArBrE_CoMplEt # Cas de la ligne definissant la racine de l'arbre... # endif @ CoMpTeUr = $CoMpTeUr + 1 end FilSTmpB FArBrE_CoRrIgE $CA $FArBrE_CoMplEt | \ $GRE " $FinDeBranche"'$' | \ $SE -e "s/ $FinDeBranche"'$//' | \ $UNI \ >> $FArBrE_CoRrIgE # Traitement final qui ne conserve que les lignes possedant au moins une '$FinDeBranche', # # les marques '$FinDeBranche' n'etant conservees que si elles sont en double. On trouvera # # donc ainsi dans le fichier genere ici une suite de lignes du type : # # # # Arborescence=1/ X1=+0.5 Y1=+0 Z1=+0.5 X2=+0.5 Y2=+0.5 Z2=+0.5 # # Arborescence=1/2/ X1=+0.5 Y1=+0.5 Z1=+0.5 X2=+0.5 Y2=+0.75 Z2=+0.5 # # Arborescence=1/2/3/ X1=+0.5 Y1=+0.75 Z1=+0.5 X2=+0.375 Y2=+0.75 Z2=+0.5 FinDeBranche # # # # La derniere ligne de ce "paquet" se termine par '$FinDeBranche' et celles qui la precede # # definissent toutes les sous-arborescence partant de la racine et aboutissant a celle # # definie par la derniere ligne (marquee donc par '$FinDeBranche')... # FilSTmpB FArBrE_SiMplIfIe if ($Simplifier == $EXIST) then if ($ConserverSegments == $EXIST) then set GeNeReR_SeGmEnTs="CONSERVER_LES_SEGMENTS" # Cette definition permet de bloquer l'elimination du deuxieme point d'une branche # # dans la subsitition {c01,s01} ci-apres... # else set GeNeReR_SeGmEnTs="$K_VIDE" endif set MaRqUeUr="@" set Feuille="Feuille" set Noeud="Noeud" $CA $FArBrE_CoRrIgE | \ $SE -e "s/^[^ ][^ ]* *//" \ -e "s/ $FinDeBranche"'$'"/$MaRqUeUr/" \ -e "s/\([^$MaRqUeUr]\)"'$'"/\1 $Noeud/" \ -e "s/$MaRqUeUr"'$'"/ $Feuille/" \ -e "s/\([XYZRPT]\)[12]\(=\)/\1\2/g" | \ $xcp/substitue.01$X \ c01="$GeNeReR_SeGmEnTs\([XR]=[^ ][^ ]* *[YP]=[^ ][^ ]* *[ZT]=[^ ][^ ]* *\)$Noeud\n" \ s01="" \ c11=" $Feuille\n" \ s11="\n" \ c12=" $Noeud\n" \ s12="\n" \ >> $FArBrE_SiMplIfIe # Cette operation met sur une seule ligne tous les noeuds menant de la racine a chaque # # feuille de l'arbre... # else $CA $FArBrE_CoRrIgE \ >> $FArBrE_SiMplIfIe endif if ($Unique == $NEXIST) then $CA $FArBrE_SiMplIfIe # Edition finale, chaque apparaissant plusieurs fois (le tronc apparait le plus, soit # # autant que d'iterations, puis de moins en moins en s'approchant des feuilles...). # else $CA $FArBrE_SiMplIfIe | \ $SOR -u # Edition finale, chaque n'apparaissant qu'une seule fois (introduit le 20200423104105). # endif FilSTmpE FArBrE_SiMplIfIe FilSTmpE FArBrE_CoRrIgE FilSTmpE FArBrE_CoMplEt FilSTmpE FArBrE_PaRtIeL