Salome HOME
IPAL52460: Optimal Axes button is inert when edit body fitting parameters
authoreap <eap@opencascade.com>
Fri, 25 Jul 2014 14:06:05 +0000 (18:06 +0400)
committereap <eap@opencascade.com>
Fri, 25 Jul 2014 14:06:05 +0000 (18:06 +0400)
13 files changed:
idl/SMESH_Gen.idl
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx
src/SMESHGUI/SMESHGUI_GEOMGenUtils.h
src/SMESHGUI/SMESHGUI_MeshOp.cxx
src/SMESHGUI/SMESHGUI_MeshOp.h
src/SMESHGUI/SMESHGUI_Utils.h
src/SMESH_I/SMESH_Gen_i.cxx
src/SMESH_I/SMESH_Gen_i.hxx
src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx
src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx
src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h
src/StdMeshersGUI/StdMeshers_msg_en.ts

index c987a07..cb625d0 100644 (file)
@@ -174,6 +174,17 @@ module SMESH
       raises ( SALOME::SALOME_Exception );
 
     /*!
+     * Returns \c True if a hypothesis is assigned to a sole sub-mesh in a current Study
+     *  \param [in] theHyp - the hypothesis of interest
+     *  \param [out] theMesh - the sole mesh using \a theHyp
+     *  \param [out] theShape - the sole geometry \a theHyp is assigned to
+     *  \return boolean - \c True if \a theMesh and \a theShape are sole using \a theHyp
+     */
+    boolean GetSoleSubMeshUsingHyp( in SMESH_Hypothesis   theHyp,
+                                    out SMESH_Mesh        theMesh,
+                                    out GEOM::GEOM_Object theShape);
+
+    /*!
      * Sets number of segments per diagonal of boundary box of geometry by which
      * default segment length of appropriate 1D hypotheses is defined
      */
@@ -407,18 +418,22 @@ module SMESH
 
     /*!
      * \brief Moves objects to the specified position
+     *  \param what objects being moved
+     *  \param where parent object where objects are moved to
+     *  \param row position in the parent object's children list at which objects are moved
      *
      * This function is used in the drag-n-drop functionality.
-     *
-     * \param what objects being moved
-     * \param where parent object where objects are moved to
-     * \param row position in the parent object's children list at which objects are moved
      */
