//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
//
//  Copyright (C) 2003-2007  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.salome-platform.org/ or email : webmaster.salome@opencascade.com
//

//  File   : SMESH_Mesh.idl
//  Author : Paul RASCLE, EDF
//
#ifndef _SMESH_MESH_IDL_
#define _SMESH_MESH_IDL_

#include "SALOME_Exception.idl"
#include "SALOME_GenericObj.idl"
#include "GEOM_Gen.idl"
#include "MED.idl"

module SMESH
{
  interface SMESH_Hypothesis;
  typedef sequence<SMESH_Hypothesis> ListOfHypothesis;
  interface SMESH_GroupBase;
  typedef sequence<SMESH_GroupBase> ListOfGroups;

  typedef sequence<double    > double_array ;
  typedef sequence<long      > long_array ;
  typedef sequence<string    > string_array ;
  typedef sequence<long_array> array_of_long_array ;

  enum log_command
    {
      ADD_NODE,
      ADD_EDGE,
      ADD_TRIANGLE,
      ADD_QUADRANGLE,
      ADD_POLYGON,
      ADD_TETRAHEDRON,
      ADD_PYRAMID,
      ADD_PRISM,
      ADD_HEXAHEDRON,
      ADD_POLYHEDRON,
      REMOVE_NODE,
      REMOVE_ELEMENT,
      MOVE_NODE,
      CHANGE_ELEMENT_NODES,
      CHANGE_POLYHEDRON_NODES,
      RENUMBER,
      CLEAR_MESH,
      ADD_QUADEDGE,
      ADD_QUADTRIANGLE,
      ADD_QUADQUADRANGLE,
      ADD_QUADTETRAHEDRON,
      ADD_QUADPYRAMID,
      ADD_QUADPENTAHEDRON,
      ADD_QUADHEXAHEDRON,
      ADD_ELEM0D
    };

  struct log_block
  {
    long commandType;
    long number;
    double_array coords;
    long_array indexes;
  };

  struct PointStruct { double x;
  		       double y;
  		       double z; } ;

  typedef sequence<PointStruct> nodes_array;

  struct DirStruct   { PointStruct PS ; } ;          // analog to Occ Direction

  struct AxisStruct  { double x;
  		       double y;
  		       double z;
  		       double vx;
  		       double vy;
  		       double vz; } ;

  /*!
   * Node location on a shape
   */
  struct NodePosition {
    long             shapeID;
    GEOM::shape_type shapeType;
    double_array     params; // [U] on EDGE, [U,V] on FACE, [] on the rest shapes
  };

  /*!
   * Enumeration for element type, like in SMDS
   */
  enum ElementType
  {
    ALL,
    NODE,
    EDGE,
    FACE,
    VOLUME,
    ELEM0D
  };

  /*!
   * Enumeration for element geometry type, like in SMDS
   */
  enum GeometryType
  {
    Geom_POINT,
    Geom_EDGE,
    Geom_TRIANGLE,
    Geom_QUADRANGLE,
    Geom_POLYGON,
    Geom_TETRA,
    Geom_PYRAMID,
    Geom_HEXA,
    Geom_PENTA,
    Geom_POLYHEDRA
  };
  
  /*!
   * ElementOrder points out entities of what order are requested
   */
  enum ElementOrder {
    ORDER_ANY,          /*! entities of any order */
    ORDER_LINEAR,       /*! entities of 1st order */
    ORDER_QUADRATIC     /*! entities of 2nd order */
  };


  /*!
   * Enumeration of entity type uses in mesh info array,
   *  and should be synchronised with enum in SMDS  
   */
  enum EntityType
  {
    Entity_Node,
    Entity_0D,
    Entity_Edge,
    Entity_Quad_Edge,
    Entity_Triangle,
    Entity_Quad_Triangle,
    Entity_Quadrangle,
    Entity_Quad_Quadrangle,
    Entity_Polygon,
    Entity_Quad_Polygon,
    Entity_Tetra,
    Entity_Quad_Tetra,
    Entity_Pyramid,
    Entity_Quad_Pyramid,
    Entity_Hexa,
    Entity_Quad_Hexa,
    Entity_Penta,
    Entity_Quad_Penta,
    Entity_Polyhedra,
    Entity_Quad_Polyhedra,
    Entity_Last
  };


