0028389: Data Exchange - Import of STEP Saved Views and Clipping Planes
[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 <Standard_GUID.hxx>
17 #include <Standard_Type.hxx>
18 #include <TDataStd_Name.hxx>
19 #include <TDataStd_TreeNode.hxx>
20 #include <TDataStd_UAttribute.hxx>
21 #include <TDF_Attribute.hxx>
22 #include <TDF_ChildIDIterator.hxx>
23 #include <TDF_Label.hxx>
24 #include <XCAFDoc.hxx>
25 #include <XCAFDoc_DocumentTool.hxx>
26 #include <XCAFDoc_GraphNode.hxx>
27 #include <XCAFDoc_ShapeTool.hxx>
28 #include <XCAFDoc_View.hxx>
29 #include <XCAFDoc_ViewTool.hxx>
30
31
32 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_ViewTool, TDF_Attribute)
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& theShapeLabels,
125                                const TDF_LabelSequence& theGDTLabels,
126                                const TDF_LabelSequence& theClippingPlaneLabels,
127                                const TDF_Label& theViewL) const
128 {
129   if(!IsView(theViewL))
130     return;
131
132   Handle(XCAFDoc_GraphNode) aChGNode;
133   Handle(XCAFDoc_GraphNode) aShapeGNode;
134   Handle(XCAFDoc_GraphNode) aGDTGNode;
135   Handle(XCAFDoc_GraphNode) aPlaneGNode;
136   
137   if ( theViewL.FindAttribute (XCAFDoc::ViewRefShapeGUID(), aChGNode) ) {
138     while (aChGNode->NbFathers() > 0) {
139       aShapeGNode = aChGNode->GetFather(1);
140       aShapeGNode->UnSetChild(aChGNode);
141       if(aShapeGNode->NbChildren() == 0)
142         aShapeGNode->ForgetAttribute( XCAFDoc::ViewRefShapeGUID() );
143     }
144     theViewL.ForgetAttribute ( XCAFDoc::ViewRefShapeGUID() );
145   }
146   if ( theViewL.FindAttribute (XCAFDoc::ViewRefGDTGUID(), aChGNode) ) {
147     while (aChGNode->NbFathers() > 0) {
148       aGDTGNode = aChGNode->GetFather(1);
149       aGDTGNode->UnSetChild(aChGNode);
150       if(aGDTGNode->NbChildren() == 0)
151         aGDTGNode->ForgetAttribute( XCAFDoc::ViewRefGDTGUID() );
152     }
153     theViewL.ForgetAttribute ( XCAFDoc::ViewRefGDTGUID() );
154   }
155   if (theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode)) {
156     while (aChGNode->NbFathers() > 0) {
157       aPlaneGNode = aChGNode->GetFather(1);
158       aPlaneGNode->UnSetChild(aChGNode);
159       if (aPlaneGNode->NbChildren() == 0)
160         aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
161     }
162     theViewL.ForgetAttribute(XCAFDoc::ViewRefPlaneGUID());
163   }
164   
165   if (!theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode) && theShapeLabels.Length() > 0) {
166     aChGNode = new XCAFDoc_GraphNode;
167     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
168     aChGNode->SetGraphID(XCAFDoc::ViewRefShapeGUID());
169   }
170   for(Standard_Integer i = theShapeLabels.Lower(); i <= theShapeLabels.Upper(); i++)
171   {
172     if (!theShapeLabels.Value(i).FindAttribute(XCAFDoc::ViewRefShapeGUID(), aShapeGNode) ) {
173       aShapeGNode = new XCAFDoc_GraphNode;
174       aShapeGNode = XCAFDoc_GraphNode::Set(theShapeLabels.Value(i));
175     }
176     aShapeGNode->SetGraphID(XCAFDoc::ViewRefShapeGUID());
177     aShapeGNode->SetChild(aChGNode);
178     aChGNode->SetFather(aShapeGNode);
179   }
180   
181   if (!theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aChGNode) && theGDTLabels.Length() > 0) {
182     aChGNode = new XCAFDoc_GraphNode;
183     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
184     aChGNode->SetGraphID(XCAFDoc::ViewRefGDTGUID());
185   }
186   for(Standard_Integer i = theGDTLabels.Lower(); i <= theGDTLabels.Upper(); i++)
187   {
188     if(!theGDTLabels.Value(i).FindAttribute(XCAFDoc::ViewRefGDTGUID(), aGDTGNode) ) {
189       aGDTGNode = new XCAFDoc_GraphNode;
190       aGDTGNode = XCAFDoc_GraphNode::Set(theGDTLabels.Value(i));
191     }
192     aGDTGNode->SetGraphID(XCAFDoc::ViewRefGDTGUID());
193     aGDTGNode->SetChild(aChGNode);
194     aChGNode->SetFather(aGDTGNode);
195   }
196
197   if (!theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode) && theClippingPlaneLabels.Length() > 0) {
198     aChGNode = new XCAFDoc_GraphNode;
199     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
200     aChGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
201   }
202   for (Standard_Integer i = theClippingPlaneLabels.Lower(); i <= theClippingPlaneLabels.Upper(); i++)
203   {
204     if (!theClippingPlaneLabels.Value(i).FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aPlaneGNode)) {
205       aPlaneGNode = new XCAFDoc_GraphNode;
206       aPlaneGNode = XCAFDoc_GraphNode::Set(theClippingPlaneLabels.Value(i));
207     }
208     aPlaneGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
209     aPlaneGNode->SetChild(aChGNode);
210     aChGNode->SetFather(aPlaneGNode);
211   }
212 }
213
214 //=======================================================================
215 //function : SetView
216 //purpose  : 
217 //=======================================================================
218 void XCAFDoc_ViewTool::SetView(const TDF_LabelSequence& theShapeLabels,
219   const TDF_LabelSequence& theGDTLabels,
220   const TDF_Label& theViewL) const
221 {
222   if (!IsView(theViewL))
223     return;
224
225   Handle(XCAFDoc_GraphNode) aChGNode;
226   Handle(XCAFDoc_GraphNode) aShapeGNode;
227   Handle(XCAFDoc_GraphNode) aGDTGNode;
228
229   if (theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode)) {
230     while (aChGNode->NbFathers() > 0) {
231       aShapeGNode = aChGNode->GetFather(1);
232       aShapeGNode->UnSetChild(aChGNode);
233       if (aShapeGNode->NbChildren() == 0)
234         aShapeGNode->ForgetAttribute(XCAFDoc::ViewRefShapeGUID());
235     }
236     theViewL.ForgetAttribute(XCAFDoc::ViewRefShapeGUID());
237   }
238   if (theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aChGNode)) {
239     while (aChGNode->NbFathers() > 0) {
240       aGDTGNode = aChGNode->GetFather(1);
241       aGDTGNode->UnSetChild(aChGNode);
242       if (aGDTGNode->NbChildren() == 0)
243         aGDTGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
244     }
245     theViewL.ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
246   }
247
248   if (!theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode) && theShapeLabels.Length() > 0) {
249     aChGNode = new XCAFDoc_GraphNode;
250     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
251     aChGNode->SetGraphID(XCAFDoc::ViewRefShapeGUID());
252   }
253   for (Standard_Integer i = theShapeLabels.Lower(); i <= theShapeLabels.Upper(); i++)
254   {
255     if (!theShapeLabels.Value(i).FindAttribute(XCAFDoc::ViewRefShapeGUID(), aShapeGNode)) {
256       aShapeGNode = new XCAFDoc_GraphNode;
257       aShapeGNode = XCAFDoc_GraphNode::Set(theShapeLabels.Value(i));
258     }
259     aShapeGNode->SetGraphID(XCAFDoc::ViewRefShapeGUID());
260     aShapeGNode->SetChild(aChGNode);
261     aChGNode->SetFather(aShapeGNode);
262   }
263
264   if (!theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aChGNode) && theGDTLabels.Length() > 0) {
265     aChGNode = new XCAFDoc_GraphNode;
266     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
267     aChGNode->SetGraphID(XCAFDoc::ViewRefGDTGUID());
268   }
269   for (Standard_Integer i = theGDTLabels.Lower(); i <= theGDTLabels.Upper(); i++)
270   {
271     if (!theGDTLabels.Value(i).FindAttribute(XCAFDoc::ViewRefGDTGUID(), aGDTGNode)) {
272       aGDTGNode = new XCAFDoc_GraphNode;
273       aGDTGNode = XCAFDoc_GraphNode::Set(theGDTLabels.Value(i));
274     }
275     aGDTGNode->SetGraphID(XCAFDoc::ViewRefGDTGUID());
276     aGDTGNode->SetChild(aChGNode);
277     aChGNode->SetFather(aGDTGNode);
278   }
279 }
280
281 //=======================================================================
282 //function : SetClippingPlanes
283 //purpose  : 
284 //=======================================================================
285 void XCAFDoc_ViewTool::SetClippingPlanes(const TDF_LabelSequence& theClippingPlaneLabels,
286   const TDF_Label& theViewL) const
287 {
288   if (!IsView(theViewL))
289     return;
290
291   Handle(XCAFDoc_GraphNode) aChGNode;
292   Handle(XCAFDoc_GraphNode) aPlaneGNode;
293
294   if (theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode)) {
295     while (aChGNode->NbFathers() > 0) {
296       aPlaneGNode = aChGNode->GetFather(1);
297       aPlaneGNode->UnSetChild(aChGNode);
298       if (aPlaneGNode->NbChildren() == 0)
299         aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
300     }
301     theViewL.ForgetAttribute(XCAFDoc::ViewRefPlaneGUID());
302   }
303
304   if (!theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode) && theClippingPlaneLabels.Length() > 0) {
305     aChGNode = new XCAFDoc_GraphNode;
306     aChGNode = XCAFDoc_GraphNode::Set(theViewL);
307     aChGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
308   }
309   for (Standard_Integer i = theClippingPlaneLabels.Lower(); i <= theClippingPlaneLabels.Upper(); i++)
310   {
311     if (!theClippingPlaneLabels.Value(i).FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aPlaneGNode)) {
312       aPlaneGNode = new XCAFDoc_GraphNode;
313       aPlaneGNode = XCAFDoc_GraphNode::Set(theClippingPlaneLabels.Value(i));
314     }
315     aPlaneGNode->SetGraphID(XCAFDoc::ViewRefPlaneGUID());
316     aPlaneGNode->SetChild(aChGNode);
317     aChGNode->SetFather(aPlaneGNode);
318   }
319 }
320
321 //=======================================================================
322 //function : RemoveView
323 //purpose  : 
324 //=======================================================================
325 void XCAFDoc_ViewTool::RemoveView(const TDF_Label& theViewL)
326 {
327   if (!IsView(theViewL))
328     return;
329
330   Handle(XCAFDoc_GraphNode) aChGNode;
331   Handle(XCAFDoc_GraphNode) aShapeGNode;
332   Handle(XCAFDoc_GraphNode) aGDTGNode;
333   Handle(XCAFDoc_GraphNode) aPlaneGNode;
334
335   if (theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode)) {
336     while (aChGNode->NbFathers() > 0) {
337       aShapeGNode = aChGNode->GetFather(1);
338       aShapeGNode->UnSetChild(aChGNode);
339       if (aShapeGNode->NbChildren() == 0)
340         aShapeGNode->ForgetAttribute(XCAFDoc::ViewRefShapeGUID());
341     }
342   }
343   if (theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aChGNode)) {
344     while (aChGNode->NbFathers() > 0) {
345       aGDTGNode = aChGNode->GetFather(1);
346       aGDTGNode->UnSetChild(aChGNode);
347       if (aGDTGNode->NbChildren() == 0)
348         aGDTGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
349     }
350   }
351   if (theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aChGNode)) {
352     while (aChGNode->NbFathers() > 0) {
353       aPlaneGNode = aChGNode->GetFather(1);
354       aPlaneGNode->UnSetChild(aChGNode);
355       if (aPlaneGNode->NbChildren() == 0)
356         aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
357     }
358   }
359   theViewL.ForgetAllAttributes();
360 }
361
362 //=======================================================================
363 //function : GetRefShapeLabel
364 //purpose  : 
365 //=======================================================================
366 Standard_Boolean XCAFDoc_ViewTool::GetRefShapeLabel(const TDF_Label& theViewL,
367                                                     TDF_LabelSequence& theShapeLabels) const
368 {
369   theShapeLabels.Clear();
370   Handle(TDataStd_TreeNode) aNode;
371   if( !theViewL.FindAttribute(XCAFDoc::ViewRefGUID(), aNode) || !aNode->HasFather() ) {
372     Handle(XCAFDoc_GraphNode) aGNode;
373     if( theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aGNode) && aGNode->NbFathers() > 0 ) {
374       for(Standard_Integer i = 1; i <= aGNode->NbFathers(); i++)
375         theShapeLabels.Append(aGNode->GetFather(i)->Label());
376       return Standard_True;
377     }
378     else 
379       return Standard_False;
380   }
381
382   theShapeLabels.Append(aNode->Father()->Label());
383   return Standard_True;
384 }
385
386 //=======================================================================
387 //function : GetRefGDTLabel
388 //purpose  : 
389 //=======================================================================
390 Standard_Boolean XCAFDoc_ViewTool::GetRefGDTLabel(const TDF_Label& theViewL,
391                                                   TDF_LabelSequence& theGDTLabels) const
392 {
393   theGDTLabels.Clear();
394   Handle(TDataStd_TreeNode) aNode;
395   if( !theViewL.FindAttribute(XCAFDoc::ViewRefGUID(), aNode) || !aNode->HasFather() ) {
396     Handle(XCAFDoc_GraphNode) aGNode;
397     if( theViewL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aGNode) && aGNode->NbFathers() > 0 ) {
398       for(Standard_Integer i = 1; i <= aGNode->NbFathers(); i++)
399         theGDTLabels.Append(aGNode->GetFather(i)->Label());
400       return Standard_True;
401     }
402     else 
403       return Standard_False;
404   }
405
406   theGDTLabels.Append(aNode->Father()->Label());
407   return Standard_True;
408 }
409
410 //=======================================================================
411 //function : GetRefClippingPlaneLabel
412 //purpose  : 
413 //=======================================================================
414 Standard_Boolean XCAFDoc_ViewTool::GetRefClippingPlaneLabel(const TDF_Label& theViewL,
415   TDF_LabelSequence& theClippingPlaneLabels) const
416 {
417   theClippingPlaneLabels.Clear();
418   Handle(TDataStd_TreeNode) aNode;
419   if (!theViewL.FindAttribute(XCAFDoc::ViewRefGUID(), aNode) || !aNode->HasFather()) {
420     Handle(XCAFDoc_GraphNode) aGNode;
421     if (theViewL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aGNode) && aGNode->NbFathers() > 0) {
422       for (Standard_Integer i = 1; i <= aGNode->NbFathers(); i++)
423         theClippingPlaneLabels.Append(aGNode->GetFather(i)->Label());
424       return Standard_True;
425     }
426     else
427       return Standard_False;
428   }
429
430   theClippingPlaneLabels.Append(aNode->Father()->Label());
431   return Standard_True;
432 }
433
434 //=======================================================================
435 //function : GetViewLabelsForShape
436 //purpose  : 
437 //=======================================================================
438 Standard_Boolean XCAFDoc_ViewTool::GetViewLabelsForShape(const TDF_Label& theShapeL,
439                                                          TDF_LabelSequence& theViews) const
440 {
441   Handle(XCAFDoc_GraphNode) aGNode;
442   Standard_Boolean aResult = Standard_False;
443   if (theShapeL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aGNode) && aGNode->NbChildren() > 0) {
444     for(Standard_Integer i = 1; i <= aGNode->NbChildren(); i++)
445     {
446       theViews.Append(aGNode->GetChild(i)->Label());
447     }
448     aResult = Standard_True;
449   }
450   return aResult;
451 }
452
453 //=======================================================================
454 //function : GetViewLabelsForGDT
455 //purpose  : 
456 //=======================================================================
457 Standard_Boolean XCAFDoc_ViewTool::GetViewLabelsForGDT(const TDF_Label& theGDTL,
458                                                        TDF_LabelSequence& theViews) const
459 {
460   Handle(XCAFDoc_GraphNode) aGNode;
461   Standard_Boolean aResult = Standard_False;
462   if (theGDTL.FindAttribute(XCAFDoc::ViewRefGDTGUID(), aGNode) && aGNode->NbChildren() > 0) {
463     for(Standard_Integer i = 1; i <= aGNode->NbChildren(); i++)
464     {
465       theViews.Append(aGNode->GetChild(i)->Label());
466     }
467     aResult = Standard_True;
468   }
469   return aResult;
470 }
471
472 //=======================================================================
473 //function : GetViewLabelsForClippingPlane
474 //purpose  : 
475 //=======================================================================
476 Standard_Boolean XCAFDoc_ViewTool::GetViewLabelsForClippingPlane(const TDF_Label& theClippingPlaneL,
477   TDF_LabelSequence& theViews) const
478 {
479   Handle(XCAFDoc_GraphNode) aGNode;
480   Standard_Boolean aResult = Standard_False;
481   if (theClippingPlaneL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aGNode) && aGNode->NbChildren() > 0) {
482     for (Standard_Integer i = 1; i <= aGNode->NbChildren(); i++)
483     {
484       theViews.Append(aGNode->GetChild(i)->Label());
485     }
486     aResult = Standard_True;
487   }
488   return aResult;
489 }
490
491 //=======================================================================
492 //function : IsLocked
493 //purpose  : 
494 //=======================================================================
495
496 Standard_Boolean XCAFDoc_ViewTool::IsLocked(const TDF_Label& theViewL) const
497 {
498   Handle(TDataStd_UAttribute) anAttr;
499   return theViewL.FindAttribute(XCAFDoc::LockGUID(), anAttr);
500 }
501
502 //=======================================================================
503 //function : Lock
504 //purpose  : 
505 //=======================================================================
506
507 void XCAFDoc_ViewTool::Lock(const TDF_Label& theViewL) const
508 {
509   TDataStd_UAttribute::Set(theViewL, XCAFDoc::LockGUID());
510 }
511
512 //=======================================================================
513 //function : Unlock
514 //purpose  : 
515 //=======================================================================
516
517 void XCAFDoc_ViewTool::Unlock(const TDF_Label& theViewL) const
518 {
519   theViewL.ForgetAttribute(XCAFDoc::LockGUID());
520 }
521
522 //=======================================================================
523 //function : ID
524 //purpose  : 
525 //=======================================================================
526 const Standard_GUID& XCAFDoc_ViewTool::ID() const
527 {
528   return GetID();
529 }
530
531
532 //=======================================================================
533 //function : Restore
534 //purpose  : 
535 //=======================================================================
536 void XCAFDoc_ViewTool::Restore(const Handle(TDF_Attribute)& /*with*/) 
537 {
538 }
539
540
541 //=======================================================================
542 //function : NewEmpty
543 //purpose  : 
544 //=======================================================================
545 Handle(TDF_Attribute) XCAFDoc_ViewTool::NewEmpty() const
546 {
547   return new XCAFDoc_ViewTool;
548 }
549
550
551 //=======================================================================
552 //function : Paste
553 //purpose  : 
554 //=======================================================================
555 void XCAFDoc_ViewTool::Paste(const Handle(TDF_Attribute)& /*into*/,
556                              const Handle(TDF_RelocationTable)& /*RT*/) const
557 {
558 }
559