1 // Copyright (C) 2014-2015 EDF-R&D
2 // This library is free software; you can redistribute it and/or
3 // modify it under the terms of the GNU Lesser General Public
4 // License as published by the Free Software Foundation; either
5 // version 2.1 of the License, or (at your option) any later version.
7 // This library is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 // Lesser General Public License for more details.
12 // You should have received a copy of the GNU Lesser General Public
13 // License along with this library; if not, write to the Free Software
14 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #include "HYDROGUI_CalculationOp.h"
21 #include "HYDROGUI_DataModel.h"
22 #include "HYDROGUI_CalculationDlg.h"
23 #include "HYDROGUI_Module.h"
24 #include "HYDROGUI_Tool2.h"
25 #include "HYDROGUI_UpdateFlags.h"
26 #include "HYDROGUI_Zone.h"
27 #include "HYDROGUI_Region.h"
29 #include <HYDROData_PolylineXY.h>
30 #include <HYDROData_ShapesGroup.h>
31 #include <HYDROData_Iterator.h>
32 #include <HYDROData_ImmersibleZone.h>
33 #include <HYDROData_Object.h>
34 #include <HYDROData_Tool.h>
35 #include <HYDROData_StricklerTable.h>
36 #include <HYDROData_BCPolygon.h>
38 #include <OCCViewer_ViewManager.h>
39 #include <OCCViewer_ViewModel.h>
40 #include <OCCViewer_ViewWindow.h>
42 #include <LightApp_Application.h>
43 #include <LightApp_UpdateFlags.h>
44 #include <LightApp_SelectionMgr.h>
45 #include <LightApp_DataOwner.h>
47 #include <SUIT_MessageBox.h>
48 #include <SUIT_Desktop.h>
49 #include <SUIT_DataBrowser.h>
51 #include <QApplication>
52 #include <QKeySequence>
54 #include <QPushButton>
55 #include <BRep_Builder.hxx>
57 #include <TopTools_IndexedMapOfShape.hxx>
61 #include <HYDROData_CompleteCalcCase.h>
64 HYDROGUI_CalculationOp::HYDROGUI_CalculationOp( HYDROGUI_Module* theModule, bool theIsEdit, bool IsComplete )
65 : HYDROGUI_Operation( theModule ),
66 myIsEdit( theIsEdit ),
67 myActiveViewManager( NULL ),
68 myPreviewViewManager( NULL ),
69 myShowGeomObjects( true ),
70 myShowLandCoverMap( false ),
72 myIsComplete (IsComplete)
76 aDlgName = tr( "COMPLETE_CALCULATION" );
78 aDlgName = myIsEdit ? tr( "EDIT_CALCULATION" ) : tr( "CREATE_CALCULATION" );
82 HYDROGUI_CalculationOp::~HYDROGUI_CalculationOp()
87 void HYDROGUI_CalculationOp::startOperation()
89 HYDROGUI_Operation::startOperation();
94 HYDROGUI_CalculationDlg* aPanel =
95 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
99 SUIT_DataBrowser* aOb = ((LightApp_Application*)module()->application())->objectBrowser();
100 QList<QShortcut*> aShortcuts = aOb->findChildren<QShortcut*>();
101 QShortcut* aShortcut;
102 foreach( aShortcut, aShortcuts )
104 if ( aShortcut->key() ==
105 QKeySequence(((LightApp_Application*)module()->application())->objectBrowser()->shortcutKey(
106 SUIT_DataBrowser::RenameShortcut ) ) )
108 aShortcut->setEnabled( false );
114 QStringList anEntryList;
115 HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetGeometryObjects( module() );
116 getNamesAndEntries( aSeq, aList, anEntryList );
121 //add intersection polylines
122 AddInterPolylinesToList(aList, anEntryList);
124 aPanel->setAllGeomObjects( aList, anEntryList );
129 HYDROData_Iterator anIter( doc(), KIND_POLYLINEXY );
130 Handle(HYDROData_PolylineXY) aPolylineObj;
131 QString aPolylineName;
132 for ( ; anIter.More(); anIter.Next() )
134 aPolylineObj = Handle(HYDROData_PolylineXY)::DownCast( anIter.Current() );
136 if ( !aPolylineObj.IsNull() && aPolylineObj->IsClosed(false) )
138 // // Check the polyline shape
139 // TopoDS_Shape aPolylineShape = aPolylineObj->GetShape();
140 // if ( !aPolylineShape.IsNull() && aPolylineShape.ShapeType() == TopAbs_WIRE ) {
141 aPolylineName = aPolylineObj->GetName();
142 if ( !aPolylineName.isEmpty() )
144 aList.append( aPolylineName );
145 anEntryList.append( HYDROGUI_DataObject::dataObjectEntry( aPolylineObj ) );
150 aPanel->setPolylineNames( aList, anEntryList );
152 QString anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_CALCULATION_CASE_NAME" ) );
154 myEditedObject.Nullify();
158 myEditedObject = Handle(HYDROData_CalculationCase)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
159 if ( !myEditedObject.IsNull() )
161 aPanel->setMode( myEditedObject->GetAssignmentMode() );
162 anObjectName = myEditedObject->GetName();
163 aPolylineObj = myEditedObject->GetBoundaryPolyline();
164 if ( aPolylineObj.IsNull() )
166 aPanel->setBoundary( QString() );
170 aPolylineName = aPolylineObj->GetName();
171 aPanel->setBoundary( aPolylineName );
174 aSeq = myEditedObject->GetGeometryObjects();
175 HYDROData_SequenceOfObjects anInterPolyList = myEditedObject->GetInterPolyObjects();
176 aSeq.Append(anInterPolyList);
178 getNamesAndEntries( aSeq, aList, anEntryList );
180 aPanel->includeGeomObjects( aList );
183 //aPanel->includeGeomObjects( aList );
184 aPanel->setAlreadyAddedGeomObjects( aList );
185 //myIncObjAtStart = aSeq;
186 aPanel->hideAvailableGeomObjects( aList );
187 aPanel->setGeomOrderingEnabled(true);
191 setRules( HYDROData_CalculationCase::DataTag_CustomRules );
197 Handle(HYDROData_CalculationCase)::DownCast( doc()->CreateObject( KIND_CALCULATION ) );
198 myEditedObject->SetName( anObjectName );
199 myEditedObject->SetAssignmentMode( (HYDROData_CalculationCase::AssignmentMode)aPanel->getMode() );
202 aPanel->setObjectName( anObjectName );
203 aPanel->setEditedObject( myEditedObject );
205 setGeomObjectsVisible( true );
207 createPreview( false );
210 void HYDROGUI_CalculationOp::AddInterPolylinesToList(QStringList& theList, QStringList& theEntryList)
212 HYDROData_Iterator anIter( doc(), KIND_POLYLINEXY );
213 Handle(HYDROData_PolylineXY) aPolylineObj;
214 QString aPolylineName;
215 for ( ; anIter.More(); anIter.Next() )
217 aPolylineObj = Handle(HYDROData_PolylineXY)::DownCast( anIter.Current() );
218 if ( !aPolylineObj.IsNull())
220 aPolylineName = aPolylineObj->GetName();
221 if ( !aPolylineName.isEmpty() && !theList.contains(aPolylineName) )
223 theList.append( aPolylineName );
224 theEntryList.append(HYDROGUI_DataObject::dataObjectEntry( aPolylineObj ));
230 void HYDROGUI_CalculationOp::getNamesAndEntries( const HYDROData_SequenceOfObjects& theSeq,
231 QStringList& theNames, QStringList& theEntries ) const
236 HYDROData_SequenceOfObjects::Iterator anIter( theSeq );
237 for ( ; anIter.More(); anIter.Next() )
239 Handle(HYDROData_Entity) anEntity = anIter.Value();
240 //if ( !HYDROData_Tool::IsGeometryObject( anEntity ) )
243 theNames.append( anEntity->GetName() );
244 theEntries.append( HYDROGUI_DataObject::dataObjectEntry( anEntity ) );
248 void HYDROGUI_CalculationOp::abortOperation()
253 HYDROGUI_Operation::abortOperation();
254 module()->getApp()->updateObjectBrowser();
257 void HYDROGUI_CalculationOp::commitOperation()
260 // Commit transaction
261 commitDocOperation();
262 HYDROGUI_Operation::commitOperation();
265 HYDROGUI_InputPanel* HYDROGUI_CalculationOp::createInputPanel() const
267 HYDROGUI_CalculationDlg* aPanel = new HYDROGUI_CalculationDlg( module(), getName(), myIsComplete );
269 // Connect signals and slots
270 connect( aPanel, SIGNAL( changeMode( int ) ), SLOT( onChangeMode( int ) ) );
271 connect( aPanel, SIGNAL( addObjects() ), SLOT( onAddObjects() ) );
272 connect( aPanel, SIGNAL( removeObjects() ), SLOT( onRemoveObjects() ) );
273 connect( aPanel, SIGNAL( addGroups() ), SLOT( onAddGroups() ) );
274 connect( aPanel, SIGNAL( removeGroups() ), SLOT( onRemoveGroups() ) );
276 connect( aPanel, SIGNAL( addBoundaryPolygons() ), SLOT( onAddBoundaryPolygons() ) );
277 connect( aPanel, SIGNAL( removeBoundaryPolygons() ), SLOT( onRemoveBoundaryPolygons() ) );
279 connect( aPanel, SIGNAL( orderChanged( bool& ) ), SLOT( onOrderChanged( bool& ) ) );
281 connect( aPanel, SIGNAL( ruleChanged( bool& ) ), SLOT( onRuleChanged( bool& ) ) );
283 connect( aPanel, SIGNAL( Next( const int ) ), SLOT( onNext( const int ) ) );
284 connect( aPanel, SIGNAL( Back( const int ) ), SLOT( onHideZones( const int ) ) );
285 //connect( aPanel, SIGNAL( clicked( SUIT_DataObject* ) ), SLOT( onSelected( SUIT_DataObject* ) ) );
286 connect( aPanel, SIGNAL( setMergeType( int, QString& ) ), SLOT( onSetMergeType( int, QString& ) ) );
287 connect( aPanel, SIGNAL( moveZones( SUIT_DataObject*, const QList<SUIT_DataObject*>& ) ),
288 SLOT( onMoveZones( SUIT_DataObject*, const QList<SUIT_DataObject*>& ) ) );
289 connect( aPanel, SIGNAL( createRegion( const QList<SUIT_DataObject*>& ) ),
290 SLOT( onCreateRegion( const QList<SUIT_DataObject*>& ) ) );
291 connect( aPanel, SIGNAL( clickedInZonesBrowser( SUIT_DataObject* ) ),
292 SLOT( onClickedInZonesBrowser( SUIT_DataObject* ) ) );
293 connect( aPanel, SIGNAL( objectsSelected() ),
294 SLOT( onObjectsSelected() ) );
295 connect( aPanel, SIGNAL( landCoverMapSelected( const QString & ) ),
296 SLOT( onLandCoverMapSelected( const QString & ) ) );
297 connect( aPanel, SIGNAL( boundarySelected( const QString & ) ),
298 SLOT( onBoundarySelected( const QString & ) ) );
299 connect( aPanel, SIGNAL( StricklerTableSelected( const QString & ) ),
300 SLOT( onStricklerTableSelected( const QString & ) ) );
302 connect( aPanel, SIGNAL( regenerateColors() ), this,
303 SLOT( onRegenerateColors() ) );
308 void HYDROGUI_CalculationOp::onBoundarySelected ( const QString & theObjName )
310 bool anIsToUpdateViewer = false;
312 // Remove the old boundary from the operation viewer
313 Handle(HYDROData_PolylineXY) aPrevPolyline =
314 myEditedObject->GetBoundaryPolyline();
315 if ( !aPrevPolyline.IsNull() )
317 setObjectVisibility( aPrevPolyline, false );
318 anIsToUpdateViewer = true;
321 // Set the selected boundary polyline to the calculation case
322 Handle(HYDROData_PolylineXY) aNewPolyline = Handle(HYDROData_PolylineXY)::DownCast(
323 HYDROGUI_Tool::FindObjectByName( module(), theObjName, KIND_POLYLINEXY ) );
324 myEditedObject->SetBoundaryPolyline( aNewPolyline );
326 if ( myPreviewViewManager )
328 OCCViewer_Viewer* aViewer = myPreviewViewManager->getOCCViewer();
331 if ( !aNewPolyline.IsNull() )
333 Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
334 if ( !aCtx.IsNull() )
336 setObjectVisibility( aNewPolyline, true );
337 anIsToUpdateViewer = true;
341 if ( anIsToUpdateViewer )
342 module()->update( UF_OCCViewer );
347 void HYDROGUI_CalculationOp::onStricklerTableSelected ( const QString & theObjName )
349 bool anIsToUpdateViewer = false;
351 // Remove old presentation of land cover map from the operation viewer
352 Handle(HYDROData_LandCoverMap) aLandCoverMap = myEditedObject->GetLandCoverMap();
353 if ( !aLandCoverMap.IsNull() )
355 setObjectVisibility( aLandCoverMap, false );
356 anIsToUpdateViewer = true;
359 // Set the selected Strickler table to the calculation case
360 Handle(HYDROData_StricklerTable) aNewStricklerTable = Handle(HYDROData_StricklerTable)::DownCast(
361 HYDROGUI_Tool::FindObjectByName( module(), theObjName, KIND_STRICKLER_TABLE ) );
362 myEditedObject->SetStricklerTable( aNewStricklerTable );
364 if ( myPreviewViewManager )
366 OCCViewer_Viewer* aViewer = myPreviewViewManager->getOCCViewer();
369 if ( !aNewStricklerTable.IsNull() )
371 Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
372 if ( !aCtx.IsNull() )
374 if ( !aLandCoverMap.IsNull() )
376 setObjectVisibility( aLandCoverMap, true );
377 anIsToUpdateViewer = true;
382 if ( anIsToUpdateViewer )
383 module()->update( UF_OCCViewer );
388 void HYDROGUI_CalculationOp::onObjectsSelected()
390 HYDROGUI_CalculationDlg* aPanel =
391 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
393 QStringList aSelectedObjs = aPanel->getSelectedGeomObjects();
394 QMap<QString, bool> aSelectedObjsMap;
395 foreach( QString aName, aSelectedObjs )
396 aSelectedObjsMap[aName] = true;
399 // Select the appropriate geometry object shape in the viewer
400 selectionMgr()->clearSelected();
402 // Unhighlight all objects except selected
403 HYDROGUI_Shape* aShape = 0, *aLastShape = 0;
404 Handle(HYDROData_Entity) anEntity;
405 HYDROData_SequenceOfObjects aSeq = myEditedObject->GetGeometryObjects();
406 HYDROData_SequenceOfObjects::Iterator anIter( aSeq );
409 for ( ; anIter.More(); anIter.Next() )
411 anEntity = anIter.Value();
412 if ( !anEntity.IsNull() )
414 aShape = module()->getObjectShape( HYDROGUI_Module::VMR_PreviewCaseZones, anEntity );
417 aName = anEntity->GetName();
418 isSelected = aSelectedObjsMap.contains( aName );
419 aShape->highlight( isSelected, false );
420 aShape->update( false, false );
426 aLastShape->update( true, false );
429 void HYDROGUI_CalculationOp::onLandCoverMapSelected( const QString & theObjName )
431 bool anIsToUpdateViewer = false;
433 // Remove old presentation of land cover map from the operation viewer
434 Handle(HYDROData_LandCoverMap) aPrevLandCoverMap = myEditedObject->GetLandCoverMap();
435 if ( !aPrevLandCoverMap.IsNull() )
437 setObjectVisibility( aPrevLandCoverMap, false );
438 anIsToUpdateViewer = true;
441 // Select the appropriate land cover map shape in the viewer
442 selectionMgr()->clearSelected();
444 // Set the selected land cover map to the calculation case
445 Handle(HYDROData_LandCoverMap) aNewLandCoverMap = Handle(HYDROData_LandCoverMap)::DownCast(
446 HYDROGUI_Tool::FindObjectByName( module(), theObjName, KIND_LAND_COVER_MAP ) );
447 myEditedObject->SetLandCoverMap( aNewLandCoverMap );
449 createPreview( true );
452 void HYDROGUI_CalculationOp::onClickedInZonesBrowser( SUIT_DataObject* theItem )
454 HYDROGUI_Region* aRegionItem = dynamic_cast<HYDROGUI_Region*>(theItem);
455 HYDROGUI_Zone* aZoneItem;
456 selectionMgr()->clearSelected();
459 // Select a region in preview
460 SUIT_DataOwnerPtrList aList( true );
461 DataObjectList aZones = aRegionItem->children();
462 for ( int i = 0; i < aZones.length(); i++ )
464 aZoneItem = dynamic_cast<HYDROGUI_Zone*>(aZones.at(i));
467 aList.append( SUIT_DataOwnerPtr( new LightApp_DataOwner( aZoneItem->entry() ) ) );
470 selectionMgr()->setSelected( aList );
474 // select a single zone
475 aZoneItem = dynamic_cast<HYDROGUI_Zone*>(theItem);
478 SUIT_DataOwnerPtrList aList( true );
479 aList.append( SUIT_DataOwnerPtr( new LightApp_DataOwner( aZoneItem->entry() ) ) );
480 selectionMgr()->setSelected( aList );
485 void HYDROGUI_CalculationOp::onMoveZones( SUIT_DataObject* theRegionItem,
486 const QList<SUIT_DataObject*>& theZonesList )
488 HYDROGUI_Region* aRegion = dynamic_cast<HYDROGUI_Region*>(theRegionItem);
491 QList<HYDROGUI_Zone*> aZonesList;
492 HYDROGUI_Zone* aZone;
493 // Get a list of dropped zones
494 for ( int i = 0; i < theZonesList.length(); i++ )
496 aZone = dynamic_cast<HYDROGUI_Zone*>( theZonesList.at( i ) );
499 aZonesList.append( aZone );
502 if ( aZonesList.length() > 0 )
504 aRegion->addZones( aZonesList );
505 HYDROGUI_CalculationDlg* aPanel =
506 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
508 aPanel->refreshZonesBrowser();
509 createPreview( false, false, false );
514 void HYDROGUI_CalculationOp::onCreateRegion( const QList<SUIT_DataObject*>& theZonesList )
516 if ( createRegion( theZonesList ) )
518 HYDROGUI_CalculationDlg* aPanel =
519 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
522 aPanel->refreshZonesBrowser();
524 createPreview( false, false, false );
528 void HYDROGUI_CalculationOp::onSetMergeType( int theMergeType, QString& theMergeObjectName )
530 HYDROGUI_CalculationDlg* aPanel =
531 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
534 HYDROGUI_Zone* aZone = aPanel->getCurrentZone();
537 aZone->setMergeType( theMergeType, theMergeObjectName );
538 HYDROGUI_Shape* aShape = module()->getObjectShape( HYDROGUI_Module::VMR_PreviewCaseZones, aZone->modelObject() );
541 aShape->update( true, false );
544 aPanel->refreshZonesBrowser();
548 void HYDROGUI_CalculationOp::onAddObjects()
550 HYDROGUI_CalculationDlg* aPanel =
551 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
555 // Add geometry objects selected in the module browser to the calculation case
556 QStringList aSelectedList = aPanel->getSelectedAvailableGeomObjects();
557 if ( aSelectedList.isEmpty() || !confirmRegionsChange() )
560 QStringList anAddedList;
561 for (int i = 0; i < aSelectedList.length(); i++)
563 Handle(HYDROData_Object) anObject = Handle(HYDROData_Object)::DownCast(
564 HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at( i ) ) );
565 if ( anObject.IsNull() )
568 if ( myEditedObject->AddGeometryObject( anObject ) )
569 anAddedList.append( anObject->GetName() );
572 for (int i = 0; i < aSelectedList.length(); i++)
574 Handle(HYDROData_PolylineXY) aPoly = Handle(HYDROData_PolylineXY)::DownCast(
575 HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at( i ) ) );
576 if ( aPoly.IsNull() )
579 if ( myEditedObject->AddInterPoly( aPoly ) )
580 anAddedList.append( aPoly->GetName() );
583 if ( !anAddedList.isEmpty() )
585 aPanel->includeGeomObjects( anAddedList );
586 createPreview( false );
590 void HYDROGUI_CalculationOp::onRemoveObjects()
592 // Remove selected objects from the calculation case
593 HYDROGUI_CalculationDlg* aPanel =
594 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
598 QStringList aSelectedList = aPanel->getSelectedGeomObjects();
602 QSet<QString> selMap = aSelectedList.toSet();
607 if ( aSelectedList.isEmpty() || !confirmRegionsChange() )
610 for (int i = 0; i < aSelectedList.length(); i++)
612 Handle(HYDROData_Object) anObject = Handle(HYDROData_Object)::DownCast(
613 HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at(i) ) );
614 if ( anObject.IsNull() )
617 setObjectVisibility( anObject, false );
618 myEditedObject->RemoveGeometryObject( anObject );
621 for (int i = 0; i < aSelectedList.length(); i++)
623 Handle(HYDROData_PolylineXY) aPoly = Handle(HYDROData_PolylineXY)::DownCast(
624 HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at(i) ) );
625 if ( aPoly.IsNull() )
628 setObjectVisibility( aPoly, false );
629 myEditedObject->RemoveInterPolyObject ( aPoly );
632 module()->update( UF_OCCViewer );
633 aPanel->excludeGeomObjects( aSelectedList );
636 bool HYDROGUI_CalculationOp::confirmRegionsChange() const
639 // Check if the case is already modified or not
640 bool isConfirmed = myEditedObject->IsMustBeUpdated( HYDROData_Entity::Geom_2d );
647 //SUIT_MessageBox::information(module()->getApp()->desktop(),
648 // tr( "REGIONS_CHANGED" ),
649 // tr( "COMPLETE_OP_WILL_BE_PERFORMED" ));
653 // If not modified check if the case has already defined regions with zones
654 HYDROData_SequenceOfObjects aSeq = myEditedObject->GetRegions();
655 if ( aSeq.Length() > 0 )
657 // If there are already defined zones then ask a user to confirm zones recalculation
658 isConfirmed = ( SUIT_MessageBox::question( module()->getApp()->desktop(),
659 tr( "REGIONS_CHANGED" ),
660 tr( "CONFIRM_SPLITTING_ZONES_RECALCULATION_REGIONS" ),
661 QMessageBox::Yes | QMessageBox::No,
662 QMessageBox::No ) == QMessageBox::Yes );
666 isConfirmed = true; // No regions - no zones - nothing to recalculate
672 bool HYDROGUI_CalculationOp::confirmOrderChange() const
674 // Check if the case is already modified or not
675 bool isConfirmed = myEditedObject->IsMustBeUpdated( HYDROData_Entity::Geom_2d );
678 // If not modified check if the case has already defined regions with zones
679 HYDROData_SequenceOfObjects aSeq = myEditedObject->GetRegions();
680 if ( aSeq.Length() > 0 )
682 // If there are already defined zones then ask a user to confirm zones recalculation
683 isConfirmed = ( SUIT_MessageBox::question( module()->getApp()->desktop(),
684 tr( "ORDER_CHANGED" ),
685 tr( "CONFIRM_SPLITTING_ZONES_RECALCULATION_REGIONS" ),
686 QMessageBox::Yes | QMessageBox::No,
687 QMessageBox::No ) == QMessageBox::Yes );
691 isConfirmed = true; // No regions - no zones - nothing to recalculate
697 bool HYDROGUI_CalculationOp::confirmRuleChange() const
699 // Check if the case is already modified or not
700 bool isConfirmed = myEditedObject->IsMustBeUpdated( HYDROData_Entity::Geom_2d );
703 // If not modified check if the case has already defined regions with zones
704 HYDROData_SequenceOfObjects aSeq = myEditedObject->GetRegions();
705 if ( aSeq.Length() > 0 )
707 // If there are already defined zones then ask a user to confirm zones recalculation
708 isConfirmed = ( SUIT_MessageBox::question( module()->getApp()->desktop(),
709 tr( "RULE_CHANGED" ),
710 tr( "CONFIRM_SPLITTING_ZONES_RECALCULATION_REGIONS" ),
711 QMessageBox::Yes | QMessageBox::No,
712 QMessageBox::No ) == QMessageBox::Yes );
716 isConfirmed = true; // No regions - no zones - nothing to recalculate
722 bool HYDROGUI_CalculationOp::confirmModeChange() const
724 // Check if the case is already modified or not
725 bool isConfirmed = myEditedObject->IsMustBeUpdated( HYDROData_Entity::Geom_2d );
728 // If not modified check if the case has already defined regions with zones
729 HYDROData_SequenceOfObjects aSeq = myEditedObject->GetRegions();
730 if ( aSeq.Length() > 0 )
732 // If there are already defined zones then ask a user to confirm zones recalculation
733 isConfirmed = ( SUIT_MessageBox::question( module()->getApp()->desktop(),
734 tr( "MODE_CHANGED" ),
735 tr( "CONFIRM_SPLITTING_ZONES_RECALCULATION_MODE" ),
736 QMessageBox::Yes | QMessageBox::No,
737 QMessageBox::No ) == QMessageBox::Yes );
741 isConfirmed = true; // No regions - no zones - nothing to recalculate
747 bool HYDROGUI_CalculationOp::confirmContinueWithWarning( const HYDROData_Warning& theWarning ) const
749 HYDROData_WarningType aType = theWarning.Type;
750 if ( aType == WARN_OK ) {
758 case WARN_EMPTY_REGIONS:
759 aTitle = tr( "EMPTY_REGIONS" );
760 aMsg = tr( "CONFIRM_CONTINUE_WITH_OBJECTS_NOT_INCLUDED_TO_REGION" ).arg( theWarning.Data );
763 aTitle = tr( "WARNING" );
764 aMsg = theWarning.Data;
768 int anAnswer = SUIT_MessageBox::warning( module()->getApp()->desktop(),
770 QMessageBox::Yes | QMessageBox::No,
773 return ( anAnswer == QMessageBox::Yes );
776 bool HYDROGUI_CalculationOp::processApply( int& theUpdateFlags,
777 QString& theErrorMsg,
778 QStringList& theBrowseObjectsEntries )
780 HYDROGUI_CalculationDlg* aPanel =
781 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
787 QString anEntry = HYDROGUI_DataObject::dataObjectEntry( myEditedObject );
788 theBrowseObjectsEntries.append( anEntry );
791 // For manual mode priority rules are redundant
792 if ( aPanel->getMode() == HYDROData_CalculationCase::MANUAL ) {
793 myEditedObject->ClearRules( HYDROData_CalculationCase::DataTag_CustomRules, false );
796 theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced | UF_VTKViewer | UF_VTK_Forced | UF_VTK_Init;
801 void HYDROGUI_CalculationOp::onApply()
804 HYDROData_Warning aWarning = myEditedObject->GetLastWarning();
805 if ( aWarning.Type != WARN_OK ) {
806 if ( !confirmContinueWithWarning( aWarning ) ) {
807 // Go back to the first page
808 HYDROGUI_CalculationDlg* aPanel =
809 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
811 aPanel->onFirstPage();
817 QApplication::setOverrideCursor( Qt::WaitCursor );
819 int anUpdateFlags = 0;
821 QStringList aBrowseObjectsEntries;
823 bool aResult = false;
827 aResult = processApply( anUpdateFlags, anErrorMsg, aBrowseObjectsEntries );
829 catch ( Standard_Failure )
831 Handle(Standard_Failure) aFailure = Standard_Failure::Caught();
832 anErrorMsg = aFailure->GetMessageString();
840 QApplication::restoreOverrideCursor();
844 module()->update( anUpdateFlags );
846 browseObjects( aBrowseObjectsEntries );
851 QString aMsg = tr( "INPUT_VALID_DATA" );
852 if( !anErrorMsg.isEmpty() )
853 aMsg.prepend( anErrorMsg + "\n" );
854 SUIT_MessageBox::critical( module()->getApp()->desktop(),
855 tr( "INSUFFICIENT_INPUT_DATA" ),
860 void HYDROGUI_CalculationOp::onNext( const int theIndex )
862 if( theIndex==1 && !myIsComplete)
864 setAvailableGroups();
866 else if( theIndex==2 && !myIsComplete)
868 setAvailableBoundaryPolygons();
870 else if( theIndex==3 && !myIsComplete)
872 // Land cover map panel
873 HYDROGUI_CalculationDlg* aPanel =
874 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
878 setLandCoverMapVisible( true );
881 QStringList anEntryList;
883 // Get all land cover map objects to fill in combo-box
884 Handle(HYDROData_LandCoverMap) aLandCoverMapObj;
885 QString aLandCoverMapName;
889 HYDROData_Iterator anIter( doc(), KIND_LAND_COVER_MAP );
890 for ( ; anIter.More(); anIter.Next() )
892 aLandCoverMapObj = Handle(HYDROData_LandCoverMap)::DownCast( anIter.Current() );
894 if ( !aLandCoverMapObj.IsNull() )
896 aLandCoverMapName = aLandCoverMapObj->GetName();
897 if ( !aLandCoverMapName.isEmpty() )
899 aList.append( aLandCoverMapName );
900 anEntryList.append( HYDROGUI_DataObject::dataObjectEntry( aLandCoverMapObj ) );
904 aPanel->setLandCoverMapsNames( aList, anEntryList );
905 aLandCoverMapObj = myEditedObject->GetLandCoverMap();
906 if ( !aList.isEmpty() )
908 if ( aLandCoverMapObj.IsNull() )
909 aPanel->setLandCoverMap( aList.at( 0 ), false );
911 aPanel->setLandCoverMap( aList.at( 0 ), true );
913 aPanel->setLandCoverMap( aList.at( aList.indexOf( aLandCoverMapObj->GetName() ) ), true );
916 // Get all Strickler table objects to fill in combo-box
917 Handle(HYDROData_StricklerTable) aStricklerTableObj;
918 QString aStricklerTableName;
922 anIter = HYDROData_Iterator( doc(), KIND_STRICKLER_TABLE );
923 for ( ; anIter.More(); anIter.Next() )
925 aStricklerTableObj = Handle(HYDROData_StricklerTable)::DownCast( anIter.Current() );
927 if ( !aStricklerTableObj.IsNull() )
929 aStricklerTableName = aStricklerTableObj->GetName();
930 if ( !aStricklerTableName.isEmpty() )
932 aList.append( aStricklerTableName );
933 anEntryList.append( HYDROGUI_DataObject::dataObjectEntry( aStricklerTableObj ) );
937 aPanel->setStricklerTableNames( aList, anEntryList );
938 //@ASL: bool anUpdateState = myEditedObject->IsMustBeUpdated();
939 if ( !aList.isEmpty() )
940 aPanel->setStricklerTable( aList.at( 0 ), false );
941 //@ASL: myEditedObject->SetToUpdate( anUpdateState );
943 if ( !myEditedObject.IsNull() )
947 // Select the certain Strickler table object in combo-box
948 aStricklerTableObj = myEditedObject->GetStricklerTable();
949 if ( aStricklerTableObj.IsNull() )
951 aPanel->setStricklerTable( QString() );
955 aStricklerTableName = aStricklerTableObj->GetName();
956 aPanel->setStricklerTable( aStricklerTableName );
959 // Select the certain land cover map object in combo-box
960 if ( aLandCoverMapObj.IsNull() )
962 aPanel->setLandCoverMap( QString() );
966 aLandCoverMapName = aLandCoverMapObj->GetName();
967 aPanel->setLandCoverMap( aLandCoverMapName );
972 closePreview( false );
973 createPreview( true );
975 else if( theIndex==4 || myIsComplete)
977 HYDROGUI_CalculationDlg* aPanel =
978 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
982 QApplication::setOverrideCursor( Qt::WaitCursor );
984 setGeomObjectsVisible( false );
985 setLandCoverMapVisible( false );
987 QString aNewCaseName = aPanel->getObjectName();
988 QString anOldCaseName = myEditedObject->GetName();
989 bool isNameChanged = anOldCaseName != aNewCaseName;
991 bool anIsToUpdateOb = isNameChanged;
993 // At first we must to update the case name because of
994 // automatic names generation for regions and zones
995 myEditedObject->SetName( aNewCaseName );
997 // Zones: set parameters for automatic mode
998 int aMode = aPanel->getMode();
999 if ( aMode == HYDROData_CalculationCase::AUTOMATIC )
1001 // Set objects in the specified order
1002 if( myEditedObject->IsMustBeUpdated( HYDROData_Entity::Geom_2d ) )
1004 myEditedObject->RemoveGeometryObjects();
1005 QStringList aGeomObjNames;
1006 if (myIsComplete) //erase objects ?
1007 aGeomObjNames << aPanel->getAlreadyAddedGeomObjects();
1008 aGeomObjNames << aPanel->getAllGeomObjects();
1009 foreach ( const QString& aName, aGeomObjNames )
1011 Handle(HYDROData_Object) anObject = Handle(HYDROData_Object)::DownCast(
1012 HYDROGUI_Tool::FindObjectByName( module(), aName ) );
1013 if ( anObject.IsNull() )
1017 myEditedObject->AddGeometryObject( anObject );
1022 // Clear priority rules
1023 //@ASL if ( myEditedObject->GetRulesCount() > 0 ) {
1024 myEditedObject->ClearRules( HYDROData_CalculationCase::DataTag_CustomRules, true );
1026 // Set priority rules
1027 foreach ( const HYDROData_CustomRule& aRule, aPanel->getRules() ) {
1028 myEditedObject->AddRule( aRule.Object1, aRule.Priority,
1029 aRule.Object2, aRule.MergeType,
1030 HYDROData_CalculationCase::DataTag_CustomRules );
1035 aPanel->setEditZonesEnabled( aMode == HYDROData_CalculationCase::MANUAL );
1038 aPanel->BackButton()->setEnabled(false); //force disable; to prevent moving to the first page
1040 if ( myEditedObject->IsMustBeUpdated( HYDROData_Entity::Geom_All ) )
1046 //abortDocOperation();
1047 //module()->getApp()->updateObjectBrowser();
1048 QList<Handle(HYDROData_Entity)> newGeomObj = aPanel->getGeometryObjects(false);
1049 //QSet<Handle(HYDROData_Entity)> includedObjAtStartSet = myIncObjAtStart.toSet();
1050 NCollection_Sequence<Handle(HYDROData_Entity)> theNewObjects;
1051 foreach (Handle(HYDROData_Entity) obj, newGeomObj)
1052 theNewObjects.Append(obj);
1055 bool is_int = false;
1056 bool UseOrigNamingOfNewRegions = true;
1057 NCollection_Sequence<Handle(HYDROData_Region)> theNewRegions;
1058 QSet<QString> newRegionEntries;
1059 HYDROData_CompleteCalcCase::AddObjects(doc(), myEditedObject, theNewObjects, UseOrigNamingOfNewRegions, is_int, theNewRegions);
1061 SUIT_MessageBox::information(module()->getApp()->desktop(),
1062 tr( "COMPLETE_CASE" ),
1063 tr( "There is an intersection(s) between new objects. result will be depend on order" ));
1065 myEditedObject->ClearChanged();
1066 for (int k=1;k<=theNewRegions.Size();k++)
1068 QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theNewRegions(k) );
1069 newRegionEntries.insert(anEntry);
1071 AssignDefaultZonesColors(&newRegionEntries);
1075 myEditedObject->Update();
1076 AssignDefaultZonesColors(NULL);
1080 //aPanel->setEditedObject( myEditedObject );
1081 aPanel->refreshZonesBrowser();
1083 closePreview( false );
1084 createPreview( false );
1086 anIsToUpdateOb = true;
1091 setZonesVisible( true );
1093 if ( isNameChanged ) {
1094 module()->getDataModel()->updateObjectTree( myEditedObject );
1098 QApplication::restoreOverrideCursor();
1102 void HYDROGUI_CalculationOp::onHideZones( const int theIndex )
1107 // setGeomObjectsVisible( true );
1108 // // HYDROGUI_CalculationDlg* aPanel = ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1109 // // QList<Handle(HYDROData_Entity)> geomObjList = aPanel->getGeometryObjects(false);
1110 // // foreach ( Handle(HYDROData_Entity) geomObj, geomObjList)
1111 // // setObjectVisibility( geomObj, true );
1113 // setZonesVisible( false );
1114 // closePreview( false );
1115 // createPreview( false );
1121 setGeomObjectsVisible( true );
1123 closePreview( false );
1124 createPreview( false );
1128 setLandCoverMapVisible( true );
1130 closePreview( false );
1131 createPreview( true );
1134 setZonesVisible( false );
1136 else if( theIndex==4 )
1138 AssignDefaultZonesColors();
1140 closePreview( false );
1141 createPreview( false );
1144 setZonesVisible( true );
1149 void HYDROGUI_CalculationOp::setZonesVisible( bool theIsVisible )
1151 myShowZones = theIsVisible;
1152 HYDROData_SequenceOfObjects aRegions = myEditedObject->GetRegions();
1153 HYDROData_SequenceOfObjects::Iterator aRegionsIter( aRegions );
1154 HYDROData_SequenceOfObjects aZones;
1155 Handle(HYDROData_Region) aRegion;
1156 if ( myPreviewViewManager )
1158 if ( OCCViewer_Viewer* aViewer = myPreviewViewManager->getOCCViewer() )
1160 Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
1161 if ( !aCtx.IsNull() )
1163 for ( ; aRegionsIter.More(); aRegionsIter.Next() )
1165 aRegion = Handle(HYDROData_Region)::DownCast( aRegionsIter.Value() );
1166 if ( !aRegion.IsNull() )
1168 aZones = aRegion->GetZones();
1169 HYDROData_SequenceOfObjects::Iterator aZonesIter( aZones );
1170 for ( ; aZonesIter.More(); aZonesIter.Next() )
1172 setObjectVisibility( aZonesIter.Value(), theIsVisible );
1178 module()->update( UF_OCCViewer );
1183 void HYDROGUI_CalculationOp::setGeomObjectsVisible( bool theIsVisible )
1185 myShowGeomObjects = theIsVisible;
1187 HYDROData_SequenceOfObjects aSeq = myEditedObject->GetGeometryObjects();
1189 HYDROData_SequenceOfObjects::Iterator anIter( aSeq );
1190 for ( ; anIter.More(); anIter.Next() ) {
1191 setObjectVisibility( anIter.Value(), theIsVisible );
1195 void HYDROGUI_CalculationOp::setLandCoverMapVisible( bool theIsVisible )
1197 myShowLandCoverMap = theIsVisible;
1198 setObjectVisibility( myEditedObject->GetLandCoverMap(), theIsVisible );
1201 void HYDROGUI_CalculationOp::AssignDefaultZonesColors(const QSet<QString>* theRegionsEntriesToColored)
1203 HYDROData_SequenceOfObjects aRegions = myEditedObject->GetRegions();
1204 HYDROData_SequenceOfObjects::Iterator aRegionsIter( aRegions );
1205 HYDROData_SequenceOfObjects aZones;
1206 Handle(HYDROData_Region) aRegion;
1207 if ( myPreviewViewManager )
1209 if ( OCCViewer_Viewer* aViewer = myPreviewViewManager->getOCCViewer() )
1211 Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
1212 if ( !aCtx.IsNull() )
1214 for ( ; aRegionsIter.More(); aRegionsIter.Next() )
1216 aRegion = Handle(HYDROData_Region)::DownCast( aRegionsIter.Value() );
1217 QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aRegion );
1219 if (theRegionsEntriesToColored && !theRegionsEntriesToColored->contains(anEntry))
1222 if ( !aRegion.IsNull() )
1224 aZones = aRegion->GetZones();
1225 HYDROData_SequenceOfObjects::Iterator aZonesIter( aZones );
1226 for ( ; aZonesIter.More(); aZonesIter.Next() )
1229 Handle(HYDROData_Zone) aZone = Handle(HYDROData_Zone)::DownCast( aZonesIter.Value() );
1230 if ( !aZone.IsNull() )
1232 QColor aFillingColor = HYDROData_Tool::GenerateRandColor();
1233 while (aFillingColor == Qt::red)
1234 aFillingColor = HYDROData_Tool::GenerateRandColor();
1236 aZone->SetColor(aFillingColor);
1246 void HYDROGUI_CalculationOp::setRules( HYDROData_CalculationCase::DataTag theDataTag )
1248 HYDROGUI_CalculationDlg* aPanel =
1249 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1253 HYDROData_ListOfRules aRules;
1254 Handle(HYDROData_Entity) anObject1, anObject2;
1255 HYDROData_PriorityType aPriority;
1256 HYDROData_Zone::MergeType aMergeType;
1257 HYDROData_CalculationCase::DataTag aDataTag = HYDROData_CalculationCase::DataTag_CustomRules;
1258 for ( int anIndex = 0; ; anIndex++ )
1260 if ( myEditedObject->GetRule( anIndex, anObject1, aPriority, anObject2, aMergeType, theDataTag ) ) {
1261 HYDROData_CustomRule aRule;
1262 aRule.Object1 = anObject1;
1263 aRule.Object2 = anObject2;
1264 aRule.Priority = aPriority;
1265 aRule.MergeType = aMergeType;
1273 if ( theDataTag == HYDROData_CalculationCase::DataTag_CustomRules )
1274 aPanel->setRules( aRules );
1277 bool HYDROGUI_CalculationOp::createRegion( const QList<SUIT_DataObject*>& theZonesList )
1279 bool aRetValue = false;
1281 QList<HYDROGUI_Zone*> aZonesList;
1282 HYDROGUI_Zone* aZone;
1283 // Get a list of dropped zones
1284 for ( int i = 0; i < theZonesList.length(); i++ )
1286 aZone = dynamic_cast<HYDROGUI_Zone*>( theZonesList.at( i ) );
1289 aZonesList.append( aZone );
1292 if ( aZonesList.length() > 0 )
1294 module()->getDataModel()->createNewRegion( myEditedObject, aZonesList );
1301 void HYDROGUI_CalculationOp::createPreview( const bool theLandCoverMap, bool fitAllFlag, bool onTopViewAndFit )
1303 LightApp_Application* anApp = module()->getApp();
1304 HYDROData_SequenceOfObjects aSeq;
1305 if ( theLandCoverMap && myShowLandCoverMap )
1307 aSeq.Append( myEditedObject->GetLandCoverMap() );
1309 else if ( !theLandCoverMap && myShowGeomObjects )
1311 HYDROData_SequenceOfObjects aSeqGO = myEditedObject->GetGeometryObjects();
1312 HYDROData_SequenceOfObjects aSeqP = myEditedObject->GetInterPolyObjects();
1313 aSeq.Append( aSeqGO );
1314 aSeq.Append( aSeqP );
1317 Handle(HYDROData_Entity) anEntity;
1321 // Gather zones for displaying
1322 HYDROData_SequenceOfObjects aRegions = myEditedObject->GetRegions();
1323 HYDROData_SequenceOfObjects::Iterator aRegionsIter( aRegions );
1324 HYDROData_SequenceOfObjects aZones;
1325 Handle(HYDROData_Region) aRegion;
1326 for ( ; aRegionsIter.More(); aRegionsIter.Next() )
1328 anEntity = aRegionsIter.Value();
1329 if ( !anEntity.IsNull() )
1331 aRegion = Handle(HYDROData_Region)::DownCast( anEntity );
1332 if ( !aRegion.IsNull() )
1334 aZones = aRegion->GetZones();
1335 aSeq.Append( aZones );
1341 // Get a boundary polyline if any
1342 if (Handle(HYDROData_PolylineXY) aBPoly = myEditedObject->GetBoundaryPolyline())
1343 aSeq.Append( aBPoly );
1345 module()->removeViewShapes( HYDROGUI_Module::VMR_PreviewCaseZones );
1347 if ( !myActiveViewManager )
1349 if ( aSeq.IsEmpty() )
1352 myActiveViewManager = anApp->activeViewManager();
1355 if ( !myPreviewViewManager )
1357 myPreviewViewManager = ::qobject_cast<OCCViewer_ViewManager*>(
1358 anApp->createViewManager( OCCViewer_Viewer::Type() ) );
1359 if ( myPreviewViewManager )
1361 connect( myPreviewViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
1362 this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
1364 module()->setViewManagerRole( myPreviewViewManager, HYDROGUI_Module::VMR_PreviewCaseZones );
1365 myPreviewViewManager->setTitle( tr( "PREVIEW_CASE_ZONES" ) );
1369 if ( !myPreviewViewManager )
1372 if ( OCCViewer_Viewer* aViewer = myPreviewViewManager->getOCCViewer() )
1374 Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
1375 if ( !aCtx.IsNull() )
1377 HYDROData_SequenceOfObjects::Iterator anIter( aSeq );
1378 for ( ; anIter.More(); anIter.Next() )
1380 const Handle(HYDROData_Entity)& ent = anIter.Value();
1382 setObjectVisibility( ent, true );
1385 //Process the draw events for viewer
1386 QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );
1389 int UpdateFlags = UF_OCCViewer;
1391 UpdateFlags |= UF_FitAll;
1392 module()->update( UpdateFlags );
1394 OCCViewer_ViewWindow* vw = (OCCViewer_ViewWindow*)myPreviewViewManager->getActiveView();
1395 if ( onTopViewAndFit && vw )
1400 void HYDROGUI_CalculationOp::setObjectVisibility( Handle(HYDROData_Entity) theEntity, const bool theIsVisible )
1402 if ( theEntity.IsNull() || !myPreviewViewManager ) {
1406 OCCViewer_Viewer* aViewer = myPreviewViewManager->getOCCViewer();
1408 module()->setObjectVisible( (size_t)aViewer, theEntity, theIsVisible );
1412 void HYDROGUI_CalculationOp::onLastViewClosed( SUIT_ViewManager* theViewManager )
1417 void HYDROGUI_CalculationOp::closePreview( bool theRemoveViewManager )
1419 SUIT_DataBrowser* aOb = ((LightApp_Application*)module()->application())->objectBrowser();
1420 QList<QShortcut*> aShortcuts = aOb->findChildren<QShortcut*>();
1421 QShortcut* aShortcut;
1422 foreach( aShortcut, aShortcuts )
1424 if ( aShortcut->key() ==
1425 QKeySequence( ((LightApp_Application*)module()->application())->objectBrowser()->shortcutKey(
1426 SUIT_DataBrowser::RenameShortcut ) ) )
1428 aShortcut->setEnabled( true );
1433 if( myPreviewViewManager )
1435 // Hide all the displayed objects in the preview view
1436 OCCViewer_Viewer* aViewer = myPreviewViewManager->getOCCViewer();
1438 size_t aViewId = (size_t)aViewer;
1439 HYDROData_Iterator anIterator( doc() );
1440 for( ; anIterator.More(); anIterator.Next() ) {
1441 Handle(HYDROData_Entity) anObject = anIterator.Current();
1442 if( !anObject.IsNull() ) {
1443 module()->setObjectVisible( aViewId, anObject, false );
1448 if ( theRemoveViewManager )
1450 disconnect( myPreviewViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
1451 this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
1453 module()->getApp()->removeViewManager( myPreviewViewManager ); // myPreviewViewManager is deleted here
1454 myPreviewViewManager = NULL;
1458 if( myActiveViewManager && theRemoveViewManager )
1460 HYDROGUI_Tool::SetActiveViewManager( module(), myActiveViewManager );
1461 myActiveViewManager = NULL;
1465 void HYDROGUI_CalculationOp::setAvailableGroups()
1467 HYDROGUI_CalculationDlg* aPanel =
1468 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1470 HYDROData_SequenceOfObjects aSeq = myEditedObject->GetGeometryGroups();
1471 QStringList aList, anEntryList;
1472 getNamesAndEntries( aSeq, aList, anEntryList );
1474 QStringList aGroupsNames;
1476 HYDROData_SequenceOfObjects anObjs = myEditedObject->GetGeometryObjects();
1477 for( int anIndex = 1, aLength = anObjs.Length(); anIndex <= aLength; anIndex++ )
1479 Handle(HYDROData_Object) anObj = Handle(HYDROData_Object)::DownCast( anObjs.Value( anIndex ) );
1480 HYDROData_SequenceOfObjects aGroups = anObj->GetGroups();
1481 for( int aGIndex = 1, aGLength = aGroups.Length(); aGIndex <= aGLength; aGIndex++ )
1483 Handle(HYDROData_ShapesGroup) aGroup = Handle(HYDROData_ShapesGroup)::DownCast( aGroups.Value( aGIndex ) );
1484 aGroupsNames.append( aGroup->GetName() );
1487 if( myEditedObject->IsMustBeUpdated( HYDROData_Entity::Geom_2d ) ) {
1488 for( int anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ ) {
1489 Handle(HYDROData_ShapesGroup) aGeomGroup =
1490 Handle(HYDROData_ShapesGroup)::DownCast( aSeq.Value( anIndex ) );
1491 if ( !aGeomGroup.IsNull() && !aGroupsNames.contains( aGeomGroup->GetName() ) ) {
1492 myEditedObject->RemoveGeometryGroup( aGeomGroup );
1497 aPanel->setAvailableGroups( aGroupsNames );
1498 aPanel->includeGroups( aList );
1500 //@ASL: bool isUpdated = myEditedObject->IsMustBeUpdated();
1503 void HYDROGUI_CalculationOp::onAddGroups()
1505 HYDROGUI_CalculationDlg* aPanel =
1506 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1510 // Add geometry objects selected in the module browser to the calculation case
1511 QStringList aSelectedList = aPanel->getSelectedAvailableGroups();
1512 if ( aSelectedList.isEmpty() || !confirmRegionsChange() )
1515 QStringList anAddedList;
1516 for (int i = 0; i < aSelectedList.length(); i++)
1518 Handle(HYDROData_ShapesGroup) aGroup = Handle(HYDROData_ShapesGroup)::DownCast(
1519 HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at( i ) ) );
1520 if ( aGroup.IsNull() )
1523 if ( myEditedObject->AddGeometryGroup( aGroup ) )
1524 anAddedList.append( aGroup->GetName() );
1527 if ( !anAddedList.isEmpty() )
1529 aPanel->includeGroups( anAddedList );
1533 void HYDROGUI_CalculationOp::onRemoveGroups()
1535 // Remove selected objects from the calculation case
1536 HYDROGUI_CalculationDlg* aPanel =
1537 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1541 QStringList aSelectedList = aPanel->getSelectedGroups();
1542 if ( aSelectedList.isEmpty() || !confirmRegionsChange() )
1545 for (int i = 0; i < aSelectedList.length(); i++)
1547 Handle(HYDROData_ShapesGroup) aGroup = Handle(HYDROData_ShapesGroup)::DownCast(
1548 HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at(i) ) );
1549 if ( aGroup.IsNull() )
1552 myEditedObject->RemoveGeometryGroup( aGroup );
1555 aPanel->excludeGroups( aSelectedList );
1559 void HYDROGUI_CalculationOp::setAvailableBoundaryPolygons()
1561 HYDROGUI_CalculationDlg* aPanel = ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1563 HYDROData_Iterator anIter( doc(), KIND_BC_POLYGON );
1564 Handle(HYDROData_BCPolygon) aBCP;
1566 QVector<int> aTypes;
1567 for (;anIter.More(); anIter.Next())
1569 aBCP = Handle(HYDROData_BCPolygon)::DownCast( anIter.Current() );
1570 aNames.append(aBCP->GetName());
1571 aTypes.append(aBCP->GetBoundaryType());
1573 HYDROData_SequenceOfObjects aBCPSeq = myEditedObject->GetBoundaryPolygons();
1575 QStringList aListCut, aListIS;
1576 for (int i=1; i<=aBCPSeq.Size();i++)
1578 int type = Handle(HYDROData_BCPolygon)::DownCast(aBCPSeq(i))->GetBoundaryType();
1580 aListCut << aBCPSeq(i)->GetName();
1581 else if (type == 2 || type == 3)
1582 aListIS << aBCPSeq(i)->GetName();
1585 aPanel->setAvailableBoundaryPolygons( aNames, aTypes );
1586 aPanel->includeBoundaryPolygons( aListCut );
1587 aPanel->includeISBoundaryPolygons( aListIS );
1590 void HYDROGUI_CalculationOp::onRemoveBoundaryPolygons()
1592 HYDROGUI_CalculationDlg* aPanel =
1593 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1597 QStringList aSelectedListCut = aPanel->getSelectedBoundaryPolygons();
1598 QStringList aSelectedListIS = aPanel->getSelectedISBoundaryPolygons();
1600 if ( aSelectedListCut.isEmpty() && aSelectedListIS.isEmpty() )
1603 for (int i = 0; i < aSelectedListCut.length(); i++)
1605 Handle(HYDROData_BCPolygon) aBCPoly = Handle(HYDROData_BCPolygon)::DownCast(
1606 HYDROGUI_Tool::FindObjectByName( module(), aSelectedListCut.at(i) ) );
1607 if ( aBCPoly.IsNull() )
1609 myEditedObject->RemoveBoundaryPolygon( aBCPoly );
1612 for (int i = 0; i < aSelectedListIS.length(); i++)
1614 Handle(HYDROData_BCPolygon) aBCPoly = Handle(HYDROData_BCPolygon)::DownCast(
1615 HYDROGUI_Tool::FindObjectByName( module(), aSelectedListIS.at(i) ) );
1616 if ( aBCPoly.IsNull() )
1618 myEditedObject->RemoveBoundaryPolygon( aBCPoly );
1621 aPanel->excludeBoundaryPolygons( aSelectedListCut );
1622 aPanel->excludeISBoundaryPolygons( aSelectedListIS );
1626 void HYDROGUI_CalculationOp::onAddBoundaryPolygons()
1628 HYDROGUI_CalculationDlg* aPanel = ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1632 QStringList aSelectedList = aPanel->getSelectedAvailableBoundaryPolygons();
1633 if ( aSelectedList.isEmpty())
1636 QStringList anAddedListCut, anAddedListIS;
1637 for (int i = 0; i < aSelectedList.length(); i++)
1639 Handle(HYDROData_BCPolygon) aBCPoly = Handle(HYDROData_BCPolygon)::DownCast(
1640 HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at( i ) ) );
1641 if ( aBCPoly.IsNull() )
1644 if ( myEditedObject->AddBoundaryPolygon( aBCPoly ) )
1646 QString aName = aBCPoly->GetName();
1647 int type = aBCPoly->GetBoundaryType();
1649 anAddedListCut.append(aName);
1650 else if (type == 2 || type == 3)
1651 anAddedListIS.append(aName);
1656 if ( !anAddedListCut.isEmpty() )
1657 aPanel->includeBoundaryPolygons(anAddedListCut);
1658 if ( !anAddedListIS.isEmpty() )
1659 aPanel->includeISBoundaryPolygons(anAddedListIS);
1662 void HYDROGUI_CalculationOp::onChangeMode( int theMode )
1664 HYDROGUI_CalculationDlg* aPanel =
1665 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1669 if ( !confirmModeChange() ) {
1670 aPanel->setMode( myEditedObject->GetAssignmentMode() );
1674 myEditedObject->SetAssignmentMode( (HYDROData_CalculationCase::AssignmentMode)theMode );
1675 aPanel->setMode( theMode );
1678 void HYDROGUI_CalculationOp::onOrderChanged( bool& isConfirmed )
1680 HYDROGUI_CalculationDlg* aPanel =
1681 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1685 isConfirmed = confirmOrderChange();
1687 myEditedObject->Changed( HYDROData_Entity::Geom_2d );
1690 void HYDROGUI_CalculationOp::onRuleChanged( bool& isConfirmed )
1692 HYDROGUI_CalculationDlg* aPanel =
1693 ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
1697 isConfirmed = confirmRuleChange();
1699 myEditedObject->Changed( HYDROData_Entity::Geom_2d );
1702 void HYDROGUI_CalculationOp::onRegenerateColors()
1704 // For geometry zones
1705 AssignDefaultZonesColors();
1706 setZonesVisible( false );
1707 setZonesVisible( true );