  /*!
   * Enumeration for hypothesis status (used by AddHypothesis() and RemoveHypothesis() methods)
   */
  enum Hypothesis_Status // in the order of severity
  {
    HYP_OK,
    HYP_MISSING,      // algo misses a hypothesis
    HYP_CONCURENT,    // several applicable hypotheses
    HYP_BAD_PARAMETER,// hypothesis has a bad parameter value
    HYP_HIDDEN_ALGO,  // an algo is hidden by an upper dim algo generating all-dim elements
    HYP_HIDING_ALGO,  // an algo hides lower dim algos by generating all-dim elements
    HYP_UNKNOWN_FATAL,//  --- all statuses below should be considered as fatal
                      //      for Add/RemoveHypothesis operations
    HYP_INCOMPATIBLE, // hypothesis does not fit algo
    HYP_NOTCONFORM,   // not conform mesh is produced appling a hypothesis
    HYP_ALREADY_EXIST,// such hypothesis already exist
    HYP_BAD_DIM,      // bad dimension
    HYP_BAD_SUBSHAPE, // shape is neither the main one, nor its subshape, nor a group
    HYP_BAD_GEOMETRY, // geometry mismatches algorithm's expectation
    HYP_NEED_SHAPE    // algorithm can work on shape only
  };

  /*!
   * Enumeration for DriverMED read status (used by ImportMEDFile() method)
   */
  enum DriverMED_ReadStatus // in the order of severity
  {
    DRS_OK,
    DRS_EMPTY,          // a MED file contains no mesh with the given name
    DRS_WARN_RENUMBER,  // a MED file has overlapped ranges of element numbers,
                        // so the numbers from the file are ignored
    DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data
    DRS_FAIL            // general failure (exception etc.)
  };

  /*!
   * Enumeration for DriverMED (used by Perform() method)
   */
  enum MED_VERSION // in the order of severity
  {
    MED_V2_1,
    MED_V2_2
  };

  typedef sequence<log_block> log_array;


  /*!
   * Auxilary flags for advanced extrusion.
   * BOUNDARY: create or not boundary for result of extrusion
   * SEW:      try to use existing nodes or create new nodes in any case
   */
  const long EXTRUSION_FLAG_BOUNDARY = 1;
  const long EXTRUSION_FLAG_SEW = 2;
  
  /*!
   * Structure used in mesh edit preview data (MeshPreviewStruct)
   */
  struct ElementSubType { ElementType SMDS_ElementType;
                          boolean     isPoly;
                          long        nbNodesInElement; };

  typedef sequence<ElementSubType> types_array;

  /*!
   * Structure containing mesh edit preview data
   */
  struct MeshPreviewStruct { nodes_array nodesXYZ;
                             long_array  elementConnectivities;
                             types_array elementTypes; };

  interface SMESH_IDSource
  {
    /*!
     * Returns a sequence of all element IDs
     */
    long_array GetIDs();

    /*!
     * Returns statistic of mesh elements
     * Result array of number enityties
     */
    long_array GetMeshInfo();
  };

  interface SMESH_Group;
  interface SMESH_GroupOnGeom;
  interface SMESH_subMesh;
  interface SMESH_MeshEditor;

  typedef sequence<SMESH_subMesh>     submesh_array;
  typedef sequence<submesh_array>     submesh_array_array;

  interface SMESH_Mesh : SALOME::GenericObj, SMESH_IDSource
  {
    /*!
     * Return true if there is a geometry to be meshed
     */
    boolean HasShapeToMesh()
      raises (SALOME::SALOME_Exception);

    /*!
     * Get geom shape to mesh. A result sould not be nil. Use HasShapeToMesh()
     * to know if a returned shape 
     */
    GEOM::GEOM_Object GetShapeToMesh()
      raises (SALOME::SALOME_Exception);

    /*!
     * Remove all nodes and elements
     */
    void Clear()
      raises (SALOME::SALOME_Exception);

    /*!
     * Remove all nodes and elements of submesh
     */
    void ClearSubMesh(in long ShapeID)
      raises (SALOME::SALOME_Exception);

    /*!
     * Get the subMesh object associated to a subShape. The subMesh object
     * gives access to nodes and elements IDs.
     * SubMesh will be used instead of SubShape in a next idl version to
     * adress a specific subMesh...
     */
    SMESH_subMesh GetSubMesh(in GEOM::GEOM_Object aSubObject, in string name)
      raises (SALOME::SALOME_Exception);

