1 // SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
3 // Copyright (C) 2003 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SMESH_Mesh_i.cxx
25 // Author : Paul RASCLE, EDF
29 #include "SMESH_Mesh_i.hxx"
30 #include "SMESH_subMesh_i.hxx"
31 #include "SMESH_MEDMesh_i.hxx"
32 #include "SMESH_Group_i.hxx"
33 #include "SMESH_Filter_i.hxx"
34 #include "SMESH_PythonDump.hxx"
36 #include "Utils_CorbaException.hxx"
37 #include "Utils_ExceptHandlers.hxx"
38 #include "utilities.h"
40 #include "SALOME_NamingService.hxx"
41 #include "Utils_SINGLETON.hxx"
44 #include "SMESHDS_Command.hxx"
45 #include "SMESHDS_CommandType.hxx"
46 #include "SMESH_MeshEditor_i.hxx"
47 #include "SMESH_Gen_i.hxx"
48 #include "DriverMED_R_SMESHDS_Mesh.h"
51 #include <OSD_Path.hxx>
52 #include <OSD_File.hxx>
53 #include <OSD_Directory.hxx>
54 #include <OSD_Protection.hxx>
55 #include <TColStd_MapOfInteger.hxx>
56 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
57 #include <TColStd_SequenceOfInteger.hxx>
58 #include "TCollection_AsciiString.hxx"
66 static int MYDEBUG = 0;
68 static int MYDEBUG = 0;
72 using SMESH::TPythonDump;
74 int SMESH_Mesh_i::myIdGenerator = 0;
76 //=============================================================================
80 //=============================================================================
82 SMESH_Mesh_i::SMESH_Mesh_i( PortableServer::POA_ptr thePOA,
85 : SALOME::GenericObj_i( thePOA )
87 INFOS("SMESH_Mesh_i");
90 _id = myIdGenerator++;
92 thePOA->activate_object( this );
95 //=============================================================================
99 //=============================================================================
101 SMESH_Mesh_i::~SMESH_Mesh_i()
103 INFOS("~SMESH_Mesh_i");
104 map<int, SMESH::SMESH_GroupBase_ptr>::iterator it;
105 for ( it = _mapGroups.begin(); it != _mapGroups.end(); it++ ) {
106 SMESH_GroupBase_i* aGroup = dynamic_cast<SMESH_GroupBase_i*>( SMESH_Gen_i::GetServant( it->second ).in() );
109 // this method is colled from destructor of group (PAL6331)
110 //_impl->RemoveGroup( aGroup->GetLocalID() );
118 //=============================================================================
122 * Associates <this> mesh with <theShape> and puts a reference
123 * to <theShape> into the current study;
124 * the previous shape is substituted by the new one.
126 //=============================================================================
128 void SMESH_Mesh_i::SetShape( GEOM::GEOM_Object_ptr theShapeObject )
129 throw (SALOME::SALOME_Exception)
131 Unexpect aCatch(SALOME_SalomeException);
133 _impl->ShapeToMesh( _gen_i->GeomObjectToShape( theShapeObject ));
135 catch(SALOME_Exception & S_ex) {
136 THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
140 //=======================================================================
141 //function : GetShapeToMesh
143 //=======================================================================
145 GEOM::GEOM_Object_ptr SMESH_Mesh_i::GetShapeToMesh()
146 throw (SALOME::SALOME_Exception)
148 Unexpect aCatch(SALOME_SalomeException);
149 GEOM::GEOM_Object_var aShapeObj;
151 TopoDS_Shape S = _impl->GetMeshDS()->ShapeToMesh();
153 aShapeObj = _gen_i->ShapeToGeomObject( S );
155 catch(SALOME_Exception & S_ex) {
156 THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
158 return aShapeObj._retn();
161 //=============================================================================
165 //=============================================================================
167 static SMESH::DriverMED_ReadStatus ConvertDriverMEDReadStatus (int theStatus)
169 SMESH::DriverMED_ReadStatus res;
172 case DriverMED_R_SMESHDS_Mesh::DRS_OK:
173 res = SMESH::DRS_OK; break;
174 case DriverMED_R_SMESHDS_Mesh::DRS_EMPTY:
175 res = SMESH::DRS_EMPTY; break;
176 case DriverMED_R_SMESHDS_Mesh::DRS_WARN_RENUMBER:
177 res = SMESH::DRS_WARN_RENUMBER; break;
178 case DriverMED_R_SMESHDS_Mesh::DRS_WARN_SKIP_ELEM:
179 res = SMESH::DRS_WARN_SKIP_ELEM; break;
180 case DriverMED_R_SMESHDS_Mesh::DRS_FAIL:
182 res = SMESH::DRS_FAIL; break;
187 //=============================================================================
191 * Imports mesh data from MED file
193 //=============================================================================
195 SMESH::DriverMED_ReadStatus
196 SMESH_Mesh_i::ImportMEDFile( const char* theFileName, const char* theMeshName )
197 throw ( SALOME::SALOME_Exception )
199 Unexpect aCatch(SALOME_SalomeException);
202 status = importMEDFile( theFileName, theMeshName );
204 catch( SALOME_Exception& S_ex ) {
205 THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
208 THROW_SALOME_CORBA_EXCEPTION("ImportMEDFile(): unknown exception", SALOME::BAD_PARAM);
211 SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
212 if ( !aStudy->_is_nil() ) {
213 // publishing of the groups in the study (sub-meshes are out of scope of MED import)
214 map<int, SMESH::SMESH_GroupBase_ptr>::iterator it = _mapGroups.begin();
215 for (; it != _mapGroups.end(); it++ ) {
216 SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_duplicate( it->second );
217 _gen_i->PublishGroup( aStudy, _this(), aGroup,
218 GEOM::GEOM_Object::_nil(), aGroup->GetName());
221 return ConvertDriverMEDReadStatus(status);
224 //=============================================================================
228 * Imports mesh data from MED file
230 //=============================================================================
232 int SMESH_Mesh_i::ImportUNVFile( const char* theFileName )
233 throw ( SALOME::SALOME_Exception )
235 // Read mesh with name = <theMeshName> into SMESH_Mesh
236 _impl->UNVToMesh( theFileName );
241 //=============================================================================
245 * Imports mesh data from STL file
247 //=============================================================================
248 int SMESH_Mesh_i::ImportSTLFile( const char* theFileName )
249 throw ( SALOME::SALOME_Exception )
251 // Read mesh with name = <theMeshName> into SMESH_Mesh
252 _impl->STLToMesh( theFileName );
257 //=============================================================================
261 * Imports mesh data from MED file
263 //=============================================================================
265 int SMESH_Mesh_i::importMEDFile( const char* theFileName, const char* theMeshName )
267 // Read mesh with name = <theMeshName> and all its groups into SMESH_Mesh
268 int status = _impl->MEDToMesh( theFileName, theMeshName );
270 // Create group servants, if any groups were imported
271 list<int> aGroupIds = _impl->GetGroupIds();
272 for ( list<int>::iterator it = aGroupIds.begin(); it != aGroupIds.end(); it++ ) {
273 SMESH_Group_i* aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, *it );
275 // PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i
276 SMESH_Gen_i::GetPOA()->activate_object( aGroupImpl );
277 aGroupImpl->Register();
278 // PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i
280 SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow( aGroupImpl->_this() );
281 _mapGroups[*it] = SMESH::SMESH_Group::_duplicate( aGroup );
283 // register CORBA object for persistence
284 int nextId = _gen_i->RegisterObject( aGroup );
285 if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId);
291 //=============================================================================
295 //=============================================================================
297 static SMESH::Hypothesis_Status ConvertHypothesisStatus
298 (SMESH_Hypothesis::Hypothesis_Status theStatus)
300 SMESH::Hypothesis_Status res;
303 case SMESH_Hypothesis::HYP_OK:
304 res = SMESH::HYP_OK; break;
305 case SMESH_Hypothesis::HYP_MISSING:
306 res = SMESH::HYP_MISSING; break;
307 case SMESH_Hypothesis::HYP_CONCURENT:
308 res = SMESH::HYP_CONCURENT; break;
309 case SMESH_Hypothesis::HYP_BAD_PARAMETER:
310 res = SMESH::HYP_BAD_PARAMETER; break;
311 case SMESH_Hypothesis::HYP_INCOMPATIBLE:
312 res = SMESH::HYP_INCOMPATIBLE; break;
313 case SMESH_Hypothesis::HYP_NOTCONFORM:
314 res = SMESH::HYP_NOTCONFORM; break;
315 case SMESH_Hypothesis::HYP_ALREADY_EXIST:
316 res = SMESH::HYP_ALREADY_EXIST; break;
317 case SMESH_Hypothesis::HYP_BAD_DIM:
318 res = SMESH::HYP_BAD_DIM; break;
320 res = SMESH::HYP_UNKNOWN_FATAL;
325 //=============================================================================
329 * calls internal addHypothesis() and then adds a reference to <anHyp> under
330 * the SObject actually having a reference to <aSubShape>.
331 * NB: For this method to work, it is necessary to add a reference to sub-shape first.
333 //=============================================================================
335 SMESH::Hypothesis_Status SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
336 SMESH::SMESH_Hypothesis_ptr anHyp)
337 throw(SALOME::SALOME_Exception)
339 Unexpect aCatch(SALOME_SalomeException);
340 SMESH_Hypothesis::Hypothesis_Status status = addHypothesis( aSubShapeObject, anHyp );
342 if ( !SMESH_Hypothesis::IsStatusFatal(status) )
343 _gen_i->AddHypothesisToShape(_gen_i->GetCurrentStudy(), _this(),
344 aSubShapeObject, anHyp );
346 if(MYDEBUG) MESSAGE( " AddHypothesis(): status = " << status );
348 // Update Python script
349 TPythonDump() << "status = " << _this() << ".AddHypothesis( "
350 << aSubShapeObject << ", " << anHyp << " )";
352 return ConvertHypothesisStatus(status);
355 //=============================================================================
359 //=============================================================================
361 SMESH_Hypothesis::Hypothesis_Status
362 SMESH_Mesh_i::addHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
363 SMESH::SMESH_Hypothesis_ptr anHyp)
365 if(MYDEBUG) MESSAGE("addHypothesis");
367 if (CORBA::is_nil(aSubShapeObject))
368 THROW_SALOME_CORBA_EXCEPTION("bad subShape reference",
371 SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(anHyp);
372 if (CORBA::is_nil(myHyp))
373 THROW_SALOME_CORBA_EXCEPTION("bad hypothesis reference",
376 SMESH_Hypothesis::Hypothesis_Status status = SMESH_Hypothesis::HYP_OK;
379 TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape( aSubShapeObject);
380 int hypId = myHyp->GetId();
381 status = _impl->AddHypothesis(myLocSubShape, hypId);
382 if ( !SMESH_Hypothesis::IsStatusFatal(status) ) {
383 _mapHypo[hypId] = SMESH::SMESH_Hypothesis::_duplicate( myHyp );
384 // assure there is a corresponding submesh
385 if ( !_impl->IsMainShape( myLocSubShape )) {
386 int shapeId = _impl->GetMeshDS()->ShapeToIndex( myLocSubShape );
387 if ( _mapSubMesh_i.find( shapeId ) == _mapSubMesh_i.end() )
388 createSubMesh( aSubShapeObject );
392 catch(SALOME_Exception & S_ex)
394 THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
399 //=============================================================================
403 //=============================================================================
405 SMESH::Hypothesis_Status SMESH_Mesh_i::RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
406 SMESH::SMESH_Hypothesis_ptr anHyp)
407 throw(SALOME::SALOME_Exception)
409 Unexpect aCatch(SALOME_SalomeException);
410 SMESH_Hypothesis::Hypothesis_Status status = removeHypothesis( aSubShapeObject, anHyp );
412 if ( !SMESH_Hypothesis::IsStatusFatal(status) )
413 _gen_i->RemoveHypothesisFromShape(_gen_i->GetCurrentStudy(), _this(),
414 aSubShapeObject, anHyp );
416 // Update Python script
417 TPythonDump() << "status = " << _this() << ".RemoveHypothesis( "
418 << aSubShapeObject << ", " << anHyp << " )";
420 return ConvertHypothesisStatus(status);
423 //=============================================================================
427 //=============================================================================
429 SMESH_Hypothesis::Hypothesis_Status SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
430 SMESH::SMESH_Hypothesis_ptr anHyp)
432 if(MYDEBUG) MESSAGE("removeHypothesis()");
433 // **** proposer liste de subShape (selection multiple)
435 if (CORBA::is_nil(aSubShapeObject))
436 THROW_SALOME_CORBA_EXCEPTION("bad subShape reference",
439 SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(anHyp);
440 if (CORBA::is_nil(myHyp))
441 THROW_SALOME_CORBA_EXCEPTION("bad hypothesis reference",
444 SMESH_Hypothesis::Hypothesis_Status status = SMESH_Hypothesis::HYP_OK;
447 TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape(aSubShapeObject);
448 int hypId = myHyp->GetId();
449 status = _impl->RemoveHypothesis(myLocSubShape, hypId);
450 if ( !SMESH_Hypothesis::IsStatusFatal(status) )
451 _mapHypo.erase( hypId );
453 catch(SALOME_Exception & S_ex)
455 THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
460 //=============================================================================
464 //=============================================================================
466 SMESH::ListOfHypothesis *
467 SMESH_Mesh_i::GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject)
468 throw(SALOME::SALOME_Exception)
470 Unexpect aCatch(SALOME_SalomeException);
471 if (MYDEBUG) MESSAGE("GetHypothesisList");
472 if (CORBA::is_nil(aSubShapeObject))
473 THROW_SALOME_CORBA_EXCEPTION("bad subShape reference",
476 SMESH::ListOfHypothesis_var aList = new SMESH::ListOfHypothesis();
479 TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape(aSubShapeObject);
480 const list<const SMESHDS_Hypothesis*>& aLocalList = _impl->GetHypothesisList( myLocSubShape );
481 int i = 0, n = aLocalList.size();
484 for ( list<const SMESHDS_Hypothesis*>::const_iterator anIt = aLocalList.begin(); i < n && anIt != aLocalList.end(); anIt++ ) {
485 SMESHDS_Hypothesis* aHyp = (SMESHDS_Hypothesis*)(*anIt);
486 if ( _mapHypo.find( aHyp->GetID() ) != _mapHypo.end() )
487 aList[i++] = SMESH::SMESH_Hypothesis::_narrow( _mapHypo[aHyp->GetID()] );
492 catch(SALOME_Exception & S_ex) {
493 THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
496 return aList._retn();
499 //=============================================================================
503 //=============================================================================
504 SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::GetSubMesh(GEOM::GEOM_Object_ptr aSubShapeObject,
505 const char* theName )
506 throw(SALOME::SALOME_Exception)
508 Unexpect aCatch(SALOME_SalomeException);
509 MESSAGE("SMESH_Mesh_i::GetSubMesh");
510 if (CORBA::is_nil(aSubShapeObject))
511 THROW_SALOME_CORBA_EXCEPTION("bad subShape reference",
514 SMESH::SMESH_subMesh_var subMesh;
515 SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(_this());
517 TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape(aSubShapeObject);
519 //Get or Create the SMESH_subMesh object implementation
521 int subMeshId = _impl->GetMeshDS()->ShapeToIndex( myLocSubShape );
522 subMesh = getSubMesh( subMeshId );
524 // create a new subMesh object servant if there is none for the shape
525 if ( subMesh->_is_nil() )
526 subMesh = createSubMesh( aSubShapeObject );
528 if ( _gen_i->CanPublishInStudy( subMesh )) {
529 SALOMEDS::SObject_var aSO =
530 _gen_i->PublishSubMesh(_gen_i->GetCurrentStudy(), aMesh,
531 subMesh, aSubShapeObject, theName );
532 if ( !aSO->_is_nil()) {
533 // Update Python script
534 TPythonDump() << aSO << " = " << _this() << ".GetSubMesh( "
535 << aSubShapeObject << ", '" << theName << "' )";
539 catch(SALOME_Exception & S_ex) {
540 THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
542 return subMesh._retn();
545 //=============================================================================
549 //=============================================================================
551 void SMESH_Mesh_i::RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh )
552 throw (SALOME::SALOME_Exception)
554 if(MYDEBUG) MESSAGE("SMESH_Mesh_i::RemoveSubMesh");
555 if ( theSubMesh->_is_nil() )
558 GEOM::GEOM_Object_var aSubShapeObject;
559 SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
560 if ( !aStudy->_is_nil() ) {
561 // Remove submesh's SObject
562 SALOMEDS::SObject_var anSO = _gen_i->ObjectToSObject( aStudy, theSubMesh );
563 if ( !anSO->_is_nil() ) {
564 long aTag = SMESH_Gen_i::GetRefOnShapeTag();
565 SALOMEDS::SObject_var anObj, aRef;
566 if ( anSO->FindSubObject( aTag, anObj ) && anObj->ReferencedObject( aRef ) )
567 aSubShapeObject = GEOM::GEOM_Object::_narrow( aRef->GetObject() );
569 aStudy->NewBuilder()->RemoveObjectWithChildren( anSO );
571 // Update Python script
572 TPythonDump() << _this() << ".RemoveSubMesh( " << anSO << " )";
576 removeSubMesh( theSubMesh, aSubShapeObject.in() );
579 //=============================================================================
583 //=============================================================================
584 #define CASE2STRING(enum) case SMESH::enum: return "SMESH."#enum;
585 inline TCollection_AsciiString ElementTypeString (SMESH::ElementType theElemType)
587 switch (theElemType) {
592 CASE2STRING( VOLUME );
598 //=============================================================================
602 //=============================================================================
604 SMESH::SMESH_Group_ptr SMESH_Mesh_i::CreateGroup( SMESH::ElementType theElemType,
605 const char* theName )
606 throw(SALOME::SALOME_Exception)
608 Unexpect aCatch(SALOME_SalomeException);
609 SMESH::SMESH_Group_var aNewGroup =
610 SMESH::SMESH_Group::_narrow( createGroup( theElemType, theName ));
612 if ( _gen_i->CanPublishInStudy( aNewGroup ) ) {
613 SALOMEDS::SObject_var aSO =
614 _gen_i->PublishGroup(_gen_i->GetCurrentStudy(), _this(),
615 aNewGroup, GEOM::GEOM_Object::_nil(), theName);
616 if ( !aSO->_is_nil()) {
617 // Update Python script
618 TPythonDump() << aSO << " = " << _this() << ".CreateGroup( "
619 << ElementTypeString(theElemType) << ", '" << theName << "' )";
622 return aNewGroup._retn();
626 //=============================================================================
630 //=============================================================================
631 SMESH::SMESH_GroupOnGeom_ptr SMESH_Mesh_i::CreateGroupFromGEOM (SMESH::ElementType theElemType,
633 GEOM::GEOM_Object_ptr theGeomObj)
634 throw(SALOME::SALOME_Exception)
636 Unexpect aCatch(SALOME_SalomeException);
637 SMESH::SMESH_GroupOnGeom_var aNewGroup;
639 TopoDS_Shape aShape = _gen_i->GeomObjectToShape( theGeomObj );
640 if ( !aShape.IsNull() ) {
641 aNewGroup = SMESH::SMESH_GroupOnGeom::_narrow
642 ( createGroup( theElemType, theName, aShape ));
643 if ( _gen_i->CanPublishInStudy( aNewGroup ) ) {
644 SALOMEDS::SObject_var aSO =
645 _gen_i->PublishGroup(_gen_i->GetCurrentStudy(), _this(),
646 aNewGroup, theGeomObj, theName);
647 if ( !aSO->_is_nil()) {
648 // Update Python script
649 TPythonDump() << aSO << " = " << _this() << ".CreateGroupFromGEOM("
650 << ElementTypeString(theElemType) << ", '" << theName << "', "
651 << theGeomObj << " )";
656 return aNewGroup._retn();
659 //=============================================================================
663 //=============================================================================
665 void SMESH_Mesh_i::RemoveGroup( SMESH::SMESH_GroupBase_ptr theGroup )
666 throw (SALOME::SALOME_Exception)
668 if ( theGroup->_is_nil() )
671 SMESH_GroupBase_i* aGroup =
672 dynamic_cast<SMESH_GroupBase_i*>( SMESH_Gen_i::GetServant( theGroup ).in() );
676 SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
677 if ( !aStudy->_is_nil() ) {
678 SALOMEDS::SObject_var aGroupSO = _gen_i->ObjectToSObject( aStudy, theGroup );
680 if ( !aGroupSO->_is_nil() ) {
681 // Update Python script
682 TPythonDump() << _this() << ".RemoveGroup( " << aGroupSO << " )";
684 // Remove group's SObject
685 aStudy->NewBuilder()->RemoveObject( aGroupSO );
689 // Remove the group from SMESH data structures
690 removeGroup( aGroup->GetLocalID() );
693 //=============================================================================
694 /*! RemoveGroupWithContents
695 * Remove group with its contents
697 //=============================================================================
698 void SMESH_Mesh_i::RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup )
699 throw (SALOME::SALOME_Exception)
701 if ( theGroup->_is_nil() )
704 SMESH_GroupBase_i* aGroup =
705 dynamic_cast<SMESH_GroupBase_i*>( SMESH_Gen_i::GetServant( theGroup ).in() );
709 SMESH::long_array_var anIds = aGroup->GetListOfID();
710 SMESH::SMESH_MeshEditor_var aMeshEditor = SMESH_Mesh_i::GetMeshEditor();
712 // Update Python script
713 TPythonDump() << _this() << ".RemoveGroupWithContents( " << theGroup << " )";
716 if ( aGroup->GetType() == SMESH::NODE )
717 aMeshEditor->RemoveNodes( anIds );
719 aMeshEditor->RemoveElements( anIds );
722 RemoveGroup( theGroup );
724 // Clear python lines, created by RemoveNodes/Elements() and RemoveGroup()
725 _gen_i->RemoveLastFromPythonScript(_gen_i->GetCurrentStudy()->StudyId());
726 _gen_i->RemoveLastFromPythonScript(_gen_i->GetCurrentStudy()->StudyId());
729 //=============================================================================
731 * New group is created. All mesh elements that are
732 * present in initial groups are added to the new one
734 //=============================================================================
735 SMESH::SMESH_Group_ptr SMESH_Mesh_i::UnionGroups( SMESH::SMESH_GroupBase_ptr theGroup1,
736 SMESH::SMESH_GroupBase_ptr theGroup2,
737 const char* theName )
738 throw (SALOME::SALOME_Exception)
742 if ( theGroup1->_is_nil() || theGroup2->_is_nil() ||
743 theGroup1->GetType() != theGroup2->GetType() )
744 return SMESH::SMESH_Group::_nil();
747 SMESH::SMESH_Group_var aResGrp = CreateGroup( theGroup1->GetType(), theName );
748 if ( aResGrp->_is_nil() )
749 return SMESH::SMESH_Group::_nil();
751 SMESH::long_array_var anIds1 = theGroup1->GetListOfID();
752 SMESH::long_array_var anIds2 = theGroup2->GetListOfID();
754 TColStd_MapOfInteger aResMap;
756 for ( int i1 = 0, n1 = anIds1->length(); i1 < n1; i1++ )
757 aResMap.Add( anIds1[ i1 ] );
759 for ( int i2 = 0, n2 = anIds2->length(); i2 < n2; i2++ )
760 aResMap.Add( anIds2[ i2 ] );
762 SMESH::long_array_var aResIds = new SMESH::long_array;
763 aResIds->length( aResMap.Extent() );
766 TColStd_MapIteratorOfMapOfInteger anIter( aResMap );
767 for( ; anIter.More(); anIter.Next() )
768 aResIds[ resI++ ] = anIter.Key();
770 aResGrp->Add( aResIds );
772 // Clear python lines, created by CreateGroup() and Add()
773 SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
774 _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
775 _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
777 // Update Python script
778 TPythonDump() << aResGrp << " = " << _this() << ".UnionGroups( "
779 << theGroup1 << ", " << theGroup2 << ", '"
782 return aResGrp._retn();
786 return SMESH::SMESH_Group::_nil();
790 //=============================================================================
792 * New group is created. All mesh elements that are
793 * present in both initial groups are added to the new one.
795 //=============================================================================
796 SMESH::SMESH_Group_ptr SMESH_Mesh_i::IntersectGroups( SMESH::SMESH_GroupBase_ptr theGroup1,
797 SMESH::SMESH_GroupBase_ptr theGroup2,
798 const char* theName )
799 throw (SALOME::SALOME_Exception)
801 if ( theGroup1->_is_nil() || theGroup2->_is_nil() ||
802 theGroup1->GetType() != theGroup2->GetType() )
803 return SMESH::SMESH_Group::_nil();
805 // Create Intersection
806 SMESH::SMESH_Group_var aResGrp = CreateGroup( theGroup1->GetType(), theName );
807 if ( aResGrp->_is_nil() )
810 SMESH::long_array_var anIds1 = theGroup1->GetListOfID();
811 SMESH::long_array_var anIds2 = theGroup2->GetListOfID();
813 TColStd_MapOfInteger aMap1;
815 for ( int i1 = 0, n1 = anIds1->length(); i1 < n1; i1++ )
816 aMap1.Add( anIds1[ i1 ] );
818 TColStd_SequenceOfInteger aSeq;
820 for ( int i2 = 0, n2 = anIds2->length(); i2 < n2; i2++ )
821 if ( aMap1.Contains( anIds2[ i2 ] ) )
822 aSeq.Append( anIds2[ i2 ] );
824 SMESH::long_array_var aResIds = new SMESH::long_array;
825 aResIds->length( aSeq.Length() );
827 for ( int resI = 0, resN = aSeq.Length(); resI < resN; resI++ )
828 aResIds[ resI ] = aSeq( resI + 1 );
830 aResGrp->Add( aResIds );
832 // Clear python lines, created by CreateGroup() and Add()
833 SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
834 _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
835 _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
837 // Update Python script
838 TPythonDump() << aResGrp << " = " << _this() << ".IntersectGroups( "
839 << theGroup1 << ", " << theGroup2 << ", '" << theName << "')";
841 return aResGrp._retn();
844 //=============================================================================
846 * New group is created. All mesh elements that are present in
847 * main group but do not present in tool group are added to the new one
849 //=============================================================================
850 SMESH::SMESH_Group_ptr SMESH_Mesh_i::CutGroups( SMESH::SMESH_GroupBase_ptr theGroup1,
851 SMESH::SMESH_GroupBase_ptr theGroup2,
852 const char* theName )
853 throw (SALOME::SALOME_Exception)
855 if ( theGroup1->_is_nil() || theGroup2->_is_nil() ||
856 theGroup1->GetType() != theGroup2->GetType() )
857 return SMESH::SMESH_Group::_nil();
860 SMESH::SMESH_Group_var aResGrp = CreateGroup( theGroup1->GetType(), theName );
861 if ( aResGrp->_is_nil() )
864 SMESH::long_array_var anIds1 = theGroup1->GetListOfID();
865 SMESH::long_array_var anIds2 = theGroup2->GetListOfID();
867 TColStd_MapOfInteger aMap2;
869 for ( int i2 = 0, n2 = anIds2->length(); i2 < n2; i2++ )
870 aMap2.Add( anIds2[ i2 ] );
873 TColStd_SequenceOfInteger aSeq;
874 for ( int i1 = 0, n1 = anIds1->length(); i1 < n1; i1++ )
875 if ( !aMap2.Contains( anIds1[ i1 ] ) )
876 aSeq.Append( anIds1[ i1 ] );
878 SMESH::long_array_var aResIds = new SMESH::long_array;
879 aResIds->length( aSeq.Length() );
881 for ( int resI = 0, resN = aSeq.Length(); resI < resN; resI++ )
882 aResIds[ resI ] = aSeq( resI + 1 );
884 aResGrp->Add( aResIds );
886 // Clear python lines, created by CreateGroup() and Add()
887 SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
888 _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
889 _gen_i->RemoveLastFromPythonScript(aStudy->StudyId());
891 // Update Python script
892 TPythonDump() << aResGrp << " = " << _this() << ".CutGroups( "
893 << theGroup1 << ", " << theGroup2 << ", '"
896 return aResGrp._retn();
899 //=============================================================================
903 //=============================================================================
905 SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::createSubMesh( GEOM::GEOM_Object_ptr theSubShapeObject )
907 if(MYDEBUG) MESSAGE( "createSubMesh" );
908 TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape(theSubShapeObject);
910 ::SMESH_subMesh * mySubMesh = _impl->GetSubMesh(myLocSubShape);
911 int subMeshId = _impl->GetMeshDS()->ShapeToIndex( myLocSubShape );
912 SMESH_subMesh_i *subMeshServant = new SMESH_subMesh_i(myPOA, _gen_i, this, subMeshId);
913 SMESH::SMESH_subMesh_var subMesh
914 = SMESH::SMESH_subMesh::_narrow(subMeshServant->_this());
916 _mapSubMesh[subMeshId] = mySubMesh;
917 _mapSubMesh_i[subMeshId] = subMeshServant;
918 _mapSubMeshIor[subMeshId] = SMESH::SMESH_subMesh::_duplicate(subMesh);
920 // register CORBA object for persistence
921 int nextId = _gen_i->RegisterObject( subMesh );
922 if(MYDEBUG) MESSAGE( "Add submesh to map with id = "<< nextId);
924 return subMesh._retn();
927 //=======================================================================
928 //function : getSubMesh
930 //=======================================================================
932 SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::getSubMesh(int shapeID)
934 map<int, SMESH::SMESH_subMesh_ptr>::iterator it = _mapSubMeshIor.find( shapeID );
935 if ( it == _mapSubMeshIor.end() )
936 return SMESH::SMESH_subMesh::_nil();
938 return SMESH::SMESH_subMesh::_duplicate( (*it).second );
942 //=============================================================================
946 //=============================================================================
948 void SMESH_Mesh_i::removeSubMesh (SMESH::SMESH_subMesh_ptr theSubMesh,
949 GEOM::GEOM_Object_ptr theSubShapeObject )
951 MESSAGE("SMESH_Mesh_i::removeSubMesh()");
952 if ( theSubMesh->_is_nil() || theSubShapeObject->_is_nil() )
956 SMESH::ListOfHypothesis_var aHypList = GetHypothesisList( theSubShapeObject );
957 for ( int i = 0, n = aHypList->length(); i < n; i++ ) {
958 removeHypothesis( theSubShapeObject, aHypList[i] );
961 catch( const SALOME::SALOME_Exception& ) {
962 INFOS("SMESH_Mesh_i::removeSubMesh(): exception caught!");
965 int subMeshId = theSubMesh->GetId();
967 _mapSubMesh.erase(subMeshId);
968 _mapSubMesh_i.erase(subMeshId);
969 _mapSubMeshIor.erase(subMeshId);
970 if(MYDEBUG) MESSAGE("SMESH_Mesh_i::removeSubMesh() completed");
973 //=============================================================================
977 //=============================================================================
979 SMESH::SMESH_GroupBase_ptr SMESH_Mesh_i::createGroup (SMESH::ElementType theElemType,
981 const TopoDS_Shape& theShape )
984 SMESH::SMESH_GroupBase_var aGroup;
985 if ( _impl->AddGroup( (SMDSAbs_ElementType)theElemType, theName, anId, theShape )) {
986 SMESH_GroupBase_i* aGroupImpl;
987 if ( !theShape.IsNull() )
988 aGroupImpl = new SMESH_GroupOnGeom_i( SMESH_Gen_i::GetPOA(), this, anId );
990 aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, anId );
992 // PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i
993 SMESH_Gen_i::GetPOA()->activate_object( aGroupImpl );
994 aGroupImpl->Register();
995 // PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i
997 aGroup = SMESH::SMESH_GroupBase::_narrow( aGroupImpl->_this() );
998 _mapGroups[anId] = SMESH::SMESH_GroupBase::_duplicate( aGroup );
1000 // register CORBA object for persistence
1001 int nextId = _gen_i->RegisterObject( aGroup );
1002 if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId);
1004 return aGroup._retn();
1007 //=============================================================================
1009 * SMESH_Mesh_i::removeGroup
1011 * Should be called by ~SMESH_Group_i()
1013 //=============================================================================
1015 void SMESH_Mesh_i::removeGroup( const int theId )
1017 if(MYDEBUG) MESSAGE("SMESH_Mesh_i::removeGroup()" );
1018 if ( _mapGroups.find( theId ) != _mapGroups.end() ) {
1019 _mapGroups.erase( theId );
1020 _impl->RemoveGroup( theId );
1025 //=============================================================================
1029 //=============================================================================
1031 SMESH::log_array * SMESH_Mesh_i::GetLog(CORBA::Boolean clearAfterGet)
1032 throw(SALOME::SALOME_Exception)
1034 if(MYDEBUG) MESSAGE("SMESH_Mesh_i::GetLog");
1036 SMESH::log_array_var aLog;
1038 list < SMESHDS_Command * >logDS = _impl->GetLog();
1039 aLog = new SMESH::log_array;
1041 int lg = logDS.size();
1044 list < SMESHDS_Command * >::iterator its = logDS.begin();
1045 while(its != logDS.end()){
1046 SMESHDS_Command *com = *its;
1047 int comType = com->GetType();
1049 int lgcom = com->GetNumber();
1051 const list < int >&intList = com->GetIndexes();
1052 int inum = intList.size();
1054 list < int >::const_iterator ii = intList.begin();
1055 const list < double >&coordList = com->GetCoords();
1056 int rnum = coordList.size();
1058 list < double >::const_iterator ir = coordList.begin();
1059 aLog[indexLog].commandType = comType;
1060 aLog[indexLog].number = lgcom;
1061 aLog[indexLog].coords.length(rnum);
1062 aLog[indexLog].indexes.length(inum);
1063 for(int i = 0; i < rnum; i++){
1064 aLog[indexLog].coords[i] = *ir;
1065 //MESSAGE(" "<<i<<" "<<ir.Value());
1068 for(int i = 0; i < inum; i++){
1069 aLog[indexLog].indexes[i] = *ii;
1070 //MESSAGE(" "<<i<<" "<<ii.Value());
1079 catch(SALOME_Exception & S_ex){
1080 THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
1082 return aLog._retn();
1086 //=============================================================================
1090 //=============================================================================
1092 void SMESH_Mesh_i::ClearLog() throw(SALOME::SALOME_Exception)
1094 if(MYDEBUG) MESSAGE("SMESH_Mesh_i::ClearLog");
1098 //=============================================================================
1102 //=============================================================================
1104 CORBA::Long SMESH_Mesh_i::GetId()throw(SALOME::SALOME_Exception)
1106 if(MYDEBUG) MESSAGE("SMESH_Mesh_i::GetId");
1110 //=============================================================================
1114 //=============================================================================
1116 CORBA::Long SMESH_Mesh_i::GetStudyId()throw(SALOME::SALOME_Exception)
1121 //=============================================================================
1125 //=============================================================================
1127 void SMESH_Mesh_i::SetImpl(::SMESH_Mesh * impl)
1129 if(MYDEBUG) MESSAGE("SMESH_Mesh_i::SetImpl");
1133 //=============================================================================
1137 //=============================================================================
1139 ::SMESH_Mesh & SMESH_Mesh_i::GetImpl()
1141 if(MYDEBUG) MESSAGE("SMESH_Mesh_i::GetImpl()");
1146 //=============================================================================
1150 //=============================================================================
1152 SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditor()
1154 // Create MeshEditor
1155 SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( _impl );
1156 SMESH::SMESH_MeshEditor_var aMesh = aMeshEditor->_this();
1158 // Update Python script
1159 TPythonDump() << aMeshEditor << " = " << _this() << ".GetMeshEditor()";
1161 return aMesh._retn();
1164 //=============================================================================
1166 * Export in different formats
1168 //=============================================================================
1170 static void PrepareForWriting (const char* file)
1172 TCollection_AsciiString aFullName ((char*)file);
1173 OSD_Path aPath (aFullName);
1174 OSD_File aFile (aPath);
1175 if (aFile.Exists()) {
1176 // existing filesystem node
1177 if (aFile.KindOfFile() == OSD_FILE) {
1178 if (aFile.IsWriteable()) {
1181 if (aFile.Failed()) {
1182 TCollection_AsciiString msg ("File ");
1183 msg += aFullName + " cannot be replaced.";
1184 THROW_SALOME_CORBA_EXCEPTION(msg.ToCString(), SALOME::BAD_PARAM);
1187 TCollection_AsciiString msg ("File ");
1188 msg += aFullName + " cannot be overwritten.";
1189 THROW_SALOME_CORBA_EXCEPTION(msg.ToCString(), SALOME::BAD_PARAM);
1192 TCollection_AsciiString msg ("Location ");
1193 msg += aFullName + " is not a file.";
1194 THROW_SALOME_CORBA_EXCEPTION(msg.ToCString(), SALOME::BAD_PARAM);
1197 // nonexisting file; check if it can be created
1199 aFile.Build(OSD_WriteOnly, OSD_Protection());
1200 if (aFile.Failed()) {
1201 TCollection_AsciiString msg ("You cannot create the file ");
1202 msg += aFullName + ". Check the directory existance and access rights.";
1203 THROW_SALOME_CORBA_EXCEPTION(msg.ToCString(), SALOME::BAD_PARAM);
1211 void SMESH_Mesh_i::ExportToMED (const char* file,
1212 CORBA::Boolean auto_groups,
1213 SMESH::MED_VERSION theVersion)
1214 throw(SALOME::SALOME_Exception)
1216 Unexpect aCatch(SALOME_SalomeException);
1218 // Update Python script
1219 TPythonDump() << _this() << ".ExportToMED( '"
1220 << file << "', " << auto_groups << ", " << theVersion << " )";
1223 PrepareForWriting(file);
1224 char* aMeshName = "Mesh";
1225 SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
1226 if ( !aStudy->_is_nil() ) {
1227 SALOMEDS::SObject_var aMeshSO = _gen_i->ObjectToSObject( aStudy, _this() );
1228 if ( !aMeshSO->_is_nil() ) {
1229 aMeshName = aMeshSO->GetName();
1231 //SCRUTE(aMeshName);
1232 //SCRUTE(aMeshSO->GetID());
1234 // asv : 27.10.04 : fix of 6903: check for StudyLocked before adding attributes
1235 if ( !aStudy->GetProperties()->IsLocked() )
1237 SALOMEDS::GenericAttribute_var anAttr;
1238 SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
1239 SALOMEDS::AttributeExternalFileDef_var aFileName;
1240 anAttr=aStudyBuilder->FindOrCreateAttribute(aMeshSO, "AttributeExternalFileDef");
1241 aFileName = SALOMEDS::AttributeExternalFileDef::_narrow(anAttr);
1242 ASSERT(!aFileName->_is_nil());
1243 aFileName->SetValue(file);
1244 SALOMEDS::AttributeFileType_var aFileType;
1245 anAttr=aStudyBuilder->FindOrCreateAttribute(aMeshSO, "AttributeFileType");
1246 aFileType = SALOMEDS::AttributeFileType::_narrow(anAttr);
1247 ASSERT(!aFileType->_is_nil());
1248 aFileType->SetValue("FICHIERMED");
1252 _impl->ExportMED( file, aMeshName, auto_groups, theVersion );
1255 void SMESH_Mesh_i::ExportMED (const char* file,
1256 CORBA::Boolean auto_groups)
1257 throw(SALOME::SALOME_Exception)
1259 ExportToMED(file,auto_groups,SMESH::MED_V2_1);
1262 void SMESH_Mesh_i::ExportDAT (const char *file)
1263 throw(SALOME::SALOME_Exception)
1265 Unexpect aCatch(SALOME_SalomeException);
1267 // Update Python script
1268 TPythonDump() << _this() << ".ExportDAT( '" << file << "' )";
1271 PrepareForWriting(file);
1272 _impl->ExportDAT(file);
1275 void SMESH_Mesh_i::ExportUNV (const char *file)
1276 throw(SALOME::SALOME_Exception)
1278 Unexpect aCatch(SALOME_SalomeException);
1280 // Update Python script
1281 TPythonDump() << _this() << ".ExportUNV( '" << file << "' )";
1284 PrepareForWriting(file);
1285 _impl->ExportUNV(file);
1288 void SMESH_Mesh_i::ExportSTL (const char *file, const bool isascii)
1289 throw(SALOME::SALOME_Exception)
1291 Unexpect aCatch(SALOME_SalomeException);
1293 // Update Python script
1294 TPythonDump() << _this() << ".ExportSTL( '" << file << "', " << isascii << " )";
1297 PrepareForWriting(file);
1298 _impl->ExportSTL(file, isascii);
1301 //=============================================================================
1305 //=============================================================================
1307 SALOME_MED::MESH_ptr SMESH_Mesh_i::GetMEDMesh()throw(SALOME::SALOME_Exception)
1309 Unexpect aCatch(SALOME_SalomeException);
1310 SMESH_MEDMesh_i *aMedMesh = new SMESH_MEDMesh_i(this);
1311 SALOME_MED::MESH_var aMesh = aMedMesh->_this();
1312 return aMesh._retn();
1315 //=============================================================================
1319 //=============================================================================
1320 CORBA::Long SMESH_Mesh_i::NbNodes()throw(SALOME::SALOME_Exception)
1322 Unexpect aCatch(SALOME_SalomeException);
1323 return _impl->NbNodes();
1326 //=============================================================================
1330 //=============================================================================
1331 CORBA::Long SMESH_Mesh_i::NbElements()throw (SALOME::SALOME_Exception)
1333 Unexpect aCatch(SALOME_SalomeException);
1334 return NbEdges() + NbFaces() + NbVolumes();
1337 //=============================================================================
1341 //=============================================================================
1342 CORBA::Long SMESH_Mesh_i::NbEdges()throw(SALOME::SALOME_Exception)
1344 Unexpect aCatch(SALOME_SalomeException);
1345 return _impl->NbEdges();
1348 //=============================================================================
1352 //=============================================================================
1353 CORBA::Long SMESH_Mesh_i::NbFaces()throw(SALOME::SALOME_Exception)
1355 Unexpect aCatch(SALOME_SalomeException);
1356 return _impl->NbFaces();
1359 CORBA::Long SMESH_Mesh_i::NbTriangles()throw(SALOME::SALOME_Exception)
1361 Unexpect aCatch(SALOME_SalomeException);
1362 return _impl->NbTriangles();
1365 CORBA::Long SMESH_Mesh_i::NbQuadrangles()throw(SALOME::SALOME_Exception)
1367 Unexpect aCatch(SALOME_SalomeException);
1368 return _impl->NbQuadrangles();
1371 CORBA::Long SMESH_Mesh_i::NbPolygons()throw(SALOME::SALOME_Exception)
1373 Unexpect aCatch(SALOME_SalomeException);
1374 return _impl->NbPolygons();
1377 //=============================================================================
1381 //=============================================================================
1382 CORBA::Long SMESH_Mesh_i::NbVolumes()throw(SALOME::SALOME_Exception)
1384 Unexpect aCatch(SALOME_SalomeException);
1385 return _impl->NbVolumes();
1388 CORBA::Long SMESH_Mesh_i::NbTetras()throw(SALOME::SALOME_Exception)
1390 Unexpect aCatch(SALOME_SalomeException);
1391 return _impl->NbTetras();
1394 CORBA::Long SMESH_Mesh_i::NbHexas()throw(SALOME::SALOME_Exception)
1396 Unexpect aCatch(SALOME_SalomeException);
1397 return _impl->NbHexas();
1400 CORBA::Long SMESH_Mesh_i::NbPyramids()throw(SALOME::SALOME_Exception)
1402 Unexpect aCatch(SALOME_SalomeException);
1403 return _impl->NbPyramids();
1406 CORBA::Long SMESH_Mesh_i::NbPrisms()throw(SALOME::SALOME_Exception)
1408 Unexpect aCatch(SALOME_SalomeException);
1409 return _impl->NbPrisms();
1412 CORBA::Long SMESH_Mesh_i::NbPolyhedrons()throw(SALOME::SALOME_Exception)
1414 Unexpect aCatch(SALOME_SalomeException);
1415 return _impl->NbPolyhedrons();
1418 //=============================================================================
1422 //=============================================================================
1423 CORBA::Long SMESH_Mesh_i::NbSubMesh()throw(SALOME::SALOME_Exception)
1425 Unexpect aCatch(SALOME_SalomeException);
1426 return _impl->NbSubMesh();
1429 //=============================================================================
1433 //=============================================================================
1434 char* SMESH_Mesh_i::Dump()
1436 std::ostringstream os;
1438 return CORBA::string_dup( os.str().c_str() );
1441 //=============================================================================
1445 //=============================================================================
1446 SMESH::long_array* SMESH_Mesh_i::GetIDs()
1448 SMESH::long_array_var aResult = new SMESH::long_array();
1449 SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
1450 int aMinId = aSMESHDS_Mesh->MinElementID();
1451 int aMaxId = aSMESHDS_Mesh->MaxElementID();
1453 aResult->length(aMaxId - aMinId + 1);
1455 for (int i = 0, id = aMinId; id <= aMaxId; id++ )
1458 return aResult._retn();
1461 //=============================================================================
1465 //=============================================================================
1467 SMESH::long_array* SMESH_Mesh_i::GetElementsId()
1468 throw (SALOME::SALOME_Exception)
1470 Unexpect aCatch(SALOME_SalomeException);
1471 MESSAGE("SMESH_Mesh_i::GetElementsId");
1472 SMESH::long_array_var aResult = new SMESH::long_array();
1473 SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
1475 if ( aSMESHDS_Mesh == NULL )
1476 return aResult._retn();
1478 long nbElements = NbElements();
1479 aResult->length( nbElements );
1480 SMDS_ElemIteratorPtr anIt = aSMESHDS_Mesh->elementsIterator();
1481 for ( int i = 0, n = nbElements; i < n && anIt->more(); i++ )
1482 aResult[i] = anIt->next()->GetID();
1484 return aResult._retn();
1488 //=============================================================================
1492 //=============================================================================
1494 SMESH::long_array* SMESH_Mesh_i::GetElementsByType( SMESH::ElementType theElemType )
1495 throw (SALOME::SALOME_Exception)
1497 Unexpect aCatch(SALOME_SalomeException);
1498 MESSAGE("SMESH_subMesh_i::GetElementsByType");
1499 SMESH::long_array_var aResult = new SMESH::long_array();
1500 SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
1502 if ( aSMESHDS_Mesh == NULL )
1503 return aResult._retn();
1505 long nbElements = NbElements();
1507 // No sense in returning ids of elements along with ids of nodes:
1508 // when theElemType == SMESH::ALL, return node ids only if
1509 // there are no elements
1510 if ( theElemType == SMESH::NODE || theElemType == SMESH::ALL && nbElements == 0 )
1511 return GetNodesId();
1513 aResult->length( nbElements );
1517 SMDS_ElemIteratorPtr anIt = aSMESHDS_Mesh->elementsIterator();
1518 while ( i < nbElements && anIt->more() ) {
1519 const SMDS_MeshElement* anElem = anIt->next();
1520 if ( theElemType == SMESH::ALL || anElem->GetType() == (SMDSAbs_ElementType)theElemType )
1521 aResult[i++] = anElem->GetID();
1524 aResult->length( i );
1526 return aResult._retn();
1529 //=============================================================================
1533 //=============================================================================
1535 SMESH::long_array* SMESH_Mesh_i::GetNodesId()
1536 throw (SALOME::SALOME_Exception)
1538 Unexpect aCatch(SALOME_SalomeException);
1539 MESSAGE("SMESH_subMesh_i::GetNodesId");
1540 SMESH::long_array_var aResult = new SMESH::long_array();
1541 SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
1543 if ( aSMESHDS_Mesh == NULL )
1544 return aResult._retn();
1546 long nbNodes = NbNodes();
1547 aResult->length( nbNodes );
1548 SMDS_NodeIteratorPtr anIt = aSMESHDS_Mesh->nodesIterator();
1549 for ( int i = 0, n = nbNodes; i < n && anIt->more(); i++ )
1550 aResult[i] = anIt->next()->GetID();
1552 return aResult._retn();
1555 //=============================================================================
1559 //=============================================================================
1561 SMESH::ElementType SMESH_Mesh_i::GetElementType( const CORBA::Long id, const bool iselem )
1562 throw (SALOME::SALOME_Exception)
1564 return ( SMESH::ElementType )_impl->GetElementType( id, iselem );