Salome HOME
Merge remote-tracking branch 'origin/BR_SHAPE_RECOGNITION' into BR_v14_rc
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ProfileInterpolateOp.cxx
index 7caefc3b9a22c621b75f3b40431c67b9bb0df118..3bfb229203d426a8ee7b993b66ac36ad8f7fd463 100644 (file)
@@ -1,8 +1,4 @@
-// Copyright (C) 2007-2015  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
-//
+// Copyright (C) 2014-2015  EDF-R&D
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
@@ -42,8 +38,9 @@
 #include <LightApp_UpdateFlags.h>
 
 #include <OCCViewer_ViewModel.h>
-#include <OCCViewer_ViewManager.h>
+#include <OCCViewer_ViewPort3d.h>
 #include <OCCViewer_ViewWindow.h>
+#include <OCCViewer_ViewManager.h>
 #include <OCCViewer_AISSelector.h>
 
 #include <AIS_ListOfInteractive.hxx>
@@ -68,11 +65,14 @@ void HYDROGUI_ProfileInterpolateOp::startOperation()
 {
     HYDROGUI_Operation::startOperation();
 
-    HYDROGUI_ProfileInterpolateDlg* aPanel = ::qobject_cast<HYDROGUI_ProfileInterpolateDlg*>( inputPanel() );
-    if ( aPanel )
+    if ( isApplyAndClose() )
     {
+      HYDROGUI_ProfileInterpolateDlg* aPanel = ::qobject_cast<HYDROGUI_ProfileInterpolateDlg*>( inputPanel() );
+      if ( aPanel )
+      {
         aPanel->reset();
         aPanel->setInterpolators( interpolators() );
+      }
     }
 }
 
@@ -141,12 +141,12 @@ bool HYDROGUI_ProfileInterpolateOp::processApply( int& theUpdateFlags, QString&
                 commitDocOperation();
             else
             {
-                errMessage = tr( "CALCULATE_ERROR" ), QString( anIterp->GetErrorMessage().c_str() );
+                errMessage = tr( "CALCULATE_ERROR" ), QString( HYDROGUI_Tool::ToQString( anIterp->GetErrorMessage() ) );
                 abortDocOperation();
             }
         }
         else
-            errMessage = tr( "CANT_GET_RIVER_OBJECT" ).arg( aDlg->river() );
+            errMessage = tr( "CANT_GET_STREAM_OBJECT" ).arg( aDlg->river() );
 
         if ( !errMessage.isEmpty() )
             QMessageBox::critical( aDlg->topLevelWidget(), tr( "INTERPOLATION_ERROR" ), errMessage, QMessageBox::Ok );
@@ -154,7 +154,12 @@ bool HYDROGUI_ProfileInterpolateOp::processApply( int& theUpdateFlags, QString&
             commit();
     }
 
-    return errMessage.isEmpty();
+    bool res = errMessage.isEmpty();
+
+    if ( res )
+        theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced | UF_VTKViewer;
+
+    return res;
 }
 
 void HYDROGUI_ProfileInterpolateOp::updatePreview()
@@ -184,7 +189,7 @@ void HYDROGUI_ProfileInterpolateOp::updatePreview()
             {
                 myPreview = new AIS_Shape( aShape );
                 myPreview->SetColor( Quantity_NOC_RED );
-                aCtx->Display( myPreview, 0, -1, false );
+                aCtx->Display( myPreview, 1, -1, false );
             }
         }
     }
@@ -202,24 +207,19 @@ void HYDROGUI_ProfileInterpolateOp::updateInterpolator( HYDROData_IProfilesInter
     theInt->SetResultProfilesNumber( aDlg->profileNumber() );
     theInt->SetProfiles( profile( aDlg->profileStart() ), profile( aDlg->profileFinish() ) );
     ParamsList aParams = parameters( aDlg->interpolatorParameters() );
-    for ( ParamsList::Iterator it = aParams.begin(); it != aParams.end(); ++it )
-        theInt->SetParameter( (*it).first.toStdString(), (*it).second.toStdString() );
+    for ( ParamsList::Iterator it = aParams.begin(); it != aParams.end(); ++it ) {
+        theInt->SetParameter( HYDROGUI_Tool::ToAsciiString( (*it).first ), 
+                              HYDROGUI_Tool::ToAsciiString( (*it).second ) );
+    }
 }
 
