1 // Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
24 // File : SMESH_MEDMesh_i.cxx
27 #include "SMESH_MEDMesh_i.hxx"
28 #include "SMESH_Gen_i.hxx"
29 #include "SMESH_Mesh_i.hxx"
31 #include "SMESHDS_Mesh.hxx"
32 #include "SMESHDS_SubMesh.hxx"
35 #include <TopExp_Explorer.hxx>
37 #include <TopoDS_Iterator.hxx>
38 #include <TopoDS_Compound.hxx>
39 #include <TopoDS_CompSolid.hxx>
40 #include <TopoDS_Solid.hxx>
41 #include <TopoDS_Shell.hxx>
42 #include <TopoDS_Face.hxx>
43 #include <TopoDS_Wire.hxx>
44 #include <TopoDS_Edge.hxx>
45 #include <TopoDS_Vertex.hxx>
46 #include <TopoDS_Shape.hxx>
47 #include <TopTools_MapOfShape.hxx>
49 #include "utilities.h"
50 #include "Utils_CorbaException.hxx"
52 #include "SMESH_MEDSupport_i.hxx"
53 #include "SMESH_MEDFamily_i.hxx"
55 # include "Utils_ORB_INIT.hxx"
56 # include "Utils_SINGLETON.hxx"
57 # include "Utils_ExceptHandlers.hxx"
66 //=============================================================================
70 //=============================================================================
71 // PN Est-ce un const ?
72 SMESH_MEDMesh_i::SMESH_MEDMesh_i()
74 BEGIN_OF("Default Constructor SMESH_MEDMesh_i");
75 END_OF("Default Constructor SMESH_MEDMesh_i");
78 //=============================================================================
82 //=============================================================================
83 SMESH_MEDMesh_i::~SMESH_MEDMesh_i()
87 //=============================================================================
91 //=============================================================================
92 SMESH_MEDMesh_i::SMESH_MEDMesh_i(::SMESH_Mesh_i * m_i):_meshId(""),
99 BEGIN_OF("Constructor SMESH_MEDMesh_i");
102 _meshDS = _mesh_i->GetImpl().GetMeshDS();
104 END_OF("Constructor SMESH_MEDMesh_i");
107 //=============================================================================
109 * CORBA: Accessor for Name
111 //=============================================================================
112 char *SMESH_MEDMesh_i::getName() throw(SALOME::SALOME_Exception)
115 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
116 SALOME::INTERNAL_ERROR);
120 SMESH_Gen_i* gen = SMESH_Gen_i::GetSMESHGen();
121 SALOMEDS::Study_var study = gen->GetCurrentStudy();
122 SALOMEDS::SObject_var meshSO = gen->ObjectToSObject( study, _mesh_i->_this());
123 if ( meshSO->_is_nil() )
124 return CORBA::string_dup("toto");
126 CORBA::String_var name = meshSO->GetName();
127 return CORBA::string_dup( name.in() );
131 MESSAGE("Exception en accedant au nom");
132 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
133 SALOME::INTERNAL_ERROR);
138 //=============================================================================
140 * CORBA: Accessor for corbaindex cuisine interne
142 //=============================================================================
143 CORBA::Long SMESH_MEDMesh_i::getCorbaIndex()throw(SALOME::SALOME_Exception)
145 MESSAGE("Non Implemente");
146 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
149 //=============================================================================
151 * CORBA: Accessor for Space Dimension
153 //=============================================================================
154 CORBA::Long SMESH_MEDMesh_i::getSpaceDimension()throw(SALOME::SALOME_Exception)
156 // PN : Il semblerait que la dimension soit fixee a 3
158 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
159 SALOME::INTERNAL_ERROR);
163 //=============================================================================
165 * CORBA: Accessor for Mesh Dimension
167 //=============================================================================
168 CORBA::Long SMESH_MEDMesh_i::getMeshDimension()throw(SALOME::SALOME_Exception)
171 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
172 SALOME::INTERNAL_ERROR);
173 // PN : Il semblerait que la dimension soit fixee a 3
175 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
176 SALOME::INTERNAL_ERROR);
179 //=============================================================================
181 * CORBA: Accessor for the boolean _isAGrid
183 //=============================================================================
184 CORBA::Boolean SMESH_MEDMesh_i::getIsAGrid() throw (SALOME::SALOME_Exception)
186 MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!!!");
188 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
192 //=============================================================================
194 * CORBA: Accessor for the connectivities, to see if they exist
196 //=============================================================================
198 SMESH_MEDMesh_i::existConnectivity(SALOME_MED::medConnectivity connectivityType,
199 SALOME_MED::medEntityMesh entity)
200 throw (SALOME::SALOME_Exception)
202 MESSAGE("!!!!!! IMPLEMENTED BUT ONLY PARTIALLY !!!!!!");
208 //=============================================================================
210 * CORBA: Accessor for Coordinate
212 //=============================================================================
213 CORBA::Double SMESH_MEDMesh_i::getCoordinate(CORBA::Long Number, CORBA::Long Axis)
214 throw (SALOME::SALOME_Exception)
216 MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!");
218 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
222 //=============================================================================
224 * CORBA: Accessor for Coordinates System
226 //=============================================================================
227 char *SMESH_MEDMesh_i::getCoordinatesSystem() throw(SALOME::SALOME_Exception)
230 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
231 SALOME::INTERNAL_ERROR);
232 // PN : En dur. Non encore prevu
235 string systcoo = "CARTESIEN";
236 return CORBA::string_dup(systcoo.c_str());
240 MESSAGE("Exception en accedant au maillage");
241 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
242 SALOME::INTERNAL_ERROR);
246 //=============================================================================
248 * CORBA: Accessor for Coordinates
250 //=============================================================================
251 SALOME_TYPES::ListOfDouble * SMESH_MEDMesh_i::getCoordinates
252 (SALOME_MED::medModeSwitch typeSwitch) throw(SALOME::SALOME_Exception)
255 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
256 SALOME::INTERNAL_ERROR);
257 SALOME_TYPES::ListOfDouble_var myseq = new SALOME_TYPES::ListOfDouble;
261 int spaceDimension = 3;
262 int nbNodes = _meshDS->NbNodes();
264 myseq->length(nbNodes * spaceDimension);
267 SMDS_NodeIteratorPtr itNodes=_meshDS->nodesIterator();
268 while(itNodes->more())
270 const SMDS_MeshNode* node = itNodes->next();
272 if (typeSwitch == SALOME_MED::MED_FULL_INTERLACE)
274 myseq[i * 3] = node->X();
275 myseq[i * 3 + 1] = node->Y();
276 myseq[i * 3 + 2] = node->Z();
277 SCRUTE(myseq[i * 3]);
278 SCRUTE(myseq[i * 3 + 1]);
279 SCRUTE(myseq[i * 3 + 2]);
283 ASSERT(typeSwitch == SALOME_MED::MED_NO_INTERLACE);
284 myseq[i] = node->X();
285 myseq[i + nbNodes] = node->Y();
286 myseq[i + (nbNodes * 2)] = node->Z();
288 SCRUTE(myseq[i + nbNodes]);
289 SCRUTE(myseq[i + (nbNodes * 2)]);
296 MESSAGE("Exception en accedant aux coordonnees");
297 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
298 SALOME::INTERNAL_ERROR);
300 return myseq._retn();
303 //=============================================================================
305 * CORBA: Accessor for Coordinates Names
307 //=============================================================================
308 SALOME_TYPES::ListOfString *
309 SMESH_MEDMesh_i::getCoordinatesNames()throw(SALOME::SALOME_Exception)
312 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
313 SALOME::INTERNAL_ERROR);
314 SALOME_TYPES::ListOfString_var myseq = new SALOME_TYPES::ListOfString;
318 int spaceDimension = 3;
319 myseq->length(spaceDimension);
320 myseq[0] = CORBA::string_dup("x");
321 myseq[1] = CORBA::string_dup("y");
322 myseq[2] = CORBA::string_dup("z");
326 MESSAGE("Exception en accedant aux noms des coordonnees");
327 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
328 SALOME::INTERNAL_ERROR);
330 return myseq._retn();
334 //=============================================================================
336 * CORBA: Accessor for Coordinates Units
338 //=============================================================================
339 SALOME_TYPES::ListOfString *
340 SMESH_MEDMesh_i::getCoordinatesUnits()throw(SALOME::SALOME_Exception)
343 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
344 SALOME::INTERNAL_ERROR);
345 SALOME_TYPES::ListOfString_var myseq = new SALOME_TYPES::ListOfString;
349 int spaceDimension = 3;
350 myseq->length(spaceDimension);
351 myseq[0] = CORBA::string_dup("m");
352 myseq[1] = CORBA::string_dup("m");
353 myseq[2] = CORBA::string_dup("m");
357 MESSAGE("Exception en accedant aux unites des coordonnees");
358 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
359 SALOME::INTERNAL_ERROR);
361 return myseq._retn();
364 //=============================================================================
366 * CORBA: Accessor for Number of Nodes
368 //=============================================================================
369 CORBA::Long SMESH_MEDMesh_i::getNumberOfNodes()throw(SALOME::SALOME_Exception)
372 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
373 SALOME::INTERNAL_ERROR);
376 return _meshDS->NbNodes();
380 MESSAGE("Exception en accedant au nombre de noeuds");
381 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
382 SALOME::INTERNAL_ERROR);
386 //=============================================================================
388 * CORBA: Accessor for number of Types
390 //=============================================================================
391 CORBA::Long SMESH_MEDMesh_i::getNumberOfTypes(SALOME_MED::medEntityMesh entity)
392 throw(SALOME::SALOME_Exception)
395 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
396 SALOME::INTERNAL_ERROR);
402 if (_mapNbTypes.find(entity) != _mapNbTypes.end())
403 retour = _mapNbTypes[entity];
408 MESSAGE("Exception en accedant au nombre de Types");
409 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
410 SALOME::INTERNAL_ERROR);
414 //=============================================================================
416 * CORBA: Accessor for existing geometry element types
417 * Not implemented for MED_ALL_ENTITIES
419 //=============================================================================
420 SALOME_MED::medGeometryElement_array *
421 SMESH_MEDMesh_i::getTypes(SALOME_MED::medEntityMesh entity) throw(SALOME::
425 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
426 SALOME::INTERNAL_ERROR);
427 if (entity == SALOME_MED::MED_ALL_ENTITIES)
428 THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ENTITIES",
432 SALOME_MED::medGeometryElement_array_var myseq =
433 new SALOME_MED::medGeometryElement_array;
436 if (_mapNbTypes.find(entity) == _mapNbTypes.end())
437 THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh",
439 int nbTypes = _mapNbTypes[entity];
441 myseq->length(nbTypes);
443 if (_mapIndToVectTypes.find(entity) == _mapIndToVectTypes.end())
444 THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh",
445 SALOME::INTERNAL_ERROR);
447 int index = _mapIndToVectTypes[entity];
448 ASSERT(_TypesId[index].size() != 0);
450 vector < SALOME_MED::medGeometryElement >::iterator it;
451 for (it = _TypesId[index].begin(); it != _TypesId[index].end(); it++)
458 MESSAGE("Exception en accedant aux differents types");
459 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
460 SALOME::INTERNAL_ERROR);
462 return myseq._retn();
465 //=============================================================================
467 * CORBA: Returns number of elements of type medGeometryElement
468 * Not implemented for MEDMEM_ALL_ELEMENTS
469 * implemented for MED_ALL_ENTITIES
471 * Dans cette implementation, il n est pas prevu de tenir compte du entity
472 * qui ne doit pas pouvoir avoir deux valeurs differentes pour un geomElement
474 //=============================================================================
475 CORBA::Long SMESH_MEDMesh_i::getNumberOfElements(SALOME_MED::
476 medEntityMesh entity,
477 SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
480 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
481 SALOME::INTERNAL_ERROR);
482 if (geomElement == SALOME_MED::MEDMEM_ALL_ELEMENTS)
483 THROW_SALOME_CORBA_EXCEPTION("Not implemented for MEDMEM_ALL_ELEMENTS",
491 if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end())
493 int index = _mapIndToSeqElts[geomElement];
495 retour = _seq_elemId[index]->length();
501 MESSAGE("Exception en accedant au nombre d élements");
502 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
503 SALOME::INTERNAL_ERROR);
507 //=============================================================================
509 * CORBA: Accessor for connectivities
511 //=============================================================================
512 SALOME_TYPES::ListOfLong *
513 SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medModeSwitch typeSwitch,
514 SALOME_MED::medConnectivity mode,
515 SALOME_MED::medEntityMesh entity,
516 SALOME_MED::medGeometryElement geomElement)
517 throw(SALOME::SALOME_Exception)
520 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
521 SALOME::INTERNAL_ERROR);
522 if (mode != SALOME_MED::MED_NODAL)
523 THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
524 if (typeSwitch == SALOME_MED::MED_NO_INTERLACE)
525 THROW_SALOME_CORBA_EXCEPTION("Not Yet Implemented", SALOME::BAD_PARAM);
529 // Faut-il renvoyer un pointeur vide ???
530 if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end())
531 THROW_SALOME_CORBA_EXCEPTION("No Such Element in the mesh",
534 int index = _mapIndToSeqElts[geomElement];
536 return _seq_elemId[index]._retn();
539 //=============================================================================
541 * CORBA: Accessor for connectivities
543 //=============================================================================
544 SALOME_TYPES::ListOfLong *
545 SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medConnectivity mode,
546 SALOME_MED::medEntityMesh entity,
547 SALOME_MED::medGeometryElement geomElement)
548 throw(SALOME::SALOME_Exception)
550 MESSAGE("Pas Implemente dans SMESH");
551 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
555 //=============================================================================
557 * CORBA: Accessor for connectivities
559 //=============================================================================
560 SALOME_TYPES::ListOfLong *
561 SMESH_MEDMesh_i::getConnectivityIndex(SALOME_MED::medConnectivity mode,
562 SALOME_MED::medEntityMesh entity)
563 throw(SALOME::SALOME_Exception)
565 MESSAGE("Pas Implemente dans SMESH");
566 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
570 //=============================================================================
572 * CORBA: Find an element corresponding to the given connectivity
574 //=============================================================================
576 SMESH_MEDMesh_i::getElementNumber(SALOME_MED::medConnectivity mode,
577 SALOME_MED::medEntityMesh entity,
578 SALOME_MED::medGeometryElement type,
579 const SALOME_TYPES::ListOfLong & connectivity)
580 throw(SALOME::SALOME_Exception)
582 const char *LOC = "getElementNumber ";
583 MESSAGE(LOC << "Pas Implemente dans SMESH");
584 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
588 //=============================================================================
590 * CORBA: Accessor for Ascendant connectivities
591 * not implemented for MED_ALL_ENTITIES and MED_MAILLE
593 //=============================================================================
594 SALOME_TYPES::ListOfLong *
595 SMESH_MEDMesh_i::getReverseConnectivity(SALOME_MED::
596 medConnectivity mode) throw(SALOME::SALOME_Exception)
598 MESSAGE("Pas Implemente dans SMESH");
599 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
603 //=============================================================================
605 * CORBA: Accessor for connectivities
607 //=============================================================================
608 SALOME_TYPES::ListOfLong *
609 SMESH_MEDMesh_i::getReverseConnectivityIndex(SALOME_MED::
610 medConnectivity mode) throw(SALOME::SALOME_Exception)
612 MESSAGE("Pas Implemente dans SMESH");
613 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
617 //=============================================================================
619 * CORBA: Returns number of families within the mesh
621 //=============================================================================
622 CORBA::Long SMESH_MEDMesh_i::getNumberOfFamilies(SALOME_MED::
623 medEntityMesh entity) throw(SALOME::SALOME_Exception)
625 if (_creeFamily == false)
628 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
629 SALOME::INTERNAL_ERROR);
630 return _families.size();
633 //=============================================================================
635 * CORBA: Returns number of groups within the mesh
637 //=============================================================================
638 CORBA::Long SMESH_MEDMesh_i::getNumberOfGroups(SALOME_MED::medEntityMesh entity)
639 throw(SALOME::SALOME_Exception)
642 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
643 SALOME::INTERNAL_ERROR);
644 MESSAGE(" Pas d implementation des groupes dans SMESH");
648 //=============================================================================
650 * CORBA: Returns references for families within the mesh
652 //=============================================================================
653 SALOME_MED::Family_array *
654 SMESH_MEDMesh_i::getFamilies(SALOME_MED::
655 medEntityMesh entity) throw(SALOME::SALOME_Exception)
657 if (_creeFamily == false)
660 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
661 SALOME::INTERNAL_ERROR);
662 SALOME_MED::Family_array_var myseq = new SALOME_MED::Family_array;
663 int nbfam = _families.size();
664 myseq->length(nbfam);
666 vector < SALOME_MED::FAMILY_ptr >::iterator it;
667 for (it = _families.begin(); it != _families.end(); it++)
671 return myseq._retn();
674 //=============================================================================
676 * CORBA: Returns references for family i within the mesh
678 //=============================================================================
679 SALOME_MED::FAMILY_ptr SMESH_MEDMesh_i::getFamily(SALOME_MED::
680 medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception)
682 if (_creeFamily == false)
685 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
686 SALOME::INTERNAL_ERROR);
688 SCRUTE(_families[i]->getName());
689 MESSAGE(" SMESH_MEDMesh_i::getFamily " << i) return _families[i];
692 //=============================================================================
694 * CORBA: Returns references for groups within the mesh
696 //=============================================================================
697 SALOME_MED::Group_array *
698 SMESH_MEDMesh_i::getGroups(SALOME_MED::medEntityMesh entity) throw(SALOME::
702 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
703 SALOME::INTERNAL_ERROR);
704 MESSAGE(" Pas d implementation des groupes dans SMESH");
705 THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM);
708 //=============================================================================
710 * CORBA: Returns references for group i within the mesh
712 //=============================================================================
713 SALOME_MED::GROUP_ptr SMESH_MEDMesh_i::getGroup(SALOME_MED::
714 medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception)
717 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
718 SALOME::INTERNAL_ERROR);
719 MESSAGE(" Pas d implementation des groupes dans SMESH");
720 THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM);
722 //=============================================================================
724 * CORBA: Returns references for the global numbering index
726 //=============================================================================
727 SALOME_TYPES::ListOfLong*
728 SMESH_MEDMesh_i::getGlobalNumberingIndex(SALOME_MED::medEntityMesh entity)
729 throw (SALOME::SALOME_Exception)
731 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
733 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
737 //=============================================================================
739 * CORBA: Returns references for the support of boundary elements of type
742 //=============================================================================
743 SALOME_MED::SUPPORT_ptr
744 SMESH_MEDMesh_i::getBoundaryElements(SALOME_MED::medEntityMesh entity)
745 throw (SALOME::SALOME_Exception)
747 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
749 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
753 //=============================================================================
755 * CORBA: Method return a reference on a support define on all the element of
758 //=============================================================================
759 SALOME_MED::SUPPORT_ptr
760 SMESH_MEDMesh_i::getSupportOnAll(SALOME_MED::medEntityMesh entity)
761 throw (SALOME::SALOME_Exception)
763 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
765 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
769 //=============================================================================
771 * CORBA: Returns references for the support of the skin of the support
774 //=============================================================================
775 SALOME_MED::SUPPORT_ptr
776 SMESH_MEDMesh_i::getSkin(SALOME_MED::SUPPORT_ptr mySupport3D)
777 throw (SALOME::SALOME_Exception)
779 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
781 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
785 //=============================================================================
789 //=============================================================================
790 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getVolume(SALOME_MED::
791 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
793 MESSAGE("Pas Implemente dans SMESH");
794 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
798 //=============================================================================
802 //=============================================================================
803 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getArea(SALOME_MED::
804 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
806 MESSAGE("Pas Implemente dans SMESH");
807 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
811 //=============================================================================
815 //=============================================================================
816 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getLength(SALOME_MED::
817 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
819 MESSAGE("Pas Implemente dans SMESH");
820 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
824 //=============================================================================
828 //=============================================================================
829 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNormal(SALOME_MED::
830 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
832 MESSAGE("Pas Implemente dans SMESH");
833 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
837 //=============================================================================
841 //=============================================================================
842 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getBarycenter(SALOME_MED::
843 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
845 MESSAGE("Pas Implemente dans SMESH");
846 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
850 //=============================================================================
854 //=============================================================================
855 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNeighbourhood(SALOME_MED::
856 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
858 MESSAGE("Non Implemente");
859 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
863 //=============================================================================
865 * CORBA: add the Mesh in the StudyManager
868 //=============================================================================
869 void SMESH_MEDMesh_i::addInStudy(SALOMEDS::Study_ptr myStudy,
870 SALOME_MED::GMESH_ptr myIor) throw(SALOME::SALOME_Exception)
872 BEGIN_OF("MED_Mesh_i::addInStudy");
875 MESSAGE("Mesh already in Study");
876 THROW_SALOME_CORBA_EXCEPTION("Mesh already in Study",
881 * SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
883 * // Create SComponent labelled 'MED' if it doesn't already exit
884 * SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
885 * if ( CORBA::is_nil(medfather) )
887 * MESSAGE("Add Component MED");
888 * medfather = myBuilder->NewComponent("MED");
889 * //myBuilder->AddAttribute (medfather,SALOMEDS::Name,"MED");
890 * SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
891 * myBuilder->FindOrCreateAttribute(medfather, "AttributeName"));
892 * aName->SetValue("MED");
894 * myBuilder->DefineComponentInstance(medfather,myIor);
898 * MESSAGE("Add a mesh Object under MED");
899 * myBuilder->NewCommand();
900 * SALOMEDS::SObject_var newObj = myBuilder->NewObject(medfather);
902 * ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
903 * ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
904 * CORBA::ORB_var &orb = init(0,0);
905 * CORBA::String_var iorStr = orb->object_to_string(myIor);
906 * //myBuilder->AddAttribute(newObj,SALOMEDS::IOR,iorStr.in());
907 * SALOMEDS::AttributeIOR_var aIOR = SALOMEDS::AttributeIOR::_narrow(
908 * myBuilder->FindOrCreateAttribute(newObj, "AttributeIOR"));
909 * aIOR->SetValue(iorStr.c_str());
911 * //myBuilder->AddAttribute(newObj,SALOMEDS::Name,_mesh_i->getName().c_str());
912 * SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
913 * myBuilder->FindOrCreateAttribute(newObj, "AttributeName"));
914 * aName->SetValue(_mesh_i->getName().c_str());
916 * _meshId = newObj->GetID();
917 * myBuilder->CommitCommand();
920 END_OF("Mesh_i::addInStudy(SALOMEDS::Study_ptr myStudy)");
923 //=============================================================================
925 * CORBA: write mesh in a med file
927 //=============================================================================
928 void SMESH_MEDMesh_i::write(CORBA::Long i, const char *driverMeshName)
929 throw(SALOME::SALOME_Exception)
931 MESSAGE("Non Implemente");
932 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
935 //=============================================================================
937 * CORBA: read mesh in a med file
939 //=============================================================================
940 void SMESH_MEDMesh_i::read(CORBA::Long i) throw(SALOME::SALOME_Exception)
942 MESSAGE("Non Implemente");
943 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
946 //=============================================================================
948 * CORBA : release driver
950 //=============================================================================
951 void SMESH_MEDMesh_i::rmDriver(CORBA::Long i) throw(SALOME::SALOME_Exception)
953 MESSAGE("Non Implemente");
954 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
957 //=============================================================================
959 * CORBA : attach driver
961 //=============================================================================
962 CORBA::Long SMESH_MEDMesh_i::addDriver(SALOME_MED::medDriverTypes driverType,
963 const char *fileName, const char *meshName) throw(SALOME::SALOME_Exception)
965 MESSAGE("Non Implemente");
966 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
970 //=============================================================================
972 * Calcule le Nb d'elements par entite geometrique
974 //=============================================================================
975 void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception)
981 _mapNbTypes[SALOME_MED::MED_NODE] = 1;
982 // On compte les aretes MEDMEM_SEG2 ou MEDMEM_SEG3
983 // On range les elements dans les vecteurs correspondants
985 _mapIndToSeqElts[SALOME_MED::MEDMEM_SEG2] = _indexElts++;
986 _mapIndToSeqElts[SALOME_MED::MEDMEM_SEG3] = _indexElts++;
987 _mapIndToVectTypes[SALOME_MED::MED_EDGE] = _indexEnts++;
991 SALOME_MED::medGeometryElement medElement;
993 SMDS_EdgeIteratorPtr itEdges=_meshDS->edgesIterator();
994 while(itEdges->more())
996 const SMDS_MeshEdge* elem = itEdges->next();
997 int nb_of_nodes = elem->NbNodes();
1003 medElement = SALOME_MED::MEDMEM_SEG2;
1004 if (trouveSeg2 == 0)
1007 _TypesId[SALOME_MED::MED_EDGE].
1008 push_back(SALOME_MED::MEDMEM_SEG2);
1014 medElement = SALOME_MED::MEDMEM_SEG3;
1015 if (trouveSeg3 == 0)
1018 _TypesId[SALOME_MED::MED_EDGE].
1019 push_back(SALOME_MED::MEDMEM_SEG3);
1024 int index = _mapIndToSeqElts[medElement];
1026 // Traitement de l arete
1028 int longueur = _seq_elemId[index]->length();
1029 _seq_elemId[index]->length(longueur + nb_of_nodes);
1031 SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
1033 for(int k=0; itn->more(); k++)
1034 _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
1037 _mapNbTypes[SALOME_MED::MED_EDGE] = trouveSeg2 + trouveSeg3;
1039 // On compte les faces MEDMEM_TRIA3, MEDMEM_HEXA8, MEDMEM_TRIA6
1040 // On range les elements dans les vecteurs correspondants
1041 int trouveTria3 = 0;
1042 int trouveTria6 = 0;
1043 int trouveQuad4 = 0;
1045 _mapIndToSeqElts[SALOME_MED::MEDMEM_TRIA3] = _indexElts++;
1046 _mapIndToSeqElts[SALOME_MED::MEDMEM_TRIA6] = _indexElts++;
1047 _mapIndToSeqElts[SALOME_MED::MEDMEM_QUAD4] = _indexElts++;
1048 _mapIndToVectTypes[SALOME_MED::MED_FACE] = _indexEnts++;
1050 SMDS_FaceIteratorPtr itFaces=_meshDS->facesIterator();
1051 while(itFaces->more())
1053 const SMDS_MeshFace * elem = itFaces->next();
1054 int nb_of_nodes = elem->NbNodes();
1056 switch (nb_of_nodes)
1060 medElement = SALOME_MED::MEDMEM_TRIA3;
1061 if (trouveTria3 == 0)
1064 _TypesId[SALOME_MED::MED_FACE].
1065 push_back(SALOME_MED::MEDMEM_TRIA3);
1071 medElement = SALOME_MED::MEDMEM_QUAD4;
1072 if (trouveQuad4 == 0)
1075 _TypesId[SALOME_MED::MED_FACE].
1076 push_back(SALOME_MED::MEDMEM_QUAD4);
1082 medElement = SALOME_MED::MEDMEM_TRIA6;
1083 if (trouveTria6 == 0)
1086 _TypesId[SALOME_MED::MED_FACE].
1087 push_back(SALOME_MED::MEDMEM_TRIA6);
1092 int index = _mapIndToSeqElts[medElement];
1095 // Traitement de la face
1096 // Attention La numérotation des noeuds Med commence a 1
1098 int longueur = _seq_elemId[index]->length();
1099 _seq_elemId[index]->length(longueur + nb_of_nodes);
1101 SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
1103 for(int k=0; itn->more(); k++)
1104 _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
1107 _mapNbTypes[SALOME_MED::MED_FACE] =
1108 trouveTria3 + trouveTria6 + trouveQuad4;
1110 _mapIndToSeqElts[SALOME_MED::MEDMEM_HEXA8] = _indexElts++;
1111 _mapIndToVectTypes[SALOME_MED::MED_CELL] = _indexEnts++;
1112 int index = _mapIndToSeqElts[medElement];
1114 int trouveHexa8 = 0;
1116 SMDS_VolumeIteratorPtr itVolumes=_meshDS->volumesIterator();
1117 while(itVolumes->more())
1119 const SMDS_MeshVolume * elem = itVolumes->next();
1121 int nb_of_nodes = elem->NbNodes();
1122 medElement = SALOME_MED::MEDMEM_HEXA8;
1123 ASSERT(nb_of_nodes == 8);
1125 if (trouveHexa8 == 0)
1128 _TypesId[SALOME_MED::MED_CELL].push_back(SALOME_MED::MEDMEM_HEXA8);
1130 // Traitement de la maille
1131 int longueur = _seq_elemId[index]->length();
1132 _seq_elemId[index]->length(longueur + nb_of_nodes);
1134 SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
1135 for(int k=0; itn->more(); k++)
1136 _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
1139 _mapNbTypes[SALOME_MED::MED_CELL] = trouveHexa8;
1140 _mapNbTypes[SALOME_MED::MED_ALL_ENTITIES]
1142 trouveHexa8 + trouveTria3 + trouveTria6 + trouveQuad4 + trouveSeg2 +
1147 //=============================================================================
1149 * Creation des familles
1151 //=============================================================================
1152 void SMESH_MEDMesh_i::createFamilies() throw(SALOME::SALOME_Exception)
1154 Unexpect aCatch(SALOME_SalomeException);
1155 string famDes = ("Je ne sais pas");
1156 string famName0 = "Famille_";
1160 if (_creeFamily == false)
1163 //SMESH_subMesh_i *subMeshServant;
1165 map < int, SMESH_subMesh_i * >::iterator it;
1166 for (it = _mesh_i->_mapSubMesh_i.begin();
1167 it != _mesh_i->_mapSubMesh_i.end(); it++)
1169 SMESH_subMesh_i *submesh_i = (*it).second;
1170 int famIdent = (*it).first;
1172 ASSERT(famIdent < 999999999);
1173 sprintf(numero, "%d\n", famIdent);
1174 famName = famName0 + numero;
1176 SMESH_MEDFamily_i *famservant =
1177 new SMESH_MEDFamily_i(famIdent, submesh_i,
1178 famName, famDes, SALOME_MED::MED_NODE);
1180 SALOME_MED::FAMILY_ptr famille = SALOME_MED::FAMILY::_nil();
1181 POA_SALOME_MED::FAMILY* servantbase = dynamic_cast<POA_SALOME_MED::FAMILY*>(famservant);
1183 famille = SALOME_MED::FAMILY::_narrow( servantbase->_this() );
1185 SALOME_MED::FAMILY_ptr famille =
1186 SALOME_MED::FAMILY::_narrow( famservant->POA_SALOME_MED::FAMILY::_this() );
1188 _families.push_back(famille);
1192 //=============================================================================
1194 * Gives informations of the considered mesh.
1196 //=============================================================================
1197 SALOME_MED::GMESH::meshInfos * SMESH_MEDMesh_i::getMeshGlobal()
1198 throw (SALOME::SALOME_Exception)
1200 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
1202 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
1207 //================================================================================
1209 * \brief Converts this GMESH into MESH
1211 //================================================================================
1213 SALOME_MED::MESH_ptr SMESH_MEDMesh_i::convertInMESH() throw (SALOME::SALOME_Exception)
1215 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
1217 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
1222 //=============================================================================
1224 * Gives informations on coordinates of the considered mesh.
1226 //=============================================================================
1227 SALOME_MED::GMESH::coordinateInfos * SMESH_MEDMesh_i::getCoordGlobal()
1228 throw (SALOME::SALOME_Exception)
1230 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
1232 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
1236 //=============================================================================
1238 * Gives informations on connectivities of the considered mesh for the entity
1241 //=============================================================================
1242 SALOME_MED::MESH::connectivityInfos *
1243 SMESH_MEDMesh_i::getConnectGlobal(SALOME_MED::medEntityMesh entity)
1244 throw (SALOME::SALOME_Exception)
1246 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
1248 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
1252 //=============================================================================
1254 * Gives the type of the element number of entity entity
1256 //=============================================================================
1257 SALOME_MED::medGeometryElement
1258 SMESH_MEDMesh_i::getElementType(SALOME_MED::medEntityMesh entity,
1260 throw (SALOME::SALOME_Exception)
1262 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
1264 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
1266 return (SALOME_MED::medGeometryElement) 0;