smesh/src/SMESH_I/SMESH_MEDMesh_i.cxx

1019 lines
32 KiB
C++
Raw Normal View History

2003-05-19 19:54:48 +06:00
using namespace std;
//=============================================================================
// File : SMESH_MEDMesh_i.cxx
// Project : SALOME
// Copyright : EDF 2001
//=============================================================================
#include "SMESH_MEDMesh_i.hxx"
#include "SMESH_Mesh_i.hxx"
#include "SMESHDS_Mesh.hxx"
#include "SMESHDS_SubMesh.hxx"
#include "SMDS_MapIteratorOfExtendedMap.hxx"
#include "SMDS_MapOfMeshElement.hxx"
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Iterator.hxx>
#include <TopoDS_Compound.hxx>
#include <TopoDS_CompSolid.hxx>
#include <TopoDS_Solid.hxx>
#include <TopoDS_Shell.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Wire.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Shape.hxx>
#include <TopTools_MapOfShape.hxx>
#include "utilities.h"
#include "Utils_CorbaException.hxx"
#include "SMESH_MEDSupport_i.hxx"
#include "SMESH_MEDFamily_i.hxx"
# include "Utils_ORB_INIT.hxx"
# include "Utils_SINGLETON.hxx"
extern "C"
{
#include <stdio.h>
}
//=============================================================================
/*!
* Default constructor
*/
//=============================================================================
// PN Est-ce un const ?
SMESH_MEDMesh_i::SMESH_MEDMesh_i()
{
BEGIN_OF("Default Constructor SMESH_MEDMesh_i");
END_OF("Default Constructor SMESH_MEDMesh_i");
}
//=============================================================================
/*!
* Destructor
*/
//=============================================================================
SMESH_MEDMesh_i::~SMESH_MEDMesh_i()
{
}
//=============================================================================
/*!
* Constructor
*/
//=============================================================================
SMESH_MEDMesh_i::SMESH_MEDMesh_i( ::SMESH_Mesh_i* m_i ) :_meshId(""),
_compte(false),
_creeFamily(false),
_famIdent(0),
_indexElts(0),
_indexEnts(0)
{
_mesh_i = m_i;
_meshDS = _mesh_i->GetImpl().GetMeshDS();
BEGIN_OF("Constructor SMESH_MEDMesh_i");
END_OF("Constructor SMESH_MEDMesh_i");
}
//=============================================================================
/*!
* CORBA: Accessor for Name
*/
//=============================================================================
char * SMESH_MEDMesh_i::getName()
throw (SALOME::SALOME_Exception)
{
if (_meshDS == NULL)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
try
{
// A COMPLETER PAR LE NOM DU MAILLAGE
//return CORBA::string_dup(_mesh_i->getName().c_str());
return CORBA::string_dup("toto");
}
catch(...)
{
MESSAGE("Exception en accedant au nom");
THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
,SALOME::INTERNAL_ERROR);
}
}
//=============================================================================
/*!
* CORBA: Accessor for corbaindex cuisine interne
*/
//=============================================================================
CORBA::Long SMESH_MEDMesh_i::getCorbaIndex()
throw (SALOME::SALOME_Exception)
{
MESSAGE("Non Implemente");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
}
//=============================================================================
/*!
* CORBA: Accessor for Space Dimension
*/
//=============================================================================
CORBA::Long SMESH_MEDMesh_i::getSpaceDimension()
throw (SALOME::SALOME_Exception)
{
// PN : Il semblerait que la dimension soit fixee a 3
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
return 3;
}
//=============================================================================
/*!
* CORBA: Accessor for Mesh Dimension
*/
//=============================================================================
CORBA::Long SMESH_MEDMesh_i::getMeshDimension()
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
// PN : Il semblerait que la dimension soit fixee a 3
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
return 3;
}
//=============================================================================
/*!
* CORBA: Accessor for Coordinates System
*/
//=============================================================================
char * SMESH_MEDMesh_i::getCoordinateSystem()
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
// PN : En dur. Non encore prevu
try
{
string systcoo="CARTESIEN";
return CORBA::string_dup(systcoo.c_str());
}
catch(...)
{
MESSAGE("Exception en accedant au maillage");
THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
,SALOME::INTERNAL_ERROR);
}
}
//=============================================================================
/*!
* CORBA: Accessor for Coordinates
*/
//=============================================================================
Engines::double_array * SMESH_MEDMesh_i::getCoordinates(SALOME_MED::medModeSwitch typeSwitch)
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
Engines::double_array_var myseq = new Engines::double_array;
try
{
// PN : En dur
int spaceDimension=3;
int nbNodes=_meshDS->NbNodes();
SCRUTE(nbNodes);
myseq->length(nbNodes*spaceDimension);
int i = 0;
SMDS_MeshNodesIterator itNodes(_meshDS);
for (;itNodes.More();itNodes.Next())
{
const Handle(SMDS_MeshElement)& elem = itNodes.Value();
const Handle(SMDS_MeshNode)& node =_meshDS->GetNode(1,elem);
if (typeSwitch == SALOME_MED::MED_FULL_INTERLACE)
{
myseq[i*3]=node->X();
myseq[i*3+1]=node->Y();
myseq[i*3+2]=node->Z();
SCRUTE(myseq[i*3]);
SCRUTE(myseq[i*3+1]);
SCRUTE(myseq[i*3+2]);
}
else
{
ASSERT(typeSwitch == SALOME_MED::MED_NO_INTERLACE);
myseq[i]=node->X();
myseq[i+nbNodes]=node->Y();
myseq[i+(nbNodes*2)]=node->Z();
SCRUTE(myseq[i]);
SCRUTE(myseq[i+nbNodes]);
SCRUTE(myseq[i+(nbNodes*2)]);
}
i++;
}
}
catch(...)
{
MESSAGE("Exception en accedant aux coordonnees");
THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
,SALOME::INTERNAL_ERROR);
}
return myseq._retn();
}
//=============================================================================
/*!
* CORBA: Accessor for Coordinates Names
*/
//=============================================================================
Engines::string_array * SMESH_MEDMesh_i::getCoordinatesNames()
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
Engines::string_array_var myseq = new Engines::string_array;
try
{
// PN : en dur
int spaceDimension=3;
myseq->length(spaceDimension);
myseq[0]=CORBA::string_dup("x");
myseq[1]=CORBA::string_dup("y");
myseq[2]=CORBA::string_dup("z");
}
catch(...)
{
MESSAGE("Exception en accedant aux noms des coordonnees");
THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
,SALOME::INTERNAL_ERROR);
}
return myseq._retn();
}
//=============================================================================
/*!
* CORBA: Accessor for Coordinates Units
*/
//=============================================================================
Engines::string_array * SMESH_MEDMesh_i::getCoordinatesUnits()
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
Engines::string_array_var myseq = new Engines::string_array;
try
{
// PN : en dur
int spaceDimension=3;
myseq->length(spaceDimension);
myseq[0]=CORBA::string_dup("m");
myseq[1]=CORBA::string_dup("m");
myseq[2]=CORBA::string_dup("m");
}
catch(...)
{
MESSAGE("Exception en accedant aux unites des coordonnees");
THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
,SALOME::INTERNAL_ERROR);
}
return myseq._retn();
}
//=============================================================================
/*!
* CORBA: Accessor for Number of Nodes
*/
//=============================================================================
CORBA::Long SMESH_MEDMesh_i::getNumberOfNodes()
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
try
{
return _meshDS->NbNodes();
}
catch(...)
{
MESSAGE("Exception en accedant au nombre de noeuds");
THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
,SALOME::INTERNAL_ERROR);
}
}
//=============================================================================
/*!
* CORBA: Accessor for number of Types
*/
//=============================================================================
CORBA::Long SMESH_MEDMesh_i::getNumberOfTypes(SALOME_MED::medEntityMesh entity)
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
try
{
if (! _compte)
calculeNbElts();
int retour = 0;
if ( _mapNbTypes.find(entity)!=_mapNbTypes.end())
retour=_mapNbTypes[entity];
return retour;
}
catch(...)
{
MESSAGE("Exception en accedant au nombre de Types");
THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
,SALOME::INTERNAL_ERROR);
}
}
//=============================================================================
/*!
* CORBA: Accessor for existing geometry element types
* Not implemented for MED_ALL_ENTITIES
*/
//=============================================================================
SALOME_MED::medGeometryElement_array * SMESH_MEDMesh_i::getTypes (SALOME_MED::medEntityMesh entity)
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
if (entity ==SALOME_MED::MED_ALL_ENTITIES)
THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ENTITIES",\
SALOME::BAD_PARAM);
if (! _compte)
calculeNbElts();
SALOME_MED::medGeometryElement_array_var myseq =
new SALOME_MED::medGeometryElement_array;
try
{
if ( _mapNbTypes.find(entity) ==_mapNbTypes.end())
THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh"\
,SALOME::BAD_PARAM);
int nbTypes=_mapNbTypes[entity];
myseq->length(nbTypes);
if ( _mapIndToVectTypes.find(entity) ==_mapIndToVectTypes.end())
THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh"\
,SALOME::INTERNAL_ERROR);
int index=_mapIndToVectTypes[entity];
ASSERT( _TypesId[index].size()!=0);
int i=0;
vector<SALOME_MED::medGeometryElement>::iterator it;
for (it=_TypesId[index].begin();it!=_TypesId[index].end();it++)
{
myseq[i++]=*it;
};
}
catch(...)
{
MESSAGE("Exception en accedant aux differents types");
THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
,SALOME::INTERNAL_ERROR);
}
return myseq._retn();
}
//=============================================================================
/*!
* CORBA: Returns number of elements of type medGeometryElement
* Not implemented for MED_ALL_ELEMENTS
* implemented for MED_ALL_ENTITIES
*
* Dans cette implementation, il n est pas prevu de tenir compte du entity
* qui ne doit pas pouvoir avoir deux valeurs differentes pour un geomElement
*/
//=============================================================================
CORBA::Long SMESH_MEDMesh_i::getNumberOfElements(SALOME_MED::medEntityMesh entity,
SALOME_MED::medGeometryElement geomElement)
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
if (geomElement == SALOME_MED::MED_ALL_ELEMENTS)
THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ELEMENTS", \
SALOME::BAD_PARAM);
if (! _compte)
calculeNbElts();
try
{
int retour = 0;
if ( _mapIndToSeqElts.find(geomElement)!=_mapIndToSeqElts.end())
{
int index = _mapIndToSeqElts[geomElement];
retour=_seq_elemId[index]->length();
}
return retour;
}
catch(...)
{
MESSAGE("Exception en accedant au nombre d <20>lements");
THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object"\
,SALOME::INTERNAL_ERROR);
}
}
//=============================================================================
/*!
* CORBA: Accessor for connectivities
*/
//=============================================================================
Engines::long_array * SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medModeSwitch typeSwitch,
SALOME_MED::medConnectivity mode,
SALOME_MED::medEntityMesh entity,
SALOME_MED::medGeometryElement geomElement)
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
if (mode != SALOME_MED::MED_NODAL)
THROW_SALOME_CORBA_EXCEPTION("Not Implemented",\
SALOME::BAD_PARAM);
if (typeSwitch == SALOME_MED::MED_NO_INTERLACE)
THROW_SALOME_CORBA_EXCEPTION("Not Yet Implemented",\
SALOME::BAD_PARAM);
if (! _compte)
calculeNbElts();
// Faut-il renvoyer un pointeur vide ???
if ( _mapIndToSeqElts.find(geomElement)!=_mapIndToSeqElts.end())
THROW_SALOME_CORBA_EXCEPTION("No Such Element in the mesh"\
,SALOME::BAD_PARAM);
int index=_mapIndToSeqElts[geomElement];
return _seq_elemId[index]._retn();
}
//=============================================================================
/*!
* CORBA: Accessor for connectivities
*/
//=============================================================================
Engines::long_array* SMESH_MEDMesh_i::getConnectivityIndex(SALOME_MED::medConnectivity mode,
SALOME_MED::medEntityMesh entity)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Pas Implemente dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return 0;
}
//=============================================================================
/*!
* CORBA: Find an element corresponding to the given connectivity
*/
//=============================================================================
CORBA::Long SMESH_MEDMesh_i::getElementNumber(SALOME_MED::medConnectivity mode,
SALOME_MED::medEntityMesh entity,
SALOME_MED::medGeometryElement type,
const Engines::long_array & connectivity
)
throw (SALOME::SALOME_Exception)
{
const char * LOC = "getElementNumber ";
MESSAGE(LOC<<"Pas Implemente dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return -1;
}
//=============================================================================
/*!
* CORBA: Accessor for Ascendant connectivities
* not implemented for MED_ALL_ENTITIES and MED_MAILLE
*/
//=============================================================================
Engines::long_array* SMESH_MEDMesh_i::getReverseConnectivity(SALOME_MED::medConnectivity mode)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Pas Implemente dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return 0;
}
//=============================================================================
/*!
* CORBA: Accessor for connectivities
*/
//=============================================================================
Engines::long_array* SMESH_MEDMesh_i::getReverseConnectivityIndex(SALOME_MED::medConnectivity mode)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Pas Implemente dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return 0;
}
//=============================================================================
/*!
* CORBA: Returns number of families within the mesh
*/
//=============================================================================
CORBA::Long SMESH_MEDMesh_i::getNumberOfFamilies(SALOME_MED::medEntityMesh entity)
throw (SALOME::SALOME_Exception)
{
if (_creeFamily == false)
createFamilies();
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
return _families.size();
}
//=============================================================================
/*!
* CORBA: Returns number of groups within the mesh
*/
//=============================================================================
CORBA::Long SMESH_MEDMesh_i::getNumberOfGroups(SALOME_MED::medEntityMesh entity)
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
MESSAGE(" Pas d implementation des groupes dans SMESH");
return 0;
}
//=============================================================================
/*!
* CORBA: Returns references for families within the mesh
*/
//=============================================================================
SALOME_MED::Family_array * SMESH_MEDMesh_i::getFamilies(SALOME_MED::medEntityMesh entity)
throw (SALOME::SALOME_Exception)
{
if (_creeFamily == false)
createFamilies();
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
SALOME_MED::Family_array_var myseq = new SALOME_MED::Family_array;
int nbfam= _families.size();
myseq->length(nbfam);
int i = 0;
vector<SALOME_MED::FAMILY_ptr>::iterator it;
for (it=_families.begin();it!=_families.end();it++)
{
myseq[i++]=*it;
};
return myseq._retn();
}
//=============================================================================
/*!
* CORBA: Returns references for family i within the mesh
*/
//=============================================================================
SALOME_MED::FAMILY_ptr SMESH_MEDMesh_i::getFamily(SALOME_MED::medEntityMesh entity,
CORBA::Long i)
throw (SALOME::SALOME_Exception)
{
if (_creeFamily == false)
createFamilies();
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
SCRUTE(_families[i]->getName());
MESSAGE ( " SMESH_MEDMesh_i::getFamily " << i )
return _families[i];
}
//=============================================================================
/*!
* CORBA: Returns references for groups within the mesh
*/
//=============================================================================
SALOME_MED::Group_array * SMESH_MEDMesh_i::getGroups(SALOME_MED::medEntityMesh entity)
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
MESSAGE(" Pas d implementation des groupes dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("No group implementation"\
,SALOME::BAD_PARAM);
}
//=============================================================================
/*!
* CORBA: Returns references for group i within the mesh
*/
//=============================================================================
SALOME_MED::GROUP_ptr SMESH_MEDMesh_i::getGroup(SALOME_MED::medEntityMesh entity,
CORBA::Long i)
throw (SALOME::SALOME_Exception)
{
if (_mesh_i == 0)
THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
SALOME::INTERNAL_ERROR);
MESSAGE(" Pas d implementation des groupes dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("No group implementation"\
,SALOME::BAD_PARAM);
}
//=============================================================================
/*!
* CORBA:
*/
//=============================================================================
SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getVolume(SALOME_MED::SUPPORT_ptr mySupport)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Pas Implemente dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return 0;
}
//=============================================================================
/*!
* CORBA:
*/
//=============================================================================
SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getArea(SALOME_MED::SUPPORT_ptr mySupport)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Pas Implemente dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return 0;
}
//=============================================================================
/*!
* CORBA:
*/
//=============================================================================
SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getLength(SALOME_MED::SUPPORT_ptr mySupport)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Pas Implemente dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return 0;
}
//=============================================================================
/*!
* CORBA:
*/
//=============================================================================
SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNormal(SALOME_MED::SUPPORT_ptr mySupport)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Pas Implemente dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return 0;
}
//=============================================================================
/*!
* CORBA:
*/
//=============================================================================
SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getBarycenter(SALOME_MED::SUPPORT_ptr mySupport)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Pas Implemente dans SMESH");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return 0;
}
//=============================================================================
/*!
* CORBA:
*/
//=============================================================================
SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNeighbourhood(SALOME_MED::SUPPORT_ptr mySupport)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Non Implemente");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return 0;
}
//=============================================================================
/*!
* CORBA: add the Mesh in the StudyManager
* PN Pas Implemente
*/
//=============================================================================
void SMESH_MEDMesh_i::addInStudy(SALOMEDS::Study_ptr myStudy,
SALOME_MED::MESH_ptr myIor)
throw (SALOME::SALOME_Exception)
{
BEGIN_OF("MED_Mesh_i::addInStudy");
if ( _meshId != "" )
{
MESSAGE("Mesh already in Study");
THROW_SALOME_CORBA_EXCEPTION("Mesh already in Study", \
SALOME::BAD_PARAM);
};
/*
SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
// Create SComponent labelled 'MED' if it doesn't already exit
SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
if ( CORBA::is_nil(medfather) )
{
MESSAGE("Add Component MED");
medfather = myBuilder->NewComponent("MED");
//myBuilder->AddAttribute (medfather,SALOMEDS::Name,"MED");
SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
myBuilder->FindOrCreateAttribute(medfather, "AttributeName"));
aName->SetValue("MED");
myBuilder->DefineComponentInstance(medfather,myIor);
} ;
MESSAGE("Add a mesh Object under MED");
myBuilder->NewCommand();
SALOMEDS::SObject_var newObj = myBuilder->NewObject(medfather);
ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
CORBA::ORB_var &orb = init(0,0);
string iorStr = orb->object_to_string(myIor);
//myBuilder->AddAttribute(newObj,SALOMEDS::IOR,iorStr.c_str());
SALOMEDS::AttributeIOR_var aIOR = SALOMEDS::AttributeIOR::_narrow(
myBuilder->FindOrCreateAttribute(newObj, "AttributeIOR"));
aIOR->SetValue(iorStr.c_str());
//myBuilder->AddAttribute(newObj,SALOMEDS::Name,_mesh_i->getName().c_str());
SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
myBuilder->FindOrCreateAttribute(newObj, "AttributeName"));
aName->SetValue(_mesh_i->getName().c_str());
_meshId = newObj->GetID();
myBuilder->CommitCommand();
*/
END_OF("Mesh_i::addInStudy(SALOMEDS::Study_ptr myStudy)");
}
//=============================================================================
/*!
* CORBA: write mesh in a med file
*/
//=============================================================================
void SMESH_MEDMesh_i::write(CORBA::Long i, const char* driverMeshName)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Non Implemente");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
}
//=============================================================================
/*!
* CORBA: read mesh in a med file
*/
//=============================================================================
void SMESH_MEDMesh_i::read(CORBA::Long i)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Non Implemente");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
}
//=============================================================================
/*!
* CORBA : release driver
*/
//=============================================================================
void SMESH_MEDMesh_i::rmDriver(CORBA::Long i)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Non Implemente");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
}
//=============================================================================
/*!
* CORBA : attach driver
*/
//=============================================================================
CORBA::Long SMESH_MEDMesh_i::addDriver(SALOME_MED::medDriverTypes driverType,
const char* fileName, const char* meshName)
throw (SALOME::SALOME_Exception)
{
MESSAGE("Non Implemente");
THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method"\
,SALOME::BAD_PARAM);
return 0;
}
//=============================================================================
/*!
* Calcule le Nb d'elements par entite geometrique
*/
//=============================================================================
void SMESH_MEDMesh_i::calculeNbElts()
throw (SALOME::SALOME_Exception)
{
if (! _compte)
{
_compte=true;
_mapNbTypes[SALOME_MED::MED_NODE]=1;
// On compte les aretes MED_SEG2 ou MED_SEG3
// On range les elements dans les vecteurs correspondants
_mapIndToSeqElts[SALOME_MED::MED_SEG2]=_indexElts++;
_mapIndToSeqElts[SALOME_MED::MED_SEG3]=_indexElts++;
_mapIndToVectTypes[SALOME_MED::MED_EDGE]=_indexEnts++;
int trouveSeg2=0;
int trouveSeg3=0;
SALOME_MED::medGeometryElement medElement;
SMDS_MeshEdgesIterator itEdges(_meshDS);
for (;itEdges.More();itEdges.Next())
{
const Handle(SMDS_MeshElement)& elem = itEdges.Value();
int nb_of_nodes = elem->NbNodes();
switch (nb_of_nodes)
{
case 2 :
{
medElement=SALOME_MED::MED_SEG2;
if (trouveSeg2==0)
{
trouveSeg2=1;
_TypesId[SALOME_MED::MED_EDGE].push_back(SALOME_MED::MED_SEG2);
}
break;
}
case 3 :
{
medElement=SALOME_MED::MED_SEG3;
if (trouveSeg3==0)
{
trouveSeg3=1;
_TypesId[SALOME_MED::MED_EDGE].push_back(SALOME_MED::MED_SEG3);
}
break;
}
}
int index=_mapIndToSeqElts[medElement];
SCRUTE(index);
// Traitement de l arete
int longueur=_seq_elemId[index]->length();
_seq_elemId[index]->length(longueur + nb_of_nodes);
for (int k=0; k<nb_of_nodes; k++)
{
_seq_elemId[index][longueur+k]=elem->GetConnection(k+1) +1;
}
}
_mapNbTypes[SALOME_MED::MED_EDGE]=trouveSeg2 + trouveSeg3;
// On compte les faces MED_TRIA3, MED_HEXA8, MED_TRIA6
// On range les elements dans les vecteurs correspondants
int trouveTria3=0;
int trouveTria6=0;
int trouveQuad4=0;
_mapIndToSeqElts[SALOME_MED::MED_TRIA3]=_indexElts++;
_mapIndToSeqElts[SALOME_MED::MED_TRIA6]=_indexElts++;
_mapIndToSeqElts[SALOME_MED::MED_QUAD4]=_indexElts++;
_mapIndToVectTypes[SALOME_MED::MED_FACE]=_indexEnts++;
SMDS_MeshFacesIterator itFaces(_meshDS);
for (;itFaces.More();itFaces.Next())
{
const Handle(SMDS_MeshElement)& elem = itFaces.Value();
int nb_of_nodes = elem->NbNodes();
switch (nb_of_nodes)
{
case 3 :
{
medElement=SALOME_MED::MED_TRIA3;
if (trouveTria3==0)
{
trouveTria3=1;
_TypesId[SALOME_MED::MED_FACE].push_back(SALOME_MED::MED_TRIA3);
}
break;
}
case 4 :
{
medElement=SALOME_MED::MED_QUAD4;
if (trouveQuad4==0)
{
trouveQuad4=1;
_TypesId[SALOME_MED::MED_FACE].push_back(SALOME_MED::MED_QUAD4);
}
break;
}
case 6 :
{
medElement=SALOME_MED::MED_TRIA6;
if (trouveTria6==0)
{
trouveTria6=1;
_TypesId[SALOME_MED::MED_FACE].push_back(SALOME_MED::MED_TRIA6);
}
break;
}
}
int index=_mapIndToSeqElts[medElement];
SCRUTE(index);
// Traitement de la face
// Attention La num<75>rotation des noeuds Med commence a 1
int longueur = _seq_elemId[index]->length();
_seq_elemId[index]->length(longueur+nb_of_nodes);
for (int k=0; k<nb_of_nodes; k++)
{
_seq_elemId[index][longueur+k]=elem->GetConnection(k+1) +1;
}
}
_mapNbTypes[SALOME_MED::MED_FACE]=trouveTria3 + trouveTria6 + trouveQuad4;
_mapIndToSeqElts[SALOME_MED::MED_HEXA8]=_indexElts++;
_mapIndToVectTypes[SALOME_MED::MED_CELL]=_indexEnts++;
int index=_mapIndToSeqElts[medElement];
int trouveHexa8=0;
SMDS_MeshVolumesIterator itVolumes(_meshDS);
for (;itVolumes.More();itVolumes.Next())
{
const Handle(SMDS_MeshElement)& elem = itVolumes.Value();
int nb_of_nodes = elem->NbNodes();
medElement=SALOME_MED::MED_HEXA8;
ASSERT(nb_of_nodes=8);
if (trouveHexa8 == 0)
{
trouveHexa8=1;
_TypesId[SALOME_MED::MED_CELL].push_back(SALOME_MED::MED_HEXA8);
};
// Traitement de la maille
int longueur=_seq_elemId[index]->length();
_seq_elemId[index]->length(longueur+nb_of_nodes);
for (int k=0; k<nb_of_nodes; k++)
{
_seq_elemId[index][longueur+k]=elem->GetConnection(k+1) +1;
}
}
_mapNbTypes[SALOME_MED::MED_CELL]=trouveHexa8;
_mapNbTypes[SALOME_MED::MED_ALL_ENTITIES]
=trouveHexa8 + trouveTria3 + trouveTria6 + trouveQuad4 + trouveSeg2 + trouveSeg3 ;
} /* fin du _compte */
};
//=============================================================================
/*!
* Creation des familles
*/
//=============================================================================
void SMESH_MEDMesh_i::createFamilies()
throw (SALOME::SALOME_Exception)
{
string famDes=("Je ne sais pas");
string famName0="Famille_";
string famName;
char numero[10];
if ( _creeFamily == false)
{
_creeFamily = true;
SMESH_subMesh_i* subMeshServant;
map<int, SMESH_subMesh_i*>::iterator it;
for (it = _mesh_i->_mapSubMesh_i.begin(); it != _mesh_i->_mapSubMesh_i.end(); it++) {
SMESH_subMesh_i* submesh_i = (*it).second;
int famIdent = (*it).first;
ASSERT (famIdent<999999999);
sprintf(numero,"%d\n",famIdent);
famName=famName0 + numero;
SMESH_MEDFamily_i * famservant= new SMESH_MEDFamily_i(famIdent, submesh_i,
famName, famDes, SALOME_MED::MED_NODE);
SALOME_MED::FAMILY_ptr famille =
SALOME_MED::FAMILY::_narrow(famservant->POA_SALOME_MED::FAMILY::_this());
_families.push_back(famille);
}
} /* fin du _compte */
};