Salome HOME
22526: SMESH 2864 - Projection and Extrusion
authoreap <eap@opencascade.com>
Mon, 7 Apr 2014 11:45:23 +0000 (15:45 +0400)
committereap <eap@opencascade.com>
Mon, 7 Apr 2014 11:45:23 +0000 (15:45 +0400)
1) Set warning mesh icon if the mesh is computed with hyp errors.
2) When edit mesh, get name of geometry from the study directly (not SO -> GEOM_Object -> SO -> name ).
3) Prevent an exception when projecting faces with many holes.

src/SMESHGUI/SMESHGUI_ComputeDlg.cxx
src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx
src/SMESHGUI/SMESHGUI_GEOMGenUtils.h
src/SMESHGUI/SMESHGUI_MeshOp.cxx
src/StdMeshers/StdMeshers_ProjectionUtils.cxx

index c052428..1966e75 100644 (file)
@@ -901,7 +901,9 @@ void SMESHGUI_BaseComputeOp::computeMesh()
 
     // NPAL16631: if ( !memoryLack )
     {
-      SMESH::ModifiedMesh(aMeshSObj, !computeFailed, myMesh->NbNodes() == 0);
+      SMESH::ModifiedMesh( aMeshSObj,
+                           !computeFailed && aHypErrors.isEmpty(),
+                           myMesh->NbNodes() == 0);
       update( UF_ObjBrowser | UF_Model );
 
       // SHOW MESH
index 48821dd..8c2fa06 100644 (file)
@@ -108,6 +108,40 @@ namespace SMESH
     return GEOM::GEOM_Object::_nil();
   }
 
+  SMESHGUI_EXPORT char* GetGeomName( _PTR(SObject) smeshSO )
+  {
+    if (!smeshSO)
+      return 0;
+
+    _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+    if (!aStudy)
+      return 0;
+
+    _PTR(ChildIterator) anIter (aStudy->NewChildIterator( smeshSO ));
+    for ( ; anIter->More(); anIter->Next()) {
+      _PTR(SObject) aSObject = anIter->Value();
+      _PTR(SObject) aRefSOClient;
+      GEOM::GEOM_Object_var aMeshShape;
+
+      if (aSObject->ReferencedObject(aRefSOClient)) {
+        SALOMEDS_SObject* aRefSO = _CAST(SObject,aRefSOClient);
+        aMeshShape = GEOM::GEOM_Object::_narrow(aRefSO->GetObject());
+        aSObject = aRefSOClient;
+      }
+      else {
+        SALOMEDS_SObject* aSO = _CAST(SObject,aSObject);
+        aMeshShape = GEOM::GEOM_Object::_narrow(aSO->GetObject());
+      }
+
+      if (!aMeshShape->_is_nil())
+      {
+        std::string name = aSObject->GetName();
+        return CORBA::string_dup( name.c_str() );
+      }
+    }
+    return 0;
+  }
+
   GEOM::GEOM_Object_ptr GetSubShape (GEOM::GEOM_Object_ptr theMainShape,
                                      long                  theID)
   {
index 3e77609..72fa9e6 100644 (file)
@@ -47,6 +47,8 @@ namespace SMESH
 
   SMESHGUI_EXPORT GEOM::GEOM_Object_ptr GetGeom( _PTR(SObject) );
 
+  SMESHGUI_EXPORT char* GetGeomName( _PTR(SObject) smeshSO );
+
   SMESHGUI_EXPORT GEOM::GEOM_Object_ptr GetSubShape( GEOM::GEOM_Object_ptr, long );
 }
 
index c2ec7fc..1052198 100644 (file)
@@ -2082,13 +2082,9 @@ void SMESHGUI_MeshOp::readMesh()
     }
 
     // Get name of geometry object
-    GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj );
-    if ( !aGeomVar->_is_nil() )
-    {
-      _PTR(SObject) aGeomSO = studyDS()->FindObjectID( aGeomVar->GetStudyEntry() );
-      QString aShapeName = name( aGeomSO );
-      myDlg->setObjectText( SMESHGUI_MeshDlg::Geom, aShapeName );
-    }
+    CORBA::String_var name = SMESH::GetGeomName( pObj );
+    if ( name.in() )
+      myDlg->setObjectText( SMESHGUI_MeshDlg::Geom, name.in() );
   }
 
   // Get hypotheses and algorithms assigned to the mesh/sub-mesh
index 730f78c..77d9c1a 100644 (file)
@@ -1428,7 +1428,8 @@ int StdMeshers_ProjectionUtils::FindFaceAssociation(const TopoDS_Face&    face1,
               // move edge2Beg to place before edge2End
               edges2.splice( edge2End, edges2, edge2Beg++ );
 
-            if ( sameVertexUV( *edge2Beg, face2, 0, v0f1UV, vTolUV ))
+            if ( edge2Beg != edges2.end() &&
+                 sameVertexUV( *edge2Beg, face2, 0, v0f1UV, vTolUV ))
             {
               if ( iW1 == 0 ) OK = true; // OK is for the first wire
               // reverse edges2 if needed