/***********************************************************************
*
*       ELMER, A Computational Fluid Dynamics Program.
*
*       Copyright 1st April 1995 - , Center for Scientific Computing,
*                                    Finland.
*
*       All rights reserved. No part of this program may be used,
*       reproduced or transmitted in any form or by any means
*       without the written permission of CSC.
*
*                Address: Center for Scientific Computing
*                         Tietotie 6, P.O. BOX 405
*                         02101 Espoo, Finland
*                         Tel.     +358 0 457 2001
*                         Telefax: +358 0 457 2302
*                         EMail:   Jari.Jarvinen@csc.fi
************************************************************************/

/***********************************************************************
Program:    ELMER Front
Module:     ecif_input.h
Language:   C++
Date:       01.10.98
Version:    1.00
Author(s):  Martti Verho
Revisions:

Abstract:   A base class for input classes.
  These classes are used for reading CAD-specific files.

************************************************************************/

#ifndef _ECIF_INPUT_
#define _ECIF_INPUT_

#include "ecif_def.h"


// Virtual base class for input - actual class depends on type of the file to read in.

class Input
{
public:
  friend class Control;
  Input(enum ecif_modelDimension m_dim,
        ifstream& infile, char* filename);
  ~Input();
  bool doBreak();
  void eat_white(istream& strm);
  ecif_modelDimension getModelDimension() { return modelDimension;}
  static void initClass(Model* model);
  ecif_modelDimension loadMesh();
  virtual bool processMeshFileData();
  enum ecif_modelDimension  readCadFile();
  static void readFileLine(ifstream& infile, char* buffer, int linepos = 1);
  ecif_modelDimension readMeshFile();
  void reset(strstream& strm);
  void setModelDimension(int dimension);

protected:
  BodyElement* createBodyElement2D(Body* parent_body, int body_layer, ecif_EdgeGeometry_X& uP);
  BodyElement* createBodyElement2D(Body* parent_body, int body_layer, Point3& p1, Point3& p2);
  BodyElement* createBodyElement2D(Body* parent_body, int body_layer, int nof_points, Point3* points);
  virtual ecif_modelDimension findCadModelDimension() { return modelDimension;}
  virtual ecif_modelDimension findMeshModelDimension() { return modelDimension;}
  virtual ecif_modelDimension findModelDimension(ecif_modelDimension geom_dim);
  virtual bool readCadGeometry() {return false;}
  virtual bool readCadHeader() {return false;}
  virtual bool readMeshGeometry() {return false;}
  virtual bool readMeshHeader() {return false;}

private:
  BodyElement* createBodyElement2D(Body* parent_body, int body_layer, int v1_id, int v2_id);
  BodyElement* createBodyElement2D(Body* parent_body, int body_layer, int nof_vertices, int* vertex_ids);

protected:
  static Control* theControlCenter;
  static Model* model;

  ifstream& infile;
  char* infileName;
  bool bulkElementsAllocated;
  bool bndrElementsAllocated;
  bool edgeElementsAllocated;
  bool vrtxElementsAllocated;
  BoundBox meshBoundingBox;
  enum ecif_modelDimension inputDimension;
  enum ecif_modelDimension modelDimension;
  int maxExternalElementId;
  int maxExternalNodeId;
  int nofInputBoundaryElements;
  int nofInputBulkElements;
  int nofInputEdgeElements;
  int nofInputVertexElements;
  int nofElements;
  int nofNodes;
  int nofBulkElements;
  int nofBoundaryElements;
  int nofEdgeElements;
  int nofVertexElements;

} ;

#endif
