#include "HYDROGUI_LandCoverDlg.h"
#include "HYDROGUI_Module.h"
+#include "HYDROGUI_OCCDisplayer.h"
#include "HYDROGUI_Shape.h"
#include "HYDROGUI_Tool.h"
#include "HYDROGUI_UpdateFlags.h"
#include <LightApp_Application.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_Desktop.h>
+
#include <TopoDS.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Wire.hxx>
QString anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_LAND_COVER_NAME" ) );
- QStringList aSelectedPolylines;
+ HYDROGUI_ListModel::Object2VisibleList aSelectedPolylines;
QString aSelectedStricklerType;
if ( myIsEdit )
for ( int i = aRefPolylines.Lower(); i <= aRefPolylines.Upper(); i++ ) {
Handle(HYDROData_PolylineXY) aPolyline = Handle(HYDROData_PolylineXY)::DownCast( aRefPolylines.Value( i ) );
if ( !aPolyline.IsNull() ) {
- aSelectedPolylines.append( aPolyline->GetName() );
+ aSelectedPolylines.append( HYDROGUI_ListModel::Object2Visible( aPolyline, true ) );
}
}
}
}
aPanel->setObjectName( anObjectName );
- aPanel->setPolylineNames( HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_POLYLINEXY ) );
// Construct a list of unique names of all Strickler types defined within the data model
QStringList aStricklerTypes;
HYDROData_Iterator anIterator( doc(), KIND_STRICKLER_TABLE );
aPanel->blockSignals( false );
- aPanel->setSelectedPolylineNames( aSelectedPolylines );
+ aPanel->includePolylines( aSelectedPolylines );
aPanel->setSelectedAdditionalParamName( aSelectedStricklerType );
}
HYDROGUI_LandCoverDlg* aPanel = new HYDROGUI_LandCoverDlg( module(), getName() );
connect( aPanel, SIGNAL( CreatePreview( const QStringList& ) ),
this, SLOT( onCreatePreview( const QStringList& ) ) );
+ connect( aPanel, SIGNAL( addPolylines() ), SLOT( onAddPolylines() ) );
+ connect( aPanel, SIGNAL( removePolylines() ), SLOT( onRemovePolylines() ) );
return aPanel;
}
HYDROData_SequenceOfObjects aZonePolylines;
QString aStricklerType;
- QStringList aSelectedPolylineNames = aPanel->getSelectedPolylineNames();
+ QStringList aSelectedPolylineNames = aPanel->getPolylineNames();
QStringList::const_iterator anIt = aSelectedPolylineNames.begin(), aLast = aSelectedPolylineNames.end();
for( ; anIt!=aLast; anIt++ )
{
}
}
+ if ( aZonePolylines.IsEmpty() )
+ {
+ theErrorMsg = tr( "POLYLINES_NOT_DEFINED" );
+ return false;
+ }
+
QString aSelectedStricklerType = aPanel->getSelectedAdditionalParamName();
- // TODO: Generate TopoDS_Shape based on the set of polylines, implement generateTopShape data model method
- /*
- if ( HYDROData_LandCover::generateTopShape( aZonePolylines ).IsNull() )
+ TCollection_AsciiString anError;
+ if ( HYDROData_LandCover::buildShape( aZonePolylines, anError ).IsNull() )
{
- theErrorMsg = tr( "ZONE_OBJECT_CANNOT_BE_CREATED" );
+ if ( !anError.IsEmpty() ) {
+ theErrorMsg = HYDROGUI_Tool::ToQString( anError );
+ } else {
+ theErrorMsg = tr( "LAND_COVER_OBJECT_CANNOT_BE_CREATED" );
+ }
return false;
}
- */
-
+
Handle(HYDROData_LandCover) aZoneObj = myIsEdit ? myEditedObject :
Handle(HYDROData_LandCover)::DownCast( doc()->CreateObject( KIND_LAND_COVER ) );
}
module()->setIsToUpdate( aZoneObj );
+ module()->getOCCDisplayer()->SetToUpdateColorScale();
theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced | UF_VTKViewer;
QApplication::setOverrideCursor( Qt::WaitCursor );
- QList<Handle(HYDROData_PolylineXY)> aZonePolylines;
+ HYDROData_SequenceOfObjects aZonePolylines;
QStringList::const_iterator anIt = thePolylineNames.begin(), aLast = thePolylineNames.end();
for( ; anIt!=aLast; anIt++ )
{
Handle(HYDROData_PolylineXY) aPolyline = Handle(HYDROData_PolylineXY)::DownCast(
HYDROGUI_Tool::FindObjectByName( module(), aPolylineName, KIND_POLYLINEXY ) );
if ( !aPolyline.IsNull() )
- aZonePolylines.append( aPolyline );
+ aZonePolylines.Append( aPolyline );
}
-
- // TODO: Generate TopoDS_Shape based on the set of polylines, implement generateTopShape data model method
- TopoDS_Shape aZoneShape;/* = HYDROData_LandCover::generateTopShape( aZonePolylines );
- if( aZoneShape.IsNull() )
- printErrorMessage( tr( "ZONE_OBJECT_CANNOT_BE_CREATED" ) );
- */
+
+ TCollection_AsciiString anError;
+ TopoDS_Shape aZoneShape = HYDROData_LandCover::buildShape( aZonePolylines, anError );
LightApp_Application* anApp = module()->getApp();
if ( !getPreviewManager() )
myPreviewPrs->setFillingColor( aFillingColor, false, false );
myPreviewPrs->setBorderColor( aBorderColor, false, false );
- TopoDS_Face aFace;
if( !aZoneShape.IsNull() )
- aFace = TopoDS::Face( aZoneShape );
- myPreviewPrs->setFace( aFace, true, true, "" );
+ myPreviewPrs->setShape( aZoneShape );
}
QApplication::restoreOverrideCursor();
}
+void HYDROGUI_LandCoverOp::onAddPolylines()
+{
+ HYDROGUI_LandCoverDlg* aPanel = ::qobject_cast<HYDROGUI_LandCoverDlg*>( inputPanel() );
+ if ( !aPanel )
+ return;
+
+ // Add polylines selected in the module browser
+ Handle(HYDROData_PolylineXY) aPolyXY;
+ HYDROGUI_ListModel::Object2VisibleList aSelectedPolylines;
+ HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetSelectedObjects( module() );
+
+ if ( aSeq.IsEmpty() || !confirmPolylinesChange() )
+ return;
+
+ for( int anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ )
+ {
+ aPolyXY = Handle(HYDROData_PolylineXY)::DownCast( aSeq.Value( anIndex ));
+ if (!aPolyXY.IsNull())
+ aSelectedPolylines.append( HYDROGUI_ListModel::Object2Visible( aPolyXY, true ) );
+ }
+
+ if ( aPanel->includePolylines( aSelectedPolylines ) )
+ {
+ closePreview();
+ onCreatePreview( aPanel->getPolylineNames() );
+ }
+}
+
+void HYDROGUI_LandCoverOp::onRemovePolylines()
+{
+ // Remove selected polylines from the calculation case
+ HYDROGUI_LandCoverDlg* aPanel = ::qobject_cast<HYDROGUI_LandCoverDlg*>( inputPanel() );
+ if ( !aPanel )
+ return;
+
+ QStringList aSelectedList = aPanel->getSelectedPolylineNames();
+ if ( aSelectedList.isEmpty() || !confirmPolylinesChange() )
+ return;
+
+ HYDROGUI_ListModel::Object2VisibleList aSelectedPolylines;
+ for (int i = 0; i < aSelectedList.length(); i++)
+ {
+ Handle(HYDROData_PolylineXY) anObject = Handle(HYDROData_PolylineXY)::DownCast(
+ HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at(i) ) );
+ if ( anObject.IsNull() )
+ continue;
+
+ aSelectedPolylines.append( HYDROGUI_ListModel::Object2Visible( anObject, true ) );
+ }
+
+ module()->update( UF_OCCViewer );
+
+ if ( aPanel->excludePolylines( aSelectedPolylines ) )
+ {
+ closePreview();
+ onCreatePreview( aPanel->getPolylineNames() );
+ }
+}
+
void HYDROGUI_LandCoverOp::closePreview()
{
if( myPreviewPrs )
myPreviewPrs = 0;
}
}
+
+bool HYDROGUI_LandCoverOp::confirmPolylinesChange() const
+{
+ if ( myEditedObject.IsNull() )
+ return true;
+
+ // Check if the land cover object is already modified or not
+ bool isConfirmed = myEditedObject->IsMustBeUpdated();
+ if ( !isConfirmed )
+ {
+ // If not modified check if the land cover has already defined polylines
+ HYDROData_SequenceOfObjects aSeq = myEditedObject->GetPolylines();
+ if ( aSeq.Length() > 0 )
+ {
+ // If there are already defined polylines then ask a user to confirm land cover recalculation
+ isConfirmed = ( SUIT_MessageBox::question( module()->getApp()->desktop(),
+ tr( "POLYLINES_CHANGED" ),
+ tr( "CONFIRM_LAND_COVER_RECALCULATION" ),
+ QMessageBox::Yes | QMessageBox::No,
+ QMessageBox::No ) == QMessageBox::Yes );
+ }
+ else
+ {
+ isConfirmed = true; // No polylines - nothing to recalculate
+ }
+ }
+ return isConfirmed;
+}