// Moshade - Compute average cross section for 3D shapes
// Copyright (C) 2018-2026 Eric Bechet - bechet@cadxfem.org
//
// See the LICENSE file for license information and contributions.
// Please report all bugs and problems to <bechet@cadxfem.org>.

#include "gm_io.h"
#include "stl_io.h" //mo_stricmp
#include <fstream>
#include <cstring>
#include <cctype>

//function that loads a GM file in memory (implementation)

void load_gm_mesh(std::string filename,tri_mesh &mesh,bool override,double szsph,double szcyl, int ns)
{
  std::ifstream fe;
  char poub[255];
  long i,j;
  npoint3 c1,c2;
  double radius,R;
  double tol=0.;
  int close;
  int sides,nele;
  fe.open( filename.c_str() );
  if ( !fe.fail() )
  {
    while ( !fe.eof() )
    {
      fe >> poub;
      if (!fe.eof())
      {
        if ( ( mo_stricmp ( poub,"cyl" ) ==0 ) )
        {
          fe >> c1[0] >> c1[1] >>  c1[2] >> c2[0] >> c2[1] >>  c2[2] >> radius >> sides >> close ;
          if (override) {radius=szcyl;sides=ns;}
          mesh.add_cylinder(c1,c2,radius,close,close,sides);
        }
        else if ( ( mo_stricmp ( poub,"sph" ) ==0 ) )
        {
          fe >> c1[0] >> c1[1] >>  c1[2] >> radius >> sides;
          if (override) {radius=szsph;sides=ns;}
          mesh.add_sphere(c1,radius,sides);
        }
        else if ( ( mo_stricmp ( poub,"helix" ) ==0 ) )
        {
          fe >> R >> radius >> nele >> sides;
          if (override) {radius=szcyl;sides=ns;}
          mesh.add_helix(R,radius,nele,sides);
        }
        else if ( ( mo_stricmp ( poub,"stl" ) ==0 ) )
        {
          fe >> poub ;
          mesh.load_stl(poub);
        }
        else if ( ( mo_stricmp ( poub,"tol" ) ==0 ) )
        {
          fe >> tol;
          mesh.settol(tol);
        }
        else
        {
//          fe >> poub;
//          fe.close();
//          throw 1;
        }
      }
    }
    fe.close();
  }
  else
  {
    throw 1;
  }
}