    /*!
     * Remove a submesh
     */
    void RemoveSubMesh(in SMESH_subMesh aSubMesh)
      raises (SALOME::SALOME_Exception);


    /*!
     * Create a group
     */
    SMESH_Group CreateGroup( in ElementType elem_type,
			     in string name )
      raises (SALOME::SALOME_Exception);

    /*!
     * Create a group from geometry group
     */
    SMESH_GroupOnGeom CreateGroupFromGEOM( in ElementType elem_type,
                                          in string name,
                                          in GEOM::GEOM_Object theGeomObject )
      raises (SALOME::SALOME_Exception);

    /*!
     * Remove a group
     */
    void RemoveGroup(in SMESH_GroupBase aGroup)
      raises (SALOME::SALOME_Exception);

    /*!
     *  Remove group with its contents
     */
    void RemoveGroupWithContents( in SMESH_GroupBase aGroup )
      raises (SALOME::SALOME_Exception);

    /*!
     *  Get the list of groups existing in the mesh
     */
    ListOfGroups GetGroups()
      raises (SALOME::SALOME_Exception);

    /*!
     *  Get number of groups existing in the mesh
     */
    long NbGroups()
      raises (SALOME::SALOME_Exception);

    /*!
     * Union of two groups
     *    New group is created. All mesh elements that are
     *    present in initial groups are added to the new one
     */
    SMESH_Group UnionGroups (in SMESH_GroupBase aGroup1,
                             in SMESH_GroupBase aGroup2,
                             in string          name )
      raises (SALOME::SALOME_Exception);
      
    /*!
     * Union of list of groups
     * New group is created. All mesh elements that are
     * present in initial groups are added to the new one
     */
    SMESH_Group UnionListOfGroups (in ListOfGroups aListOfGroups,
                                   in string       name )
      raises (SALOME::SALOME_Exception);

    /*!
     *  Intersection of two groups
     *  New group is created. All mesh elements that are
     *  present in both initial groups are added to the new one.
     */
    SMESH_Group IntersectGroups (in SMESH_GroupBase aGroup1,
                                 in SMESH_GroupBase aGroup2,
                                 in string          name )
      raises (SALOME::SALOME_Exception);
      
    /*!
     *  Intersection of list of groups
     *  New group is created. All mesh elements that are
     *  present in all initial groups simultaneously are added to the new one.
     */
    SMESH_Group IntersectListOfGroups (in ListOfGroups aListOfGroups,
                                       in string       name)
      raises (SALOME::SALOME_Exception);

    /*!
     *  Cut of two groups
     *  New group is created. All mesh elements that are present in
     *  main group but do not present in tool group are added to the new one
     */
    SMESH_Group CutGroups (in SMESH_GroupBase aMainGroup,
                           in SMESH_GroupBase aToolGroup,
                           in string          name )
      raises (SALOME::SALOME_Exception);
      
    /*!
     *  Cut of lists of groups
     *  New group is created. All mesh elements that are present in
     *  main groups but do not present in tool groups are added to the new one
     */
    SMESH_Group CutListOfGroups (in ListOfGroups aMainGroups,
                                 in ListOfGroups aToolGroups,
                                 in string       name)
      raises (SALOME::SALOME_Exception);
      
    /*!
     *  Create groups of entities from existing groups of superior dimensions 
     *  New group is created. System 
     *  1) extracts all nodes from each group,
     *  2) combines all elements of specified dimension laying on these nodes.
     */
    SMESH_Group CreateDimGroup( in ListOfGroups aListOfGroups,
                                in ElementType  anElemType,
                                in string       name )
      raises (SALOME::SALOME_Exception);

    /*!
     * Convert group on geometry into standalone group
     */
    SMESH_Group ConvertToStandalone( in SMESH_GroupOnGeom theGeomGroup )
      raises (SALOME::SALOME_Exception);

