Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : OCCAttribSet.cpp
3 : : //
4 : : // Purpose : Common attribute functionality for MBG
5 : : //
6 : : // Special Notes :
7 : : //
8 : : // Creator : Jason Kraftcheck
9 : : //
10 : : // Creation Date : 03/01/03
11 : : //-------------------------------------------------------------------------
12 : :
13 : : #include "OCCAttribSet.hpp"
14 : : //#include "OCCAttrib.hpp"
15 : : #include "OCCQueryEngine.hpp"
16 : : #include "CubitSimpleAttrib.hpp"
17 : : #include "CubitFileIOWrapper.hpp"
18 : :
19 : : #ifndef OCC_VERSION_MINOR
20 : : #include "Standard_Version.hxx"
21 : : #endif
22 : :
23 : : #if OCC_VERSION_MINOR < 5
24 : : #include "TDataStd_Shape.hxx"
25 : : typedef TDataStd_Shape TDataXtd_Shape;
26 : : typedef Handle_TDataStd_Shape Handle_TDataXtd_Shape;
27 : : #else
28 : : #include "TDataXtd_Shape.hxx"
29 : : #endif
30 : :
31 : : #include "TDF_Label.hxx"
32 : : #include "TopTools_DataMapOfShapeInteger.hxx"
33 : : #include "TCollection_ExtendedString.hxx"
34 : : #include "Handle_TDataStd_Name.hxx"
35 : : #include "Handle_TDataStd_ExtStringArray.hxx"
36 : : #include "Handle_TDataStd_RealArray.hxx"
37 : : #include "Handle_TDataStd_IntegerArray.hxx"
38 : : #include "TDataStd_Name.hxx"
39 : : #include "TDataStd_ExtStringArray.hxx"
40 : : #include "TDataStd_RealArray.hxx"
41 : : #include "TDataStd_IntegerArray.hxx"
42 : : #include "TopoDS_Shape.hxx"
43 : : #include "TDF_ChildIterator.hxx"
44 : : #include <vector>
45 : : typedef std::map<int, TDF_Label>::value_type labType;
46 : :
47 : 1407215 : void OCCAttribSet::FindShape(TopoDS_Shape& shape,
48 : : TDF_Label& aLabel,
49 : : CubitBoolean& found)
50 : : {
51 : 1407215 : found = CUBIT_FALSE;
52 [ + - ][ + - ]: 1407215 : if(!OCCQueryEngine::instance()->OCCMap->IsBound(shape))
[ + + ]
53 : 1407215 : return;
54 : :
55 [ + - ][ + - ]: 1396192 : int k = OCCQueryEngine::instance()->OCCMap->Find(shape);
56 : : std::map<int, TDF_Label>::iterator it =
57 [ + - ][ + - ]: 1396192 : OCCQueryEngine::instance()->Shape_Label_Map->find(k);
58 [ + - ][ + - ]: 1396192 : if(it != OCCQueryEngine::instance()->Shape_Label_Map->end())
[ + - ][ + + ]
59 : : {
60 [ + - ]: 261993 : aLabel = (*it).second;
61 : 1396192 : found = CUBIT_TRUE;
62 : : }
63 : : }
64 : :
65 : 39141 : void OCCAttribSet::append_attribute( const CubitSimpleAttrib& csa, TopoDS_Shape& shape )
66 : : {
67 [ + - ][ - + ]: 39141 : if(shape.IsNull())
68 : 39141 : return;
69 : :
70 : : //Add attributes on child of myLabel
71 : : //1. add shape attribute, first check to make sure there's no shape attribute
72 : 39141 : CubitBoolean found = CUBIT_FALSE;
73 : 39141 : int result = 1;
74 [ + - ][ + - ]: 39141 : TDF_Label aLabel, lab;
75 [ + - ]: 39141 : Handle_TDataStd_Name attr_name;
76 [ + - ][ + - ]: 78282 : CubitString type = csa.string_data_list()[0];
[ + - ][ + - ]
[ + + ]
77 [ + - ][ + - ]: 78282 : TCollection_ExtendedString cstring( (Standard_CString)type.c_str() );
[ + - ][ + + ]
78 : :
79 [ + - ]: 39141 : FindShape(shape, aLabel, found);
80 : :
81 [ + + ]: 39141 : if(!found)
82 : : {
83 [ + - ][ + - ]: 16566 : aLabel = OCCQueryEngine::instance()->mainLabel.NewChild();
84 [ + - ]: 16566 : Handle_TDataXtd_Shape attr_shape = TDataXtd_Shape::Set(aLabel, shape);
85 : : //aLabel.AddAttribute(attr_shape);
86 : : //test if the attribute has been attached
87 [ + - ][ + - ]: 16566 : assert(aLabel.IsAttribute(TDataXtd_Shape::GetID()));
[ - + ]
88 : :
89 [ + - ][ + - ]: 16566 : if(!OCCQueryEngine::instance()->OCCMap->IsBound(shape))
[ + + ]
90 : : {
91 [ + - ]: 6082 : OCCQueryEngine::instance()->iTotalTBCreated++;
92 [ + - ]: 6082 : int k = OCCQueryEngine::instance()->iTotalTBCreated;
93 [ + - ][ + - ]: 6082 : OCCQueryEngine::instance()->OCCMap->Bind(shape, k);
94 : : }
95 : :
96 [ + - ][ + - ]: 16566 : int k = OCCQueryEngine::instance()->OCCMap->Find(shape);
97 [ + - ][ + - ]: 16566 : OCCQueryEngine::instance()->Shape_Label_Map->insert(labType(k, aLabel));
[ + - ][ + - ]
98 : : }
99 : :
100 : : //2. add type attribute , below attributes are added on child lable of myLabel
101 : : //First check if the attributes are already exist, if so, create new data.
102 : : else
103 : : {
104 [ + - ]: 22575 : TCollection_ExtendedString name_string;
105 [ + - ][ + - ]: 51516 : for (TDF_ChildIterator it(aLabel,CUBIT_FALSE); it.More(); it.Next())
[ + - ][ + + ]
106 : : {
107 [ + - ]: 38115 : lab = it.Value();
108 [ + - ]: 38115 : result = find_attribute(lab, csa);
109 [ + + ]: 38115 : if(result != 1)
110 : 9174 : break;
111 [ + - ]: 22575 : }
112 : : }
113 : : //if not exist, create new child label
114 [ + - ][ + - ]: 78282 : Handle_TDataStd_ExtStringArray attr_string;
[ + + ]
115 [ + - ]: 39141 : const std::vector<CubitString>& strings = csa.string_data_list();
116 [ + - ]: 39141 : int size = strings.size()-1;
117 : :
118 [ + + ]: 39141 : if (result == 1)
119 : : {
120 [ + - ]: 29967 : lab = aLabel.NewChild();
121 [ + - ][ + - ]: 29967 : attr_name = TDataStd_Name::Set(lab, cstring);
[ + - ]
122 : : //lab.AddAttribute(attr_name);
123 [ + - ][ + - ]: 29967 : assert(lab.IsAttribute(TDataStd_Name::GetID()));
[ - + ]
124 : : }
125 : :
126 [ + + ]: 9174 : else if(result == 3)//nothing to do
127 : 326 : return;
128 : :
129 [ + - ]: 8848 : else if(result == 2)
130 : : //adding the name strings
131 : : {
132 [ + - ][ + - ]: 8848 : lab.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_string);
133 [ + - ][ + - ]: 17696 : TCollection_ExtendedString name1, name2;
[ + - ]
134 [ + - ][ + - ]: 17696 : std::vector<CubitString> new_names;
135 : 8848 : int length = 0;
136 [ + - ][ + + ]: 19282 : for(int j = 1; j < (int)strings.size();j++)
137 : : {
138 [ + - ][ + - ]: 10434 : CubitString name_string = strings[j];
139 [ + - ][ + - ]: 20868 : TCollection_ExtendedString cstring(name_string.c_str(), Standard_True );
[ + - ]
140 : 10434 : bool dup = false;
141 [ + - ][ + - ]: 10434 : length = attr_string->Length() ;
142 : :
143 [ + + ]: 15568 : for(int i = 0; i < length; i++)
144 : : {
145 [ + - ][ + - ]: 14958 : name1 = attr_string->Value(i);
[ + - ]
146 : : //it could be string[0] = "volume 1", string[1] = "volume_1";
147 : :
148 [ + - ][ + + ]: 14958 : if(name1.IsEqual(cstring))
149 : : {
150 : 9824 : dup = true;
151 : 9824 : break;
152 : : }
153 : : }
154 [ + + ]: 10434 : if(!dup)
155 [ + - ]: 610 : new_names.push_back(name_string);
156 [ + - ]: 10434 : }
157 [ + - ][ + + ]: 8848 : if(new_names.size() > 0)
158 : : {
159 [ + - ]: 568 : lab.ForgetAttribute(attr_string);
160 [ + - ]: 568 : Handle_TDataStd_ExtStringArray attr_string_new;
161 [ + - ][ + - ]: 1136 : attr_string_new = TDataStd_ExtStringArray::Set(lab, 0,
162 [ + - ][ + - ]: 1136 : length+new_names.size()-1);
163 [ + - ][ + - ]: 1928 : for(int i = 0; i < attr_string_new->Length(); i++)
[ + + ]
164 : : {
165 [ + + ]: 1360 : if (i < length)
166 [ + - ][ + - ]: 750 : attr_string_new->SetValue(i, attr_string->Value(i));
[ + - ][ + - ]
167 : : else
168 : : {
169 [ + - ][ + - ]: 610 : TCollection_ExtendedString cstring(new_names[i-length].c_str(), Standard_True );
[ + - ]
170 [ + - ][ + - ]: 610 : attr_string_new->SetValue(i, cstring);
[ + - ]
171 : : }
172 [ + - ]: 568 : }
173 : : }
174 [ + - ]: 17696 : return;
175 : : }
176 : : //3. add string attribute
177 [ + + ]: 29967 : if(size > 0)
178 : : {
179 : : //set the length of String Array .
180 [ + - ][ + - ]: 3423 : attr_string = TDataStd_ExtStringArray::Set(lab, 0, size-1);
[ + - ]
181 : : }
182 [ + - ][ + + ]: 34926 : for(int i = 1; i < (int)strings.size(); i++)
183 : : {
184 [ + - ][ + - ]: 4959 : TCollection_ExtendedString cstring(strings[i].c_str(), Standard_True );
[ + - ]
185 [ + - ][ + - ]: 4959 : attr_string->SetValue(i-1, cstring) ;
186 [ + - ]: 4959 : }
187 : :
188 [ + + ]: 29967 : if (size > 0)
189 : : {
190 : : //lab.AddAttribute(attr_string);
191 [ + - ][ + - ]: 3423 : assert(lab.IsAttribute(TDataStd_ExtStringArray::GetID()));
[ - + ]
192 : : }
193 : : //4. add double attribute
194 [ + - ]: 29967 : const std::vector<double>& doubles = csa.double_data_list();
195 [ + - ][ + - ]: 69108 : Handle_TDataStd_RealArray attr_double;
[ + - ][ + + ]
196 [ + - ]: 29967 : size = doubles.size();
197 [ + + ]: 29967 : if(size > 0)
198 : : {
199 : : //set the length of double array .
200 [ + - ][ + - ]: 240 : attr_double = TDataStd_RealArray::Set(lab,0, size-1);
[ + - ]
201 : : }
202 [ + + ]: 30687 : for(int i = 0; i < size; i++)
203 [ + - ][ + - ]: 720 : attr_double->SetValue(i, doubles[i]);
[ + - ]
204 : :
205 [ + + ]: 29967 : if(size > 0)
206 : : {
207 : : //lab.AddAttribute(attr_double);
208 [ + - ][ + - ]: 240 : assert(lab.IsAttribute(TDataStd_RealArray::GetID()));
[ - + ]
209 : : }
210 : : //5. add int attribute
211 [ + - ]: 29967 : const std::vector<int>& ints = csa.int_data_list();
212 [ + - ][ + - ]: 59934 : Handle_TDataStd_IntegerArray attr_int;
213 [ + - ]: 29967 : size = ints.size();
214 [ + + ]: 29967 : if(size > 0)
215 : : {
216 : : //set the length of int array be 11, can be extended.
217 [ + - ][ + - ]: 27375 : attr_int = TDataStd_IntegerArray::Set(lab, 0, size-1);
[ + - ]
218 : : }
219 [ + + ]: 110714 : for(int i = 0; i < size; i++)
220 [ + - ][ + - ]: 80747 : attr_int->SetValue(i, ints[i]);
[ + - ]
221 : :
222 [ + + ]: 29967 : if(size > 0)
223 : : {
224 : : //lab.AddAttribute(attr_int);
225 [ + - ][ + - ]: 27375 : assert(lab.IsAttribute(TDataStd_IntegerArray::GetID()));
[ - + ]
226 : 29967 : }
227 : : }
228 : :
229 : : // return 1 = not found
230 : : // return 2 = found ENTITY_NAME attribute
231 : : // return 3 = found the same attribute
232 : 94639 : int OCCAttribSet::find_attribute(TDF_Label child,
233 : : const CubitSimpleAttrib& csa)
234 : : {
235 [ + - ]: 94639 : const std::vector<int>& ints = csa.int_data_list();
236 [ + - ]: 94639 : CubitString type = csa.character_type();
237 : 94639 : Standard_Boolean isMultiByte = Standard_True;
238 [ + - ][ + - ]: 189278 : TCollection_ExtendedString cstring( type.c_str(), isMultiByte );
[ + - ]
239 [ + - ]: 94639 : const std::vector<double>& doubles = csa.double_data_list();
240 [ + - ]: 94639 : const std::vector<CubitString>& strings = csa.string_data_list();
241 : :
242 : : //find the same type attribute first
243 [ + - ][ + - ]: 189278 : Handle_TDataStd_Name attr_name;
244 [ + - ][ + - ]: 189278 : TCollection_ExtendedString old_string;
245 [ + - ][ + - ]: 94639 : if(child.FindAttribute(TDataStd_Name::GetID(), attr_name))
[ + + ]
246 : : {
247 [ + - ][ + - ]: 83301 : old_string = attr_name->Get();
[ + - ]
248 : 83301 : Standard_Boolean isMultiByte = Standard_True;
249 : 83301 : char const* string = "ENTITY_NAME";
250 [ + - ]: 83301 : TCollection_ExtendedString string2( string, isMultiByte );
251 [ + - ][ + + ]: 83301 : if(old_string != cstring)
252 : 43798 : return 1;
253 : :
254 [ + - ][ + + ]: 39503 : else if(cstring.IsEqual(string2))
255 [ + - ][ + + ]: 83301 : return 2;
256 : : }
257 : :
258 : : else
259 : 11338 : return 1;
260 : :
261 : : //continue to compare the rest attributes.
262 : 20493 : CubitBoolean is_same = CUBIT_TRUE;
263 [ + - ][ + + ]: 20493 : if(ints.size()> 0 )
264 : : {
265 [ + - ]: 20391 : Handle_TDataStd_IntegerArray attr_ints;
266 [ + - ][ + - ]: 40782 : if(child.FindAttribute(TDataStd_IntegerArray::GetID(), attr_ints) &&
[ + - ][ + + ]
[ + + ]
267 [ + - ][ + - ]: 20391 : attr_ints->Length() == (int)ints.size())
[ + - ]
268 : : {
269 [ + - ][ + + ]: 72963 : for(int i = 0; i < (int)ints.size(); i++)
270 [ + - ][ + - ]: 53886 : if(attr_ints->Value(i) != ints[i])
[ + - ][ + + ]
271 : : {
272 : 1015 : is_same = CUBIT_FALSE;
273 : 1015 : break;
274 : : }
275 [ + - ]: 20391 : }
276 : : }
277 [ + + ]: 20493 : if(!is_same)
278 : 1015 : return 1;
279 : :
280 [ + - ][ + + ]: 19478 : if(doubles.size() > 0 )
281 : : {
282 [ + - ]: 200 : Handle_TDataStd_RealArray attr_doubles;
283 [ + - ][ + - ]: 400 : if(child.FindAttribute(TDataStd_RealArray::GetID(), attr_doubles) &&
[ + - ][ + - ]
[ + - ]
284 [ + - ][ + - ]: 200 : attr_doubles->Length() == (int)doubles.size())
[ + - ]
285 : : {
286 [ + - ][ + + ]: 800 : for(int i = 0; i < (int)doubles.size(); i++)
287 [ + - ][ + - ]: 600 : if(attr_doubles->Value(i) != doubles[i])
[ + - ][ - + ]
288 : : {
289 : 0 : is_same = CUBIT_FALSE;
290 : 0 : break;
291 : : }
292 [ + - ]: 200 : }
293 : : }
294 : :
295 [ - + ]: 19478 : if(!is_same)
296 : 0 : return 1;
297 : :
298 [ + - ][ + - ]: 19478 : if(strings.size() > 0 )
299 : : {
300 [ + - ]: 19478 : Handle_TDataStd_ExtStringArray attr_strings;
301 [ + - ][ + - ]: 20411 : if(child.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_strings) &&
[ + + ][ + - ]
[ + + ]
302 [ + - ][ + - ]: 933 : attr_strings->Length() == (int)strings.size()-1)
[ + - ]
303 : : {
304 [ + - ][ + + ]: 2550 : for(int i = 1; i < (int)strings.size(); i++)
305 : : {
306 [ + - ][ + - ]: 1617 : CubitString astring = strings[i];
307 [ + - ][ + - ]: 3234 : TCollection_ExtendedString string( astring.c_str() , Standard_True);
[ + - ][ + - ]
308 [ + - ][ + - ]: 1617 : if(attr_strings->Value(i-1) != string)
[ + - ][ - + ]
309 : : {
310 : 0 : is_same = CUBIT_FALSE;
311 [ + - ][ + - ]: 1617 : break;
312 : : }
313 : 1617 : }
314 : : }
315 [ - + ]: 19478 : if(!is_same)
316 [ + - ][ + - ]: 19478 : return 1;
317 : : }
318 [ + - ]: 114117 : return 3 ;
319 : : }
320 : :
321 : 0 : void OCCAttribSet::remove_attribute( const CubitSimpleAttrib& csa)
322 : : {
323 [ # # ]: 0 : CubitString type = csa.character_type();
324 [ # # ][ # # ]: 0 : if(type.length() == 0)
325 : 0 : return;
326 : :
327 [ # # ]: 0 : TDF_Label myLabel;
328 [ # # ][ # # ]: 0 : for (TDF_ChildIterator it(OCCQueryEngine::instance()->mainLabel, CUBIT_FALSE); it.More(); it.Next())
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
329 : : {
330 : : //find the same type attribute first
331 [ # # ]: 0 : myLabel = it.Value();
332 : :
333 : : //forget csa attribute from the document
334 [ # # ][ # # ]: 0 : for (TDF_ChildIterator it1(myLabel, CUBIT_FALSE); it1.More(); it1.Next())
[ # # ][ # # ]
335 : : {
336 : : //find the same type attribute first
337 [ # # ]: 0 : TDF_Label child = it1.Value();
338 : :
339 [ # # ]: 0 : int found = find_attribute(child, csa);
340 : :
341 [ # # ]: 0 : if(found == 3)
342 [ # # ]: 0 : child.ForgetAllAttributes(false );
343 : : }
344 : 0 : }
345 : : }
346 : :
347 : 48915 : void OCCAttribSet::remove_attribute( TopoDS_Shape& shape)
348 : : {
349 : 48915 : CubitBoolean found = CUBIT_FALSE;
350 [ + - ]: 48915 : TDF_Label myLabel;
351 : :
352 [ + - ]: 48915 : FindShape(shape, myLabel, found);
353 : :
354 [ + + ]: 48915 : if(!found)
355 : 48915 : return;
356 : :
357 [ + - ]: 5661 : myLabel.ForgetAllAttributes(false);
358 : : /*
359 : : if(OCCQueryEngine::instance()->OCCMap->IsBound(shape))
360 : : {
361 : : int k = OCCQueryEngine::instance()->OCCMap->Find(shape);
362 : : OCCQueryEngine::instance()->Shape_Label_Map->erase(k);
363 : : }
364 : : */
365 : : }
366 : :
367 : 388358 : void OCCAttribSet::remove_attribute( const CubitSimpleAttrib& csa,
368 : : TopoDS_Shape& shape)
369 : : {
370 : 388358 : CubitBoolean found = CUBIT_FALSE;
371 [ + - ]: 388358 : TDF_Label myLabel;
372 : :
373 [ + - ]: 388358 : FindShape(shape, myLabel, found);
374 : :
375 [ + + ]: 388358 : if(!found)
376 : 388358 : return;
377 : :
378 : 80940 : int num_children = 0;
379 : 80940 : int num_found = 0;
380 [ + - ][ + - ]: 238089 : for (TDF_ChildIterator it1(myLabel, CUBIT_FALSE); it1.More(); it1.Next())
[ + - ][ + + ]
381 : : {
382 : : //find the same type attribute first
383 [ + - ]: 157149 : TDF_Label child = it1.Value();
384 [ + - ][ + + ]: 157149 : if (child.NbAttributes() == 0)
385 : 96904 : continue;
386 : :
387 : 64251 : num_children ++;
388 : :
389 [ + - ][ + + ]: 64251 : if(csa.isEmpty())
390 : : {
391 : : //only name attributes can't be forget here.
392 [ + - ]: 7727 : Handle_TDataStd_Name attr_name;
393 [ + - ][ + - ]: 7727 : if(child.FindAttribute(TDataStd_Name::GetID(), attr_name))
[ + - ]
394 : : {
395 [ + - ][ + - ]: 7727 : TCollection_ExtendedString old_string = attr_name->Get();
[ + - ]
396 : 7727 : char const* string1 = "ENTITY_NAME";
397 : 7727 : Standard_Boolean isMultiByte = Standard_True;
398 [ + - ][ + - ]: 15454 : TCollection_ExtendedString cstring( string1, isMultiByte );
[ + + ]
399 [ + - ][ + + ]: 7727 : if( old_string == cstring)
400 [ + - ][ + + ]: 15454 : continue;
401 : : }
402 [ + - ]: 3721 : child.ForgetAllAttributes(false );
403 [ + - ][ + + ]: 7727 : num_found ++;
404 : : }
405 : :
406 : : else
407 : : {
408 [ + - ]: 56524 : int found = find_attribute(child, csa);
409 : :
410 [ + + ]: 56524 : if(found == 3)
411 : : {
412 [ + - ]: 19152 : child.ForgetAllAttributes(false );
413 : 60245 : num_found ++;
414 : : }
415 : : }
416 : : }
417 : : /*
418 : : if(num_children == num_found)
419 : : {
420 : : if(OCCQueryEngine::instance()->OCCMap->IsBound(shape))
421 : : {
422 : : int k = OCCQueryEngine::instance()->OCCMap->Find(shape);
423 : : OCCQueryEngine::instance()->Shape_Label_Map->erase(k);
424 : : }
425 : : }
426 : : */
427 : : }
428 : :
429 : 28881 : void OCCAttribSet::get_attributes(TDF_Label &lab,
430 : : DLIList<CubitSimpleAttrib>& list)
431 : : {
432 [ + - ]: 28881 : std::vector<CubitString> strings;
433 [ + - ][ + - ]: 57762 : CubitString string;
434 [ + - ][ + - ]: 57762 : std::vector<double> doubles;
435 [ + - ][ + - ]: 57762 : std::vector<int> ints;
436 : :
437 [ + - ][ + - ]: 57762 : Handle_TDataStd_Name attr_name;
438 [ + - ][ + - ]: 57762 : TCollection_ExtendedString name_string;
439 [ + - ][ + - ]: 57762 : Handle_TDataStd_ExtStringArray attr_string;
440 [ + - ][ + - ]: 57762 : Handle_TDataStd_RealArray attr_doubles;
441 [ + - ][ + - ]: 57762 : Handle_TDataStd_IntegerArray attr_ints;
442 : :
443 [ + - ][ + - ]: 28881 : if(lab.FindAttribute(TDataStd_Name::GetID(), attr_name))
[ + + ]
444 : : {
445 [ + - ][ + - ]: 26618 : name_string = attr_name->Get();
[ + - ]
446 [ + - ]: 26618 : int length = name_string.Length();
447 [ + - ]: 26618 : std::vector<char> temp_type(length+1);
448 [ + + ]: 300820 : for (int i = 1 ; i <= length; i++)
449 : : {
450 [ + - ]: 274202 : Standard_ExtCharacter c = name_string.Value(i);
451 [ + - ][ + - ]: 274202 : temp_type[i-1] = ToCharacter(c);
452 : : }
453 [ + - ]: 26618 : temp_type[length] = '\0';
454 [ + - ][ + - ]: 26618 : string = CubitString(&temp_type[0]);
[ + - ][ + - ]
455 [ + - ][ + - ]: 26618 : strings.push_back(string);
456 : : }
457 [ + - ][ + - ]: 28881 : if(lab.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_string))
[ + + ]
458 : : {
459 [ + - ][ + - ]: 12572 : int length = attr_string->Length();
460 [ + + ]: 31123 : for (int i = 0 ; i < length; i++)
461 : : {
462 [ + - ][ + - ]: 18551 : name_string = attr_string->Value(i);
[ + - ]
463 [ + - ]: 18551 : int length2 = name_string.Length();
464 [ - + ]: 18551 : if (length2 == 0)
465 : 0 : continue;
466 [ + - ]: 18551 : std::vector<char> temp_string(length2+1);
467 [ + + ]: 265915 : for(int j = 1; j <= length2; j ++)
468 : : {
469 [ + - ]: 247364 : Standard_ExtCharacter c = name_string.Value(j);
470 [ + - ][ + - ]: 247364 : temp_string[j-1] = ToCharacter(c);
471 : : }
472 [ + - ]: 18551 : temp_string[length2] = '\0';
473 [ + - ]: 18551 : const char *s = &temp_string[0];
474 [ + - ][ + - ]: 18551 : string = CubitString(s);
[ + - ]
475 [ + - ]: 18551 : strings.push_back(string);
476 [ + - ]: 18551 : }
477 : : }
478 [ + - ][ + - ]: 28881 : if(lab.FindAttribute(TDataStd_RealArray::GetID(), attr_doubles))
[ + + ]
479 : : {
480 [ + - ][ + - ]: 480 : for(int i = 0; i < attr_doubles->Length(); i++)
[ + + ]
481 : : {
482 [ + - ][ + - ]: 360 : double d = attr_doubles->Value(i);
483 [ + - ]: 360 : doubles.push_back(d);
484 : : }
485 : : }
486 [ + - ][ + - ]: 28881 : if(lab.FindAttribute(TDataStd_IntegerArray::GetID(), attr_ints))
[ + + ]
487 : : {
488 [ + - ][ + - ]: 62037 : for(int i = 0; i < attr_ints->Length(); i++)
[ + + ]
489 : : {
490 [ + - ][ + - ]: 47105 : int j = attr_ints->Value(i);
491 [ + - ]: 47105 : ints.push_back(j);
492 : : }
493 : : }
494 [ + - ][ + + ]: 28881 : if(strings.size() > 0 || doubles.size() || ints.size())
[ + - ][ + - ]
[ + - ][ - + ]
[ + + ]
495 : : {
496 [ + - ][ + - ]: 26618 : list.append(CubitSimpleAttrib(&strings, &doubles, &ints));
[ + - ]
497 [ + - ]: 28881 : }
498 : 28881 : }
499 : :
500 : 121619 : CubitStatus OCCAttribSet::get_attributes( TopoDS_Shape& shape,
501 : : DLIList<CubitSimpleAttrib>& list)
502 : : {
503 : 121619 : CubitBoolean found = CUBIT_FALSE;
504 [ + - ]: 121619 : TDF_Label myLabel;
505 : :
506 [ + - ]: 121619 : FindShape(shape, myLabel, found);
507 : :
508 [ + + ]: 121619 : if(!found)
509 : 112211 : return CUBIT_FAILURE;
510 : :
511 [ + - ]: 9408 : TDF_Label lab;
512 [ + - ][ + - ]: 21454 : for (TDF_ChildIterator it(myLabel,CUBIT_FALSE); it.More(); it.Next())
[ + - ][ + + ]
513 : : {
514 [ + - ]: 12046 : lab = it.Value();
515 [ + - ]: 12046 : get_attributes(lab, list);
516 : : }
517 : 121619 : return CUBIT_SUCCESS;
518 : : }
519 : :
520 : 806457 : CubitStatus OCCAttribSet::get_attributes( const CubitString& name,
521 : : TopoDS_Shape& shape,
522 : : DLIList<CubitSimpleAttrib>& list )
523 : : {
524 : 806457 : CubitBoolean found = CUBIT_FALSE;
525 [ + - ]: 806457 : TDF_Label aLabel;
526 : :
527 [ + - ]: 806457 : FindShape(shape, aLabel, found);
528 : :
529 [ + + ]: 806457 : if(!found)
530 : 665773 : return CUBIT_FAILURE;
531 : :
532 [ + - ]: 140684 : Handle_TDataStd_Name attr_name;
533 [ + - ][ + - ]: 281368 : TCollection_ExtendedString cstring( (Standard_CString)name.c_str() );
[ + - ]
534 [ + - ]: 140684 : TDF_Label lab;
535 [ + - ][ + - ]: 351642 : for (TDF_ChildIterator it(aLabel,CUBIT_FALSE); it.More(); it.Next())
[ + - ][ + + ]
536 : : {
537 [ + - ]: 210958 : lab = it.Value();
538 : :
539 : : //check if the type attribute is the same, disable it
540 [ + - ]: 210958 : TCollection_ExtendedString old_string;
541 [ + - ][ + - ]: 210958 : if(lab.FindAttribute(TDataStd_Name::GetID(), attr_name))
[ + + ]
542 : : {
543 [ + - ][ + - ]: 159807 : old_string = attr_name->Get();
[ + - ]
544 : :
545 [ + - ][ + + ]: 159807 : if(old_string == cstring)
546 : : {
547 [ + - ]: 16835 : get_attributes(lab, list);
548 [ + - ][ + + ]: 210958 : break;
549 : : }
550 : : }
551 : 194123 : }
552 : :
553 [ + - ]: 806457 : return CUBIT_SUCCESS;
554 : : }
555 : :
556 : :
557 : 0 : int OCCAttribSet::attribute_count()
558 : : {
559 : 0 : int count = 0;
560 : :
561 : 0 : return count;
562 [ + - ][ + - ]: 6364 : }
563 : :
|