0022693: Elimination Compiler warnings
[occt.git] / src / TNaming / TNaming_Localizer.cxx
1 // File:        TNaming_Localizer.cxx
2 // Created:     Wed Jun 11 09:59:42 1997
3 // Author:      Yves FRICAUD
4 //              <yfr@claquox.paris1.matra-dtv.fr>
5
6
7 #include <TNaming_Localizer.ixx>
8 #include <TNaming_Identifier.hxx>
9 #include <TNaming_ShapesSet.hxx>
10 #include <TNaming_ListIteratorOfListOfMapOfShape.hxx>
11 #include <TNaming_ListIteratorOfListOfIndexedDataMapOfShapeListOfShape.hxx>
12 #include <TNaming_DataMapOfShapeShapesSet.hxx>
13 #include <TNaming_IteratorOnShapesSet.hxx>
14 #include <TNaming_Evolution.hxx>
15 #include <TNaming_Iterator.hxx>
16 #include <TNaming_NewShapeIterator.hxx>
17 #include <TNaming_OldShapeIterator.hxx>
18 #include <TNaming_Tool.hxx>
19 #include <TNaming_ListOfNamedShape.hxx>
20 #include <TNaming_ListIteratorOfListOfNamedShape.hxx>
21 #include <TDF_Label.hxx>
22 #include <TopoDS_Iterator.hxx>
23 #include <TopTools_ListOfShape.hxx>
24 #include <TopTools_ListIteratorOfListOfShape.hxx>
25 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
26 #include <TopTools_MapIteratorOfMapOfShape.hxx>
27 #include <TopExp.hxx> 
28 #include <TopExp_Explorer.hxx>
29
30 #define OCC351
31 #ifdef DEB
32 //#define MDTV_DEB_SC
33 #ifdef MDTV_DEB_SC
34 #include <TDF_Tool.hxx>
35 #include <TDF_MapIteratorOfLabelMap.hxx>
36
37 #include <TCollection_AsciiString.hxx>
38 #include <BRepTools.hxx>
39 void LPrintEntry(const TDF_Label&       label)
40 {
41   TCollection_AsciiString entry;
42   TDF_Tool::Entry(label, entry);
43   cout << "LabelEntry = "<< entry << endl;
44 }
45 static void LWrite(const TopoDS_Shape& shape,
46                       const Standard_CString filename) 
47 {
48   char buf[256];
49   if(strlen(filename) > 256) return;
50 #if defined WNT 
51   strcpy_s (buf, filename);
52 #else
53   strcpy (buf, filename);
54 #endif
55   char* p = buf;
56   while (*p) {
57     if(*p == ':')
58       *p = '-';
59     p++;
60   }
61   ofstream save (buf);
62   if(!save) 
63     cout << "File " << buf << " was not created: rdstate = " << save.rdstate() << endl;
64   save << "DBRep_DrawableShape" << endl << endl;
65   if(!shape.IsNull()) BRepTools::Write(shape, save);
66   save.close();
67 }
68
69 //=======================================================================
70 static void LWriteNSOnLabel (const Handle(TNaming_NamedShape)& NS,  
71                                      const Standard_CString filename) 
72 {
73   if(!NS.IsNull() && !NS->IsEmpty() ) {
74     TCollection_AsciiString aNam (filename);
75     TCollection_AsciiString oldS ("_Old");
76     TCollection_AsciiString newS ("_New_");
77     Standard_Integer i(0);
78     TNaming_Iterator it(NS);
79     for(;it.More(); it.Next(),i++) {
80       TCollection_AsciiString aName1 = aNam + oldS + i + ".brep";
81       TCollection_AsciiString aName2 = aNam + newS + i + ".brep";
82       const TopoDS_Shape& oldShape = it.OldShape();
83       const TopoDS_Shape& newShape = it.NewShape();
84       if(!oldShape.IsNull())
85         LWrite ( oldShape, aName1.ToCString());
86       if(!newShape.IsNull())
87         LWrite ( newShape, aName2.ToCString());      
88     }
89   }
90 }
91 #endif
92 #endif
93 //=======================================================================
94  //function : FindFeatureInAncestors
95 //purpose  : Cherche les ancetres de S qui sont sous des labels
96 //=======================================================================
97
98 void TNaming_Localizer::FindFeaturesInAncestors 
99 (const TopoDS_Shape&                        S,
100  const TopoDS_Shape&                        Context,
101  TopTools_MapOfShape&                       AncInFeature)
102 {
103 #ifdef MDTV_DEB_SC
104   LWrite(S, "Localizer_S.brep");
105   LWrite(Context, "Localizer_Context.brep");
106 #endif
107
108   const TopTools_IndexedDataMapOfShapeListOfShape& Anc = Ancestors(Context,S.ShapeType());
109   
110   if (Anc.Contains(S)) {
111 #ifdef MDTV_DEB_SC
112     cout <<"Localizer: S in ancestor" <<endl;
113 #endif
114     const TopTools_ListOfShape& L = Anc.FindFromKey(S);
115     TopTools_ListIteratorOfListOfShape itL(L);
116     for (; itL.More(); itL.Next()) {
117       const TopoDS_Shape& AS = itL.Value();
118 #ifdef MDTV_DEB_SC
119       LWrite(AS, "Localizer_AS.brep");
120 #endif      
121       Handle(TNaming_NamedShape) NS = TNaming_Tool::NamedShape(AS,myUS->Label());
122       if (!NS.IsNull()) {
123 //      if (TNaming_Tool::HasLabel(myUS,AS)) {
124         AncInFeature.Add(AS);
125       }
126       else if (AS.ShapeType() > TopAbs_FACE) {
127         FindFeaturesInAncestors (AS, Context, AncInFeature);
128       }
129       else {
130 #ifdef DEB
131         cout <<" TNaming_Localization : Failure in the research of ancetres in TDF"<<endl;
132 #endif
133       }
134     }
135     
136   }
137   else {
138 #ifdef DEB
139     cout <<" TNaming_Localization : S n est pas dans le solide"<<endl;//S is not in the solid
140 #endif
141   }
142 }
143
144 //=======================================================================
145 //function : SubShapes
146 //purpose  : 
147 //=======================================================================
148
149 const TopTools_MapOfShape& TNaming_Localizer::SubShapes (const TopoDS_Shape&    In,
150                                                          const TopAbs_ShapeEnum TS)
151 {
152
153   TopTools_ListIteratorOfListOfShape     itS(myShapeWithSubShapes) ;
154   TNaming_ListIteratorOfListOfMapOfShape itSS(mySubShapes);
155 //  Standard_Boolean Found = Standard_False;
156   for (; itS.More(); itS.Next(),itSS.Next()) {
157     if (In.IsSame(itS.Value())) {
158       TopTools_MapOfShape& SubShapes = itSS.Value();
159       for (TopExp_Explorer exp(In,TS); exp.More(); exp.Next()) {
160         const TopoDS_Shape& SS = exp.Current();
161         if (SubShapes.Contains(SS)) {
162           break;
163         }
164         SubShapes.Add(SS);
165       }
166       return SubShapes;
167     }
168   }
169
170   TopTools_MapOfShape emptyMap;
171   mySubShapes.Prepend(emptyMap);
172   myShapeWithSubShapes.Prepend(In);
173   
174   TopTools_MapOfShape& SubShapes = mySubShapes.First();
175   for (TopExp_Explorer exp(In,TS); exp.More(); exp.Next()) {
176     const TopoDS_Shape& SS = exp.Current();
177     if (SubShapes.Contains(SS)) {
178       break;
179     }
180     SubShapes.Add(SS);
181   }
182   return SubShapes;
183 }
184
185
186 //=======================================================================
187 //function : Ancestors
188 //purpose  : 
189 //=======================================================================
190
191 const TopTools_IndexedDataMapOfShapeListOfShape& TNaming_Localizer::Ancestors
192 (const TopoDS_Shape&     In,
193  const TopAbs_ShapeEnum  TS)
194 {
195   TopTools_ListIteratorOfListOfShape                           itS(myShapeWithAncestors) ;
196   TNaming_ListIteratorOfListOfIndexedDataMapOfShapeListOfShape itA(myAncestors);
197 //  Standard_Boolean Found = Standard_False;
198   for (; itS.More(); itS.Next(),itA.Next()) {
199     if (In.IsSame(itS.Value())) {
200       //-----------------------
201       // Ancetres existent.
202       //-----------------------
203       TopTools_IndexedDataMapOfShapeListOfShape& Anc = itA.Value();
204
205       TopExp_Explorer exp(In,TS);
206 #ifdef DEB
207       if (!exp.More())   cout <<" TNaming_Localization : Construction ancetres impossible"<<endl;
208 #endif
209       const TopoDS_Shape& SS = exp.Current();
210       
211       if (Anc.Contains(SS)) {
212         return Anc;
213       }
214       else {
215         //----------------------------
216         // Completion des ancetres.
217         //----------------------------
218         TopAbs_ShapeEnum TA = TopAbs_FACE;
219         if (TS == TopAbs_EDGE)   TA = TopAbs_FACE;
220         if (TS == TopAbs_VERTEX) TA = TopAbs_EDGE;
221         if (TA >= In.ShapeType()) {
222           TopExp::MapShapesAndAncestors(In, TS, TA, Anc);
223         }
224         else {
225 #ifdef DEB
226           cout <<" TNaming_Localization : Construction ancetres impossible"<<endl;
227 #endif
228         }
229       }
230       return Anc;
231     }
232   }
233   //-----------------------------------
234   // Construction des ancetres
235   //-----------------------------------
236   TopTools_IndexedDataMapOfShapeListOfShape emptyAnc;
237   myShapeWithAncestors.Prepend(In);
238   myAncestors         .Prepend(emptyAnc);
239 #ifdef DEB
240   TopAbs_ShapeEnum TA;
241 #else
242   TopAbs_ShapeEnum TA=TopAbs_COMPOUND;
243 #endif
244   if (TS == TopAbs_VERTEX)      TA = TopAbs_EDGE;
245   else if (TS == TopAbs_EDGE)   TA = TopAbs_FACE;
246   else if (TS == TopAbs_FACE)   TA = TopAbs_SOLID;
247   if ((TS == TopAbs_EDGE || TS == TopAbs_VERTEX || TS == TopAbs_FACE) && TA >= In.ShapeType()) {
248     TopExp::MapShapesAndAncestors(In, TS, TA, myAncestors.First());
249   }
250   else {
251 #ifdef DEB
252     cout <<" TNaming_Localization : Construction ancetres impossible"<<endl;
253 #endif
254   }
255   return myAncestors.First();
256 }
257
258 //=======================================================================
259 //function : IsNew
260 //purpose  : 
261 //=======================================================================
262
263 Standard_Boolean TNaming_Localizer::IsNew (const TopoDS_Shape&    S,
264                                            const Handle(TNaming_NamedShape)& NS)
265 {
266   TNaming_Iterator itLab(NS);
267   for (; itLab.More(); itLab.Next()) {
268     if (itLab.OldShape().IsSame(S)) {
269       return Standard_False;
270       break;
271     }
272     if (itLab.NewShape().IsSame(S)) {
273       return Standard_True;
274       break;
275     }
276   }
277 #ifdef DEB
278   cout <<"TNaming_Localizer:IsNewInLab : Shape n est pas dans le Label."<<endl;
279 #endif
280   return Standard_False;
281 }
282
283
284 //=======================================================================
285 //function : Back
286 //purpose  : 
287 //=======================================================================
288
289 void TNaming_Localizer::GoBack (const TopoDS_Shape&         S,
290                                 const TDF_Label&            Lab,
291                                 const TNaming_Evolution     Evol,
292                                 TopTools_ListOfShape&       LBS,
293                                 TNaming_ListOfNamedShape&   LBNS)
294 {
295 //  Standard_Integer TrDef;
296
297   TNaming_OldShapeIterator it(S,myCurTrans,myUS);
298   TopoDS_Shape             Sol; 
299   if (!it.More()) {
300     //-----------------------------------------------------------
301     // Pas d'ascendants => Recherche et exploration  du contenant
302     //----------------------------------------------------------
303     TDF_Label        Father  = Lab.Father();
304     TNaming_Iterator itLab(Father);
305     for (; itLab.More(); itLab.Next()) {
306       Sol = itLab.OldShape();
307       break;
308     }
309     //-------------------------------------------
310     // Recherche des ancetres dans des features.
311     //-------------------------------------------
312     if (!Sol.IsNull()) {
313       TopTools_MapOfShape AncInFeature;
314       FindFeaturesInAncestors (S, Sol, AncInFeature); 
315       TopTools_MapIteratorOfMapOfShape itF(AncInFeature);
316       for ( ; itF.More(); itF.Next()) {
317         const TopoDS_Shape& AncOfS = itF.Key();
318         LBS  .Append(AncOfS);
319         LBNS.Append(TNaming_Tool::NamedShape(AncOfS,Lab));
320       }
321     }
322   } 
323   else {
324     for ( ; it.More(); it.Next()) {
325 //      if (it.NamedShape()->Evolution() != TNaming_SELECTED) {
326       if (it.NamedShape()->Evolution() == Evol) {
327         Handle(TNaming_NamedShape) NS = TNaming_Tool::NamedShape(it.Shape(),Lab);
328         if (!NS.IsNull()) {
329           LBS.Append  (it.Shape());
330           LBNS.Append (TNaming_Tool::NamedShape(it.Shape(),Lab));
331         }
332         else {
333 #ifdef DEB
334           cout <<"TNaming_Localizer: Shape modifie sans avoir ete cree"<<endl;
335 #endif
336         }
337       }
338     }
339   }
340 }
341 /*
342 //=======================================================================
343 //function : Backward
344 //purpose  :
345 //=======================================================================
346
347 void TNaming_Localizer::Backward (const TopoDS_Shape&  S, 
348                                   TDF_LabelMap&        Primitives, 
349                                   TopTools_MapOfShape& ValidShapes)
350
351   Standard_Integer  PrevTrans = myCurTrans - 1;
352   Standard_Integer  TrDef;
353   TDF_Label         Lab      = TNaming_Tool::Label (myUS, S, TrDef);
354   TNaming_Evolution Evol     = Evolution(Lab);
355
356
357   TopTools_ListOfShape  LBS;
358   TDF_LabelList         LBLab;
359
360   GoBack(S,Lab,LBS,LBLab);
361   
362
363   TopTools_ListIteratorOfListOfShape itLBS  (LBS);
364   TDF_ListIteratorOfLabelList        itLBLab(LBLab);
365
366   if (LBS.IsEmpty()) {
367     Primitives.Add(Lab);
368   }
369   for ( ; itLBS.More(); itLBS.Next(), itLBLab.Next()) {
370     const TopoDS_Shape& OS    = itLBS.Value();
371     const TDF_Label&    LabOS = itLBLab.Value();
372
373     Evol = Evolution(LabOS);
374
375     if (TNaming_Tool::ValidUntil(OS,myUS) >= myCurTrans) {
376       //---------------------------------------------------------
377       // Le Shape est valid dans la transaction myCurTrans => STOP
378       //---------------------------------------------------------
379       ValidShapes.Add(OS);
380     }
381     else if (Evol == TNaming_PRIMITIVE) {    
382       Primitives.Add(LabOS);
383     }
384     else if ((Evol == TNaming_GENERATED) && IsNewInLab (OS,LabOS,PrevTrans)) {
385       //--------------------------------------------------------------
386       // Passage  par une generation
387       // le shape dans myCurTrans descendra d un element de cet attribut.
388       // Localisation de OS dans la transaction courrante.
389       // les shapes obtenus seront des antecedants du shape cherche.
390       //--------------------------------------------------------------
391       
392       // A faire seulememt si OS est un newShape dans LabOS.
393       TNaming_ShapesSet ResGen;    
394       TopoDS_Shape      PrevIn;
395       TDF_Label         Father  = LabOS.Father();
396       TNaming_Iterator  itLab(Father,PrevTrans);
397       for (; itLab.More(); itLab.Next()) {
398         PrevIn= itLab.OldShape();
399         break;
400       }
401       Localize(PrevIn,LabOS,OS,ResGen);
402       for (TNaming_IteratorOnShapesSet itLoc(ResGen); itLoc.More(); itLoc.Next()) {
403         ValidShapes.Add(itLoc.Value());
404       } 
405     }
406     else if (Evol == TNaming_SELECTED) {
407       //PAS FINI.
408       TNaming_ShapesSet ResSel;
409       TopoDS_Shape      PrevIn,CurIn;
410 //      FindIn  (LabOS,PrevIn,CurIn);  
411       Localize(PrevIn,CurIn,OS,ResSel);
412       for (TNaming_IteratorOnShapesSet itLoc(ResSel); itLoc.More(); itLoc.Next()) {
413         ValidShapes.Add(itLoc.Value());
414       }
415     }
416     else {
417       Backward(itLBS.Value(),Primitives,ValidShapes);
418     }
419   }
420 }
421 */
422
423 //=======================================================================
424 //function : NamedShape
425 //purpose  : 
426 //=======================================================================
427
428 Handle(TNaming_NamedShape) NamedShape(const TDF_Label& Lab)
429 {
430   Handle(TNaming_NamedShape) NS;
431   Lab.FindAttribute(TNaming_NamedShape::GetID(),NS);
432   return NS;
433 }
434
435 //=======================================================================
436 //function : Backward
437 //purpose  :
438 //=======================================================================
439
440 void TNaming_Localizer::Backward (const Handle(TNaming_NamedShape)& NS,
441                                   const TopoDS_Shape&               S, 
442                                   TNaming_MapOfNamedShape&          Primitives, 
443                                   TopTools_MapOfShape&              Shapes)
444
445   TNaming_Evolution Evol     = NS->Evolution();
446   TDF_Label         LabNS    = NS->Label();
447
448   TopTools_ListOfShape      LBS;
449   TNaming_ListOfNamedShape  LBNS;
450
451   GoBack(S,LabNS,Evol,LBS,LBNS);
452   
453
454   TopTools_ListIteratorOfListOfShape     itLBS  (LBS);
455   TNaming_ListIteratorOfListOfNamedShape itLBNS (LBNS);
456
457   if (LBS.IsEmpty()) {
458     Primitives.Add(NS);
459   }
460   for ( ; itLBS.More(); itLBS.Next(), itLBNS.Next()) {
461     const TopoDS_Shape&        OS  = itLBS.Value();
462     Handle(TNaming_NamedShape) NOS = itLBNS.Value();
463     Evol = NOS->Evolution();
464     if (Evol == TNaming_PRIMITIVE) {    
465       Primitives.Add(NOS);
466     }
467     else if (Evol == TNaming_GENERATED) {
468       Shapes.Add(OS);
469     }
470     else {
471       Backward(NOS, itLBS.Value(),Primitives,Shapes);
472     }
473   }
474 }
475
476 //=======================================================================
477 //function : ValidCandidat
478 //purpose  : 
479 //=======================================================================
480
481 #ifdef DEB
482 /*static Standard_Boolean StoreValid (const TopoDS_Shape&        S,
483                                     const TopTools_MapOfShape& ShapeOfSol,
484                                     TopAbs_ShapeEnum           TargetType,
485                                     TNaming_ShapesSet&         Res) 
486 {
487   Standard_Boolean Valid = Standard_False;
488
489   if (ShapeOfSol.Contains(S)) {
490     if (S.ShapeType() == TargetType) {
491       Res.Add(S);
492       return Standard_True;
493     }
494     else  if (S.ShapeType() < TargetType) {
495       for (TopExp_Explorer exp(S,TargetType); exp.More(); exp.Next()) {
496         const TopoDS_Shape& SS = exp.Current();
497         Res.Add(SS);
498         Valid = Standard_True;
499       }
500     }
501   }
502   return Valid;
503 }*/
504 #endif
505
506 /*
507 //=======================================================================
508 //function : Forward
509 //purpose  : 
510 //=======================================================================
511
512 void TNaming_Localizer::GoForward(const TopoDS_Shape&               S,
513                                   const TopTools_MapOfShape&        Target,
514                                   const TopAbs_ShapeEnum            TargetType,
515                                   TNaming_ShapesSet&                Res)
516                                          
517 {
518   Standard_Integer TrDef;
519   TDF_Label Lab = TNaming_Tool::Label (myUS, S, TrDef);
520   if (StoreValid (S, Target, TargetType, Res)) {
521     return;
522   }
523   TNaming_Evolution        Evol = Evolution(Lab);
524   TNaming_NewShapeIterator NewIt(S,myCurTrans,myUS);
525   
526   for ( ; NewIt.More(); NewIt.Next()) {
527     const TopoDS_Shape& NS = NewIt.Shape();
528     GoForward ( NS, Target, TargetType, Res);
529   }
530 }
531
532 */
533
534 //=======================================================================
535 //function : FindNeighbourg
536 //purpose  : 
537 //=======================================================================
538
539 void TNaming_Localizer::FindNeighbourg (const TopoDS_Shape&      Sol,
540                                         const TopoDS_Shape&      S,
541                                         TopTools_MapOfShape&     Neighbourg)
542 {  
543   TopAbs_ShapeEnum       TA = S.ShapeType();
544 #ifdef DEB
545   TopAbs_ShapeEnum       TS;
546 #else
547   TopAbs_ShapeEnum       TS=TopAbs_COMPOUND;
548 #endif
549   if (TA == TopAbs_FACE) TS = TopAbs_EDGE;
550   if (TA == TopAbs_EDGE) TS = TopAbs_VERTEX;
551   if (TA == TopAbs_VERTEX) TS = TopAbs_VERTEX; // szy 30.03.10
552   const TopTools_IndexedDataMapOfShapeListOfShape& Anc = Ancestors(Sol,TS); 
553 // szy 30.03.10 to process case when Candidate is of type Vertex
554 //  if (TA == TopAbs_VERTEX) {
555 //#ifdef DEB
556 //    cout <<"construction voisins des vertex impossible"<<endl;
557 //#endif
558 //    return;
559 //  }
560   for (TopExp_Explorer  Exp(S,TS); Exp.More(); Exp.Next()) {
561     const TopoDS_Shape& SS = Exp.Current();
562     if (!Anc.Contains(SS)) {
563       //----------------------------------------------------
564       // Construction des ancetres
565       //----------------------------------------------------
566       break;
567     }
568     else {
569       TopTools_ListIteratorOfListOfShape itL(Anc.FindFromKey(SS));
570       for ( ; itL.More(); itL.Next()) {
571         if (!itL.Value().IsSame(S)) {
572           Neighbourg.Add(itL.Value());
573         }
574       }
575     }
576   }
577 }
578
579 //=======================================================================
580 //function : TNaming_Localizer
581 //purpose  : 
582 //=======================================================================
583
584 TNaming_Localizer::TNaming_Localizer() 
585 {
586 }
587
588
589 //=======================================================================
590 //function : Init
591 //purpose  : 
592 //=======================================================================
593
594 void TNaming_Localizer::Init(const Handle(TNaming_UsedShapes)& US,
595                              const Standard_Integer            CurTrans) 
596 {
597   myUS       = US;
598   myCurTrans = CurTrans;
599 }
600
601
602 //=======================================================================
603 //function : Explode
604 //purpose  : 
605 //=======================================================================
606
607 #ifdef DEB
608 /*static void Explode (TNaming_ShapesSet& Res,
609                      TopAbs_ShapeEnum   TS,
610                      TNaming_ShapesSet& ResGoodType) 
611 {
612   TNaming_IteratorOnShapesSet it(Res);
613   for ( ; it.More(); it.Next()) {
614     const TopoDS_Shape& S = it.Value();
615     TopExp_Explorer exp(S,TS);
616     for (; exp.More(); exp.Next()) {
617       ResGoodType.Add(exp.Current());
618     }
619   }
620 } */ 
621 #endif
622
623 /*
624 //=======================================================================
625 //function : Localize
626 //purpose  : 
627 //=======================================================================
628
629 void TNaming_Localizer::Localize(const TopoDS_Shape& PrevIn,
630                                  const TopoDS_Shape& CurIn ,
631                                  const TopoDS_Shape& S,
632                                  TNaming_ShapesSet& Res) 
633 {  
634   Res.Clear();
635   TDF_LabelMap                 Primitives;
636   TopTools_MapOfShape          ValidShapes;
637   Standard_Integer             PrevTrans = myCurTrans-1;
638
639   const TopTools_MapOfShape& CurSubShapes = SubShapes (CurIn,S.ShapeType());
640
641   Standard_Boolean HasLabel = TNaming_Tool::HasLabel(myUS,S);
642
643   if (HasLabel) {
644     Standard_Integer  TrDef;
645     TDF_Label         Lab      = TNaming_Tool::Label (myUS, S, TrDef);
646     TNaming_Evolution Evol     = Evolution(Lab);
647     if (Evol == TNaming_PRIMITIVE) {
648       //------------------------
649       // Label est une primitive
650       //------------------------
651       Primitives.Add(Lab);
652       Forward  (CurSubShapes,S.ShapeType(),Primitives,ValidShapes,Res);
653       return;
654     }
655     if ((Evol == TNaming_GENERATED) && IsNewInLab (S,Lab,PrevTrans)) {
656       Localize(PrevIn,Lab,S,Res);
657       return;
658     }
659   }
660   
661   if (HasLabel && HasAscendant(myUS,S,PrevTrans)) {
662     //-------------------
663     // Remontee Descente.
664     //-------------------
665     Backward (S, Primitives, ValidShapes);
666     Forward  (CurSubShapes,S.ShapeType(),Primitives,ValidShapes,Res);
667   }
668   else {
669     //----------------------------------------------
670     // Localisation des ancetres.
671     //----------------------------------------------
672     TopTools_MapOfShape AncInFeature;
673     FindFeaturesInAncestors (S, PrevIn, AncInFeature); 
674     TopTools_MapIteratorOfMapOfShape itF(AncInFeature);
675     Standard_Boolean First = Standard_True;
676
677     for ( ; itF.More(); itF.Next()) {
678       const TopoDS_Shape& AncOfS = itF.Key();
679       TNaming_ShapesSet   ResAnc;
680
681       Localize (PrevIn, CurIn, AncOfS, ResAnc);
682
683       //---------------------------
684       // Res = Commun des resultats
685       //---------------------------
686       if (First) {
687         Explode (ResAnc,S.ShapeType(),Res);
688         First = 0;
689       }
690       else {
691         TNaming_ShapesSet ResGoodType;
692         Explode (ResAnc,S.ShapeType(),ResGoodType);
693         Res.Filter(ResGoodType);
694       }
695     }
696   }
697 }
698 */
699
700 //=======================================================================
701 //function : FindGenerator
702 //purpose  : Finds all generators of the <S> kept in <NS>
703 //=======================================================================
704
705 void TNaming_Localizer::FindGenerator (const Handle(TNaming_NamedShape)& NS,
706                                        const TopoDS_Shape&               S,
707                                        TopTools_ListOfShape& theListOfGenerators)
708      
709
710   Handle(TNaming_UsedShapes) US;
711   TDF_Label LabNS = NS->Label();
712   (LabNS.Root()).FindAttribute(TNaming_UsedShapes::GetID(),US);
713   
714   for (TNaming_OldShapeIterator it (S,US); it.More(); it.Next()) {
715     if (it.Label() == LabNS) {
716       theListOfGenerators.Append(it.Shape());
717 //      break; //szy 16.10.03
718
719     }
720   }  
721 }
722
723 //=======================================================================
724 //function : FindShapeContext
725 //purpose  : Finds context of the shape <S>.
726 //         : Looks for all oldshapes kept at father label of <NS>.
727 //         : If <S> validated as subshape of one of the old shapes -
728 //         : this oldshape is Context.
729 //=======================================================================
730
731 void TNaming_Localizer::FindShapeContext (const Handle(TNaming_NamedShape)& NS,
732                                           const TopoDS_Shape&               S,
733                                                 TopoDS_Shape&               SC)
734      
735
736 #ifdef MDTV_DEB_SC
737     LWrite(S, "FSC_Sel.brep"); LPrintEntry( NS->Label());
738 #endif
739   TopTools_ListOfShape aList;
740   TDF_Label Father = NS->Label().Father();
741   TNaming_Iterator  itLab(Father);
742   for (; itLab.More(); itLab.Next()) {
743     aList.Append(itLab.OldShape()); //szy
744   }
745 // szy 
746   TopTools_ListIteratorOfListOfShape it(aList);
747   Standard_Boolean found = 0;
748   for(;it.More();it.Next()) {
749     SC = it.Value();
750 #ifdef MDTV_DEB_SC
751     LWrite(SC, "FSC_OldShape.brep");
752 #endif
753     if (SC.IsNull()) continue;
754     else {
755       if (SC.ShapeType() < S.ShapeType()) {
756         for (TopExp_Explorer exp(SC,S.ShapeType()); exp.More(); exp.Next()) {
757           if (exp.Current().IsSame(S)) {
758             found = 1;
759 #ifdef MDTV_DEB_SC
760             cout << "Find Context shape = " << SC.TShape() << "ShapeType = " << SC.ShapeType() <<endl;
761 #endif      
762             break;
763           }
764         }
765         if(found) break;
766       }
767     }
768   }
769 // end szy
770 #ifdef OCC351
771   if (!SC.IsNull()) {
772     Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(SC,Father);
773     if (!aNS.IsNull()) {
774 #ifdef MDTV_DEB_SC
775       cout << "FindShapeContext: ";LPrintEntry(aNS->Label());
776 #endif
777       if (aNS->Label().Father().FindAttribute(TNaming_NamedShape::GetID(),aNS)) {
778         TopoDS_Shape aShape;
779 #ifdef MDTV_DEB_SC
780         LWriteNSOnLabel(aNS, "FSC");
781 #endif
782         TNaming_Iterator anIter(aNS->Label());
783         for(;anIter.More();anIter.Next()) {
784           aShape = anIter.NewShape();
785           if (!aShape.IsNull()) break;
786         }
787         if (!aShape.IsNull()) SC=aShape;
788       }
789     }
790   }
791 #endif
792
793 }
794
795 /*
796 //=======================================================================
797 //function : Localize
798 //purpose  : 
799 //=======================================================================
800
801 void TNaming_Localizer::Localize(const TopoDS_Shape& PrevIn,
802                                  const TDF_Label&    InLab ,
803                                  const TopoDS_Shape& S,
804                                  TNaming_ShapesSet& Res) 
805 {  
806   Res.Clear();
807   TDF_LabelMap                 Primitives;
808   TopTools_MapOfShape          ValidShapes;
809   Standard_Integer             PrevTrans = myCurTrans - 1;
810
811   //---------------------------------------------
812   // Recuperation du nouveau contenant generateur.
813   //---------------------------------------------
814   TopoDS_Shape      CurIn;
815   TDF_Label         Father  = InLab.Father();
816   TNaming_Iterator  itLab(Father,myCurTrans);
817   for (; itLab.More(); itLab.Next()) {
818     CurIn= itLab.OldShape();
819     break;
820   }
821   
822   Standard_Boolean First = 1;
823   TNaming_OldShapeIterator OldIt(S, PrevTrans,myUS);
824   
825   for (; OldIt.More(); OldIt.Next()) {
826     if (OldIt.Label().IsEqual(InLab)) {
827       TNaming_ShapesSet RO;
828       TNaming_ShapesSet RInLab;      
829       const TopoDS_Shape& OS = OldIt.Shape();
830       //---------------------------------
831       // Localisation des generateurs.
832       //---------------------------------
833       Localize(PrevIn,CurIn ,OS, RO);
834       
835       //--------------------------------------------------------------------
836       // Resultat = intersection des descendants(dans InLab) des generateurs
837       //--------------------------------------------------------------------
838       TNaming_IteratorOnShapesSet itRO(RO);
839       for (; itRO.More(); itRO.Next()) {
840         const TopoDS_Shape& CO = itRO.Value();
841         TNaming_NewShapeIterator NewIt(CO,myCurTrans,myUS);
842         for (; NewIt.More(); NewIt.Next()) {
843           if (NewIt.Label().IsEqual(InLab)) {
844             if (First) Res.Add(NewIt.Shape());
845             else {
846               RInLab.Add(NewIt.Shape());
847             }
848           }
849         }
850       }
851       if (!First) Res.Filter(RInLab);
852       First = Standard_False;
853     }
854   }
855 }
856
857 //=======================================================================
858 //function : Forward
859 //purpose  : 
860 //=======================================================================
861
862 void  TNaming_Localizer::Forward(const TopTools_MapOfShape&  CurSubShapes,
863                                  const TopAbs_ShapeEnum      TS,
864                                  const TDF_LabelMap&         Primitives,
865                                  const TopTools_MapOfShape&  ValidShapes,
866                                  TNaming_ShapesSet&          Res)
867 {
868   //-------------------------------------------------------
869   // Descente dans la transaction courrante = myCurTrans
870   //----------------------------------------------------------    
871   TopTools_MapIteratorOfMapOfShape itV(ValidShapes);
872   Standard_Boolean  First = 1;
873   Standard_Boolean  YaFromValid      = 0;
874   Standard_Boolean  YaFromPrimitives = 0;
875   
876   for (; itV.More(); itV.Next()) {
877     YaFromValid = 1;
878     const TopoDS_Shape& NS = itV.Key();
879     if (First) {
880       GoForward  (NS, CurSubShapes, TS, Res);    
881       First = 0;
882     }
883     else {
884       TNaming_ShapesSet   ResNS;
885       GoForward  (NS, CurSubShapes, TS, ResNS);
886       Res.Filter(ResNS);
887     }
888   } 
889
890   TDF_MapIteratorOfLabelMap itP(Primitives);
891   TNaming_ShapesSet ResPrim;
892
893   for ( ; itP.More(); itP.Next()) {
894     YaFromPrimitives = 1;
895     const TDF_Label&  Lab = itP.Key();
896     TNaming_Iterator  itL(Lab,myCurTrans);
897     TNaming_ShapesSet ResLab;
898
899     for (; itL.More(); itL.Next()) {
900       const TopoDS_Shape& NS = itL.NewShape();
901       GoForward  (NS, CurSubShapes, TS, ResLab);    
902     }
903     if (First) {
904       ResPrim = ResLab;
905       First   = 0;
906     }
907     else 
908       ResPrim.Filter(ResLab);
909   }
910
911   if (YaFromValid) {
912     if (YaFromPrimitives) {
913       Res.Filter(ResPrim);
914     }
915   }
916   else {
917     Res = ResPrim;
918   }
919 }
920
921
922 //=======================================================================
923 //function : FilterbyNeighbourgs
924 //purpose  : 
925 //=======================================================================
926
927 void TNaming_Localizer::FilterByNeighbourgs(const TopoDS_Shape& PrevIn,
928                                             const TopoDS_Shape& CurIn ,
929                                             const TopoDS_Shape& S,
930                                             TNaming_ShapesSet& Res) 
931 {
932   TopTools_MapOfShape         Neighbourg;
933   TopAbs_ShapeEnum            TA = S.ShapeType();
934   TopAbs_ShapeEnum            TS = TopAbs_ShapeEnum (S.ShapeType()+1);
935   TNaming_DataMapOfShapeShapesSet MapShapeRes;
936   const TopTools_IndexedDataMapOfShapeListOfShape& PreAnc = 
937     Ancestors(PrevIn,TS);
938
939   //--------------------------------
940   // Construction des Voisins.
941   //--------------------------------
942   FindNeighbourg (PrevIn,PreAnc,S,Neighbourg);
943   TopTools_MapIteratorOfMapOfShape itNeig(Neighbourg);
944   
945   TNaming_ShapesSet NewNeig;
946   for (; itNeig.More(); itNeig.Next()) {
947     const TopoDS_Shape& Neig = itNeig.Key();
948     //--------------------------------------------
949     // Localisation des voisins.
950     //--------------------------------------------
951     if (!MapShapeRes.IsBound(Neig)) { 
952       TNaming_ShapesSet ResNeig;
953       Localize(PrevIn,CurIn,Neig,ResNeig);
954       MapShapeRes.Bind(Neig,ResNeig);
955       NewNeig.Add(ResNeig);
956     }
957     else {
958       NewNeig.Add(MapShapeRes(Neig));
959     }
960   }
961
962   //---------------------------------------------
963   // Filtre la solution par le resultat du voisin.
964   // ie : F est solution si ses voisins dans CurSol
965   //      sont dans les descendants des voisins 
966   //---------------------------------------------
967   TNaming_ShapesSet Reject;
968   TNaming_IteratorOnShapesSet itRes(Res);
969
970   const TopTools_IndexedDataMapOfShapeListOfShape& CurAnc = 
971     Ancestors(CurIn,TS);
972   
973   for (; itRes.More(); itRes.Next()) {
974     const TopoDS_Shape& Cand = itRes.Value();
975     TopTools_MapOfShape Neighbourg;
976     FindNeighbourg (CurIn,CurAnc,Cand,Neighbourg);
977     TopTools_MapIteratorOfMapOfShape itNeig(Neighbourg);
978     for (; itNeig.More(); itNeig.Next()) {
979       const TopoDS_Shape& Neig = itNeig.Key();
980       if (!NewNeig.Contains(Neig))  {
981         Reject.Add(Cand);
982         break;
983       }
984     }
985   }
986   Res.Remove(Reject);
987
988 */