/*************************************************************************************************************************************/ /* */ /* 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