TABLE OF CONTENTS
UTI/PRE/read_obj [ Modules ]
NOM
read_obj(isol,sol,file)
DESCRIPTION
Lecture d un fichier de description de maillage au format OBJ. La connectivite entre les elements du maillage est stockee dans conn_edge (2D) et conn_face (3D) Les coordonnéees des noeuds du maillage sont stockees dans x,y et z Sur le format OBJ ==> https://fr.wikipedia.org/wiki/Objet_3D_%28format_de_fichier%29 Reading a mesh description file in OBJ format. Connectivity between mesh elements is stored in conn_edge (2D) and conn_face (3D). Mesh node coordinates are stored in x,y and z In OBJ format ==> https://fr.wikipedia.org/wiki/Objet_3D_%28format_de_fichier%29 ENTREES / INPUT isol : numero du solide / solid number sol : solide / solid file : fichier de definition du solide au format OBJ / file defining the solid in OBJ format SORTIES / OUTPUT sol : solide / solid
SOURCE
! Ce logiciel est regi par la licence [CeCILL-B] ! This software is governed by the [CeCILL-B] license !=========================== DEBUT DES DECLARATIONS ==================== !.1----- Implicit, Use use geo IMPLICIT NONE !.2----- Declaration integer, intent(in) :: isol !! numero du solide / Solid number type(solide), intent(inout) :: sol !! Solide / Solid CHARACTER*20, intent(in) :: file !! Nom du fichier definissant le solide / Name of the file defining the solid CHARACTER(len=2) :: c integer :: i,j integer :: i1,i2,i3 real(kind=kind(0.d0)) :: x,y,z !=========================== DEBUT DU CODE EXECUTABLE ================== write(*,*) 'OBST-INFO == Reading the mesh defining the obstacle ',isol,'file ', file ! Initialisations sol%nb_vert=0 sol%nb_face=0 sol%xmin_s = 1.d20 sol%xmax_s =-1.d20 sol%ymin_s = 1.d20 sol%ymax_s =-1.d20 sol%zmin_s = 1.d20 sol%zmax_s =-1.d20 i=0 j=0 ! Lecture du fichier OBJ OPEN(UNIT=10,FILE=file,STATUS='old') DO read(10,'(A2)',end=12) c SELECT CASE (c) CASE('v') ! Vertex sol%nb_vert = sol%nb_vert + 1 ! Nombre de vertex CASE('f','l') ! Face sol%nb_face = sol%nb_face + 1 ! Nombre de faces CASE DEFAULT END SELECT END DO 12 continue ! Allocation des tableaux de coordonnees et de connectivite allocate(sol%list_facette(sol%nb_face)) allocate(sol%list_vertex(sol%nb_vert)) rewind(10) DO ! Lecture du fichier OBJ read(10,'(A2)', ADVANCE='NO',end=11) c ! On lit les deux premiers caracteres de chaque ligne sans retour chariot SELECT CASE (c) ! Lecture de la table de connectivite CASE('v') ! Vertex i=i+1 read(10,*) x,y,z ! On lit 3 flottants, il s agit des coordonnees de chaque vertex sol%list_vertex(i)%x=x sol%list_vertex(i)%y=y sol%list_vertex(i)%z=z IF (x.lt.sol%xmin_s)sol%xmin_s=x IF (x.gt.sol%xmax_s)sol%xmax_s=x IF (y.lt.sol%ymin_s)sol%ymin_s=y IF (y.gt.sol%ymax_s)sol%ymax_s=y IF (z.lt.sol%zmin_s)sol%zmin_s=z IF (z.gt.sol%zmax_s)sol%zmax_s=z CASE('f') ! Face j=j+1 read(10,*) i1,i2,i3 ! On lit 3 entiers, il s agit des numeros des vertex qui composent la face sol%list_facette(j)%vertex(1)=i1 sol%list_facette(j)%vertex(2)=i2 sol%list_facette(j)%vertex(3)=i3 CASE('l') ! Line/Edge j=j+1 read(10,*) i1,i2 ! On lit 2 entiers, il s agit des numeros des vertex qui composent le segment sol%list_facette(j)%vertex(1)=i1 sol%list_facette(j)%vertex(2)=i2 sol%list_facette(j)%vertex(3)=i2 CASE DEFAULT read(10,*) ! On saute toute autre ligne END SELECT END DO 11 continue write(*,*) 'OBST-INFO == End reading the mesh defining the obstacle ', file,sol%nb_vert,sol%nb_face ! Fin de lecture du fichier OBJ CLOSE(10) ! Creation de la bounding box sol%xmin_s = sol%xmin_s-0.02d0*dabs(sol%xmin_s) sol%xmax_s = sol%xmax_s+0.02d0*dabs(sol%xmax_s) sol%ymin_s = sol%ymin_s-0.02d0*dabs(sol%ymin_s) sol%ymax_s = sol%ymax_s+0.02d0*dabs(sol%ymax_s) sol%zmin_s = sol%zmin_s-0.02d0*dabs(sol%zmin_s) sol%zmax_s = sol%zmax_s+0.02d0*dabs(sol%zmax_s) sol%id = isol !=========================== FIN DE LA ROUTINE ==================== END SUBROUTINE read_obj