TABLE OF CONTENTS


UTI/PRE/read_obj [ Modules ]

[ Top ] [ 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