X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSMESH_I%2FSMESH_Mesh_i.cxx;h=615546bea9a273128a526c06da0503165e89c2f6;hb=67312ab966a7c21fe835917978028643ffadd99e;hp=44195b8c8d748ec8c2061a04058112ae9a384466;hpb=1c1bbf6798782cb24bcab45d519817cff125ae5c;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index 44195b8c8..615546bea 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -29,12 +29,14 @@ #include "DriverMED_W_Field.h" #include "DriverMED_W_SMESHDS_Mesh.h" #include "MED_Factory.hxx" +#include "SMDS_LinearEdge.hxx" #include "SMDS_EdgePosition.hxx" #include "SMDS_ElemIterator.hxx" #include "SMDS_FacePosition.hxx" #include "SMDS_IteratorOnIterators.hxx" #include "SMDS_MeshGroup.hxx" #include "SMDS_SetIterator.hxx" +#include "SMDS_StdIterator.hxx" #include "SMDS_VolumeTool.hxx" #include "SMESHDS_Command.hxx" #include "SMESHDS_CommandType.hxx" @@ -158,7 +160,7 @@ SMESH_Mesh_i::~SMESH_Mesh_i() } _mapHypo.clear(); - // clear cashed shapes if no more meshes remain; (the cash is blame, + // clear cached shapes if no more meshes remain; (the cache is blame, // together with publishing, of spent time increasing in issue 22874) if ( _impl->NbMeshes() == 1 ) _gen_i->GetShapeReader()->ClearClientBuffer(); @@ -496,7 +498,13 @@ int SMESH_Mesh_i::ImportSTLFile( const char* theFileName ) SMESH_TRY; // Read mesh with name = into SMESH_Mesh - _impl->STLToMesh( theFileName ); + std::string name = _impl->STLToMesh( theFileName ); + if ( !name.empty() ) + { + SALOMEDS::Study_var study = _gen_i->GetCurrentStudy(); + SALOMEDS::SObject_wrap meshSO = _gen_i->ObjectToSObject( study, _this() ); + _gen_i->SetName( meshSO, name.c_str() ); + } SMESH_CATCH( SMESH::throwCorbaException ); @@ -558,7 +566,7 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::ConvertHypothesisStatus switch (theStatus) { RETURNCASE( HYP_OK ); RETURNCASE( HYP_MISSING ); - RETURNCASE( HYP_CONCURENT ); + RETURNCASE( HYP_CONCURRENT ); RETURNCASE( HYP_BAD_PARAMETER ); RETURNCASE( HYP_HIDDEN_ALGO ); RETURNCASE( HYP_HIDING_ALGO ); @@ -1096,7 +1104,8 @@ void SMESH_Mesh_i::RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup return; vector nodeIds; // to remove nodes becoming free - if ( !theGroup->IsEmpty() ) + bool isNodal = ( theGroup->GetType() == SMESH::NODE ); + if ( !isNodal && !theGroup->IsEmpty() ) { CORBA::Long elemID = theGroup->GetID( 1 ); int nbElemNodes = GetElemNbNodes( elemID ); @@ -1104,36 +1113,46 @@ void SMESH_Mesh_i::RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup nodeIds.reserve( theGroup->Size() * nbElemNodes ); } - // Remove contents + // Retrieve contents SMESH::SMESH_IDSource_var idSrc = SMESH::SMESH_IDSource::_narrow( theGroup ); SMDS_ElemIteratorPtr elemIt = GetElements( idSrc, theGroup->GetType() ); - while ( elemIt->more() ) - { - const SMDS_MeshElement* e = elemIt->next(); + SMDS_StdIterator< const SMDS_MeshElement*, SMDS_ElemIteratorPtr > elemBeg( elemIt ), elemEnd; + std::vector< const SMDS_MeshElement* > elems( theGroup->Size() ); + elems.assign( elemBeg, elemEnd ); - SMDS_ElemIteratorPtr nIt = e->nodesIterator(); - while ( nIt->more() ) - nodeIds.push_back( nIt->next()->GetID() ); + TPythonDump pyDump; // Suppress dump from RemoveGroup() + + // Remove group + RemoveGroup( theGroup ); - _impl->GetMeshDS()->RemoveElement( e ); + // Remove contents + for ( size_t i = 0; i < elems.size(); ++i ) + { + // if ( !_impl->GetMeshDS()->Contains( elems[i] )) + // continue; + if ( !isNodal ) + { + for ( SMDS_ElemIteratorPtr nIt = elems[i]->nodesIterator(); nIt->more(); ) + nodeIds.push_back( nIt->next()->GetID() ); + + _impl->GetMeshDS()->RemoveFreeElement( elems[i], /*sm=*/0 ); + } + else + { + _impl->GetMeshDS()->RemoveElement( elems[i] ); + } } // Remove free nodes - if ( theGroup->GetType() != SMESH::NODE ) - for ( size_t i = 0 ; i < nodeIds.size(); ++i ) - if ( const SMDS_MeshNode* n = _impl->GetMeshDS()->FindNode( nodeIds[i] )) - if ( n->NbInverseElements() == 0 ) - _impl->GetMeshDS()->RemoveFreeNode( n, /*sm=*/0 ); - - TPythonDump pyDump; // Supress dump from RemoveGroup() + for ( size_t i = 0 ; i < nodeIds.size(); ++i ) + if ( const SMDS_MeshNode* n = _impl->GetMeshDS()->FindNode( nodeIds[i] )) + if ( n->NbInverseElements() == 0 ) + _impl->GetMeshDS()->RemoveFreeNode( n, /*sm=*/0 ); // Update Python script (theGroup must be alive for this) pyDump << SMESH::SMESH_Mesh_var(_this()) << ".RemoveGroupWithContents( " << theGroup << " )"; - // Remove group - RemoveGroup( theGroup ); - SMESH_CATCH( SMESH::throwCorbaException ); } @@ -2546,7 +2565,7 @@ SMESH::SMESH_GroupBase_ptr SMESH_Mesh_i::createGroup (SMESH::ElementType const SMESH_PredicatePtr& thePredicate ) { std::string newName; - if ( !theName || strlen( theName ) == 0 ) + if ( !theName || !theName[0] ) { std::set< std::string > presentNames; std::map::const_iterator i_gr = _mapGroups.begin(); @@ -2943,7 +2962,7 @@ void SMESH_Mesh_i::PrepareForWriting (const char* file, bool overwrite) if ( !aFile.openForWriting() ) { msg << "You cannot create the file " << aFile.getName() - << ". Check the directory existance and access rights"; + << ". Check the directory existence and access rights"; } aFile.remove(); } @@ -3016,6 +3035,7 @@ void SMESH_Mesh_i::ExportToMEDX (const char* file, CORBA::Boolean autoDimension) throw(SALOME::SALOME_Exception) { + //MESSAGE("SMESH::MED_VERSION:"<< theVersion); SMESH_TRY; if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); @@ -3042,6 +3062,7 @@ void SMESH_Mesh_i::ExportToMED (const char* file, SMESH::MED_VERSION theVersion) throw(SALOME::SALOME_Exception) { + //MESSAGE("SMESH::MED_VERSION:"<< theVersion); ExportToMEDX(file,auto_groups,theVersion,true); } @@ -3055,7 +3076,8 @@ void SMESH_Mesh_i::ExportMED (const char* file, CORBA::Boolean auto_groups) throw(SALOME::SALOME_Exception) { - ExportToMEDX(file,auto_groups,SMESH::MED_V2_2,true); + //MESSAGE("SMESH::MED_VERSION:"<< SMESH::MED_LATEST); + ExportToMEDX(file,auto_groups,SMESH::MED_LATEST,true); } //================================================================================ @@ -3144,9 +3166,15 @@ void SMESH_Mesh_i::ExportSTL (const char *file, const bool isascii) TPythonDump() << SMESH::SMESH_Mesh_var(_this()) << ".ExportSTL( r'" << file << "', " << isascii << " )"; + CORBA::String_var name; + SALOMEDS::Study_var study = _gen_i->GetCurrentStudy(); + SALOMEDS::SObject_wrap so = _gen_i->ObjectToSObject( study, _this() ); + if ( !so->_is_nil() ) + name = so->GetName(); + // Perform Export - PrepareForWriting(file); - _impl->ExportSTL(file, isascii); + PrepareForWriting( file ); + _impl->ExportSTL( file, isascii, name.in() ); } //================================================================================ @@ -3595,8 +3623,14 @@ void SMESH_Mesh_i::ExportPartToSTL(::SMESH::SMESH_IDSource_ptr meshPart, PrepareForWriting(file); + CORBA::String_var name; + SALOMEDS::Study_var study = _gen_i->GetCurrentStudy(); + SALOMEDS::SObject_wrap so = _gen_i->ObjectToSObject( study, meshPart ); + if ( !so->_is_nil() ) + name = so->GetName(); + SMESH_MeshPartDS partDS( meshPart ); - _impl->ExportSTL(file, isascii, &partDS); + _impl->ExportSTL( file, isascii, name.in(), &partDS ); TPythonDump() << SMESH::SMESH_Mesh_var(_this()) << ".ExportPartToSTL( " << meshPart<< ", r'" << file << "', " << isascii << ")"; @@ -3610,7 +3644,8 @@ void SMESH_Mesh_i::ExportPartToSTL(::SMESH::SMESH_IDSource_ptr meshPart, void SMESH_Mesh_i::ExportCGNS(::SMESH::SMESH_IDSource_ptr meshPart, const char* file, - CORBA::Boolean overwrite) + CORBA::Boolean overwrite, + CORBA::Boolean groupElemsByType) throw (SALOME::SALOME_Exception) { #ifdef WITH_CGNS @@ -3628,8 +3663,12 @@ void SMESH_Mesh_i::ExportCGNS(::SMESH::SMESH_IDSource_ptr meshPart, CORBA::String_var name = so->GetName(); meshName = name.in(); } + SMESH_TRY; + SMESH_MeshPartDS partDS( meshPart ); - _impl->ExportCGNS(file, &partDS, meshName.c_str() ); + _impl->ExportCGNS(file, &partDS, meshName.c_str(), groupElemsByType ); + + SMESH_CATCH( SMESH::throwCorbaException ); TPythonDump() << SMESH::SMESH_Mesh_var(_this()) << ".ExportCGNS( " << meshPart<< ", r'" << file << "', " << overwrite << ")"; @@ -4073,14 +4112,14 @@ SMESH::long_array* SMESH_Mesh_i::GetNodesId() _preMeshInfo->FullLoadFromFile(); SMESH::long_array_var aResult = new SMESH::long_array(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) + if ( aMeshDS == NULL ) return aResult._retn(); long nbNodes = NbNodes(); aResult->length( nbNodes ); - SMDS_NodeIteratorPtr anIt = aSMESHDS_Mesh->nodesIterator(/*idInceasingOrder=*/true); + SMDS_NodeIteratorPtr anIt = aMeshDS->nodesIterator(); for ( int i = 0, n = nbNodes; i < n && anIt->more(); i++ ) aResult[i] = anIt->next()->GetID(); @@ -4300,12 +4339,12 @@ SMESH::double_array* SMESH_Mesh_i::GetNodeXYZ(const CORBA::Long id) _preMeshInfo->FullLoadFromFile(); SMESH::double_array_var aResult = new SMESH::double_array(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return aResult._retn(); // find node - const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(id); + const SMDS_MeshNode* aNode = aMeshDS->FindNode(id); if(!aNode) return aResult._retn(); @@ -4331,12 +4370,12 @@ SMESH::long_array* SMESH_Mesh_i::GetNodeInverseElements(const CORBA::Long id) _preMeshInfo->FullLoadFromFile(); SMESH::long_array_var aResult = new SMESH::long_array(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return aResult._retn(); // find node - const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(id); + const SMDS_MeshNode* aNode = aMeshDS->FindNode(id); if(!aNode) return aResult._retn(); @@ -4378,17 +4417,16 @@ SMESH::NodePosition* SMESH_Mesh_i::GetNodePosition(CORBA::Long NodeID) case SMDS_TOP_EDGE: aNodePosition->shapeType = GEOM::EDGE; aNodePosition->params.length(1); - aNodePosition->params[0] = - static_cast( pos )->GetUParameter(); + aNodePosition->params[0] = SMDS_EdgePositionPtr( pos )->GetUParameter(); break; - case SMDS_TOP_FACE: + case SMDS_TOP_FACE: { + SMDS_FacePositionPtr fPos = pos; aNodePosition->shapeType = GEOM::FACE; aNodePosition->params.length(2); - aNodePosition->params[0] = - static_cast( pos )->GetUParameter(); - aNodePosition->params[1] = - static_cast( pos )->GetVParameter(); + aNodePosition->params[0] = fPos->GetUParameter(); + aNodePosition->params[1] = fPos->GetVParameter(); break; + } case SMDS_TOP_VERTEX: aNodePosition->shapeType = GEOM::VERTEX; break; @@ -4463,12 +4501,12 @@ CORBA::Long SMESH_Mesh_i::GetShapeID(const CORBA::Long id) if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return -1; // try to find node - const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(id); + const SMDS_MeshNode* aNode = aMeshDS->FindNode(id); if(aNode) { return aNode->getshapeId(); } @@ -4490,12 +4528,12 @@ CORBA::Long SMESH_Mesh_i::GetShapeIDForElem(const CORBA::Long id) if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return -1; // try to find element - const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + const SMDS_MeshElement* elem = aMeshDS->FindElement(id); if(!elem) return -1; @@ -4520,10 +4558,10 @@ CORBA::Long SMESH_Mesh_i::GetElemNbNodes(const CORBA::Long id) if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) return -1; + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return -1; // try to find element - const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + const SMDS_MeshElement* elem = aMeshDS->FindElement(id); if(!elem) return -1; return elem->NbNodes(); } @@ -4542,9 +4580,9 @@ CORBA::Long SMESH_Mesh_i::GetElemNode(const CORBA::Long id, const CORBA::Long in if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) return -1; - const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return -1; + const SMDS_MeshElement* elem = aMeshDS->FindElement(id); if(!elem) return -1; if( index>=elem->NbNodes() || index<0 ) return -1; return elem->GetNode(index)->GetID(); @@ -4562,9 +4600,9 @@ SMESH::long_array* SMESH_Mesh_i::GetElemNodes(const CORBA::Long id) _preMeshInfo->FullLoadFromFile(); SMESH::long_array_var aResult = new SMESH::long_array(); - if ( SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS() ) + if ( SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS() ) { - if ( const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id) ) + if ( const SMDS_MeshElement* elem = aMeshDS->FindElement(id) ) { aResult->length( elem->NbNodes() ); for ( int i = 0; i < elem->NbNodes(); ++i ) @@ -4586,13 +4624,13 @@ CORBA::Boolean SMESH_Mesh_i::IsMediumNode(const CORBA::Long ide, const CORBA::Lo if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) return false; + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return false; // try to find node - const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(idn); + const SMDS_MeshNode* aNode = aMeshDS->FindNode(idn); if(!aNode) return false; // try to find element - const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(ide); + const SMDS_MeshElement* elem = aMeshDS->FindElement(ide); if(!elem) return false; return elem->IsMediumNode(aNode); @@ -4612,11 +4650,11 @@ CORBA::Boolean SMESH_Mesh_i::IsMediumNodeOfAnyElem(const CORBA::Long idn, if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) return false; + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return false; // try to find node - const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(idn); + const SMDS_MeshNode* aNode = aMeshDS->FindNode(idn); if(!aNode) return false; SMESH_MesherHelper aHelper( *(_impl) ); @@ -4642,9 +4680,9 @@ CORBA::Long SMESH_Mesh_i::ElemNbEdges(const CORBA::Long id) if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) return -1; - const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return -1; + const SMDS_MeshElement* elem = aMeshDS->FindElement(id); if(!elem) return -1; return elem->NbEdges(); } @@ -4661,9 +4699,9 @@ CORBA::Long SMESH_Mesh_i::ElemNbFaces(const CORBA::Long id) if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) return -1; - const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return -1; + const SMDS_MeshElement* elem = aMeshDS->FindElement(id); if(!elem) return -1; return elem->NbFaces(); } @@ -4680,9 +4718,9 @@ SMESH::long_array* SMESH_Mesh_i::GetElemFaceNodes(CORBA::Long elemId, _preMeshInfo->FullLoadFromFile(); SMESH::long_array_var aResult = new SMESH::long_array(); - if ( SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS() ) + if ( SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS() ) { - if ( const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(elemId) ) + if ( const SMDS_MeshElement* elem = aMeshDS->FindElement(elemId) ) { SMDS_VolumeTool vtool( elem ); if ( faceIndex < vtool.NbFaces() ) @@ -4753,6 +4791,35 @@ CORBA::Long SMESH_Mesh_i::FindElementByNodes(const SMESH::long_array& nodes) return elemID; } +//================================================================================ +/*! + * \brief Return elements including all given nodes. + */ +//================================================================================ + +SMESH::long_array* SMESH_Mesh_i::GetElementsByNodes(const SMESH::long_array& nodes, + SMESH::ElementType elemType) +{ + if ( _preMeshInfo ) + _preMeshInfo->FullLoadFromFile(); + + SMESH::long_array_var result = new SMESH::long_array(); + + if ( SMESHDS_Mesh* mesh = _impl->GetMeshDS() ) + { + vector< const SMDS_MeshNode * > nn( nodes.length() ); + for ( CORBA::ULong i = 0; i < nodes.length(); ++i ) + nn[i] = mesh->FindNode( nodes[i] ); + + std::vector elems; + mesh->GetElementsByNodes( nn, elems, (SMDSAbs_ElementType) elemType ); + result->length( elems.size() ); + for ( size_t i = 0; i < elems.size(); ++i ) + result[i] = elems[i]->GetID(); + } + return result._retn(); +} + //============================================================================= /*! * Returns true if given element is polygon @@ -4764,9 +4831,9 @@ CORBA::Boolean SMESH_Mesh_i::IsPoly(const CORBA::Long id) if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) return false; - const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return false; + const SMDS_MeshElement* elem = aMeshDS->FindElement(id); if(!elem) return false; return elem->IsPoly(); } @@ -4783,9 +4850,9 @@ CORBA::Boolean SMESH_Mesh_i::IsQuadratic(const CORBA::Long id) if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) return false; - const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return false; + const SMDS_MeshElement* elem = aMeshDS->FindElement(id); if(!elem) return false; return elem->IsQuadratic(); } @@ -4802,7 +4869,7 @@ CORBA::Double SMESH_Mesh_i::GetBallDiameter(CORBA::Long id) _preMeshInfo->FullLoadFromFile(); if ( const SMDS_BallElement* ball = - dynamic_cast( _impl->GetMeshDS()->FindElement( id ))) + SMDS_Mesh::DownCast( _impl->GetMeshDS()->FindElement( id ))) return ball->GetDiameter(); return 0; @@ -4820,11 +4887,11 @@ SMESH::double_array* SMESH_Mesh_i::BaryCenter(const CORBA::Long id) _preMeshInfo->FullLoadFromFile(); SMESH::double_array_var aResult = new SMESH::double_array(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - if ( aSMESHDS_Mesh == NULL ) + SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS(); + if ( aMeshDS == NULL ) return aResult._retn(); - const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + const SMDS_MeshElement* elem = aMeshDS->FindElement(id); if(!elem) return aResult._retn(); @@ -4884,12 +4951,14 @@ SMESH_Mesh_i::MakeGroupsOfBadInputElements( int theSubShapeID, { // compute error SMESH_ComputeErrorPtr error = sm->GetComputeError(); - if ( error && !error->myBadElements.empty()) + if ( error && error->HasBadElems() ) { // sort bad elements by type vector< const SMDS_MeshElement* > elemsByType[ SMDSAbs_NbElementTypes ]; - list::iterator elemIt = error->myBadElements.begin(); - list::iterator elemEnd = error->myBadElements.end(); + const list& badElems = + static_cast( error.get() )->myBadElements; + list::const_iterator elemIt = badElems.begin(); + list::const_iterator elemEnd = badElems.end(); for ( ; elemIt != elemEnd; ++elemIt ) { const SMDS_MeshElement* elem = *elemIt; @@ -5258,7 +5327,7 @@ SALOMEDS::TMPFile* SMESH_Mesh_i::GetVtkUgStream() { SALOMEDS::TMPFile_var SeqFile; if ( SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS() ) { - SMDS_UnstructuredGrid* aGrid = aMeshDS->getGrid(); + SMDS_UnstructuredGrid* aGrid = aMeshDS->GetGrid(); if(aGrid) { vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New(); aWriter->WriteToOutputStringOn(); @@ -5395,7 +5464,7 @@ namespace /* Iterators used in SMESH_Mesh_i::GetElements(SMESH::SMESH_IDSource_v { const SMDS_MeshElement* res = _node; _node = 0; - while (( _elemIter->more() || _nodeIter->more() ) && !_node ) + while ( !_node && ( _elemIter->more() || _nodeIter->more() )) { if ( _nodeIter->more() ) { @@ -5533,10 +5602,10 @@ TopAbs_ShapeEnum shapeTypeByDim(const int theDim) //----------------------------------------------------------------------------- /*! - * \brief Internal structure used to find concurent submeshes + * \brief Internal structure used to find concurrent submeshes * - * It represents a pair < submesh, concurent dimension >, where - * 'concurrent dimension' is dimension of shape where the submesh can concurent + * It represents a pair < submesh, concurrent dimension >, where + * 'concurrent dimension' is dimension of shape where the submesh can concurrent * with another submesh. In other words, it is dimension of a hypothesis assigned * to submesh. */ @@ -5928,7 +5997,7 @@ TListOfListOfInt SMESH_Mesh_i::findConcurrentSubMeshes() removeDimHyps(dimHypListArr); - // now, minimise the number of concurrent groups + // now, minimize the number of concurrent groups // Here we assume that lists of submeshes can have same submesh // in case of multi-dimension algorithms, as result // list with common submesh has to be united into one list @@ -6025,7 +6094,7 @@ void SMESH_Mesh_i::convertMeshOrder (const TListOfListOfInt& theIdsOrder, continue; if ( theIsDump ) aPythonDump << "[ "; - // convert shape indeces into interfaces + // convert shape indices into interfaces SMESH::submesh_array_var aResSubSet = new SMESH::submesh_array(); aResSubSet->length(aSubOrder.size()); TListOfInt::const_iterator subIt = aSubOrder.begin(); @@ -6057,6 +6126,24 @@ void SMESH_Mesh_i::convertMeshOrder (const TListOfListOfInt& theIdsOrder, } } +namespace // utils used by SMESH_MeshPartDS +{ + /*! + * \brief Class used to access to protected data of SMDS_MeshInfo + */ + struct TMeshInfo : public SMDS_MeshInfo + { + void Add(const SMDS_MeshElement* e) { SMDS_MeshInfo::addWithPoly( e ); } + }; + /*! + * \brief Element holing its ID only + */ + struct TElemID : public SMDS_LinearEdge + { + TElemID(int ID) : SMDS_LinearEdge(0,0) { setID( ID ); } + }; +} + //================================================================================ // // Implementation of SMESH_MeshPartDS @@ -6067,6 +6154,7 @@ SMESH_MeshPartDS::SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr meshPart): SMESH::SMESH_Mesh_var mesh = meshPart->GetMesh(); SMESH_Mesh_i* mesh_i = SMESH::DownCast( mesh ); + mesh_i->Load(); _meshDS = mesh_i->GetImpl().GetMeshDS(); SetPersistentId( _meshDS->GetPersistentId() ); @@ -6136,6 +6224,21 @@ SMESH_MeshPartDS::SMESH_MeshPartDS(const std::list< const SMDS_MeshElement* > & myInfo = tmpInfo; } // ------------------------------------------------------------------------------------- +const SMDS_MeshElement * SMESH_MeshPartDS::FindElement(int IDelem) const +{ + if ( _meshDS ) return _meshDS->FindElement( IDelem ); + + TElemID elem( IDelem ); + for ( int iType = SMDSAbs_Edge; iType < SMDSAbs_NbElementTypes; ++iType ) + if ( !_elements[ iType ].empty() ) + { + TIDSortedElemSet::const_iterator it = _elements[ iType ].find( &elem ); + if ( it != _elements[ iType ].end() ) + return *it; + } + return 0; +} +// ------------------------------------------------------------------------------------- SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementGeomIterator(SMDSAbs_GeometryType geomType) const { if ( _meshDS ) return _meshDS->elementGeomIterator( geomType ); @@ -6147,7 +6250,7 @@ SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementGeomIterator(SMDSAbs_GeometryType SMDS_MeshElement::GeomFilter > TIter; - SMDSAbs_ElementType type = SMDS_MeshCell::toSmdsType( geomType ); + SMDSAbs_ElementType type = SMDS_MeshCell::ElemType( geomType ); return SMDS_ElemIteratorPtr( new TIter( _elements[type].begin(), _elements[type].end(), @@ -6165,7 +6268,7 @@ SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementEntityIterator(SMDSAbs_EntityType SMDS_MeshElement::EntityFilter > TIter; - SMDSAbs_ElementType type = SMDS_MeshCell::toSmdsType( entity ); + SMDSAbs_ElementType type = SMDS_MeshCell::ElemType( entity ); return SMDS_ElemIteratorPtr( new TIter( _elements[type].begin(), _elements[type].end(), @@ -6192,10 +6295,10 @@ SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementsIterator(SMDSAbs_ElementType type } // ------------------------------------------------------------------------------------- #define _GET_ITER_DEFINE( iterType, methName, elem, elemType) \ - iterType SMESH_MeshPartDS::methName( bool idInceasingOrder) const \ + iterType SMESH_MeshPartDS::methName() const \ { \ typedef SMDS_SetIterator TIter; \ - return _meshDS ? _meshDS->methName(idInceasingOrder) : iterType \ + return _meshDS ? _meshDS->methName() : iterType \ ( new TIter( _elements[elemType].begin(), _elements[elemType].end() )); \ } // -------------------------------------------------------------------------------------