X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_HypothesesUtils.cxx;h=3e5bd4122356a4165bb8d7ebea733a47d773431b;hp=fa29da180e0efe8ed73680d34caa0e020d9e08f2;hb=HEAD;hpb=b21a1e5b25983280805e04c04b166b9c12bba0af diff --git a/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx b/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx index fa29da180..8a07c2b9b 100644 --- a/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -28,10 +28,14 @@ #include "SMESHGUI_HypothesesUtils.h" #include "SMESHGUI.h" +#include "SMESHGUI_GEOMGenUtils.h" #include "SMESHGUI_Hypotheses.h" -#include "SMESHGUI_XmlHandler.h" #include "SMESHGUI_Utils.h" -#include "SMESHGUI_GEOMGenUtils.h" +#include "SMESHGUI_VTKUtils.h" +#include "SMESHGUI_XmlHandler.h" + +#include +#include // SALOME GUI includes #include @@ -49,9 +53,7 @@ #include // Qt includes -#include #include -//#include // Other includes @@ -62,22 +64,22 @@ #endif #ifdef WIN32 -#define LibHandle HMODULE -#define LoadLib( name ) LoadLibrary( name ) -#define GetProc GetProcAddress -#define UnLoadLib( handle ) FreeLibrary( handle ); -#else -#define LibHandle void* -#define LoadLib( name ) dlopen( name, RTLD_LAZY ) -#define GetProc dlsym -#define UnLoadLib( handle ) dlclose( handle ); -#endif - -#ifdef _DEBUG_ -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif + #define LibHandle HMODULE + #define LoadLib( name ) LoadLibrary( name ) + #define GetProc GetProcAddress + #define UnLoadLib( handle ) FreeLibrary( handle ); + #define env_sep ";" +#else // WIN32 + #define LibHandle void* + #ifdef DYNLOAD_LOCAL + #define LoadLib( name ) dlopen( name, RTLD_LAZY | RTLD_LOCAL ) + #else // DYNLOAD_LOCAL + #define LoadLib( name ) dlopen( name, RTLD_LAZY | RTLD_GLOBAL ) + #endif // DYNLOAD_LOCAL + #define GetProc dlsym + #define UnLoadLib( handle ) dlclose( handle ); + #define env_sep ":" +#endif // WIN32 namespace SMESH { @@ -180,7 +182,8 @@ namespace SMESH void InitAvailableHypotheses() { SUIT_OverrideCursor wc; - if (myHypothesesMap.empty() && myAlgorithmsMap.empty()) { + if ( myHypothesesMap.empty() && myAlgorithmsMap.empty() ) + { // Resource manager SUIT_ResourceMgr* resMgr = SMESHGUI::resourceMgr(); if (!resMgr) return; @@ -191,7 +194,7 @@ namespace SMESH if (cenv) HypsXml.sprintf("%s", cenv); - QStringList HypsXmlList = HypsXml.split(":", QString::SkipEmptyParts); + QStringList HypsXmlList = HypsXml.split(env_sep, QString::SkipEmptyParts); if (HypsXmlList.count() == 0) { SUIT_MessageBox::critical(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), @@ -283,14 +286,14 @@ namespace SMESH QStringList GetAvailableHypotheses( const bool isAlgo, const int theDim, const bool isAux, - const bool isNeedGeometry, + const bool hasGeometry, const bool isSubMesh) { QStringList aHypList; // Init list of available hypotheses, if needed InitAvailableHypotheses(); - bool checkGeometry = ( !isNeedGeometry && isAlgo ); + bool checkGeometry = ( isAlgo ); const char* context = isSubMesh ? "LOCAL" : "GLOBAL"; // fill list of hypotheses/algorithms THypothesisDataMap& pMap = isAlgo ? myAlgorithmsMap : myHypothesesMap; @@ -302,7 +305,8 @@ namespace SMESH ( theDim < 0 || aData->Dim.contains( theDim )) && ( isAlgo || aData->IsAuxOrNeedHyp == isAux ) && ( aData->Context == "ANY" || aData->Context == context ) && - ( !checkGeometry || aData->IsNeedGeometry == isNeedGeometry )) + ( !checkGeometry || (!aData->IsNeedGeometry || + ( aData->IsNeedGeometry > 0 ) == hasGeometry))) { aHypList.append(anIter.key()); } @@ -322,8 +326,7 @@ namespace SMESH hypoSet != myListOfHypothesesSets.end(); ++hypoSet ) { HypothesesSet* aSet = *hypoSet; - if ( aSet && ( aSet->count( true ) || aSet->count( false )) && - aSet->maxDim() <= maxDim) + if ( aSet && 0 <= aSet->maxDim() && aSet->maxDim() <= maxDim ) { aSetNameList.append( mangledHypoSetName( aSet )); } @@ -369,6 +372,90 @@ namespace SMESH return aHypData; } + //================================================================================ + /*! + * \brief Return the HypothesisData holding a name of a group of hypotheses + * a given hypothesis belongs to + */ + //================================================================================ + + HypothesisData* GetGroupTitle( const HypothesisData* hyp, const bool isAlgo ) + { + static std::vector< std::vector< HypothesisData > > theGroups; + if ( theGroups.empty() ) + { + theGroups.resize(14); // 14: isAlgo * 10 + dim + + QString dummyS("GROUP"); + QList dummyIL; dummyIL << 1; + QStringList dummySL; + HypothesisData group( dummyS,dummyS,dummyS,dummyS,dummyS,dummyS,dummyS,-1,-1, + dummyIL, 0, dummySL,dummySL,dummySL,dummySL,0,0 ); + // no group + int key = 0; + theGroups[ key ].push_back( group ); + + // 1D algo + key = 11; + // 0: Basic + group.Label = "GROUP:" + QObject::tr( "SMESH_1D_ALGO_GROUP_BASIC" ); + theGroups[ key ].push_back( group ); + // 1: Advanced + group.Label = "GROUP:" + QObject::tr( "SMESH_1D_ALGO_GROUP_ADVANCED" ); + theGroups[ key ].push_back( group ); + + // 1D hypotheses + key = 01; + // 0: Basic + group.Label = "GROUP:" + QObject::tr( "SMESH_1D_HYP_GROUP_BASIC" ); + theGroups[ key ].push_back( group ); + // 1: Progression + group.Label = "GROUP:" + QObject::tr( "SMESH_1D_HYP_GROUP_PROGRESSION" ); + theGroups[ key ].push_back( group ); + // 2: Advanced + group.Label = "GROUP:" + QObject::tr( "SMESH_1D_HYP_GROUP_ADVANCED" ); + theGroups[ key ].push_back( group ); + + // 2D algo + key = 12; + // 0: Regular + group.Label = "GROUP:" + QObject::tr( "SMESH_2D_ALGO_GROUP_REGULAR" ); + theGroups[ key ].push_back( group ); + // 1: Free + group.Label = "GROUP:" + QObject::tr( "SMESH_2D_ALGO_GROUP_FREE" ); + theGroups[ key ].push_back( group ); + // 2: Advanced + group.Label = "GROUP:" + QObject::tr( "SMESH_2D_ALGO_GROUP_ADVANCED" ); + theGroups[ key ].push_back( group ); + + // 3D algo + key = 13; + // 0: Regular + group.Label = "GROUP:" + QObject::tr( "SMESH_3D_ALGO_GROUP_REGULAR" ); + theGroups[ key ].push_back( group ); + // 1: Free + group.Label = "GROUP:" + QObject::tr( "SMESH_3D_ALGO_GROUP_FREE" ); + theGroups[ key ].push_back( group ); + // 2: Advanced + group.Label = "GROUP:" + QObject::tr( "SMESH_3D_ALGO_GROUP_ADVANCED" ); + theGroups[ key ].push_back( group ); + } + + size_t key = 0, groupID = 0; + if ( hyp && !hyp->Dim.isEmpty() ) + { + key = hyp->Dim[0] + isAlgo * 10; + groupID = hyp->GroupID; + } + + if ( key < theGroups.size() && !theGroups[ key ].empty() ) + { + std::vector< HypothesisData > & group = theGroups[ key ]; + return & ( groupID < group.size() ? group[ groupID ] : group.back() ); + } + return & theGroups[ 0 ][ 0 ]; + } + bool IsAvailableHypothesis(const HypothesisData* algoData, const QString& hypType, bool& isAuxiliary) @@ -378,7 +465,7 @@ namespace SMESH return false; if ( algoData->BasicHypos.contains( hypType )) return true; - if ( algoData->OptionalHypos.contains( hypType)) { + if ( algoData->OptionalHypos.contains( hypType )) { isAuxiliary = true; return true; } @@ -404,7 +491,7 @@ namespace SMESH SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator(const QString& aHypType) { - if(MYDEBUG) MESSAGE("Get HypothesisCreator for " << aHypType.toLatin1().data()); + MESSAGE("Get HypothesisCreator for " << aHypType.toLatin1().data()); SMESHGUI_GenericHypothesisCreator* aCreator = 0; @@ -429,10 +516,25 @@ namespace SMESH // 3. Load Client Plugin Library try { // load plugin library - if(MYDEBUG) MESSAGE("Loading client meshers plugin library ..."); - LibHandle libHandle = LoadLib( aClientLibName.toLatin1().data() ); + MESSAGE("Loading client meshers plugin library ..."); +#ifdef WIN32 +#ifdef UNICODE + LPTSTR path = new TCHAR[aClientLibName.length() + 1]; + path[aClientLibName.toWCharArray(path)] = '\0'; +#else + QByteArray baPath = aClientLibName.toUtf8(); + const char* path = baPath.data(); +#endif +#else + QByteArray baPath = aClientLibName.toUtf8(); + char* path = baPath.data(); +#endif + LibHandle libHandle = LoadLib( path ); +#if defined(WIN32) && defined(UNICODE) + delete path; +#endif if (!libHandle) { - // report any error, if occured + // report any error, if occurred { #ifdef WIN32 const char* anError = "Can't load client meshers plugin library"; @@ -444,21 +546,21 @@ namespace SMESH } else { // get method, returning hypothesis creator - if(MYDEBUG) MESSAGE("Find GetHypothesisCreator() method ..."); + MESSAGE("Find GetHypothesisCreator() method ..."); typedef SMESHGUI_GenericHypothesisCreator* (*GetHypothesisCreator) \ ( const QString& ); GetHypothesisCreator procHandle = (GetHypothesisCreator)GetProc(libHandle, "GetHypothesisCreator"); if (!procHandle) { - if(MYDEBUG) MESSAGE("bad hypothesis client plugin library"); + MESSAGE("bad hypothesis client plugin library"); UnLoadLib(libHandle); } else { // get hypothesis creator - if(MYDEBUG) MESSAGE("Get Hypothesis Creator for " << aHypType.toLatin1().data()); + MESSAGE("Get Hypothesis Creator for " << aHypType.toLatin1().data()); aCreator = procHandle( aHypType ); if (!aCreator) { - if(MYDEBUG) MESSAGE("no such a hypothesis in this plugin"); + MESSAGE("no such a hypothesis in this plugin"); } else { // map hypothesis creator to a hypothesis name @@ -485,16 +587,16 @@ namespace SMESH SMESH::SMESH_Hypothesis_ptr CreateHypothesis(const QString& aHypType, const QString& aHypName, - const bool isAlgo) + const bool /*isAlgo*/) { - if(MYDEBUG) MESSAGE("Create " << aHypType.toLatin1().data() << + MESSAGE("Create " << aHypType.toLatin1().data() << " with name " << aHypName.toLatin1().data()); HypothesisData* aHypData = GetHypothesisData(aHypType); QString aServLib = aHypData->ServerLibName; try { SMESH::SMESH_Hypothesis_var aHypothesis; aHypothesis = SMESHGUI::GetSMESHGen()->CreateHypothesis(aHypType.toLatin1().data(), - aServLib.toLatin1().data()); + aServLib.toUtf8().data()); if (!aHypothesis->_is_nil()) { _PTR(SObject) aHypSObject = SMESH::FindSObject(aHypothesis.in()); if (aHypSObject) { @@ -521,16 +623,19 @@ namespace SMESH HypothesisData* aHypData = GetHypothesisData(aHypType); QString aServLib = aHypData->ServerLibName; + SMESH_TRY; return SMESHGUI::GetSMESHGen()->IsApplicable( aHypType.toLatin1().data(), - aServLib.toLatin1().data(), + aServLib.toUtf8().data(), theGeomObject, toCheckAll); + SMESH_CATCH( SMESH::printErrorInDebugMode ); + return false; } bool AddHypothesisOnMesh (SMESH::SMESH_Mesh_ptr aMesh, SMESH::SMESH_Hypothesis_ptr aHyp) { - if(MYDEBUG) MESSAGE ("SMESHGUI::AddHypothesisOnMesh"); + MESSAGE ("SMESHGUI::AddHypothesisOnMesh"); int res = SMESH::HYP_UNKNOWN_FATAL; SUIT_OverrideCursor wc; @@ -540,12 +645,7 @@ namespace SMESH try { CORBA::String_var error; res = aMesh->AddHypothesis(aShapeObject, aHyp, error.out()); - if (res < SMESH::HYP_UNKNOWN_FATAL) { - _PTR(SObject) aSH = SMESH::FindSObject(aHyp); - if (SM && aSH) { - SMESH::ModifiedMesh(SM, false, aMesh->NbNodes()==0); - } - } + UpdateViewer(aMesh); if (res > SMESH::HYP_OK) { wc.suspend(); processHypothesisStatus(res, aHyp, true, error.in() ); @@ -564,11 +664,11 @@ namespace SMESH bool AddHypothesisOnSubMesh (SMESH::SMESH_subMesh_ptr aSubMesh, SMESH::SMESH_Hypothesis_ptr aHyp) { - if(MYDEBUG) MESSAGE("SMESHGUI::AddHypothesisOnSubMesh() "); + MESSAGE("SMESHGUI::AddHypothesisOnSubMesh() "); int res = SMESH::HYP_UNKNOWN_FATAL; SUIT_OverrideCursor wc; - if (!aSubMesh->_is_nil() && ! aHyp->_is_nil()) { + if ( !aSubMesh->_is_nil() && !aHyp->_is_nil() ) { try { SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); _PTR(SObject) SsubM = SMESH::FindSObject(aSubMesh); @@ -577,11 +677,7 @@ namespace SMESH { CORBA::String_var error; res = aMesh->AddHypothesis( aShapeObject, aHyp, error.out() ); - if (res < SMESH::HYP_UNKNOWN_FATAL) { - _PTR(SObject) meshSO = SMESH::FindSObject(aMesh); - if (meshSO) - SMESH::ModifiedMesh(meshSO, false, aMesh->NbNodes()==0); - } + UpdateViewer(aMesh); if (res > SMESH::HYP_OK) { wc.suspend(); processHypothesisStatus( res, aHyp, true, error.in() ); @@ -614,32 +710,32 @@ namespace SMESH SUIT_OverrideCursor wc; try { - _PTR(Study) aStudy = GetActiveStudyDocument(); + _PTR(Study) aStudy = getStudy(); _PTR(SObject) aHypObj = aStudy->FindObjectID( IObject->getEntry() ); if( aHypObj ) + { + _PTR(SObject) MorSM = SMESH::GetMeshOrSubmesh( aHypObj ); + _PTR(SObject) aRealHypo; + if( aHypObj->ReferencedObject( aRealHypo ) ) { - _PTR(SObject) MorSM = SMESH::GetMeshOrSubmesh( aHypObj ); - _PTR(SObject) aRealHypo; - if( aHypObj->ReferencedObject( aRealHypo ) ) - { - SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aRealHypo ) ); - RemoveHypothesisOrAlgorithmOnMesh( MorSM, hypo ); - } - else - { - SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aHypObj ) ); - SObjectList meshList = GetMeshesUsingAlgoOrHypothesis( hypo ); - for( int i = 0; i < meshList.size(); i++ ) - RemoveHypothesisOrAlgorithmOnMesh( meshList[ i ], hypo ); - } + SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aRealHypo ) ); + RemoveHypothesisOrAlgorithmOnMesh( MorSM, hypo ); } + else + { + SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aHypObj ) ); + SObjectList meshList = GetMeshesUsingAlgoOrHypothesis( hypo ); + for( size_t i = 0; i < meshList.size(); i++ ) + RemoveHypothesisOrAlgorithmOnMesh( meshList[ i ], hypo ); + } + } } catch(const SALOME::SALOME_Exception& S_ex) - { - wc.suspend(); - SalomeApp_Tools::QtCatchCorbaException(S_ex); - res = SMESH::HYP_UNKNOWN_FATAL; - } + { + wc.suspend(); + SalomeApp_Tools::QtCatchCorbaException(S_ex); + res = SMESH::HYP_UNKNOWN_FATAL; + } return res < SMESH::HYP_UNKNOWN_FATAL; } @@ -661,26 +757,16 @@ namespace SMESH if (!aMesh->_is_nil()) { if (aMesh->HasShapeToMesh() && !aShapeObject->_is_nil()) { res = aMesh->RemoveHypothesis(aShapeObject, anHyp); - if (res < SMESH::HYP_UNKNOWN_FATAL) { - _PTR(SObject) meshSO = SMESH::FindSObject(aMesh); - if (meshSO) - SMESH::ModifiedMesh(meshSO, false, aMesh->NbNodes()==0); - } - } else if(!aMesh->HasShapeToMesh()){ res = aMesh->RemoveHypothesis(aShapeObject, anHyp); - if (res < SMESH::HYP_UNKNOWN_FATAL) { - _PTR(SObject) meshSO = SMESH::FindSObject(aMesh); - if (meshSO) - SMESH::ModifiedMesh(meshSO, false, aMesh->NbNodes()==0); - } } if (res > SMESH::HYP_OK) { wc.suspend(); processHypothesisStatus(res, anHyp, false); wc.resume(); } + UpdateViewer(aMesh); } } catch(const SALOME::SALOME_Exception& S_ex) { wc.suspend(); @@ -689,6 +775,16 @@ namespace SMESH } } return res < SMESH::HYP_UNKNOWN_FATAL; + } + + void UpdateViewer(SMESH::SMESH_Mesh_ptr theMesh) + { + if (_PTR(SObject) meshSO = SMESH::FindSObject(theMesh)) + { + if (SMESH_Actor* actor = SMESH::FindActorByEntry(meshSO->GetID().c_str())) + if (actor->GetVisibility()) + actor->Update(); + } } SObjectList GetMeshesUsingAlgoOrHypothesis(SMESH::SMESH_Hypothesis_ptr AlgoOrHyp) @@ -700,10 +796,9 @@ namespace SMESH if (!AlgoOrHyp->_is_nil()) { _PTR(SObject) SO_Hypothesis = SMESH::FindSObject(AlgoOrHyp); if (SO_Hypothesis) { - SObjectList listSO = - SMESHGUI::activeStudy()->studyDS()->FindDependances(SO_Hypothesis); + SObjectList listSO = SMESH::getStudy()->FindDependances(SO_Hypothesis); - if(MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): dependency number ="<