-std::vector<double> HYDROGUI_ProfileInterpolateOp::profile( const QString& theName ) const
+HYDROData_Profile::ProfilePoints HYDROGUI_ProfileInterpolateOp::profile( const QString& theName ) const
 {
-    std::vector<double> aPoints;
+    HYDROData_Profile::ProfilePoints aPoints;
     Handle(HYDROData_Profile) aProf = Handle(HYDROData_Profile)::DownCast( HYDROGUI_Tool::FindObjectByName( module(), theName, KIND_PROFILE ) );
     if ( !aProf.IsNull() )
     {
-        HYDROData_Profile::ProfilePoints aPntList = aProf->GetProfilePoints();
-        for ( int i = aPntList.Lower(); i <= aPntList.Upper(); i++ )
-        {
-            HYDROData_Profile::ProfilePoint aPnt = aPntList.Value( i );
-            aPoints.push_back( aPnt.X() );
-            aPoints.push_back( aPnt.Y() );
-            aPoints.push_back( aPnt.Z() );
-        }
+        aPoints = aProf->GetProfilePoints();
     }
     return aPoints;
 }
@@ -264,9 +264,11 @@ QStringList HYDROGUI_ProfileInterpolateOp::interpolators() const
     QStringList aNames;
     if ( anIFactory )
     {
-        std::vector<std::string> iNames = anIFactory->GetInterpolatorNames();
-        for ( std::vector<std::string>::iterator it = iNames.begin(); it != iNames.end(); ++it )
-            aNames.append( (*it).c_str() );
+      NCollection_Sequence<TCollection_AsciiString> iNames = anIFactory->GetInterpolatorNames();
+      for ( int i = 1, n = iNames.Size(); i <= n; ++i ) {
+        const TCollection_AsciiString& anInterpName = iNames.Value( i );
+        aNames.append( HYDROGUI_Tool::ToQString( anInterpName ) );
+      }
     }
 
     return aNames;
@@ -281,7 +283,7 @@ HYDROData_IProfilesInterpolator* HYDROGUI_ProfileInterpolateOp::interpolator( co
 
     HYDROData_IProfilesInterpolator* aRes = 0;
     if ( anIFactory )
-        aRes = anIFactory->GetInterpolator( theName.toStdString() );
+        aRes = anIFactory->GetInterpolator( HYDROGUI_Tool::ToAsciiString( theName ) );
     return aRes;
 }
 
@@ -294,10 +296,8 @@ TopoDS_Shape HYDROGUI_ProfileInterpolateOp::previewShape( HYDROData_IProfilesInt
         aBuilder.MakeCompound( aPreviewShape );
         for ( int i = 0; i < theInterp->GetCalculatedProfilesNumber(); i++ )
         {
-            NCollection_Sequence<gp_XYZ> pointSeq;
-            std::vector<double> aPoints = theInterp->GetResultProfile( i );
-            for ( int i = 0; i < (int) aPoints.size(); i += 3 )
-                pointSeq.Append( gp_XYZ( aPoints[i], aPoints[i+1], aPoints[i+2] ) );
+            NCollection_Sequence<gp_XYZ> pointSeq = theInterp->GetResultProfilePoints( i );
+
             TopoDS_Shape aWire = HYDROData_PolylineXY::BuildWire( HYDROData_IPolyline::SECTION_SPLINE, false, pointSeq );
             if ( !aWire.IsNull() )
                 aBuilder.Add( aPreviewShape, aWire );
@@ -314,7 +314,7 @@ void HYDROGUI_ProfileInterpolateOp::onInterpolatorChanged( const QString& theInt
     if ( !aPanel || !anInterp )
         return;
 
-    aPanel->setInterpolatorDescription( QString( anInterp->GetDescription().c_str() ) );
+    aPanel->setInterpolatorDescription( HYDROGUI_Tool::ToQString( anInterp->GetDescription() ) );
 
     updatePreview();
 }
@@ -349,7 +349,22 @@ void HYDROGUI_ProfileInterpolateOp::onRiverChanged( const QString& theRiver )
                     Handle(AIS_Shape) aPrs = new AIS_Shape( aProfile->GetShape3D() );
                     aPrs->SetOwner( aProfile );
                     aPrs->SetColor( Quantity_NOC_BLACK );
-                    aCtx->Display( aPrs, 0, 0, false );
+                    aCtx->Display( aPrs, 1, 0, false );
+                }
+            }
+            OCCViewer_ViewManager* vm = aDlg->viewManager();
+            if ( vm )
+            {
+                QVector<SUIT_ViewWindow*> winList = vm->getViews();
+                for ( QVector<SUIT_ViewWindow*>::iterator it = winList.begin(); it != winList.end(); ++it )
+                {
+                    OCCViewer_ViewWindow* occWin = ::qobject_cast<OCCViewer_ViewWindow*>( *it );
+                    if ( occWin )
+                    {
+                        OCCViewer_ViewPort3d* vp = occWin->getViewPort();
+                        if ( vp )
+                            vp->fitAll();
+                    }
                 }
             }
         }