bos #24257 [CEA] Fatal error when creating a submesh if the mesh is on a sub-shape

Adjust isSubshapeOk() for SHAPERSTUDY where GEOM_Gen::AddSubShape() not implemented
This commit is contained in:
eap 2021-05-05 13:28:17 +03:00 committed by vsr
parent 8f903d5ee5
commit 3f5860c39f
2 changed files with 37 additions and 20 deletions

View File

@ -72,8 +72,6 @@ class MESHDRIVER_EXPORT Driver_Mesh
virtual SMESH_ComputeErrorPtr GetError(); virtual SMESH_ComputeErrorPtr GetError();
//virtual bool CanExportMesh() const { return false; } //= 0;
// check if a mesh is too large to export it using IDTYPE; // check if a mesh is too large to export it using IDTYPE;
// check either max ID or number of elements // check either max ID or number of elements
template< typename IDTYPE > template< typename IDTYPE >

View File

@ -43,6 +43,7 @@
// SALOME GEOM includes // SALOME GEOM includes
#include <GEOMBase.h> #include <GEOMBase.h>
#include <GEOMImpl_Types.hxx> #include <GEOMImpl_Types.hxx>
#include <GEOM_Client.hxx>
#include <GEOM_SelectionFilter.h> #include <GEOM_SelectionFilter.h>
#include <GEOM_wrap.hxx> #include <GEOM_wrap.hxx>
#include <GeometryGUI.h> #include <GeometryGUI.h>
@ -318,6 +319,25 @@ SUIT_SelectionFilter* SMESHGUI_MeshOp::createFilter( const int theId ) const
return 0; return 0;
} }
//================================================================================
/*!
* \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 selected shape is a sub-shape of the shape to mesh * \brief check if selected shape is a sub-shape of the shape to mesh
@ -354,7 +374,8 @@ bool SMESHGUI_MeshOp::isSubshapeOk() const
// check all selected shapes // check all selected shapes
QStringList::const_iterator aSubShapesIter = aGEOMs.begin(); QStringList::const_iterator aSubShapesIter = aGEOMs.begin();
for ( ; aSubShapesIter != aGEOMs.end(); aSubShapesIter++) { for ( ; aSubShapesIter != aGEOMs.end(); aSubShapesIter++)
{
QString aSubGeomEntry = (*aSubShapesIter); QString aSubGeomEntry = (*aSubShapesIter);
_PTR(SObject) pSubGeom = SMESH::getStudy()->FindObjectID(aSubGeomEntry.toUtf8().data()); _PTR(SObject) pSubGeom = SMESH::getStudy()->FindObjectID(aSubGeomEntry.toUtf8().data());
if (!pSubGeom) return false; if (!pSubGeom) return false;
@ -366,7 +387,8 @@ bool SMESHGUI_MeshOp::isSubshapeOk() const
// skl for NPAL14695 - implementation of searching of mainObj // skl for NPAL14695 - implementation of searching of mainObj
GEOM::GEOM_Object_var mainObj = op->GetMainShape(aSubGeomVar); /* _var not _wrap as GEOM::GEOM_Object_var mainObj = op->GetMainShape(aSubGeomVar); /* _var not _wrap as
mainObj already exists! */ mainObj already exists! */
while( !mainObj->_is_nil()) { while( !mainObj->_is_nil())
{
CORBA::String_var entry1 = mainObj->GetEntry(); CORBA::String_var entry1 = mainObj->GetEntry();
CORBA::String_var entry2 = mainGeom->GetEntry(); CORBA::String_var entry2 = mainGeom->GetEntry();
if (std::string( entry1.in() ) == entry2.in() ) if (std::string( entry1.in() ) == entry2.in() )
@ -382,21 +404,18 @@ bool SMESHGUI_MeshOp::isSubshapeOk() const
GEOM::SHAPE,/*sorted=*/false); GEOM::SHAPE,/*sorted=*/false);
if ( ids->length() > 0 ) if ( ids->length() > 0 )
{ {
ids->length( 1 ); GEOM_Client geomClient;
GEOM::GEOM_Object_var compSub = geomGen->AddSubShape( aSubGeomVar, ids ); TopoDS_Shape subShape = geomClient.GetShape( geomGen, aSubGeomVar );
if ( !compSub->_is_nil() ) TopoDS_Shape mainShape = geomClient.GetShape( geomGen, mainGeom );
{ if ( subShape.IsNull() || mainShape.IsNull() )
GEOM::ListOfGO_var shared = sop->GetSharedShapes( mainGeom, return false;
compSub,
compSub->GetShapeType() ); TopAbs_ShapeEnum subType = getGroupType( subShape );
geomGen->RemoveObject( compSub ); TopTools_IndexedMapOfShape subMap;
compSub->UnRegister(); TopExp::MapShapes( subShape, subType, subMap );
if ( shared->length() > 0 ) { for ( TopExp_Explorer exp( mainShape, subType ); exp.More(); exp.Next() )
geomGen->RemoveObject( shared[0] ); if ( subMap.Contains( exp.Current() ))
shared[0]->UnRegister(); return true;
}
return ( shared->length() > 0 );
}
} }
} }
} }