    /*!
     * Add hypothesis to the mesh, under a particular subShape
     * (or the main shape itself)
     * The Add method is only used to prepare the build of the mesh and store
     * the algorithms and associated parameters.
     * Actual job of mesh the shape is done by MESH_Gen.
     * @params
     * - aSubShape : subShape obtained by a shape explode in GEOM
     *   (or main shape)
     * - anHyp : hypothesis object
     * @return
     * - OK if the hypothesis is compatible with the subShape
     *   (and all previous hypothesis on the subShape)
     * - NOK if the hypothesis is not compatible with the subShape
     *   (or one previous hypothesis on the subShape)
     * raises exception if hypothesis has not been created
     */
    Hypothesis_Status AddHypothesis(in GEOM::GEOM_Object aSubObject,
				    in SMESH_Hypothesis anHyp)
      raises (SALOME::SALOME_Exception);
//     boolean AddHypothesis(in SMESH_subMesh aSubMesh, in SMESH_Hypothesis anHyp)
//       raises (SALOME::SALOME_Exception);

    /*!
     * Remove an hypothesis previouly added with AddHypothesis.
     */
    Hypothesis_Status RemoveHypothesis(in GEOM::GEOM_Object aSubObject,
				       in SMESH_Hypothesis anHyp)
      raises (SALOME::SALOME_Exception);
//     boolean RemoveHypothesis(in SMESH_subMesh aSubMesh,
// 			     in SMESH_Hypothesis anHyp)
//       raises (SALOME::SALOME_Exception);

    /*!
     * Get the list of hypothesis added on a subShape
     */
    ListOfHypothesis GetHypothesisList(in GEOM::GEOM_Object aSubObject)
      raises (SALOME::SALOME_Exception);
//     ListOfHypothesis GetHypothesisList(in SMESH_subMesh aSubMesh)
//       raises (SALOME::SALOME_Exception);

    /*!
     * Get the log of nodes and elements added or removed since previous
     * clear of the log.
     * @params
     * - clearAfterGet : log is emptied after Get (safe if concurrents access)
     */
    //    string_array GetLog(in boolean clearAfterGet)
    //      raises (SALOME::SALOME_Exception);
    log_array GetLog(in boolean clearAfterGet)
      raises (SALOME::SALOME_Exception);

    /*!
     * Clear the log of nodes and elements added or removed since previous
     * clear. Must be used immediately after GetLog if clearAfterGet is false.
     */
    void ClearLog()
      raises (SALOME::SALOME_Exception);

    /*!
     * Toggle auto color mode on the object.
     * @params
     * - theAutoColor : flag which toggles auto color mode.
     */
    void SetAutoColor(in boolean theAutoColor)
      raises (SALOME::SALOME_Exception);

    /*!
     * Get flag of object's auto color mode.
     */
    boolean GetAutoColor()
      raises (SALOME::SALOME_Exception);

    /*!
     * Get the internal Id
     */
    long GetId();

    /*!
     * Get the study Id
     */
    long GetStudyId();

    /*!
     * Obtain instance of SMESH_MeshEditor
     */
    SMESH_MeshEditor GetMeshEditor()
      raises (SALOME::SALOME_Exception);

    /*!
     * Return SMESH_MeshEditor that would not modify the mesh but
     * fill MeshPreviewStruct
     */
    SMESH_MeshEditor GetMeshEditPreviewer()
      raises (SALOME::SALOME_Exception);

    /*! Check group names for duplications.
     *  Consider maximum group name length stored in MED file.
     */
    boolean HasDuplicatedGroupNamesMED();

    /*!
     * Export Mesh to different MED Formats
     * @params
     * - auto_groups : boolean parameter for creating/not creating
     *   the groups Group_On_All_Nodes, Group_On_All_Faces, ... ;
     *   the typical use is auto_groups=false.
     * - theVersion : define the version of format of MED file, that will be created
     * - overwrite : boolean parameter for overwriting/not overwriting the file, if it exists
     */
    void ExportToMEDX( in string file, in boolean auto_groups, in MED_VERSION theVersion, in boolean overwrite )
      raises (SALOME::SALOME_Exception);

    /*!
     * Export Mesh to different MED Formats
     * Works, just the same as ExportToMEDX, with overwrite parameter equal to true.
     * The method is kept in order to support old functionality
     */
    void ExportToMED( in string file, in boolean auto_groups, in MED_VERSION theVersion )
      raises (SALOME::SALOME_Exception);

    /*!
     * Export Mesh to MED_V2_1 MED format
     * Works, just the same as ExportToMEDX with MED_VERSION parameter equal to MED_V2_1
     * and overwrite parameter equal to true
     * The method is kept in order to support old functionality
     */
    void ExportMED( in string file, in boolean auto_groups )
      raises (SALOME::SALOME_Exception);

