lirstl
C LIRSTL SOURCE CB215821 20/07/16 21:15:01 10654 SUBROUTINE LIRSTL CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C BUT: Lecture des MAILLAGES de TRI3 au format STL ASCII et BINAIRE C Les résultats sont ecrits en GIBIANE sous forme d'un MAILLAGE. C C Auteur : Clément BERTHINIER C Décembre 2016 C C Liste des Corrections : C - C - C - C C Appelé par : LIREFI C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC SMELEME -INC SMCOORD -INC CCREDLE SEGMENT ISOLID(NBSOLI) C Déclarations EXTERNAL LONG C LOCHAI dans CCNOYAU.INC CHARACTER*(LOCHAI) FicSTL CHARACTER*4 COLO4 INTEGER*4 NTRI C INTEGER*2 IATTRI REAL*4 FLO4 LOGICAL EX C***************************************************************** C Début des instructions C***************************************************************** C Initialisations I1 = 0 NTRI = 0 C IATTRI = 0 L = 0 IPT1 = 0 ISOLID = 0 NBTOTA = 0 NBSOLI = 0 ISOLI = 0 C Unite logique du fichier d'impression au format .stl et nom du fichier IUSTL = IOPER NBNN = 3 NBSOUS = 0 NBREF = 0 ITRI3 = 0 COLO4 ='TRI3' C Lecture du nom du fichier à lire IF (IERR.NE.0) RETURN C Teste l'existence du fichier INQUIRE(FILE=FicSTL,EXIST=EX) IOS=0 IF (.NOT. EX) GOTO 990 C Ouverture du fichier C Fermeture de l'unite logique au cas ou .stl CLOSE(UNIT=IUSTL,ERR=991) C Changement de dimension (si necessaire) IDIMI=IDIM IDIMF=3 IF (IDIMF .NE. IDIMI) THEN IF (IERR.NE.0) THEN RETURN ENDIF WRITE(IOIMP,*) ' Passage en DIMEnsion 3' ENDIF idimp1=IDIM+1 SEGACT,MCOORD*MOD NBANC=nbpts C***************************************************************** C Tentative de lecture du STL ASCII C***************************************************************** C Acquisition de la premiere ligne en FORMATTED OPEN (UNIT=IUSTL,STATUS='OLD',FILE=FicSTL, & IOSTAT=IOS,ERR=990,FORM='FORMATTED',ACCESS='SEQUENTIAL') C Traitement des erreurs d'ouverture des fichiers IF (IOS .NE. 0) GOTO 990 1000 FORMAT(A80) C Lecture de tout le fichier pour trouver des endsolid (Puisqu'apparemment le 'solid ' n'est pas determinant...) 10 CONTINUE IF (IPOS1 .NE. 0) THEN NBSOLI=NBSOLI+1 C PRINT *,'NBSOLID',NBSOLI,ISOLID(NBSOLI) ENDIF GOTO 10 C Fin du fichier 11 CONTINUE IF(NBSOLI .EQ. 0)THEN C PRINT *,' FORMAT ASCII non detecte, lecture binaire' CLOSE(UNIT=IUSTL,ERR=991) GOTO 8000 ELSE C PRINT *,' FORMAT ASCII detecte' REWIND IUSTL ISOLI = 0 ENDIF SEGINI,ISOLID 99 CONTINUE NBENTI = 0 C Lecture d'un Nouveau Solid GOTO 99 ELSE ISOLI=ISOLI+1 ENDIF 100 CONTINUE C Lecture en boucle pour compter le nombre d'entite IF (IPOS1 .NE. 0) THEN ISOLID(ISOLI)=NBENTI C PRINT *,'NBSOLID',ISOLI,ISOLID(ISOLI) GOTO 99 ENDIF IF (IPOS2 .NE. 0) THEN NBENTI = NBENTI + 1 NBTOTA = NBTOTA + 1 ENDIF GOTO 100 200 CONTINUE C On est arrive a la fin des Solid C PRINT *,'On a lu ',ISOLI,' Solid' IF (ISOLI .EQ. 0) GOTO 993 REWIND IUSTL C Ajustement du segment MCOORD NBPTS=NBANC + (NBTOTA * 3) SEGADJ,MCOORD NBELEM=NBTOTA SEGINI,IPT1 IPT1.ITYPEL=ITRI3 C PRINT *,'' K=0 IDEB=0 NUMLIG=0 SEGINI,SREDLE DO ISOLI=1,NBSOLI C Lecture d'un Solid NUMLIG=NUMLIG+1 DO ITR=1,ISOLID(ISOLI) C Lecture de 'facet normal' et 'outer loop' NUMLIG=NUMLIG+1 IF (IPOS .EQ. 0) THEN PRINT *,'Ligne ',NUMLIG,'On attendais : facet normal' GOTO 992 C ELSE C PRINT *,'On a lu facet normal' ENDIF NUMLIG=NUMLIG+1 IF (IPOS .EQ. 0) THEN PRINT *,'Ligne ',NUMLIG,'On attendais : outer loop' GOTO 992 C ELSE C PRINT *,'On a lu outer loop' ENDIF C Lecture des 3 coordonnées des 3 noeuds REAL32 DO INOEU=1,3 NUMLIG=NUMLIG+1 IF (IPOS .EQ. 0) THEN PRINT *,'Ligne ',NUMLIG,'On attendais : vertex' GOTO 992 C ELSE C PRINT *,'On a lu vertex' ENDIF ITRI = IDEB + ITR K=K+1 IPT1.NUM(INOEU,ITRI)=NBANC + K IPOS2 = IPOS+6 C On va lire 3 coordonnees DO IVAL=1,3 IPOS1=IPOS2 101 CONTINUE IPOS1 = IPOS1+1 GOTO 101 ENDIF NRAN =0 ICOUR=IPOS2-IPOS1-1 C PRINT *,'FLOT:',IRE,':',TEXT(1:ICOUR),':',FLOT ENDDO MCOORD.XCOOR((NBANC+K-1)*idimp1 + 4)=REAL(0.D0) ENDDO C Lecture de 'endloop' et 'endfacet' NUMLIG=NUMLIG+1 IF (IPOS .EQ. 0) THEN PRINT *,'Ligne ',NUMLIG,'On attendais : endloop' GOTO 992 C ELSE C PRINT *,'On a lu endloop' ENDIF NUMLIG=NUMLIG+1 IF (IPOS .EQ. 0) THEN PRINT *,'Ligne ',NUMLIG,'On attendais : endfacet' GOTO 992 C ELSE C PRINT *,'On a lu endfacet' ENDIF ENDDO C Lecture de 'endsolid' NUMLIG=NUMLIG+1 IF (IPOS .EQ. 0) THEN PRINT *,'Ligne ',NUMLIG,'On attendais : endsolid' GOTO 992 C ELSE C PRINT *,'On a lu endsolid' ENDIF IDEB = ITRI ENDDO SEGSUP,SREDLE 993 CONTINUE C Sortie normale ASCII SEGDES,IPT1,MCOORD IF (ISOLID .GT. 0) SEGSUP,ISOLID CLOSE(UNIT=IUSTL,ERR=991) RETURN 8000 CONTINUE C***************************************************************** C Lecture du STL binaire C***************************************************************** C Acquisition du nombre de TRIANGLES a lire UINT32 OPEN (UNIT=IUSTL,STATUS='OLD',FILE=FicSTL, & IOSTAT=IOS,ERR=990,FORM='UNFORMATTED',ACCESS='DIRECT', & RECL=4) IF (IOS .NE. 0) GOTO 990 READ(IUSTL,REC=21,ERR=992) ntri CLOSE(IUSTL,STATUS='KEEP',ERR=991) NBENTI = INT(ntri) C PRINT *,'Binaire avec ',NBENTI,'Triangles' C Ajustement du segment MCOORD NBPTS=NBANC + (NBENTI * 3) SEGADJ,MCOORD NBELEM=NBENTI SEGINI,IPT1 IPT1.ITYPEL=ITRI3 OPEN (UNIT=IUSTL,STATUS='OLD',FILE=FicSTL, & IOSTAT=IOS,ERR=990,FORM='UNFORMATTED',ACCESS='DIRECT',RECL=2) IF (IOS .NE. 0) GOTO 990 IRC=(80+4)/2+1 K=0 DO I1=1,NBENTI C Les normales ne nous interessent pas dans Cast3M, on les saute IRC=IRC + 6 C Lecture des 3 coordonnées des 3 sommets REAL32 DO INOEU=1,3 K=K+1 IPT1.NUM(INOEU,I1)=NBANC + K DO IVAL=1,3 IF (IRET .NE. 1) GOTO 992 MCOORD.XCOOR((NBANC+K-1)*idimp1 + IVAL)=REAL(FLO4) ENDDO MCOORD.XCOOR((NBANC+K-1)*idimp1 + 4)=REAL(0.D0) ENDDO C Acquisition de l'attribut UINT16 C Inutile dans Cast3M C READ(IUSTL,REC=IRC,ERR=992) IATTRI IRC=IRC+1 ENDDO C Sortie normale SEGDES,IPT1,MCOORD CLOSE(UNIT=IUSTL,ERR=991) RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C GESTION DES ERREURS CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 990 CONTINUE C ERREUR en ouvrant le fichier L1=MIN(L,40) MOTERR =FicSTL(1:L1) INTERR(1)=IOS RETURN 991 CONTINUE C ERREUR en fermant le fichier RETURN 992 CONTINUE C ERREUR en lisant le fichier INTERR(1)=IUSTL RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales