0031687: Draw Harness, ViewerTest - extend command vrenderparams with option updating...
[occt.git] / src / BinMXCAFDoc / BinMXCAFDoc_GraphNodeDriver.cxx
1 // Created on: 2005-05-17
2 // Created by: Eugeny NAPALKOV
3 // Copyright (c) 2005-2014 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
17 #include <BinMXCAFDoc_GraphNodeDriver.hxx>
18 #include <BinObjMgt_Persistent.hxx>
19 #include <Message_Messenger.hxx>
20 #include <Standard_Type.hxx>
21 #include <TDF_Attribute.hxx>
22 #include <XCAFDoc_GraphNode.hxx>
23
24 IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_GraphNodeDriver,BinMDF_ADriver)
25
26 //=======================================================================
27 //function :
28 //purpose  : 
29 //=======================================================================
30 BinMXCAFDoc_GraphNodeDriver::BinMXCAFDoc_GraphNodeDriver(const Handle(Message_Messenger)& theMsgDriver)
31      : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_GraphNode)->Name()) {
32 }
33
34 //=======================================================================
35 //function :
36 //purpose  : 
37 //=======================================================================
38 Handle(TDF_Attribute) BinMXCAFDoc_GraphNodeDriver::NewEmpty() const {
39   return new XCAFDoc_GraphNode();
40 }
41
42 //=======================================================================
43 //function :
44 //purpose  : 
45 //=======================================================================
46 Standard_Boolean BinMXCAFDoc_GraphNodeDriver::Paste(const BinObjMgt_Persistent& theSource,
47                                                     const Handle(TDF_Attribute)& theTarget,
48                                                     BinObjMgt_RRelocationTable& theRelocTable) const
49 {
50   Handle(XCAFDoc_GraphNode) aT = Handle(XCAFDoc_GraphNode)::DownCast(theTarget);
51   Standard_Integer anID;
52
53   // Read Fathers
54   if (! (theSource >> anID))
55     return Standard_False;
56   while(anID != -1) {
57     Handle(XCAFDoc_GraphNode) aNode;
58     if(theRelocTable.IsBound(anID)) {
59       aNode = Handle(XCAFDoc_GraphNode)::DownCast(theRelocTable.Find(anID));
60     } else {
61       aNode = Handle(XCAFDoc_GraphNode)::DownCast(aT->NewEmpty());
62       theRelocTable.Bind(anID, aNode);
63     }
64     aT->SetFather(aNode);
65
66     if (! (theSource >> anID))
67       return Standard_False;    
68   }
69
70   // Read Children
71   if (! (theSource >> anID))
72     return Standard_False;
73   while(anID != -1) {
74     Handle(XCAFDoc_GraphNode) aNode;
75     if(theRelocTable.IsBound(anID)) {
76       aNode = Handle(XCAFDoc_GraphNode)::DownCast(theRelocTable.Find(anID));
77     } else {
78       aNode = Handle(XCAFDoc_GraphNode)::DownCast(aT->NewEmpty());
79       theRelocTable.Bind(anID, aNode);
80     }
81     aT->SetChild(aNode);
82
83     if (! (theSource >> anID))
84       return Standard_False;    
85   }
86
87   // Graph id
88   Standard_GUID aGUID;
89   if (! (theSource >> aGUID))
90     return Standard_False;
91   aT->SetGraphID(aGUID);
92
93
94   return Standard_True;
95 }
96
97 //=======================================================================
98 //function :
99 //purpose  : 
100 //=======================================================================
101 void BinMXCAFDoc_GraphNodeDriver::Paste(const Handle(TDF_Attribute)& theSource,
102                                         BinObjMgt_Persistent& theTarget,
103                                         BinObjMgt_SRelocationTable& theRelocTable) const
104 {
105   Handle(XCAFDoc_GraphNode) aS = Handle(XCAFDoc_GraphNode)::DownCast(theSource);
106   Standard_Integer i, aNb, anID;
107
108   // Write fathers
109   aNb = aS->NbFathers();
110   for(i = 1; i <= aNb; i++) {
111     Handle(XCAFDoc_GraphNode) aNode = aS->GetFather(i);
112     anID = theRelocTable.Add(aNode);
113     theTarget << anID;
114   }
115   theTarget.PutInteger(-1);
116
117   // Write children
118   aNb = aS->NbChildren();
119   for(i = 1; i <= aNb; i++) {
120     Handle(XCAFDoc_GraphNode) aNode = aS->GetChild(i);
121     anID = theRelocTable.Add(aNode);
122     theTarget << anID;
123   }
124   theTarget.PutInteger(-1);
125
126   // Graph id
127   theTarget << aS->ID();
128 }
129