0024007: [Regression] Sporadic crashes when working with XDE documents
[occt.git] / src / XCAFDoc / XCAFDoc_DocumentTool.cxx
1 // Created on: 2000-08-30
2 // Created by: data exchange team
3 // Copyright (c) 2000-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20
21
22 #include <XCAFDoc_DocumentTool.ixx>
23 #include <TDataStd_Name.hxx>
24 #include <TDF_Data.hxx>
25 #include <TDF_Tool.hxx>
26 #include <TDF_LabelLabelMap.hxx>
27 #include <TDataStd_TreeNode.hxx>
28
29 //=======================================================================
30 //function : GetID
31 //purpose  : 
32 //=======================================================================
33
34 const Standard_GUID& XCAFDoc_DocumentTool::GetID() 
35 {
36   static Standard_GUID DocumentToolID ("efd212ec-6dfd-11d4-b9c8-0060b0ee281b");
37   return DocumentToolID; 
38 }
39
40 namespace {
41 //=======================================================================
42 //function : GetRefID
43 //purpose  : Returns a reference id to find a tree node attribute at the root
44 //           label
45 //=======================================================================
46
47 static const Standard_GUID& GetDocumentToolRefID() 
48 {
49   static Standard_GUID DocumentToolRefID ("efd212eb-6dfd-11d4-b9c8-0060b0ee281b");
50   return DocumentToolRefID; 
51 }
52 }
53
54
55 //=======================================================================
56 //function : Set
57 //purpose  : 
58 //=======================================================================
59
60 Handle(XCAFDoc_DocumentTool) XCAFDoc_DocumentTool::Set(const TDF_Label& L,
61                                                        const Standard_Boolean IsAcces)
62 {
63   Handle(XCAFDoc_DocumentTool) A;
64   TDF_Label aL = DocLabel (L);
65   if (!aL.FindAttribute (XCAFDoc_DocumentTool::GetID(), A)) {
66     if (!IsAcces)
67       aL = L;
68
69     A = new XCAFDoc_DocumentTool;
70     aL.AddAttribute(A);
71     A->Init();
72     // set ShapeTool, ColorTool and LayerTool attributes
73     XCAFDoc_ShapeTool::Set(ShapesLabel(L));
74     XCAFDoc_ColorTool::Set(ColorsLabel(L));
75     XCAFDoc_LayerTool::Set(LayersLabel(L));
76     XCAFDoc_DimTolTool::Set(DGTsLabel(L));
77     XCAFDoc_MaterialTool::Set(MaterialsLabel(L));
78   }
79   return A;
80 }
81
82
83 //=======================================================================
84 //function : DocLabel
85 //purpose  : 
86 //=======================================================================
87
88 TDF_Label XCAFDoc_DocumentTool::DocLabel(const TDF_Label& acces) 
89 {
90   TDF_Label DocL, RootL = acces.Root();
91   const Standard_GUID& aRefGuid = GetDocumentToolRefID();
92   Handle(TDataStd_TreeNode) aRootNode, aLabNode;
93
94   if (RootL.FindAttribute (aRefGuid, aRootNode)) {
95     aLabNode = aRootNode->First();
96     DocL = aLabNode->Label();
97     return DocL;
98   }
99
100   DocL = RootL.FindChild(1);
101   return DocL;
102 }
103
104
105 //=======================================================================
106 //function : Constructor
107 //purpose  : 
108 //=======================================================================
109
110 XCAFDoc_DocumentTool::XCAFDoc_DocumentTool()
111 {
112 }
113
114
115 //=======================================================================
116 //function : ShapesLabel
117 //purpose  : 
118 //=======================================================================
119
120 TDF_Label XCAFDoc_DocumentTool::ShapesLabel(const TDF_Label& acces) 
121 {
122   TDF_Label L = DocLabel(acces).FindChild(1,Standard_True);
123   TDataStd_Name::Set(L, "Shapes");
124   return L;
125 }
126
127
128 //=======================================================================
129 //function : ColorsLabel
130 //purpose  : 
131 //=======================================================================
132
133 TDF_Label XCAFDoc_DocumentTool::ColorsLabel(const TDF_Label& acces) 
134 {
135   TDF_Label L = DocLabel(acces).FindChild(2,Standard_True);
136   TDataStd_Name::Set(L, "Colors");
137   return L;
138 }
139
140
141 //=======================================================================
142 //function : LayersLabel
143 //purpose  : 
144 //=======================================================================
145
146 TDF_Label XCAFDoc_DocumentTool::LayersLabel(const TDF_Label& acces) 
147 {
148   TDF_Label L = DocLabel(acces).FindChild(3,Standard_True);
149   TDataStd_Name::Set(L, "Layers");
150   return L;
151 }
152
153
154 //=======================================================================
155 //function : DGTsLabel
156 //purpose  : 
157 //=======================================================================
158
159 TDF_Label XCAFDoc_DocumentTool::DGTsLabel(const TDF_Label& acces) 
160 {
161   TDF_Label L = DocLabel(acces).FindChild(4,Standard_True);
162   TDataStd_Name::Set(L, "D&GTs");
163   return L;
164 }
165
166
167 //=======================================================================
168 //function : MaterialsLabel
169 //purpose  : 
170 //=======================================================================
171
172 TDF_Label XCAFDoc_DocumentTool::MaterialsLabel(const TDF_Label& acces) 
173 {
174   TDF_Label L = DocLabel(acces).FindChild(5,Standard_True);
175   TDataStd_Name::Set(L, "Materials");
176   return L;
177 }
178
179
180 //=======================================================================
181 //function : ShapeTool
182 //purpose  : 
183 //=======================================================================
184
185  Handle(XCAFDoc_ShapeTool) XCAFDoc_DocumentTool::ShapeTool(const TDF_Label& acces) 
186 {
187   return XCAFDoc_ShapeTool::Set(ShapesLabel(acces));
188 }
189
190
191 //=======================================================================
192 //function : ColorTool
193 //purpose  : 
194 //=======================================================================
195
196 Handle(XCAFDoc_ColorTool) XCAFDoc_DocumentTool::ColorTool (const TDF_Label& acces) 
197 {
198   return XCAFDoc_ColorTool::Set(ColorsLabel(acces));
199 }
200
201
202 //=======================================================================
203 //function : LayerTool
204 //purpose  : 
205 //=======================================================================
206
207 Handle(XCAFDoc_LayerTool) XCAFDoc_DocumentTool::LayerTool (const TDF_Label& acces) 
208 {
209   return XCAFDoc_LayerTool::Set(LayersLabel(acces));
210 }
211
212
213 //=======================================================================
214 //function : DimTolTool
215 //purpose  : 
216 //=======================================================================
217
218 Handle(XCAFDoc_DimTolTool) XCAFDoc_DocumentTool::DimTolTool(const TDF_Label& acces) 
219 {
220   return XCAFDoc_DimTolTool::Set(DGTsLabel(acces));
221 }
222
223
224 //=======================================================================
225 //function : MaterialTool
226 //purpose  : 
227 //=======================================================================
228
229 Handle(XCAFDoc_MaterialTool) XCAFDoc_DocumentTool::MaterialTool(const TDF_Label& acces) 
230 {
231   return XCAFDoc_MaterialTool::Set(MaterialsLabel(acces));
232 }
233
234
235 //=======================================================================
236 //function : ID
237 //purpose  : 
238 //=======================================================================
239
240 const Standard_GUID& XCAFDoc_DocumentTool::ID() const
241 {
242   return GetID();
243 }
244
245
246 //=======================================================================
247 //function : Restore
248 //purpose  : 
249 //=======================================================================
250
251 void XCAFDoc_DocumentTool::Restore(const Handle(TDF_Attribute)& /* with */) 
252 {
253 }
254
255
256 //=======================================================================
257 //function : NewEmpty
258 //purpose  : 
259 //=======================================================================
260
261 Handle(TDF_Attribute) XCAFDoc_DocumentTool::NewEmpty() const
262 {
263   return new XCAFDoc_DocumentTool;
264 }
265
266
267 //=======================================================================
268 //function : Paste
269 //purpose  : 
270 //=======================================================================
271
272 void XCAFDoc_DocumentTool::Paste (const Handle(TDF_Attribute)& /* into */,
273                                   const Handle(TDF_RelocationTable)& /* RT */) const
274 {
275 }
276
277
278 //=======================================================================
279 //function : Init
280 //purpose  : 
281 //=======================================================================
282
283 void XCAFDoc_DocumentTool::Init() const
284 {
285   TDF_Label DocL = Label(), RootL = DocL.Root();
286   const Standard_GUID& aRefGuid = GetDocumentToolRefID();
287   Handle(TDataStd_TreeNode) aRootNode, aLabNode;
288
289   if (!RootL.FindAttribute (aRefGuid, aRootNode)) {
290     Handle(TDataStd_TreeNode) aRootNode = TDataStd_TreeNode::Set (RootL, aRefGuid);
291     Handle(TDataStd_TreeNode) aLNode = TDataStd_TreeNode::Set (DocL, aRefGuid);
292     aLNode->SetFather (aRootNode);
293     aRootNode->SetFirst (aLNode);
294   }
295 }
296
297
298 //=======================================================================
299 //function : IsXCAFDocument
300 //purpose  : 
301 //=======================================================================
302
303 Standard_Boolean XCAFDoc_DocumentTool::IsXCAFDocument(const  Handle(TDocStd_Document)& D)
304 {
305   TDF_Label RootL = D->Main().Root();
306   const Standard_GUID& aRefGuid = GetDocumentToolRefID();
307   Handle(TDataStd_TreeNode) aRootNode;
308   return RootL.FindAttribute (aRefGuid, aRootNode);
309 }
310
311
312 //=======================================================================
313 //function : Destroy
314 //purpose  : No longer required. Kept for binary compatibility only.
315 //=======================================================================
316
317 void XCAFDoc_DocumentTool::Destroy()
318 {
319 }