Salome HOME
65aaeed9e0283746d0a6f58b70479aaf8ad8ca7a
[modules/visu.git] / src / VISUGUI / VisuGUI_ViewTools.cxx
1 //  Copyright (C) 2007-2008  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 //  VISU VISUGUI : GUI of VISU component
23 //  File   : VisuGUI_Tools.cxx
24 //  Author : Sergey Anikin
25 //  Module : VISU
26 //
27 #include "VisuGUI_ViewTools.h"
28
29 #include "VISU_Actor.h"
30
31 #include "SVTK_ViewModel.h"
32 #include "SVTK_ViewWindow.h"
33
34 #include <SUIT_Desktop.h>
35
36 namespace VISU 
37 {
38   //----------------------------------------------------------------------------
39   VISU_Actor*
40   PublishInView(VisuGUI* theModule,
41                 Prs3d_i* thePrs,
42                 SVTK_ViewWindow* theViewWindow,
43                 bool theIsHighlight)
44   {
45     if (theViewWindow) {
46       QApplication::setOverrideCursor( Qt::WaitCursor );
47       try {
48         if (VISU_Actor* anActor = thePrs->CreateActor()) {
49           theViewWindow->AddActor(anActor);
50           if (theIsHighlight)
51             theViewWindow->highlight(anActor->getIO(),true);
52           theViewWindow->getRenderer()->ResetCameraClippingRange();
53           theViewWindow->Repaint();
54           QApplication::restoreOverrideCursor();
55           return anActor;
56         }
57       } catch(std::exception& exc) {
58         thePrs->RemoveActors();
59
60         QApplication::restoreOverrideCursor();
61         INFOS(exc.what());
62         SUIT_MessageBox::warning
63           (GetDesktop(theModule), QObject::tr("WRN_VISU"),
64            QObject::tr("ERR_CANT_CREATE_ACTOR") + ": " + QObject::tr(exc.what()));
65       }
66     }
67     return NULL;
68   }
69
70
71   //---------------------------------------------------------------
72   VISU_Actor*
73   UpdateViewer(VisuGUI* theModule,
74                VISU::Prs3d_i* thePrs,
75                bool theDispOnly,
76                const bool theIsHighlight)
77   {
78     if (SVTK_ViewWindow* aViewWindow = GetActiveViewWindow<SVTK_ViewWindow>(theModule)) {
79       vtkRenderer *aRen = aViewWindow->getRenderer();
80       VTK::ActorCollectionCopy aCopy(aRen->GetActors());
81       vtkActorCollection *anActColl = aCopy.GetActors();
82       anActColl->InitTraversal();
83       VISU_Actor* aResActor = NULL;
84       bool isOk = true;
85       while (vtkActor *anAct = anActColl->GetNextActor()) {
86         if (VISU_Actor* anActor = dynamic_cast<VISU_Actor*>(anAct)) {
87           if (VISU::Prs3d_i* aPrs3d = anActor->GetPrs3d()) {
88             if (thePrs == aPrs3d) {
89               try {
90                 aResActor = anActor;
91                 thePrs->UpdateActors();
92                 aResActor->VisibilityOn();
93               } catch (std::runtime_error& exc) {
94                 thePrs->RemoveActors();
95                 isOk = false;
96
97                 INFOS(exc.what());
98                 SUIT_MessageBox::warning
99                   (GetDesktop(theModule), QObject::tr("WRN_VISU"),
100                    QObject::tr("ERR_CANT_BUILD_PRESENTATION") + ": " + QObject::tr(exc.what()) );
101               }
102             } else if (theDispOnly) {
103               anActor->VisibilityOff();
104             }
105           } else if (theDispOnly && anActor->GetVisibility()) {
106             anActor->VisibilityOff();
107           }
108         }
109       }
110       if (aResActor) {
111         if (theIsHighlight && isOk)
112           aViewWindow->highlight(aResActor->getIO(), true);
113         aViewWindow->getRenderer()->ResetCameraClippingRange();
114         aViewWindow->Repaint();
115         return aResActor;
116       }
117       return PublishInView(theModule, thePrs, aViewWindow, theIsHighlight);
118     }
119     return NULL;
120   }
121
122
123   //---------------------------------------------------------------
124   void
125   ErasePrs3d(VisuGUI* theModule,
126              VISU::Prs3d_i* thePrs,
127              bool theDoRepaint)
128   {
129     if(SVTK_ViewWindow* aViewWindow = GetActiveViewWindow<SVTK_ViewWindow>(theModule)){
130       if(VISU_Actor* anActor = FindActor(aViewWindow, thePrs)){
131         anActor->VisibilityOff();
132         if(theDoRepaint)
133           aViewWindow->Repaint();
134       }
135     }
136   }
137
138   //----------------------------------------------------------------------------
139   void
140   ErasePrs(VisuGUI* theModule,
141            Base_i* theBase, 
142            bool theDoRepaint)
143   {
144     if(!theBase)
145       return;
146
147     switch (theBase->GetType()) {
148     case VISU::TCURVE: {
149       if (VISU::Curve_i* aCurve = dynamic_cast<VISU::Curve_i*>(theBase))
150         PlotCurve(theModule, aCurve, VISU::eErase );
151       break;
152     }
153     case VISU::TCONTAINER: {
154       if (VISU::Container_i* aContainer = dynamic_cast<VISU::Container_i*>(theBase))
155         PlotContainer(theModule, aContainer, VISU::eErase );
156       break;
157     }
158     case VISU::TTABLE: {
159       if (VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(theBase))
160         PlotTable(theModule, aTable, VISU::eErase );
161       break;
162     }
163     case VISU::TPOINTMAP3D: {
164       if (VISU::PointMap3d_i* aTable3d = dynamic_cast<VISU::PointMap3d_i*>(theBase)) {
165         if (SVTK_ViewWindow* aViewWindow = GetActiveViewWindow<SVTK_ViewWindow>(theModule)) {
166           if(VISU_ActorBase* anActor = FindActorBase(aViewWindow, aTable3d)){
167             anActor->VisibilityOff();
168             if(theDoRepaint)
169             aViewWindow->Repaint();
170           }
171         } else {
172           if (VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(theBase))
173             PlotTable(theModule, aTable, VISU::eErase );
174         }
175       }
176       break;
177     }
178     default: {
179       if(VISU::Prs3d_i* aPrs3d = VISU::GetPrs3dFromBase(theBase)){
180         if(SVTK_ViewWindow* aViewWindow = GetActiveViewWindow<SVTK_ViewWindow>(theModule)){
181           RemoveScalarBarPosition(theModule, aViewWindow, aPrs3d);
182           ErasePrs3d(theModule, aPrs3d, theDoRepaint);
183         }
184       }
185     }} // switch (aType)
186   }
187
188 }