0028389: Data Exchange - Import of STEP Saved Views and Clipping Planes
[occt.git] / src / XCAFDoc / XCAFDoc_DocumentTool.cxx
1 // Created on: 2000-08-30
2 // Created by: data exchange team
3 // Copyright (c) 2000-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 <Standard_GUID.hxx>
18 #include <Standard_Type.hxx>
19 #include <TDataStd_Name.hxx>
20 #include <TDataStd_TreeNode.hxx>
21 #include <TDF_Attribute.hxx>
22 #include <TDF_Data.hxx>
23 #include <TDF_Label.hxx>
24 #include <TDF_RelocationTable.hxx>
25 #include <TDF_Tool.hxx>
26 #include <TDocStd_Document.hxx>
27 #include <XCAFDoc_ColorTool.hxx>
28 #include <XCAFDoc_ClippingPlaneTool.hxx>
29 #include <XCAFDoc_DimTolTool.hxx>
30 #include <XCAFDoc_DocumentTool.hxx>
31 #include <XCAFDoc_LayerTool.hxx>
32 #include <XCAFDoc_MaterialTool.hxx>
33 #include <XCAFDoc_ShapeTool.hxx>
34 #include <XCAFDoc_ViewTool.hxx>
35
36 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_DocumentTool,TDF_Attribute)
37
38 //=======================================================================
39 //function : GetID
40 //purpose  : 
41 //=======================================================================
42 const Standard_GUID& XCAFDoc_DocumentTool::GetID() 
43 {
44   static Standard_GUID DocumentToolID ("efd212ec-6dfd-11d4-b9c8-0060b0ee281b");
45   return DocumentToolID; 
46 }
47
48 namespace {
49 //=======================================================================
50 //function : GetRefID
51 //purpose  : Returns a reference id to find a tree node attribute at the root
52 //           label
53 //=======================================================================
54
55 static const Standard_GUID& GetDocumentToolRefID() 
56 {
57   static Standard_GUID DocumentToolRefID ("efd212eb-6dfd-11d4-b9c8-0060b0ee281b");
58   return DocumentToolRefID; 
59 }
60 }
61
62
63 //=======================================================================
64 //function : Set
65 //purpose  : 
66 //=======================================================================
67
68 Handle(XCAFDoc_DocumentTool) XCAFDoc_DocumentTool::Set(const TDF_Label& L,
69                                                        const Standard_Boolean IsAcces)
70 {
71   Handle(XCAFDoc_DocumentTool) A;
72   TDF_Label aL = DocLabel (L);
73   if (!aL.FindAttribute (XCAFDoc_DocumentTool::GetID(), A)) {
74     if (!IsAcces)
75       aL = L;
76
77     A = new XCAFDoc_DocumentTool;
78     aL.AddAttribute(A);
79     A->Init();
80     // set ShapeTool, ColorTool and LayerTool attributes
81     XCAFDoc_ShapeTool::Set(ShapesLabel(L));
82     XCAFDoc_ColorTool::Set(ColorsLabel(L));
83     XCAFDoc_LayerTool::Set(LayersLabel(L));
84     XCAFDoc_DimTolTool::Set(DGTsLabel(L));
85     XCAFDoc_MaterialTool::Set(MaterialsLabel(L));
86     XCAFDoc_ViewTool::Set(ViewsLabel(L));
87     XCAFDoc_ClippingPlaneTool::Set(ClippingPlanesLabel(L));
88   }
89   return A;
90 }
91
92
93 //=======================================================================
94 //function : DocLabel
95 //purpose  : 
96 //=======================================================================
97
98 TDF_Label XCAFDoc_DocumentTool::DocLabel(const TDF_Label& acces) 
99 {
100   TDF_Label DocL, RootL = acces.Root();
101   const Standard_GUID& aRefGuid = GetDocumentToolRefID();
102   Handle(TDataStd_TreeNode) aRootNode, aLabNode;
103
104   if (RootL.FindAttribute (aRefGuid, aRootNode)) {
105     aLabNode = aRootNode->First();
106     DocL = aLabNode->Label();
107     return DocL;
108   }
109
110   DocL = RootL.FindChild(1);
111   return DocL;
112 }
113
114
115 //=======================================================================
116 //function : Constructor
117 //purpose  : 
118 //=======================================================================
119
120 XCAFDoc_DocumentTool::XCAFDoc_DocumentTool()
121 {
122 }
123
124
125 //=======================================================================
126 //function : ShapesLabel
127 //purpose  : 
128 //=======================================================================
129
130 TDF_Label XCAFDoc_DocumentTool::ShapesLabel(const TDF_Label& acces) 
131 {
132   TDF_Label L = DocLabel(acces).FindChild(1,Standard_True);
133   TDataStd_Name::Set(L, "Shapes");
134   return L;
135 }
136
137
138 //=======================================================================
139 //function : ColorsLabel
140 //purpose  : 
141 //=======================================================================
142
143 TDF_Label XCAFDoc_DocumentTool::ColorsLabel(const TDF_Label& acces) 
144 {
145   TDF_Label L = DocLabel(acces).FindChild(2,Standard_True);
146   TDataStd_Name::Set(L, "Colors");
147   return L;
148 }
149
150
151 //=======================================================================
152 //function : LayersLabel
153 //purpose  : 
154 //=======================================================================
155
156 TDF_Label XCAFDoc_DocumentTool::LayersLabel(const TDF_Label& acces) 
157 {
158   TDF_Label L = DocLabel(acces).FindChild(3,Standard_True);
159   TDataStd_Name::Set(L, "Layers");
160   return L;
161 }
162
163
164 //=======================================================================
165 //function : DGTsLabel
166 //purpose  : 
167 //=======================================================================
168
169 TDF_Label XCAFDoc_DocumentTool::DGTsLabel(const TDF_Label& acces) 
170 {
171   TDF_Label L = DocLabel(acces).FindChild(4,Standard_True);
172   TDataStd_Name::Set(L, "D&GTs");
173   return L;
174 }
175
176
177 //=======================================================================
178 //function : MaterialsLabel
179 //purpose  : 
180 //=======================================================================
181
182 TDF_Label XCAFDoc_DocumentTool::MaterialsLabel(const TDF_Label& acces) 
183 {
184   TDF_Label L = DocLabel(acces).FindChild(5,Standard_True);
185   TDataStd_Name::Set(L, "Materials");
186   return L;
187 }
188
189
190 //=======================================================================
191 //function : ViewsLabel
192 //purpose  : 
193 //=======================================================================
194
195 TDF_Label XCAFDoc_DocumentTool::ViewsLabel(const TDF_Label& acces)
196 {
197   TDF_Label L = DocLabel(acces).FindChild(7, Standard_True);
198   TDataStd_Name::Set(L, "Views");
199   return L;
200 }
201
202 //=======================================================================
203 //function : ClippingPlanesLabel
204 //purpose  : 
205 //=======================================================================
206
207 TDF_Label XCAFDoc_DocumentTool::ClippingPlanesLabel(const TDF_Label& acces)
208 {
209   TDF_Label L = DocLabel(acces).FindChild(8, Standard_True);
210   TDataStd_Name::Set(L, "Clipping Planes");
211   return L;
212 }
213
214 //=======================================================================
215 //function : ShapeTool
216 //purpose  : 
217 //=======================================================================
218
219  Handle(XCAFDoc_ShapeTool) XCAFDoc_DocumentTool::ShapeTool(const TDF_Label& acces) 
220 {
221   return XCAFDoc_ShapeTool::Set(ShapesLabel(acces));
222 }
223
224
225 //=======================================================================
226 //function : ColorTool
227 //purpose  : 
228 //=======================================================================
229
230 Handle(XCAFDoc_ColorTool) XCAFDoc_DocumentTool::ColorTool (const TDF_Label& acces) 
231 {
232   return XCAFDoc_ColorTool::Set(ColorsLabel(acces));
233 }
234
235
236 //=======================================================================
237 //function : LayerTool
238 //purpose  : 
239 //=======================================================================
240
241 Handle(XCAFDoc_LayerTool) XCAFDoc_DocumentTool::LayerTool (const TDF_Label& acces) 
242 {
243   return XCAFDoc_LayerTool::Set(LayersLabel(acces));
244 }
245
246
247 //=======================================================================
248 //function : DimTolTool
249 //purpose  : 
250 //=======================================================================
251
252 Handle(XCAFDoc_DimTolTool) XCAFDoc_DocumentTool::DimTolTool(const TDF_Label& acces) 
253 {
254   return XCAFDoc_DimTolTool::Set(DGTsLabel(acces));
255 }
256
257
258 //=======================================================================
259 //function : MaterialTool
260 //purpose  : 
261 //=======================================================================
262
263 Handle(XCAFDoc_MaterialTool) XCAFDoc_DocumentTool::MaterialTool(const TDF_Label& acces) 
264 {
265   return XCAFDoc_MaterialTool::Set(MaterialsLabel(acces));
266 }
267
268 //=======================================================================
269 //function : ViewTool
270 //purpose  : 
271 //=======================================================================
272
273 Handle(XCAFDoc_ViewTool) XCAFDoc_DocumentTool::ViewTool(const TDF_Label& acces)
274 {
275   return XCAFDoc_ViewTool::Set(ViewsLabel(acces));
276 }
277
278 //=======================================================================
279 //function : ClippingPlaneTool
280 //purpose  : 
281 //=======================================================================
282
283 Handle(XCAFDoc_ClippingPlaneTool) XCAFDoc_DocumentTool::ClippingPlaneTool(const TDF_Label& acces)
284 {
285   return XCAFDoc_ClippingPlaneTool::Set(ClippingPlanesLabel(acces));
286 }
287
288 //=======================================================================
289 //function : ID
290 //purpose  : 
291 //=======================================================================
292
293 const Standard_GUID& XCAFDoc_DocumentTool::ID() const
294 {
295   return GetID();
296 }
297
298
299 //=======================================================================
300 //function : Restore
301 //purpose  : 
302 //=======================================================================
303
304 void XCAFDoc_DocumentTool::Restore(const Handle(TDF_Attribute)& /* with */) 
305 {
306 }
307
308
309 //=======================================================================
310 //function : NewEmpty
311 //purpose  : 
312 //=======================================================================
313
314 Handle(TDF_Attribute) XCAFDoc_DocumentTool::NewEmpty() const
315 {
316   return new XCAFDoc_DocumentTool;
317 }
318
319
320 //=======================================================================
321 //function : Paste
322 //purpose  : 
323 //=======================================================================
324
325 void XCAFDoc_DocumentTool::Paste (const Handle(TDF_Attribute)& /* into */,
326                                   const Handle(TDF_RelocationTable)& /* RT */) const
327 {
328 }
329
330
331 //=======================================================================
332 //function : Init
333 //purpose  : 
334 //=======================================================================
335
336 void XCAFDoc_DocumentTool::Init() const
337 {
338   TDF_Label DocL = Label(), RootL = DocL.Root();
339   const Standard_GUID& aRefGuid = GetDocumentToolRefID();
340   Handle(TDataStd_TreeNode) aRootNode, aLabNode;
341
342   if (!RootL.FindAttribute (aRefGuid, aRootNode)) {
343     Handle(TDataStd_TreeNode) aRootNodeNew = TDataStd_TreeNode::Set (RootL, aRefGuid);
344     Handle(TDataStd_TreeNode) aLNode = TDataStd_TreeNode::Set (DocL, aRefGuid);
345     aLNode->SetFather (aRootNodeNew);
346     aRootNodeNew->SetFirst (aLNode);
347   }
348 }
349
350
351 //=======================================================================
352 //function : IsXCAFDocument
353 //purpose  : 
354 //=======================================================================
355
356 Standard_Boolean XCAFDoc_DocumentTool::IsXCAFDocument(const  Handle(TDocStd_Document)& D)
357 {
358   TDF_Label RootL = D->Main().Root();
359   const Standard_GUID& aRefGuid = GetDocumentToolRefID();
360   Handle(TDataStd_TreeNode) aRootNode;
361   return RootL.FindAttribute (aRefGuid, aRootNode);
362 }