0022707: Invalid shape translating a SAT file
[occt.git] / src / IGESCAFControl / IGESCAFControl_Reader.cxx
1 // File:        IGESCAFControl_Reader.cxx
2 // Created:     Wed Aug 16 18:01:56 2000
3 // Author:      Andrey BETENEV
4 //              <abv@doomox.nnov.matra-dtv.fr>
5
6 #include <TDF_Label.hxx>
7 #include <IGESCAFControl_Reader.ixx>
8 #include <TopoDS_Shape.hxx>
9 #include <XCAFDoc_ShapeTool.hxx>
10 #include <XSControl_TransferReader.hxx>
11 #include <XCAFDoc_ColorTool.hxx>
12 #include <IGESData_IGESEntity.hxx>
13 #include <Transfer_Binder.hxx>
14 #include <TransferBRep.hxx>
15 #include <Quantity_Color.hxx>
16 #include <IGESCAFControl.hxx>
17 #include <IGESGraph_Color.hxx>
18 #include <Interface_InterfaceModel.hxx>
19 #include <Transfer_TransientProcess.hxx>
20 #include <XCAFDoc_DocumentTool.hxx>
21 #include <TopoDS_Iterator.hxx>
22 #include <TCollection_ExtendedString.hxx>
23 #include <TDataStd_Name.hxx>
24 #include <XCAFDoc_LayerTool.hxx>
25 #include <IGESData_LevelListEntity.hxx>
26 #include <TCollection_HAsciiString.hxx>
27 #include <XCAFDoc_ShapeMapTool.hxx>
28
29 //=======================================================================
30 //function : IGESCAFControl_Reader
31 //purpose  : 
32 //=======================================================================
33
34 IGESCAFControl_Reader::IGESCAFControl_Reader () :
35        myColorMode( Standard_True ),
36        myNameMode ( Standard_True ),
37        myLayerMode( Standard_True )
38 {
39 }
40
41
42 //=======================================================================
43 //function : IGESCAFControl_Reader
44 //purpose  : 
45 //=======================================================================
46
47 IGESCAFControl_Reader::IGESCAFControl_Reader (const Handle(XSControl_WorkSession)& WS,
48                                               const Standard_Boolean scratch)
49 {
50   SetWS (WS,scratch);
51   myColorMode = Standard_True;
52   myNameMode = Standard_True;
53   myLayerMode = Standard_True;
54 }
55
56
57 //=======================================================================
58 //function : Transfer
59 //purpose  : basic working method
60 //=======================================================================
61
62 Standard_Boolean IGESCAFControl_Reader::Transfer (Handle(TDocStd_Document) &doc)
63 {
64   // read all shapes
65   Standard_Integer num;// = NbRootsForTransfer();
66   //if ( num <=0 ) return Standard_False;
67   //for ( Standard_Integer i=1; i <= num; i++ ) {
68   //  TransferOneRoot ( i );
69   //}
70   
71   TransferRoots(); // replaces the above
72   num = NbShapes();
73   if ( num <=0 ) return Standard_False;
74
75   // and insert them to the document
76   Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool( doc->Main() );
77   if(STool.IsNull()) return Standard_False;
78   Standard_Integer i;
79   for(i=1; i<=num; i++) {
80     TopoDS_Shape sh = Shape ( i );
81     // ---- HERE -- to add check [ assembly / hybrid model ]
82     STool->AddShape ( sh, Standard_False );
83   }
84   
85   // added by skl 13.10.2003
86   Handle(Interface_InterfaceModel) Model = WS()->Model();
87   //WS()->TransferReader()->SetTransientProcess(TransientProcess());
88   Handle(XSControl_TransferReader) TR = WS()->TransferReader();
89   Handle(Transfer_TransientProcess) TP = TR->TransientProcess();
90   Standard_Boolean IsCTool = Standard_True;
91   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool(doc->Main());
92   if(CTool.IsNull()) IsCTool = Standard_False;
93   Standard_Boolean IsLTool = Standard_True;
94   Handle(XCAFDoc_LayerTool) LTool = XCAFDoc_DocumentTool::LayerTool(doc->Main());
95   if(LTool.IsNull()) IsLTool = Standard_False;
96
97   Standard_Integer nb = Model->NbEntities();
98   for(i=1; i<=nb; i++) {
99     Handle(IGESData_IGESEntity) ent = Handle(IGESData_IGESEntity)::DownCast ( Model->Value(i) );
100     if ( ent.IsNull() ) continue;
101     Handle(Transfer_Binder) binder = TP->Find ( ent );
102     if ( binder.IsNull() ) continue;
103     TopoDS_Shape S = TransferBRep::ShapeResult (binder);
104     if ( S.IsNull() ) continue;
105
106     Standard_Boolean IsColor = Standard_False;
107     Quantity_Color col;
108     if( GetColorMode() && IsCTool ) {
109       // read colors
110       if(ent->DefColor()==IGESData_DefValue ||
111          ent->DefColor()==IGESData_DefReference) {
112         // color is assigned
113         // decode color and set to document
114         IsColor = Standard_True;
115         if ( ent->DefColor() == IGESData_DefValue ) {
116           col = IGESCAFControl::DecodeColor ( ent->RankColor() );
117         }
118         else {
119           Handle(IGESGraph_Color) color = Handle(IGESGraph_Color)::DownCast ( ent->Color() );
120           if ( color.IsNull() ) {
121 #ifdef DEB
122             cout << "Error: Unrecognized type of color definition" << endl;
123 #endif
124             IsColor = Standard_False;
125           }
126           else {
127             Standard_Real r, g, b;
128             color->RGBIntensity ( r, g, b );
129             col.SetValues ( 0.01*r, 0.01*g, 0.01*b, Quantity_TOC_RGB );
130           }
131         }
132       }
133     }
134
135     TDF_Label L;
136
137     Standard_Boolean IsFound;
138     if(IsColor) {
139       CTool->AddColor(col);
140       IsFound = STool->SearchUsingMap(S,L,Standard_False,Standard_True);
141     }
142     else {
143       IsFound = STool->SearchUsingMap(S,L,Standard_False,Standard_False);
144     }
145     if(!IsFound) {
146       if(IsColor) {
147         for (TopoDS_Iterator it(S); it.More(); it.Next()) {
148           if(STool->SearchUsingMap(it.Value(),L,Standard_False,Standard_True)) {
149             CTool->SetColor(L,col,XCAFDoc_ColorGen);
150             if( GetLayerMode() && IsLTool ) {
151               // read layers
152               // set a layers to the document
153               IGESData_DefList aDeflist = ent->DefLevel();
154               switch (aDeflist) {
155               case IGESData_DefOne : {
156                 TCollection_ExtendedString aLayerName ( ent->Level() );
157                 LTool->SetLayer( L, aLayerName );
158                 break;
159               }
160               case IGESData_DefSeveral : {
161                 Handle(IGESData_LevelListEntity) aLevelList = ent->LevelList();
162                 Standard_Integer layerNb = aLevelList->NbLevelNumbers();
163                 for ( Standard_Integer ilev = 1; ilev <= layerNb; ilev++ ) {
164                   TCollection_ExtendedString aLayerName ( aLevelList->LevelNumber(ilev) );
165                   LTool->SetLayer( L, aLayerName );
166                 }
167                 break;
168               }
169                 default : break;
170               }
171             }
172           }
173         }
174       }
175     }
176     else {
177       if(IsColor) {
178         CTool->SetColor(L,col,XCAFDoc_ColorGen);
179       }
180       if(GetNameMode()) {
181         // read names
182         if(ent->HasName()) {
183           TCollection_AsciiString string = ent->NameValue()->String();
184           string.LeftAdjust();
185           string.RightAdjust();
186           TCollection_ExtendedString str(string);
187           TDataStd_Name::Set(L,str);
188         }
189       }
190       if( GetLayerMode() && IsLTool ) {
191         // read layers
192         // set a layers to the document
193         IGESData_DefList aDeflist = ent->DefLevel();
194         switch (aDeflist) {
195         case IGESData_DefOne : {
196           TCollection_ExtendedString aLayerName ( ent->Level() );
197           LTool->SetLayer( L, aLayerName );
198           break;
199         }
200         case IGESData_DefSeveral : {
201           Handle(IGESData_LevelListEntity) aLevelList = ent->LevelList();
202           Standard_Integer layerNb = aLevelList->NbLevelNumbers();
203           for ( Standard_Integer ilev = 1; ilev <= layerNb; ilev++ ) {
204             TCollection_ExtendedString aLayerName ( aLevelList->LevelNumber(ilev) );
205             LTool->SetLayer( L, aLayerName );
206           }
207           break;
208         }
209           default : break;
210         }
211       }
212     }
213   }
214
215   CTool->ReverseChainsOfTreeNodes();
216
217   // end added by skl 13.10.2003
218
219   // read colors
220 //  if ( GetColorMode() )
221 //    ReadColors ( doc );
222   
223   // read names
224 //  if ( GetNameMode() )
225 //    ReadNames ( doc );
226   
227   // read layers
228 //  if ( GetLayerMode() )
229 //    ReadLayers ( doc );
230     
231
232   return Standard_True;
233 }
234   
235
236 //=======================================================================
237 //function : Perform
238 //purpose  : 
239 //=======================================================================
240
241 Standard_Boolean IGESCAFControl_Reader::Perform (const Standard_CString filename,
242                                                  Handle(TDocStd_Document) &doc)
243 {
244   if ( ReadFile ( filename ) != IFSelect_RetDone ) return Standard_False;
245   return Transfer ( doc );
246 }
247   
248
249 //=======================================================================
250 //function : Perform
251 //purpose  : 
252 //=======================================================================
253
254 Standard_Boolean IGESCAFControl_Reader::Perform (const TCollection_AsciiString &filename,
255                                                  Handle(TDocStd_Document) &doc)
256 {
257   if ( ReadFile ( filename.ToCString() ) != IFSelect_RetDone ) return Standard_False;
258   return Transfer ( doc );
259 }
260
261
262 //=======================================================================
263 //function : ReadColors
264 //purpose  : 
265 //=======================================================================
266
267 Standard_Boolean IGESCAFControl_Reader::ReadColors (Handle(TDocStd_Document)& Doc) const
268 {
269
270   Handle(Interface_InterfaceModel) Model = WS()->Model();
271
272   //WS()->TransferReader()->SetTransientProcess(TransientProcess()); // !!!!!!!!!
273   
274   Handle(XSControl_TransferReader) TR = WS()->TransferReader();
275   Handle(Transfer_TransientProcess) TP = /*TransientProcess();*/TR->TransientProcess();
276   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool( Doc->Main() );
277 /*
278   Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool( Doc->Main() );
279   if ( STool.IsNull() ) return Standard_False;
280   Handle(XCAFDoc_ShapeMapTool) SMTool = XCAFDoc_ShapeMapTool::Set(STool->Label());
281   SMTool->ComputeMaps();
282
283   Standard_Integer nb = Model->NbEntities();
284   for (Standard_Integer i = 1; i <= nb; i ++) {
285     Handle(IGESData_IGESEntity) ent = Handle(IGESData_IGESEntity)::DownCast ( Model->Value(i) );
286     if ( ent.IsNull() ) continue;
287     if ( ent->DefColor() != IGESData_DefValue && 
288          ent->DefColor() != IGESData_DefReference ) continue; // no color assigned
289
290     // find tartet shape
291     Handle(Transfer_Binder) binder = TP->Find ( ent );
292     if ( binder.IsNull() ) continue;
293     TopoDS_Shape S = TransferBRep::ShapeResult (binder);
294     if ( S.IsNull() ) continue;
295
296     // decode color and set to document
297     Quantity_Color col;
298     if ( ent->DefColor() == IGESData_DefValue ) {
299       col = IGESCAFControl::DecodeColor ( ent->RankColor() );
300     }
301     else {
302       Handle(IGESGraph_Color) color = Handle(IGESGraph_Color)::DownCast ( ent->Color() );
303       if ( color.IsNull() ) {
304         cout << "Error: Unrecognized type of color definition" << endl;
305         continue;
306       }
307       
308       Standard_Real r, g, b;
309       color->RGBIntensity ( r, g, b );
310       col.SetValues ( 0.01*r, 0.01*g, 0.01*b, Quantity_TOC_RGB );
311     }
312     
313     TDF_Label L;
314     cout<<"i="<<i<<endl;
315     if(SMTool->Search(S,L)) {
316       cout<<"      find Instance"<<endl;
317       CTool->SetColor(L, col, XCAFDoc_ColorGen);
318     }
319     if(L.IsNull()) {
320       cout<<"L1 is Null"<<endl;
321       if(STool->Search(S,L,Standard_False,Standard_False,Standard_True)) {
322         cout<<"     add new label1 :"<<L<<endl;
323         CTool->SetColor(L, col, XCAFDoc_ColorGen);
324       }
325     }
326     if(L.IsNull()) {
327     //else {
328       cout<<"      try to find splitting"<<endl;
329       // may be S is compound of shapes resulting from splitting
330       for (TopoDS_Iterator it(S); it.More(); it.Next()) {
331         //TDF_Label L1;
332         if(!SMTool->Search(it.Value(),L)) continue; //break-?
333         cout<<"      find splitting"<<endl;
334         CTool->SetColor(L, col, XCAFDoc_ColorGen);
335       }
336       if(L.IsNull()) {
337         for (TopoDS_Iterator it(S); it.More(); it.Next()) {
338           if(STool->Search(S,L,Standard_False,Standard_False,Standard_True)) {
339             cout<<"     add new label2 :"<<L<<endl;
340             CTool->SetColor(L, col, XCAFDoc_ColorGen);
341           }
342         }
343       }
344     }
345 //    cout<<"L.Dump():"<<L<<endl;
346 //    if(L.IsNull()) {
347 //      cout<<"L2 is Null"<<endl;
348 //      if(STool->Search(S,L,Standard_False,Standard_False,Standard_True)) {
349 //        cout<<"     add new label2 :"<<L<<endl;
350 //      CTool->SetColor(L, col, XCAFDoc_ColorGen);
351 //      }
352 //    }
353   }
354 */  
355   return Standard_True;
356 }
357
358 //=======================================================================
359 //function : ReadNames
360 //purpose  : 
361 //=======================================================================
362
363 Standard_Boolean IGESCAFControl_Reader::ReadNames (Handle(TDocStd_Document)& Doc) const
364 {
365   Handle(Interface_InterfaceModel) Model = WS()->Model();
366
367   //WS()->TransferReader()->SetTransientProcess(TransientProcess()); // !!!!!!!!!
368   
369   Handle(XSControl_TransferReader) TR = WS()->TransferReader();
370   Handle(Transfer_TransientProcess) TP = /*TransientProcess();*/TR->TransientProcess();
371 /*
372   Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool( Doc->Main() );
373   if ( STool.IsNull() ) return Standard_False;
374   Handle(XCAFDoc_ShapeMapTool) SMTool = XCAFDoc_ShapeMapTool::Set(STool->Label());
375   SMTool->ComputeMaps();
376
377   Standard_Integer nb = Model->NbEntities();
378   for (Standard_Integer i = 1; i <= nb; i ++) {
379     Handle(IGESData_IGESEntity) ent = Handle(IGESData_IGESEntity)::DownCast ( Model->Value(i) );
380     if ( ent.IsNull() || ! ent->HasName() ) continue; //not only Entity Label (f.18) but Name Property also
381
382     // find target shape
383     Handle(Transfer_Binder) binder = TP->Find ( ent );
384     if ( binder.IsNull() ) continue;
385     TopoDS_Shape S = TransferBRep::ShapeResult (binder);
386     if ( S.IsNull() ) continue;
387
388     TDF_Label L;
389     //if ( ! STool->Search ( S, L, Standard_True, Standard_True, Standard_False ) ) continue;
390     if ( ! SMTool->Search ( S, L, Standard_True, Standard_True) ) continue;
391     
392     // set a name to the document
393     TCollection_AsciiString string = ent->NameValue()->String();
394     string.LeftAdjust();
395     string.RightAdjust();
396     TCollection_ExtendedString str ( string );
397     TDataStd_Name::Set ( L, str );
398   }
399 */
400   return Standard_True;
401 }
402
403 //=======================================================================
404 //function : ReadLayers
405 //purpose  : 
406 //=======================================================================
407
408 Standard_Boolean IGESCAFControl_Reader::ReadLayers (Handle(TDocStd_Document)& Doc) const
409 {
410   Handle(Interface_InterfaceModel) Model = WS()->Model();
411
412   //WS()->TransferReader()->SetTransientProcess(TransientProcess()); // !!!!!!!!!
413   
414   Handle(XSControl_TransferReader) TR = WS()->TransferReader();
415   Handle(Transfer_TransientProcess) TP = /*TransientProcess();*/TR->TransientProcess();
416 /*
417   Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool( Doc->Main() );
418   if ( STool.IsNull() ) return Standard_False;
419   Handle(XCAFDoc_ShapeMapTool) SMTool = XCAFDoc_ShapeMapTool::Set(STool->Label());
420   SMTool->ComputeMaps();
421
422   Handle(XCAFDoc_LayerTool) LTool = XCAFDoc_DocumentTool::LayerTool( Doc->Main() );
423   if ( LTool.IsNull() ) return Standard_False;
424
425   Standard_Integer nb = Model->NbEntities();
426   for (Standard_Integer i = 1; i <= nb; i ++) {
427     Handle(IGESData_IGESEntity) ent = Handle(IGESData_IGESEntity)::DownCast ( Model->Value(i) );
428
429     if ( ent.IsNull() ) continue;
430
431     // find target shape
432     Handle(Transfer_Binder) binder = TP->Find ( ent );
433     if ( binder.IsNull() ) continue;
434     TopoDS_Shape S = TransferBRep::ShapeResult (binder);
435     if ( S.IsNull() ) continue;
436
437     TDF_Label L;
438     //if ( ! STool->Search ( S, L, Standard_True, Standard_True, Standard_False ) ) continue;
439     if( !SMTool->Search(S, L, Standard_True, Standard_True) ) continue;
440     
441     // set a layers to the document
442     IGESData_DefList aDeflist = ent->DefLevel();
443     
444     switch (aDeflist) {
445     case IGESData_DefOne : {
446       TCollection_ExtendedString aLayerName ( ent->Level() );
447       LTool->SetLayer( L, aLayerName );
448 #ifdef DEB
449 //      cout << "Added layer " << aLayerName << endl;
450 #endif
451       break;
452     }
453     case IGESData_DefSeveral : {
454       Handle(IGESData_LevelListEntity) aLevelList = ent->LevelList();
455       Standard_Integer layerNb = aLevelList->NbLevelNumbers();
456       for ( Standard_Integer ilev = 1; ilev <= layerNb; ilev++ ) {
457         TCollection_ExtendedString aLayerName ( aLevelList->LevelNumber(ilev) );
458         LTool->SetLayer( L, aLayerName );
459 #ifdef DEB
460 //      cout << "Added layer " << aLayerName << endl;
461 #endif
462       }
463       break;
464     }
465       default : break;
466     }
467           
468   }
469 */
470   return Standard_True;
471 }
472
473
474 //=======================================================================
475 //function : SetColorMode
476 //purpose  : 
477 //=======================================================================
478
479 void IGESCAFControl_Reader::SetColorMode (const Standard_Boolean colormode)
480 {
481   myColorMode = colormode;
482 }
483
484 //=======================================================================
485 //function : GetColorMode
486 //purpose  : 
487 //=======================================================================
488
489 Standard_Boolean IGESCAFControl_Reader::GetColorMode () const
490 {
491   return myColorMode;
492 }
493
494 //=======================================================================
495 //function : SetNameMode
496 //purpose  : 
497 //=======================================================================
498
499 void IGESCAFControl_Reader::SetNameMode (const Standard_Boolean namemode)
500 {
501   myNameMode = namemode;
502 }
503
504 //=======================================================================
505 //function : GetNameMode
506 //purpose  : 
507 //=======================================================================
508
509 Standard_Boolean IGESCAFControl_Reader::GetNameMode () const
510 {
511   return myNameMode;
512 }
513
514 //=======================================================================
515 //function : SetLayerMode
516 //purpose  : 
517 //=======================================================================
518
519 void IGESCAFControl_Reader::SetLayerMode (const Standard_Boolean layermode)
520 {
521   myLayerMode = layermode;
522 }
523
524 //=======================================================================
525 //function : GetLayerMode
526 //purpose  : 
527 //=======================================================================
528
529 Standard_Boolean IGESCAFControl_Reader::GetLayerMode () const
530 {
531   return myLayerMode;
532 }
533