#!/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