Salome HOME
Copyright update 2020
[modules/shaper.git] / src / XGUI / XGUI_ViewerProxy.cpp
1 // Copyright (C) 2014-2020  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "XGUI_ViewerProxy.h"
21 #include "XGUI_Workshop.h"
22 #include "XGUI_SalomeConnector.h"
23 #include "XGUI_Displayer.h"
24
25 #ifndef HAVE_SALOME
26   #include <AppElements_MainWindow.h>
27   #include <AppElements_ViewPort.h>
28   #include <AppElements_ViewWindow.h>
29   #include <AppElements_Viewer.h>
30 #endif
31
32 #include <ModuleBase_IViewWindow.h>
33 #include <ModuleBase_Preferences.h>
34 #include <GeomAPI_Shape.h>
35 #include <ModelAPI_ResultConstruction.h>
36
37 #include <Config_PropManager.h>
38
39 #include <SUIT_ResourceMgr.h>
40 #include <AIS_Shape.hxx>
41 #include <StdSelect_BRepOwner.hxx>
42
43 #include <QEvent>
44 #include <QKeyEvent>
45
46
47 #define HIGHLIGHT_COLOR Quantity_NOC_YELLOW
48
49 XGUI_ViewerProxy::XGUI_ViewerProxy(XGUI_Workshop* theParent)
50     : ModuleBase_IViewer(theParent),
51       myWorkshop(theParent)
52 {
53 }
54
55 void XGUI_ViewerProxy::connectViewProxy()
56 {
57 #ifdef HAVE_SALOME
58   connect(myWorkshop->salomeConnector()->viewer(), SIGNAL(trihedronVisibilityChanged(bool)),
59          SIGNAL(trihedronVisibilityChanged(bool)));
60 #else
61   connect(myWorkshop->mainWindow()->viewer(), SIGNAL(trihedronVisibilityChanged(bool)),
62          SIGNAL(trihedronVisibilityChanged(bool)));
63 #endif
64 }
65
66 Handle(AIS_InteractiveContext) XGUI_ViewerProxy::AISContext() const
67 {
68   Handle(AIS_InteractiveContext) aContext;
69 #ifdef HAVE_SALOME
70   aContext = myWorkshop->salomeConnector()->viewer()->AISContext();
71 #else
72   aContext = myWorkshop->mainWindow()->viewer()->AISContext();
73 #endif
74   return aContext;
75 }
76
77 Handle(AIS_Trihedron) XGUI_ViewerProxy::trihedron() const
78 {
79 #ifdef HAVE_SALOME
80   return myWorkshop->salomeConnector()->viewer()->trihedron();
81 #else
82   return myWorkshop->mainWindow()->viewer()->trihedron();
83 #endif
84 }
85
86 Handle(V3d_Viewer) XGUI_ViewerProxy::v3dViewer() const
87 {
88 #ifdef HAVE_SALOME
89   return myWorkshop->salomeConnector()->viewer()->v3dViewer();
90 #else
91   return myWorkshop->mainWindow()->viewer()->v3dViewer();
92 #endif
93 }
94
95 Handle(V3d_View) XGUI_ViewerProxy::activeView() const
96 {
97 #ifdef HAVE_SALOME
98   return myWorkshop->salomeConnector()->viewer()->activeView();
99 #else
100   AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
101   return (aViewer->activeViewWindow()) ?
102     aViewer->activeViewWindow()->viewPortApp()->getView() :
103     Handle(V3d_View)();
104 #endif
105 }
106
107 QWidget* XGUI_ViewerProxy::activeViewPort() const
108 {
109 #ifdef HAVE_SALOME
110   return myWorkshop->salomeConnector()->viewer()->activeViewPort();
111 #else
112   AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
113   return (aViewer->activeViewWindow()) ?
114          aViewer->activeViewWindow()->viewPortApp(): 0;
115 #endif
116 }
117
118 void XGUI_ViewerProxy::setViewProjection(double theX, double theY, double theZ, double theTwist)
119 {
120   Handle(V3d_View) aView3d = activeView();
121   if (!aView3d.IsNull()) {
122     aView3d->SetProj(theX, theY, theZ);
123     aView3d->SetTwist( theTwist );
124     aView3d->FitAll(0.01, false);
125     //aView3d->SetZSize(0.);
126     if (aView3d->Depth() < 0.1)
127       aView3d->DepthFitAll();
128   }
129 }
130
131 void XGUI_ViewerProxy::fitAll()
132 {
133 #ifdef HAVE_SALOME
134   myWorkshop->salomeConnector()->viewer()->fitAll();
135 #else
136   AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
137   if (aViewer->activeViewWindow())
138     aViewer->activeViewWindow()->viewPortApp()->fitAll();
139 #endif
140 }
141
142 void XGUI_ViewerProxy::eraseAll()
143 {
144 #ifdef HAVE_SALOME
145   myWorkshop->salomeConnector()->viewer()->eraseAll();
146 #else
147 #endif
148 }
149
150 void XGUI_ViewerProxy::connectToViewer()
151 {
152 #ifdef HAVE_SALOME
153   ModuleBase_IViewer* aViewer = myWorkshop->salomeConnector()->viewer();
154
155   connect(aViewer, SIGNAL(lastViewClosed()), this, SIGNAL(lastViewClosed()));
156   connect(aViewer, SIGNAL(tryCloseView(ModuleBase_IViewWindow*)),
157     this, SIGNAL(tryCloseView(ModuleBase_IViewWindow*)));
158
159   connect(aViewer, SIGNAL(deleteView(ModuleBase_IViewWindow*)),
160     this, SIGNAL(deleteView(ModuleBase_IViewWindow*)));
161
162   connect(aViewer, SIGNAL(viewCreated(ModuleBase_IViewWindow*)),
163     this, SLOT(onViewCreated(ModuleBase_IViewWindow*)));
164
165   connect(aViewer, SIGNAL(activated(ModuleBase_IViewWindow*)),
166     this, SIGNAL(activated(ModuleBase_IViewWindow*)));
167
168   connect(aViewer, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)),
169     this, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)));
170
171   connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)),
172     this, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)));
173
174   connect(aViewer, SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)), this,
175           SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)));
176
177   connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)),
178     this, SLOT(onMouseMove(ModuleBase_IViewWindow*, QMouseEvent*)));
179
180   connect(aViewer, SIGNAL(keyPress(ModuleBase_IViewWindow*, QKeyEvent*)),
181     this, SLOT(onKeyPress(ModuleBase_IViewWindow*, QKeyEvent*)));
182
183   connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)),
184     this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*)));
185
186   connect(aViewer, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
187
188   connect(aViewer, SIGNAL(viewTransformed(int)), this, SIGNAL(viewTransformed(int)));
189
190   connect(aViewer, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
191           SIGNAL(contextMenuRequested(QContextMenuEvent*)));
192
193 #else
194   AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
195
196   connect(aViewer, SIGNAL(lastViewClosed()), this, SIGNAL(lastViewClosed()));
197
198   connect(aViewer, SIGNAL(tryCloseView(AppElements_ViewWindow*)),
199           this, SLOT(onTryCloseView(AppElements_ViewWindow*)));
200
201   connect(aViewer, SIGNAL(deleteView(AppElements_ViewWindow*)),
202           this, SLOT(onDeleteView(AppElements_ViewWindow*)));
203
204   connect(aViewer, SIGNAL(viewCreated(AppElements_ViewWindow*)),
205           this, SLOT(onViewCreated(AppElements_ViewWindow*)));
206
207   connect(aViewer, SIGNAL(activated(AppElements_ViewWindow*)),
208           this, SLOT(onActivated(AppElements_ViewWindow*)));
209
210   connect(aViewer, SIGNAL(mousePress(AppElements_ViewWindow*, QMouseEvent*)), this,
211           SLOT(onMousePress(AppElements_ViewWindow*, QMouseEvent*)));
212
213   connect(aViewer, SIGNAL(mouseRelease(AppElements_ViewWindow*, QMouseEvent*)), this,
214           SLOT(onMouseRelease(AppElements_ViewWindow*, QMouseEvent*)));
215
216   connect(aViewer, SIGNAL(mouseDoubleClick(AppElements_ViewWindow*, QMouseEvent*)), this,
217           SLOT(onMouseDoubleClick(AppElements_ViewWindow*, QMouseEvent*)));
218
219   connect(aViewer, SIGNAL(mouseMove(AppElements_ViewWindow*, QMouseEvent*)), this,
220           SLOT(onMouseMove(AppElements_ViewWindow*, QMouseEvent*)));
221
222   connect(aViewer, SIGNAL(keyPress(AppElements_ViewWindow*, QKeyEvent*)), this,
223           SLOT(onKeyPress(AppElements_ViewWindow*, QKeyEvent*)));
224
225   connect(aViewer, SIGNAL(keyRelease(AppElements_ViewWindow*, QKeyEvent*)), this,
226           SLOT(onKeyRelease(AppElements_ViewWindow*, QKeyEvent*)));
227
228   connect(aViewer, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
229   connect(aViewer, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
230           SIGNAL(contextMenuRequested(QContextMenuEvent*)));
231 #endif
232 }
233
234 bool XGUI_ViewerProxy::eventFilter(QObject *theObject, QEvent *theEvent)
235 {
236   if (theEvent->type() == QEvent::Enter) {
237     emit enterViewPort();
238   }
239   else if (theEvent->type() == QEvent::Leave) {
240     emit leaveViewPort();
241   }
242   return ModuleBase_IViewer::eventFilter(theObject, theEvent);
243 }
244
245 void XGUI_ViewerProxy::onViewCreated(ModuleBase_IViewWindow* theWnd)
246 {
247   theWnd->viewPort()->installEventFilter(this);
248   myWindowScale.insert (theWnd->v3dView(), theWnd->v3dView()->Camera()->Scale());
249   emit viewCreated(theWnd);
250 }
251
252 #ifndef HAVE_SALOME
253 void XGUI_ViewerProxy::onTryCloseView(AppElements_ViewWindow* theWnd)
254 {
255   emit tryCloseView(theWnd);
256 }
257
258 void XGUI_ViewerProxy::onDeleteView(AppElements_ViewWindow* theWnd)
259 {
260   if (myWindowScale.contains(theWnd->v3dView()))
261     myWindowScale.remove (theWnd->v3dView());
262   emit deleteView(theWnd);
263 }
264
265 void XGUI_ViewerProxy::onViewCreated(AppElements_ViewWindow* theWnd)
266 {
267   theWnd->viewPort()->installEventFilter(this);
268
269   connect(theWnd, SIGNAL(vpTransformationFinished(AppElements_ViewWindow::OperationType)),
270     this, SLOT(onViewTransformed(AppElements_ViewWindow::OperationType)));
271
272   myWindowScale.insert (theWnd->v3dView(), theWnd->v3dView()->Camera()->Scale());
273
274   emit viewCreated(theWnd);
275 }
276
277 void XGUI_ViewerProxy::onActivated(AppElements_ViewWindow* theWnd)
278 {
279   emit activated(theWnd);
280 }
281
282 void XGUI_ViewerProxy::onMousePress(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
283 {
284   emit mousePress(theWnd, theEvent);
285 }
286
287 void XGUI_ViewerProxy::onMouseRelease(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
288 {
289   emit mouseRelease(theWnd, theEvent);
290 }
291
292 void XGUI_ViewerProxy::onMouseDoubleClick(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
293 {
294   emit mouseDoubleClick(theWnd, theEvent);
295 }
296
297 void XGUI_ViewerProxy::onMouseMove(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
298 {
299   if (theEvent->buttons() != Qt::NoButton)
300     eraseHighlight();
301   else {
302     if (myIs2dMode) {
303       bool aHighlight2d =
304         ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "highlighting-2d", true);
305       if (aHighlight2d) {
306         if (myShowHighlight)
307           eraseHighlight();
308         else
309           updateHighlight();
310       }
311       else {
312         if (myShowHighlight)
313           updateHighlight();
314         else
315           eraseHighlight();
316       }
317     }
318     else {
319       bool aHighlight3d =
320         ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "highlighting-3d", false);
321       if (aHighlight3d) {
322         if (myShowHighlight)
323           eraseHighlight();
324         else
325           updateHighlight();
326       }
327       else {
328         if (myShowHighlight)
329           updateHighlight();
330         else
331           eraseHighlight();
332       }
333     }
334   }
335   emit mouseMove(theWnd, theEvent);
336 }
337
338 void XGUI_ViewerProxy::onKeyPress(AppElements_ViewWindow* theWnd, QKeyEvent* theEvent)
339 {
340   myShowHighlight = theEvent->key() == Qt::Key_H;
341   emit keyPress(theWnd, theEvent);
342 }
343
344 void XGUI_ViewerProxy::onKeyRelease(AppElements_ViewWindow* theWnd, QKeyEvent* theEvent)
345 {
346   if (theEvent->key() == Qt::Key_H) {
347     myShowHighlight = false;
348   }
349   emit keyRelease(theWnd, theEvent);
350 }
351
352 void XGUI_ViewerProxy::onViewTransformed(AppElements_ViewWindow::OperationType theType)
353 {
354   emit viewTransformed((int) theType);
355 }
356
357 #endif
358
359
360 //***************************************
361 void XGUI_ViewerProxy::enableSelection(bool isEnabled)
362 {
363 #ifdef HAVE_SALOME
364   myWorkshop->salomeConnector()->viewer()->enableSelection(isEnabled);
365 #else
366   myWorkshop->mainWindow()->viewer()->setSelectionEnabled(isEnabled);
367 #endif
368 }
369
370 //***************************************
371 bool XGUI_ViewerProxy::isSelectionEnabled() const
372 {
373 #ifdef HAVE_SALOME
374   return myWorkshop->salomeConnector()->viewer()->isSelectionEnabled();
375 #else
376   return myWorkshop->mainWindow()->viewer()->isSelectionEnabled();
377 #endif
378 }
379
380 //***************************************
381 void XGUI_ViewerProxy::enableMultiselection(bool isEnable)
382 {
383 #ifdef HAVE_SALOME
384   myWorkshop->salomeConnector()->viewer()->enableMultiselection(isEnable);
385 #else
386   myWorkshop->mainWindow()->viewer()->setMultiSelectionEnabled(isEnable);
387 #endif
388 }
389
390 //***************************************
391 bool XGUI_ViewerProxy::isMultiSelectionEnabled() const
392 {
393 #ifdef HAVE_SALOME
394   return myWorkshop->salomeConnector()->viewer()->isMultiSelectionEnabled();
395 #else
396   return myWorkshop->mainWindow()->viewer()->isMultiSelectionEnabled();
397 #endif
398 }
399
400 //***************************************
401 bool XGUI_ViewerProxy::enableDrawMode(bool isEnabled)
402 {
403 #ifdef HAVE_SALOME
404   return myWorkshop->salomeConnector()->viewer()->enableDrawMode(isEnabled);
405 #else
406   return myWorkshop->mainWindow()->viewer()->enableDrawMode(isEnabled);
407 #endif
408 }
409
410 //***************************************
411 void XGUI_ViewerProxy::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
412 {
413   myWorkshop->displayer()->addSelectionFilter(theFilter);
414 }
415
416 //***************************************
417 void XGUI_ViewerProxy::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
418 {
419   myWorkshop->displayer()->removeSelectionFilter(theFilter);
420 }
421
422 //***************************************
423 bool XGUI_ViewerProxy::hasSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
424 {
425   return myWorkshop->displayer()->hasSelectionFilter(theFilter);
426 }
427
428 //***************************************
429 void XGUI_ViewerProxy::clearSelectionFilters()
430 {
431   myWorkshop->displayer()->removeFilters();
432 }
433
434 //***************************************
435 void XGUI_ViewerProxy::update()
436 {
437   myWorkshop->displayer()->updateViewer();
438 }
439
440 //***************************************
441 bool XGUI_ViewerProxy::canDragByMouse() const
442 {
443   if (myWorkshop->isSalomeMode()) {
444     ModuleBase_IViewer* aViewer = myWorkshop->salomeConnector()->viewer();
445     return aViewer->canDragByMouse();
446   } else {
447     return true;
448   }
449 }
450
451 //***************************************
452 void XGUI_ViewerProxy::displayHighlight(FeaturePtr theFeature, const TopoDS_Shape& theIgnoreShape)
453 {
454   Handle(AIS_InteractiveContext) aContext = AISContext();
455
456   double aDeflection;
457   if (theFeature.get()) {
458     std::list<ResultPtr> aResults = theFeature->results();
459     std::list<ResultPtr>::const_iterator aIt;
460     XGUI_Displayer* aDisplayer = myWorkshop->displayer();
461     ResultPtr aRes;
462     Handle(AIS_InteractiveObject) anAISIO;
463     Handle(AIS_Shape) aAis;
464     for (aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) {
465       aRes = (*aIt);
466       TopoDS_Shape aTShape = aRes->shape()->impl<TopoDS_Shape>();
467       if (!aTShape.IsSame(theIgnoreShape)) {
468         anAISIO = aDisplayer->getAISObject(aRes)->impl<Handle(AIS_InteractiveObject)>();
469         if (!anAISIO.IsNull()) {
470           aAis = new AIS_Shape(aTShape);
471           aAis->SetColor(HIGHLIGHT_COLOR);
472           aAis->SetZLayer(Graphic3d_ZLayerId_Top); //Graphic3d_ZLayerId_Topmost
473           aDeflection = anAISIO->Attributes()->DeviationCoefficient();
474           aAis->Attributes()->SetDeviationCoefficient(aDeflection);
475           aAis->Attributes()->SetIsoOnPlane(false);
476           myHighlights.Append(aAis);
477           aContext->Display(aAis, false);
478           aContext->Deactivate(aAis);
479         }
480       }
481     }
482   }
483 }
484
485 bool XGUI_ViewerProxy::eraseHighlight()
486 {
487   Handle(AIS_InteractiveContext) aContext = AISContext();
488   Handle(AIS_InteractiveObject) anAISIO;
489   AIS_ListIteratorOfListOfInteractive aLIt;
490   bool isErased = myHighlights.Extent() > 0;
491   for (aLIt.Initialize(myHighlights); aLIt.More(); aLIt.Next()) {
492     anAISIO = aLIt.Value();
493     aContext->Remove(anAISIO, false);
494   }
495   myHighlights.Clear();
496   return isErased;
497 }
498
499 void XGUI_ViewerProxy::updateHighlight()
500 {
501   Handle(AIS_InteractiveContext) aContext = AISContext();
502   if (!aContext.IsNull()) {
503     Handle(StdSelect_BRepOwner) aOwner;
504     Handle(AIS_InteractiveObject) anIO;
505     bool isDisplayed = false;
506     TopoDS_Shape aShape, aShp;
507     ResultPtr aRes;
508     XGUI_Displayer* aDisplayer = myWorkshop->displayer();
509     for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) {
510       aOwner = Handle(StdSelect_BRepOwner)::DownCast(aContext->DetectedOwner());
511       if ((!aOwner.IsNull()) && aOwner->HasShape()) {
512         aShape = aOwner->Shape();
513         anIO = Handle(AIS_InteractiveObject)::DownCast(aOwner->Selectable());
514         aRes = std::dynamic_pointer_cast<ModelAPI_Result>(aDisplayer->getObject(anIO));
515         if (aRes.get() && (aRes != myResult)) {
516           eraseHighlight();
517           FeaturePtr aFeature = ModelAPI_Feature::feature(aRes);
518           aShp = aRes->shape()->impl<TopoDS_Shape>();
519           if ((aFeature->results().size() > 1) || (!aShp.IsSame(aShape))) {
520             myResult = aRes;
521             displayHighlight(aFeature, aShape);
522           }
523           else {
524             myResult = ResultPtr();
525           }
526           update();
527         }
528         isDisplayed = aRes.get();
529       }
530     }
531     if (!isDisplayed) {
532       if (eraseHighlight()) {
533         update();
534       }
535       myResult = ResultPtr();
536     }
537   }
538 }
539
540 #ifdef HAVE_SALOME
541 void XGUI_ViewerProxy::onMouseMove(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
542 {
543   if (theEvent->buttons() != Qt::NoButton)
544     eraseHighlight();
545   else {
546     if (myIs2dMode) {
547       bool aHighlight2d =
548         ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "highlighting-2d", true);
549       if (aHighlight2d) {
550         if (myShowHighlight)
551           eraseHighlight();
552         else
553           updateHighlight();
554       }
555       else {
556         if (myShowHighlight)
557           updateHighlight();
558         else
559           eraseHighlight();
560       }
561     }
562     else {
563       bool aHighlight3d =
564         ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "highlighting-3d", false);
565       if (aHighlight3d) {
566         if (myShowHighlight)
567           eraseHighlight();
568         else
569           updateHighlight();
570       }
571       else {
572         if (myShowHighlight)
573           updateHighlight();
574         else
575           eraseHighlight();
576       }
577     }
578   }
579   emit mouseMove(theWnd, theEvent);
580 }
581
582 void XGUI_ViewerProxy::onKeyPress(ModuleBase_IViewWindow* theWnd, QKeyEvent* theEvent)
583 {
584   myShowHighlight = theEvent->key() == Qt::Key_H;
585   emit keyPress(theWnd, theEvent);
586 }
587
588 void XGUI_ViewerProxy::onKeyRelease(ModuleBase_IViewWindow* theWnd, QKeyEvent* theEvent)
589 {
590   if (theEvent->key() == Qt::Key_H) {
591     myShowHighlight = false;
592   }
593   emit keyRelease(theWnd, theEvent);
594 }
595 #endif
596
597
598 bool XGUI_ViewerProxy::isColorScaleVisible() const
599 {
600 #ifdef HAVE_SALOME
601   return myWorkshop->salomeConnector()->viewer()->isColorScaleVisible();
602 #else
603   return myWorkshop->mainWindow()->viewer()->isColorScaleVisible();
604 #endif
605 }
606
607 void XGUI_ViewerProxy::setColorScaleShown(bool on)
608 {
609 #ifdef HAVE_SALOME
610   myWorkshop->salomeConnector()->viewer()->setColorScaleShown(on);
611 #else
612   myWorkshop->mainWindow()->viewer()->setColorScaleShown(on);
613 #endif
614 }
615
616 void XGUI_ViewerProxy::setColorScalePosition(double theX, double theY)
617 {
618 #ifdef HAVE_SALOME
619   myWorkshop->salomeConnector()->viewer()->setColorScalePosition(theX, theY);
620 #else
621   QWidget* aWindow = activeViewPort();
622   Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
623   aColorScale->SetPosition(aWindow->width() * theX, aWindow->height() * theY);
624 #endif
625 }
626
627 void XGUI_ViewerProxy::setColorScaleSize(double theW, double theH)
628 {
629 #ifdef HAVE_SALOME
630   myWorkshop->salomeConnector()->viewer()->setColorScaleSize(theW, theH);
631 #else
632   QWidget* aWindow = activeViewPort();
633   Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
634   aColorScale->SetSize(aWindow->width() * theW, aWindow->height() * theH);
635 #endif
636 }
637
638 void XGUI_ViewerProxy::setColorScaleRange(double theMin, double theMax)
639 {
640 #ifdef HAVE_SALOME
641   myWorkshop->salomeConnector()->viewer()->setColorScaleRange(theMin, theMax);
642 #else
643   Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
644   aColorScale->SetRange(theMin, theMax);
645 #endif
646 }
647
648 void XGUI_ViewerProxy::setColorScaleIntervals(int theNb)
649 {
650 #ifdef HAVE_SALOME
651   myWorkshop->salomeConnector()->viewer()->setColorScaleIntervals(theNb);
652 #else
653   Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
654   aColorScale->SetNumberOfIntervals(theNb);
655 #endif
656 }
657
658 void XGUI_ViewerProxy::setColorScaleTextColor(const QColor& theColor)
659 {
660 #ifdef HAVE_SALOME
661   myWorkshop->salomeConnector()->viewer()->setColorScaleTextColor(theColor);
662 #else
663   Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
664   Quantity_Color aColor(theColor.redF(), theColor.greenF(), theColor.blueF(), Quantity_TOC_RGB);
665   aColorScale->SetColor(aColor);
666 #endif
667 }
668
669
670 void XGUI_ViewerProxy::setColorScaleTextHeigth(int theH)
671 {
672 #ifdef HAVE_SALOME
673   myWorkshop->salomeConnector()->viewer()->setColorScaleTextHeigth(theH);
674 #else
675   Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
676   aColorScale->SetTextHeight(theH);
677 #endif
678 }
679
680 void XGUI_ViewerProxy::setColorScaleTitle(const QString& theText)
681 {
682 #ifdef HAVE_SALOME
683   myWorkshop->salomeConnector()->viewer()->setColorScaleTitle(theText);
684 #else
685   Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
686   aColorScale->SetTitle(theText.toStdString().c_str());
687 #endif
688 }
689
690
691 //******************************************************
692 void XGUI_ViewerProxy::setupColorScale()
693 {
694   SUIT_ResourceMgr* aResMgr = ModuleBase_Preferences::resourceMgr();
695   double aX = aResMgr->doubleValue("Viewer", "scalar_bar_x_position", 0.03);
696   double aY = aResMgr->doubleValue("Viewer", "scalar_bar_y_position", 0.35);
697   setColorScalePosition(aX, aY);
698
699   double aW = aResMgr->doubleValue("Viewer", "scalar_bar_width", 0.2);
700   double aH = aResMgr->doubleValue("Viewer", "scalar_bar_height", 0.5);
701   setColorScaleSize(aW, aH);
702
703   QColor aColor = aResMgr->colorValue("Viewer", "scalar_bar_text_color", Qt::black);
704   setColorScaleTextColor(aColor);
705
706   int aT = aResMgr->integerValue("Viewer", "scalar_bar_text_height", 14);
707   setColorScaleTextHeigth(aT);
708
709   int aN = aResMgr->integerValue("Viewer", "scalar_bar_nb_intervals", 20);
710   setColorScaleIntervals(aN);
711 }
712
713
714 //***************************************
715 //void XGUI_ViewerProxy::Zfitall()
716 //{
717 //#ifdef HAVE_SALOME
718 //  myWorkshop->salomeConnector()->viewer()->Zfitall();
719 //#else
720 //  AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
721 //  AppElements_ViewWindow* aView = aViewer->activeViewWindow();
722 //  if (aView) {
723 //    Handle(V3d_View) aView3d = aView->v3dView();
724 //    aView3d->ZFitAll();
725 //    if (aView3d->Depth() < 0.1)
726 //      aView3d->DepthFitAll();
727 //  }
728 //#endif
729 //}
730
731
732 #ifdef HAVE_SALOME
733 void XGUI_ViewerProxy::setFitter(OCCViewer_Fitter* theFitter)
734 {
735   myWorkshop->salomeConnector()->viewer()->setFitter(theFitter);
736 }
737
738 OCCViewer_Fitter* XGUI_ViewerProxy::fitter() const
739 {
740   return myWorkshop->salomeConnector()->viewer()->fitter();
741 }
742 #else
743 void XGUI_ViewerProxy::setFitter(AppElements_Fitter* theFitter)
744 {
745   myWorkshop->mainWindow()->viewer()->setFitter(theFitter);
746 }
747
748 AppElements_Fitter* XGUI_ViewerProxy::fitter() const
749 {
750   return myWorkshop->mainWindow()->viewer()->fitter();
751 }
752 #endif