Example showing drawing using GINO

!     Program GINOEX5
! **********************************************
! Copyright Bradly Associates Limited
!        GINO  Version 6.0
! **********************************************
!
!  Generate_viewing facilities
!
use gino_f90
type (GDIM) paper
type (GLIMIT3) :: picture = GLIMIT3(0.0,1000.0,0.0,750.0,-1000.0,1000.0)
type (GLIMIT) :: viewport
type (GLIMIT) :: frame1 = GLIMIT(15.0,985.0,65.0,735.0)
type (GLIMIT) :: frame2 = GLIMIT(20.0,980.0,70.0,730.0)
type (GLIMIT) :: window1 = GLIMIT(20.0,500.0,400.0,730.0)
type (GLIMIT) :: window2 = GLIMIT(500.0,980.0,400.0,730.0)
type (GLIMIT) :: window3 = GLIMIT(20.0,499.0,70.0,375.0)
type (GLIMIT) :: window4 = GLIMIT(500.0,980.0,70.0,375.0)
!
      call gOpenGino
      call xxxxx
      call gSetDeviceTitle('GINO Example 5 - Version 6.0')
      call gEnqDrawingLimits(paper,ipapty)
      viewport%xmin=0.0
      viewport%xmax=paper%xpap
      viewport%ymin=0.0
      viewport%ymax=paper%ypap
      call gSetViewport3D(picture,viewport)
      call gSetClippingMode(GHARD)
      call gSetWindowMode(GON2D)
!
!  Draw dividing lines,frame and title.
!
      call gSetLineColour(GCYAN)
      call gMoveTo2D(500.0,70.0)
      call gDrawLineTo2D(500.0,730.0)
      call gMoveTo2D(20.0,400.0)
      call gDrawLineTo2D(980.0,400.0)
      call gFillRect(GHOLLOW,GCURRENT,frame1)
      call gFillRect(GHOLLOW,GCURRENT,frame2)
      call gMoveTo2D(260.0,30.0)
      call gSetSoftChars
      call gSetCharSize(20.0,20.0)
      call gDisplayStr('GINO Example Program 5')
!
!  Set generate_viewing parameters.
!
      xmax=875.0
      ymax=550.0
      zmax=50.0
      xmin=125.0
      ymin=430.0
      zmin=0.0
      xc=0.5*(xmax+xmin)
      yc=0.5*(ymax+ymin)
      zc=0.5*(zmax+zmin)
      delx=xmax-xc
      dely=ymax-yc
      delz=zmax-zc
      radius=sqrt(delx**2+dely**2+delz**2)
!
! draw generate_view 1
!
      call gSetWindow2D(window1)
      call gMoveViewCentre(50.0)
      call gDefinePerspView(xc,yc-60.0,-200.0,0.0,0.1,0.6,100.0)
      call gUpdateView
      call bridge
!
! draw generate_view 2
!
      call gInitView
      call gSetWindow2D(window2)
      call gDefineParallelView(0.5,-0.1,0.5,xc,yc,zc)
      call gUpdateView
      call bridge
!
! draw generate_view 3
!
      call gInitView
      call gSetWindow2D(window3)
      call gDefinePerspView(150.0,500.0,-50.0,0.5,-0.1,0.5,radius)
      call gSetViewPlaneDistance(200.0)
      call gUpdateView
      call bridge
!
! draw generate_view 4
!
      call gSetClippingMode(GSOFT)
      call gInitView
      call gSetWindow2D(window4)
      call gSetViewEyeDistance(100.0)
      call gDefineSphericalView(xc,yc,zc,255.0,1.0,0.0,0.0,100.0)
      call gUpdateView
      call bridge
!
!  End gino
!
      call gSuspendDevice
      call gCloseGino
      stop
      end
!*********************************************************************
      subroutine bridge
!*********************************************************************
! draw bridge.
!*********************************************************************
use gino_f90
      do i=1,2
        call gMoveTo3D(125.0+(real(i-1)*377.0),478.0,0.0)
        call cubby3(187.0,3.0,30.0)
        call span(1.0)
        call gMoveTo3D(125.0+(real(i-1)*377.0),478.0,30.0)
        call span(1.0)
        call gMoveTo3D(312.0+(real(i-1)*377.0),450.0,0.0)
        call pillar
        call gMoveTo3D(502.0+(real(i-1)*377.0),478.0,0.0)
        call cubby3(-187.0,3.0,30.0)
        call span(-1.0)
        call gMoveTo3D(502.0+(real(i-1)*377.0),478.0,30.0)
        call span(-1.0)
      end do
      return
      end
!********************************************************************
      subroutine span(dir)
!********************************************************************
!  Routine to draw span of wires along x axis.
!********************************************************************
use gino_f90
      height(i)=256.0-sqrt(256.0**2-real(i)**2)
      d=dir/abs(dir)
      call gEnqLineColour(icol)
      call gSetLineColour(GORANGE)
      call gDrawArcBy2D(0.0,256.0,187.0*d,height(187),int(d+1.0/2.0))
      call gSetBrokenLine(GDOTTED)
      do i = 187,30,-15
        ht1 = height(i)
        ht2 = height(i-15)
        call gDrawLineBy2D(-7.5*d,-ht1)
        call gDrawLineBy2D(-7.5*d,ht2)
      end do
      call gSetLineColour(icol)
      call gSetBrokenLine(GSOLID)
      return
      end
!********************************************************************
      subroutine pillar
!********************************************************************
!  Draw bridge pillar at current position.
!********************************************************************
use gino_f90
      call cubby3(3.0,115.0,30.0)
      call gMoveBy3D(0.0,3.0,3.0)
      call cubby3(3.0,25.0,24.0)
      call gMoveBy3D(0.0,28.0,0.0)
      call cubby3(3.0,25.0,24.0)
      call gMoveBy3D(0.0,28.0,0.0)
      call cubby3(3.0,25.0,24.0)
      call gMoveBy3D(0.0,28.0,0.0)
      call cubby3(3.0,25.0,24.0)
      call gMoveBy3D(-10.0,-107.0,-8.0)
      call cubby3(23.0,20.0,40.0)
      return
      end
!******************************************************************
      subroutine cubby3(dx,dy,dz)
!******************************************************************
!  Draw a cubiod with relative co-ordinates.
!******************************************************************
use gino_f90
      call gDrawLineBy3D(dx,0.0,0.0)
      call gDrawLineBy3D(0.0,dy,0.0)
      call gDrawLineBy3D(-dx,0.0,0.0)
      call gDrawLineBy3D(0.0,0.0,dz)
      call gDrawLineBy3D(dx,0.0,0.0)
      call gDrawLineBy3D(0.0,-dy,0.0)
      call gDrawLineBy3D(-dx,0.0,0.0)
      call gDrawLineBy3D(0.0,dy,0.0)
      call gMoveBy3D(dx,0.0,0.0)
      call gDrawLineBy3D(0.0,0.0,-dz)
      call gMoveBy3D(-dx,-dy,dz)
      call gDrawLineBy3D(0.0,0.0,-dz)
      call gDrawLineBy3D(0.0,dy,0.0)
      call gMoveBy3D(dx,-dy,dz)
      call gDrawLineBy3D(0.0,0.0,-dz)
      call gMoveBy3D(-dx,0.0,0.0)
      return
      end