-    void Move( in sobject_list what, 
-              in SALOMEDS::SObject where, 
+    void Move( in sobject_list what,
+              in SALOMEDS::SObject where,
               in long row );
     /*!
-     * Return true if algorithm can be applied
+     * Returns true if algorithm can be used to mesh a given geometry
+     *  \param theAlgoType - the algorithm type
+     *  \param theLibName - a name of the Plug-in library implementing the algorithm
+     *  \param theShapeObject - the geometry to mesh
+     *  \param toCheckAll - if \c True, returns \c True if all shapes are meshable,
+     *         else, returns \c True if at least one shape is meshable
      */
     boolean IsApplicable( in string             theAlgoType,
                           in string             theLibName,
index bc593e2..71ccf61 100644 (file)
@@ -83,6 +83,7 @@
 #include "SMESHGUI_TransparencyDlg.h"
 
 #include "SMESHGUI_FilterUtils.h"
+#include "SMESHGUI_GEOMGenUtils.h"
 #include "SMESHGUI_GroupUtils.h"
 #include "SMESHGUI_HypothesesUtils.h"
 #include "SMESHGUI_MeshUtils.h"
@@ -3093,15 +3094,26 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         Handle(SALOME_InteractiveObject) anIObject = selected.First();
         SMESH::SMESH_Hypothesis_var aHypothesis = SMESH::IObjectToInterface<SMESH::SMESH_Hypothesis>(anIObject);
 
-        /* Look for all mesh objects that have this hypothesis affected in order to flag as ModifiedMesh */
-        /* At end below '...->updateObjBrowser(true)' will change icon of mesh objects                   */
-        /* Warning : however by internal mechanism all subMeshes icons are changed !                     */
         if ( !aHypothesis->_is_nil() )
         {
-          // BUG 0020378
-          //SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypothesis->GetName());
-          SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypothesis->GetName());
-          if (aCreator) {
+          SMESHGUI_GenericHypothesisCreator* aCreator =
+            SMESH::GetHypothesisCreator( SMESH::toQStr( aHypothesis->GetName() ));
+          if (aCreator)
+          {
+            // set geometry of mesh and sub-mesh to aCreator
+            aSel->selectedObjects( selected, "",  /*convertReferences=*/false);
+            if ( selected.Extent() == 1 )
+            {
+              QString subGeomID, meshGeomID;
+              Handle(SALOME_InteractiveObject) hypIO = selected.First();
+              if ( SMESH::GetGeomEntries( hypIO, subGeomID, meshGeomID ))
+              {
+                if ( subGeomID.isEmpty() ) subGeomID = meshGeomID;
+                aCreator->setShapeEntry( subGeomID );
+                aCreator->setMainShapeEntry( meshGeomID );
+              }
+            }
+
             aCreator->edit( aHypothesis.in(), anIObject->getName(), desktop(), this, SLOT( onHypothesisEdit( int ) ) );
           }
           else
index 8c2fa06..88b1819 100644 (file)
@@ -27,6 +27,7 @@
 //
 #include "SMESHGUI_GEOMGenUtils.h"
 #include "SMESHGUI_Utils.h"
+#include "SMESHGUI.h"
 
 // SALOME GEOM includes
 #include <GeometryGUI.h>
@@ -39,6 +40,8 @@
 #include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(SMESH_Mesh)
 
+#include <QString>
+
 namespace SMESH
 {
   GEOM::GEOM_Gen_var GetGEOMGen()
@@ -156,4 +159,86 @@ namespace SMESH
     GEOM::GEOM_Object_wrap subShape = aShapesOp->GetSubShape (theMainShape,theID);
     return subShape._retn();
   }
+
+  //================================================================================
+  /*!
+   * \brief Return entries of sub-mesh geometry and mesh geometry by an IO of assigned
+   *        hypothesis
+   *  \param [in] hypIO - IO of hyp which is a reference SO to a hyp SO
+   *  \param [out] subGeom - found entry of a sub-mesh if any
+   *  \param [out] meshGeom - found entry of a mesh
+   *  \return bool - \c true if any geometry has been found
+   */
+  //================================================================================
+
+  bool GetGeomEntries( Handle(SALOME_InteractiveObject)& hypIO,
+                       QString&                          subGeom,
+                       QString&                          meshGeom )
+  {
+    subGeom.clear();
+    meshGeom.clear();
+    if ( hypIO.IsNull() ) return false;
+
+    _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+    if ( !aStudy ) return false;
+
+    _PTR(SObject) hypSO = aStudy->FindObjectID( hypIO->getEntry() );
+    if ( !hypSO ) return false;
+
+    // Depth() is a number of fathers
+    if ( hypSO->Depth() == 4 ) // hypSO is not a reference to a hyp but a hyp it-self
+    {
+      SMESH::SMESH_Hypothesis_var hyp =
+        SMESH::SObjectToInterface< SMESH::SMESH_Hypothesis >( hypSO );
+      SMESH::SMESH_Mesh_var mesh;
+      GEOM::GEOM_Object_var geom;
+      SMESH::SMESH_Gen_var  gen = SMESHGUI::GetSMESHGUI()->GetSMESHGen();
+      if ( !gen || !gen->GetSoleSubMeshUsingHyp( hyp, mesh.out(), geom.out() ))
+        return false;
+
+      subGeom = toQStr( geom->GetStudyEntry() );
+
+      geom  = mesh->GetShapeToMesh();
+      if ( geom->_is_nil() )
+        return false;
+      meshGeom = toQStr( geom->GetStudyEntry() );
+    }
+    else
+    {
+      _PTR(SObject) appliedSO = hypSO->GetFather(); // "Applied hypotheses" folder
+      if ( !appliedSO ) return false;
+
+      _PTR(SObject) subOrMeshSO = appliedSO->GetFather(); // mesh or sub-mesh SO
+      if ( !subOrMeshSO ) return false;
+
+      bool isMesh;
+      GEOM::GEOM_Object_var geom = GetShapeOnMeshOrSubMesh( subOrMeshSO, &isMesh );
+      if ( geom->_is_nil() )
+        return false;
+
+      if ( isMesh )
+      {
+        meshGeom = toQStr( geom->GetStudyEntry() );
+        return !meshGeom.isEmpty();
+      }
+
+      subGeom = toQStr( geom->GetStudyEntry() );
+
+      _PTR(SObject) subFolderSO = subOrMeshSO->GetFather(); // "SubMeshes on ..." folder
+      if ( !subFolderSO ) return false;
+
+      _PTR(SObject) meshSO = subFolderSO->GetFather(); // mesh SO
+      if ( !meshSO ) return false;
+
+      geom = GetShapeOnMeshOrSubMesh( meshSO );
+      if ( geom->_is_nil() )
+        return false;
+
+      meshGeom = toQStr( geom->GetStudyEntry() );
+    }
+
+    return !meshGeom.isEmpty() && !subGeom.isEmpty();
+  }
+
+
 } // end of namespace SMESH
index 72fa9e6..f9cdeaf 100644 (file)
@@ -38,6 +38,8 @@
 #include CORBA_SERVER_HEADER(GEOM_Gen)
 
 class SALOMEDSClient_SObject;
+class Handle_SALOME_InteractiveObject;
+class QString;
 
 namespace SMESH
 {
@@ -50,6 +52,9 @@ namespace SMESH
   SMESHGUI_EXPORT char* GetGeomName( _PTR(SObject) smeshSO );
 
   SMESHGUI_EXPORT GEOM::GEOM_Object_ptr GetSubShape( GEOM::GEOM_Object_ptr, long );
+
+  SMESHGUI_EXPORT bool GetGeomEntries( Handle_SALOME_InteractiveObject& hypIO,
+                                       QString& subGeom, QString& meshGeom);
 }
 
 #endif // SMESHGUI_GEOMGENUTILS_H
index 8a3346e..de77540 100644 (file)
@@ -398,7 +398,8 @@ char* SMESHGUI_MeshOp::isSubmeshIgnored() const
       THypList    algoList;
       existingHyps(3, Algo, pMesh, algoNames, algoList);
       if (!algoList.empty()) {
-        HypothesisData* algo = SMESH::GetHypothesisData( algoList[0].first->GetName() );
+        HypothesisData* algo =
+          SMESH::GetHypothesisData( SMESH::toQStr( algoList[0].first->GetName() ));
         if ( algo &&
              algo->InputTypes.empty() && // builds all dimensions it-self
              !algo->IsSupportSubmeshes )
@@ -412,7 +413,8 @@ char* SMESHGUI_MeshOp::isSubmeshIgnored() const
 //       if ( !geom->_is_nil() && geom->GetShapeType() >= GEOM::FACE ) { // WIRE, EDGE as well
         existingHyps(2, Algo, pMesh, algoNames, algoList);
         if (!algoList.empty()) {
-          HypothesisData* algo = SMESH::GetHypothesisData( algoList[0].first->GetName() );
+          HypothesisData* algo =
+            SMESH::GetHypothesisData( SMESH::toQStr( algoList[0].first->GetName() ));
           if ( algo &&
                algo->InputTypes.empty() && // builds all dimensions it-self
                !algo->IsSupportSubmeshes )
@@ -1033,6 +1035,71 @@ SMESHGUI_MeshOp::getInitParamsHypothesis( const QString& aHypType,
 
 //================================================================================
 /*!
+ * \brief initialize a hypothesis creator
+ */
+//================================================================================
+
+void SMESHGUI_MeshOp::initHypCreator( SMESHGUI_GenericHypothesisCreator* theCreator )
+{
+  if ( !theCreator ) return;
+
+  // Set shapes, of mesh and sub-mesh if any
+
+  // get Entry of the Geom object
+  QString aGeomEntry = "";
+  QString aMeshEntry = "";
+  QString anObjEntry = "";
+  aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom );
+  aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh );
+  anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj );
+
+  if ( myToCreate && myIsMesh )
+    aMeshEntry = aGeomEntry;
+
+  if ( aMeshEntry != aGeomEntry ) { // Get Geom object from Mesh of a sub-mesh being edited
+    _PTR(SObject) pObj = studyDS()->FindObjectID( aMeshEntry.toLatin1().data() );
+    GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj );
+    aMeshEntry = ( aGeomVar->_is_nil() ) ? QString() : SMESH::toQStr( aGeomVar->GetStudyEntry() );
+  }
+
+  if ( aMeshEntry == "" && aGeomEntry == "" ) { // get geom of an object being edited
+    _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() );
+    bool isMesh;
+    GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj, &isMesh );
+    if ( !aGeomVar->_is_nil() )
+    {
+      aGeomEntry = SMESH::toQStr( aGeomVar->GetStudyEntry() );
+      if ( isMesh )
+        aMeshEntry = aGeomEntry;
+    }
+  }
+
+  if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) {
+    // take geometry from submesh being created
+    _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() );
+    if ( pObj ) {
+      // if current object is sub-mesh
+      SMESH::SMESH_subMesh_var aSubMeshVar =
+        SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() );
+      if ( !aSubMeshVar->_is_nil() ) {
+        SMESH::SMESH_Mesh_var aMeshVar =  aSubMeshVar->GetFather();
+        if ( !aMeshVar->_is_nil() ) {
+          _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar );
+          GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( aMeshSO );
+          if ( !aGeomVar->_is_nil() )
+            aMeshEntry = SMESH::toQStr( aGeomVar->GetStudyEntry() );
+        }
+      }
+    }
+  }
+
+  theCreator->setShapeEntry( aGeomEntry );
+  if ( aMeshEntry != "" )
+    theCreator->setMainShapeEntry( aMeshEntry );
+}
+
+//================================================================================
+/*!
  * \Brief Returns tab dimention
   * \param tab - the tab in the dlg
   * \param dlg - my dialogue
@@ -1138,64 +1205,17 @@ void SMESHGUI_MeshOp::createHypothesis(const int theDim,
     SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(theTypeName);
 
     // Create hypothesis
-    if (aCreator) {
+    if (aCreator)
+    {
       // Get parameters appropriate to initialize a new hypothesis
       SMESH::SMESH_Hypothesis_var initParamHyp =
         getInitParamsHypothesis(theTypeName, aData->ServerLibName);
 
       removeCustomFilters(); // Issue 0020170
 
-      // Get Entry of the Geom object
-      QString aGeomEntry = "";
-      QString aMeshEntry = "";
-      QString anObjEntry = "";
-      aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom );
-      aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh );
-      anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj );
+      // set shapes, of mesh and sub-mesh if any
+      initHypCreator( aCreator );
 
-      if ( myToCreate && myIsMesh )
-        aMeshEntry = aGeomEntry;
-
-      if ( aMeshEntry != aGeomEntry ) { // Get Geom object from Mesh of a sub-mesh being edited
-        _PTR(SObject) pObj = studyDS()->FindObjectID( aMeshEntry.toLatin1().data() );
-        GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj );
-        aMeshEntry = ( aGeomVar->_is_nil() ) ? "" : aMeshEntry = aGeomVar->GetStudyEntry();
-      }
-
-      if ( aMeshEntry == "" && aGeomEntry == "" ) { // get geom of an object being edited
-        _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() );
-        bool isMesh;
-        GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj, &isMesh );
-        if ( !aGeomVar->_is_nil() )
-        {
-          aGeomEntry = aGeomVar->GetStudyEntry();
-          if ( isMesh )
-            aMeshEntry = aGeomEntry;
-        }
-      }
-
-      if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) {
-        // take geometry from submesh being created
-        _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() );
-        if ( pObj ) {
-          // if current object is sub-mesh
-          SMESH::SMESH_subMesh_var aSubMeshVar =
-            SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() );
-          if ( !aSubMeshVar->_is_nil() ) {
-            SMESH::SMESH_Mesh_var aMeshVar =  aSubMeshVar->GetFather();
-            if ( !aMeshVar->_is_nil() ) {
-              _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar );
-              GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( aMeshSO );
-              if ( !aGeomVar->_is_nil() )
-                aMeshEntry = aGeomVar->GetStudyEntry();
-            }
-          }
-        }
-      }
-
-      aCreator->setShapeEntry( aGeomEntry );
-      if ( aMeshEntry != "" )
-        aCreator->setMainShapeEntry( aMeshEntry );
       myDlg->setEnabled( false );
       aCreator->create(initParamHyp, aHypName, myDlg, this, SLOT( onHypoCreated( int ) ) );
       dialog = true;
@@ -1270,67 +1290,22 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex )
   if ( aHyp->_is_nil() )
     return;
 
-  SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHyp->GetName());
+  SMESHGUI_GenericHypothesisCreator* aCreator =
+    SMESH::GetHypothesisCreator( SMESH::toQStr( aHyp->GetName() ));
   if ( aCreator )
   {
-    // Get initial parameters
+    // set initial parameters
     SMESH::SMESH_Hypothesis_var initParamHyp =
-      getInitParamsHypothesis( aHyp->GetName(), aHyp->GetLibName());
+      getInitParamsHypothesis( SMESH::toQStr( aHyp->GetName() ),
+                               SMESH::toQStr( aHyp->GetLibName() ));
     aCreator->setInitParamsHypothesis( initParamHyp );
 
-    // Get Entry of the Geom object
-    QString aGeomEntry = "";
-    QString aMeshEntry = "";
-    QString anObjEntry = "";
-    aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom );
-    aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh );
-    anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj );
+    // set shapes, of mesh and sub-mesh if any
+    initHypCreator( aCreator );
 
-    if ( myToCreate && myIsMesh )
-      aMeshEntry = aGeomEntry;
-
-    if ( aMeshEntry != aGeomEntry ) { // Get Geom object from Mesh of a sub-mesh being edited
-      _PTR(SObject) pObj = studyDS()->FindObjectID( aMeshEntry.toLatin1().data() );
-      GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj );
-      aMeshEntry = ( aGeomVar->_is_nil() ) ? "" : aMeshEntry = aGeomVar->GetStudyEntry();
-    }
-
-    if ( aMeshEntry == "" && aGeomEntry == "" ) { // get geom of an object being edited
-      _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() );
-      bool isMesh;
-      GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj, &isMesh );
-      if ( !aGeomVar->_is_nil() )
-      {
-        aGeomEntry = aGeomVar->GetStudyEntry();
-        if ( isMesh )
-          aMeshEntry = aGeomEntry;
-      }
-    }
-
-    if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) {
-      // take geometry from submesh being created
-      _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() );
-      if ( pObj ) {
-        // if current object is sub-mesh
-        SMESH::SMESH_subMesh_var aSubMeshVar =
-          SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() );
-        if ( !aSubMeshVar->_is_nil() ) {
-          SMESH::SMESH_Mesh_var aMeshVar =  aSubMeshVar->GetFather();
-          if ( !aMeshVar->_is_nil() ) {
-            _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar );
-            GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( aMeshSO );
-            if ( !aGeomVar->_is_nil() )
-              aMeshEntry = aGeomVar->GetStudyEntry();
-          }
-        }
-      }
-    }
-
-    aCreator->setShapeEntry( aGeomEntry );
-    if ( aMeshEntry != "" )
-      aCreator->setMainShapeEntry( aMeshEntry );
     removeCustomFilters(); // Issue 0020170
     myDlg->setEnabled( false );
+
     aCreator->edit( aHyp.in(), aHypItem.second, dlg(), this, SLOT( onHypoEdited( int ) ) );
   }
 }
@@ -1521,10 +1496,10 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex,
       if ( !myToCreate && !curAlgo && !curHyp->_is_nil() ) { // edition, algo not selected
         // try to find algo by selected hypothesis in order to keep it selected
         bool algoDeselectedByUser = ( theDim < 0 && aDim == dim );
-        CORBA::String_var curHypType = curHyp->GetName();
+        QString curHypType = SMESH::toQStr( curHyp->GetName() );
         if ( !algoDeselectedByUser &&
-            myObjHyps[ dim ][ type ].count() > 0 &&
-            !strcmp( curHypType, myObjHyps[ dim ][ type ].first().first->GetName()) )
+             myObjHyps[ dim ][ type ].count() > 0 &&
+             curHypType == SMESH::toQStr( myObjHyps[ dim ][ type ].first().first->GetName()) )
         {
           HypothesisData* hypData = SMESH::GetHypothesisData( curHyp->GetName() );
           for (int i = 0; i < myAvailableHypData[ dim ][ Algo ].count(); ++i) {
@@ -1994,8 +1969,7 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim )
   for ( ; anIter != aHypVarList.end(); anIter++)
   {
     SMESH::SMESH_Hypothesis_var aHypVar = (*anIter).first;
-    CORBA::String_var aName = aHypVar->GetName();
-    if ( !aHypVar->_is_nil() && !strcmp(aHypName.toLatin1().data(), aName) )
+    if ( !aHypVar->_is_nil() && aHypName == SMESH::toQStr( aHypVar->GetName() ))
     {
       anAlgoVar = aHypVar;
       break;
@@ -2038,8 +2012,7 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim )
     for ( anIter = aNewHypVarList.begin(); anIter != aNewHypVarList.end(); ++anIter )
     {
       SMESH::SMESH_Hypothesis_var aHypVar = (*anIter).first;
-      CORBA::String_var aName = aHypVar->GetName();
-      if ( !aHypVar->_is_nil() && !strcmp(aHypName.toLatin1().data(), aName) )
+      if ( !aHypVar->_is_nil() && aHypName == SMESH::toQStr( aHypVar->GetName() ))
       {
         anAlgoVar = aHypVar;
         break;
@@ -2430,7 +2403,7 @@ void SMESHGUI_MeshOp::onPublishShapeByMeshDlg(SUIT_Operation* op)
     GEOM::GEOM_Object_var aGeomVar = myShapeByMeshOp->GetShape();
     if ( !aGeomVar->_is_nil() )
     {
-      QString ID = aGeomVar->GetStudyEntry();
+      QString ID = SMESH::toQStr( aGeomVar->GetStudyEntry() );
       if ( _PTR(SObject) aGeomSO = studyDS()->FindObjectID( ID.toLatin1().data() )) {
         selectObject( aGeomSO );
         selectionDone();
index fcaedab..8aa0fb9 100644 (file)
@@ -36,6 +36,7 @@ class HypothesesSet;
 class SMESHGUI_MeshDlg;
 class SMESHGUI_ShapeByMeshOp;
 class HypothesisData;
+class SMESHGUI_GenericHypothesisCreator;
 
 /*!
  * \brief Operation for mech creation or editing
@@ -126,6 +127,7 @@ private:
                                        const THypList& ) const;
   SMESH::SMESH_Hypothesis_var    getInitParamsHypothesis( const QString&,
                                                           const QString& ) const;
+  void                           initHypCreator( SMESHGUI_GenericHypothesisCreator* aCreator );
   bool                           isSubshapeOk() const;
   char*                          isSubmeshIgnored() const;
   _PTR(SObject)                  getSubmeshByGeom() const;
index 2cf9eaa..d5ec25e 100644 (file)
@@ -184,6 +184,30 @@ SMESHGUI_EXPORT
   // type to use instead of SMESH_IDSource_var for automatic UnRegister()
   typedef SALOME::GenericObj_wrap<SMESH_IDSource> SMESH_IDSource_wrap;
 
+  /*!
+   * \brief Class usefull to convert a string returned from a CORBA call
+   *        to other string types w/o memory leak.
+   *
+   *        Usage (of instantiations): QString s = toQStr( objVar->GetName() );
+   *                              std::string ss = toStdStr( objVar->GetName() );
+   */
+  template < class _STRING >
+  class toStrT : public _STRING {
+    CORBA::String_var myStr;
+  public:
+    toStrT( char* s ): myStr(s), _STRING( s )
+    {}
+    operator const char*() const
+    { return myStr.in(); }
+  };
+  // Instantiations:
+  struct toQStr : public toStrT< QString > {
+    toQStr( char* s ): toStrT< QString >(s) {}
+  };
+  class toStdStr : public toStrT< std::string > {
+    toStdStr( char* s ): toStrT< std::string >(s) {}
+  };
+
 }
 
 #endif // SMESHGUI_UTILS_H
