X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_GEOMGenUtils.cxx;h=871f916ebb649d17347db34a6e30e0536622a1bd;hp=5367420060850c3a9f8e3d8bada1c2cdd4261f5d;hb=499f29d24922cec66e41b41a0039a954993bc6df;hpb=d5029840731bccaa1718e65f0abf3b19198c7293 diff --git a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx b/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx index 536742006..871f916eb 100644 --- a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2022 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 @@ -42,18 +42,19 @@ #include +#include +#include +#include +#include + namespace SMESH { - GEOM::GEOM_Gen_var GetGEOMGen() + GEOM::GEOM_Gen_var GetGEOMGen( GEOM::GEOM_Object_ptr go ) { - static GEOM::GEOM_Gen_var aGEOMGen; - - if(CORBA::is_nil(aGEOMGen)) { - if ( GeometryGUI::GetGeomGen()->_is_nil() ) - GeometryGUI::InitGeomGen(); - aGEOMGen = GeometryGUI::GetGeomGen(); - } - return aGEOMGen; + GEOM::GEOM_Gen_ptr gen = GEOM::GEOM_Gen::_nil(); + if ( !CORBA::is_nil( go )) + gen = go->GetGen(); + return gen; } GEOM::GEOM_Object_var GetShapeOnMeshOrSubMesh(_PTR(SObject) theMeshOrSubmesh, @@ -111,6 +112,17 @@ namespace SMESH return aMeshShape; } + GEOM::GEOM_Object_var GetGeom( Handle(SALOME_InteractiveObject) io ) + { + GEOM::GEOM_Object_var go; + if ( !io.IsNull() && io->hasEntry() ) + { + _PTR(SObject) so = SMESH::getStudy()->FindObjectID( io->getEntry() ); + go = GetGeom( so ); + } + return go._retn(); + } + SMESHGUI_EXPORT char* GetGeomName( _PTR(SObject) smeshSO ) { if (!smeshSO) @@ -144,14 +156,18 @@ namespace SMESH GEOM::GEOM_Object_ptr GetSubShape (GEOM::GEOM_Object_ptr theMainShape, long theID) { - GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); + if ( CORBA::is_nil( theMainShape )) + return GEOM::GEOM_Object::_nil(); + + GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen( theMainShape ); if (geomGen->_is_nil()) return GEOM::GEOM_Object::_nil(); - GEOM::GEOM_IShapesOperations_wrap aShapesOp = - geomGen->GetIShapesOperations(); + + GEOM::GEOM_IShapesOperations_wrap aShapesOp = geomGen->GetIShapesOperations(); if (aShapesOp->_is_nil()) return GEOM::GEOM_Object::_nil(); - GEOM::GEOM_Object_wrap subShape = aShapesOp->GetSubShape (theMainShape,theID); + + GEOM::GEOM_Object_wrap subShape = aShapesOp->GetSubShape( theMainShape, theID ); return subShape._retn(); } @@ -233,4 +249,83 @@ namespace SMESH } + //================================================================================ + /*! + * \brief Return type of shape contained in a group + */ + //================================================================================ + + TopAbs_ShapeEnum _getGroupType(const TopoDS_Shape& group) + { + if ( group.ShapeType() != TopAbs_COMPOUND ) + return group.ShapeType(); + + // iterate on a compound + TopoDS_Iterator it( group ); + if ( it.More() ) + return _getGroupType( it.Value() ); + + return TopAbs_SHAPE; + } + + + //================================================================================ + /*! + * \brief Check if a subGeom contains sub-shapes of a mainGeom + */ + //================================================================================ + + bool ContainsSubShape( GEOM::GEOM_Object_ptr mainGeom, + GEOM::GEOM_Object_ptr subGeom, bool allowMainShape ) + { + if ( CORBA::is_nil( mainGeom ) || + CORBA::is_nil( subGeom )) + return false; + + if (allowMainShape && mainGeom->IsSame(subGeom)) + return true; + + GEOM::GEOM_Gen_var geomGen = mainGeom->GetGen(); + if ( geomGen->_is_nil() ) return false; + + GEOM::GEOM_IGroupOperations_wrap op = geomGen->GetIGroupOperations(); + if ( op->_is_nil() ) return false; + + GEOM::GEOM_Object_var mainObj = op->GetMainShape( subGeom ); /* _var not _wrap as + mainObj already exists! */ + while ( !mainObj->_is_nil() ) + { + CORBA::String_var entry1 = mainObj->GetEntry(); + CORBA::String_var entry2 = mainGeom->GetEntry(); + if ( std::string( entry1.in() ) == entry2.in() ) + return true; + mainObj = op->GetMainShape( mainObj ); + } + if ( subGeom->GetShapeType() == GEOM::COMPOUND ) + { + // is subGeom a compound of sub-shapes? + GEOM::GEOM_IShapesOperations_wrap sop = geomGen->GetIShapesOperations(); + if ( sop->_is_nil() ) return false; + GEOM::ListOfLong_var ids = sop->GetAllSubShapesIDs( subGeom, + GEOM::SHAPE,/*sorted=*/false); + if ( ids->length() > 0 ) + { + GEOM_Client geomClient; + TopoDS_Shape subShape = geomClient.GetShape( geomGen, subGeom ); + TopoDS_Shape mainShape = geomClient.GetShape( geomGen, mainGeom ); + if ( subShape.IsNull() || mainShape.IsNull() ) + return false; + + TopAbs_ShapeEnum subType = _getGroupType( subShape ); + TopTools_IndexedMapOfShape subMap; + TopExp::MapShapes( subShape, subType, subMap ); + for ( TopExp_Explorer exp( mainShape, subType ); exp.More(); exp.Next() ) + if ( subMap.Contains( exp.Current() )) + return true; + + } + } + return false; + } + } // end of namespace SMESH