//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
// 
//  This library is free software; you can redistribute it and/or 
//  modify it under the terms of the GNU Lesser General Public 
//  License as published by the Free Software Foundation; either 
//  version 2.1 of the License. 
// 
//  This library is distributed in the hope that it will be useful, 
//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
//  Lesser General Public License for more details. 
// 
//  You should have received a copy of the GNU Lesser General Public 
//  License along with this library; if not, write to the Free Software 
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
// 
//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
//
//
//
//  File   : SMESH_Gen.idl
//  Author : Paul RASCLE, EDF
//  $Header$

#ifndef _SMESH_GEN_IDL_
#define _SMESH_GEN_IDL_

#include "SALOME_Exception.idl"
#include "SALOME_Component.idl"
#include "SALOMEDS.idl"

#include "GEOM_Gen.idl"

#include "SMESH_Mesh.idl"
#include "SMESH_Hypothesis.idl"

module SMESH
{
  typedef sequence<GEOM::GEOM_Object> object_array;
  typedef sequence<SMESH_Mesh> mesh_array;

  interface FilterManager;
  interface SMESH_Pattern;

  interface SMESH_Gen : Engines::Component, SALOMEDS::Driver
  {

    FilterManager CreateFilterManager();

    SMESH_Pattern GetPattern();

    /*!
      Set the current study
     */
    void SetCurrentStudy( in SALOMEDS::Study theStudy );

    /*!
      Get the current study
     */
    SALOMEDS::Study GetCurrentStudy();

    /*!
     * Create a hypothesis that can be shared by differents parts of the mesh.
     * An hypothesis is either:
     * - a method used to generate or modify a part of the mesh (algorithm).
     * - a parameter or a law used by an algorithm.
     * Algorithms are 1D, 2D or 3D.
     */
    SMESH_Hypothesis CreateHypothesis( in string theHypName,
				       in string theLibName )
      raises ( SALOME::SALOME_Exception );

    /*!
     * Create a Mesh object, given a geometry shape.
     * Mesh is created empty (no points, no elements).
     * Shape is explored via GEOM_Client to create local copies.
     * of TopoDS_Shapes and bind CORBA references of shape & subshapes
     * with TopoDS_Shapes
     */
    SMESH_Mesh CreateMesh( in GEOM::GEOM_Object theObject )
      raises ( SALOME::SALOME_Exception );
    
    /*!
     * Create Mesh object importing data from given UNV file
     */
    SMESH_Mesh CreateMeshesFromUNV( in string theFileName )
      raises ( SALOME::SALOME_Exception );

    /*!
     * Create Mesh object(s) importing data from given MED file
     */
     mesh_array CreateMeshesFromMED( in string theFileName,
				     out SMESH::DriverMED_ReadStatus theStatus )
       raises ( SALOME::SALOME_Exception );

    /*!
     * Create Mesh object importing data from given STL file
     */
    SMESH_Mesh CreateMeshesFromSTL( in string theFileName )
      raises ( SALOME::SALOME_Exception );

    /*!
     * Create a Mesh object, without a geometry shape reference
     */
//      SMESH_Mesh NewEmpty()
//        raises ( SALOME::SALOME_Exception );

    /*!
     * Mesh a subShape. 
     * First, verify list of hypothesis associated with the subShape,
     * return NOK if hypothesis are not sufficient
     */
    boolean Compute( in SMESH_Mesh       theMesh, 
		     in GEOM::GEOM_Object theSubObject )
      raises ( SALOME::SALOME_Exception );

    /*!
     * 
     */

    boolean IsReadyToCompute( in SMESH_Mesh       theMesh, 
			      in GEOM::GEOM_Object theSubObject )
      raises ( SALOME::SALOME_Exception );

    /*!
     * 
     */
    long_array GetSubShapesId( in GEOM::GEOM_Object theMainObject,
			     in object_array theListOfSubObjects )
       raises ( SALOME::SALOME_Exception );
    
    /*!
     * 
     */
    //    long_array GetSubMeshesState( in object_array theListOfSubShape )
    //  raises ( SALOME::SALOME_Exception );
    
  };

};

#endif