X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Gen_i_1.cxx;h=a667ba59fcb13a21528c624c0b2f42204b09992e;hp=94df9beb3b21a299ca327ba8126adac5dadf510d;hb=HEAD;hpb=0fc0831670e27a5611b941c52dc152fd63964515 diff --git a/src/SMESH_I/SMESH_Gen_i_1.cxx b/src/SMESH_I/SMESH_Gen_i_1.cxx index 94df9beb3..0d2ff3d6f 100644 --- a/src/SMESH_I/SMESH_Gen_i_1.cxx +++ b/src/SMESH_I/SMESH_Gen_i_1.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2020 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 @@ -34,25 +34,18 @@ #include "SMESH_Mesh_i.hxx" #include "SMESH_subMesh_i.hxx" -#include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog) - #include #include #include #include -#include +#include "SALOME_KernelServices.hxx" +#include "SALOME_ModuleCatalog_impl.hxx" #include #include #include -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - using namespace std; //============================================================================= @@ -163,7 +156,7 @@ long SMESH_Gen_i::GetBallElementsGroupsTag() bool SMESH_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) { - if(MYDEBUG) MESSAGE("CanPublishInStudy - "<_is_nil() ) return true; - if(MYDEBUG) MESSAGE("CanPublishInStudy--CANT"); + MESSAGE("CanPublishInStudy--CANT"); return false; } @@ -196,23 +189,19 @@ bool SMESH_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) SALOMEDS::SObject_ptr SMESH_Gen_i::ObjectToSObject(CORBA::Object_ptr theObject) { SALOMEDS::SObject_wrap aSO; - if ( !CORBA::is_nil( theObject )) + try { + if ( !CORBA::is_nil( theObject )) + { + CORBA::String_var objStr = SMESH_Gen_i::GetORB()->object_to_string( theObject ); + aSO = getStudyServant()->FindObjectIOR( objStr.in() ); + } + } + catch (...) { - CORBA::String_var objStr = SMESH_Gen_i::GetORB()->object_to_string( theObject ); - aSO = getStudyServant()->FindObjectIOR( objStr.in() ); } return aSO._retn(); } -//======================================================================= -//function : GetStudyPtr -//purpose : Get study from naming service -//======================================================================= -SALOMEDS::Study_var SMESH_Gen_i::getStudyServant() -{ - return SALOMEDS::Study::_duplicate(KERNEL::getStudyServant()); -} - //======================================================================= //function : objectToServant //purpose : @@ -231,8 +220,8 @@ template static inline T* objectToServant( CORBA::Object_ptr theIOR GEOM::GEOM_Object_ptr SMESH_Gen_i::ShapeToGeomObject (const TopoDS_Shape& theShape ) { GEOM::GEOM_Object_var aShapeObj; - if ( !theShape.IsNull() ) { - GEOM_Client* aClient = GetShapeReader(); + if ( !theShape.IsNull() && mySMESHGen ) { + GEOM_Client* aClient = mySMESHGen->GetShapeReader(); TCollection_AsciiString IOR; if ( aClient && aClient->Find( theShape, IOR )) { @@ -252,9 +241,9 @@ GEOM::GEOM_Object_ptr SMESH_Gen_i::ShapeToGeomObject (const TopoDS_Shape& theSha TopoDS_Shape SMESH_Gen_i::GeomObjectToShape(GEOM::GEOM_Object_ptr theGeomObject) { TopoDS_Shape S; - if ( !theGeomObject->_is_nil() && !theGeomObject->_non_existent() ) + if ( mySMESHGen && !theGeomObject->_is_nil() && !theGeomObject->_non_existent() ) { - GEOM_Client* aClient = GetShapeReader(); + GEOM_Client* aClient = mySMESHGen->GetShapeReader(); GEOM::GEOM_Gen_var aGeomEngine = GetGeomEngine( theGeomObject ); if ( aClient && !aGeomEngine->_is_nil () ) S = aClient->GetShape( aGeomEngine, theGeomObject ); @@ -262,19 +251,38 @@ TopoDS_Shape SMESH_Gen_i::GeomObjectToShape(GEOM::GEOM_Object_ptr theGeomObject) return S; } +//================================================================================ +/*! + * \brief Get GEOM Object by its study entry + */ +//================================================================================ + +GEOM::GEOM_Object_ptr SMESH_Gen_i::GetGeomObjectByEntry( const std::string& entry ) +{ + GEOM::GEOM_Object_var go; + if ( !entry.empty() && mySMESHGen ) + { + SALOMEDS::SObject_wrap so = mySMESHGen->getStudyServant()->FindObjectID( entry.c_str() ); + CORBA::Object_var obj = SObjectToObject( so ); + go = GEOM::GEOM_Object::_narrow( obj ); + } + return go._retn(); +} + + //======================================================================= //function : publish //purpose : //======================================================================= -static SALOMEDS::SObject_ptr publish(CORBA::Object_ptr theIOR, - SALOMEDS::SObject_ptr theFatherObject, - const int theTag = 0, - const char* thePixMap = 0, - const bool theSelectable = true) +SALOMEDS::SObject_ptr SMESH_Gen_i::publish(CORBA::Object_ptr theIOR, + SALOMEDS::SObject_ptr theFatherObject, + const int theTag, + const char* thePixMap, + const bool theSelectable) { - SALOMEDS::Study_var theStudy = SMESH_Gen_i::getStudyServant(); - SALOMEDS::SObject_wrap SO = SMESH_Gen_i::ObjectToSObject( theIOR ); + SALOMEDS::Study_var theStudy = getStudyServant(); + SALOMEDS::SObject_wrap SO = ObjectToSObject( theIOR ); SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder(); bool isNewSO = false, isInUseCaseTree = false; @@ -415,9 +423,7 @@ void SMESH_Gen_i::SetPixMap(SALOMEDS::SObject_ptr theSObject, //purpose : //======================================================================= -static void addReference (SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theToObject, - int theTag = 0) +void SMESH_Gen_i::addReference (SALOMEDS::SObject_ptr theSObject, CORBA::Object_ptr theToObject, int theTag) { SALOMEDS::Study_var aStudy = SMESH_Gen_i::getStudyServant(); SALOMEDS::SObject_wrap aToObjSO = SMESH_Gen_i::ObjectToSObject( theToObject ); @@ -479,10 +485,9 @@ static void addReference (SALOMEDS::SObject_ptr theSObject, */ //============================================================================= -SALOMEDS::SObject_ptr SMESH_Gen_i::PublishInStudy(SALOMEDS::SObject_ptr theSObject, +SALOMEDS::SObject_ptr SMESH_Gen_i::PublishInStudy(SALOMEDS::SObject_ptr /*theSObject*/, CORBA::Object_ptr theIOR, const char* theName) - throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); SALOMEDS::SObject_wrap aSO; @@ -490,7 +495,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishInStudy(SALOMEDS::SObject_ptr theSObje return aSO._retn(); if ( CORBA::is_nil( theIOR )) return aSO._retn(); - if(MYDEBUG) MESSAGE("PublishInStudy"); + MESSAGE("PublishInStudy"); // Publishing a mesh SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( theIOR ); @@ -517,28 +522,31 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishInStudy(SALOMEDS::SObject_ptr theSObje aMesh = aGroup->GetMesh(); aSO = PublishGroup( aMesh, aGroup, aShapeObject, theName ); } - if(MYDEBUG) MESSAGE("PublishInStudy_END"); + MESSAGE("PublishInStudy_END"); return aSO._retn(); } //======================================================================= //function : PublishComponent -//purpose : +//purpose : //======================================================================= SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent() { - if(MYDEBUG) MESSAGE("PublishComponent"); + MESSAGE("PublishComponent"); if ( !myIsEnablePublish ) return SALOMEDS::SComponent::_nil(); SALOMEDS::StudyBuilder_var aStudyBuilder = getStudyServant()->NewBuilder(); SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = getStudyServant()->GetUseCaseBuilder(); - std::string compDataType = ComponentDataType(); // SMESH module's data type - std::string ior = SMESH_Gen_i::GetORB()->object_to_string( SMESH_Gen::_this() ); // IOR of this SMESH engine - + CORBA::String_var compDataType = ComponentDataType(); // SMESH module's data type + std::string ior; + { + CORBA::String_var iorString = GetORB()->object_to_string( SMESH_Gen::_this() ); + ior = std::string( iorString.in() ); // IOR of this SMESH engine + } // Find study component which corresponds to this SMESH engine SALOMEDS::SComponent_wrap father; @@ -547,12 +555,14 @@ SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent() SALOMEDS::SComponent_wrap f_i = citer->Value(); CORBA::String_var ior_i; bool ok = f_i->ComponentIOR(ior_i.out()); - if ( ok && compDataType == f_i->ComponentDataType() && ior == ior_i.in()) { + CORBA::String_var cdt(f_i->ComponentDataType()); + if ( ok && strcmp( compDataType.in(), cdt.in() ) == 0 && ior == ior_i.in()) + { father = f_i; break; } } - + if ( !CORBA::is_nil( father ) ) { // check that the component is added to the use case browser if ( !useCaseBuilder->IsUseCaseNode( father ) ) { @@ -564,19 +574,18 @@ SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent() // If component for this SMESH engine does not exist in the study, create it - SALOME_ModuleCatalog::ModuleCatalog_var aCat = - SALOME_ModuleCatalog::ModuleCatalog::_narrow( GetNS()->Resolve("/Kernel/ModulCatalog") ); + SALOME_ModuleCatalog::ModuleCatalog_var aCat = this->getModuleCatalog(); if ( CORBA::is_nil( aCat ) ) return father._retn(); - SALOME_ModuleCatalog::Acomponent_var aComp = aCat->GetComponent( compDataType.c_str() ); + SALOME_ModuleCatalog::Acomponent_var aComp = aCat->GetComponent( compDataType.in() ); if ( CORBA::is_nil( aComp ) ) return father._retn(); SALOMEDS::GenericAttribute_wrap anAttr; SALOMEDS::AttributePixMap_wrap aPixmap; - father = aStudyBuilder->NewComponent( compDataType.c_str() ); + father = aStudyBuilder->NewComponent( compDataType.in() ); aStudyBuilder->DefineComponentInstance( father, SMESH_Gen::_this() ); anAttr = aStudyBuilder->FindOrCreateAttribute( father, "AttributePixMap" ); aPixmap = anAttr; @@ -587,7 +596,7 @@ SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent() // (to support tree representation customization and drag-n-drop) useCaseBuilder->SetRootCurrent(); useCaseBuilder->Append( father ); // component object is added as the top level item - if(MYDEBUG) MESSAGE("PublishComponent--END"); + MESSAGE("PublishComponent--END"); return father._retn(); } @@ -604,7 +613,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SMESH::SMESH_Mesh_ptr theMesh, return SALOMEDS::SObject::_nil(); if ( CORBA::is_nil( theMesh )) return SALOMEDS::SObject::_nil(); - if(MYDEBUG) MESSAGE("PublishMesh--IN"); + MESSAGE("PublishMesh--IN"); // find or publish a mesh @@ -675,7 +684,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SMESH::SMESH_Mesh_ptr theMesh, } } - if(MYDEBUG) MESSAGE("PublishMesh_END"); + MESSAGE("PublishMesh_END"); return aMeshSO._retn(); } @@ -885,7 +894,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishHypothesis (SMESH::SMESH_Hypothesis_ptr theHyp, const char* theName) { - if(MYDEBUG) MESSAGE("PublishHypothesis"); + MESSAGE("PublishHypothesis"); if ( !myIsEnablePublish ) return SALOMEDS::SObject::_nil(); if (theHyp->_is_nil()) @@ -920,7 +929,7 @@ SMESH_Gen_i::PublishHypothesis (SMESH::SMESH_Hypothesis_ptr theHyp, SetName( aHypSO, theName, hypType.in() ); - if(MYDEBUG) MESSAGE("PublishHypothesis--END") + MESSAGE("PublishHypothesis--END"); return aHypSO._retn(); } @@ -978,15 +987,30 @@ void SMESH_Gen_i::UpdateIcons( SMESH::SMESH_Mesh_ptr theMesh ) { if ( isGroupOnFilter ) // GetTypes() can be very long on GroupOnFilter! { - SMESH::long_array_var nbByType = mesh_i->GetNbElementsByType(); + SMESH::smIdType_array_var nbByType = mesh_i->GetNbElementsByType(); isEmpty = ( nbByType[ grp->GetType() ] == 0 ); } else { SMESH::array_of_ElementType_var elemTypes = idSrc->GetTypes(); isEmpty = ( elemTypes->length() == 0 ); + + if ( !isEmpty ) + { + // check if all sub-shapes of sub-mesh on group are computed + // (pb: "Compute sub-mesh" menu is missing if a sub-mesh is partially computed) + SMESH::SMESH_subMesh_var subMesh = SMESH::SMESH_subMesh::_narrow( obj ); + if ( !subMesh->_is_nil() ) + if ( SMESH_subMesh* sm = mesh_i->GetImpl().GetSubMeshContaining( subMesh->GetId() )) + if ( sm->IsComputedPartially() ) + { + SetPixMap( so, "ICON_SMESH_TREE_MESH_PARTIAL" ); + continue; + } + } } } + if ( isEmpty ) SetPixMap( so, "ICON_SMESH_TREE_MESH_WARN"); else if ( !isGroup ) @@ -995,8 +1019,9 @@ void SMESH_Gen_i::UpdateIcons( SMESH::SMESH_Mesh_ptr theMesh ) SetPixMap( so, "ICON_SMESH_TREE_GROUP_ON_FILTER" ); else SetPixMap( so, "ICON_SMESH_TREE_GROUP" ); - } - } + + } // loop on sub-meshes or groups + } // loop on roots } //======================================================================= @@ -1066,7 +1091,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::GetMeshOrSubmeshByShape (SMESH::SMESH_Mesh_ptr theMesh, GEOM::GEOM_Object_ptr theShape) { - if(MYDEBUG) MESSAGE("GetMeshOrSubmeshByShape") + MESSAGE("GetMeshOrSubmeshByShape"); SALOMEDS::SObject_wrap aMeshOrSubMesh; if (theMesh->_is_nil() || ( theShape->_is_nil() && theMesh->HasShapeToMesh())) return aMeshOrSubMesh._retn(); @@ -1090,7 +1115,7 @@ SMESH_Gen_i::GetMeshOrSubmeshByShape (SMESH::SMESH_Mesh_ptr theMesh, aMeshOrSubMesh = ObjectToSObject( aSubMesh ); } } - if(MYDEBUG) MESSAGE("GetMeshOrSubmeshByShape--END") + MESSAGE("GetMeshOrSubmeshByShape--END"); return aMeshOrSubMesh._retn(); } @@ -1103,7 +1128,7 @@ bool SMESH_Gen_i::AddHypothesisToShape(SMESH::SMESH_Mesh_ptr theMesh, GEOM::GEOM_Object_ptr theShape, SMESH::SMESH_Hypothesis_ptr theHyp) { - if(MYDEBUG) MESSAGE("AddHypothesisToShape") + MESSAGE("AddHypothesisToShape"); if (theMesh->_is_nil() || theHyp->_is_nil() || (theShape->_is_nil() && theMesh->HasShapeToMesh()) ) @@ -1144,7 +1169,7 @@ bool SMESH_Gen_i::AddHypothesisToShape(SMESH::SMESH_Mesh_ptr theMesh, addReference( AHR, theHyp ); - if(MYDEBUG) MESSAGE("AddHypothesisToShape--END") + MESSAGE("AddHypothesisToShape--END"); return true; }