    /*!
     * Return string representation of a MED file version comprising nbDigits
     */
    string GetVersionString(in MED_VERSION version, in short nbDigits);

    /*!
     * Export Mesh to DAT, UNV and STL Formats
     * (UNV supported version is I-DEAS 10)
     */
    void ExportDAT( in string file )
      raises (SALOME::SALOME_Exception);
    void ExportUNV( in string file )
      raises (SALOME::SALOME_Exception);
    void ExportSTL( in string file, in boolean isascii )
      raises (SALOME::SALOME_Exception);

    /*!
     * Get MED Mesh
     */
    SALOME_MED::MESH GetMEDMesh()
      raises (SALOME::SALOME_Exception);

    /*!
     * Get informations about mesh contents
     */
    long NbNodes()
      raises (SALOME::SALOME_Exception);

    long NbElements()
      raises (SALOME::SALOME_Exception);

    long Nb0DElements()
      raises (SALOME::SALOME_Exception);

    long NbEdges()
      raises (SALOME::SALOME_Exception);

    long NbEdgesOfOrder(in ElementOrder order)
      raises (SALOME::SALOME_Exception);

    long NbFaces()
      raises (SALOME::SALOME_Exception);

    long NbFacesOfOrder(in ElementOrder order)
      raises (SALOME::SALOME_Exception);

    long NbTriangles()
      raises (SALOME::SALOME_Exception);

    long NbTrianglesOfOrder(in ElementOrder order)
      raises (SALOME::SALOME_Exception);

    long NbQuadrangles()
      raises (SALOME::SALOME_Exception);

    long NbQuadranglesOfOrder(in ElementOrder order)
      raises (SALOME::SALOME_Exception);

    long NbPolygons()
      raises (SALOME::SALOME_Exception);

    long NbVolumes()
      raises (SALOME::SALOME_Exception);

    long NbVolumesOfOrder(in ElementOrder order)
      raises (SALOME::SALOME_Exception);

    long NbTetras()
      raises (SALOME::SALOME_Exception);

    long NbTetrasOfOrder(in ElementOrder order)
      raises (SALOME::SALOME_Exception);

    long NbHexas()
      raises (SALOME::SALOME_Exception);

    long NbHexasOfOrder(in ElementOrder order)
      raises (SALOME::SALOME_Exception);

    long NbPyramids()
      raises (SALOME::SALOME_Exception);

    long NbPyramidsOfOrder(in ElementOrder order)
      raises (SALOME::SALOME_Exception);

    long NbPrisms()
      raises (SALOME::SALOME_Exception);

    long NbPrismsOfOrder(in ElementOrder order)
      raises (SALOME::SALOME_Exception);

    long NbPolyhedrons()
      raises (SALOME::SALOME_Exception);

    long NbSubMesh()
      raises (SALOME::SALOME_Exception);

    long_array GetElementsId()
      raises (SALOME::SALOME_Exception);

    long_array GetElementsByType( in ElementType theType )
      raises (SALOME::SALOME_Exception);

    long_array GetNodesId()
      raises (SALOME::SALOME_Exception);
    
    /*!
     * Returns type of mesh element
     */    
    ElementType GetElementType( in long id, in boolean iselem )
      raises (SALOME::SALOME_Exception);

    EntityType GetElementGeomType( in long id )
      raises (SALOME::SALOME_Exception);

    long_array GetSubMeshElementsId(in long ShapeID)
      raises (SALOME::SALOME_Exception);

    long_array GetSubMeshNodesId(in long ShapeID, in boolean all )
      raises (SALOME::SALOME_Exception);
    
    ElementType GetSubMeshElementType(in long ShapeID)
      raises (SALOME::SALOME_Exception);


    /*!
     * Methods to set meshing order of submeshes
     */

    /*!
     * \brief Return submesh objects list in meshing order
     */
    submesh_array_array GetMeshOrder();

    /*!
     * \brief Set submesh object order
     */
    boolean SetMeshOrder(in submesh_array_array theSubMeshArray);


    /*!
     * Get mesh description
     */
    string Dump();

    /*!
     * Get mesh pointer
     */
    long long GetMeshPtr();

