-// Copyright (C) 2007-2020 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_MesherHelper.hxx"
#include "SMESH_subMesh.hxx"
-#include "utilities.h"
-#include "OpUtil.hxx"
-#include "Utils_ExceptHandlers.hxx"
+#include <utilities.h>
+#include <Utils_ExceptHandlers.hxx>
-#include <TopoDS_Iterator.hxx>
+#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
+#include <TopoDS_Iterator.hxx>
#include "memoire.h"
smVec.insert( smVec.end(),
smWithAlgoSupportingSubmeshes[aShapeDim].begin(),
smWithAlgoSupportingSubmeshes[aShapeDim].end() );
+
+ // gather sub-shapes with local uni-dimensional algos (bos #29143)
+ // ----------------------------------------------------------------
+ TopTools_MapOfShape uniDimAlgoShapes;
+ if ( !smVec.empty() )
+ {
+ ShapeToHypothesis::Iterator s2hyps( aMesh.GetMeshDS()->GetHypotheses() );
+ for ( ; s2hyps.More(); s2hyps.Next() )
+ {
+ const TopoDS_Shape& s = s2hyps.Key();
+ if ( s.IsSame( aMesh.GetShapeToMesh() ))
+ continue;
+ for ( auto & hyp : s2hyps.Value() )
+ {
+ if ( const SMESH_Algo* algo = dynamic_cast< const SMESH_Algo*>( hyp ))
+ if ( algo->NeedDiscreteBoundary() )
+ {
+ TopAbs_ShapeEnum sType;
+ switch ( algo->GetDim() ) {
+ case 3: sType = TopAbs_SOLID; break;
+ case 2: sType = TopAbs_FACE; break;
+ default: sType = TopAbs_EDGE; break;
+ }
+ for ( TopExp_Explorer ex( s2hyps.Key(), sType ); ex.More(); ex.Next() )
+ uniDimAlgoShapes.Add( ex.Current() );
+ }
+ }
+ }
+ }
+
{
// ------------------------------------------------
// sort list of sub-meshes according to mesh order
SMESH_subMesh* smToCompute = smIt->next();
const TopoDS_Shape& aSubShape = smToCompute->GetSubShape();
- const int aShapeDim = GetShapeDim( aSubShape );
- if ( aShapeDim < 1 || aSubShape.ShapeType() == shapeType )
+ const int aShapeDim = GetShapeDim( aSubShape );
+ if ( aShapeDim < 1 || aSubShape.ShapeType() <= shapeType )
continue;
+ if ( !uniDimAlgoShapes.Contains( aSubShape ))
+ continue; // [bos #29143] aMesh.GetHypothesis() is too long
// check for preview dimension limitations
if ( aShapesId && GetShapeDim( aSubShape.ShapeType() ) > (int)aDim )
xmlPath += sep + plugin + ".xml";
bool fileOK;
#ifdef WIN32
- #ifdef UNICODE
+# ifdef UNICODE
const wchar_t* path = Kernel_Utils::decode_s(xmlPath);
- #else
+ SMESHUtils::ArrayDeleter<const wchar_t> deleter( path );
+# else
const char* path = xmlPath.c_str();
- #endif
-
+# endif
fileOK = (GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES);
- #ifdef UNICODE
- delete path;
- #endif
-
#else
fileOK = (access(xmlPath.c_str(), F_OK) == 0);
#endif
return dim[ aShapeType ];
}
+//================================================================================
+/*!
+ * \brief Return shape dimension by exploding compounds
+ */
+//================================================================================
+
+int SMESH_Gen::GetFlatShapeDim(const TopoDS_Shape &aShape)
+{
+ int aShapeDim;
+ if ( aShape.ShapeType() == TopAbs_COMPOUND ||
+ aShape.ShapeType() == TopAbs_COMPSOLID )
+ {
+ TopoDS_Iterator it( aShape );
+ aShapeDim = GetFlatShapeDim( it.Value() );
+ }
+ else
+ aShapeDim = GetShapeDim( aShape );
+ return aShapeDim;
+}
+
//=============================================================================
/*!
* Generate a new id unique within this Gen