0029367: Visualization - simplify interface of V3d_View and V3d_Viewer
[occt.git] / tools / View / View_Displayer.cxx
1 // Created on: 2017-06-16
2 // Created by: Natalia ERMOLAEVA
3 // Copyright (c) 2017 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement. 
15
16 #include <inspector/View_Displayer.hxx>
17
18 #include <AIS_InteractiveContext.hxx>
19 #include <AIS_InteractiveObject.hxx>
20 #include <AIS_ListIteratorOfListOfInteractive.hxx>
21 #include <AIS_Shape.hxx>
22 #include <AIS_Trihedron.hxx>
23 #include <Prs3d_PointAspect.hxx>
24 #include <V3d_View.hxx>
25 #include <V3d_Viewer.hxx>
26 #include <inspector/View_Viewer.hxx>
27 #include <inspector/View_Widget.hxx>
28
29 // =======================================================================
30 // function : Constructor
31 // purpose :
32 // =======================================================================
33 View_Displayer::View_Displayer()
34 : myIsKeepPresentations (false), myFitAllActive (false), myDisplayMode (-1)
35 {
36 }
37
38 // =======================================================================
39 // function : SetContext
40 // purpose :
41 // =======================================================================
42 void View_Displayer::SetContext (const Handle(AIS_InteractiveContext)& theContext)
43 {
44   NCollection_DataMap<View_PresentationType, NCollection_Shared<AIS_ListOfInteractive> > aDisplayed = myDisplayed;
45   EraseAllPresentations (true);
46   myContext = theContext;
47
48   for (NCollection_DataMap<View_PresentationType, NCollection_Shared<AIS_ListOfInteractive> >::Iterator aDisplayedIt(aDisplayed);
49     aDisplayedIt.More(); aDisplayedIt.Next())
50   {
51     View_PresentationType aType = aDisplayedIt.Key();
52     for (AIS_ListIteratorOfListOfInteractive aPresentationsIt (aDisplayedIt.Value());
53          aPresentationsIt.More(); aPresentationsIt.Next())
54       DisplayPresentation (aPresentationsIt.Value(), aType, false);
55   }
56   UpdateViewer();
57 }
58
59 // =======================================================================
60 // function : SetDisplayMode
61 // purpose :
62 // =======================================================================
63 void View_Displayer::SetDisplayMode (const int theDisplayMode,
64                                      const View_PresentationType theType,
65                                      const bool theToUpdateViewer)
66 {
67   myDisplayMode = theDisplayMode;
68   if (GetContext().IsNull())
69     return;
70
71   NCollection_Shared<AIS_ListOfInteractive> aDisplayed;
72   DisplayedPresentations (aDisplayed, theType);
73
74   for (AIS_ListIteratorOfListOfInteractive aDisplayedIt (aDisplayed); aDisplayedIt.More(); aDisplayedIt.Next())
75     GetContext()->SetDisplayMode (aDisplayedIt.Value(), theDisplayMode, Standard_False);
76
77   if (theToUpdateViewer)
78     UpdateViewer();
79 }
80
81 // =======================================================================
82 // function : DisplayPresentation
83 // purpose :
84 // =======================================================================
85 void View_Displayer::DisplayPresentation (const Handle(Standard_Transient)& thePresentation,
86                                           const View_PresentationType theType,
87                                           const bool theToUpdateViewer)
88 {
89   if (GetContext().IsNull())
90     return;
91
92   NCollection_Shared<AIS_ListOfInteractive> aDisplayed;
93   DisplayedPresentations (aDisplayed, theType);
94   if (!myIsKeepPresentations)
95     ErasePresentations (theType, false);
96
97   Handle(AIS_InteractiveObject) aPresentation = Handle(AIS_InteractiveObject)::DownCast (thePresentation);
98   if (!aPresentation.IsNull() && aPresentation->GetContext().IsNull())
99   {
100     // one presentation can not be shown in several contexts
101     if (theType == View_PresentationType_Additional)
102     {
103       Quantity_Color aColor;
104       if (myColorAttributes.Find (View_PresentationType_Additional, aColor))
105         aPresentation->SetColor (aColor);
106     }
107     GetContext()->Display (aPresentation, false);
108     if (myDisplayMode != -1)
109       GetContext()->SetDisplayMode (aPresentation, myDisplayMode, false);
110     aDisplayed.Append (aPresentation);
111   }
112
113   if (!myIsKeepPresentations || myFitAllActive)
114     fitAllView();
115
116   myDisplayed.Bind (theType, aDisplayed);
117
118   if (theToUpdateViewer)
119     UpdateViewer();
120 }
121
122 // =======================================================================
123 // function : RedisplayPresentation
124 // purpose :
125 // =======================================================================
126 void View_Displayer::RedisplayPresentation (const Handle(Standard_Transient)& thePresentation,
127                                             const bool theToUpdateViewer)
128 {
129   Handle(AIS_InteractiveObject) aPresentation = Handle(AIS_InteractiveObject)::DownCast (thePresentation);
130   if (aPresentation.IsNull() || aPresentation->GetContext().IsNull())
131     return;
132
133   GetContext()->Redisplay (aPresentation, false);
134
135   if (myFitAllActive)
136     fitAllView();
137
138   if (theToUpdateViewer)
139     UpdateViewer();
140 }
141
142 // =======================================================================
143 // function : EraseAllPresentations
144 // purpose :
145 // =======================================================================
146 void View_Displayer::EraseAllPresentations (const bool theToUpdateViewer)
147 {
148   for (NCollection_DataMap<View_PresentationType, NCollection_Shared<AIS_ListOfInteractive> >::Iterator aDisplayedIt(myDisplayed);
149        aDisplayedIt.More(); aDisplayedIt.Next())
150     ErasePresentations (aDisplayedIt.Key(), false);
151
152   if (theToUpdateViewer)
153     UpdateViewer();
154 }
155
156 // =======================================================================
157 // function : ErasePresentations
158 // purpose :
159 // =======================================================================
160 void View_Displayer::ErasePresentations (const View_PresentationType theType, const bool theToUpdateViewer)
161 {
162   if (GetContext().IsNull())
163     return;
164
165   NCollection_Shared<AIS_ListOfInteractive> aDisplayed;
166   DisplayedPresentations (aDisplayed, theType);
167
168   for (AIS_ListIteratorOfListOfInteractive aDisplayedIt (aDisplayed); aDisplayedIt.More(); aDisplayedIt.Next())
169   {
170     if (aDisplayedIt.Value()->IsKind(STANDARD_TYPE (AIS_Trihedron)))
171       continue;
172
173     GetContext()->Remove (aDisplayedIt.Value(), Standard_False);
174   }
175
176   aDisplayed.Clear();
177   myDisplayed.Bind (theType, aDisplayed);
178
179   if (theToUpdateViewer)
180     UpdateViewer();
181 }
182
183 // =======================================================================
184 // function : ErasePresentation
185 // purpose :
186 // =======================================================================
187 void View_Displayer::ErasePresentation (const Handle(Standard_Transient)& thePresentation,
188                                         const View_PresentationType theType,
189                                         const bool theToUpdateViewer)
190 {
191   if (GetContext().IsNull())
192     return;
193
194   Handle(AIS_InteractiveObject) aPresentation = Handle(AIS_InteractiveObject)::DownCast (thePresentation);
195   if (aPresentation.IsNull())
196     return;
197
198   GetContext()->Remove (aPresentation, Standard_False);
199
200   NCollection_Shared<AIS_ListOfInteractive> aDisplayed;
201   DisplayedPresentations (aDisplayed, theType);
202   aDisplayed.Remove (aPresentation);
203   myDisplayed.Bind (theType, aDisplayed);
204
205   if (myFitAllActive)
206     fitAllView();
207
208   if (theToUpdateViewer)
209     UpdateViewer();
210 }
211
212 // =======================================================================
213 // function : SetVisible
214 // purpose :
215 // =======================================================================
216 void View_Displayer::SetVisible (const TopoDS_Shape& theShape, const bool theState, const View_PresentationType theType)
217 {
218   if (theShape.IsNull())
219     return;
220
221   if (theState)
222     DisplayPresentation (CreatePresentation (theShape), View_PresentationType_Main, Standard_False);
223   else
224   {
225     Handle(AIS_InteractiveObject) aPresentation = FindPresentation (theShape, theType);
226     if (!aPresentation.IsNull())
227       ErasePresentation (aPresentation, theType, Standard_False);
228   }
229
230   UpdateViewer();
231 }
232
233 // =======================================================================
234 // function : IsVisible
235 // purpose :
236 // =======================================================================
237 bool View_Displayer::IsVisible (const TopoDS_Shape& theShape, const View_PresentationType theType) const
238 {
239   Handle(AIS_InteractiveObject) aPresentation = FindPresentation (theShape, theType);
240   return !aPresentation.IsNull();
241 }
242
243 // =======================================================================
244 // function : UpdateViewer
245 // purpose :
246 // =======================================================================
247 void View_Displayer::UpdateViewer()
248 {
249   if (GetContext().IsNull())
250     return;
251
252   GetContext()->UpdateCurrentViewer();
253 }
254
255 // =======================================================================
256 // function : SetAttributeColor
257 // purpose :
258 // =======================================================================
259 void View_Displayer::SetAttributeColor (const Quantity_Color& theColor, const View_PresentationType theType)
260 {
261   myColorAttributes.Bind (theType, theColor);
262 }
263
264 // =======================================================================
265 // function : DisplayedPresentations
266 // purpose :
267 // =======================================================================
268 void View_Displayer::DisplayedPresentations (NCollection_Shared<AIS_ListOfInteractive>& thePresentations,
269                                              const View_PresentationType theType) const
270 {
271   myDisplayed.Find (theType, thePresentations);
272 }
273
274 // =======================================================================
275 // function : getView
276 // purpose :
277 // =======================================================================
278 Handle(V3d_View) View_Displayer::GetView() const
279 {
280   Handle(V3d_View) aView;
281   if (GetContext().IsNull())
282     return aView;
283
284   const Handle(V3d_Viewer)& aViewer = GetContext()->CurrentViewer();
285   if (!aViewer.IsNull())
286   {
287     if (!aViewer->ActiveViews().IsEmpty())
288     {
289       aView = aViewer->ActiveViews().First();
290     }
291   }
292   return aView;
293 }
294
295 // =======================================================================
296 // function : FindPresentation
297 // purpose :
298 // =======================================================================
299 Handle(AIS_InteractiveObject) View_Displayer::FindPresentation (const TopoDS_Shape& theShape,
300                                                                 const View_PresentationType theType) const
301 {
302   if (theShape.IsNull())
303     return Handle(AIS_InteractiveObject)();
304
305   NCollection_Shared<AIS_ListOfInteractive> aDisplayed;
306   DisplayedPresentations (aDisplayed, theType);
307
308   for (AIS_ListIteratorOfListOfInteractive aDisplayedIt (aDisplayed); aDisplayedIt.More(); aDisplayedIt.Next())
309   {
310     Handle(AIS_Shape) aPresentation = Handle(AIS_Shape)::DownCast (aDisplayedIt.Value());
311     if (aPresentation->Shape().IsEqual (theShape))
312       return aPresentation;
313   }
314
315   return Handle(AIS_InteractiveObject)();
316 }
317
318 // =======================================================================
319 // function : CreatePresentation
320 // purpose :
321 // =======================================================================
322 Handle(Standard_Transient) View_Displayer::CreatePresentation (const TopoDS_Shape& theShape)
323 {
324   Handle(AIS_Shape) aShape = new AIS_Shape (theShape);
325
326   aShape->Attributes()->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, Quantity_NOC_WHITE, 1.0));
327
328   return aShape;
329 }
330
331 // =======================================================================
332 // function : fitAllView
333 // purpose :
334 // =======================================================================
335 void  View_Displayer::fitAllView()
336 {
337   Handle(V3d_View) aView = GetView();
338   if (!aView.IsNull())
339   {
340     aView->FitAll();
341     aView->Redraw();
342   }
343 }