/*************************************************************************************************************************************/
/* */
/* S U P P R E S S I O N D E S E G M E N T S " P E N D A N T S " : */
/* */
/* */
/* Author of '$xrv/SupPendants.11$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20150803092009). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R F A C E ' listG ' : */
/* */
/* */
/* :Debut_listG: */
/* :Fin_listG: */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_BASE
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define RECHERCHER_LES_SEGMENTS_PENDANTS \
VRAI \
/* Doit-on rechercher les segments pendants ('VRAI') ou pas ('FAUX') ce qui permet alors un */
/* comportement neutre. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E S F I C H I E R S : */
/* */
/*************************************************************************************************************************************/
#include xrv/ARITHMET.1d.I"
#include xrv/ARITHMET.21.I"
#include xrv/champs_5.41.I"
#define S_Xorg_IMPLICITE \
FZERO
#define S_Yorg_IMPLICITE \
FZERO
#define S_Zorg_IMPLICITE \
FZERO
#define S_Xext_IMPLICITE \
FZERO
#define S_Yext_IMPLICITE \
FZERO
#define S_Zext_IMPLICITE \
FZERO
gGENERATION_D_UN_FICHIER(fichier_LISTE_S_Xorg,liste_initiale_des_S_Xorg);
gGENERATION_D_UN_FICHIER(fichier_LISTE_S_Yorg,liste_initiale_des_S_Yorg);
gGENERATION_D_UN_FICHIER(fichier_LISTE_S_Zorg,liste_initiale_des_S_Zorg);
gGENERATION_D_UN_FICHIER(fichier_LISTE_S_Xext,liste_initiale_des_S_Xext);
gGENERATION_D_UN_FICHIER(fichier_LISTE_S_Yext,liste_initiale_des_S_Yext);
gGENERATION_D_UN_FICHIER(fichier_LISTE_S_Zext,liste_initiale_des_S_Zext);
/* Definition en memoire des fichiers de coordonnees cartesiennes du segment '1'. */
#define ELEMENT_DU_FICHIER_LISTE_S_Xorg(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_S_Xorg,index)
#define ELEMENT_DU_FICHIER_LISTE_S_Yorg(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_S_Yorg,index)
#define ELEMENT_DU_FICHIER_LISTE_S_Zorg(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_S_Zorg,index)
#define ELEMENT_DU_FICHIER_LISTE_S_Xext(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_S_Xext,index)
#define ELEMENT_DU_FICHIER_LISTE_S_Yext(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_S_Yext,index)
#define ELEMENT_DU_FICHIER_LISTE_S_Zext(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_S_Zext,index)
/* Acces a un element courant des fichiers de coordonnees cartesiennes du segment '1'. */
#define CONSERVER \
FLOT(VRAI)
#define SUPPRIMER \
NOTL(CONSERVER)
#define CONSERVER_IMPLICITE \
CONSERVER
gGENERATION_D_UN_FICHIER(fichier_segments_a_conserver,liste_initiale_des_segments_a_conserver);
#define ELEMENT_DU_FICHIER_SEGMENTS_A_CONSERVER(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_segments_a_conserver,index)
/* Acces a un element courant du fichier donnant les segments a conserver. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* S U P P R E S S I O N D E S E G M E N T S " P E N D A N T S " : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Logical,INIT(rechercher_les_segments_pendants,RECHERCHER_LES_SEGMENTS_PENDANTS));
/* Doit-on rechercher les segments pendants ('VRAI') ou pas ('FAUX') ce qui permet alors un */
/* comportement neutre. */
#include xrv/ARITHMET.22.I"
#include xci/valeurs.03.I"
/*..............................................................................................................................*/
#include xrv/champs_5.1A.I"
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements
,BLOC(VIDE;)
,BLOC(Bblock
PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers");
Eblock
)
);
PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01;
PROKESF_ARGUMENT_FICHIER("LISTE_S_Xorg="
,fichier_LISTE_S_Xorg
,liste_initiale_des_S_Xorg
,S_Xorg_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_S_Yorg="
,fichier_LISTE_S_Yorg
,liste_initiale_des_S_Yorg
,S_Yorg_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_S_Zorg="
,fichier_LISTE_S_Zorg
,liste_initiale_des_S_Zorg
,S_Zorg_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_S_Xext="
,fichier_LISTE_S_Xext
,liste_initiale_des_S_Xext
,S_Xext_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_S_Yext="
,fichier_LISTE_S_Yext
,liste_initiale_des_S_Yext
,S_Yext_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_S_Zext="
,fichier_LISTE_S_Zext
,liste_initiale_des_S_Zext
,S_Zext_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
GET_ARGUMENT_L("segments_pendants=""inter=",rechercher_les_segments_pendants);
GET_ARGUMENT_N("neutre=",rechercher_les_segments_pendants);
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
GET_ARGUMENT_I("exemplaires=",nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes);
)
);
iGENERATION_D_UN_FICHIER(liste_initiale_des_segments_a_conserver,CONSERVER_IMPLICITE);
begin_nouveau_block
Bblock
DEFV(Logical,INIT(iterer_recursivement_les_suppressions,IL_FAUT(rechercher_les_segments_pendants)));
DEFV(Int,INIT(compteur_de_suppressions,UNDEF));
/* Controle des iterations... */
DEFV(Int,INIT(indexS1,UNDEF));
/* Index des segments 'S1'. */
Tant(IL_FAUT(iterer_recursivement_les_suppressions))
Bblock
EGAL(compteur_de_suppressions,ZERO);
DoIn(indexS1,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)
Bblock
DEFV(Int,INIT(indexS2,UNDEF));
/* Index des segments 'S2'. */
DEFV(Positive,INIT(compteur_d_occurence_de_l_origine___d_un_segmentS1,ZERO));
DEFV(Positive,INIT(compteur_d_occurence_de_l_extremite_d_un_segmentS1,ZERO));
/* Compteur d'occurence de l'une des extremites du segment 'S1'. */
Test(EST_VRAI(ELEMENT_DU_FICHIER_SEGMENTS_A_CONSERVER(indexS1)))
Bblock
DoIn(indexS2,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)
/* On notera le 20150804103218, que l'on ne peut pas optimiser le 'DoIn(...)' ci-dessus en */
/* remplacant 'PREMIER_ELEMENT_D_UN_FICHIER' par 'SUCC(indexS1)' a cause du test relatif a */
/* 'ELEMENT_DU_FICHIER_SEGMENTS_A_CONSERVER(indexS2)' ci-dessous... */
Bblock
Test(IFNE(indexS2,indexS1))
Bblock
Test(EST_VRAI(ELEMENT_DU_FICHIER_SEGMENTS_A_CONSERVER(indexS2)))
Bblock
Test(IFOU(IFEQ_Rpoints3D(ELEMENT_DU_FICHIER_LISTE_S_Xorg(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Yorg(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Zorg(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Xorg(indexS2)
,ELEMENT_DU_FICHIER_LISTE_S_Yorg(indexS2)
,ELEMENT_DU_FICHIER_LISTE_S_Zorg(indexS2)
)
,IFEQ_Rpoints3D(ELEMENT_DU_FICHIER_LISTE_S_Xorg(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Yorg(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Zorg(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Xext(indexS2)
,ELEMENT_DU_FICHIER_LISTE_S_Yext(indexS2)
,ELEMENT_DU_FICHIER_LISTE_S_Zext(indexS2)
)
)
)
Bblock
INCR(compteur_d_occurence_de_l_origine___d_un_segmentS1,I);
/* L'origine du segment 'S1' est utilisee ailleurs par un segment 'S2' (different */
/* de 'S1' evidemment...). */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFOU(IFEQ_Rpoints3D(ELEMENT_DU_FICHIER_LISTE_S_Xext(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Yext(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Zext(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Xorg(indexS2)
,ELEMENT_DU_FICHIER_LISTE_S_Yorg(indexS2)
,ELEMENT_DU_FICHIER_LISTE_S_Zorg(indexS2)
)
,IFEQ_Rpoints3D(ELEMENT_DU_FICHIER_LISTE_S_Xext(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Yext(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Zext(indexS1)
,ELEMENT_DU_FICHIER_LISTE_S_Xext(indexS2)
,ELEMENT_DU_FICHIER_LISTE_S_Yext(indexS2)
,ELEMENT_DU_FICHIER_LISTE_S_Zext(indexS2)
)
)
)
Bblock
INCR(compteur_d_occurence_de_l_extremite_d_un_segmentS1,I);
/* L'extremite du segment 'S1' est utilisee ailleurs par un segment 'S2' (different */
/* de 'S1' evidemment...). */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
EDoI
Test(IFOU(IZEQ(compteur_d_occurence_de_l_origine___d_un_segmentS1)
,IZEQ(compteur_d_occurence_de_l_extremite_d_un_segmentS1)
)
)
Bblock
EGAL(ELEMENT_DU_FICHIER_SEGMENTS_A_CONSERVER(indexS1),SUPPRIMER);
INCR(compteur_de_suppressions,I);
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
EDoI
Test(IZEQ(compteur_de_suppressions))
Bblock
EGAL(iterer_recursivement_les_suppressions,FAUX);
/* Lorsqu'aucun segment n'a ete supprime, on arrete le processus... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETan
DoIn(indexS1,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)
Bblock
Test(IFEQ(ELEMENT_DU_FICHIER_SEGMENTS_A_CONSERVER(indexS1),CONSERVER))
Bblock
CAL2(Prin0(" X1="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_S_Xorg(indexS1));
CAL2(Prin0(" Y1="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_S_Yorg(indexS1));
CAL2(Prin0(" Z1="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_S_Zorg(indexS1));
CAL2(Prin0(" X2="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_S_Xext(indexS1));
CAL2(Prin0(" Y2="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_S_Yext(indexS1));
CAL2(Prin0(" Z2="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_S_Zext(indexS1));
CAL2(Prin0("\n"));
Eblock
ATes
Bblock
Eblock
ETes
Eblock
EDoI
Eblock
end_nouveau_block
lGENERATION_D_UN_FICHIER(liste_initiale_des_segments_a_conserver,CONSERVER_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_S_Zext,S_Zext_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_S_Yext,S_Yext_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_S_Xext,S_Xext_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_S_Zorg,S_Zorg_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_S_Yorg,S_Yorg_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_S_Xorg,S_Xorg_IMPLICITE);
RETU_Commande;
Eblock
ECommande