#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 ) );
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 ) );
+ }
+
+ aPanel->includePolylines( aSelectedPolylines );
+ // TODO: create preview of included polylines
+}
+
+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 );
+ aPanel->excludePolylines( aSelectedPolylines );
+}
+
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;
+}