-// Copyright (C) 2007-2013 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
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
#include "HYDROGUI_StreamOp.h"
#include "HYDROGUI_Module.h"
+#include <HYDROGUI_DataObject.h>
#include "HYDROGUI_Shape.h"
#include "HYDROGUI_StreamDlg.h"
#include "HYDROGUI_Tool.h"
+#include "HYDROGUI_Tool2.h"
#include "HYDROGUI_UpdateFlags.h"
#include <HYDROData_Document.h>
#include <HYDROData_PolylineXY.h>
#include <HYDROData_Profile.h>
+#include <HYDROData_DTM.h>
#include <LightApp_Application.h>
#include <LightApp_SelectionMgr.h>
#include <SUIT_MessageBox.h>
#include <SUIT_Desktop.h>
+#include <QColor>
+#include <QApplication>
+
#include <OCCViewer_ViewManager.h>
#include <OCCViewer_ViewModel.h>
{
HYDROGUI_Operation::startOperation();
- myEditedObject.Nullify();
+ if ( !myIsEdit || isApplyAndClose() )
+ myEditedObject.Nullify();
myHydAxis.clear();
myProfiles.clear();
myProfileParams.clear();
QString anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_STREAM_NAME" ) );
if ( myIsEdit )
{
- myEditedObject =
- Handle(HYDROData_Stream)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
+ if ( isApplyAndClose() )
+ myEditedObject =
+ Handle(HYDROData_Stream)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
if ( !myEditedObject.IsNull() )
{
anObjectName = myEditedObject->GetName();
// Hydraulic axis
Handle(HYDROData_PolylineXY) aHydraulicAxis = myEditedObject->GetHydraulicAxis();
+
+ TopoDS_Face aPlane;
+ HYDROData_Stream::BuildRefFace( aPlane ) ;
if ( !aHydraulicAxis.IsNull() )
- {
myHydAxis = aHydraulicAxis->GetName();
- TopoDS_Face aPlane;
- if ( HYDROData_Stream::BuildFace( aHydraulicAxis, aPlane ) )
+ // Stream profiles
+ HYDROData_SequenceOfObjects aStreamProfiles = myEditedObject->GetProfiles();
+ for ( int i = 1, n = aStreamProfiles.Length(); i <= n; ++i )
+ {
+ Handle(HYDROData_Profile) aProfile =
+ Handle(HYDROData_Profile)::DownCast( aStreamProfiles.Value( i ) );
+ if ( aProfile.IsNull() )
+ continue;
+
+ QString aProfileName = aProfile->GetName();
+ myProfiles << aProfileName;
+
+ if (!aHydraulicAxis.IsNull())
{
- // Stream profiles
- HYDROData_SequenceOfObjects aStreamProfiles = myEditedObject->GetProfiles();
- for ( int i = 1, n = aStreamProfiles.Length(); i <= n; ++i )
- {
- Handle(HYDROData_Profile) aProfile =
- Handle(HYDROData_Profile)::DownCast( aStreamProfiles.Value( i ) );
- if ( aProfile.IsNull() )
- continue;
-
- QString aProfileName = aProfile->GetName();
-
- Standard_Real aProfilePar = 0.0;
- HYDROData_Stream::HasIntersection( aHydraulicAxis, aProfile, aPlane, aProfilePar );
-
- myProfiles << aProfileName;
- myProfileParams << aProfilePar;
- }
+ Standard_Real aProfilePar = 0.0;
+ HYDROData_Stream::HasIntersection( aHydraulicAxis, aProfile, aPlane, aProfilePar );
+ myProfileParams << aProfilePar;
}
- }
+
+ }
+
}
}
// set the existing 2D polylines names to the panel
aPanel->setAxisNames( HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_POLYLINEXY ) );
+ if (myIsEdit)
+ {
+ aPanel->setDDZ( myEditedObject->GetDDZ() );
+ aPanel->setSpatialStep( myEditedObject->GetSpatialStep() );
+ }
+
// synchronize the panel state with the edited object state
updatePanelData();
connect( aPanel, SIGNAL( AxisChanged( const QString& ) ),
this, SLOT( onAxisChanged( const QString& ) ) );
+ connect( aPanel, SIGNAL( DDZValueChanged( double ) ), this, SLOT( onDDZValueChanged( double ) ) );
+ connect( aPanel, SIGNAL( SSValueChanged( double ) ), this, SLOT( onSSValueChanged( double ) ) );
return aPanel;
}
+void HYDROGUI_StreamOp::apply()
+{
+ QApplication::setOverrideCursor( Qt::WaitCursor );
+
+ startDocOperation();
+
+ int anUpdateFlags = 0;
+ QString anErrorMsg;
+
+ bool aResult = false;
+ QStringList aBrowseObjectsEntries;
+
+ try
+ {
+ aResult = processApply( anUpdateFlags, anErrorMsg, aBrowseObjectsEntries );
+ }
+ catch ( Standard_Failure )
+ {
+ Handle(Standard_Failure) aFailure = Standard_Failure::Caught();
+ anErrorMsg = aFailure->GetMessageString();
+ aResult = false;
+ }
+ catch ( ... )
+ {
+ aResult = false;
+ }
+
+ QApplication::restoreOverrideCursor();
+
+ if ( aResult )
+ {
+ module()->update( anUpdateFlags );
+ commitDocOperation();
+ commit();
+ browseObjects( aBrowseObjectsEntries );
+ }
+ else
+ {
+ myEditedObject->Remove();
+ module()->setObjectRemoved( myEditedObject );
+
+ if ( isToAbortOnApply() )
+ abortDocOperation();
+
+ abort();
+ SUIT_MessageBox::critical( module()->getApp()->desktop(),
+ tr( "CREATE_STREAM_ERROR" ),
+ anErrorMsg );
+
+ }
+}
+
bool HYDROGUI_StreamOp::processApply( int& theUpdateFlags,
- QString& theErrorMsg )
+ QString& theErrorMsg,
+ QStringList& theBrowseObjectsEntries )
{
HYDROGUI_StreamDlg* aPanel = ::qobject_cast<HYDROGUI_StreamDlg*>( inputPanel() );
if ( !aPanel )
if ( myEditedObject.IsNull() ) // Create new data model object
myEditedObject = Handle(HYDROData_Stream)::DownCast( doc()->CreateObject( KIND_STREAM ) );
- // Check if the axis is set
Handle(HYDROData_PolylineXY) aHydAxis = Handle(HYDROData_PolylineXY)::DownCast(
HYDROGUI_Tool::FindObjectByName( module(), myHydAxis, KIND_POLYLINEXY ) );
- if ( aHydAxis.IsNull() )
- {
- theErrorMsg = tr( "AXIS_NOT_DEFINED" );
- return false;
- }
+ //if ( aHydAxis.IsNull() )
+ //{
+ // theErrorMsg = tr( "AXIS_NOT_DEFINED" );
+ // return false;
+ //}
// Check if at least 2 profiles is set
HYDROData_SequenceOfObjects aRefProfiles;
return false;
}
- // Set the object name
+ bool ToOrder = true;
+
+ if (aHydAxis.IsNull())
+ ToOrder = false;
+
+ myEditedObject->SetProfiles (aRefProfiles, ToOrder) ;
myEditedObject->SetName( anObjectName );
- myEditedObject->SetHydraulicAxis( aHydAxis );
+ if (!aHydAxis.IsNull())
+ myEditedObject->SetHydraulicAxis( aHydAxis );
myEditedObject->SetProfiles( aRefProfiles, false );
+ myEditedObject->SetDDZ( aPanel->getDDZ() );
+ myEditedObject->SetSpatialStep( aPanel->getSpatialStep() );
- if ( myEditedObject->IsMustBeUpdated() )
+ if ( myEditedObject->IsMustBeUpdated( HYDROData_Entity::Geom_2d ) )
myEditedObject->Update();
if ( !myIsEdit )
{
- myEditedObject->SetFillingColor( HYDROData_Stream::DefaultFillingColor() );
- myEditedObject->SetBorderColor( HYDROData_Stream::DefaultBorderColor() );
+ myEditedObject->SetFillingColor( myEditedObject->DefaultFillingColor() );
+ myEditedObject->SetBorderColor( myEditedObject->DefaultBorderColor() );
}
// Erase preview
// Show the object in case of creation mode of the operation
if( !myIsEdit ) {
module()->setObjectVisible( HYDROGUI_Tool::GetActiveOCCViewId( module() ), myEditedObject, true );
+ QString anEntry = HYDROGUI_DataObject::dataObjectEntry( myEditedObject );
+ theBrowseObjectsEntries.append( anEntry );
}
module()->setIsToUpdate( myEditedObject );
{
myPreviewPrs = new HYDROGUI_Shape( aCtx, NULL, getPreviewZLayer() );
- QColor aFillingColor = HYDROData_Stream::DefaultFillingColor();
- QColor aBorderColor = HYDROData_Stream::DefaultBorderColor();
+ QColor aFillingColor = Qt::green;
+ QColor aBorderColor = Qt::transparent;
if ( !myEditedObject.IsNull() )
{
aFillingColor = myEditedObject->GetFillingColor();
HYDROGUI_Tool::FindObjectByName( module(), myHydAxis, KIND_POLYLINEXY ) );
HYDROData_SequenceOfObjects aRefProfiles;
- for ( int i = 0; i < myProfiles.length(); ++i )
+ //std::vector<Handle(HYDROData_Profile)> aRefProfiles;
+ int plen = myProfiles.length();
+ for ( int i = 0; i < plen; ++i )
{
QString aProfileName = myProfiles.value( i );
}
HYDROData_Stream::PrsDefinition aPrsDef;
- if ( !HYDROData_Stream::CreatePresentations( aHydAxis, aRefProfiles, aPrsDef ) )
- {
- erasePreview();
- return;
- }
+
+ TopoDS_Shape Out3dPres;
+ TopoDS_Shape Out2dPres;
+ TopoDS_Shape OutLeftB;
+ TopoDS_Shape OutRightB;
+ TopoDS_Shape OutInlet;
+ TopoDS_Shape OutOutlet;
+
+ HYDROGUI_StreamDlg* aPanel = ::qobject_cast<HYDROGUI_StreamDlg*>( inputPanel() );
+ double ddz = aPanel->getDDZ();
+ double ss = aPanel->getSpatialStep();
+
+ std::set<int> InvInd;
+
+#ifdef _DEBUG
+ const int MAX_POINTS_IN_PREVIEW = 50000;
+#else
+ const int MAX_POINTS_IN_PREVIEW = 500000;
+#endif
+
+ HYDROData_Bathymetry::AltitudePoints points;
+
+ bool ProjStat = true;
+ HYDROData_DTM::CreateProfilesFromDTM( aRefProfiles, ddz, ss, points, Out3dPres, Out2dPres, OutLeftB, OutRightB,
+ OutInlet, OutOutlet, true, true, InvInd, MAX_POINTS_IN_PREVIEW, ProjStat );
+
+ aPanel->clearAllBackgroundColorsForProfileList();
+ for (std::set<int>::const_iterator it = InvInd.begin(); it != InvInd.end(); it++)
+ aPanel->setBackgroundColorForProfileList(*it, QColor(Qt::yellow));
+
+ aPrsDef.myInlet = OutInlet;
+ aPrsDef.myOutlet = OutOutlet;
+ aPrsDef.myLeftBank = OutLeftB;
+ aPrsDef.myRightBank = OutRightB;
+ if (ProjStat)
+ aPrsDef.myPrs2D = Out2dPres;
+ aPrsDef.myPrs3D = Out3dPres;
+
+ if (!ProjStat)
+ aPanel->addWarning(tr("STREAM_PROJECTION_FAILED"));
myPreviewPrs->setShape( aPrsDef.myPrs2D );
}
{
Handle(HYDROData_PolylineXY) aHydAxis = Handle(HYDROData_PolylineXY)::DownCast(
HYDROGUI_Tool::FindObjectByName( module(), myHydAxis, KIND_POLYLINEXY ) );
- if ( aHydAxis.IsNull() )
- return;
+ //if ( aHydAxis.IsNull() )
+ // return;
TopoDS_Face aPlane;
- if ( !HYDROData_Stream::BuildFace( aHydAxis, aPlane ) )
- return;
+ HYDROData_Stream::BuildRefFace( aPlane );
// Get the current profiles list
QStringList aCurrentProfiles = myProfiles;
else
{
// Insert profile in correct place
+ // if hidr axis is null => the params (myProfileParams) will be igrored. So ordering will be the same as in the aSelectedProfiles
insertProfileInToOrder( aProfileName, aProfilePar, myProfiles, myProfileParams );
aVerifiedProfiles << aProfileName;
}
void HYDROGUI_StreamOp::onRemoveProfiles( const QStringList& theProfilesToRemove )
{
QStringList aToRemove = theProfilesToRemove;
-
- // Take the Object Browser selection into account
- HYDROData_SequenceOfObjects aSelectedObjects = HYDROGUI_Tool::GetSelectedObjects( module() );
- for( int i = 1, n = aSelectedObjects.Length(); i <= n; i++ )
- {
- Handle(HYDROData_Profile) aProfile =
- Handle(HYDROData_Profile)::DownCast( aSelectedObjects.Value( i ) );
- if ( aProfile.IsNull() )
- continue;
-
- QString aProfileName = aProfile->GetName();
- aToRemove.append( aProfileName );
- }
-
+
aToRemove.removeDuplicates();
if ( aToRemove.isEmpty() )
return;
}
}
+void HYDROGUI_StreamOp::onDDZValueChanged( double d )
+{
+ createPreview();
+}
+
+void HYDROGUI_StreamOp::onSSValueChanged( double d )
+{
+ createPreview();
+}
+
void HYDROGUI_StreamOp::onAxisChanged( const QString& theNewAxis )
{
// Get axis object
// Prepare data for intersection check
TopoDS_Face aPlane;
- if ( !HYDROData_Stream::BuildFace( aNewAxis, aPlane ) )
- {
- SUIT_MessageBox::critical( module()->getApp()->desktop(),
- tr( "BAD_SELECTED_POLYLINE_TLT" ),
- tr( "BAD_SELECTED_POLYLINE_MSG" ).arg( theNewAxis ) );
- // To restore the old axis
- updatePanelData();
- return;
- }
+ HYDROData_Stream::BuildRefFace( aPlane );
+ //{
+ // SUIT_MessageBox::critical( module()->getApp()->desktop(),
+ // tr( "BAD_SELECTED_POLYLINE_TLT" ),
+ // tr( "BAD_SELECTED_POLYLINE_MSG" ).arg( theNewAxis ) );
+ // // To restore the old axis
+ // updatePanelData();
+ // return;
+ //}
QStringList aNewProfiles;
QList<double> aNewProfileParams;