1 //=============================================================================
2 // File : MEDMEM_Mesh_i.cxx
5 // Copyright : EDF 2002
6 // $Header: /export/home/PAL/MED_SRC/src/MEDMEM_I/MEDMEM_Mesh_i.cxx
7 //=============================================================================
11 #include "utilities.h"
12 #include "Utils_CorbaException.hxx"
13 #include "Utils_ORB_INIT.hxx"
14 #include "Utils_SINGLETON.hxx"
16 #include "MEDMEM_convert.hxx"
17 #include "MEDMEM_Mesh_i.hxx"
18 #include "MEDMEM_Support_i.hxx"
19 #include "MEDMEM_Family_i.hxx"
20 #include "MEDMEM_Group_i.hxx"
21 #include "MEDMEM_FieldDouble_i.hxx"
23 #include "MEDMEM_Mesh.hxx"
24 #include "MEDMEM_Family.hxx"
25 #include "MEDMEM_Group.hxx"
26 #include "MEDMEM_CellModel.hxx"
27 using namespace MEDMEM;
29 // Initialisation des variables statiques
30 map < int, ::MESH *> MESH_i::meshMap ;
31 int MESH_i::meshIndex = 0 ;
35 //=============================================================================
39 //=============================================================================
40 MESH_i::MESH_i(): _mesh(constructConstMesh()),
41 _corbaIndex(MESH_i::meshIndex++),
44 BEGIN_OF("Default Constructor MESH_i");
45 MESH_i::meshMap[_corbaIndex]=_mesh;
46 END_OF("Default Constructor MESH_i");
48 //=============================================================================
52 //=============================================================================
56 //=============================================================================
60 //=============================================================================
61 MESH_i::MESH_i(::MESH * const m ) :_mesh(m),
62 _corbaIndex(MESH_i::meshIndex++),
65 BEGIN_OF("Constructor MESH_i(::MESH * const m )");
66 MESH_i::meshMap[_corbaIndex]=_mesh;
69 END_OF("Constructor MESH_i(::MESH * const m )");
71 //=============================================================================
75 //=============================================================================
76 //MESH_i::MESH_i(const MESH_i & m) :_mesh(m._mesh),
77 MESH_i::MESH_i( MESH_i & m) :_mesh(m._mesh),
78 _corbaIndex(MESH_i::meshIndex++),
81 BEGIN_OF("Constructor MESH_i");
82 MESH_i::meshMap[_corbaIndex]=_mesh;
83 END_OF("Constructor MESH_i");
85 //=============================================================================
87 * Internal Method in order to have a const ptr
89 //=============================================================================
90 ::MESH * MESH_i::constructConstMesh() const
92 ::MESH * const ptrMesh =new ::MESH();
95 //=============================================================================
97 * CORBA: Accessor for Name
99 //=============================================================================
100 char * MESH_i::getName()
101 throw (SALOME::SALOME_Exception)
104 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
105 SALOME::INTERNAL_ERROR);
109 return CORBA::string_dup(_mesh->getName().c_str());
111 catch (MEDEXCEPTION &ex)
113 MESSAGE("Unable to acces the mesh name");
114 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
117 //=============================================================================
119 * CORBA: Accessor for corbaindex cuisine interne
121 //=============================================================================
122 CORBA::Long MESH_i::getCorbaIndex()
123 throw (SALOME::SALOME_Exception)
126 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
127 SALOME::INTERNAL_ERROR);
130 //=============================================================================
132 * CORBA: Accessor for Space Dimension
134 //=============================================================================
135 CORBA::Long MESH_i::getSpaceDimension()
136 throw (SALOME::SALOME_Exception)
139 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
140 SALOME::INTERNAL_ERROR);
143 return _mesh->getSpaceDimension();
145 catch (MEDEXCEPTION &ex)
147 MESSAGE("Unable to acces the space dimension ");
148 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
151 //=============================================================================
153 * CORBA: Accessor for Mesh Dimension
155 //=============================================================================
156 CORBA::Long MESH_i::getMeshDimension()
157 throw (SALOME::SALOME_Exception)
160 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
161 SALOME::INTERNAL_ERROR);
164 return _mesh->getMeshDimension();
166 catch (MEDEXCEPTION &ex)
168 MESSAGE("Unable to acces the mesh dimension ");
169 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
172 //=============================================================================
174 * CORBA: boolean indicating if mesh is a Grid
176 //=============================================================================
177 CORBA::Boolean MESH_i::getIsAGrid()
178 throw (SALOME::SALOME_Exception)
181 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
182 SALOME::INTERNAL_ERROR);
185 return _mesh->getIsAGrid();
187 catch (MEDEXCEPTION &ex)
189 MESSAGE("Unable to acces mesh flag isAGrid");
190 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
193 //=============================================================================
195 * CORBA: boolean indicating if connectivity exists
197 //=============================================================================
198 CORBA::Boolean MESH_i::existConnectivity
199 (SALOME_MED::medConnectivity connectivityType,
200 SALOME_MED::medEntityMesh entity)
201 throw (SALOME::SALOME_Exception)
204 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
205 SALOME::INTERNAL_ERROR);
208 return _mesh->existConnectivity(connectivityType,
209 convertIdlEntToMedEnt(entity)); }
210 catch (MEDEXCEPTION &ex)
212 MESSAGE("Unable to acces mesh flag existConnectivity");
213 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
217 //=============================================================================
219 * CORBA: Accessor for Coordinates System
221 //=============================================================================
222 char * MESH_i::getCoordinatesSystem()
223 throw (SALOME::SALOME_Exception)
226 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
227 SALOME::INTERNAL_ERROR);
231 return CORBA::string_dup(_mesh->getCoordinatesSystem().c_str());
233 catch (MEDEXCEPTION &ex)
235 MESSAGE("Unable to acces the type of CoordinatesSystem");
236 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
239 //=============================================================================
241 * CORBA: Accessor for a specific coordinate
243 //=============================================================================
244 double MESH_i::getCoordinate(CORBA::Long Number, CORBA::Long Axis)
245 throw (SALOME::SALOME_Exception)
248 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
249 SALOME::INTERNAL_ERROR);
252 return _mesh->getCoordinate(Number,Axis);
254 catch (MEDEXCEPTION &ex)
256 MESSAGE("Unable to acces this coordinate");
257 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
260 //=============================================================================
262 * CORBA: Accessor for Coordinates
264 //=============================================================================
265 SALOME_MED::double_array * MESH_i::getCoordinates(SALOME_MED::medModeSwitch typeSwitch)
266 throw (SALOME::SALOME_Exception)
269 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
270 SALOME::INTERNAL_ERROR);
271 SALOME_MED::double_array_var myseq = new SALOME_MED::double_array;
274 int spaceDimension=_mesh->getSpaceDimension();
275 int nbNodes=_mesh->getNumberOfNodes();
276 const double * coordinates =_mesh->getCoordinates(
277 convertIdlModeToMedMode(typeSwitch));
279 myseq->length(nbNodes*spaceDimension);
280 for (int i=0; i<nbNodes*spaceDimension; i++)
282 myseq[i]=coordinates[i];
285 catch (MEDEXCEPTION &ex)
287 MESSAGE("Unable to acces the coordinates");
288 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
290 return myseq._retn();
292 //=============================================================================
294 * CORBA: Accessor for Coordinates Names
296 //=============================================================================
297 SALOME_MED::string_array * MESH_i::getCoordinatesNames()
298 throw (SALOME::SALOME_Exception)
301 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
302 SALOME::INTERNAL_ERROR);
303 SALOME_MED::string_array_var myseq = new SALOME_MED::string_array;
306 int spaceDimension=_mesh->getSpaceDimension();
307 const string * coordinatesName =_mesh->getCoordinatesNames();
308 myseq->length(spaceDimension);
309 for (int i=0; i<spaceDimension; i++)
311 myseq[i]=CORBA::string_dup(coordinatesName[i].c_str());
314 catch (MEDEXCEPTION &ex)
316 MESSAGE("Unable to acces the coordinates names");
317 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
319 return myseq._retn();
322 //=============================================================================
324 * CORBA: Accessor for Coordinates Units
326 //=============================================================================
327 SALOME_MED::string_array * MESH_i::getCoordinatesUnits()
328 throw (SALOME::SALOME_Exception)
331 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
332 SALOME::INTERNAL_ERROR);
333 SALOME_MED::string_array_var myseq = new SALOME_MED::string_array;
336 int spaceDimension=_mesh->getSpaceDimension();
337 const string * coordinatesUnits =_mesh->getCoordinatesUnits();
338 myseq->length(spaceDimension);
339 for (int i=0; i<spaceDimension; i++)
341 myseq[i]=CORBA::string_dup(coordinatesUnits[i].c_str());
344 catch (MEDEXCEPTION &ex)
346 MESSAGE("Unable to acces the coordinates units");
347 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
349 return myseq._retn();
351 //=============================================================================
353 * CORBA: Accessor for Number of Nodes
355 //=============================================================================
356 CORBA::Long MESH_i::getNumberOfNodes()
357 throw (SALOME::SALOME_Exception)
360 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
361 SALOME::INTERNAL_ERROR);
364 return _mesh->getNumberOfNodes();
366 catch (MEDEXCEPTION &ex)
368 MESSAGE("Unable to acces number of nodes");
369 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
372 //=============================================================================
374 * CORBA: Accessor for number of Types
376 //=============================================================================
377 CORBA::Long MESH_i::getNumberOfTypes(SALOME_MED::medEntityMesh entity)
378 throw (SALOME::SALOME_Exception)
381 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
382 SALOME::INTERNAL_ERROR);
385 return _mesh->getNumberOfTypes(convertIdlEntToMedEnt(entity));
387 catch (MEDEXCEPTION &ex)
389 MESSAGE("Unable to acces number of differents types");
390 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
393 //=============================================================================
395 * CORBA: Accessor for existing geometry element types
397 //=============================================================================
398 SALOME_MED::medGeometryElement MESH_i::getElementType (SALOME_MED::medEntityMesh entity,
400 throw (SALOME::SALOME_Exception)
403 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
404 SALOME::INTERNAL_ERROR);
407 return _mesh->getElementType(convertIdlEntToMedEnt(entity),number);
409 catch (MEDEXCEPTION &ex)
411 MESSAGE("Unable to acces number of differents element types");
412 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
416 //=============================================================================
418 * CORBA: Accessor for existing geometry element types
419 * Not implemented for MED_ALL_ENTITIES
421 //=============================================================================
422 SALOME_MED::medGeometryElement_array * MESH_i::getTypes (SALOME_MED::medEntityMesh entity)
423 throw (SALOME::SALOME_Exception)
426 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
427 SALOME::INTERNAL_ERROR);
428 if (entity ==SALOME_MED::MED_ALL_ENTITIES)
429 THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ENTITIES",\
431 SALOME_MED::medGeometryElement_array_var myseq =
432 new SALOME_MED::medGeometryElement_array;
435 int nbTypes=_mesh->getNumberOfTypes(convertIdlEntToMedEnt(entity));
436 const medGeometryElement * elemts =_mesh->getTypes(
437 convertIdlEntToMedEnt(entity));
438 myseq->length(nbTypes);
439 for (int i=0; i<nbTypes; i++)
441 myseq[i]=convertMedEltToIdlElt(elemts[i]);
444 catch (MEDEXCEPTION &ex)
446 MESSAGE("Unable to acces coordinates");
447 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
449 return myseq._retn();
451 //=============================================================================
453 * CORBA: Returns number of elements of type medGeometryElement
454 * Not implemented for MED_ALL_ELEMENTS
455 * implemented for MED_ALL_ENTITIES
457 //=============================================================================
458 CORBA::Long MESH_i::getNumberOfElements(SALOME_MED::medEntityMesh entity,
459 SALOME_MED::medGeometryElement geomElement)
460 throw (SALOME::SALOME_Exception)
463 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
464 SALOME::INTERNAL_ERROR);
465 if (verifieParam(entity,geomElement)==false)
466 THROW_SALOME_CORBA_EXCEPTION("parameters don't match",\
471 return _mesh->getNumberOfElements(convertIdlEntToMedEnt(entity),
472 convertIdlEltToMedElt(geomElement));
474 catch (MEDEXCEPTION &ex)
476 MESSAGE("Unable to acces number of elements");
477 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
480 //=============================================================================
482 * CORBA: Accessor for connectivities
484 //=============================================================================
485 SALOME_MED::long_array * MESH_i::getConnectivity(SALOME_MED::medModeSwitch typeSwitch,
486 SALOME_MED::medConnectivity mode,
487 SALOME_MED::medEntityMesh entity,
488 SALOME_MED::medGeometryElement geomElement)
489 throw (SALOME::SALOME_Exception)
492 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
493 SALOME::INTERNAL_ERROR);
494 if (verifieParam(entity,geomElement)==false)
495 THROW_SALOME_CORBA_EXCEPTION("parameters don't match",\
497 SALOME_MED::long_array_var myseq= new SALOME_MED::long_array;
501 int elt1 = _mesh->getNumberOfElements(
502 convertIdlEntToMedEnt(entity),
503 convertIdlEltToMedElt(geomElement));
505 if ( mode == SALOME_MED::MED_DESCENDING)
507 MESSAGE("MED_DESCENDING");
508 int elt2 =(_mesh->getCellsTypes(MED_CELL))->getNumberOfConstituents(1);
509 //int elt2 =(_mesh->getTypes(convertIdlEltToMedElt(geomElement)))->getNumberOfConstituents(1);
510 nbelements= elt2 * elt1;
515 MESSAGE("MED_NODAL");
516 const int * tab=_mesh->getConnectivityIndex(
517 convertIdlConnToMedConn(mode),
518 convertIdlEntToMedEnt(entity));
519 nbelements = tab[elt1 ] - 1 ;
524 myseq->length(nbelements);
525 const int * numbers=_mesh->getConnectivity(convertIdlModeToMedMode(typeSwitch),
526 convertIdlConnToMedConn(mode),
527 convertIdlEntToMedEnt(entity),
528 convertIdlEltToMedElt(geomElement));
529 for (int i=0;i<nbelements;i++)
534 catch (MEDEXCEPTION &ex)
536 MESSAGE("Unable to acces connectivities");
537 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
539 return myseq._retn();
541 //=============================================================================
543 * CORBA: Accessor for connectivities
545 //=============================================================================
546 SALOME_MED::long_array* MESH_i::getConnectivityIndex(SALOME_MED::medConnectivity mode,
547 SALOME_MED::medEntityMesh entity)
548 throw (SALOME::SALOME_Exception)
551 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
552 SALOME::INTERNAL_ERROR);
553 SALOME_MED::long_array_var myseq= new SALOME_MED::long_array;
556 int nbelements = _mesh->getNumberOfElements(
557 convertIdlEntToMedEnt(entity),
559 myseq->length(nbelements);
560 const int * numbers=_mesh->getConnectivityIndex(convertIdlConnToMedConn(mode),
561 convertIdlEntToMedEnt(entity));
562 for (int i=0;i<nbelements;i++)
567 catch (MEDEXCEPTION &ex)
569 MESSAGE("Unable to acces connectivities index");
570 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
572 return myseq._retn();
574 //=============================================================================
576 * CORBA: Accessor for connectivities
578 //=============================================================================
579 SALOME_MED::long_array* MESH_i::getGlobalNumberingIndex( SALOME_MED::medEntityMesh entity)
580 throw (SALOME::SALOME_Exception)
583 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
584 SALOME::INTERNAL_ERROR);
585 SALOME_MED::long_array_var myseq= new SALOME_MED::long_array;
588 int nbelements = _mesh->getNumberOfTypes( convertIdlEntToMedEnt(entity)) + 1;
589 myseq->length(nbelements);
590 const int * numbers=_mesh->getGlobalNumberingIndex( convertIdlEntToMedEnt(entity));
591 for (int i=0;i<nbelements;i++)
596 catch (MEDEXCEPTION &ex)
598 MESSAGE("Unable to acces global index");
599 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
601 return myseq._retn();
604 //=============================================================================
606 * CORBA: get global element number in connectivity array
607 * not implemented for MED_NODE and MED_ALL_ENTITIES,
608 * MED_NONE and MED_ALL_ELEMENTS.
610 //=============================================================================
611 CORBA::Long MESH_i::getElementNumber(SALOME_MED::medConnectivity mode,
612 SALOME_MED::medEntityMesh entity,
613 SALOME_MED::medGeometryElement type,
614 const SALOME_MED::long_array& connectivity)
615 throw (SALOME::SALOME_Exception)
618 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", SALOME::INTERNAL_ERROR);
619 int numberOfValue = connectivity.length() ;
620 int * myConnectivity = new int[numberOfValue] ;
621 for (int i=0; i<numberOfValue; i++)
622 myConnectivity[i]=connectivity[i] ;
626 result = _mesh->getElementNumber(convertIdlConnToMedConn(mode),
627 convertIdlEntToMedEnt(entity),
628 convertIdlEltToMedElt(type),
631 catch (MEDEXCEPTION &ex) {
632 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
636 //=============================================================================
638 * CORBA: Accessor for Ascendant connectivities
639 * not implemented for MED_ALL_ENTITIES and MED_MAILLE
641 //=============================================================================
642 SALOME_MED::long_array* MESH_i::getReverseConnectivity(SALOME_MED::medConnectivity mode)
643 throw (SALOME::SALOME_Exception)
646 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
647 SALOME::INTERNAL_ERROR);
648 SALOME_MED::long_array_var myseq= new SALOME_MED::long_array;
652 if ( mode == SALOME_MED::MED_DESCENDING)
654 nbelements =(_mesh->getNumberOfNodes())+1;
658 nbelements = _mesh->getNumberOfElements(MED_FACE,MED_ALL_ELEMENTS);
661 myseq->length(nbelements);
662 const int * numbers=_mesh->getReverseConnectivity(convertIdlConnToMedConn(mode));
663 for (int i=0;i<nbelements;i++)
668 catch (MEDEXCEPTION &ex)
670 MESSAGE("Unable to acces reverse connectivities");
671 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
673 return myseq._retn();
675 //=============================================================================
677 * CORBA: Accessor for connectivities
679 //=============================================================================
680 SALOME_MED::long_array* MESH_i::getReverseConnectivityIndex(SALOME_MED::medConnectivity mode)
681 throw (SALOME::SALOME_Exception)
684 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
685 SALOME::INTERNAL_ERROR);
686 SALOME_MED::long_array_var myseq= new SALOME_MED::long_array;
690 if ( mode == SALOME_MED::MED_DESCENDING)
692 nbelements =_mesh->getNumberOfNodes();
696 int dim=_mesh->getMeshDimension();
698 nbelements = _mesh->getNumberOfElements(MED_FACE,MED_ALL_ELEMENTS);
701 nbelements = _mesh->getNumberOfElements(MED_EDGE,MED_ALL_ELEMENTS);
703 THROW_SALOME_CORBA_EXCEPTION("Pb ", \
704 SALOME::INTERNAL_ERROR);
707 myseq->length(nbelements);
708 const int * numbers=_mesh->getReverseConnectivityIndex(convertIdlConnToMedConn(mode));
709 for (int i=0;i<nbelements;i++)
714 catch (MEDEXCEPTION &ex)
716 MESSAGE("Unable to acces reverse connectivities index");
717 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
719 return myseq._retn();
721 //=============================================================================
723 * CORBA: Returns number of families within the mesh
725 //=============================================================================
726 CORBA::Long MESH_i::getNumberOfFamilies(SALOME_MED::medEntityMesh entity)
727 throw (SALOME::SALOME_Exception)
730 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
731 SALOME::INTERNAL_ERROR);
734 return _mesh->getNumberOfFamilies(convertIdlEntToMedEnt(entity));
736 catch (MEDEXCEPTION &ex)
738 MESSAGE("Unable to acces number of families of the mesh");
739 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
742 //=============================================================================
744 * CORBA: Returns number of groups within the mesh
746 //=============================================================================
747 CORBA::Long MESH_i::getNumberOfGroups(SALOME_MED::medEntityMesh entity)
748 throw (SALOME::SALOME_Exception)
751 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
752 SALOME::INTERNAL_ERROR);
755 return _mesh->getNumberOfGroups(convertIdlEntToMedEnt(entity));
757 catch (MEDEXCEPTION &ex)
759 MESSAGE("Unable to acces number of groups of the mesh");
760 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
763 //=============================================================================
765 * CORBA: Returns references for families within the mesh
767 //=============================================================================
768 SALOME_MED::Family_array * MESH_i::getFamilies(SALOME_MED::medEntityMesh entity)
769 throw (SALOME::SALOME_Exception)
772 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
773 SALOME::INTERNAL_ERROR);
774 SALOME_MED::Family_array_var myseq = new SALOME_MED::Family_array;
777 int nbfam= _mesh->getNumberOfFamilies(convertIdlEntToMedEnt(entity));
778 myseq->length(nbfam);
779 vector<FAMILY*> fam(nbfam);
780 fam = _mesh->getFamilies(convertIdlEntToMedEnt(entity));
781 for (int i=0;i<nbfam;i++)
783 FAMILY_i * f1=new FAMILY_i(fam[i]);
784 SALOME_MED::FAMILY_ptr f2 =
785 f1->POA_SALOME_MED::FAMILY::_this();
790 catch (MEDEXCEPTION &ex)
792 MESSAGE("Unable to acces families of the mesh");
793 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
795 return myseq._retn();
797 //=============================================================================
799 * CORBA: Returns Coordinates global informations
801 //=============================================================================
802 SALOME_MED::MESH::coordinateInfos * MESH_i::getCoordGlobal()
803 throw (SALOME::SALOME_Exception)
806 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
807 SALOME::INTERNAL_ERROR);
808 SALOME_MED::MESH::coordinateInfos_var all = new SALOME_MED::MESH::coordinateInfos;
811 all->coordSystem = CORBA::string_dup(_mesh->getCoordinatesSystem().c_str());
813 int spaceDimension=_mesh->getSpaceDimension();
814 const string * coordinatesUnits =_mesh->getCoordinatesUnits();
815 const string * coordinatesName =_mesh->getCoordinatesNames();
817 all->coordUnits.length(spaceDimension);
818 all->coordNames.length(spaceDimension);
819 for (int i=0; i<spaceDimension; i++)
821 all->coordUnits[i]=CORBA::string_dup(coordinatesUnits[i].c_str());
822 all->coordNames[i]=CORBA::string_dup(coordinatesName[i].c_str());
825 catch (MEDEXCEPTION &ex)
827 MESSAGE("Unable to acces coordinate information ");
828 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
832 //=============================================================================
834 * CORBA: Returns connectivity global informations
836 //=============================================================================
837 SALOME_MED::MESH::connectivityInfos * MESH_i::getConnectGlobal
838 (SALOME_MED::medEntityMesh entity)
839 throw (SALOME::SALOME_Exception)
842 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
843 SALOME::INTERNAL_ERROR);
844 SALOME_MED::MESH::connectivityInfos_var all=new SALOME_MED::MESH::connectivityInfos;
847 all->numberOfNodes = _mesh->getNumberOfNodes();
849 int nbTypes=_mesh->getNumberOfTypes(convertIdlEntToMedEnt(entity));
850 const medGeometryElement * elemts =_mesh->getTypes(
851 convertIdlEntToMedEnt(entity));
852 all->meshTypes.length(nbTypes);
853 all->numberOfElements.length(nbTypes);
854 for (int i=0; i<nbTypes; i++)
856 all->meshTypes[i]=convertMedEltToIdlElt(elemts[i]);
857 all->numberOfElements[i]=_mesh->getNumberOfElements(
858 convertIdlEntToMedEnt(entity),elemts[i]);
861 catch (MEDEXCEPTION &ex)
863 MESSAGE("Unable to acces connectivities informations");
864 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
869 //=============================================================================
871 * CORBA: Returns references for family i within the mesh
873 //=============================================================================
874 SALOME_MED::FAMILY_ptr MESH_i::getFamily(SALOME_MED::medEntityMesh entity,
876 throw (SALOME::SALOME_Exception)
879 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
880 SALOME::INTERNAL_ERROR);
883 const FAMILY * fam = _mesh->getFamily(convertIdlEntToMedEnt(entity),i);
884 FAMILY_i * f1=new FAMILY_i(fam);
885 SALOME_MED::FAMILY_ptr f2 = f1->POA_SALOME_MED::FAMILY::_this();
887 return (SALOME_MED::FAMILY::_duplicate(f2));
889 catch (MEDEXCEPTION &ex)
891 MESSAGE("Unable to acces specified family of the mesh");
892 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
896 //=============================================================================
898 * CORBA: Returns Mesh global informations
900 //=============================================================================
901 SALOME_MED::MESH::meshInfos * MESH_i::getMeshGlobal()
902 throw (SALOME::SALOME_Exception)
905 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
906 SALOME::INTERNAL_ERROR);
907 SALOME_MED::MESH::meshInfos_var all = new SALOME_MED::MESH::meshInfos;
910 all->name = CORBA::string_dup(_mesh->getName().c_str());
911 all->spaceDimension = _mesh->getSpaceDimension();
912 all->meshDimension = _mesh->getMeshDimension();
913 all->numberOfNodes = _mesh->getNumberOfNodes();
914 all->isAGrid = _mesh->getIsAGrid();
916 int nbFam= _mesh->getNumberOfFamilies(MED_NODE);
917 all->famNode.length(nbFam);
918 vector<FAMILY*> vNode (nbFam);
919 vNode = _mesh->getFamilies(MED_NODE);
920 for (int i=0;i<nbFam;i++)
922 FAMILY_i * f1=new FAMILY_i(vNode[i]);
923 SALOME_MED::FAMILY_ptr f2 = f1->POA_SALOME_MED::FAMILY::_this();
925 all->famNode[i] = f2;
928 nbFam = _mesh->getNumberOfFamilies(MED_EDGE);
929 all->famEdge.length(nbFam);
930 vector<FAMILY*> vEdge (nbFam);
931 vEdge = _mesh->getFamilies(MED_EDGE);
932 for (int i=0;i<nbFam;i++)
933 for (int i=0;i<nbFam;i++)
935 FAMILY_i * f1=new FAMILY_i(vEdge[i]);
936 SALOME_MED::FAMILY_ptr f2 = f1->POA_SALOME_MED::FAMILY::_this();
938 all->famEdge[i] = f2;
941 nbFam = _mesh->getNumberOfFamilies(MED_FACE);
942 all->famFace.length(nbFam);
943 vector<FAMILY*> vFace (nbFam);
944 vFace = _mesh->getFamilies(MED_FACE);
945 for (int i=0;i<nbFam;i++)
947 FAMILY_i * f1=new FAMILY_i(vFace[i]);
948 SALOME_MED::FAMILY_ptr f2 = f1->POA_SALOME_MED::FAMILY::_this();
950 all->famFace[i] = f2;
953 nbFam = _mesh->getNumberOfFamilies(MED_CELL);
954 all->famCell.length(nbFam);
955 vector<FAMILY*> vCell (nbFam);
956 vCell = _mesh->getFamilies(MED_CELL);
957 for (int i=0;i<nbFam;i++)
959 FAMILY_i * f1=new FAMILY_i(vCell[i]);
960 SALOME_MED::FAMILY_ptr f2 = f1->POA_SALOME_MED::FAMILY::_this();
962 all->famCell[i] = f2;
965 int nbGroup = _mesh->getNumberOfGroups(MED_NODE);
966 all->groupNode.length(nbGroup);
967 vector<GROUP*> gNode (nbGroup);
968 gNode = _mesh->getGroups(MED_NODE);
969 for (int i=0;i<nbGroup;i++)
971 GROUP_i * f1=new GROUP_i(gNode[i]);
972 SALOME_MED::GROUP_ptr f2 = f1->POA_SALOME_MED::GROUP::_this();
974 all->groupNode[i] = f2;
977 nbGroup = _mesh->getNumberOfGroups(MED_EDGE);
978 all->groupEdge.length(nbGroup);
979 vector<GROUP*> gEdge (nbGroup);
980 gEdge = _mesh->getGroups(MED_EDGE);
981 for (int i=0;i<nbGroup;i++)
983 GROUP_i * f1=new GROUP_i(gEdge[i]);
984 SALOME_MED::GROUP_ptr f2 = f1->POA_SALOME_MED::GROUP::_this();
986 all->groupEdge[i] = f2;
988 nbGroup = _mesh->getNumberOfGroups(MED_FACE);
989 all->groupFace.length(nbGroup);
990 vector<GROUP*> gFace (nbGroup);
991 gFace = _mesh->getGroups(MED_FACE);
992 for (int i=0;i<nbGroup;i++)
994 GROUP_i * f1=new GROUP_i(gFace[i]);
995 SALOME_MED::GROUP_ptr f2 = f1->POA_SALOME_MED::GROUP::_this();
997 all->groupFace[i] = f2;
1000 nbGroup = _mesh->getNumberOfGroups(MED_CELL);
1001 all->groupCell.length(nbGroup);
1002 vector<GROUP*> gCell (nbGroup);
1003 gCell = _mesh->getGroups(MED_CELL);
1004 for (int i=0;i<nbGroup;i++)
1006 GROUP_i * f1=new GROUP_i(gCell[i]);
1007 SALOME_MED::GROUP_ptr f2 = f1->POA_SALOME_MED::GROUP::_this();
1009 all->groupCell[i] = f2;
1013 catch (MEDEXCEPTION &ex)
1015 MESSAGE("Unable to acces mesh");
1016 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1020 //=============================================================================
1022 * CORBA: Returns references for groups within the mesh
1024 //=============================================================================
1025 SALOME_MED::Group_array * MESH_i::getGroups(SALOME_MED::medEntityMesh entity)
1026 throw (SALOME::SALOME_Exception)
1029 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1030 SALOME::INTERNAL_ERROR);
1031 SALOME_MED::Group_array_var myseq = new SALOME_MED::Group_array;
1034 int nbgroups = _mesh->getNumberOfGroups(convertIdlEntToMedEnt(entity));
1035 myseq->length(nbgroups);
1036 vector<GROUP*> groups(nbgroups);
1037 groups = _mesh->getGroups(convertIdlEntToMedEnt(entity));
1038 for (int i=0;i<nbgroups;i++)
1040 GROUP_i * f1=new GROUP_i(groups[i]);
1041 SALOME_MED::GROUP_ptr f2 = f1->POA_SALOME_MED::GROUP::_this();
1046 catch (MEDEXCEPTION &ex)
1048 MESSAGE("Unable to acces number of groups of the mesh");
1049 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1051 return myseq._retn();
1053 //=============================================================================
1055 * CORBA: Returns references for group i within the mesh
1057 //=============================================================================
1058 SALOME_MED::GROUP_ptr MESH_i::getGroup(SALOME_MED::medEntityMesh entity,
1060 throw (SALOME::SALOME_Exception)
1063 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1064 SALOME::INTERNAL_ERROR);
1067 const GROUP * grou = _mesh->getGroup(convertIdlEntToMedEnt(entity),i);
1068 GROUP_i * f1=new GROUP_i(grou);
1069 SALOME_MED::GROUP_ptr f2 = f1->POA_SALOME_MED::GROUP::_this();
1071 return (SALOME_MED::GROUP::_duplicate(f2));
1073 catch (MEDEXCEPTION &ex)
1075 MESSAGE("Unable to acces specified group of the mesh");
1076 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1079 //=============================================================================
1083 //=============================================================================
1084 SALOME_MED::SUPPORT_ptr MESH_i::getBoundaryElements(SALOME_MED::medEntityMesh entity)
1085 throw (SALOME::SALOME_Exception)
1088 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1089 SALOME::INTERNAL_ERROR);
1092 SUPPORT * myNewSupport = _mesh->getBoundaryElements(convertIdlEntToMedEnt(entity));
1093 SUPPORT_i * mySupportI = new SUPPORT_i(myNewSupport);
1094 SALOME_MED::SUPPORT_ptr mySupportIOR = mySupportI->_this() ;
1095 return (SALOME_MED::SUPPORT::_duplicate(mySupportIOR));
1097 catch (MEDEXCEPTION &ex)
1099 MESSAGE("Unable to get the volume ");
1100 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1103 //=============================================================================
1107 //=============================================================================
1108 SALOME_MED::FIELD_ptr MESH_i::getVolume(SALOME_MED::SUPPORT_ptr mySupport)
1109 throw (SALOME::SALOME_Exception)
1112 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1113 SALOME::INTERNAL_ERROR); try
1115 int sup = mySupport->getCorbaIndex();
1116 ASSERT(SUPPORT_i::supportMap.find(sup)!=SUPPORT_i::supportMap.end());
1117 const SUPPORT * myCppSupport=SUPPORT_i::supportMap[sup];
1118 ::FIELD<double>*f=_mesh->getVolume( myCppSupport);
1119 FIELDDOUBLE_i * medf = new FIELDDOUBLE_i(mySupport,f);
1120 POA_SALOME_MED::FIELDDOUBLE_tie<FIELDDOUBLE_i> * f1 =
1121 new POA_SALOME_MED::FIELDDOUBLE_tie<FIELDDOUBLE_i>(medf,true);
1122 SALOME_MED::FIELDDOUBLE_ptr f2 = f1->_this();
1124 return (SALOME_MED::FIELD::_duplicate(f2));
1126 catch (MEDEXCEPTION &ex)
1128 MESSAGE("Unable to get the volume ");
1129 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1132 //=============================================================================
1136 //=============================================================================
1137 SALOME_MED::SUPPORT_ptr MESH_i::getSkin(SALOME_MED::SUPPORT_ptr mySupport3D)
1138 throw (SALOME::SALOME_Exception)
1141 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1142 SALOME::INTERNAL_ERROR);
1145 int sup = mySupport3D->getCorbaIndex();
1146 ASSERT(SUPPORT_i::supportMap.find(sup)!=SUPPORT_i::supportMap.end());
1147 const SUPPORT * myCppSupport=SUPPORT_i::supportMap[sup];
1148 SUPPORT * myNewSupport = _mesh->getSkin(myCppSupport);
1149 SUPPORT_i * mySupportI = new SUPPORT_i(myNewSupport);
1150 SALOME_MED::SUPPORT_ptr mySupportIOR = mySupportI->_this() ;
1151 return (SALOME_MED::SUPPORT::_duplicate(mySupportIOR));
1153 catch (MEDEXCEPTION &ex)
1155 MESSAGE("Unable to get the volume ");
1156 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1159 //=============================================================================
1163 //=============================================================================
1164 SALOME_MED::FIELD_ptr MESH_i::getArea(SALOME_MED::SUPPORT_ptr mySupport)
1165 throw (SALOME::SALOME_Exception)
1168 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1169 SALOME::INTERNAL_ERROR);
1172 int sup = mySupport->getCorbaIndex();
1173 ASSERT(SUPPORT_i::supportMap.find(sup)!=SUPPORT_i::supportMap.end());
1174 const SUPPORT * myCppSupport=SUPPORT_i::supportMap[sup];
1175 ::FIELD<double>*f=_mesh->getArea( myCppSupport);
1176 FIELDDOUBLE_i * medf = new FIELDDOUBLE_i(mySupport,f);
1177 POA_SALOME_MED::FIELDDOUBLE_tie<FIELDDOUBLE_i> * f1 =
1178 new POA_SALOME_MED::FIELDDOUBLE_tie<FIELDDOUBLE_i>(medf,true);
1179 SALOME_MED::FIELDDOUBLE_ptr f2 = f1->_this();
1181 return (SALOME_MED::FIELD::_duplicate(f2));
1183 catch (MEDEXCEPTION &ex)
1185 MESSAGE("Unable to get the area ");
1186 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1189 //=============================================================================
1193 //=============================================================================
1194 SALOME_MED::FIELD_ptr MESH_i::getLength(SALOME_MED::SUPPORT_ptr mySupport)
1195 throw (SALOME::SALOME_Exception)
1198 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1199 SALOME::INTERNAL_ERROR);
1202 int sup = mySupport->getCorbaIndex();
1203 ASSERT(SUPPORT_i::supportMap.find(sup)!=SUPPORT_i::supportMap.end());
1204 const SUPPORT * myCppSupport=SUPPORT_i::supportMap[sup];
1205 ::FIELD<double>*f=_mesh->getLength( myCppSupport);
1206 FIELDDOUBLE_i * medf = new FIELDDOUBLE_i(mySupport,f);
1207 POA_SALOME_MED::FIELDDOUBLE_tie<FIELDDOUBLE_i> * f1 =
1208 new POA_SALOME_MED::FIELDDOUBLE_tie<FIELDDOUBLE_i>(medf,true);
1209 SALOME_MED::FIELDDOUBLE_ptr f2 = f1->_this();
1211 return (SALOME_MED::FIELD::_duplicate(f2));
1213 catch (MEDEXCEPTION &ex)
1215 MESSAGE("Unable to get the length ");
1216 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1219 //=============================================================================
1223 //=============================================================================
1224 SALOME_MED::FIELD_ptr MESH_i::getNormal(SALOME_MED::SUPPORT_ptr mySupport)
1225 throw (SALOME::SALOME_Exception)
1228 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1229 SALOME::INTERNAL_ERROR);
1232 int sup = mySupport->getCorbaIndex();
1233 ASSERT(SUPPORT_i::supportMap.find(sup)!=SUPPORT_i::supportMap.end());
1234 const SUPPORT * myCppSupport=SUPPORT_i::supportMap[sup];
1235 ::FIELD<double>*f=_mesh->getNormal( myCppSupport);
1236 FIELDDOUBLE_i * medf = new FIELDDOUBLE_i(mySupport,f);
1237 POA_SALOME_MED::FIELDDOUBLE_tie<FIELDDOUBLE_i> * f1 =
1238 new POA_SALOME_MED::FIELDDOUBLE_tie<FIELDDOUBLE_i>(medf,true);
1239 SALOME_MED::FIELDDOUBLE_ptr f2 = f1->_this();
1241 return (SALOME_MED::FIELD::_duplicate(f2));
1243 catch (MEDEXCEPTION &ex)
1245 MESSAGE("Unable to get the normal ");
1246 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1249 //=============================================================================
1253 //=============================================================================
1254 SALOME_MED::FIELD_ptr MESH_i::getBarycenter(SALOME_MED::SUPPORT_ptr mySupport)
1255 throw (SALOME::SALOME_Exception)
1258 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1259 SALOME::INTERNAL_ERROR);
1262 int sup = mySupport->getCorbaIndex();
1263 ASSERT(SUPPORT_i::supportMap.find(sup)!=SUPPORT_i::supportMap.end());
1264 const SUPPORT * myCppSupport=SUPPORT_i::supportMap[sup];
1265 ::FIELD<double>*f=_mesh->getBarycenter( myCppSupport);
1266 FIELDDOUBLE_i * medf = new FIELDDOUBLE_i(mySupport,f);
1267 POA_SALOME_MED::FIELDDOUBLE_tie<FIELDDOUBLE_i> * f1 =
1268 new POA_SALOME_MED::FIELDDOUBLE_tie<FIELDDOUBLE_i>(medf,true);
1269 SALOME_MED::FIELDDOUBLE_ptr f2 = f1->_this();
1271 return (SALOME_MED::FIELD::_duplicate(f2));
1273 catch (MEDEXCEPTION &ex)
1275 MESSAGE("Unable to get the barycenter ");
1276 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1279 //=============================================================================
1283 //=============================================================================
1284 SALOME_MED::FIELD_ptr MESH_i::getNeighbourhood(SALOME_MED::SUPPORT_ptr mySupport)
1285 throw (SALOME::SALOME_Exception)
1288 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1289 SALOME::INTERNAL_ERROR);
1290 MESSAGE("Not Implemented");
1292 //=============================================================================
1294 * CORBA: add the Mesh in the StudyManager
1296 //=============================================================================
1297 void MESH_i::addInStudy(SALOMEDS::Study_ptr myStudy,SALOME_MED::MESH_ptr myIor )
1298 throw (SALOME::SALOME_Exception,SALOMEDS::StudyBuilder::LockProtection)
1300 BEGIN_OF("MED_Mesh_i::addInStudy");
1301 if ( _meshId != "" )
1303 MESSAGE("Mesh already in Study");
1304 THROW_SALOME_CORBA_EXCEPTION("Mesh already in Study", \
1308 SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
1309 SALOMEDS::GenericAttribute_var anAttr;
1310 SALOMEDS::AttributeName_var aName;
1311 SALOMEDS::AttributeIOR_var aIOR;
1313 // Find SComponent labelled 'MED'
1314 SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
1315 myBuilder->NewCommand();
1316 if ( CORBA::is_nil(medfather) )
1317 THROW_SALOME_CORBA_EXCEPTION("SComponent labelled 'Med' not Found",SALOME::INTERNAL_ERROR);
1319 // Create SObject labelled 'MESH' if it doesn't already exit
1320 SALOMEDS::SObject_var medmeshfather = myStudy->FindObject("MEDMESH");
1321 if ( CORBA::is_nil(medmeshfather) )
1323 MESSAGE("Add Object MEDMESH");
1324 medmeshfather = myBuilder->NewObject(medfather);
1325 //medmeshfather.Name = "MEDMESH" ;
1326 anAttr = myBuilder->FindOrCreateAttribute(medmeshfather, "AttributeName");
1327 aName = SALOMEDS::AttributeName::_narrow(anAttr);
1328 aName->SetValue("MEDMESH");
1332 MESSAGE("Add a mesh Object under MED/MEDMESH");
1333 SALOMEDS::SObject_var newObj = myBuilder->NewObject(medmeshfather);
1335 ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
1336 ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
1337 CORBA::ORB_var &orb = init(0,0);
1338 string iorStr = orb->object_to_string(myIor);
1339 anAttr = myBuilder->FindOrCreateAttribute(newObj, "AttributeIOR");
1340 aIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1341 aIOR->SetValue(iorStr.c_str());
1342 anAttr = myBuilder->FindOrCreateAttribute(newObj, "AttributeName");
1343 aName = SALOMEDS::AttributeName::_narrow(anAttr);
1344 aName->SetValue(_mesh->getName().c_str());
1345 _meshId = newObj->GetID();
1346 myBuilder->CommitCommand();
1348 END_OF("Mesh_i::addInStudy(SALOMEDS::Study_ptr myStudy)");
1350 //=============================================================================
1352 * CORBA: add the Mesh in the StudyManager
1354 //=============================================================================
1355 void MESH_i::addInStudy(SALOMEDS::Study_ptr myStudy,SALOME_MED::MESH_ptr myIor,const string & fileName )
1356 throw (SALOME::SALOME_Exception,SALOMEDS::StudyBuilder::LockProtection)
1358 BEGIN_OF("MED_Mesh_i::addInStudy");
1359 if ( _meshId != "" )
1361 MESSAGE("Mesh already in Study");
1362 THROW_SALOME_CORBA_EXCEPTION("Mesh already in Study", \
1366 SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
1367 SALOMEDS::GenericAttribute_var anAttr;
1368 SALOMEDS::AttributeName_var aName;
1369 SALOMEDS::AttributeIOR_var aIOR;
1370 SALOMEDS::AttributeComment_var aComment;
1372 // Find SComponent labelled 'Med'
1373 SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
1374 if ( CORBA::is_nil(medfather) )
1375 THROW_SALOME_CORBA_EXCEPTION("SComponent labelled 'Med' not Found",SALOME::INTERNAL_ERROR);
1377 // Create SObject labelled 'MESH' if it doesn't already exit
1378 SALOMEDS::SObject_var medmeshfather = myStudy->FindObject("MEDMESH");
1379 if ( CORBA::is_nil(medmeshfather) )
1381 MESSAGE("Add Object MEDMESH");
1382 medmeshfather = myBuilder->NewObject(medfather);
1383 //medmeshfather.Name = "MEDMESH" ;
1384 anAttr = myBuilder->FindOrCreateAttribute(medmeshfather, "AttributeName");
1385 aName = SALOMEDS::AttributeName::_narrow(anAttr);
1386 aName->SetValue("MEDMESH");
1390 MESSAGE("Add a mesh Object under MED/MEDMESH");
1391 myBuilder->NewCommand();
1392 SALOMEDS::SObject_var newObj = myBuilder->NewObject(medmeshfather);
1394 ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
1395 ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
1396 CORBA::ORB_var &orb = init(0,0);
1397 string iorStr = orb->object_to_string(myIor);
1398 anAttr = myBuilder->FindOrCreateAttribute(newObj, "AttributeIOR");
1399 aIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1400 aIOR->SetValue(iorStr.c_str());
1401 anAttr = myBuilder->FindOrCreateAttribute(newObj, "AttributeName");
1402 aName = SALOMEDS::AttributeName::_narrow(anAttr);
1403 aName->SetValue(_mesh->getName().c_str());
1404 anAttr = myBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
1405 aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
1406 aComment->SetValue(fileName.c_str());
1407 _meshId = newObj->GetID();
1408 myBuilder->CommitCommand();
1410 END_OF("Mesh_i::addInStudy(SALOMEDS::Study_ptr myStudy)");
1412 //=============================================================================
1414 //=============================================================================
1416 * CORBA: write mesh in a med file
1418 //=============================================================================
1419 void MESH_i::write(CORBA::Long i, const char* driverMeshName)
1420 throw (SALOME::SALOME_Exception)
1423 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1424 SALOME::INTERNAL_ERROR);
1427 _mesh->write(i,driverMeshName);
1429 catch (MEDEXCEPTION &ex)
1431 MESSAGE("Unable to write the mesh ");
1432 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1435 //=============================================================================
1437 * CORBA: read mesh in a med file
1439 //=============================================================================
1440 void MESH_i::read(CORBA::Long i)
1441 throw (SALOME::SALOME_Exception)
1444 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1445 SALOME::INTERNAL_ERROR);
1450 catch (MEDEXCEPTION &ex)
1452 MESSAGE("Unable to read the mesh ");
1453 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1456 //=============================================================================
1458 * CORBA : release driver
1460 //=============================================================================
1461 void MESH_i::rmDriver(CORBA::Long i)
1462 throw (SALOME::SALOME_Exception)
1465 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1466 SALOME::INTERNAL_ERROR);
1471 catch (MEDEXCEPTION &ex)
1473 MESSAGE("Unable to unlink the mesh from the driver ");
1474 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
1475 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Support C++ Object"\
1476 ,SALOME::INTERNAL_ERROR);
1479 //=============================================================================
1481 * CORBA : attach driver
1483 //=============================================================================
1484 CORBA::Long MESH_i::addDriver(SALOME_MED::medDriverTypes driverType,
1485 const char* fileName, const char* meshName)
1486 throw (SALOME::SALOME_Exception)
1489 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
1490 SALOME::INTERNAL_ERROR);
1493 int drivernum=_mesh->addDriver(
1494 convertIdlDriverToMedDriver(driverType),
1499 catch (MEDEXCEPTION &ex)
1501 MESSAGE("Unable to link the mesh to the driver ");
1502 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);