0023593: XCAFDoc_DocumentTool label must be removed from internal map upon closing...
[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
28 // purpose: give acces to DocumentTool->Label() for static methods
29 static TDF_LabelLabelMap RootLDocLMap;
30
31
32 //=======================================================================
33 //function : GetID
34 //purpose  : 
35 //=======================================================================
36
37 const Standard_GUID& XCAFDoc_DocumentTool::GetID() 
38 {
39   static Standard_GUID DocumentToolID ("efd212ec-6dfd-11d4-b9c8-0060b0ee281b");
40   return DocumentToolID; 
41 }
42
43
44 //=======================================================================
45 //function : Set
46 //purpose  : 
47 //=======================================================================
48
49 Handle(XCAFDoc_DocumentTool) XCAFDoc_DocumentTool::Set(const TDF_Label& L,
50                                                        const Standard_Boolean IsAcces)
51 {
52   Handle(XCAFDoc_DocumentTool) A;
53   if (!DocLabel(L).FindAttribute (XCAFDoc_DocumentTool::GetID(), A)) {
54     if (!IsAcces) {
55       TDF_Label RootL = L.Root();
56       if (RootLDocLMap.IsBound(RootL)) RootLDocLMap.UnBind(RootL);
57       RootLDocLMap.Bind(RootL, L);
58     }
59     A = new XCAFDoc_DocumentTool;
60     DocLabel(L).AddAttribute(A);
61     // set ShapeTool, ColorTool and LayerTool attributes
62     XCAFDoc_ShapeTool::Set(ShapesLabel(L));
63     XCAFDoc_ColorTool::Set(ColorsLabel(L));
64     XCAFDoc_LayerTool::Set(LayersLabel(L));
65     XCAFDoc_DimTolTool::Set(DGTsLabel(L));
66     XCAFDoc_MaterialTool::Set(MaterialsLabel(L));
67   }
68   return A;
69 }
70
71
72 //=======================================================================
73 //function : DocLabel
74 //purpose  : 
75 //=======================================================================
76
77 TDF_Label XCAFDoc_DocumentTool::DocLabel(const TDF_Label& acces) 
78 {
79   TDF_Label DocL, RootL = acces.Root();
80   if (RootLDocLMap.IsBound(RootL))
81     return RootLDocLMap.Find(RootL);
82   
83   DocL = RootL.FindChild(1);
84   RootLDocLMap.Bind(RootL, DocL);
85   return DocL;
86 }
87
88
89 //=======================================================================
90 //function : Constructor
91 //purpose  : 
92 //=======================================================================
93
94 XCAFDoc_DocumentTool::XCAFDoc_DocumentTool()
95 {
96 }
97
98
99 //=======================================================================
100 //function : ShapesLabel
101 //purpose  : 
102 //=======================================================================
103
104 TDF_Label XCAFDoc_DocumentTool::ShapesLabel(const TDF_Label& acces) 
105 {
106   TDF_Label L = DocLabel(acces).FindChild(1,Standard_True);
107   TDataStd_Name::Set(L, "Shapes");
108   return L;
109 }
110
111
112 //=======================================================================
113 //function : ColorsLabel
114 //purpose  : 
115 //=======================================================================
116
117 TDF_Label XCAFDoc_DocumentTool::ColorsLabel(const TDF_Label& acces) 
118 {
119   TDF_Label L = DocLabel(acces).FindChild(2,Standard_True);
120   TDataStd_Name::Set(L, "Colors");
121   return L;
122 }
123
124
125 //=======================================================================
126 //function : LayersLabel
127 //purpose  : 
128 //=======================================================================
129
130 TDF_Label XCAFDoc_DocumentTool::LayersLabel(const TDF_Label& acces) 
131 {
132   TDF_Label L = DocLabel(acces).FindChild(3,Standard_True);
133   TDataStd_Name::Set(L, "Layers");
134   return L;
135 }
136
137
138 //=======================================================================
139 //function : DGTsLabel
140 //purpose  : 
141 //=======================================================================
142
143 TDF_Label XCAFDoc_DocumentTool::DGTsLabel(const TDF_Label& acces) 
144 {
145   TDF_Label L = DocLabel(acces).FindChild(4,Standard_True);
146   TDataStd_Name::Set(L, "D&GTs");
147   return L;
148 }
149
150
151 //=======================================================================
152 //function : MaterialsLabel
153 //purpose  : 
154 //=======================================================================
155
156 TDF_Label XCAFDoc_DocumentTool::MaterialsLabel(const TDF_Label& acces) 
157 {
158   TDF_Label L = DocLabel(acces).FindChild(5,Standard_True);
159   TDataStd_Name::Set(L, "Materials");
160   return L;
161 }
162
163
164 //=======================================================================
165 //function : ShapeTool
166 //purpose  : 
167 //=======================================================================
168
169  Handle(XCAFDoc_ShapeTool) XCAFDoc_DocumentTool::ShapeTool(const TDF_Label& acces) 
170 {
171   return XCAFDoc_ShapeTool::Set(ShapesLabel(acces));
172 }
173
174
175 //=======================================================================
176 //function : ColorTool
177 //purpose  : 
178 //=======================================================================
179
180 Handle(XCAFDoc_ColorTool) XCAFDoc_DocumentTool::ColorTool (const TDF_Label& acces) 
181 {
182   return XCAFDoc_ColorTool::Set(ColorsLabel(acces));
183 }
184
185
186 //=======================================================================
187 //function : LayerTool
188 //purpose  : 
189 //=======================================================================
190
191 Handle(XCAFDoc_LayerTool) XCAFDoc_DocumentTool::LayerTool (const TDF_Label& acces) 
192 {
193   return XCAFDoc_LayerTool::Set(LayersLabel(acces));
194 }
195
196
197 //=======================================================================
198 //function : DimTolTool
199 //purpose  : 
200 //=======================================================================
201
202 Handle(XCAFDoc_DimTolTool) XCAFDoc_DocumentTool::DimTolTool(const TDF_Label& acces) 
203 {
204   return XCAFDoc_DimTolTool::Set(DGTsLabel(acces));
205 }
206
207
208 //=======================================================================
209 //function : MaterialTool
210 //purpose  : 
211 //=======================================================================
212
213 Handle(XCAFDoc_MaterialTool) XCAFDoc_DocumentTool::MaterialTool(const TDF_Label& acces) 
214 {
215   return XCAFDoc_MaterialTool::Set(MaterialsLabel(acces));
216 }
217
218
219 //=======================================================================
220 //function : ID
221 //purpose  : 
222 //=======================================================================
223
224 const Standard_GUID& XCAFDoc_DocumentTool::ID() const
225 {
226   return GetID();
227 }
228
229
230 //=======================================================================
231 //function : Restore
232 //purpose  : 
233 //=======================================================================
234
235 void XCAFDoc_DocumentTool::Restore(const Handle(TDF_Attribute)& /* with */) 
236 {
237 }
238
239
240 //=======================================================================
241 //function : NewEmpty
242 //purpose  : 
243 //=======================================================================
244
245 Handle(TDF_Attribute) XCAFDoc_DocumentTool::NewEmpty() const
246 {
247   return new XCAFDoc_DocumentTool;
248 }
249
250
251 //=======================================================================
252 //function : Paste
253 //purpose  : 
254 //=======================================================================
255
256 void XCAFDoc_DocumentTool::Paste (const Handle(TDF_Attribute)& /* into */,
257                                   const Handle(TDF_RelocationTable)& /* RT */) const
258 {
259 }
260
261
262 //=======================================================================
263 //function : Init
264 //purpose  : 
265 //=======================================================================
266
267 void XCAFDoc_DocumentTool::Init() const
268 {
269   TDF_Label DocL = Label(), RootL = DocL.Root();
270   if ( ! RootLDocLMap.IsBound(RootL) ) RootLDocLMap.Bind(RootL, DocL);
271 }
272
273
274 //=======================================================================
275 //function : IsXCAFDocument
276 //purpose  : 
277 //=======================================================================
278
279 Standard_Boolean XCAFDoc_DocumentTool::IsXCAFDocument(const  Handle(TDocStd_Document)& D)
280 {
281   return RootLDocLMap.IsBound(D->Main().Root());
282 }
283
284
285 //=======================================================================
286 //function : Destroy
287 //purpose  : Removal of the document from RootLDocLMap is necessary. Otherwise
288 //           there remains orphan labels and upon creation of a new
289 //           label with XCAFDoc_DocumentTool attribute that
290 //           orphan is attempted to get used (when hashes match) causing
291 //           an exception when trying to access its data framework.
292 //=======================================================================
293
294 void XCAFDoc_DocumentTool::Destroy()
295 {
296   TDF_Label DocL = Label();
297   if ( ! DocL.IsNull() ) {
298     TDF_Label RootL = DocL.Root();
299     if ( RootLDocLMap.IsBound( RootL ) ) 
300       RootLDocLMap.UnBind( RootL );
301   }
302 }