0030773: Application Framework - To allow to inherit existing attributes to reuse...
[occt.git] / src / XCAFDoc / XCAFDoc_ViewTool.cxx
1 // Created on: 2016-10-19
2 // Created by: Irina KRYLOVA
3 // Copyright (c) 2016 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 <XCAFDoc_ViewTool.hxx>
17
18 #include <Standard_GUID.hxx>
19 #include <Standard_Type.hxx>
20 #include <TDataStd_Name.hxx>
21 #include <TDataStd_TreeNode.hxx>
22 #include <TDataStd_UAttribute.hxx>
23 #include <TDF_Attribute.hxx>
24 #include <TDF_ChildIDIterator.hxx>
25 #include <TDF_Label.hxx>
26 #include <XCAFDoc.hxx>
27 #include <XCAFDoc_DocumentTool.hxx>
28 #include <XCAFDoc_GraphNode.hxx>
29 #include <XCAFDoc_ShapeTool.hxx>
30 #include <XCAFDoc_View.hxx>
31
32 IMPLEMENT_DERIVED_ATTRIBUTE_WITH_TYPE(XCAFDoc_ViewTool,TDataStd_GenericEmpty,"xcaf","ViewTool")
33
34 //=======================================================================
35 //function : XCAFDoc_ViewTool
36 //purpose  : 
37 //=======================================================================
38 XCAFDoc_ViewTool::XCAFDoc_ViewTool()
39 {
40 }
41
42
43 //=======================================================================
44 //function : Set
45 //purpose  : 
46 //=======================================================================
47 Handle(XCAFDoc_ViewTool) XCAFDoc_ViewTool::Set(const TDF_Label& L) 
48 {
49   Handle(XCAFDoc_ViewTool) A;
50   if (!L.FindAttribute (XCAFDoc_ViewTool::GetID(), A)) {
51     A = new XCAFDoc_ViewTool ();
52     L.AddAttribute(A);
53   }
54   return A;
55 }
56
57
58 //=======================================================================
59 //function : GetID
60 //purpose  : 
61 //=======================================================================
62 const Standard_GUID& XCAFDoc_ViewTool::GetID() 
63 {
64   static Standard_GUID ViewToolID ("efd213e4-6dfd-11d4-b9c8-0060b0ee281b");
65   return ViewToolID; 
66 }
67
68
69 //=======================================================================
70 //function : BaseLabel
71 //purpose  : 
72 //=======================================================================
73 TDF_Label XCAFDoc_ViewTool::BaseLabel() const
74 {
75   return Label();
76 }
77
78 //=======================================================================
79 //function : IsView
80 //purpose  : 
81 //=======================================================================
82 Standard_Boolean XCAFDoc_ViewTool::IsView(const TDF_Label& theLabel) const
83 {
84   Handle(XCAFDoc_View) aViewAttr;
85   if(theLabel.FindAttribute(XCAFDoc_View::GetID(), aViewAttr)) {
86     return Standard_True;
87   }
88   return Standard_False;
89 }
90
91 //=======================================================================
92 //function : GetViewLabels
93 //purpose  : 
94 //=======================================================================
95 void XCAFDoc_ViewTool::GetViewLabels(TDF_LabelSequence& theLabels) const
96 {
97   theLabels.Clear();
98   TDF_ChildIterator aChildIterator( Label() ); 
99   for (; aChildIterator.More(); aChildIterator.Next()) {
100     TDF_Label aLabel = aChildIterator.Value();
101     if ( IsView(aLabel)) theLabels.Append(aLabel);
102   }
103 }
104
105 //=======================================================================
106 //function : AddView
107 //purpose  : 
108 //=======================================================================
109 TDF_Label XCAFDoc_ViewTool::AddView()
110 {
111   TDF_Label aViewL;
112   TDF_TagSource aTag;
113   aViewL = aTag.NewChild ( Label() );
114   Handle(XCAFDoc_View) aView = XCAFDoc_View::Set(aViewL);
115   TCollection_AsciiString aStr = "View";
116   TDataStd_Name::Set(aViewL, aStr);
117   return aViewL;
118 }
119
120 //=======================================================================
121 //function : SetView
122 //purpose  : 
123 //=======================================================================
124 void XCAFDoc_ViewTool::SetView(const TDF_LabelSequence& theShapes,
125                                const TDF_LabelSequence& theGDTs,
126                                const TDF_LabelSequence& theClippingPlanes,
127                                const TDF_LabelSequence& theNotes,
128                                const TDF_LabelSequence& theAnnotations,
129                                const TDF_Label& theViewL) const
130 {
131   if (!IsView(theViewL))
132     return;
133
134   Handle(XCAFDoc_GraphNode) aChGNode;
135   Handle(XCAFDoc_GraphNode) aShapeGNode;
136   Handle(XCAFDoc_GraphNode) aGDTGNode;
137   Handle(XCAFDoc_GraphNode) aPlaneGNode;
138   Handle(XCAFDoc_GraphNode) aNoteGNode;
139   Handle(XCAFDoc_GraphNode) aAnnotGNode;
140
141   if (theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode)) {
142     while (aChGNode->NbFathers() > 0) {
143       aShapeGNode = aChGNode->GetFather(1);
144       aShapeGNode->UnSetChild(aChGNode);
145       if (aShapeGNode->NbChildren() == 0)
146         aShapeGNode->ForgetAttribute(XCAFDoc::ViewRefShapeGUID());
147     }
148     theViewL.ForgetAttribute(XCAFDoc::ViewRefShapeGUID());
149   }
150   if (theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aChGNode)) {
151     while (aChGNode->NbFathers() > 0) {
152       aGDTGNode = aChGNode->GetFather(1);
153       aGDTGNode->UnSetChild(aChGNode);
154       if (aGDTGNode->NbChildren() == 0)
155         aGDTGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
156     }
157     theViewL.ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
158   }
159   if (theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode)) {
160     while (aChGNode->NbFathers() > 0) {
161       aPlaneGNode = aChGNode->GetFather(1);
162       aPlaneGNode->UnSetChild(aChGNode);
163       if (aPlaneGNode->NbChildren() == 0)
164         aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
165     }
166     theViewL.ForgetAttribute(XCAFDoc::ViewRefPlaneGUID());
167   }
168   if (theViewL.FindAttribute(XCAFDoc::ViewRefNoteGUID(), aChGNode)) {
169     while (aChGNode->NbFathers() > 0) {
170       aPlaneGNode = aChGNode->GetFather(1);
171       aPlaneGNode->UnSetChild(aChGNode);
172       if (aPlaneGNode->NbChildren() == 0)
173         aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefNoteGUID());
174     }
175     theViewL.ForgetAttribute(XCAFDoc::ViewRefNoteGUID());
176   }
177   if (theViewL.FindAttribute(XCAFDoc::ViewRefAnnotationGUID(), aChGNode)) {
178     while (aChGNode->NbFathers() > 0) {
179       aPlaneGNode = aChGNode->GetFather(1);
180       aPlaneGNode->UnSetChild(aChGNode);
181       if (aPlaneGNode->NbChildren() == 0)
182         aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefAnnotationGUID());
183     }
184     theViewL.ForgetAttribute(XCAFDoc::ViewRefAnnotationGUID());
185   }
186
187   if (!theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode) && theShapes.Length() > 0) {
188     aChGNode = new XCAFDoc_GraphNode;
189     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
190     aChGNode->SetGraphID(XCAFDoc::ViewRefShapeGUID());
191   }
192   for (Standard_Integer i = theShapes.Lower(); i <= theShapes.Upper(); i++)
193   {
194     if (!theShapes.Value(i).FindAttribute(XCAFDoc::ViewRefShapeGUID(), aShapeGNode)) {
195       aShapeGNode = new XCAFDoc_GraphNode;
196       aShapeGNode = XCAFDoc_GraphNode::Set(theShapes.Value(i));
197     }
198     aShapeGNode->SetGraphID(XCAFDoc::ViewRefShapeGUID());
199     aShapeGNode->SetChild(aChGNode);
200     aChGNode->SetFather(aShapeGNode);
201   }
202
203   if (!theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aChGNode) && theGDTs.Length() > 0) {
204     aChGNode = new XCAFDoc_GraphNode;
205     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
206     aChGNode->SetGraphID(XCAFDoc::ViewRefGDTGUID());
207   }
208   for (Standard_Integer i = theGDTs.Lower(); i <= theGDTs.Upper(); i++)
209   {
210     if (!theGDTs.Value(i).FindAttribute(XCAFDoc::ViewRefGDTGUID(), aGDTGNode)) {
211       aGDTGNode = new XCAFDoc_GraphNode;
212       aGDTGNode = XCAFDoc_GraphNode::Set(theGDTs.Value(i));
213     }
214     aGDTGNode->SetGraphID(XCAFDoc::ViewRefGDTGUID());
215     aGDTGNode->SetChild(aChGNode);
216     aChGNode->SetFather(aGDTGNode);
217   }
218
219   if (!theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode) && theClippingPlanes.Length() > 0) {
220     aChGNode = new XCAFDoc_GraphNode;
221     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
222     aChGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
223   }
224   for (Standard_Integer i = theClippingPlanes.Lower(); i <= theClippingPlanes.Upper(); i++)
225   {
226     if (!theClippingPlanes.Value(i).FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aPlaneGNode)) {
227       aPlaneGNode = new XCAFDoc_GraphNode;
228       aPlaneGNode = XCAFDoc_GraphNode::Set(theClippingPlanes.Value(i));
229     }
230     aPlaneGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
231     aPlaneGNode->SetChild(aChGNode);
232     aChGNode->SetFather(aPlaneGNode);
233   }
234
235   if (!theViewL.FindAttribute(XCAFDoc::ViewRefNoteGUID(), aChGNode) && theNotes.Length() > 0) {
236     aChGNode = new XCAFDoc_GraphNode;
237     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
238     aChGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
239   }
240   for (Standard_Integer i = theNotes.Lower(); i <= theNotes.Upper(); i++)
241   {
242     if (!theNotes.Value(i).FindAttribute(XCAFDoc::ViewRefNoteGUID(), aNoteGNode)) {
243       aNoteGNode = new XCAFDoc_GraphNode;
244       aNoteGNode = XCAFDoc_GraphNode::Set(theNotes.Value(i));
245     }
246     aNoteGNode->SetGraphID(XCAFDoc::ViewRefNoteGUID());
247     aNoteGNode->SetChild(aChGNode);
248     aChGNode->SetFather(aNoteGNode);
249   }
250
251   if (!theViewL.FindAttribute(XCAFDoc::ViewRefAnnotationGUID(), aChGNode) && theAnnotations.Length() > 0) {
252     aChGNode = new XCAFDoc_GraphNode;
253     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
254     aChGNode->SetGraphID(XCAFDoc::ViewRefAnnotationGUID());
255   }
256   for (Standard_Integer i = theAnnotations.Lower(); i <= theAnnotations.Upper(); i++)
257   {
258     if (!theAnnotations.Value(i).FindAttribute(XCAFDoc::ViewRefAnnotationGUID(), aNoteGNode)) {
259       aAnnotGNode = new XCAFDoc_GraphNode;
260       aAnnotGNode = XCAFDoc_GraphNode::Set(theNotes.Value(i));
261     }
262     aAnnotGNode->SetGraphID(XCAFDoc::ViewRefAnnotationGUID());
263     aAnnotGNode->SetChild(aChGNode);
264     aChGNode->SetFather(aAnnotGNode);
265   }
266 }
267
268 //=======================================================================
269 //function : SetView
270 //purpose  : 
271 //=======================================================================
272 void XCAFDoc_ViewTool::SetView(const TDF_LabelSequence& theShapeLabels,
273                                const TDF_LabelSequence& theGDTLabels,
274                                const TDF_LabelSequence& theClippingPlaneLabels,
275                                const TDF_Label& theViewL) const
276 {
277   if(!IsView(theViewL))
278     return;
279
280   Handle(XCAFDoc_GraphNode) aChGNode;
281   Handle(XCAFDoc_GraphNode) aShapeGNode;
282   Handle(XCAFDoc_GraphNode) aGDTGNode;
283   Handle(XCAFDoc_GraphNode) aPlaneGNode;
284   
285   if ( theViewL.FindAttribute (XCAFDoc::ViewRefShapeGUID(), aChGNode) ) {
286     while (aChGNode->NbFathers() > 0) {
287       aShapeGNode = aChGNode->GetFather(1);
288       aShapeGNode->UnSetChild(aChGNode);
289       if(aShapeGNode->NbChildren() == 0)
290         aShapeGNode->ForgetAttribute( XCAFDoc::ViewRefShapeGUID() );
291     }
292     theViewL.ForgetAttribute ( XCAFDoc::ViewRefShapeGUID() );
293   }
294   if ( theViewL.FindAttribute (XCAFDoc::ViewRefGDTGUID(), aChGNode) ) {
295     while (aChGNode->NbFathers() > 0) {
296       aGDTGNode = aChGNode->GetFather(1);
297       aGDTGNode->UnSetChild(aChGNode);
298       if(aGDTGNode->NbChildren() == 0)
299         aGDTGNode->ForgetAttribute( XCAFDoc::ViewRefGDTGUID() );
300     }
301     theViewL.ForgetAttribute ( XCAFDoc::ViewRefGDTGUID() );
302   }
303   if (theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode)) {
304     while (aChGNode->NbFathers() > 0) {
305       aPlaneGNode = aChGNode->GetFather(1);
306       aPlaneGNode->UnSetChild(aChGNode);
307       if (aPlaneGNode->NbChildren() == 0)
308         aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
309     }
310     theViewL.ForgetAttribute(XCAFDoc::ViewRefPlaneGUID());
311   }
312   
313   if (!theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode) && theShapeLabels.Length() > 0) {
314     aChGNode = new XCAFDoc_GraphNode;
315     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
316     aChGNode->SetGraphID(XCAFDoc::ViewRefShapeGUID());
317   }
318   for(Standard_Integer i = theShapeLabels.Lower(); i <= theShapeLabels.Upper(); i++)
319   {
320     if (!theShapeLabels.Value(i).FindAttribute(XCAFDoc::ViewRefShapeGUID(), aShapeGNode) ) {
321       aShapeGNode = new XCAFDoc_GraphNode;
322       aShapeGNode = XCAFDoc_GraphNode::Set(theShapeLabels.Value(i));
323     }
324     aShapeGNode->SetGraphID(XCAFDoc::ViewRefShapeGUID());
325     aShapeGNode->SetChild(aChGNode);
326     aChGNode->SetFather(aShapeGNode);
327   }
328   
329   if (!theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aChGNode) && theGDTLabels.Length() > 0) {
330     aChGNode = new XCAFDoc_GraphNode;
331     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
332     aChGNode->SetGraphID(XCAFDoc::ViewRefGDTGUID());
333   }
334   for(Standard_Integer i = theGDTLabels.Lower(); i <= theGDTLabels.Upper(); i++)
335   {
336     if(!theGDTLabels.Value(i).FindAttribute(XCAFDoc::ViewRefGDTGUID(), aGDTGNode) ) {
337       aGDTGNode = new XCAFDoc_GraphNode;
338       aGDTGNode = XCAFDoc_GraphNode::Set(theGDTLabels.Value(i));
339     }
340     aGDTGNode->SetGraphID(XCAFDoc::ViewRefGDTGUID());
341     aGDTGNode->SetChild(aChGNode);
342     aChGNode->SetFather(aGDTGNode);
343   }
344
345   if (!theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode) && theClippingPlaneLabels.Length() > 0) {
346     aChGNode = new XCAFDoc_GraphNode;
347     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
348     aChGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
349   }
350   for (Standard_Integer i = theClippingPlaneLabels.Lower(); i <= theClippingPlaneLabels.Upper(); i++)
351   {
352     if (!theClippingPlaneLabels.Value(i).FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aPlaneGNode)) {
353       aPlaneGNode = new XCAFDoc_GraphNode;
354       aPlaneGNode = XCAFDoc_GraphNode::Set(theClippingPlaneLabels.Value(i));
355     }
356     aPlaneGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
357     aPlaneGNode->SetChild(aChGNode);
358     aChGNode->SetFather(aPlaneGNode);
359   }
360 }
361
362 //=======================================================================
363 //function : SetView
364 //purpose  : 
365 //=======================================================================
366 void XCAFDoc_ViewTool::SetView(const TDF_LabelSequence& theShapeLabels,
367   const TDF_LabelSequence& theGDTLabels,
368   const TDF_Label& theViewL) const
369 {
370   if (!IsView(theViewL))
371     return;
372
373   Handle(XCAFDoc_GraphNode) aChGNode;
374   Handle(XCAFDoc_GraphNode) aShapeGNode;
375   Handle(XCAFDoc_GraphNode) aGDTGNode;
376
377   if (theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode)) {
378     while (aChGNode->NbFathers() > 0) {
379       aShapeGNode = aChGNode->GetFather(1);
380       aShapeGNode->UnSetChild(aChGNode);
381       if (aShapeGNode->NbChildren() == 0)
382         aShapeGNode->ForgetAttribute(XCAFDoc::ViewRefShapeGUID());
383     }
384     theViewL.ForgetAttribute(XCAFDoc::ViewRefShapeGUID());
385   }
386   if (theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aChGNode)) {
387     while (aChGNode->NbFathers() > 0) {
388       aGDTGNode = aChGNode->GetFather(1);
389       aGDTGNode->UnSetChild(aChGNode);
390       if (aGDTGNode->NbChildren() == 0)
391         aGDTGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
392     }
393     theViewL.ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
394   }
395
396   if (!theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode) && theShapeLabels.Length() > 0) {
397     aChGNode = new XCAFDoc_GraphNode;
398     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
399     aChGNode->SetGraphID(XCAFDoc::ViewRefShapeGUID());
400   }
401   for (Standard_Integer i = theShapeLabels.Lower(); i <= theShapeLabels.Upper(); i++)
402   {
403     if (!theShapeLabels.Value(i).FindAttribute(XCAFDoc::ViewRefShapeGUID(), aShapeGNode)) {
404       aShapeGNode = new XCAFDoc_GraphNode;
405       aShapeGNode = XCAFDoc_GraphNode::Set(theShapeLabels.Value(i));
406     }
407     aShapeGNode->SetGraphID(XCAFDoc::ViewRefShapeGUID());
408     aShapeGNode->SetChild(aChGNode);
409     aChGNode->SetFather(aShapeGNode);
410   }
411
412   if (!theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aChGNode) && theGDTLabels.Length() > 0) {
413     aChGNode = new XCAFDoc_GraphNode;
414     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
415     aChGNode->SetGraphID(XCAFDoc::ViewRefGDTGUID());
416   }
417   for (Standard_Integer i = theGDTLabels.Lower(); i <= theGDTLabels.Upper(); i++)
418   {
419     if (!theGDTLabels.Value(i).FindAttribute(XCAFDoc::ViewRefGDTGUID(), aGDTGNode)) {
420       aGDTGNode = new XCAFDoc_GraphNode;
421       aGDTGNode = XCAFDoc_GraphNode::Set(theGDTLabels.Value(i));
422     }
423     aGDTGNode->SetGraphID(XCAFDoc::ViewRefGDTGUID());
424     aGDTGNode->SetChild(aChGNode);
425     aChGNode->SetFather(aGDTGNode);
426   }
427 }
428
429 //=======================================================================
430 //function : SetClippingPlanes
431 //purpose  : 
432 //=======================================================================
433 void XCAFDoc_ViewTool::SetClippingPlanes(const TDF_LabelSequence& theClippingPlaneLabels,
434   const TDF_Label& theViewL) const
435 {
436   if (!IsView(theViewL))
437     return;
438
439   Handle(XCAFDoc_GraphNode) aChGNode;
440   Handle(XCAFDoc_GraphNode) aPlaneGNode;
441
442   if (theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode)) {
443     while (aChGNode->NbFathers() > 0) {
444       aPlaneGNode = aChGNode->GetFather(1);
445       aPlaneGNode->UnSetChild(aChGNode);
446       if (aPlaneGNode->NbChildren() == 0)
447         aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
448     }
449     theViewL.ForgetAttribute(XCAFDoc::ViewRefPlaneGUID());
450   }
451
452   if (!theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode) && theClippingPlaneLabels.Length() > 0) {
453     aChGNode = new XCAFDoc_GraphNode;
454     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
455     aChGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
456   }
457   for (Standard_Integer i = theClippingPlaneLabels.Lower(); i <= theClippingPlaneLabels.Upper(); i++)
458   {
459     if (!theClippingPlaneLabels.Value(i).FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aPlaneGNode)) {
460       aPlaneGNode = new XCAFDoc_GraphNode;
461       aPlaneGNode = XCAFDoc_GraphNode::Set(theClippingPlaneLabels.Value(i));
462     }
463     aPlaneGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
464     aPlaneGNode->SetChild(aChGNode);
465     aChGNode->SetFather(aPlaneGNode);
466   }
467 }
468
469 //=======================================================================
470 //function : RemoveView
471 //purpose  : 
472 //=======================================================================
473 void XCAFDoc_ViewTool::RemoveView(const TDF_Label& theViewL)
474 {
475   if (!IsView(theViewL))
476     return;
477
478   Handle(XCAFDoc_GraphNode) aChGNode;
479   Handle(XCAFDoc_GraphNode) aShapeGNode;
480   Handle(XCAFDoc_GraphNode) aGDTGNode;
481   Handle(XCAFDoc_GraphNode) aPlaneGNode;
482
483   if (theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode)) {
484     while (aChGNode->NbFathers() > 0) {
485       aShapeGNode = aChGNode->GetFather(1);
486       aShapeGNode->UnSetChild(aChGNode);
487       if (aShapeGNode->NbChildren() == 0)
488         aShapeGNode->ForgetAttribute(XCAFDoc::ViewRefShapeGUID());
489     }
490   }
491   if (theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aChGNode)) {
492     while (aChGNode->NbFathers() > 0) {
493       aGDTGNode = aChGNode->GetFather(1);
494       aGDTGNode->UnSetChild(aChGNode);
495       if (aGDTGNode->NbChildren() == 0)
496         aGDTGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
497     }
498   }
499   if (theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode)) {
500     while (aChGNode->NbFathers() > 0) {
501       aPlaneGNode = aChGNode->GetFather(1);
502       aPlaneGNode->UnSetChild(aChGNode);
503       if (aPlaneGNode->NbChildren() == 0)
504         aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
505     }
506   }
507   theViewL.ForgetAllAttributes();
508 }
509
510 //=======================================================================
511 //function : GetRefShapeLabel
512 //purpose  : 
513 //=======================================================================
514 Standard_Boolean XCAFDoc_ViewTool::GetRefShapeLabel(const TDF_Label& theViewL,
515                                                     TDF_LabelSequence& theShapeLabels) const
516 {
517   theShapeLabels.Clear();
518   Handle(TDataStd_TreeNode) aNode;
519   if( !theViewL.FindAttribute(XCAFDoc::ViewRefGUID(), aNode) || !aNode->HasFather() ) {
520     Handle(XCAFDoc_GraphNode) aGNode;
521     if( theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aGNode) && aGNode->NbFathers() > 0 ) {
522       for(Standard_Integer i = 1; i <= aGNode->NbFathers(); i++)
523         theShapeLabels.Append(aGNode->GetFather(i)->Label());
524       return Standard_True;
525     }
526     else 
527       return Standard_False;
528   }
529
530   theShapeLabels.Append(aNode->Father()->Label());
531   return Standard_True;
532 }
533
534 //=======================================================================
535 //function : GetRefGDTLabel
536 //purpose  : 
537 //=======================================================================
538 Standard_Boolean XCAFDoc_ViewTool::GetRefGDTLabel(const TDF_Label& theViewL,
539                                                   TDF_LabelSequence& theGDTLabels) const
540 {
541   theGDTLabels.Clear();
542   Handle(TDataStd_TreeNode) aNode;
543   if( !theViewL.FindAttribute(XCAFDoc::ViewRefGUID(), aNode) || !aNode->HasFather() ) {
544     Handle(XCAFDoc_GraphNode) aGNode;
545     if( theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aGNode) && aGNode->NbFathers() > 0 ) {
546       for(Standard_Integer i = 1; i <= aGNode->NbFathers(); i++)
547         theGDTLabels.Append(aGNode->GetFather(i)->Label());
548       return Standard_True;
549     }
550     else 
551       return Standard_False;
552   }
553
554   theGDTLabels.Append(aNode->Father()->Label());
555   return Standard_True;
556 }
557
558 //=======================================================================
559 //function : GetRefClippingPlaneLabel
560 //purpose  : 
561 //=======================================================================
562 Standard_Boolean XCAFDoc_ViewTool::GetRefClippingPlaneLabel(const TDF_Label& theViewL,
563   TDF_LabelSequence& theClippingPlaneLabels) const
564 {
565   theClippingPlaneLabels.Clear();
566   Handle(TDataStd_TreeNode) aNode;
567   if (!theViewL.FindAttribute(XCAFDoc::ViewRefGUID(), aNode) || !aNode->HasFather()) {
568     Handle(XCAFDoc_GraphNode) aGNode;
569     if (theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aGNode) && aGNode->NbFathers() > 0) {
570       for (Standard_Integer i = 1; i <= aGNode->NbFathers(); i++)
571         theClippingPlaneLabels.Append(aGNode->GetFather(i)->Label());
572       return Standard_True;
573     }
574     else
575       return Standard_False;
576   }
577
578   theClippingPlaneLabels.Append(aNode->Father()->Label());
579   return Standard_True;
580 }
581
582 //=======================================================================
583 //function : GetRefNoteLabel
584 //purpose  : 
585 //=======================================================================
586 Standard_Boolean XCAFDoc_ViewTool::GetRefNoteLabel(const TDF_Label& theViewL,
587   TDF_LabelSequence& theNoteLabels) const
588 {
589   theNoteLabels.Clear();
590   Handle(TDataStd_TreeNode) aNode;
591   if (!theViewL.FindAttribute(XCAFDoc::ViewRefGUID(), aNode) || !aNode->HasFather()) {
592     Handle(XCAFDoc_GraphNode) aGNode;
593     if (theViewL.FindAttribute(XCAFDoc::ViewRefNoteGUID(), aGNode) && aGNode->NbFathers() > 0) {
594       for (Standard_Integer i = 1; i <= aGNode->NbFathers(); i++)
595         theNoteLabels.Append(aGNode->GetFather(i)->Label());
596       return Standard_True;
597     }
598     else
599       return Standard_False;
600   }
601
602   theNoteLabels.Append(aNode->Father()->Label());
603   return Standard_True;
604 }
605
606 //=======================================================================
607 //function : GetRefAnnotationLabel
608 //purpose  : 
609 //=======================================================================
610 Standard_Boolean XCAFDoc_ViewTool::GetRefAnnotationLabel(const TDF_Label& theViewL,
611   TDF_LabelSequence& theAnnotationLabels) const
612 {
613   theAnnotationLabels.Clear();
614   Handle(TDataStd_TreeNode) aNode;
615   if (!theViewL.FindAttribute(XCAFDoc::ViewRefGUID(), aNode) || !aNode->HasFather()) {
616     Handle(XCAFDoc_GraphNode) aGNode;
617     if (theViewL.FindAttribute(XCAFDoc::ViewRefAnnotationGUID(), aGNode) && aGNode->NbFathers() > 0) {
618       for (Standard_Integer i = 1; i <= aGNode->NbFathers(); i++)
619         theAnnotationLabels.Append(aGNode->GetFather(i)->Label());
620       return Standard_True;
621     }
622     else
623       return Standard_False;
624   }
625
626   theAnnotationLabels.Append(aNode->Father()->Label());
627   return Standard_True;
628 }
629
630 //=======================================================================
631 //function : GetViewLabelsForShape
632 //purpose  : 
633 //=======================================================================
634 Standard_Boolean XCAFDoc_ViewTool::GetViewLabelsForShape(const TDF_Label& theShapeL,
635                                                          TDF_LabelSequence& theViews) const
636 {
637   Handle(XCAFDoc_GraphNode) aGNode;
638   Standard_Boolean aResult = Standard_False;
639   if (theShapeL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aGNode) && aGNode->NbChildren() > 0) {
640     for(Standard_Integer i = 1; i <= aGNode->NbChildren(); i++)
641     {
642       theViews.Append(aGNode->GetChild(i)->Label());
643     }
644     aResult = Standard_True;
645   }
646   return aResult;
647 }
648
649 //=======================================================================
650 //function : GetViewLabelsForGDT
651 //purpose  : 
652 //=======================================================================
653 Standard_Boolean XCAFDoc_ViewTool::GetViewLabelsForGDT(const TDF_Label& theGDTL,
654                                                        TDF_LabelSequence& theViews) const
655 {
656   Handle(XCAFDoc_GraphNode) aGNode;
657   Standard_Boolean aResult = Standard_False;
658   if (theGDTL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aGNode) && aGNode->NbChildren() > 0) {
659     for(Standard_Integer i = 1; i <= aGNode->NbChildren(); i++)
660     {
661       theViews.Append(aGNode->GetChild(i)->Label());
662     }
663     aResult = Standard_True;
664   }
665   return aResult;
666 }
667
668 //=======================================================================
669 //function : GetViewLabelsForClippingPlane
670 //purpose  : 
671 //=======================================================================
672 Standard_Boolean XCAFDoc_ViewTool::GetViewLabelsForClippingPlane(const TDF_Label& theClippingPlaneL,
673   TDF_LabelSequence& theViews) const
674 {
675   Handle(XCAFDoc_GraphNode) aGNode;
676   Standard_Boolean aResult = Standard_False;
677   if (theClippingPlaneL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aGNode) && aGNode->NbChildren() > 0) {
678     for (Standard_Integer i = 1; i <= aGNode->NbChildren(); i++)
679     {
680       theViews.Append(aGNode->GetChild(i)->Label());
681     }
682     aResult = Standard_True;
683   }
684   return aResult;
685 }
686
687 //=======================================================================
688 //function : GetViewLabelsForNote
689 //purpose  : 
690 //=======================================================================
691 Standard_Boolean XCAFDoc_ViewTool::GetViewLabelsForNote(const TDF_Label& theNoteL,
692   TDF_LabelSequence& theViews) const
693 {
694   Handle(XCAFDoc_GraphNode) aGNode;
695   Standard_Boolean aResult = Standard_False;
696   if (theNoteL.FindAttribute(XCAFDoc::ViewRefNoteGUID(), aGNode) && aGNode->NbChildren() > 0) {
697     for (Standard_Integer i = 1; i <= aGNode->NbChildren(); i++)
698     {
699       theViews.Append(aGNode->GetChild(i)->Label());
700     }
701     aResult = Standard_True;
702   }
703   return aResult;
704 }
705
706 //=======================================================================
707 //function : GetViewLabelsForAnnotation
708 //purpose  : 
709 //=======================================================================
710 Standard_Boolean XCAFDoc_ViewTool::GetViewLabelsForAnnotation(const TDF_Label& theAnnotationL,
711   TDF_LabelSequence& theViews) const
712 {
713   Handle(XCAFDoc_GraphNode) aGNode;
714   Standard_Boolean aResult = Standard_False;
715   if (theAnnotationL.FindAttribute(XCAFDoc::ViewRefAnnotationGUID(), aGNode) && aGNode->NbChildren() > 0) {
716     for (Standard_Integer i = 1; i <= aGNode->NbChildren(); i++)
717     {
718       theViews.Append(aGNode->GetChild(i)->Label());
719     }
720     aResult = Standard_True;
721   }
722   return aResult;
723 }
724
725 //=======================================================================
726 //function : IsLocked
727 //purpose  : 
728 //=======================================================================
729
730 Standard_Boolean XCAFDoc_ViewTool::IsLocked(const TDF_Label& theViewL) const
731 {
732   Handle(TDataStd_UAttribute) anAttr;
733   return theViewL.FindAttribute(XCAFDoc::LockGUID(), anAttr);
734 }
735
736 //=======================================================================
737 //function : Lock
738 //purpose  : 
739 //=======================================================================
740
741 void XCAFDoc_ViewTool::Lock(const TDF_Label& theViewL) const
742 {
743   TDataStd_UAttribute::Set(theViewL, XCAFDoc::LockGUID());
744 }
745
746 //=======================================================================
747 //function : Unlock
748 //purpose  : 
749 //=======================================================================
750
751 void XCAFDoc_ViewTool::Unlock(const TDF_Label& theViewL) const
752 {
753   theViewL.ForgetAttribute(XCAFDoc::LockGUID());
754 }
755
756 //=======================================================================
757 //function : ID
758 //purpose  : 
759 //=======================================================================
760 const Standard_GUID& XCAFDoc_ViewTool::ID() const
761 {
762   return GetID();
763 }