Salome HOME
IPAL52650: Convert to quadratic fails on an ellipsoid. V7_7_0a1
authoreap <eap@opencascade.com>
Fri, 4 Sep 2015 17:35:06 +0000 (20:35 +0300)
committereap <eap@opencascade.com>
Fri, 4 Sep 2015 17:35:06 +0000 (20:35 +0300)
IPAL52659: Pattern file is not readable
IPAL18558: Wrong information of the created sub-mesh is shown.

src/SMESH/SMESH_MesherHelper.cxx
src/SMESH/SMESH_Pattern.cxx
src/SMESH_I/SMESH_subMesh_i.cxx

index 8efefaf..6ed5211 100644 (file)
@@ -1610,8 +1610,10 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1,
   {
     F = TopoDS::Face(meshDS->IndexToShape( faceID = pos.first ));
     uv[0] = GetNodeUV(F,n1,n2, force3d ? 0 : &uvOK[0]);
-    if ( HasDegeneratedEdges() && !force3d ) // IPAL52850 (degen VERTEX not at singularity)
+    if (( !force3d ) &&
+        ( HasDegeneratedEdges() || GetSurface( F )->HasSingularities( 1e-7 )))
     {
+      // IPAL52850 (degen VERTEX not at singularity)
       // project middle point to a surface
       SMESH_TNodeXYZ p1( n1 ), p2( n2 );
       gp_Pnt pMid = 0.5 * ( p1 + p2 );
index 5db170d..f92b56b 100644 (file)
@@ -103,7 +103,7 @@ inline int getInt( const char * theSring )
   int val = strtol( theSring, &ptr, 10 );
   if ( ptr == theSring ||
       // there must not be neither '.' nor ',' nor 'E' ...
-      (*ptr != ' ' && *ptr != '\n' && *ptr != '\0'))
+      (*ptr != ' ' && *ptr != '\n' && *ptr != '\0' && *ptr != '\r'))
     return -1;
 
   return val;
@@ -3554,13 +3554,7 @@ void SMESH_Pattern::
   myPolyElems.reserve( myIdsOnBoundary.size() );
 
   // make a set of refined elements
-  TIDSortedElemSet avoidSet, elemSet;
-  std::vector<const SMDS_MeshElement*>::iterator itv =  myElements.begin();
-  for(; itv!=myElements.end(); itv++) {
-    const SMDS_MeshElement* el = (*itv);
-    avoidSet.insert( el );
-  }
-  //avoidSet.insert( myElements.begin(), myElements.end() );
+  TIDSortedElemSet elemSet, avoidSet( myElements.begin(), myElements.end() );
 
   map< TNodeSet, list< list< int > > >::iterator indListIt, nn_IdList;
 
index 2562e85..02c2664 100644 (file)
@@ -35,8 +35,9 @@
 #include "OpUtil.hxx"
 #include "Utils_ExceptHandlers.hxx"
 
-#include <TopoDS_Iterator.hxx>
 #include <TopExp_Explorer.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TopoDS_Iterator.hxx>
 
 using namespace std;
 
@@ -99,50 +100,87 @@ bool getSubMeshes(::SMESH_subMesh*  theSubMesh,
   SMESH_Mesh*      aMesh      = theSubMesh->GetFather();
   SMESHDS_Mesh*    aMeshDS    = aMesh->GetMeshDS();
   SMESHDS_SubMesh* aSubMeshDS = theSubMesh->GetSubMeshDS();
+  ::SMESH_subMesh* sm;
 
   // nodes can be bound to either vertex, edge, face or solid_or_shell
-  TopoDS_Shape aShape = theSubMesh->GetSubShape();
-  switch ( aShape.ShapeType() )
+  TopoDS_Shape         aShape = theSubMesh->GetSubShape();
+  TopAbs_ShapeEnum aShapeType = aShape.ShapeType();
+
+  // IPAL18558: Wrong information of the created sub-mesh is shown. (Sub-mesh on a FACE
+  // with only 1D algo assigned
+  // Find dimension of sub-meshes to return as highest dimension of the assigned algorithm
+  if ( theSubMesh->IsEmpty() && !theSubMesh->GetAlgo() )
   {
-  case TopAbs_SOLID: {
-    // add submesh of solid itself
-    aSubMeshDS = aMeshDS->MeshElements( aShape );
-    if ( aSubMeshDS )
+    // on father sub-meshes, check presence of an algo which will mesh this sub-mesh
+    // even if no algo is assigned to this sub-mesh
+    bool topAlgoPresent = false;
+    TopTools_ListIteratorOfListOfShape ancestors( aMesh->GetAncestors( aShape ));
+    for ( ; ancestors.More() && !topAlgoPresent; ancestors.Next() )
+      if (( sm = aMesh->GetSubMeshContaining( ancestors.Value() )))
+        topAlgoPresent = ( sm->GetAlgo() && !sm->GetAlgo()->NeedDiscreteBoundary() );
+
+    if ( !topAlgoPresent )
+    {
+      // look for a sub-mesh with an algo
+      SMESH_subMeshIteratorPtr smIt =
+        theSubMesh->getDependsOnIterator(/*includeSelf=*/false, /*complexShapeFirst=*/true);
+      TopAbs_ShapeEnum algoShape = TopAbs_SHAPE;
+      while ( smIt->more() && algoShape == TopAbs_SHAPE )
+      {
+        sm = smIt->next();
+        if ( sm->GetAlgo() )
+          algoShape = sm->GetSubShape().ShapeType();
+      }
+      if ( algoShape != TopAbs_SHAPE )
+      {
+        // return all sub-meshes on this shape type
+        smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/false, /*complexShapeFirst=*/true);
+        while ( smIt->more() )
+        {
+          sm = smIt->next();
+          if ( sm->GetSubShape().ShapeType() == algoShape && sm->GetSubMeshDS() )
+            theSubMeshList.push_back( sm->GetSubMeshDS() );
+        }
+        return size < theSubMeshList.size();
+      }
+    }
+  }
+
+  switch ( aShapeType )
+  {
+  case TopAbs_SOLID:
+  {
+    // add sub-mesh of solid itself
+    if (( aSubMeshDS = aMeshDS->MeshElements( aShape )))
       theSubMeshList.push_back( aSubMeshDS );
+
     // and of the first shell
     TopExp_Explorer exp( aShape, TopAbs_SHELL );
-    if ( exp.More() ) {
-      aSubMeshDS = aMeshDS->MeshElements( exp.Current() );
-      if ( aSubMeshDS )
+    if ( exp.More() )
+      if (( aSubMeshDS = aMeshDS->MeshElements( exp.Current() )))
         theSubMeshList.push_back( aSubMeshDS );
-    }
     break;
   }
   case TopAbs_WIRE:
   case TopAbs_COMPOUND:
-  case TopAbs_COMPSOLID: {
+  case TopAbs_COMPSOLID:
+  {
     // call getSubMeshes() for sub-shapes
     list<TopoDS_Shape> shapeList;
     shapeList.push_back( aShape );
     list<TopoDS_Shape>::iterator sh = shapeList.begin();
     for ( ; sh != shapeList.end(); ++sh ) {
       for ( TopoDS_Iterator it( *sh ); it.More(); it.Next() ) {
-        if ( ::SMESH_subMesh* aSubMesh = aMesh->GetSubMeshContaining( it.Value() ))
-          getSubMeshes( aSubMesh, theSubMeshList ); // add found submesh or explore deeper
+        if (( sm = aMesh->GetSubMeshContaining( it.Value() )))
+          getSubMeshes( sm, theSubMeshList ); // add found sub-mesh or explore deeper
         else
           // no submesh for a compound inside compound
           shapeList.push_back( it.Value() );
       }
     }
-    // return only unique submeshes
-    set<SMESHDS_SubMesh*> smSet;
-    TListOfSubMeshes::iterator sm = theSubMeshList.begin();
-    while ( sm != theSubMeshList.end() ) {
-      if ( !smSet.insert( *sm ).second )
-        sm = theSubMeshList.erase( sm );
-      else
-        ++sm;
-    }
+    // return only unique sub-meshes
+    set<SMESHDS_SubMesh*> smSet( theSubMeshList.begin(), theSubMeshList.end() );
+    theSubMeshList.assign( smSet.begin(), smSet.end() );
     break;
   }
   default: