This routine actually reads the data (points, triangles, normals) from the binary file and stores them.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
character(len=PathLen), | intent(in) | :: | filename |
name of the binary stl file |
||
integer, | intent(in) | :: | nNodesRead |
Number of nodes read from the file header, to compare against the actual number of nodes read |
||
integer, | intent(in) | :: | nTrisRead |
Number of triangles read from the file header, to compare against the actual number of triangles read |
||
real(kind=rk), | intent(out) | :: | nodes(:,:) |
point coordinates read from the stl-file size: 3, nPoints_total |
||
integer, | intent(out) | :: | tri_node(:,:) |
connectivity array for the triangles size: 3, nTriangles_total |
||
integer, | intent(out) | :: | iError |
error while openeing the file, or if the number of nodes/trias do not match to the ones read from the header (if error -> iError > 0) |
subroutine tem_read_stlb( filename, nNodesRead, nTrisRead, nodes, tri_node, &
& ierror )
! --------------------------------------------------------------------------
!> name of the binary stl file
character(len=PathLen),intent(in) :: filename
!> point coordinates read from the stl-file
!! size: 3, nPoints_total
real(kind=rk),intent(out) :: nodes(:,:)
!> connectivity array for the triangles
!! size: 3, nTriangles_total
integer,intent(out) :: tri_node(:,:)
!> Number of nodes read from the file header, to compare against the actual
!! number of nodes read
integer,intent(in) :: nNodesRead
!> Number of triangles read from the file header, to compare against the
!! actual number of triangles read
integer,intent(in) :: nTrisRead
!> error while openeing the file, or if the number of nodes/trias do not
!! match to the ones read from the header (if error -> iError > 0)
integer,intent(out) :: iError
! --------------------------------------------------------------------------
! buffer for reading the data from file
real(kind=single_k) :: temp(3) ! has to be single_k
character(len=80) :: header ! has to be of length 80
character(len=2) :: attribute
integer :: nTriangles ! has to be 4 byte integer
integer :: stlUnit
integer :: i
integer :: nNodes
integer :: nTris
! --------------------------------------------------------------------------
call tem_open( newunit = stlUnit, &
& file = trim(filename), &
& access = 'stream', &
& action = 'read', &
& status = 'old' )
read(stlUnit) header
read(stlUnit) nTriangles
nNodes = 0
nTris = 0
do i=1,nTriangles
! assign node coordinates
! and nodes to tris
nTris = nTris+1
read(stlUnit) temp(:) ! normal vector
read(stlUnit) temp(:) ! node 1 coords
nNodes = nNodes+1
nodes(1:3,nNodes) = real(temp(1:3),kind=rk)
tri_node(1,nTris) = nNodes
read(stlUnit) temp(:) ! node 2 coords
nNodes = nNodes+1
nodes(1:3,nNodes) = real(temp(1:3),kind=rk)
tri_node(2,nTris) = nNodes
read(stlUnit) temp(:) ! node 3 coords
nNodes = nNodes+1
nodes(1:3,nNodes) = real(temp(1:3),kind=rk)
tri_node(3,nTris) = nNodes
read(stlUnit) attribute
end do
close(stlUnit)
if ( nTris .ne. nTrisRead) then
write(logUnit(0),*) "Inconsistency found in number of triangles!"
iError = 1
endif
if ( nNodes .ne. nNodesRead) then
write(logUnit(0),*) "Inconsistency found in number of nodes!"
iError = 1
endif
end subroutine tem_read_stlb