    /*!
     * Get XYZ coordinates of node as list of double
     * If there is not node for given ID - returns empty list
     */
    double_array GetNodeXYZ(in long id);

    /*!
     * For given node returns list of IDs of inverse elements
     * If there is not node for given ID - returns empty list
     */
    long_array GetNodeInverseElements(in long id);

    /*!
     * \brief Return position of a node on shape
     */
    NodePosition GetNodePosition(in long NodeID);

    /*!
     * If given element is node returns IDs of shape from position
     * If there is not node for given ID - returns -1
     */
    long GetShapeID(in long id);

    /*!
     * For given element returns ID of result shape after 
     * ::FindShape() from SMESH_MeshEditor
     * If there is not element for given ID - returns -1
     */
    long GetShapeIDForElem(in long id);

    /*!
     * Returns number of nodes for given element
     * If there is not element for given ID - returns -1
     */
    long GetElemNbNodes(in long id);

    /*!
     * Returns IDs of nodes of given element
     */
    long_array GetElemNodes(in long id);

    /*!
     * Returns ID of node by given index for given element
     * If there is not element for given ID - returns -1
     * If there is not node for given index - returns -2
     */
    long GetElemNode(in long id, in long index);

    /*!
     * Returns true if given node is medium node
     * in given quadratic element
     */
    boolean IsMediumNode(in long ide, in long idn);

    /*!
     * Returns true if given node is medium node
     * in one of quadratic elements
     */
    boolean IsMediumNodeOfAnyElem(in long idn, in ElementType elem_type);

    /*!
     * Returns number of edges for given element
     */
    long ElemNbEdges(in long id);

    /*!
     * Returns number of faces for given element
     */
    long ElemNbFaces(in long id);

    /*!
     * Returns nodes of given face (counted from zero) for given volumic element.
     */
    long_array GetElemFaceNodes(in long elemId, in short faceIndex);

    /*!
     * Returns an element based on all given nodes.
     */
    long FindElementByNodes(in long_array nodes);

    /*!
     * Returns true if given element is polygon
     */
    boolean IsPoly(in long id);

    /*!
     * Returns true if given element is quadratic
     */
    boolean IsQuadratic(in long id);

    /*!
     * Returns XYZ coordinates of bary center for given element
     * as list of double
     * If there is not element for given ID - returns empty list
     */
    double_array BaryCenter(in long id);

    /*! Gets information about imported MED file */
    SALOME_MED::MedFileInfo GetMEDFileInfo();

    /*!
     *  Sets list of notebook variables used for Mesh operations separated by ":" symbol
     *  \param theParameters is a string containing the notebook variables
     */
    void SetParameters (in string theParameters);

    /*!
     *  Returns list of notebook variables used for Mesh operations separated by ":" symbol
     */
    string GetParameters();

    /*!
     *  Returns list of notebook variables used for last Mesh operation
     */
    string_array GetLastParameters();
  };

  interface SMESH_subMesh : SALOME::GenericObj, SMESH_IDSource
  {
    /*!
     *
     */
    long GetNumberOfElements()
      raises (SALOME::SALOME_Exception);

    /*!
     *
     */
    long GetNumberOfNodes( in boolean all )
      raises (SALOME::SALOME_Exception);

    /*!
     *
     */
    long_array GetElementsId()
      raises (SALOME::SALOME_Exception);

    /*!
     *
     */
    long_array GetElementsByType( in ElementType theType )
      raises (SALOME::SALOME_Exception);
    
    /*!
     * Return type of submesh element
     */
    ElementType GetElementType( in long id, in boolean iselem )
      raises (SALOME::SALOME_Exception);

    /*!
     *
     */
    long_array GetNodesId()
      raises (SALOME::SALOME_Exception);

    /*!
     * Get geom shape the submesh is dedicated to
     */
    GEOM::GEOM_Object GetSubShape()
      raises (SALOME::SALOME_Exception);

    /*!
     * Get SMESH_Mesh which stores nodes coordinates & elements definition
     */
    SMESH_Mesh GetFather()
      raises (SALOME::SALOME_Exception);

    /*!
     * Get the internal Id
     */
    long GetId();

    /*!
     * Get MED subMesh
     */
    SALOME_MED::FAMILY GetFamily()
      raises (SALOME::SALOME_Exception);
  };

};

#endif