index 7d1dbf9..b822651 100644 (file)
@@ -280,7 +280,7 @@ SMESH_Gen_i::SMESH_Gen_i( CORBA::ORB_ptr            orb,
                           PortableServer::ObjectId* contId,
                           const char*               instanceName,
                           const char*               interfaceName )
-     : Engines_Component_i( orb, poa, contId, instanceName, interfaceName )
+  : Engines_Component_i( orb, poa, contId, instanceName, interfaceName )
 {
   MESSAGE( "SMESH_Gen_i::SMESH_Gen_i : standard constructor" );
 
@@ -472,7 +472,7 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName
   // create a new hypothesis object, store its ref. in studyContext
   if(MYDEBUG) MESSAGE("Create Hypothesis " << theHypName);
   myHypothesis_i =
-      myHypCreatorMap[string(theHypName)]->Create(myPoa, GetCurrentStudyID(), &myGen);
+    myHypCreatorMap[string(theHypName)]->Create(myPoa, GetCurrentStudyID(), &myGen);
   myHypothesis_i->SetLibName(aPlatformLibName.c_str()); // for persistency assurance
 
   if (!myHypothesis_i)
@@ -495,7 +495,7 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName
  */
 //=============================================================================
 SMESH::SMESH_Mesh_ptr SMESH_Gen_i::createMesh()
-     throw ( SALOME::SALOME_Exception )
+  throw ( SALOME::SALOME_Exception )
 {
   Unexpect aCatch(SALOME_SalomeException);
   if(MYDEBUG) MESSAGE( "SMESH_Gen_i::createMesh" );
@@ -673,7 +673,7 @@ SALOMEDS::Study_ptr SMESH_Gen_i::GetCurrentStudy()
 StudyContext* SMESH_Gen_i::GetCurrentStudyContext()
 {
   if ( !CORBA::is_nil( myCurrentStudy ) &&
-      myStudyContextMap.find( GetCurrentStudyID() ) != myStudyContextMap.end() )
+       myStudyContextMap.find( GetCurrentStudyID() ) != myStudyContextMap.end() )
     return myStudyContextMap[ myCurrentStudy->StudyId() ];
   else
     return 0;
@@ -689,7 +689,7 @@ StudyContext* SMESH_Gen_i::GetCurrentStudyContext()
 
 SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::CreateHypothesis( const char* theHypName,
                                                            const char* theLibName )
-     throw ( SALOME::SALOME_Exception )
+  throw ( SALOME::SALOME_Exception )
 {
   Unexpect aCatch(SALOME_SalomeException);
   // Create hypothesis/algorithm
@@ -805,6 +805,97 @@ SMESH_Gen_i::GetHypothesisParameterValues (const char*           theHypType,
 
 //=============================================================================
 /*!
+ * Returns \c True if a hypothesis is assigned to a sole sub-mesh in a current Study
+ *  \param [in] theHyp - the hypothesis of interest
+ *  \param [out] theMesh - the sole mesh using \a theHyp
+ *  \param [out] theShape - the sole geometry \a theHyp is assigned to
+ *  \return boolean - \c True if \a theMesh and \a theShape are sole using \a theHyp
+ *
+ * If two meshes on same shape have theHyp assigned to the same sub-shape, they are
+ * considered as SAME sub-mesh => result is \c true.
+ * This method ids used to initialize SMESHGUI_GenericHypothesisCreator with
+ * a shape to which an hyp being edited is assigned.
+ */
+//=============================================================================
+
+CORBA::Boolean SMESH_Gen_i::GetSoleSubMeshUsingHyp( SMESH::SMESH_Hypothesis_ptr theHyp,
+                                                    SMESH::SMESH_Mesh_out       theMesh,
+                                                    GEOM::GEOM_Object_out       theShape)
+{
+  if ( GetCurrentStudyID() < 0 || CORBA::is_nil( theHyp ))
+    return false;
+
+  // get Mesh component SO
+  CORBA::String_var compDataType = ComponentDataType();
+  SALOMEDS::SComponent_wrap comp = myCurrentStudy->FindComponent( compDataType.in() );
+  if ( CORBA::is_nil( comp ))
+    return false;
+
+  // look for child SO of meshes
+  SMESH::SMESH_Mesh_var foundMesh;
+  TopoDS_Shape          foundShape;
+  bool                  isSole = true;
+  SALOMEDS::ChildIterator_wrap meshIter = myCurrentStudy->NewChildIterator( comp );
+  for ( ; meshIter->More() && isSole; meshIter->Next() )
+  {
+    SALOMEDS::SObject_wrap curSO = meshIter->Value();
+    CORBA::Object_var        obj = SObjectToObject( curSO );
+    SMESH_Mesh_i*         mesh_i = SMESH::DownCast< SMESH_Mesh_i* >( obj );
+    if ( ! mesh_i )
+      continue;
+
+    // look for a sole shape where theHyp is assigned
+    bool isHypFound = false;
+    const ShapeToHypothesis & s2hyps = mesh_i->GetImpl().GetMeshDS()->GetHypotheses();
+    ShapeToHypothesis::Iterator s2hypsIt( s2hyps );
+    for ( ; s2hypsIt.More() && isSole; s2hypsIt.Next() )
+    {
+      const THypList& hyps = s2hypsIt.Value();
+      THypList::const_iterator h = hyps.begin();
+      for ( ; h != hyps.end(); ++h )
+        if ( (*h)->GetID() == theHyp->GetId() )
+          break;
+      if ( h != hyps.end()) // theHyp found
+      {
+        isHypFound = true;
+        if ( ! foundShape.IsNull() &&
+             ! foundShape.IsSame( s2hypsIt.Key() )) // not a sole sub-shape
+        {
+          foundShape.Nullify();
+          isSole = false;
+          break;
+        }
+        foundShape = s2hypsIt.Key();
+      }
+    } // loop on assigned hyps
+
+    if ( isHypFound && !foundShape.IsNull() ) // a mesh using theHyp is found
+    {
+      if ( !foundMesh->_is_nil() ) // not a sole mesh
+      {
+        GEOM::GEOM_Object_var s1 = mesh_i   ->GetShapeToMesh();
+        GEOM::GEOM_Object_var s2 = foundMesh->GetShapeToMesh();
+        if ( ! ( isSole = s1->IsSame( s2 )))
+          break;
+      }
+      foundMesh = SMESH::SMESH_Mesh::_narrow( obj );
+    }
+
+  } // loop on meshes
+
+  if ( isSole &&
+       ! foundMesh->_is_nil() &&
+       ! foundShape.IsNull() )
+  {
+    theMesh  = foundMesh._retn();
+    theShape = ShapeToGeomObject( foundShape );
+    return ( !theMesh->_is_nil() && !theShape->_is_nil() );
+  }
+  return false;
+}
+
+//=============================================================================
+/*!
  * Sets number of segments per diagonal of boundary box of geometry by which
  * default segment length of appropriate 1D hypotheses is defined
  */
@@ -5062,10 +5153,18 @@ void SMESH_Gen_i::Move( const SMESH::sobject_list& what,
       useCaseBuilder->AppendTo( where, sobj );        // append to the end of list
   }
 }
-//=================================================================================
-// function : IsApplicable
-// purpose  : Return true if algorithm can be applied
-//=================================================================================
+//================================================================================
+/*!
+ * \brief Returns true if algorithm can be used to mesh a given geometry
+ *  \param [in] theAlgoType - the algorithm type
+ *  \param [in] theLibName - a name of the Plug-in library implementing the algorithm
+ *  \param [in] theGeomObject - the geometry to mesh
+ *  \param [in] toCheckAll - if \c True, returns \c True if all shapes are meshable,
+ *         else, returns \c True if at least one shape is meshable
+ *  \return CORBA::Boolean - can or can't
+ */
+//================================================================================
+
 CORBA::Boolean SMESH_Gen_i::IsApplicable ( const char*           theAlgoType,
                                            const char*           theLibName,
                                            GEOM::GEOM_Object_ptr theGeomObject,
@@ -5075,7 +5174,8 @@ CORBA::Boolean SMESH_Gen_i::IsApplicable ( const char*           theAlgoType,
 
   std::string aPlatformLibName;
   typedef GenericHypothesisCreator_i* (*GetHypothesisCreator)(const char*);
-  GenericHypothesisCreator_i* aCreator = getHypothesisCreator(theAlgoType, theLibName, aPlatformLibName);
+  GenericHypothesisCreator_i* aCreator =
+    getHypothesisCreator(theAlgoType, theLibName, aPlatformLibName);
   if (aCreator)
   {
     TopoDS_Shape shape = GeomObjectToShape( theGeomObject );
index 3405a83..ba4ed98 100644 (file)
@@ -205,6 +205,13 @@ public:
                                                             CORBA::Boolean        byMesh)
     throw ( SALOME::SALOME_Exception );
 
+  /*
+   * Returns True if a hypothesis is assigned to a sole sub-mesh in a current Study
+   */
+  CORBA::Boolean GetSoleSubMeshUsingHyp( SMESH::SMESH_Hypothesis_ptr theHyp,
+                                         SMESH::SMESH_Mesh_out       theMesh,
+                                         GEOM::GEOM_Object_out       theShape);
+
   // Preferences
   // ------------
   /*!
index 891b2c0..c481eea 100644 (file)
@@ -47,6 +47,7 @@
 
 // SALOME GUI includes
 #include <SUIT_ResourceMgr.h>
+#include <SUIT_MessageBox.h>
 
 // IDL includes
 #include <SALOMEconfig.h>
@@ -1265,8 +1266,15 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const
 
       idsWg->SetMainShapeEntry( aMainEntry );
       idsWg->SetGeomShapeEntry( aSubEntry.isEmpty() ? aMainEntry : aSubEntry );
-      idsWg->SetListOfIDs( h->GetFaces() );
-      idsWg->showPreview( true );
+      if ( idsWg->SetListOfIDs( h->GetFaces() ))
+      {
+        idsWg->showPreview( true );
+      }
+      else
+      {
+        SUIT_MessageBox::warning( dlg(),tr( "SMESH_WRN_WARNING" ),tr( "BAD_FACES_WARNING" ));
+        idsWg->setEnabled( false );
+      }
       customWidgets()->append ( idsWg );
     }
   }
@@ -1317,8 +1325,15 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const
 
       idsWg->SetMainShapeEntry( aMainEntry );
       idsWg->SetGeomShapeEntry( aSubEntry.isEmpty() ? aMainEntry : aSubEntry );
-      idsWg->SetListOfIDs( h->GetEdges() );
-      idsWg->showPreview( true );
+      if ( idsWg->SetListOfIDs( h->GetEdges() ))
+      {
+        idsWg->showPreview( true );
+      }
+      else
+      {
+        SUIT_MessageBox::warning( dlg(),tr( "SMESH_WRN_WARNING" ),tr( "BAD_EDGES_WARNING" ));
+        idsWg->setEnabled( false );
+      }
       customWidgets()->append ( idsWg );
     }
   }
index 935df0c..9cd4ff7 100644 (file)
@@ -515,9 +515,9 @@ SMESH::long_array_var StdMeshersGUI_SubShapeSelectorWdg::GetListOfIDs()
 
 //=================================================================================
 // function : SetListOfIds
-// purpose  : Called to set the list of SubShapes IDs
+// purpose  : Called to set the list of SubShapes IDs. Returns false if any ID is invalid
 //=================================================================================
-void StdMeshersGUI_SubShapeSelectorWdg::SetListOfIDs( SMESH::long_array_var theIds)
+bool StdMeshersGUI_SubShapeSelectorWdg::SetListOfIDs( SMESH::long_array_var theIds)
 {
   mySelectedIDs.clear();
   myListOfIDs.clear();
@@ -525,8 +525,10 @@ void StdMeshersGUI_SubShapeSelectorWdg::SetListOfIDs( SMESH::long_array_var theI
   for ( int i = 0; i < size; i++ )
     mySelectedIDs.append( theIds[ i ] );
 
-  mySelectedIDs = GetCorrectedListOfIDs( false );
+  bool isOk;
+  mySelectedIDs = GetCorrectedListOfIDs( false, &isOk );
   onAdd();
+  return isOk;
 }
 
 //=================================================================================
@@ -556,35 +558,74 @@ const char* StdMeshersGUI_SubShapeSelectorWdg::GetMainShapeEntry()
 // function : GetCorrectedListOfIds
 // purpose  : Called to convert the list of IDs from sub-shape IDs to main shape IDs
 //=================================================================================
-QList<int> StdMeshersGUI_SubShapeSelectorWdg::GetCorrectedListOfIDs( bool fromSubshapeToMainshape )
+QList<int>
+StdMeshersGUI_SubShapeSelectorWdg::GetCorrectedListOfIDs( bool fromSubshapeToMainshape,
+                                                          bool* isOK )
 {
-  if ( ( myMainShape.IsNull() || myGeomShape.IsNull() ) &&  fromSubshapeToMainshape )
+  if (( myMainShape.IsNull() || myGeomShape.IsNull() ) &&  fromSubshapeToMainshape )
     return myListOfIDs;
-  else   if ( ( myMainShape.IsNull() || myGeomShape.IsNull() ) &&  !fromSubshapeToMainshape )
+  else if (( myMainShape.IsNull() /*||*/&& myGeomShape.IsNull() ) &&  !fromSubshapeToMainshape )
     return mySelectedIDs;
 
+  if ( !fromSubshapeToMainshape ) // called from SetListOfIDs
+  {
+    if ( myMainShape.IsNull() )
+      std::swap( myMainShape, myGeomShape );
+  }
+
   QList<int> aList;
-  TopTools_IndexedMapOfShape   aGeomMap;
-  TopTools_IndexedMapOfShape   aMainMap;
-  TopExp::MapShapes(myGeomShape, aGeomMap);
+  TopTools_IndexedMapOfShape aGeomMap, aMainMap;
   TopExp::MapShapes(myMainShape, aMainMap);
+  if ( !myGeomShape.IsNull() )
+    TopExp::MapShapes(myGeomShape, aGeomMap);
 
-  if ( fromSubshapeToMainshape ) { // convert indexes from sub-shape to mainshape
+  bool ok = true;
+  if ( fromSubshapeToMainshape ) // convert indexes from sub-shape to mainshape
+  {
     int size = myListOfIDs.size();
     for (int i = 0; i < size; i++) {
-      TopoDS_Shape aSubShape = aGeomMap.FindKey( myListOfIDs.at(i) );
-      int index = aMainMap.FindIndex( aSubShape );
+      int index = myListOfIDs.at(i);
+      if ( aGeomMap.Extent() < index )
+      {
+        ok = false;
+      }
+      else
+      {
+        TopoDS_Shape aSubShape = aGeomMap.FindKey( index );
+        if ( mySubShType != aSubShape.ShapeType() )
+          ok = false;
+        if ( !aMainMap.Contains( aSubShape ))
+          ok = false;
+        else
+          index = aMainMap.FindIndex( aSubShape );
+      }
       aList.append( index );
     }
     myIsNotCorrected = false;
-  } else { // convert indexes from main shape to sub-shape
+  }
+  else // convert indexes from main shape to sub-shape, or just check indices
+  {
     int size = mySelectedIDs.size();
     for (int i = 0; i < size; i++) {
-      TopoDS_Shape aSubShape = aMainMap.FindKey( mySelectedIDs.at(i) );
-      int index = aGeomMap.FindIndex( aSubShape );
+      int index = mySelectedIDs.at(i);
+      if ( aMainMap.Extent() < index )
+      {
+        ok = false;
+      }
+      else
+      {
+        TopoDS_Shape aSubShape = aMainMap.FindKey( index );
+        if ( mySubShType != aSubShape.ShapeType() )
+          ok = false;
+        if ( !aGeomMap.Contains( aSubShape ) && !aGeomMap.IsEmpty() )
+          ok = false;
+        else
+          index = aGeomMap.FindIndex( aSubShape );
+      }
       aList.append( index );
     }
   }
+  if ( isOK ) *isOK = ok;
 
   return aList;
 }
index f8ea6e9..7793817 100644 (file)
@@ -58,7 +58,7 @@ public:
   ~StdMeshersGUI_SubShapeSelectorWdg();
 
   SMESH::long_array_var          GetListOfIDs();
-  void                           SetListOfIDs( SMESH::long_array_var );
+  bool                           SetListOfIDs( SMESH::long_array_var );
 
   void                           SetGeomShapeEntry( const QString& theEntry );
   const char*                    GetGeomShapeEntry() { return myEntry.toLatin1().data();}
@@ -69,7 +69,8 @@ public:
   TopoDS_Shape                   GetGeomShape() { return myGeomShape; }
   TopoDS_Shape                   GetMainShape() { return myMainShape; }
 
-  QList<int>                     GetCorrectedListOfIDs( bool fromSubshapeToMainshape = true );
+  QList<int>                     GetCorrectedListOfIDs( bool fromSubshapeToMainshape,
+                                                        bool* isOK=0);
 
   static GEOM::GEOM_Object_var   GetGeomObjectByEntry( const QString& );
   static TopoDS_Shape            GetTopoDSByEntry( const QString& );
index 08dcd56..5e38ea8 100644 (file)
         <source>TO_IGNORE_FACES</source>
         <translation>Faces without layers (inlets and oulets)</translation>
     </message>
+    <message>
+        <source>BAD_FACES_WARNING</source>
+        <translation>
+Specified faces are not sub-shapes of the shape of 
+mesh/sub-mesh.
+Consider creating another hypothesis instead of using
+this one for this mesh/sub-mesh.</translation>
+    </message>
+    <message>
+        <source>BAD_EDGES_WARNING</source>
+        <translation>
+Specified edges are not sub-shapes of the shape of 
+mesh/sub-mesh.
+Consider creating another hypothesis instead of using
+this one for this mesh/sub-mesh.</translation>
+    </message>
 </context>
 <context>
     <name>@default</name>