1 // Copyright (C) 2007-2008 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
22 // SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
23 // File : SMESH_MEDMesh_i.cxx
26 #include "SMESH_MEDMesh_i.hxx"
27 #include "SMESH_Gen_i.hxx"
28 #include "SMESH_Mesh_i.hxx"
30 #include "SMESHDS_Mesh.hxx"
31 #include "SMESHDS_SubMesh.hxx"
34 #include <TopExp_Explorer.hxx>
36 #include <TopoDS_Iterator.hxx>
37 #include <TopoDS_Compound.hxx>
38 #include <TopoDS_CompSolid.hxx>
39 #include <TopoDS_Solid.hxx>
40 #include <TopoDS_Shell.hxx>
41 #include <TopoDS_Face.hxx>
42 #include <TopoDS_Wire.hxx>
43 #include <TopoDS_Edge.hxx>
44 #include <TopoDS_Vertex.hxx>
45 #include <TopoDS_Shape.hxx>
46 #include <TopTools_MapOfShape.hxx>
48 #include "utilities.h"
49 #include "Utils_CorbaException.hxx"
51 #include "SMESH_MEDSupport_i.hxx"
52 #include "SMESH_MEDFamily_i.hxx"
54 # include "Utils_ORB_INIT.hxx"
55 # include "Utils_SINGLETON.hxx"
56 # include "Utils_ExceptHandlers.hxx"
65 //=============================================================================
69 //=============================================================================
70 // PN Est-ce un const ?
71 SMESH_MEDMesh_i::SMESH_MEDMesh_i()
73 BEGIN_OF("Default Constructor SMESH_MEDMesh_i");
74 END_OF("Default Constructor SMESH_MEDMesh_i");
77 //=============================================================================
81 //=============================================================================
82 SMESH_MEDMesh_i::~SMESH_MEDMesh_i()
86 //=============================================================================
90 //=============================================================================
91 SMESH_MEDMesh_i::SMESH_MEDMesh_i(::SMESH_Mesh_i * m_i):_meshId(""),
98 BEGIN_OF("Constructor SMESH_MEDMesh_i");
101 _meshDS = _mesh_i->GetImpl().GetMeshDS();
103 END_OF("Constructor SMESH_MEDMesh_i");
106 //=============================================================================
108 * CORBA: Accessor for Name
110 //=============================================================================
111 char *SMESH_MEDMesh_i::getName() throw(SALOME::SALOME_Exception)
114 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
115 SALOME::INTERNAL_ERROR);
119 SMESH_Gen_i* gen = SMESH_Gen_i::GetSMESHGen();
120 SALOMEDS::Study_var study = gen->GetCurrentStudy();
121 SALOMEDS::SObject_var meshSO = gen->ObjectToSObject( study, _mesh_i->_this());
122 if ( meshSO->_is_nil() )
123 return CORBA::string_dup("toto");
125 CORBA::String_var name = meshSO->GetName();
126 return CORBA::string_dup( name.in() );
130 MESSAGE("Exception en accedant au nom");
131 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
132 SALOME::INTERNAL_ERROR);
137 //=============================================================================
139 * CORBA: Accessor for corbaindex cuisine interne
141 //=============================================================================
142 CORBA::Long SMESH_MEDMesh_i::getCorbaIndex()throw(SALOME::SALOME_Exception)
144 MESSAGE("Non Implemente");
145 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
148 //=============================================================================
150 * CORBA: Accessor for Space Dimension
152 //=============================================================================
153 CORBA::Long SMESH_MEDMesh_i::getSpaceDimension()throw(SALOME::SALOME_Exception)
155 // PN : Il semblerait que la dimension soit fixee a 3
157 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
158 SALOME::INTERNAL_ERROR);
162 //=============================================================================
164 * CORBA: Accessor for Mesh Dimension
166 //=============================================================================
167 CORBA::Long SMESH_MEDMesh_i::getMeshDimension()throw(SALOME::SALOME_Exception)
170 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
171 SALOME::INTERNAL_ERROR);
172 // PN : Il semblerait que la dimension soit fixee a 3
174 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
175 SALOME::INTERNAL_ERROR);
178 //=============================================================================
180 * CORBA: Accessor for the boolean _isAGrid
182 //=============================================================================
183 CORBA::Boolean SMESH_MEDMesh_i::getIsAGrid() throw (SALOME::SALOME_Exception)
185 MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!!!");
187 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
191 //=============================================================================
193 * CORBA: Accessor for the connectivities, to see if they exist
195 //=============================================================================
197 SMESH_MEDMesh_i::existConnectivity(SALOME_MED::medConnectivity connectivityType,
198 SALOME_MED::medEntityMesh entity)
199 throw (SALOME::SALOME_Exception)
201 MESSAGE("!!!!!! IMPLEMENTED BUT ONLY PARTIALLY !!!!!!");
207 //=============================================================================
209 * CORBA: Accessor for Coordinate
211 //=============================================================================
212 CORBA::Double SMESH_MEDMesh_i::getCoordinate(CORBA::Long Number, CORBA::Long Axis)
213 throw (SALOME::SALOME_Exception)
215 MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!");
217 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
221 //=============================================================================
223 * CORBA: Accessor for Coordinates System
225 //=============================================================================
226 char *SMESH_MEDMesh_i::getCoordinatesSystem() throw(SALOME::SALOME_Exception)
229 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
230 SALOME::INTERNAL_ERROR);
231 // PN : En dur. Non encore prevu
234 string systcoo = "CARTESIEN";
235 return CORBA::string_dup(systcoo.c_str());
239 MESSAGE("Exception en accedant au maillage");
240 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
241 SALOME::INTERNAL_ERROR);
245 //=============================================================================
247 * CORBA: Accessor for Coordinates
249 //=============================================================================
250 SALOME_MED::double_array * SMESH_MEDMesh_i::getCoordinates
251 (SALOME_MED::medModeSwitch typeSwitch) throw(SALOME::SALOME_Exception)
254 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
255 SALOME::INTERNAL_ERROR);
256 SALOME_MED::double_array_var myseq = new SALOME_MED::double_array;
260 int spaceDimension = 3;
261 int nbNodes = _meshDS->NbNodes();
263 myseq->length(nbNodes * spaceDimension);
266 SMDS_NodeIteratorPtr itNodes=_meshDS->nodesIterator();
267 while(itNodes->more())
269 const SMDS_MeshNode* node = itNodes->next();
271 if (typeSwitch == SALOME_MED::MED_FULL_INTERLACE)
273 myseq[i * 3] = node->X();
274 myseq[i * 3 + 1] = node->Y();
275 myseq[i * 3 + 2] = node->Z();
276 SCRUTE(myseq[i * 3]);
277 SCRUTE(myseq[i * 3 + 1]);
278 SCRUTE(myseq[i * 3 + 2]);
282 ASSERT(typeSwitch == SALOME_MED::MED_NO_INTERLACE);
283 myseq[i] = node->X();
284 myseq[i + nbNodes] = node->Y();
285 myseq[i + (nbNodes * 2)] = node->Z();
287 SCRUTE(myseq[i + nbNodes]);
288 SCRUTE(myseq[i + (nbNodes * 2)]);
295 MESSAGE("Exception en accedant aux coordonnees");
296 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
297 SALOME::INTERNAL_ERROR);
299 return myseq._retn();
302 //=============================================================================
304 * CORBA: Accessor for Coordinates Names
306 //=============================================================================
307 SALOME_MED::string_array *
308 SMESH_MEDMesh_i::getCoordinatesNames()throw(SALOME::SALOME_Exception)
311 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
312 SALOME::INTERNAL_ERROR);
313 SALOME_MED::string_array_var myseq = new SALOME_MED::string_array;
317 int spaceDimension = 3;
318 myseq->length(spaceDimension);
319 myseq[0] = CORBA::string_dup("x");
320 myseq[1] = CORBA::string_dup("y");
321 myseq[2] = CORBA::string_dup("z");
325 MESSAGE("Exception en accedant aux noms des coordonnees");
326 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
327 SALOME::INTERNAL_ERROR);
329 return myseq._retn();
333 //=============================================================================
335 * CORBA: Accessor for Coordinates Units
337 //=============================================================================
338 SALOME_MED::string_array *
339 SMESH_MEDMesh_i::getCoordinatesUnits()throw(SALOME::SALOME_Exception)
342 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
343 SALOME::INTERNAL_ERROR);
344 SALOME_MED::string_array_var myseq = new SALOME_MED::string_array;
348 int spaceDimension = 3;
349 myseq->length(spaceDimension);
350 myseq[0] = CORBA::string_dup("m");
351 myseq[1] = CORBA::string_dup("m");
352 myseq[2] = CORBA::string_dup("m");
356 MESSAGE("Exception en accedant aux unites des coordonnees");
357 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
358 SALOME::INTERNAL_ERROR);
360 return myseq._retn();
363 //=============================================================================
365 * CORBA: Accessor for Number of Nodes
367 //=============================================================================
368 CORBA::Long SMESH_MEDMesh_i::getNumberOfNodes()throw(SALOME::SALOME_Exception)
371 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
372 SALOME::INTERNAL_ERROR);
375 return _meshDS->NbNodes();
379 MESSAGE("Exception en accedant au nombre de noeuds");
380 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
381 SALOME::INTERNAL_ERROR);
385 //=============================================================================
387 * CORBA: Accessor for number of Types
389 //=============================================================================
390 CORBA::Long SMESH_MEDMesh_i::getNumberOfTypes(SALOME_MED::medEntityMesh entity)
391 throw(SALOME::SALOME_Exception)
394 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
395 SALOME::INTERNAL_ERROR);
401 if (_mapNbTypes.find(entity) != _mapNbTypes.end())
402 retour = _mapNbTypes[entity];
407 MESSAGE("Exception en accedant au nombre de Types");
408 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
409 SALOME::INTERNAL_ERROR);
413 //=============================================================================
415 * CORBA: Accessor for existing geometry element types
416 * Not implemented for MED_ALL_ENTITIES
418 //=============================================================================
419 SALOME_MED::medGeometryElement_array *
420 SMESH_MEDMesh_i::getTypes(SALOME_MED::medEntityMesh entity) throw(SALOME::
424 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
425 SALOME::INTERNAL_ERROR);
426 if (entity == SALOME_MED::MED_ALL_ENTITIES)
427 THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ENTITIES",
431 SALOME_MED::medGeometryElement_array_var myseq =
432 new SALOME_MED::medGeometryElement_array;
435 if (_mapNbTypes.find(entity) == _mapNbTypes.end())
436 THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh",
438 int nbTypes = _mapNbTypes[entity];
440 myseq->length(nbTypes);
442 if (_mapIndToVectTypes.find(entity) == _mapIndToVectTypes.end())
443 THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh",
444 SALOME::INTERNAL_ERROR);
446 int index = _mapIndToVectTypes[entity];
447 ASSERT(_TypesId[index].size() != 0);
449 vector < SALOME_MED::medGeometryElement >::iterator it;
450 for (it = _TypesId[index].begin(); it != _TypesId[index].end(); it++)
457 MESSAGE("Exception en accedant aux differents types");
458 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
459 SALOME::INTERNAL_ERROR);
461 return myseq._retn();
464 //=============================================================================
466 * CORBA: Returns number of elements of type medGeometryElement
467 * Not implemented for MED_ALL_ELEMENTS
468 * implemented for MED_ALL_ENTITIES
470 * Dans cette implementation, il n est pas prevu de tenir compte du entity
471 * qui ne doit pas pouvoir avoir deux valeurs differentes pour un geomElement
473 //=============================================================================
474 CORBA::Long SMESH_MEDMesh_i::getNumberOfElements(SALOME_MED::
475 medEntityMesh entity,
476 SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
479 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
480 SALOME::INTERNAL_ERROR);
481 if (geomElement == SALOME_MED::MED_ALL_ELEMENTS)
482 THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ELEMENTS",
490 if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end())
492 int index = _mapIndToSeqElts[geomElement];
494 retour = _seq_elemId[index]->length();
500 MESSAGE("Exception en accedant au nombre d élements");
501 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
502 SALOME::INTERNAL_ERROR);
506 //=============================================================================
508 * CORBA: Accessor for connectivities
510 //=============================================================================
511 SALOME_MED::long_array *
512 SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medModeSwitch typeSwitch,
513 SALOME_MED::medConnectivity mode,
514 SALOME_MED::medEntityMesh entity,
515 SALOME_MED::medGeometryElement geomElement)
516 throw(SALOME::SALOME_Exception)
519 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
520 SALOME::INTERNAL_ERROR);
521 if (mode != SALOME_MED::MED_NODAL)
522 THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
523 if (typeSwitch == SALOME_MED::MED_NO_INTERLACE)
524 THROW_SALOME_CORBA_EXCEPTION("Not Yet Implemented", SALOME::BAD_PARAM);
528 // Faut-il renvoyer un pointeur vide ???
529 if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end())
530 THROW_SALOME_CORBA_EXCEPTION("No Such Element in the mesh",
533 int index = _mapIndToSeqElts[geomElement];
535 return _seq_elemId[index]._retn();
538 //=============================================================================
540 * CORBA: Accessor for connectivities
542 //=============================================================================
543 SALOME_MED::long_array *
544 SMESH_MEDMesh_i::getConnectivityIndex(SALOME_MED::medConnectivity mode,
545 SALOME_MED::medEntityMesh entity)
546 throw(SALOME::SALOME_Exception)
548 MESSAGE("Pas Implemente dans SMESH");
549 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
553 //=============================================================================
555 * CORBA: Find an element corresponding to the given connectivity
557 //=============================================================================
559 SMESH_MEDMesh_i::getElementNumber(SALOME_MED::medConnectivity mode,
560 SALOME_MED::medEntityMesh entity,
561 SALOME_MED::medGeometryElement type,
562 const SALOME_MED::long_array & connectivity)
563 throw(SALOME::SALOME_Exception)
565 const char *LOC = "getElementNumber ";
566 MESSAGE(LOC << "Pas Implemente dans SMESH");
567 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
571 //=============================================================================
573 * CORBA: Accessor for Ascendant connectivities
574 * not implemented for MED_ALL_ENTITIES and MED_MAILLE
576 //=============================================================================
577 SALOME_MED::long_array *
578 SMESH_MEDMesh_i::getReverseConnectivity(SALOME_MED::
579 medConnectivity mode) throw(SALOME::SALOME_Exception)
581 MESSAGE("Pas Implemente dans SMESH");
582 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
586 //=============================================================================
588 * CORBA: Accessor for connectivities
590 //=============================================================================
591 SALOME_MED::long_array *
592 SMESH_MEDMesh_i::getReverseConnectivityIndex(SALOME_MED::
593 medConnectivity mode) throw(SALOME::SALOME_Exception)
595 MESSAGE("Pas Implemente dans SMESH");
596 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
600 //=============================================================================
602 * CORBA: Returns number of families within the mesh
604 //=============================================================================
605 CORBA::Long SMESH_MEDMesh_i::getNumberOfFamilies(SALOME_MED::
606 medEntityMesh entity) throw(SALOME::SALOME_Exception)
608 if (_creeFamily == false)
611 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
612 SALOME::INTERNAL_ERROR);
613 return _families.size();
616 //=============================================================================
618 * CORBA: Returns number of groups within the mesh
620 //=============================================================================
621 CORBA::Long SMESH_MEDMesh_i::getNumberOfGroups(SALOME_MED::medEntityMesh entity)
622 throw(SALOME::SALOME_Exception)
625 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
626 SALOME::INTERNAL_ERROR);
627 MESSAGE(" Pas d implementation des groupes dans SMESH");
631 //=============================================================================
633 * CORBA: Returns references for families within the mesh
635 //=============================================================================
636 SALOME_MED::Family_array *
637 SMESH_MEDMesh_i::getFamilies(SALOME_MED::
638 medEntityMesh entity) throw(SALOME::SALOME_Exception)
640 if (_creeFamily == false)
643 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
644 SALOME::INTERNAL_ERROR);
645 SALOME_MED::Family_array_var myseq = new SALOME_MED::Family_array;
646 int nbfam = _families.size();
647 myseq->length(nbfam);
649 vector < SALOME_MED::FAMILY_ptr >::iterator it;
650 for (it = _families.begin(); it != _families.end(); it++)
654 return myseq._retn();
657 //=============================================================================
659 * CORBA: Returns references for family i within the mesh
661 //=============================================================================
662 SALOME_MED::FAMILY_ptr SMESH_MEDMesh_i::getFamily(SALOME_MED::
663 medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception)
665 if (_creeFamily == false)
668 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
669 SALOME::INTERNAL_ERROR);
671 SCRUTE(_families[i]->getName());
672 MESSAGE(" SMESH_MEDMesh_i::getFamily " << i) return _families[i];
675 //=============================================================================
677 * CORBA: Returns references for groups within the mesh
679 //=============================================================================
680 SALOME_MED::Group_array *
681 SMESH_MEDMesh_i::getGroups(SALOME_MED::medEntityMesh entity) throw(SALOME::
685 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
686 SALOME::INTERNAL_ERROR);
687 MESSAGE(" Pas d implementation des groupes dans SMESH");
688 THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM);
691 //=============================================================================
693 * CORBA: Returns references for group i within the mesh
695 //=============================================================================
696 SALOME_MED::GROUP_ptr SMESH_MEDMesh_i::getGroup(SALOME_MED::
697 medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception)
700 THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
701 SALOME::INTERNAL_ERROR);
702 MESSAGE(" Pas d implementation des groupes dans SMESH");
703 THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM);
705 //=============================================================================
707 * CORBA: Returns references for the global numbering index
709 //=============================================================================
710 SALOME_MED::long_array*
711 SMESH_MEDMesh_i::getGlobalNumberingIndex(SALOME_MED::medEntityMesh entity)
712 throw (SALOME::SALOME_Exception)
714 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
716 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
720 //=============================================================================
722 * CORBA: Returns references for the support of boundary elements of type
725 //=============================================================================
726 SALOME_MED::SUPPORT_ptr
727 SMESH_MEDMesh_i::getBoundaryElements(SALOME_MED::medEntityMesh entity)
728 throw (SALOME::SALOME_Exception)
730 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
732 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
736 //=============================================================================
738 * CORBA: Method return a reference on a support define on all the element of
741 //=============================================================================
742 SALOME_MED::SUPPORT_ptr
743 SMESH_MEDMesh_i::getSupportOnAll(SALOME_MED::medEntityMesh entity)
744 throw (SALOME::SALOME_Exception)
746 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
748 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
752 //=============================================================================
754 * CORBA: Returns references for the support of the skin of the support
757 //=============================================================================
758 SALOME_MED::SUPPORT_ptr
759 SMESH_MEDMesh_i::getSkin(SALOME_MED::SUPPORT_ptr mySupport3D)
760 throw (SALOME::SALOME_Exception)
762 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
764 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
768 //=============================================================================
772 //=============================================================================
773 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getVolume(SALOME_MED::
774 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
776 MESSAGE("Pas Implemente dans SMESH");
777 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
781 //=============================================================================
785 //=============================================================================
786 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getArea(SALOME_MED::
787 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
789 MESSAGE("Pas Implemente dans SMESH");
790 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
794 //=============================================================================
798 //=============================================================================
799 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getLength(SALOME_MED::
800 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
802 MESSAGE("Pas Implemente dans SMESH");
803 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
807 //=============================================================================
811 //=============================================================================
812 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNormal(SALOME_MED::
813 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
815 MESSAGE("Pas Implemente dans SMESH");
816 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
820 //=============================================================================
824 //=============================================================================
825 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getBarycenter(SALOME_MED::
826 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
828 MESSAGE("Pas Implemente dans SMESH");
829 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
833 //=============================================================================
837 //=============================================================================
838 SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNeighbourhood(SALOME_MED::
839 SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
841 MESSAGE("Non Implemente");
842 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
846 //=============================================================================
848 * CORBA: add the Mesh in the StudyManager
851 //=============================================================================
852 void SMESH_MEDMesh_i::addInStudy(SALOMEDS::Study_ptr myStudy,
853 SALOME_MED::MESH_ptr myIor) throw(SALOME::SALOME_Exception)
855 BEGIN_OF("MED_Mesh_i::addInStudy");
858 MESSAGE("Mesh already in Study");
859 THROW_SALOME_CORBA_EXCEPTION("Mesh already in Study",
864 * SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
866 * // Create SComponent labelled 'MED' if it doesn't already exit
867 * SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
868 * if ( CORBA::is_nil(medfather) )
870 * MESSAGE("Add Component MED");
871 * medfather = myBuilder->NewComponent("MED");
872 * //myBuilder->AddAttribute (medfather,SALOMEDS::Name,"MED");
873 * SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
874 * myBuilder->FindOrCreateAttribute(medfather, "AttributeName"));
875 * aName->SetValue("MED");
877 * myBuilder->DefineComponentInstance(medfather,myIor);
881 * MESSAGE("Add a mesh Object under MED");
882 * myBuilder->NewCommand();
883 * SALOMEDS::SObject_var newObj = myBuilder->NewObject(medfather);
885 * ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
886 * ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
887 * CORBA::ORB_var &orb = init(0,0);
888 * CORBA::String_var iorStr = orb->object_to_string(myIor);
889 * //myBuilder->AddAttribute(newObj,SALOMEDS::IOR,iorStr.in());
890 * SALOMEDS::AttributeIOR_var aIOR = SALOMEDS::AttributeIOR::_narrow(
891 * myBuilder->FindOrCreateAttribute(newObj, "AttributeIOR"));
892 * aIOR->SetValue(iorStr.c_str());
894 * //myBuilder->AddAttribute(newObj,SALOMEDS::Name,_mesh_i->getName().c_str());
895 * SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
896 * myBuilder->FindOrCreateAttribute(newObj, "AttributeName"));
897 * aName->SetValue(_mesh_i->getName().c_str());
899 * _meshId = newObj->GetID();
900 * myBuilder->CommitCommand();
903 END_OF("Mesh_i::addInStudy(SALOMEDS::Study_ptr myStudy)");
906 //=============================================================================
908 * CORBA: write mesh in a med file
910 //=============================================================================
911 void SMESH_MEDMesh_i::write(CORBA::Long i, const char *driverMeshName)
912 throw(SALOME::SALOME_Exception)
914 MESSAGE("Non Implemente");
915 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
918 //=============================================================================
920 * CORBA: read mesh in a med file
922 //=============================================================================
923 void SMESH_MEDMesh_i::read(CORBA::Long i) throw(SALOME::SALOME_Exception)
925 MESSAGE("Non Implemente");
926 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
929 //=============================================================================
931 * CORBA : release driver
933 //=============================================================================
934 void SMESH_MEDMesh_i::rmDriver(CORBA::Long i) throw(SALOME::SALOME_Exception)
936 MESSAGE("Non Implemente");
937 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
940 //=============================================================================
942 * CORBA : attach driver
944 //=============================================================================
945 CORBA::Long SMESH_MEDMesh_i::addDriver(SALOME_MED::medDriverTypes driverType,
946 const char *fileName, const char *meshName) throw(SALOME::SALOME_Exception)
948 MESSAGE("Non Implemente");
949 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
953 //=============================================================================
955 * Calcule le Nb d'elements par entite geometrique
957 //=============================================================================
958 void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception)
964 _mapNbTypes[SALOME_MED::MED_NODE] = 1;
965 // On compte les aretes MED_SEG2 ou MED_SEG3
966 // On range les elements dans les vecteurs correspondants
968 _mapIndToSeqElts[SALOME_MED::MED_SEG2] = _indexElts++;
969 _mapIndToSeqElts[SALOME_MED::MED_SEG3] = _indexElts++;
970 _mapIndToVectTypes[SALOME_MED::MED_EDGE] = _indexEnts++;
974 SALOME_MED::medGeometryElement medElement;
976 SMDS_EdgeIteratorPtr itEdges=_meshDS->edgesIterator();
977 while(itEdges->more())
979 const SMDS_MeshEdge* elem = itEdges->next();
980 int nb_of_nodes = elem->NbNodes();
986 medElement = SALOME_MED::MED_SEG2;
990 _TypesId[SALOME_MED::MED_EDGE].
991 push_back(SALOME_MED::MED_SEG2);
997 medElement = SALOME_MED::MED_SEG3;
1001 _TypesId[SALOME_MED::MED_EDGE].
1002 push_back(SALOME_MED::MED_SEG3);
1007 int index = _mapIndToSeqElts[medElement];
1009 // Traitement de l arete
1011 int longueur = _seq_elemId[index]->length();
1012 _seq_elemId[index]->length(longueur + nb_of_nodes);
1014 SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
1016 for(int k=0; itn->more(); k++)
1017 _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
1020 _mapNbTypes[SALOME_MED::MED_EDGE] = trouveSeg2 + trouveSeg3;
1022 // On compte les faces MED_TRIA3, MED_HEXA8, MED_TRIA6
1023 // On range les elements dans les vecteurs correspondants
1024 int trouveTria3 = 0;
1025 int trouveTria6 = 0;
1026 int trouveQuad4 = 0;
1028 _mapIndToSeqElts[SALOME_MED::MED_TRIA3] = _indexElts++;
1029 _mapIndToSeqElts[SALOME_MED::MED_TRIA6] = _indexElts++;
1030 _mapIndToSeqElts[SALOME_MED::MED_QUAD4] = _indexElts++;
1031 _mapIndToVectTypes[SALOME_MED::MED_FACE] = _indexEnts++;
1033 SMDS_FaceIteratorPtr itFaces=_meshDS->facesIterator();
1034 while(itFaces->more())
1036 const SMDS_MeshFace * elem = itFaces->next();
1037 int nb_of_nodes = elem->NbNodes();
1039 switch (nb_of_nodes)
1043 medElement = SALOME_MED::MED_TRIA3;
1044 if (trouveTria3 == 0)
1047 _TypesId[SALOME_MED::MED_FACE].
1048 push_back(SALOME_MED::MED_TRIA3);
1054 medElement = SALOME_MED::MED_QUAD4;
1055 if (trouveQuad4 == 0)
1058 _TypesId[SALOME_MED::MED_FACE].
1059 push_back(SALOME_MED::MED_QUAD4);
1065 medElement = SALOME_MED::MED_TRIA6;
1066 if (trouveTria6 == 0)
1069 _TypesId[SALOME_MED::MED_FACE].
1070 push_back(SALOME_MED::MED_TRIA6);
1075 int index = _mapIndToSeqElts[medElement];
1078 // Traitement de la face
1079 // Attention La numérotation des noeuds Med commence a 1
1081 int longueur = _seq_elemId[index]->length();
1082 _seq_elemId[index]->length(longueur + nb_of_nodes);
1084 SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
1086 for(int k=0; itn->more(); k++)
1087 _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
1090 _mapNbTypes[SALOME_MED::MED_FACE] =
1091 trouveTria3 + trouveTria6 + trouveQuad4;
1093 _mapIndToSeqElts[SALOME_MED::MED_HEXA8] = _indexElts++;
1094 _mapIndToVectTypes[SALOME_MED::MED_CELL] = _indexEnts++;
1095 int index = _mapIndToSeqElts[medElement];
1097 int trouveHexa8 = 0;
1099 SMDS_VolumeIteratorPtr itVolumes=_meshDS->volumesIterator();
1100 while(itVolumes->more())
1102 const SMDS_MeshVolume * elem = itVolumes->next();
1104 int nb_of_nodes = elem->NbNodes();
1105 medElement = SALOME_MED::MED_HEXA8;
1106 ASSERT(nb_of_nodes == 8);
1108 if (trouveHexa8 == 0)
1111 _TypesId[SALOME_MED::MED_CELL].push_back(SALOME_MED::MED_HEXA8);
1113 // Traitement de la maille
1114 int longueur = _seq_elemId[index]->length();
1115 _seq_elemId[index]->length(longueur + nb_of_nodes);
1117 SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
1118 for(int k=0; itn->more(); k++)
1119 _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
1122 _mapNbTypes[SALOME_MED::MED_CELL] = trouveHexa8;
1123 _mapNbTypes[SALOME_MED::MED_ALL_ENTITIES]
1125 trouveHexa8 + trouveTria3 + trouveTria6 + trouveQuad4 + trouveSeg2 +
1130 //=============================================================================
1132 * Creation des familles
1134 //=============================================================================
1135 void SMESH_MEDMesh_i::createFamilies() throw(SALOME::SALOME_Exception)
1137 Unexpect aCatch(SALOME_SalomeException);
1138 string famDes = ("Je ne sais pas");
1139 string famName0 = "Famille_";
1143 if (_creeFamily == false)
1146 //SMESH_subMesh_i *subMeshServant;
1148 map < int, SMESH_subMesh_i * >::iterator it;
1149 for (it = _mesh_i->_mapSubMesh_i.begin();
1150 it != _mesh_i->_mapSubMesh_i.end(); it++)
1152 SMESH_subMesh_i *submesh_i = (*it).second;
1153 int famIdent = (*it).first;
1155 ASSERT(famIdent < 999999999);
1156 sprintf(numero, "%d\n", famIdent);
1157 famName = famName0 + numero;
1159 SMESH_MEDFamily_i *famservant =
1160 new SMESH_MEDFamily_i(famIdent, submesh_i,
1161 famName, famDes, SALOME_MED::MED_NODE);
1163 SALOME_MED::FAMILY_ptr famille = SALOME_MED::FAMILY::_nil();
1164 POA_SALOME_MED::FAMILY* servantbase = dynamic_cast<POA_SALOME_MED::FAMILY*>(famservant);
1166 famille = SALOME_MED::FAMILY::_narrow( servantbase->_this() );
1168 SALOME_MED::FAMILY_ptr famille =
1169 SALOME_MED::FAMILY::_narrow( famservant->POA_SALOME_MED::FAMILY::_this() );
1171 _families.push_back(famille);
1175 //=============================================================================
1177 * Gives informations of the considered mesh.
1179 //=============================================================================
1180 SALOME_MED::MESH::meshInfos * SMESH_MEDMesh_i::getMeshGlobal()
1181 throw (SALOME::SALOME_Exception)
1183 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
1185 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
1189 //=============================================================================
1191 * Gives informations on coordinates of the considered mesh.
1193 //=============================================================================
1194 SALOME_MED::MESH::coordinateInfos * SMESH_MEDMesh_i::getCoordGlobal()
1195 throw (SALOME::SALOME_Exception)
1197 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
1199 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
1203 //=============================================================================
1205 * Gives informations on connectivities of the considered mesh for the entity
1208 //=============================================================================
1209 SALOME_MED::MESH::connectivityInfos *
1210 SMESH_MEDMesh_i::getConnectGlobal(SALOME_MED::medEntityMesh entity)
1211 throw (SALOME::SALOME_Exception)
1213 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
1215 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
1219 //=============================================================================
1221 * Gives the type of the element number of entity entity
1223 //=============================================================================
1224 SALOME_MED::medGeometryElement
1225 SMESH_MEDMesh_i::getElementType(SALOME_MED::medEntityMesh entity,
1227 throw (SALOME::SALOME_Exception)
1229 MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
1231 THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
1233 return (SALOME_MED::medGeometryElement) 0;