// Copyright (C) 2007-2013  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"

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

  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,
      ADD_BIQUAD_TRIANGLE,
      ADD_BIQUAD_QUADRANGLE,
      ADD_TRIQUAD_HEXA,
      ADD_HEXAGONAL_PRISM,
      ADD_BALL
    };

  struct log_block
  {
    long commandType;
    long number;
    double_array coords;
    long_array indexes;
  };
  typedef sequence<log_block> log_array;

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

  typedef sequence<PointStruct> nodes_array;

  struct DirStruct   { PointStruct PS ; } ;          // analog to OCCT gp_Vec

  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
  };

  /*!
   * Element location on a shape
   */
  struct ElementPosition {
    long             shapeID;
    GEOM::shape_type shapeType;
  };

  /*!
   * Enumeration for element type, like in SMDS
   */
  enum ElementType
  {
    ALL,
    NODE,
    EDGE,
    FACE,
    VOLUME,
    ELEM0D,
    BALL,
    NB_ELEMENT_TYPES
  };
  typedef sequence<ElementType> array_of_ElementType ;

  /*!
   * Enumeration for element geometry type, like SMDSAbs_GeometryType in SMDSAbs_ElementType.hxx
   */
  enum GeometryType
  {
    Geom_POINT,
    Geom_EDGE,
    Geom_TRIANGLE,
    Geom_QUADRANGLE, // when a new GeometryType is added, please
    Geom_POLYGON,    // update a corresponding list in SMESH_2smeshpy.cxx, ln 665
    Geom_TETRA,
    Geom_PYRAMID,
    Geom_HEXA,
    Geom_PENTA,
    Geom_HEXAGONAL_PRISM,
    Geom_POLYHEDRA,
    Geom_BALL
  };
  
  /*!
   * 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 used in mesh info array,
   * it should be synchronised with enum SMDSAbs_EntityType
   */
  enum EntityType
  {
    Entity_Node,
    Entity_0D,
    Entity_Edge,
    Entity_Quad_Edge,
    Entity_Triangle,
    Entity_Quad_Triangle,
    Entity_BiQuad_Triangle,
    Entity_Quadrangle,
    Entity_Quad_Quadrangle,
    Entity_BiQuad_Quadrangle,
    Entity_Polygon,
    Entity_Quad_Polygon,
    Entity_Tetra,
    Entity_Quad_Tetra,
    Entity_Pyramid,
    Entity_Quad_Pyramid,
    Entity_Hexa,
    Entity_Quad_Hexa,
    Entity_TriQuad_Hexa,
    Entity_Penta,
    Entity_Quad_Penta,
    Entity_Hexagonal_Prism,
    Entity_Polyhedra,
    Entity_Quad_Polyhedra,
    Entity_Ball,
    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 sub-shape, nor a group
    HYP_BAD_GEOMETRY, // geometry mismatches algorithm's expectation
    HYP_NEED_SHAPE    // algorithm can work on shape only
  };

  /*!
   * Enumeration for mesh read status (used by SMESH_Gen::CreateMeshesFrom*() methods)
   */
  enum DriverMED_ReadStatus // in the order of severity
  {
    DRS_OK,
    DRS_EMPTY,          // a 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_WARN_DESCENDING, // some elements were skipped due to descending connectivity
    DRS_FAIL            // general failure (exception etc.)
  };

  /*!
   * Enumeration for ExportToMED*()
   */
  enum MED_VERSION
  {
    MED_V2_1,
    MED_V2_2
  };

  /*! 
   * \brief A structure containing information about MED file
   */
  struct MedFileInfo
  {
    string fileName; //!< name of file
    long   fileSize; //!< size of file
    long   major, minor, release; //!< MED file version
  };

  /*!
   * 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_Mesh;

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

    /*!
     * Returns number of mesh elements of each \a EntityType
     * @return array of number of elements per \a EntityType
     */
    long_array GetMeshInfo();

    /*!
     * Returns number of mesh elements of each \a ElementType
     * @return array of number of elements per \a ElementType
     */
    long_array GetNbElementsByType();

    /*!
     * Returns types of elements it contains.
     * It's empty if the SMESH_IDSource contains no IDs
     */
    array_of_ElementType GetTypes();

    /*!
     * Returns the mesh
     */
    SMESH_Mesh GetMesh();

    /*!
     * Returns false if GetMeshInfo() returns incorrect information that may
     * happen if mesh data is not yet fully loaded from the file of study.
     */
    boolean IsMeshInfoCorrect();
  };

  interface SMESH_Group;
  interface SMESH_GroupOnGeom;
  interface Filter;
  interface SMESH_GroupOnFilter;
  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);

    /*!
     * Return false if the mesh is not yet fully loaded from the study file
     */
    boolean IsLoaded()
      raises (SALOME::SALOME_Exception);

    /*!
     * Load full mesh data from the study file
     */
    void Load()
      raises (SALOME::SALOME_Exception);

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

    /*!
     *  Get the list of sub-meshes existing in the mesh
     */
    submesh_array GetSubMeshes()
      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 Sub-shape. The subMesh object
     * gives access to nodes and elements IDs.
     * SubMesh will be used instead of Sub-shape 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
     */
    SMESH_GroupOnGeom CreateGroupFromGEOM( in ElementType       elemType,
                                           in string            name,
                                           in GEOM::GEOM_Object geomObject )
      raises (SALOME::SALOME_Exception);

    /*!
     * Create a group from filter
     */
    SMESH_GroupOnFilter CreateGroupFromFilter( in ElementType   elemType,
                                               in string        name,
                                               in SMESH::Filter filter )
      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 or on filter into standalone group
     */
    SMESH_Group ConvertToStandalone( in SMESH_GroupBase theGroupOn )
      raises (SALOME::SALOME_Exception);

    /*!
     * Add hypothesis to the mesh, under a particular Sub-shape
     * (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 : sub-shape obtained by a shape explode in GEOM
     *   (or main shape)
     * - anHyp : hypothesis object
     * @return
     * - OK if the hypothesis is compatible with the sub-shape
     *   (and all previous hypothesis on the sub-shape)
     * - NOK if the hypothesis is not compatible with the sub-shape
     *   (or one previous hypothesis on the sub-shape)
     * raises exception if hypothesis has not been created
     */
    Hypothesis_Status AddHypothesis(in GEOM::GEOM_Object aSubObject,
				    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);

    /*!
     * Get the list of hypothesis added on a sub-shape
     */
    ListOfHypothesis GetHypothesisList(in GEOM::GEOM_Object aSubObject)
      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)
     */
    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);

    /*!
     * Return true if the mesh has been edited since a total re-compute
     * and those modifications may prevent successful partial re-compute
     */
    boolean HasModificationsToDiscard()
      raises (SALOME::SALOME_Exception);

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

    /*!
     * Export Mesh to a MED Format file
     * @params
     * - file : name of the MED file
     * - 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.
     * - version : define the version of format of MED file, that will be created
     * - overwrite : boolean parameter for overwriting/not overwriting the file, if it exists
     * - autoDimension: if @c True (default), a space dimension of a MED mesh can be either
     *         - 1D if all mesh nodes lie on OX coordinate axis, or
     *         - 2D if all mesh nodes lie on XOY coordinate plane, or
     *         - 3D in the rest cases.
     *
     *         If @a autoDimension is @c False, the space dimension is always 3.
     */
    void ExportToMEDX( in string      file, 
                       in boolean     auto_groups, 
                       in MED_VERSION version, 
                       in boolean     overwrite,
                       in boolean     autoDimension ) raises (SALOME::SALOME_Exception);

    /*!
     * Export a part of Mesh into a MED file
     * @params
     * - meshPart : a part of mesh to store
     * - file : name of the MED file
     * - version : define the version of format of MED file, that will be created
     * - overwrite : boolean parameter for overwriting/not overwriting the file, if it exists
     * - autoDimension: if @c True, a space dimension for export is defined by mesh 
     *                 configuration; for example a planar mesh lying on XOY plane
     *                 will be exported as a mesh in 2D space. 
     *                 If @a autoDimension == @c False, the space dimension is 3.
     */
    void ExportPartToMED( in SMESH_IDSource meshPart, 
                          in string         file, 
                          in boolean        auto_groups,
                          in MED_VERSION    version,
                          in boolean        overwrite,
                          in boolean        autoDimension ) raises (SALOME::SALOME_Exception);

    /*!
     * Export Mesh to a MED Format file
     * 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);

    /*!
     * Export Mesh to SAUV formatted file
     * Write a temporary med file and use med2sauv
     */
    void ExportSAUV( 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 different 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);
    void ExportCGNS( in SMESH_IDSource meshPart, 
                     in string         file,
                     in boolean        overwrite ) raises (SALOME::SALOME_Exception);
    void ExportGMF( in SMESH_IDSource  meshPart, 
                    in string          file,
                    in boolean         withRequiredGroups) raises (SALOME::SALOME_Exception);
    void ExportPartToDAT( in SMESH_IDSource meshPart, 
                          in string         file ) raises (SALOME::SALOME_Exception);
    void ExportPartToUNV( in SMESH_IDSource meshPart, 
                          in string         file ) raises (SALOME::SALOME_Exception);
    void ExportPartToSTL( in SMESH_IDSource meshPart,
                          in string         file,
                          in boolean        isascii ) raises (SALOME::SALOME_Exception);
    /*!
     * Return computation progress [0.,1]
     */
    double GetComputeProgress();

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

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

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

    long NbBalls()
      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 NbBiQuadTriangles()
      raises (SALOME::SALOME_Exception);

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

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

    long NbBiQuadQuadrangles()
      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 NbTriQuadraticHexas()
      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 NbHexagonalPrisms()
      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);

    /*!
     * \brief Return position of an element on shape
     */
    ElementPosition GetElementPosition(in long ElemID);

    /*!
     * 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 diameter of a ball discrete element or zero in case of an invalid \a id
     */
    double GetBallDiameter(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 */
    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();
  };

};

#endif