Salome HOME
Update mechanism for calculation case and it child objects corrected.
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_OCCDisplayer.cxx
1 // Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 #include "HYDROGUI_OCCDisplayer.h"
24
25 #include "HYDROGUI_DataModel.h"
26 #include "HYDROGUI_Module.h"
27 #include "HYDROGUI_Tool.h"
28 #include "HYDROGUI_Shape.h"
29
30 #include <AIS_InteractiveContext.hxx>
31 #include <AIS_ListIteratorOfListOfInteractive.hxx>
32 #include <AIS_ListOfInteractive.hxx>
33
34 #include <OCCViewer_ViewManager.h>
35 #include <OCCViewer_ViewModel.h>
36 #include <OCCViewer_ViewWindow.h>
37
38 HYDROGUI_OCCDisplayer::HYDROGUI_OCCDisplayer( HYDROGUI_Module* theModule )
39 : HYDROGUI_AbstractDisplayer( theModule )
40 {
41 }
42
43 HYDROGUI_OCCDisplayer::~HYDROGUI_OCCDisplayer()
44 {
45 }
46
47 void HYDROGUI_OCCDisplayer::SetToUpdate( const HYDROData_SequenceOfObjects& theObjs,
48                                          const int                          theViewerId )
49 {
50   OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId );
51   if( !aViewer )
52     return;
53
54   for ( int i = 1, n = theObjs.Length(); i <= n; i++ )
55   {
56     Handle(HYDROData_Entity) anObj = theObjs.Value( i );
57     if( anObj.IsNull() )
58       continue;
59
60     HYDROGUI_Shape* anObjShape = module()->getObjectShape( (size_t)aViewer, anObj );
61     if ( !anObjShape )
62       continue;
63     
64     anObjShape->setIsToUpdate( true );
65   }
66 }
67
68 void HYDROGUI_OCCDisplayer::EraseAll( const int theViewerId )
69 {
70   OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId );
71   if( !aViewer )
72     return;
73
74   module()->removeViewShapes( (size_t)aViewer );
75 }
76
77 void HYDROGUI_OCCDisplayer::Erase( const HYDROData_SequenceOfObjects& theObjs,
78                                    const int                          theViewerId )
79 {
80   OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId );
81   if( !aViewer )
82     return;
83
84   for ( int i = 1, n = theObjs.Length(); i <= n; i++ )
85   {
86     Handle(HYDROData_Entity) anObj = theObjs.Value( i );
87     if( anObj.IsNull() )
88       continue;
89
90     module()->removeObjectShape( (size_t)aViewer, anObj );
91   }
92   aViewer->update();
93 }
94
95 HYDROGUI_Shape* HYDROGUI_OCCDisplayer::createShape( const int                             theViewerId,
96                                                     const Handle(AIS_InteractiveContext)& theContext,
97                                                     const Handle(HYDROData_Entity)&       theObject )
98 {
99   HYDROGUI_Shape* aResShape = NULL;
100   if ( theContext.IsNull() || theObject.IsNull() )
101     return aResShape;
102
103   ObjectKind anObjectKind = theObject->GetKind();
104   if ( anObjectKind != KIND_IMAGE &&
105        anObjectKind != KIND_POLYLINEXY &&
106        anObjectKind != KIND_POLYLINE &&
107        anObjectKind != KIND_IMMERSIBLE_ZONE &&
108        anObjectKind != KIND_REGION &&
109        anObjectKind != KIND_ZONE &&
110        anObjectKind != KIND_OBSTACLE &&
111        anObjectKind != KIND_PROFILE &&
112        anObjectKind != KIND_STREAM &&
113        anObjectKind != KIND_CHANNEL )
114     return aResShape;
115
116   aResShape = new HYDROGUI_Shape( theContext, theObject );
117   module()->setObjectShape( theViewerId, theObject, aResShape );
118
119   return aResShape;
120 }
121
122 void HYDROGUI_OCCDisplayer::Display( const HYDROData_SequenceOfObjects& theObjs,
123                                      const int                          theViewerId,
124                                      const bool                         theIsForced,
125                                      const bool theDoFitAll )
126 {
127   OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId );
128   if( !aViewer )
129     return;
130
131   Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
132   if( aCtx.IsNull() )
133     return;
134
135   for ( int i = 1, n = theObjs.Length(); i <= n; i++ )
136   {
137     Handle(HYDROData_Entity) anObj = theObjs.Value( i );
138     if ( anObj.IsNull() || anObj->IsRemoved() )
139       continue;
140
141     HYDROGUI_Shape* anObjShape = module()->getObjectShape( (size_t)aViewer, anObj );
142
143     if ( !anObjShape || anObjShape->getIsToUpdate() || theIsForced )
144     {
145       if ( !anObjShape )
146         anObjShape = createShape( (size_t)aViewer, aCtx, anObj );
147
148       if ( anObjShape )
149         anObjShape->update( false );
150     }
151
152     if ( anObjShape )
153     {
154       bool anIsVisible = module()->isObjectVisible( (size_t)aViewer, anObj );
155       anObjShape->setVisible( anIsVisible, false );
156     }
157   }
158
159   if ( theDoFitAll )
160   {
161     OCCViewer_ViewManager* aViewManager
162       = ::qobject_cast<OCCViewer_ViewManager*>( aViewer->getViewManager() );
163     if ( aViewManager )
164     {
165       OCCViewer_ViewWindow* aViewWindow = 
166         ::qobject_cast<OCCViewer_ViewWindow*>( aViewManager->getActiveView() );
167       if ( aViewWindow )
168       {
169         aViewWindow->onFitAll();
170       }
171     }
172   }
173 }
174
175 void HYDROGUI_OCCDisplayer::purgeObjects( const int theViewerId )
176 {
177   OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId );
178   if( !aViewer )
179     return;
180
181   Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
182   if( aCtx.IsNull() )
183     return;
184
185   AIS_ListOfInteractive aDisplayedObjects;
186   aCtx->DisplayedObjects( aDisplayedObjects );
187
188   AIS_ListIteratorOfListOfInteractive aListIter( aDisplayedObjects );
189   for ( ; aListIter.More(); aListIter.Next() )
190   {
191     Handle(AIS_InteractiveObject) aPrsObj = aListIter.Value();
192     if ( aPrsObj.IsNull() )
193       continue;
194
195     Handle(HYDROData_Entity) anOwnerObj = 
196       Handle(HYDROData_Entity)::DownCast( aPrsObj->GetOwner() );
197     if ( !anOwnerObj.IsNull() && anOwnerObj->IsRemoved() )
198       module()->removeObjectShape( (size_t)aViewer, anOwnerObj );
199   }
200 }
201
202 QString HYDROGUI_OCCDisplayer::GetType() const
203 {
204   return OCCViewer_Viewer::Type();
205 }