std::vector< SMESH_subMesh* > smVec;
for ( aShapeDim = 0; aShapeDim < 4; ++aShapeDim )
+ smVec.insert( smVec.end(),
+ smWithAlgoSupportingSubmeshes[aShapeDim].begin(),
+ smWithAlgoSupportingSubmeshes[aShapeDim].end() );
{
// ------------------------------------------------
// sort list of sub-meshes according to mesh order
// ------------------------------------------------
- smVec.assign( smWithAlgoSupportingSubmeshes[ aShapeDim ].begin(),
- smWithAlgoSupportingSubmeshes[ aShapeDim ].end() );
aMesh.SortByMeshOrder( smVec );
// ------------------------------------------------------------
for ( size_t i = 0; i < smVec.size(); ++i )
{
sm = smVec[i];
+ if ( sm->GetComputeState() != SMESH_subMesh::READY_TO_COMPUTE)
+ continue;
+
+ const TopAbs_ShapeEnum shapeType = sm->GetSubShape().ShapeType();
// get a shape the algo is assigned to
if ( !GetAlgo( sm, & algoShape ))
continue; // strange...
// look for more local algos
- smIt = sm->getDependsOnIterator(!includeSelf, !complexShapeFirst);
+ if ( SMESH_subMesh* algoSM = aMesh.GetSubMesh( algoShape ))
+ smIt = algoSM->getDependsOnIterator(!includeSelf, !complexShapeFirst);
+ else
+ smIt = sm->getDependsOnIterator(!includeSelf, !complexShapeFirst);
+
while ( smIt->more() )
{
SMESH_subMesh* smToCompute = smIt->next();
const TopoDS_Shape& aSubShape = smToCompute->GetSubShape();
const int aShapeDim = GetShapeDim( aSubShape );
- if ( aShapeDim < 1 ) continue;
+ if ( aShapeDim < 1 || aSubShape.ShapeType() == shapeType )
+ continue;
// check for preview dimension limitations
if ( aShapesId && GetShapeDim( aSubShape.ShapeType() ) > (int)aDim )
Compute( aMesh, aSubShape, aFlags | SHAPE_ONLY_UPWARD, aDim, aShapesId, localAllowed );
}
}
- }
- // --------------------------------
- // apply the all-dimensional algos
- // --------------------------------
- for ( size_t i = 0; i < smVec.size(); ++i )
- {
- sm = smVec[i];
- if ( sm->GetComputeState() == SMESH_subMesh::READY_TO_COMPUTE)
+ // --------------------------------
+ // apply the all-dimensional algo
+ // --------------------------------
{
- const TopAbs_ShapeEnum shapeType = sm->GetSubShape().ShapeType();
+ if (_compute_canceled)
+ return false;
// check for preview dimension limitations
if ( aShapesId && GetShapeDim( shapeType ) > (int)aDim )
continue;
-
- if (_compute_canceled)
- return false;
sm->SetAllowedSubShapes( fillAllowed( shapeSM, aShapeOnly, allowedSubShapes ));
setCurrentSubMesh( sm );
sm->ComputeStateEngine( computeEvent );
aShapesId->insert( sm->GetId() );
}
}
- } // loop on shape dimensions
+ }
// -----------------------------------------------
// mesh the rest sub-shapes starting from vertices
xmlPath += sep + plugin + ".xml";
bool fileOK;
#ifdef WIN32
-#ifdef UNICODE
+ #ifdef UNICODE
const wchar_t* path = Kernel_Utils::decode_s(xmlPath);
-#else
+ #else
const char* path = xmlPath.c_str();
-#endif
+ #endif
+
fileOK = (GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES);
-#ifdef UNICODE
+
+ #ifdef UNICODE
delete path;
-#endif
+ #endif
+
#else
fileOK = (access(xmlPath.c_str(), F_OK) == 0);
#endif
popupMgr()->insert( separator(), -1, 0 );
createPopupItem( SMESHOp::OpCompute, OB, mesh, "&& selcount=1 && hasAlgo && isComputable" );
- createPopupItem( SMESHOp::OpRecompute, OB, mesh, "&& selcount=1 && hasAlgo && " + isNotEmpty );
+ createPopupItem( SMESHOp::OpRecompute, OB, mesh, "&& selcount=1 && hasAlgo && (" + isNotEmpty + " || hasErrors )");
createPopupItem( SMESHOp::OpShowErrors, OB, mesh, "&& selcount=1 && hasErrors" );
createPopupItem( SMESHOp::OpComputeSubMesh, OB, subMesh, "&& selcount=1 && hasAlgo && isComputable" );
createPopupItem( SMESHOp::OpPreCompute, OB, mesh, "&& selcount=1 && hasAlgo && isPreComputable" );
}
//-----------------------------------------------------------------------------
-void unionLists(TListOfInt& theListOfId,
+bool unionLists(TListOfInt& theListOfId,
TListOfListOfInt& theListOfListOfId,
const int theIndx )
{
+ bool changed = false;
+ if ( theListOfId.empty() )
+ return changed;
TListOfListOfInt::iterator it = theListOfListOfId.begin();
for ( int i = 0; it != theListOfListOfId.end(); it++, i++ )
{
TListOfInt::iterator it2 = otherListOfId.begin();
for ( ; it2 != otherListOfId.end(); it2++ ) {
if ( find( theListOfId.begin(), theListOfId.end(), (*it2) ) == theListOfId.end() )
+ {
theListOfId.push_back(*it2);
+ changed = true;
+ }
}
// clear source list
otherListOfId.clear();
}
+ return changed;
}
//-----------------------------------------------------------------------------
TListOfListOfInt allConurrent = findConcurrentSubMeshes();
anOrder.splice( anOrder.end(), allConurrent );
- int listIndx = 0;
- TListOfListOfInt::iterator listIt = anOrder.begin();
- for(; listIt != anOrder.end(); listIt++, listIndx++ )
- unionLists( *listIt, anOrder, listIndx + 1 );
+ bool changed;
+ do {
+ changed = false;
+ TListOfListOfInt::iterator listIt = anOrder.begin();
+ for ( int listIndx = 1; listIt != anOrder.end(); listIt++, listIndx++ )
+ if ( unionLists( *listIt, anOrder, listIndx ))
+ changed = true;
+ }
+ while ( changed );
// convert submesh ids into interface instances
// and dump command into python