-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
#include "SMESH_Mesh_i.hxx"
#include "SMESH_subMesh_i.hxx"
-#include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog)
-
#include <utilities.h>
#include <Utils_ExceptHandlers.hxx>
#include <SALOMEDS_wrap.hxx>
#include <SALOMEDS_Attributes_wrap.hxx>
-#include <SALOME_KernelServices.hxx>
+#include "SALOME_KernelServices.hxx"
+#include "SALOME_ModuleCatalog_impl.hxx"
#include <TCollection_AsciiString.hxx>
#include <TopoDS_Solid.hxx>
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 :
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 ))
{
CORBA::Object_var obj = GetORB()->string_to_object( IOR.ToCString() );
- aShapeObj = GEOM::GEOM_Object::_narrow ( obj );
+ if ( !obj->_non_existent() )
+ aShapeObj = GEOM::GEOM_Object::_narrow ( obj );
}
}
return aShapeObj._retn();
TopoDS_Shape SMESH_Gen_i::GeomObjectToShape(GEOM::GEOM_Object_ptr theGeomObject)
{
TopoDS_Shape S;
- if ( !theGeomObject->_is_nil() ) {
- GEOM_Client* aClient = GetShapeReader();
- GEOM::GEOM_Gen_ptr aGeomEngine = GetGeomEngine();
+ if ( mySMESHGen && !theGeomObject->_is_nil() && !theGeomObject->_non_existent() )
+ {
+ GEOM_Client* aClient = mySMESHGen->GetShapeReader();
+ GEOM::GEOM_Gen_var aGeomEngine = GetGeomEngine( theGeomObject );
if ( aClient && !aGeomEngine->_is_nil () )
S = aClient->GetShape( aGeomEngine, 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 :
+//purpose :
//=======================================================================
-static SALOMEDS::SObject_ptr publish(CORBA::Object_ptr theIOR,
+SALOMEDS::SObject_ptr SMESH_Gen_i::publish(CORBA::Object_ptr theIOR,
SALOMEDS::SObject_ptr theFatherObject,
- const int theTag = 0,
- const char* thePixMap = 0,
- const bool theSelectable = true)
+ 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;
//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 );
aStudyBuilder->Addreference( aReferenceSO, aToObjSO );
+ // make the reference visible (invisible ref is created by createInvalidSubMesh())
+ aStudyBuilder->RemoveAttribute( aReferenceSO, "AttributeDrawable" );
+
// add reference to the use case tree
// (to support tree representation customization and drag-n-drop)
SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = aStudy->GetUseCaseBuilder();
*/
//=============================================================================
-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;
//=======================================================================
//function : PublishComponent
-//purpose :
+//purpose :
//=======================================================================
SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent()
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;
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 ) ) {
// 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;
if ( theMesh->_is_nil() || theSubMesh->_is_nil() || theShapeObject->_is_nil() )
return SALOMEDS::SObject::_nil();
+ std::string newName( theName ? theName : "" );
+
SALOMEDS::SObject_wrap aSubMeshSO = ObjectToSObject( theSubMesh );
if ( aSubMeshSO->_is_nil() )
{
SetName( aRootSO, aRootName );
- // Add new submesh to corresponding sub-tree
+ // Add new sub-mesh to corresponding sub-tree
+ int tag = 0; // to use a new SObject
+ if ( theName && theName[0] == '0' )
+ {
+ // theName can be an entry of an invalid sub-mesh which theSubMesh should replace
+ SALOMEDS::SObject_wrap aSObj = getStudyServant()->FindObjectID( theName );
+ if ( aSObj )
+ {
+ CORBA::String_var oldName = aSObj->GetName();
+ newName = oldName.in();
+ SALOMEDS::SObject_wrap aRootSO2 = aSObj->GetFather();
+ if ( aRootSO->Tag() == aRootSO2->Tag() ) // same parent
+ tag = aSObj->Tag(); // to use the same SObject
+ else
+ {
+ CORBA::Object_var anObj = SObjectToObject( aSObj );
+ SMESH::SMESH_subMesh_var sm = SMESH::SMESH_subMesh::_narrow( anObj );
+ theMesh->RemoveSubMesh( sm );
+ }
+ }
+ }
SMESH::array_of_ElementType_var elemTypes = theSubMesh->GetTypes();
const int isEmpty = ( elemTypes->length() == 0 );
const char* pm[2] = { "ICON_SMESH_TREE_MESH", "ICON_SMESH_TREE_MESH_WARN" };
- aSubMeshSO = publish ( theSubMesh, aRootSO, 0, pm[isEmpty] );
+ aSubMeshSO = publish ( theSubMesh, aRootSO, tag, pm[isEmpty] );
if ( aSubMeshSO->_is_nil() )
return aSubMeshSO._retn();
+
+ highLightInvalid( aSubMeshSO, false ); // now it is valid
}
- SetName( aSubMeshSO, theName, "SubMesh" );
+ SetName( aSubMeshSO, newName.c_str(), "SubMesh" );
// Add reference to theShapeObject
// Publish hypothesis
SMESH::ListOfHypothesis_var hypList = theMesh->GetHypothesisList( theShapeObject );
- for ( CORBA::ULong i = 0; i < hypList->length(); i++ ) {
+ for ( CORBA::ULong i = 0; i < hypList->length(); i++ )
+ {
SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( hypList[ i ]);
SALOMEDS::SObject_wrap so = PublishHypothesis( aHyp );
AddHypothesisToShape( theMesh, theShapeObject, aHyp );
SetName( aRootSO, aRootNames[aType] );
// Add new group to corresponding sub-tree
- int isEmpty = false;
+ int isEmpty = ( theMesh->NbNodes() == 0 );
std::string pm[2] = { "ICON_SMESH_TREE_GROUP", "ICON_SMESH_TREE_MESH_WARN" };
- if ( SMESH::DownCast< SMESH_GroupOnFilter_i* > ( theGroup ))
- {
- pm[0] = "ICON_SMESH_TREE_GROUP_ON_FILTER";
- }
- else if ( SMESH::DownCast< SMESH_Group_i* > ( theGroup ))
+ if ( !isEmpty )
{
- if ( theGroup->GetType() == SMESH::NODE )
- isEmpty = ( theMesh->NbNodes() == 0 );
- else
+ if ( SMESH::DownCast< SMESH_GroupOnFilter_i* > ( theGroup )) // on filter
+ {
+ pm[0] = "ICON_SMESH_TREE_GROUP_ON_FILTER";
+
+ if ( theGroup->GetType() != SMESH::NODE )
+ {
+ isEmpty = true;
+ SMESH::array_of_ElementType_var allElemTypes = theMesh->GetTypes();
+ for ( size_t i =0; i < allElemTypes->length() && isEmpty; ++i )
+ isEmpty = ( allElemTypes[i] != theGroup->GetType() );
+ }
+ }
+ else // standalone or on geometry
{
- SMESH::array_of_ElementType_var allElemTypes = theMesh->GetTypes();
- for ( size_t i =0; i < allElemTypes->length() && isEmpty; ++i )
- isEmpty = ( allElemTypes[i] != theGroup->GetType() );
+ isEmpty = ( theGroup->Size() == 0 );
}
}
aGroupSO = publish ( theGroup, aRootSO, 0, pm[isEmpty].c_str() );
//=======================================================================
//function : PublishHypothesis
-//purpose :
+//purpose :
//=======================================================================
SALOMEDS::SObject_ptr
- SMESH_Gen_i::PublishHypothesis (SMESH::SMESH_Hypothesis_ptr theHyp,
- const char* theName)
+SMESH_Gen_i::PublishHypothesis (SMESH::SMESH_Hypothesis_ptr theHyp,
+ const char* theName)
{
- if(MYDEBUG) MESSAGE("PublishHypothesis")
+ if(MYDEBUG) MESSAGE("PublishHypothesis");
if ( !myIsEnablePublish )
return SALOMEDS::SObject::_nil();
if (theHyp->_is_nil())
{
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 )
SetPixMap( so, "ICON_SMESH_TREE_GROUP_ON_FILTER" );
else
SetPixMap( so, "ICON_SMESH_TREE_GROUP" );
+
+ } // loop on sub-meshes or groups
+ } // loop on roots
+}
+
+//=======================================================================
+//function : HighLightInvalid
+//purpose : change font color of a object in the Object Browser
+//=======================================================================
+
+void SMESH_Gen_i::HighLightInvalid( CORBA::Object_ptr theObject, bool isInvalid )
+{
+ SALOMEDS::SObject_wrap so = ObjectToSObject(theObject);
+ highLightInvalid( so.in(), isInvalid );
+}
+
+//=======================================================================
+//function : highLightInvalid
+//purpose : change font color of a object in the Object Browser
+//=======================================================================
+
+void SMESH_Gen_i::highLightInvalid( SALOMEDS::SObject_ptr theSObject, bool isInvalid )
+{
+ if ( !theSObject->_is_nil() )
+ {
+ SALOMEDS::StudyBuilder_var studyBuilder = getStudyServant()->NewBuilder();
+ if ( isInvalid )
+ {
+ SALOMEDS::Color red = { 178,34,34 }; // to differ from reference color
+ SALOMEDS::GenericAttribute_wrap attr =
+ studyBuilder->FindOrCreateAttribute( theSObject, "AttributeTextColor" );
+ SALOMEDS::AttributeTextColor_wrap colorAttr = attr;
+ colorAttr->SetTextColor( red );
+ }
+ else
+ {
+ studyBuilder->RemoveAttribute( theSObject, "AttributeTextColor" );
+ }
+ }
+}
+
+//=======================================================================
+//function : IsInvalid
+//purpose : Check object validity == absence of AttributeTextColor=(178,34,34)
+//=======================================================================
+
+bool SMESH_Gen_i::IsInvalid( SALOMEDS::SObject_ptr theSObject )
+{
+ bool isValid = true;
+ if ( !theSObject->_is_nil() )
+ {
+ SALOMEDS::GenericAttribute_wrap attr;
+ SALOMEDS::StudyBuilder_var studyBuilder = getStudyServant()->NewBuilder();
+ if ( studyBuilder->FindAttribute( theSObject, attr.inout(), "AttributeTextColor" ))
+ {
+ SALOMEDS::AttributeTextColor_wrap colorAttr = attr;
+ SALOMEDS::Color color = colorAttr->TextColor();
+ isValid = ( color.R != 178 || color.G != 34 || color.B != 34 );
}
}
+ return isValid;
}
//=======================================================================
return aResult._retn();
}
+//================================================================================
+/*!
+ * \brief Create a sub-mesh on a geometry that is not a sub-shape of the main shape
+ * for the case where a valid sub-shape not found by CopyMeshWithGeom().
+ * The invalid sub-mesh has GetId() < 0.
+ */
+//================================================================================
+
+SMESH::SMESH_subMesh_ptr
+SMESH_Gen_i::createInvalidSubMesh(SMESH::SMESH_Mesh_ptr theMesh,
+ GEOM::GEOM_Object_ptr theStrangerGeom,
+ const char* theName)
+{
+ SMESH::SMESH_subMesh_var subMesh;
+
+ try
+ {
+ SMESH_Mesh_i* mesh_i = SMESH::DownCast<SMESH_Mesh_i*>( theMesh );
+ subMesh = mesh_i->createSubMesh( theStrangerGeom );
+
+ if ( !subMesh->_is_nil() && CanPublishInStudy( subMesh ))
+ {
+ SALOMEDS::SObject_wrap so = PublishSubMesh( theMesh, subMesh, theStrangerGeom, theName );
+
+ // hide a reference to geometry
+ if ( !so->_is_nil() )
+ {
+ SALOMEDS::SObject_wrap refSO;
+ if ( so->FindSubObject( GetRefOnShapeTag(), refSO.inout() ))
+ {
+ SALOMEDS::StudyBuilder_var studyBuilder = getStudyServant()->NewBuilder();
+ SALOMEDS::GenericAttribute_wrap attr =
+ studyBuilder->FindOrCreateAttribute( refSO, "AttributeDrawable" );
+ SALOMEDS::AttributeDrawable_wrap ga = attr;
+ ga->SetDrawable( false );
+ }
+ }
+ }
+ }
+ catch (...) {
+ }
+
+ return subMesh._retn();
+}
// ==============