0024275: Cppcheck warnings on uninitialized class members
[occt.git] / src / TNaming / TNaming_Name.cxx
1 // Created on: 1997-03-21
2 // Created by: Yves FRICAUD
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22
23 #include <TNaming_Name.ixx>
24 #include <TNaming.hxx>
25 #include <TNaming_NamingTool.hxx>
26 #include <TNaming_Naming.hxx>
27 #include <TNaming_ShapesSet.hxx>
28 #include <TNaming_Builder.hxx>
29 #include <TNaming_NamedShape.hxx>
30 #include <TNaming_Iterator.hxx>
31 #include <TNaming_NewShapeIterator.hxx>
32 #include <TNaming_ListOfNamedShape.hxx>
33 #include <TNaming_ListIteratorOfListOfNamedShape.hxx>
34 #include <TopExp.hxx>
35 #include <TopExp_Explorer.hxx>
36 #include <TopoDS_Compound.hxx>
37 #include <BRep_Builder.hxx>
38 #include <BRepTools.hxx>
39
40 #include <TopTools_MapOfShape.hxx>
41 #include <TopTools_MapIteratorOfMapOfShape.hxx>
42 #include <TDF_Label.hxx>
43 #include <TDF_LabelList.hxx>
44 #include <TDF_LabelMap.hxx>
45 #include <TNaming_Tool.hxx>
46
47 #include <Standard_NotImplemented.hxx>
48 #include <Standard_ConstructionError.hxx>
49 #include <TopTools_Array1OfShape.hxx>
50 #include <TColStd_Array1OfInteger.hxx>
51 #include <TopoDS_Wire.hxx>
52 #include <TopoDS_Shell.hxx>
53
54 // mpv modifications 08.04.2002
55 #include <BRepBuilderAPI_MakeWire.hxx>
56 #include <BRepBuilderAPI_MakeFace.hxx>
57 #include <TopoDS.hxx>
58 #include <TopoDS_Shape.hxx>
59 #include <TopoDS_Solid.hxx>
60 #include <TopoDS_Face.hxx>
61 #include <TopoDS_CompSolid.hxx>
62 #include <TopoDS_Compound.hxx>
63 #include <TopoDS_Iterator.hxx>
64 #include <TopTools_ListOfShape.hxx>
65 #include <TopTools_ListIteratorOfListOfShape.hxx>
66 #include <BRepBuilderAPI_MakeSolid.hxx>
67 #include <TopTools_HArray2OfShape.hxx>
68 #include <TopTools_ListOfShape.hxx>
69 #include <TopTools_DataMapOfShapeListOfShape.hxx>
70 #include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
71 // end of mpv modifications 08.04.2002
72
73 #include <TNaming_NCollections.hxx>
74
75 #define BUC60925
76 #define OCC352
77
78 #ifdef DEB_DBGTOOLS_WRITE
79 //#define OCC355
80 #define MDTV_DEB
81 #define MDTV_DEB_OR
82 #define MDTV_DEB_UNN
83 #define  MDTV_DEB_INT
84 #define MDTV_DEB_GEN
85 #define  MDTV_DEB_MODUN
86 #define MDTV_DEB_FNB
87 #define  MDTV_DEB_WIN
88 #define MDTV_DEB_ARG
89 #define MDTV_DEB_SHELL
90 #endif
91 #ifdef MDTV_DEB
92 #include <TCollection_AsciiString.hxx>
93 #include <TDF_Tool.hxx>
94 #include <BRepTools.hxx>
95 #endif
96 #ifdef DEB
97 #include <TCollection_AsciiString.hxx>
98 #include <TDF_Tool.hxx>
99 #include <TDF_ChildIterator.hxx>
100 #include <TDF_MapIteratorOfLabelMap.hxx>
101 //=======================================================================
102 void PrintEntry(const TDF_Label&       label)
103 {
104   TCollection_AsciiString entry;
105   TDF_Tool::Entry(label, entry);
106   cout << "LabelEntry = "<< entry << endl;
107 }
108 //=======================================================================
109 void PrintEntries(const TDF_LabelMap& map)
110 {
111   cout << "=== Labels Map ===" <<endl;
112   TCollection_AsciiString entry;
113   TDF_MapIteratorOfLabelMap it(map);
114   for(;it.More();it.Next()) {
115     TDF_Tool::Entry(it.Key(), entry);
116       cout << "LabelEntry = "<< entry << endl;
117     }
118 }
119 #ifdef DEB_DBGTOOLS_WRITE
120 //=======================================================================
121 static void DbgTools_Write(const TopoDS_Shape& shape,
122                       const Standard_CString filename) 
123 {
124   char buf[256];
125   if(strlen(filename) > 256) return;
126   strcpy (buf, filename);
127   char* p = buf;
128   while (*p) {
129     if(*p == ':')
130       *p = '-';
131     p++;
132   }
133   ofstream save (buf);
134   if(!save) 
135     cout << "File " << buf << " was not created: rdstate = " << save.rdstate() << endl;
136   save << "DBRep_DrawableShape" << endl << endl;
137   if(!shape.IsNull()) BRepTools::Write(shape, save);
138   save.close();
139 }
140 //=======================================================================
141 static void DbgTools_Write(const TopTools_MapOfShape& MS,  const Standard_CString filename) 
142 {
143   if (!MS.IsEmpty ()) {
144     TCollection_AsciiString aNam (filename);
145     Standard_Integer i(0);
146     TopTools_MapIteratorOfMapOfShape it(MS);
147     for(;it.More();it.Next(),i++) {
148       TCollection_AsciiString aName = aNam + "_" + i + ".brep";
149       DbgTools_Write ( it.Key(), aName.ToCString());
150     }
151   }
152 }
153 //=======================================================================
154 static void DbgTools_WriteNSOnLabel (const Handle(TNaming_NamedShape)& NS,  
155                                      const Standard_CString filename) 
156 {
157   if(!NS.IsNull() && !NS->IsEmpty() ) {
158     TCollection_AsciiString aNam (filename);
159     TCollection_AsciiString oldS ("_Old");
160     TCollection_AsciiString newS ("_New_");
161     Standard_Integer i(0);
162     TNaming_Iterator it(NS);
163     for(;it.More(); it.Next(),i++) {
164       TCollection_AsciiString aName1 = aNam + oldS + i + ".brep";
165       TCollection_AsciiString aName2 = aNam + newS + i + ".brep";
166       const TopoDS_Shape& oldShape = it.OldShape();
167       const TopoDS_Shape& newShape = it.NewShape();
168       if(!oldShape.IsNull())
169         DbgTools_Write ( oldShape, aName1.ToCString());
170       if(!newShape.IsNull())
171         DbgTools_Write ( newShape, aName2.ToCString());      
172     }
173   }
174 }
175 #endif
176 #endif
177 //
178 //====================================================================
179 static Standard_Boolean ValidArgs(const TNaming_ListOfNamedShape& Args)
180 {
181   TNaming_ListIteratorOfListOfNamedShape it(Args);
182   for (;it.More();it.Next()) {
183     const Handle(TNaming_NamedShape)& aNS = it.Value();
184     if(aNS.IsNull()) {
185 #ifdef MDTV_DEB_ARG 
186       cout << "ValidArgs:: NS (Naming argument) is NULL" <<endl;
187 #endif  
188       return Standard_False;
189     }
190     else 
191       if(aNS->IsEmpty()) {
192 #ifdef MDTV_DEB_ARG
193         TCollection_AsciiString entry;
194         TDF_Tool::Entry(aNS->Label(), entry);
195         cout << "ValidArgs:: Empty NS, Label = " << entry <<endl;
196 #endif  
197       return Standard_False;
198     }
199       else  
200         if(!aNS->IsValid()) {
201 #ifdef MDTV_DEB_ARG 
202           TCollection_AsciiString entry;
203           TDF_Tool::Entry(aNS->Label(), entry);
204           cout << "ValidArgs::Not valid NS Label = " << entry <<endl;
205 #endif  
206           return Standard_False; 
207         }
208     }
209   return Standard_True;
210 }
211
212 //=======================================================================
213 //function : TNaming_Name
214 //purpose  : 
215 //=======================================================================
216
217 TNaming_Name::TNaming_Name() : 
218    myType(TNaming_UNKNOWN),
219    myIndex(-1)
220 {
221 }
222
223
224 //=======================================================================
225 //function : Type
226 //purpose  : 
227 //=======================================================================
228
229 void TNaming_Name::Type(const TNaming_NameType aType) 
230 {
231   myType = aType;
232 }
233
234 //=======================================================================
235 //function : Type
236 //purpose  : 
237 //=======================================================================
238
239 void TNaming_Name::ShapeType(const TopAbs_ShapeEnum T) 
240 {
241   myShapeType = T;
242 }
243
244 //=======================================================================
245 //function : Shape
246 //purpose  : 
247 //=======================================================================
248
249 void TNaming_Name::Shape(const TopoDS_Shape& theShape) 
250 {
251   myShape = theShape;
252   
253 }
254
255 //=======================================================================
256 //function : Shape
257 //purpose  : 
258 //=======================================================================
259
260 TopoDS_Shape TNaming_Name::Shape() const
261 {
262   return myShape;
263 }
264
265 //=======================================================================
266 //function : Append
267 //purpose  : 
268 //=======================================================================
269
270 void TNaming_Name::Append(const Handle(TNaming_NamedShape)& arg) 
271 {
272   myArgs.Append (arg);
273 }
274
275 //=======================================================================
276 //function : StopNamedShape
277 //purpose  : 
278 //=======================================================================
279
280 void TNaming_Name::StopNamedShape (const Handle(TNaming_NamedShape)& arg) 
281 {
282   myStop = arg;
283 }
284
285 //=======================================================================
286 //function : Index
287 //purpose  : 
288 //=======================================================================
289
290 void TNaming_Name::Index (const Standard_Integer I)
291 {
292   myIndex = I;
293 }
294
295
296 //=======================================================================
297 //function : TNaming_NameType
298 //purpose  : 
299 //=======================================================================
300
301 TNaming_NameType TNaming_Name::Type() const 
302 {
303   return myType;
304 }
305
306 //=======================================================================
307 //function : TNaming_NameType
308 //purpose  : 
309 //=======================================================================
310
311 TopAbs_ShapeEnum TNaming_Name::ShapeType() const 
312 {
313   return myShapeType;
314 }
315
316 //=======================================================================
317 //function : Append
318 //purpose  : 
319 //=======================================================================
320
321 void TNaming_Name::Paste (TNaming_Name& into,
322                           const Handle(TDF_RelocationTable)& RT) const
323 {
324   into.myType      = myType;
325   into.myShapeType = myShapeType;
326   into.myShape     = myShape; 
327   into.myArgs.Clear();
328 //  into.myOrientation = myOrientation;
329   Handle(TNaming_NamedShape) NS;
330
331   for (TNaming_ListIteratorOfListOfNamedShape it(myArgs); it.More(); it.Next()) {
332     RT->HasRelocation(it.Value(),NS);
333     into.myArgs.Append (NS);
334   }
335   if (!myStop.IsNull()) {
336     RT->HasRelocation(myStop,NS);
337     into.myStop = NS;
338   }
339   if (!myContextLabel.IsNull()) {
340     RT->HasRelocation(myContextLabel,into.myContextLabel);
341   }
342 }
343
344 //=======================================================================
345 //function : Arguments
346 //purpose  : 
347 //=======================================================================
348       
349 const TNaming_ListOfNamedShape& TNaming_Name::Arguments() const
350 {
351   return myArgs;
352 }
353
354 //=======================================================================
355 //function : Arguments
356 //purpose  : 
357 //=======================================================================
358       
359 Handle(TNaming_NamedShape) TNaming_Name::StopNamedShape() const
360 {
361   return myStop;
362 }
363
364 //=======================================================================
365 //function : Index
366 //purpose  : 
367 //=======================================================================
368       
369 Standard_Integer TNaming_Name::Index() const
370 {
371   return myIndex;
372 }
373
374 //=======================================================================
375 //function : MakeShape
376 //purpose  : 
377 //=======================================================================
378
379 static TopoDS_Shape MakeShape (const TopTools_MapOfShape& MS) 
380 {  
381   if (!MS.IsEmpty ()) {
382     TopTools_MapIteratorOfMapOfShape it(MS);
383     if (MS.Extent() == 1) {
384       return it.Key();
385     }
386     else {
387       TopoDS_Compound C;
388       BRep_Builder B;
389       B.MakeCompound(C);
390       for (; it.More(); it.Next()){ 
391         B.Add(C,it.Key());
392       }
393       return C;
394     }
395   }
396   return TopoDS_Shape();  
397 }
398
399 #ifdef OCC352
400
401 //=======================================================================
402 //function : ShapeWithType
403 //purpose  : Tries to make shape with given type from the given shape
404 //=======================================================================
405
406 static TopoDS_Shape ShapeWithType(const TopoDS_Shape     theShape,
407                                   const TopAbs_ShapeEnum theType ) {
408   if (theShape.IsNull() || theType == TopAbs_SHAPE) return theShape;
409   Standard_Integer aType = theShape.ShapeType();
410   if (aType == theType) return theShape;
411
412   TopTools_ListOfShape aShapes;
413   if (aType == TopAbs_COMPOUND) {
414     TopoDS_Iterator anIter(theShape);
415     if (anIter.More()) aType = anIter.Value().ShapeType();
416     for(;anIter.More();anIter.Next()) aShapes.Append(anIter.Value());
417     if (aType == theType) {
418       if (aShapes.Extent() == 1) return aShapes.First();
419       else return theShape;
420     }
421   } else aShapes.Append(theShape);
422
423   TopoDS_Shape aResult;
424   TopTools_ListIteratorOfListOfShape aListIter(aShapes);
425
426   if (aType < theType) {
427     Standard_Integer aCount;
428     for(aCount=0;aListIter.More();aListIter.Next()) {
429       TopExp_Explorer anExp(aListIter.Value(),theType);
430       if (anExp.More()) {
431         if (!anExp.Current().IsNull()) {
432           aResult = anExp.Current();
433           aCount++;
434           if (aCount > 1) return theShape;
435         }
436       }
437     }
438     if (aCount == 1) return aResult;
439   } else { // if the shape type more complex than shapes from aShapes list, try make it
440     switch (aType) {
441     case TopAbs_VERTEX: // can't do something from vertex
442       break;
443     case TopAbs_EDGE: {// make wire from edges
444       if (theType <= TopAbs_SOLID) break;
445       BRepBuilderAPI_MakeWire aMakeWire;
446       aMakeWire.Add(aShapes);
447       if (!aMakeWire.IsDone()) return theShape;
448       if (theType == TopAbs_WIRE) return aMakeWire.Wire();
449       aShapes.Clear(); // don't break: we can do something more of it
450       aShapes.Append(aMakeWire.Wire());
451       aListIter.Initialize(aShapes);
452     }
453     case TopAbs_WIRE: {// make faceS from wires (one per one)
454       if (theType < TopAbs_SOLID) break;
455       TopTools_ListOfShape aFaces;
456       for(;aListIter.More();aListIter.Next()) {
457         BRepBuilderAPI_MakeFace aMakeFace(TopoDS::Wire(aListIter.Value()));
458         if (!aMakeFace.IsDone()) aFaces.Append(aMakeFace.Face());
459       }
460       if (theType == TopAbs_FACE) {
461         if (aFaces.Extent() == 1) return aFaces.First();
462         return theShape;
463       }
464       aShapes.Assign(aFaces); // don't break: we can do something more of it
465       aListIter.Initialize(aShapes);
466     }
467     case TopAbs_FACE: {// make shell from faces
468       if (theType < TopAbs_SOLID) break;
469       BRep_Builder aShellBuilder;
470       TopoDS_Shell aShell;
471       aShellBuilder.MakeShell(aShell);
472       for(;aListIter.More();aListIter.Next()) aShellBuilder.Add(aShell,TopoDS::Face(aListIter.Value()));
473       if (theType == TopAbs_SHELL) return aShell;
474       aShapes.Clear(); // don't break: we can do something more of it
475       aShapes.Append(aShell);
476       aListIter.Initialize(aShapes);
477     }
478     case TopAbs_SHELL: {// make solids from shells (one per one)
479       TopTools_ListOfShape aSolids;
480       for(;aListIter.More();aListIter.Next()) {
481         BRepBuilderAPI_MakeSolid aMakeSolid(TopoDS::Shell(aListIter.Value()));
482         if (aMakeSolid.IsDone()) aSolids.Append(aMakeSolid.Solid());
483       }
484       if (theType == TopAbs_SOLID) {
485         if (aSolids.Extent() == 1) return aSolids.First();
486         return theShape;
487       }
488       aShapes.Assign(aSolids); // don't break: we can do something more of it
489       aListIter.Initialize(aShapes);
490     }
491     case TopAbs_SOLID: {// make compsolid from solids
492       BRep_Builder aCompBuilder;
493       TopoDS_CompSolid aCompSolid;
494       aCompBuilder.MakeCompSolid(aCompSolid);
495       for(;aListIter.More();aListIter.Next()) aCompBuilder.Add(aCompSolid,TopoDS::Solid(aListIter.Value()));
496       if (theType == TopAbs_COMPSOLID) return aCompSolid;
497     }
498     }
499   }
500   return theShape;
501 }
502
503 #endif
504
505 //=======================================================================
506 //function : FindModifUntil
507 //purpose  : 
508 //=======================================================================
509
510 static Standard_Boolean FindModifUntil (TNaming_NewShapeIterator&         it,
511                                         TopTools_MapOfShape&              MS,
512                                         const TopoDS_Shape&               S,
513                                         const Handle(TNaming_NamedShape)& Context)
514
515 #ifdef MDTV_DEB_MODUN
516   if(!Context.IsNull())
517     PrintEntry(Context->Label());
518 #endif
519   Standard_Boolean found = Standard_False;
520   for (; it.More(); it.Next()) {
521     if (!it.Shape().IsNull()) {
522 #ifdef MDTV_DEB_MODUN
523       if(!it.NamedShape().IsNull())
524         PrintEntry(it.NamedShape()->Label());
525 #endif
526       if (it.NamedShape() == Context) {
527         MS.Add(S);
528         found = Standard_True;
529       }
530       else { // New shape != Context
531         TNaming_NewShapeIterator it2(it);
532         found = FindModifUntil (it2,MS,it.Shape(),Context);
533       }
534     }
535   }
536   return found;
537 }
538
539 //=======================================================================
540 //function : ModifUntil
541 //purpose  : returns map <theMS> of generators of Target
542 //=======================================================================
543
544 static void SearchModifUntil (const TDF_LabelMap&               /*Valid*/,
545                               const Handle(TNaming_NamedShape)& Target,
546                               const TNaming_ListOfNamedShape& theListOfGenerators,
547                               TopTools_MapOfShape&              theMS)
548 {
549
550 #ifdef MDTV_DEB_MODUN
551    DbgTools_WriteNSOnLabel(Target, "SMUntil_"); // Target <== generated
552   Standard_Integer i = 0;
553   TCollection_AsciiString aGen1("Gens_New_"), aGen2("Gented_Old_"), Und("_");
554 #endif 
555   // Test si S apparait comme oldshape dans Context. : Test if S appears as oldshape in Context.
556   Standard_Boolean found = Standard_False;
557   for (TNaming_ListIteratorOfListOfNamedShape it(theListOfGenerators); it.More(); it.Next()) {
558     const Handle(TNaming_NamedShape)& aNS = it.Value();
559 #ifdef MDTV_DEB_MODUN  
560     i++;
561     Standard_Integer j = 0;
562 #endif
563     for (TNaming_Iterator itL (aNS); itL.More(); itL.Next()) { // <- generators
564       const TopoDS_Shape& S = itL.NewShape();
565       found = Standard_False;
566       
567 #ifdef MDTV_DEB_MODUN
568       j++;
569       Standard_Integer k = 0;
570       TCollection_AsciiString aNam1 = aGen1 + i + Und + j + ".brep";
571       DbgTools_Write(S, aNam1.ToCString());
572       PrintEntry(aNS->Label());//NSLabel
573 #endif   
574       TNaming_Iterator itC (Target);
575       for  (; itC.More(); itC.Next()) {  // <- generated
576         const TopoDS_Shape& OS = itC.OldShape();
577 #ifdef MDTV_DEB_MODUN
578         k++;
579         TCollection_AsciiString aNam2 = aGen2 + i + Und + j + Und + k + ".brep";
580         DbgTools_Write(OS, aNam2.ToCString());
581         PrintEntry(Target->Label());//Target Label
582 #endif 
583         if (OS.IsSame(S)) {
584           theMS.Add(S);
585           found = Standard_True;
586 #ifdef MDTV_DEB_MODUN
587           cout << aNam2 << " is Same with " << aNam1 <<endl;
588 #endif
589           break;
590         }
591       }
592       if (!found) {
593         TNaming_NewShapeIterator it1(itL);
594         found = FindModifUntil (it1,theMS,S,Target);
595       }
596     }
597   }
598 }
599
600 //=======================================================================
601 //function : ModifUntil
602 //purpose  : 
603 //=======================================================================
604 // NamedShape for this type is assembled from all last modifications of the 
605 // last argument shapes (see method  TNaming_NamingTool::CurrentShape), 
606 // which are not descendants (see method TNaming_NamingTool::BuildDescendants) 
607 // of the stop shape. This type of naming is used for identification shapes, 
608 // which has only one parent with evolution PRIMITIVE (or itself), which 
609 // uniquely identifies it. In most cases stop shape is empty and this algorithm 
610 // is equal to the algorithm for IDENTITY. 
611 //=======================================================================
612 static Standard_Boolean ModifUntil (const TDF_Label&                  L,
613                                     const TDF_LabelMap&               Valid,
614                                     const TNaming_ListOfNamedShape&   Args,
615                                     const Handle(TNaming_NamedShape)& Stop)
616 {
617   TopTools_MapOfShape MS; 
618   TDF_LabelMap Forbiden;
619 #ifdef BUC60925
620   if(!ValidArgs(Args)) return Standard_False;
621 #endif
622   TNaming_NamingTool::BuildDescendants (Stop, Forbiden); // fills Forbidden from Stop
623
624 #ifdef MDTV_DEB_GEN  
625   cout <<"Regenerating ModifUntil => ";
626   PrintEntry(L);
627   DbgTools_WriteNSOnLabel(Args.Last(), "ModifUntil-");
628  
629 #endif
630   // all last modifications of the last argument
631   TNaming_NamingTool::CurrentShape  (Valid, Forbiden,Args.Last(),MS); 
632 #ifdef MDTV_DEB_GEN  
633   Standard_Integer i(0);
634   TopTools_MapIteratorOfMapOfShape it(MS);
635   TCollection_AsciiString aNam("ModifUnti_MS_");
636   TCollection_AsciiString ext(".brep"); 
637 #endif
638   TNaming_Builder B(L);
639   for (TopTools_MapIteratorOfMapOfShape itM(MS); itM.More(); itM.Next()) {
640     const TopoDS_Shape& S = itM.Key();
641     B.Select(S,S);
642 #ifdef MDTV_DEB_GEN  
643     TCollection_AsciiString aName = aNam + ++i + ext;
644     DbgTools_Write(S, aName.ToCString()) ;
645     cout << aName.ToCString() << " TS = " << S.TShape()->This() <<endl;
646 #endif
647   }
648   return Standard_True;
649 }
650
651 //=======================================================================
652 //function : ContShape
653 //purpose  : 
654 //=======================================================================
655 // from the NS of the first argument TNaming_Iterator is started, shape "S" 
656 // is the NewShape from Iterator with index "myIndex" of the Name, this 
657 // shape and all last modifications (except NamedShapes - descendants of 
658 // the stop shape) are the parts of resulting NamedShape.
659 //=======================================================================
660 static Standard_Boolean ConstShape (const TDF_Label&                  L,
661                                     const TDF_LabelMap&               Valid,
662                                     const TNaming_ListOfNamedShape&   Args,
663                                     const Handle(TNaming_NamedShape)& Stop,
664                                     const Standard_Integer            Index)
665 {
666   TopTools_MapOfShape MS; 
667   TDF_LabelMap Forbiden;
668 #ifdef BUC60925
669   if(!ValidArgs(Args)) return Standard_False;
670 #endif
671   TNaming_NamingTool::BuildDescendants (Stop, Forbiden);
672
673   TopoDS_Shape S;
674   Standard_Integer i = 1;
675   for (TNaming_Iterator it(Args.First()); it.More(); it.Next(), i++) {
676     if (Index == i) {
677       S = it.NewShape();
678       break;
679     }
680   }
681   if (S.IsNull()) return Standard_False;
682
683   TNaming_NamingTool::CurrentShapeFromShape  (Valid,Forbiden,L,S,MS);
684
685  
686   TNaming_Builder B(L);
687   for (TopTools_MapIteratorOfMapOfShape itM(MS); itM.More(); itM.Next()) {
688     const TopoDS_Shape& SS = itM.Key();
689     B.Select(SS,SS);
690   }
691   return Standard_True;
692 }
693
694 //=======================================================================
695 //function : Intersection
696 //purpose  : 
697 //=======================================================================
698 //algorithm does next steps:
699 // 1. Sets to the "Forbiden" map  all shapes, which are descendants of stop 
700 //    shape. Named shapes at these labels can't be used.
701 // 2. Takes first argument (with method CurrentShape) and sets map "S" of 
702 //    ancestors (shapes, which belong to this one) of its shape with type 
703 //    "ShapeType" of Name.
704 // 3. Takes next argument of Name (with method CurrentShape) and removes 
705 //    from the map "S" all ancestors, which not belongs to the shape of 
706 //    this argument. This step is repeated for all arguments of this Name.
707 // 4. Adds to the result NamedShape all rest of shapes from the map "S".
708 //=======================================================================
709 static Standard_Boolean Intersection (const TDF_Label&                  L,
710                                       const TDF_LabelMap&               Valid,
711                                       const TNaming_ListOfNamedShape&   Args,
712                                       const Handle(TNaming_NamedShape)& Stop,
713                                       const TopAbs_ShapeEnum            ShapeType,
714                                       const Standard_Integer            Index)
715 {
716   if (Args.IsEmpty()) return Standard_False;
717 #ifdef BUC60925
718   if(!ValidArgs(Args)) return Standard_False;
719 #endif
720   TNaming_ListIteratorOfListOfNamedShape it(Args); 
721   TopTools_MapOfShape MS; 
722   TDF_LabelMap        Forbiden;
723
724 #ifdef MDTV_DEB_INT
725   if(!Stop.IsNull() && !Stop->Get().IsNull()) {
726     DbgTools_Write(Stop->Get(), "Ints_Stop.brep");
727     PrintEntry(Stop->Label());
728   }
729   cout <<"Ints: ShapeType = " << ShapeType << endl;
730   cout <<"Argument 1 at ";
731   PrintEntry(it.Value()->Label());
732 #endif 
733
734   TNaming_NamingTool::BuildDescendants (Stop, Forbiden); // <==<1>
735
736 #ifdef MDTV_DEB_INT
737   cout << "Intersection:: Valid Map: "<<endl;
738   PrintEntries(Valid);
739   cout << "Intersection:: Forbidden Map: "<<endl;
740   PrintEntries(Forbiden);
741 #endif
742   TopTools_ListOfShape aListOfAnc;
743   TNaming_NamingTool::CurrentShape  (Valid, Forbiden,it.Value(),MS); // first argument
744   TopoDS_Shape  CS = MakeShape(MS);
745   TNaming_ShapesSet S(CS,ShapeType); // <==<2>
746   aListOfAnc.Append(CS);
747 #ifdef MDTV_DEB_INT
748   if(!CS.IsNull())
749     DbgTools_Write(CS, "Int_CS_1.brep");
750   Standard_Integer i=2;
751   TCollection_AsciiString aNam("Int_CS_");
752   TCollection_AsciiString ext(".brep");
753  
754 #endif 
755   it.Next();  // <<===<3.1>
756   for (; it.More(); it.Next()) {
757     MS.Clear();
758     TNaming_NamingTool::CurrentShape (Valid,Forbiden,it.Value(),MS);
759     CS = MakeShape(MS);
760     aListOfAnc.Append(CS);
761 #ifdef MDTV_DEB_INT
762     TCollection_AsciiString aName = aNam + i++ + ext;      
763     DbgTools_Write(CS, aName.ToCString()) ;
764     cout <<"Argument " << i << " at ";
765     PrintEntry(it.Value()->Label());
766 #endif  
767
768     TNaming_ShapesSet OS(CS,ShapeType);
769     S.Filter(OS); //<<===<3.2>
770 #ifdef MDTV_DEB_INT
771     Standard_Integer j = 1;
772     TCollection_AsciiString aNam2("SSMap_"), aName3;
773     TopTools_MapIteratorOfMapOfShape itm(S.Map());
774     for(;itm.More();itm.Next(), j++) {
775       aName3 = aNam2 + i + "_" + j + ".brep";
776       DbgTools_Write(itm.Key(), aName3.ToCString());
777     }
778 #endif 
779   }
780
781 #ifdef MDTV_DEB_INT
782   aNam = "Int_S_";
783   i =1;
784 #endif
785
786   TNaming_Builder B(L); //<<===<4>
787   Standard_Boolean isOK(Standard_False);
788   if(S.Map().Extent() > 1 && Index > 0 && ShapeType == TopAbs_EDGE) {
789     Standard_Integer indxE(0), nbE(0), indxW(0),nbW(0), indxF(0);
790     indxE =  Index & 0x000000FF;
791     nbE   = (Index & 0x0000FF00) >> 8;
792     indxW = (Index & 0x000F0000) >> 16;
793     nbW   = (Index & 0x00F00000) >> 20;
794     indxF = (Index & 0x0F000000) >> 24;
795     Standard_Integer i(1);
796     TopoDS_Shape aS;
797     TopTools_ListIteratorOfListOfShape itl(aListOfAnc);
798     for(;itl.More();itl.Next(),i++) {
799       if(indxF == i) {
800         aS = itl.Value();
801         break;
802       }      
803     }
804 #ifdef MDTV_DEB_INT
805     cout <<"Kept: indxE = " << indxE  <<" maxENum = " << nbE << " indxW = " <<indxW << " nbW = " <<nbW<<endl;
806 #endif      
807     Standard_Integer aNbW(0), aCaseW(0);
808     TopoDS_Iterator it2(aS);
809     for (;it2.More();it2.Next()) aNbW++;  
810     if(aNbW == nbW) aCaseW = 1;//exact solution for wire (nb of wires is kept)
811     else aCaseW = 2; // indefinite description ==> compound which can include expected wire    
812     if(aCaseW == 1) {      
813       TopoDS_Shape aWire;
814       Standard_Integer i(1);
815       it2.Initialize(aS);
816       for (;it2.More();it2.Next(),i++) {
817         if(indxW == i) {
818           aWire = it2.Value();
819           break;
820         }
821       }
822       Standard_Integer aNbE(0), aCaseE(0);
823       it2.Initialize(aWire);
824       for (;it2.More();it2.Next()) aNbE++;
825       if(aNbE == nbE) aCaseE = 1;//exact solution for edge
826       else aCaseE = 2;
827       if(aCaseE == 1) {
828         i=1;
829         TopoDS_Shape anEdge;
830         it2.Initialize(aWire);
831         for (;it2.More();it2.Next(),i++) {
832           if(indxE == i) {
833             anEdge = it2.Value();
834             break;
835           }
836         }
837         if(!anEdge.IsNull()) {
838           B.Select(anEdge, anEdge);
839           isOK = Standard_True;
840         }
841       }
842     }   
843   } 
844   if(!isOK)
845 #ifdef MDTV_DEB_INT
846     for (TopTools_MapIteratorOfMapOfShape itM(S.Map()); itM.More(); itM.Next(),i++) {
847 #else
848       
849     for (TopTools_MapIteratorOfMapOfShape itM(S.Map()); itM.More(); itM.Next()) {
850 #endif
851       const TopoDS_Shape& S1 = itM.Key();
852 #ifdef MDTV_DEB_INT
853       TCollection_AsciiString aName = aNam + i + ext;      
854       DbgTools_Write(S1, aName.ToCString()) ;
855 #endif  
856
857       B.Select(S1,S1);
858       isOK = Standard_True;
859     }
860   return isOK;
861 }
862 //=======================================================================
863 static void KeepInList(const TopoDS_Shape& CS, const TopAbs_ShapeEnum Type, TopTools_ListOfShape& aList)   
864 {
865   if (CS.IsNull()) return;
866
867   if (Type == TopAbs_SHAPE) { 
868     if (CS.ShapeType() == TopAbs_SOLID ||
869         CS.ShapeType() == TopAbs_FACE  ||
870         CS.ShapeType() == TopAbs_EDGE  ||
871         CS.ShapeType() == TopAbs_VERTEX ) {
872       aList.Append(CS);
873     }
874     else {
875       for (TopoDS_Iterator it(CS) ; it.More(); it.Next()) {
876         aList.Append(it.Value());
877       }
878     }
879   }
880   else {
881     if (Type > CS.ShapeType()) {
882       for (TopExp_Explorer exp(CS,Type) ; exp.More(); exp.Next()) {
883         aList.Append(exp.Current());
884       }
885     } else {
886      aList.Append(CS);
887     }
888   }
889 }
890
891 //=======================================================================
892 //function : Union
893 //purpose  : 
894 //=======================================================================
895 // Resulting NamedShape contains compound of next shapes: 
896 // compound of last modifications of each argument (see CurrentShape method) 
897 // without descendants of the stop shape.
898 //=======================================================================
899 static Standard_Boolean Union (const TDF_Label&                  L,
900                                const TDF_LabelMap&               Valid,
901                                const TNaming_ListOfNamedShape&   Args,
902                                const Handle(TNaming_NamedShape)& Stop,
903                                const TopAbs_ShapeEnum            ShapeType,
904                                const TDF_Label&                  ContextLabel)
905 {  
906   if (Args.IsEmpty()) return Standard_False;
907 #ifdef BUC60925
908   if(!ValidArgs(Args)) return Standard_False;
909 #endif
910   // temporary solution for Orientation name
911   Standard_Boolean isOr(Standard_True);
912 /* not completed
913   const TDF_Label& aLabel = L.Father();
914   if(!aLabel.IsNull()) {
915   PrintEntry(L);
916   PrintEntry(aLabel);
917     Handle (TNaming_Naming)  Naming;
918     if(aLabel.FindAttribute(TNaming_Naming::GetID(), Naming)) {
919       const TNaming_Name& aName = Naming->GetName();
920       if(aName.Type() == TNaming_ORIENTATION) {
921         const TNaming_ListOfNamedShape&   Args = aName.Arguments();
922         if(Args.Extent() > 2) {
923           const Handle(TNaming_NamedShape)& A = Args.First();
924           if(!A.IsNull()) {
925             PrintEntry(A->Label());
926             if (A->Label() == L) 
927               isOr = Standard_True;         
928           }
929         } else 
930           if(!Args.Extent())
931             isOr = Standard_True;
932       }
933     }
934   }
935 */
936   // end of temp. sol.
937
938   TNaming_ListIteratorOfListOfNamedShape it(Args);
939   TopTools_MapOfShape MS; 
940   TDF_LabelMap        Forbiden;
941   
942   TNaming_NamingTool::BuildDescendants (Stop, Forbiden);//fill Forbidden
943   TNaming_NamingTool::CurrentShape  (Valid, Forbiden,it.Value(),MS); // fill MS with last modifications of the first argument
944   TopoDS_Shape  CS = MakeShape(MS);
945
946   TopTools_ListOfShape aListS;
947   if(isOr)
948     KeepInList(CS,ShapeType,aListS);
949   TNaming_ShapesSet S(CS,ShapeType);//fill internal map of shapeset by shapes of the specified type
950 #ifdef MDTV_DEB_UNN
951   TCollection_AsciiString entry; 
952   TDF_Tool::Entry(it.Value()->Label(), entry);
953   TCollection_AsciiString Nam("Arg_");
954   TCollection_AsciiString aNam = Nam + entry + "_" + "1.brep";
955   DbgTools_Write(CS, aNam.ToCString());
956   Standard_Integer ii = 1;
957 #endif
958   it.Next();
959   for (; it.More(); it.Next()) {
960 #ifdef MDTV_DEB_UNN  
961     TDF_Tool::Entry(it.Value()->Label(), entry);
962 #endif
963       MS.Clear();
964       TNaming_NamingTool::CurrentShape (Valid, Forbiden,it.Value(),MS);// fill MS with last modifications of the it.Value()
965       CS = MakeShape(MS);
966       if(isOr)
967         KeepInList(CS,ShapeType,aListS); 
968       TNaming_ShapesSet OS(CS,ShapeType);
969       S.Add(OS); //concatenate both shapesets
970  
971 #ifdef MDTV_DEB_UNN 
972     ii++;
973     TCollection_AsciiString aNm = Nam + entry + "_" + ii + ".brep";
974     DbgTools_Write(CS, aNm.ToCString());
975     cout <<"Arg: Entry = " <<entry <<"  TShape = " << CS.TShape() <<endl;
976 #endif
977   }
978
979 // start szy 27.05.08
980   TopoDS_Shape aCand;
981   Standard_Boolean found = Standard_False;
982   if(!ContextLabel.IsNull()) {
983     Handle(TNaming_NamedShape) CNS;
984     ContextLabel.FindAttribute(TNaming_NamedShape::GetID(),CNS);
985     TopoDS_Shape aContext;
986     if(!CNS.IsNull()) {
987       MS.Clear();
988       TNaming_NamingTool::CurrentShape (Valid, Forbiden, CNS, MS);
989       aContext = MakeShape(MS);
990 #ifdef MDTV_DEB_UNN 
991       TCollection_AsciiString anEntry;
992       TDF_Tool::Entry(ContextLabel, anEntry);
993       cout << "UNION: Context Label = " <<  anEntry << endl;
994       DbgTools_Write(aContext, "Union_Context.brep");
995       TCollection_AsciiString aN ("aMap_");
996       TopTools_MapIteratorOfMapOfShape it(S.Map());
997       for(Standard_Integer i=1; it.More();it.Next(), i++) {
998         TCollection_AsciiString aName = aN + i + ".brep";
999         DbgTools_Write(it.Key(), aName.ToCString());
1000       }
1001 #endif
1002     }
1003     TopTools_ListOfShape aList;
1004     TopExp_Explorer anExpl(aContext, ShapeType);
1005     for(;anExpl.More(); anExpl.Next()) 
1006       aList.Append(anExpl.Current());
1007 #ifdef MDTV_DEB_UNN
1008     cout <<"UNION: ShapeType = " << ShapeType << " List ext = " << aList.Extent()<<endl;
1009     TopAbs_ShapeEnum aTyp = TopAbs_SHAPE;
1010     TopTools_MapIteratorOfMapOfShape it1 (S.Map());
1011     for (int i=1;it1.More();it1.Next(),i++) {
1012       cout << "Map("<<i<<"): TShape = " << it1.Key().TShape() << " Orient = " << it1.Key().Orientation() <<endl;
1013       aTyp = it1.Key().ShapeType();
1014     }
1015     
1016     TopExp_Explorer exp(aContext, aTyp);
1017     for(int i =1;exp.More();exp.Next(), i++) {
1018      cout << "Context("<<i<<"): TShape = " << exp.Current().TShape() << " Orient = " << exp.Current().Orientation() <<endl;
1019     }
1020             
1021 #endif
1022     TopTools_ListIteratorOfListOfShape itl(aList);
1023     for(;itl.More();itl.Next()) {
1024       aCand = itl.Value(); 
1025 #ifdef MDTV_DEB_UNN 
1026       DbgTools_Write(aCand, "Cand.brep");
1027 #endif
1028       Standard_Integer num = S.Map().Extent();
1029       anExpl.Init(aCand, (ShapeType == TopAbs_WIRE) ? TopAbs_EDGE : TopAbs_FACE); 
1030       for(;anExpl.More();anExpl.Next()) {
1031         if(S.Map().Contains(anExpl.Current()))
1032           num--;
1033       } 
1034       if(num == 0) {
1035         found = Standard_True; 
1036         break;
1037       }
1038     }
1039 // end szy 27.05.08
1040   }
1041
1042   TNaming_Builder B(L);
1043 #ifdef MDTV_DEB_UNN
1044   if(!ContextLabel.IsNull()) {
1045     if(found) cout << "UNION: Shape is found in Context" <<endl;
1046     else cout << "UNION: Shape is NOT found in Context" <<endl;
1047   }
1048 #endif
1049 #ifdef OCC352
1050   if(found) 
1051     B.Select(aCand, aCand);
1052   else {
1053     BRep_Builder aCompoundBuilder;
1054     TopoDS_Compound aCompound;
1055     aCompoundBuilder.MakeCompound(aCompound);
1056     if(!isOr)
1057       for (TopTools_MapIteratorOfMapOfShape itM(S.Map()); itM.More(); itM.Next()) {
1058         aCompoundBuilder.Add(aCompound,itM.Key());
1059       }
1060     else
1061       for (TopTools_ListIteratorOfListOfShape itL(aListS); itL.More(); itL.Next()) {
1062         aCompoundBuilder.Add(aCompound,itL.Value());
1063       }
1064     TopoDS_Shape aShape = ShapeWithType(aCompound,ShapeType);
1065 #ifdef MDTV_DEB_UNN 
1066     DbgTools_Write(aShape, "Union_Selected.brep");
1067     DbgTools_Write(aCompound, "Union_Compound.brep");
1068 #endif
1069     B.Select(aShape,aShape);
1070   }
1071 #else
1072
1073   for (TopTools_MapIteratorOfMapOfShape itM(S.Map()); itM.More(); itM.Next()) {
1074     const TopoDS_Shape& S = itM.Key();
1075     B.Select(S,S);
1076   }
1077
1078 #endif
1079
1080   return Standard_True;
1081 }
1082
1083 //=======================================================================
1084 static TopoDS_Shape FindShape(const TNaming_DataMapOfShapeMapOfShape& DM) 
1085 {
1086   TopoDS_Shape aResult;
1087   Standard_Integer aNum = DM.Extent();
1088   if(aNum < 1) return aResult;  
1089   TopTools_ListOfShape List;
1090   TNaming_DataMapIteratorOfDataMapOfShapeMapOfShape it(DM);
1091   if(it.More()) {
1092     const TopoDS_Shape& aKey1 = it.Key();
1093     const TNaming_MapOfShape& aMap = it.Value();
1094
1095     TNaming_MapIteratorOfMapOfShape itm(aMap); // iterate first map
1096     for (;itm.More();itm.Next()) {
1097       const TopoDS_Shape& aS = itm.Key(); // element of the first map
1098       Standard_Boolean isCand(Standard_True); // aS is a Candidate
1099       TNaming_DataMapIteratorOfDataMapOfShapeMapOfShape it2(DM);
1100       for (;it2.More();it2.Next()) {
1101         const TopoDS_Shape& aKey2 = it2.Key();
1102         if(aKey2 == aKey1) continue;
1103         const TNaming_MapOfShape& aMap2 = it2.Value();
1104         if(!aMap2.Contains(aS)) isCand = Standard_False;
1105       } 
1106       if(isCand)
1107         List.Append(aS);
1108     }
1109   }
1110   if(List.IsEmpty()) return aResult;
1111   if(List.Extent() == 1) return List.First();
1112   TopTools_ListIteratorOfListOfShape itl (List);
1113   TopoDS_Compound Compound;
1114   BRep_Builder B;
1115   B.MakeCompound(Compound);
1116   for (; itl.More(); itl.Next()){ 
1117     B.Add(Compound,itl.Value());
1118   }
1119   return Compound; 
1120 }
1121
1122 //=======================================================================
1123 //function : Generation
1124 //purpose  : Resolves Name from arguments: arg1 - generated (target shape)
1125 //         : arg2 - the generator: the oldest ancestor (usually NS with 
1126 //         : PRIMITIVE evolution. (See TNaming_Localizer::FindGenerator).
1127 //         : Resulting NamedShape contains shape, which is in the first 
1128 //         : argument NamedShape and is modification of the last argument NS.
1129 //=======================================================================
1130
1131 static Standard_Boolean  Generated (const TDF_Label&                L,
1132                                     const TDF_LabelMap&             Valid,
1133                                     const TNaming_ListOfNamedShape& Args)
1134 {
1135   if (Args.Extent() < 2) {
1136     Standard_ConstructionError::Raise("TNaming_Name::Solve: => Generated");
1137   }
1138   // First argument : label of generation
1139   // Next arguments : generators.
1140
1141 #ifdef BUC60925
1142   if(!ValidArgs(Args)) return Standard_False;
1143 #endif
1144
1145   TDF_Label   LabelOfGeneration = Args.First()->Label();
1146 #ifdef MDTV_DEB_GEN
1147       DbgTools_Write(Args.First()->Get(),  "Generated.brep") ;
1148 #endif
1149   // Nouvell valeurs des generateurs dans l attribut de generation
1150   TopTools_MapOfShape aMS;
1151   TNaming_ListOfNamedShape aGenerators; 
1152   aGenerators.Assign(Args); 
1153   aGenerators.RemoveFirst(); 
1154 #ifdef MDTV_DEB_GEN
1155       DbgTools_Write(aGenerators.First()->Get(),  "Generators.brep") ;
1156 #endif
1157   SearchModifUntil (Valid, Args.First(), aGenerators, aMS);
1158   Handle(TNaming_Naming) aNaming;
1159   TopoDS_Shape aSelection;
1160   L.FindAttribute(TNaming_Naming::GetID(),aNaming);
1161   if(!aNaming.IsNull()) 
1162     aSelection = aNaming->GetName().Shape();
1163 #ifdef MDTV_DEB_GEN
1164   DbgTools_Write(aSelection,  "G_Selection.brep") ;
1165   cout << "Generated::SearchModifUntil aMS.Extent() = " << aMS.Extent() <<endl;
1166   DbgTools_Write(aMS, "SearchModifUntil_Result");
1167 #endif
1168    Handle(TNaming_NamedShape) anOldNS;
1169    Standard_Integer aVer = -1;// Initial build of name
1170    L.FindAttribute(TNaming_NamedShape::GetID(),anOldNS);
1171    if(!anOldNS.IsNull()) 
1172      aVer = anOldNS->Version();
1173
1174 #ifdef MDTV_DEB_GEN
1175   Standard_Integer i = 0, j=1;
1176   TCollection_AsciiString aNam2("Gen_New_");
1177   TCollection_AsciiString aNam1("Gen_Old_");
1178   TCollection_AsciiString ext(".brep");
1179 #endif
1180   TNaming_Builder B(L); // NS
1181   TopTools_ListOfShape aList;
1182   TNaming_DataMapOfShapeMapOfShape aDM; 
1183   for (TopTools_MapIteratorOfMapOfShape itMS(aMS); itMS.More(); itMS.Next()) {
1184     const TopoDS_Shape& OS = itMS.Key();
1185 #ifdef MDTV_DEB_GEN
1186     TCollection_AsciiString aName = aNam1 + ++i + ext;      
1187     DbgTools_Write(OS, aName.ToCString()) ;
1188     Standard_Integer j=0;
1189 #endif
1190     TNaming_MapOfShape aMapDM; 
1191     for (TNaming_NewShapeIterator itNew(OS,L); itNew.More(); itNew.Next()) 
1192       if (itNew.Label() == LabelOfGeneration) {
1193         aMapDM.Add(itNew.Shape());
1194         aList.Append(itNew.Shape());//szy 21.10.03
1195 #ifdef MDTV_DEB_GEN
1196         TCollection_AsciiString aName = aNam2 + i +  "_" + ++j + ext;      
1197         DbgTools_Write(itNew.Shape(), aName.ToCString()) ;
1198 #endif
1199       }
1200     if(aMapDM.Extent())
1201       aDM.Bind(OS, aMapDM);
1202   }
1203
1204   if(aVer == -1) { //initial 
1205     Standard_Integer i = 1;
1206     TNaming_Name& aName =  aNaming->ChangeName();
1207     TopTools_ListIteratorOfListOfShape it(aList);
1208     if(!aSelection.IsNull()) {
1209       for(;it.More();it.Next(),i++) {
1210         if(it.Value().IsSame(aSelection)) {
1211           B.Select(it.Value(), it.Value());
1212           aName.Index(i); // for debug - index of selection in the list
1213           break;
1214         }
1215       }
1216     } else {// Selection == Null
1217       for(;it.More();it.Next())
1218         B.Select(it.Value(), it.Value()); 
1219     }
1220   }
1221   else { 
1222     // *** Regeneration *** //
1223     if(aList.Extent() == 1) { // trivial case
1224       B.Select(aList.Last(), aList.Last()); 
1225     } 
1226     else {
1227       TNaming_Name& aName =  aNaming->ChangeName();
1228       const TopAbs_ShapeEnum aType = aName.ShapeType();
1229       TopTools_ListOfShape aList2; 
1230       TopTools_ListIteratorOfListOfShape it(aList);
1231       for(;it.More();it.Next()) {
1232         if(it.Value().ShapeType() == aType) //collect only the same type
1233           aList2.Append(it.Value());
1234       }
1235       if(!aList2.Extent()) return Standard_False; // Empty
1236
1237       Standard_Boolean found = Standard_False;
1238       TopoDS_Shape aShape = FindShape(aDM);
1239 #ifdef MDTV_DEB_GEN
1240       if(!aShape.IsNull())
1241         DbgTools_Write(aShape,  "G_FindShape.brep") ;
1242 #endif
1243       if(!aShape.IsNull()) found = Standard_True;
1244 #ifdef MDTV_DEB_GEN
1245       cout << "Generated ==>aGenerators.Extent() = " <<aGenerators.Extent() <<" aMS.Extent()= " <<aMS.Extent()<<endl;
1246 #endif
1247       if(found) {
1248 #ifdef MDTV_DEB_GEN
1249       cout << "Generated ==> Shape is found!" <<endl;
1250 #endif
1251         TopTools_ListOfShape aLM;
1252         Standard_Boolean aHas = Standard_False;
1253         Standard_Boolean a1NB = Standard_False;
1254         if(aGenerators.Extent() != aMS.Extent()) { //missed generators
1255           aHas = Standard_True;//has lost generatos
1256 #ifdef MDTV_DEB_GEN
1257       cout << "Generated ==> has lost generatos!" <<endl;
1258 #endif
1259           for (TNaming_ListIteratorOfListOfNamedShape itg(aGenerators); itg.More(); itg.Next()) {
1260             if(!aMS.Contains(itg.Value()->Get())) 
1261               aLM.Append(itg.Value()->Get());
1262           }
1263           if(aLM.Extent() == 1) {//lost 1
1264             TopTools_ListIteratorOfListOfShape itm(aLM);
1265             TopoDS_Shape aSM = itm.Value(); // Missed
1266             for (TopTools_MapIteratorOfMapOfShape itMS1(aMS); itMS1.More(); itMS1.Next()) {
1267               const TopoDS_Shape& aS = itMS1.Key();
1268               if(aSM.ShapeType() == aS.ShapeType()) {
1269                 if(aS.ShapeType() == TopAbs_EDGE) {
1270                   TopoDS_Vertex aVCom;
1271                   if(TopExp::CommonVertex(TopoDS::Edge(aS), TopoDS::Edge(aSM), aVCom))
1272                     {a1NB = Standard_True; 
1273                      break;} //lost only 1 neigbour
1274                 } else if(aS.ShapeType() == TopAbs_FACE) {
1275                   TopExp_Explorer expl1(aS, TopAbs_EDGE);
1276                   for(;expl1.More();expl1.Next()) {
1277                     TopExp_Explorer expl2(aSM, TopAbs_EDGE);
1278                     for(;expl2.More();expl2.Next()) {
1279                       if(expl1.Current().IsSame(expl2.Current()))
1280                         {a1NB = Standard_True;
1281                          break;} //lost only 1 neigbour
1282                     }
1283                   }
1284                 }
1285               }
1286             }
1287 //          if(aShape.ShapeType() == TopAbs_VERTEX && a1NBE) {
1288 //      //if atleast 1 Gen was missed and the Gen is Edge
1289 //            TopTools_ListIteratorOfListOfShape it(aList);
1290 //            for(;it.More();it.Next()) {
1291 //              if(it.Value().ShapeType() == TopAbs_EDGE) {
1292 //                const TopoDS_Shape& aV1 = TopExp::FirstVertex(TopoDS::Edge(it.Value()));
1293 //                const TopoDS_Shape& aV2 = TopExp::LastVertex(TopoDS::Edge(it.Value()));
1294 //                if(aShape.IsSame(aV1)) {aShape2 =  aV2;       cout << "##### => V2 " <<endl;break;}
1295 //                else 
1296 //                  if(aShape.IsSame(aV2)) {aShape2 =  aV1;     cout << "##### => V1 " <<endl;break;}
1297 //              }         
1298 //            }
1299 //          }
1300           }
1301         }
1302         if(!aHas) // all arguments were kept
1303           B.Select(aShape, aShape); //only this case is correct on 100%
1304         else {
1305           if (a1NB) //Has, but may be ...
1306             B.Select(aShape, aShape);   
1307           else { 
1308             // put Compound, may be if possible processed later in Sel. Driver
1309             TopTools_ListIteratorOfListOfShape it1(aList2);
1310             for(;it1.More();it1.Next())
1311               B.Select(it1.Value(), it1.Value()); 
1312           }
1313         }
1314     } else 
1315       { //not found
1316 #ifdef MDTV_DEB_GEN
1317         cout << "Generated ==> Shape is NOT found! Probably Compound will be built" <<endl;
1318 #endif
1319
1320         TopTools_ListIteratorOfListOfShape it2(aList2);
1321         for(;it2.More();it2.Next())
1322           B.Select(it2.Value(), it2.Value()); 
1323       }
1324     }
1325   }    
1326   return Standard_True;
1327 }
1328
1329 //=======================================================================
1330 //function : Identity
1331 //purpose  : Regenerates Naming attribute with Name = IDENTITY
1332 //=======================================================================
1333 // Name with this type must contain only one NamedShape attribute as argument. 
1334 // Algorithm takes all last modifications of NamedShape of this argument  
1335 // starting with this one ( see method TNaming_NamingTool::CurrentShape ). 
1336 // Algorithm takes only NamedShapes belonging to the labels from the Valid 
1337 // labels map (if it's not empty) and put to the resulting NamedShape as compound. 
1338 //=======================================================================
1339 static Standard_Boolean Identity (const TDF_Label&                L,
1340                                   const TDF_LabelMap&             Valid,
1341                                   const TNaming_ListOfNamedShape& Args,
1342                                   const TopAbs_ShapeEnum          ShapeType)
1343 {
1344   if (Args.Extent() > 2) {
1345     Standard_ConstructionError::Raise("TNaming_Name::Solve");
1346     }
1347 #ifdef BUC60925
1348   if(!ValidArgs(Args)) return Standard_False;
1349 #endif
1350   const Handle(TNaming_NamedShape)& A = Args.First();
1351   TopTools_MapOfShape MS;
1352   TDF_LabelMap        Forbiden;
1353   TNaming_NamingTool::CurrentShape (Valid,Forbiden,A,MS);
1354 #ifdef MDTV_DEB_SOL2
1355   //TCollection_AsciiString entry;
1356   //TDF_Tool::Entry(L, entry);
1357   //TDF_Tool::Entry(A->Label(), entry);
1358 #endif  
1359   TNaming_Builder B(L);
1360   for (TopTools_MapIteratorOfMapOfShape itM(MS); itM.More(); itM.Next()) {
1361 #ifdef OCC352
1362     const TopoDS_Shape& S = ShapeWithType(itM.Key(),ShapeType);
1363 #else
1364     const TopoDS_Shape& S = itM.Key();
1365 #endif
1366 #ifdef MDTV_DEB_SOL2
1367     //TopAbs_Orientation Or = S.Orientation();
1368 #endif
1369     B.Select(S,S);
1370   }
1371   return Standard_True;
1372 }
1373
1374 //=======================================================================
1375 //function : FilterByNeighbourgs
1376 //purpose  : regenerated the specified shape with help of its neighbours
1377 //=======================================================================
1378 // result -  is a subshape of the first argument of the Name with type = 
1379 // ShapeType of this Name, which has a common subshapes (boundaries) with 
1380 // each neighbour - shapes from the other arguments of the Name.
1381 //=======================================================================
1382 static Standard_Boolean  FilterByNeighbourgs (const TDF_Label&                L,
1383                                               const TDF_LabelMap&             Valid,
1384                                               const TNaming_ListOfNamedShape& Args,
1385                                               const Handle(TNaming_NamedShape)& Stop,
1386                                               const TopAbs_ShapeEnum          ShapeType)
1387 {  
1388
1389   TNaming_Builder B(L); 
1390
1391   TDF_LabelMap        Forbiden;
1392 #ifdef BUC60925
1393   if(!ValidArgs(Args)) return Standard_False;
1394 #endif
1395   TNaming_NamingTool::BuildDescendants (Stop, Forbiden); //all descendants of Stop (New shapes) are forbidden
1396   if (!Stop.IsNull())    Forbiden.Remove(Stop->Label());
1397   //----------------------------------------
1398   // First argument: collection has to be filtered.
1399   //----------------------------------------
1400   Handle(TNaming_NamedShape) Cand  = Args.First(); //collection of candidates
1401    
1402 #ifdef MDTV_DEB_FNB
1403   Standard_Integer i = 1;
1404   TCollection_AsciiString aNam("Cand_");
1405   TCollection_AsciiString ext(".brep");
1406   DbgTools_WriteNSOnLabel(Cand, aNam.ToCString());  
1407   cout << "Cand (Args.First()) Label = ";
1408   PrintEntry(Cand->Label());  
1409   cout << "Valid Label map:" <<endl;
1410   PrintEntries(Valid);
1411 #endif
1412
1413   TopTools_MapOfShape    SCand;
1414   TNaming_NamingTool::CurrentShape  (Valid, Forbiden,Cand,SCand);//fills SCand with last modifications of Cand. CandNS should be at the same level (before) as NS of FilterByNBS
1415
1416 #ifdef MDTV_DEB_FNB
1417   TCollection_AsciiString aNam2("SCand");
1418   DbgTools_Write(SCand, aNam2.ToCString());  
1419   cout <<"SCand Extent = " << SCand.Extent() << " Expected ShapeType = " << ShapeType << endl;
1420 #endif 
1421
1422   //------------------------------------------------------------
1423   // Autres arguments : contiennent les voisins du bon candidat.
1424   // Other arguments  : contains the neighbors of the good candidate.
1425   //------------------------------------------------------------
1426   TopAbs_ShapeEnum              TC = TopAbs_EDGE;
1427   if (ShapeType == TopAbs_EDGE) TC = TopAbs_VERTEX;
1428   if (ShapeType == TopAbs_VERTEX) TC = TopAbs_VERTEX; // szy 31.03.10 - to process case when Candidate is of type Vertex
1429  
1430 #ifdef MDTV_DEB_FNB
1431   i=1;
1432   aNam = "Boundaries";
1433 #endif
1434   Standard_Boolean isDone = Standard_False;
1435   if(SCand.Extent() == 1) { // check if a collection is inside
1436     TopTools_MapIteratorOfMapOfShape it(SCand);
1437     const TopoDS_Shape& aS = it.Key();
1438     if(!aS.IsNull()) 
1439       if(aS.ShapeType() == TopAbs_COMPOUND && aS.ShapeType() != ShapeType) {
1440         TopoDS_Iterator itt(aS);
1441         for(;itt.More();itt.Next()) 
1442           SCand.Add(itt.Value());      
1443         SCand.Remove(aS);
1444       }
1445   }
1446   for (TopTools_MapIteratorOfMapOfShape itCand(SCand); itCand.More(); itCand.Next()) { //1
1447     const TopoDS_Shape& S    = itCand.Key();
1448     TopTools_MapOfShape Boundaries;
1449     if(S.ShapeType() == TopAbs_VERTEX) //# szy 31.03.10
1450       Boundaries.Add (S); //#
1451     else  //#
1452       for (TopExp_Explorer exp(S,TC); exp.More(); exp.Next()) { //put boundaries of each candidate (from SCand) to the Boundaries map
1453         Boundaries.Add (exp.Current());
1454 #ifdef MDTV_DEB_FNB
1455         TCollection_AsciiString aName = aNam + i++ + ext;      
1456         DbgTools_Write(exp.Current(),  aName.ToCString()) ;
1457 #endif
1458       }
1459     
1460     TNaming_ListIteratorOfListOfNamedShape it(Args); 
1461     it.Next(); 
1462     Standard_Boolean Keep = 1;
1463 #ifdef MDTV_DEB_FNB
1464     cout <<"Args number = " << Args.Extent() <<endl;
1465     i=1;
1466     aNam = "Boundaries";
1467 #endif
1468     for ( ; it.More(); it.Next()) { //2 ==> for each Arg
1469       Standard_Boolean Connected = Standard_False;
1470       // Le candidat doit etre  connexe a au moins un shape de
1471       // chaque NamedShape des voisins.
1472       // The candidate should be connectedand and have at least one shape of NamedShape
1473       // of each neighbor.
1474       const Handle(TNaming_NamedShape)& NSVois = it.Value();  //neighbor 
1475
1476 #ifdef MDTV_DEB_FNB
1477       DbgTools_WriteNSOnLabel(NSVois, "Next_Neighbor_") ;
1478 #endif
1479       
1480       TopTools_MapOfShape    SVois;
1481       TNaming_NamingTool::CurrentShape  (Valid, Forbiden,NSVois,SVois); // fills SVois with last modifications of NSVois
1482
1483 #ifdef MDTV_DEB_FNB
1484       TCollection_AsciiString aNam2("SVois");
1485       DbgTools_Write(SVois, aNam2.ToCString());
1486 #endif 
1487
1488       for (TopTools_MapIteratorOfMapOfShape itVois(SVois); itVois.More(); itVois.Next()) { //6
1489         const TopoDS_Shape& Vois = itVois.Key();
1490         for (TopExp_Explorer exp1(Vois,TC); exp1.More(); exp1.Next()) { //7
1491           if (Boundaries.Contains(exp1.Current())) {
1492             Connected = Standard_True; // has common boundaries with candidate shape
1493 #ifdef MDTV_DEB_FNB
1494             DbgTools_Write(Vois, "Neighbor_Connected.brep");
1495 #endif
1496             break;
1497           }
1498         } //7
1499         if (Connected) break;
1500       } //6
1501       if (!Connected) {
1502         Keep = 0;
1503         break;
1504       }
1505     } //2
1506     if (Keep) {
1507       B.Select (S,S);
1508           isDone = Standard_True;
1509 #ifdef MDTV_DEB_FNB
1510       DbgTools_Write(S,  "FilterByNbs_Sel.brep") ;
1511 #endif
1512     }
1513   } //1
1514   return isDone;
1515 }
1516
1517 //=======================================================================
1518 static const TopoDS_Shape FindSubShapeInAncestor(const TopoDS_Shape& Selection, const TopoDS_Shape& Context )
1519 {
1520 #ifdef MDTV_DEB_OR_AG
1521   DbgTools_Write(Selection, "Orientation_Selection.brep");
1522   DbgTools_Write(Context, "Orientation_Context.brep");
1523   TopExp_Explorer expl1(Context, Selection.ShapeType());
1524   int i = 0;
1525   TCollection_AsciiString SS( "Orientation_Current_");
1526   for(;expl1.More(); expl1.Next()) {      
1527     if(expl1.Current().IsSame(Selection)) {
1528       i++;
1529       cout <<"FindSubShape:  = " <<expl1.Current().ShapeType() << " TS = " <<expl1.Current().TShape() << endl;
1530       TCollection_AsciiString nam = SS + i + ".brep";
1531       DbgTools_Write(expl1.Current(), nam.ToCString()); 
1532     }
1533   }
1534 #endif 
1535   if(Selection.ShapeType() != TopAbs_COMPOUND) {
1536     TopExp_Explorer anExpl(Context, Selection.ShapeType());
1537     for(;anExpl.More(); anExpl.Next()) {
1538 #ifdef MDTV_DEB_OR_AG
1539       cout <<"FindSubShape:  = " <<anExpl.Current().ShapeType() << " TS = " <<anExpl.Current().TShape()->This() << endl;
1540       DbgTools_Write(anExpl.Current(), "Orientation_Current.brep");
1541 #endif    
1542       if(anExpl.Current().IsSame(Selection)) 
1543         return anExpl.Current();
1544     }
1545   }
1546
1547   return TopoDS_Shape();
1548 }
1549
1550 //=======================================================================
1551 //static Standard_Integer Count(const TopoDS_Shape& S)
1552 //{
1553 //  Standard_Integer N(0);
1554 //  TopoDS_Iterator it(S);
1555 //  for(;it.More();it.Next()) {
1556 //    if(it.Value().ShapeType() != TopAbs_COMPOUND && it.Value().ShapeType() != TopAbs_COMPSOLID)
1557 //      N++;
1558 //    else {
1559 //      N += Count(it.Value());
1560 //    }
1561 //  }
1562 //  return N;
1563 //}
1564 //=======================================================================
1565 static Standard_Integer Aggregation (const TopoDS_Shape& S, const TopoDS_Shape& AS, TNaming_Builder& B)
1566 {
1567   Standard_Integer N(0);
1568   TopoDS_Iterator it(S);
1569   for(;it.More();it.Next()) {
1570     const TopoDS_Shape& sel = it.Value();
1571     if(sel.ShapeType() > TopAbs_COMPSOLID) {
1572       const TopoDS_Shape& CS = FindSubShapeInAncestor(sel, AS);
1573       if(!CS.IsNull()) {
1574         B.Select(CS, CS);
1575         N++;
1576       }
1577     } else 
1578       N += Aggregation(sel, AS, B);    
1579   }
1580   return N;
1581 }
1582
1583 //==========================================================================
1584 //function : Orientation
1585 //purpose  : to solve  ORIENTATION name
1586 // this function explores the second argument | arguments (Context) and 
1587 // keeps at the label (L) the first argument (S) with the orientation it  
1588 // has in the context. Index is used only for Seam edge recomputing 
1589 //==========================================================================
1590 static Standard_Boolean ORientation (const TDF_Label&                L,
1591                                      const TDF_LabelMap&             Valid,
1592                                      const TNaming_ListOfNamedShape& Args,
1593                                      const Handle(TNaming_NamedShape)& Stop,
1594                                      const Standard_Integer          Index)
1595 {
1596
1597   if(!ValidArgs(Args)) return Standard_False;
1598
1599   const Handle(TNaming_NamedShape)& A = Args.First();
1600   TopTools_MapOfShape MS; 
1601   TDF_LabelMap        Forbiden;
1602   TNaming_NamingTool::BuildDescendants (Stop, Forbiden);
1603   TNaming_NamingTool::CurrentShape (Valid,Forbiden,A,MS);
1604
1605   TopoDS_Shape S; 
1606   Standard_Boolean isSplit(Standard_False);
1607   if (!MS.IsEmpty ()) {
1608     TopTools_MapIteratorOfMapOfShape it(MS);
1609     if (MS.Extent() == 1) {
1610       S = it.Key(); 
1611     } 
1612     else {
1613       isSplit = Standard_True;
1614       S = MakeShape(MS);
1615 #ifdef MDTV_DEB_OR
1616       for(Standard_Integer i=1;it.More();it.Next(), i++) {
1617         TCollection_AsciiString aNam("OR_Selection_");
1618         TCollection_AsciiString aName = aNam + i + ".brep";
1619         DbgTools_Write(it.Key(), aName.ToCString());
1620       }
1621 #endif
1622     }
1623   }
1624
1625   TNaming_Builder B(L);
1626   if(S.IsNull()) 
1627     return Standard_False;
1628 #ifdef MDTV_DEB_OR
1629   DbgTools_Write(S, "Orientation_S.brep");
1630 #endif
1631
1632   TopTools_ListOfShape aSList;
1633   // tmp. solution
1634   if(S.ShapeType() == TopAbs_COMPOUND && !isSplit) {
1635     TopoDS_Iterator it(S);
1636     for(;it.More();it.Next())
1637       aSList.Append(it.Value());
1638   } //
1639  
1640   TopTools_MapOfShape MSC; 
1641   if(aSList.Extent() == 0) {
1642     const Handle(TNaming_NamedShape)& Anc = Args.Last();
1643 #ifdef MDTV_DEB_OR
1644     cout << "### ORIENTATION: Ancestor ";
1645     PrintEntry(Anc->Label());
1646 #endif
1647     MSC.Clear();
1648     TNaming_NamingTool::CurrentShape (Valid,Forbiden,Anc,MSC);
1649     if(MSC.Extent() == 1) {
1650       for (TopTools_MapIteratorOfMapOfShape itM(MSC); itM.More(); itM.Next()) {
1651         const TopoDS_Shape& AS = itM.Key(); 
1652 // <=== start 21.10.2009
1653         TopoDS_Shape CS;
1654         if(Index > 0) { //only for seam edge
1655           TopoDS_Iterator itw(AS);
1656           for(;itw.More();itw.Next()) {
1657             Standard_Boolean found(Standard_False);
1658             TopoDS_Iterator it(itw.Value());
1659             for(int i=1;it.More();it.Next(),i++) {
1660               if(i == Index && it.Value().IsSame(S)) {
1661                 CS = it.Value();
1662                 found = Standard_True;
1663 #ifdef MDTV_DEB_OR
1664                 cout << "ORIENTATION => ORDER = " << i <<endl;
1665 #endif
1666                 break;
1667               }
1668             }
1669             if(found) break;
1670           }
1671         } else
1672           CS =  FindSubShapeInAncestor(S, AS);
1673 // <=== end 21.10.2009
1674 #ifdef MDTV_DEB_OR
1675         cout << "ORIENTATION: Selection" <<" TShape = " <<CS.TShape() <<" Orientation = " << CS.Orientation() <<endl;
1676         cout << "ORIENTATION: Context " << "ShapeType = "<<AS.ShapeType() << " TShape = " <<AS.TShape() <<endl;
1677         DbgTools_Write(AS, "Orientation_Cnt.brep");
1678 #endif
1679         if(!CS.IsNull()) {
1680           B.Select(CS, CS);
1681         } else {
1682           if(!Aggregation(S, AS, B)) 
1683             return Standard_False;        
1684         }
1685       }  
1686     } else {
1687       const TopoDS_Shape  AS = MakeShape(MSC);
1688       const TopoDS_Shape& CS =  FindSubShapeInAncestor(S, AS);
1689       if(!CS.IsNull()) {
1690         B.Select(CS, CS);
1691       }  else {
1692         if(!Aggregation(S, AS, B)) 
1693           return Standard_False;        
1694       }
1695     }
1696   } else {
1697     TNaming_ListIteratorOfListOfNamedShape it(Args); 
1698     it.Next(); //skip first
1699
1700     // temporary solution. To be optimized (+ has connection with Union name)
1701     Handle(TopTools_HArray2OfShape) Arr; // Arr(1,1) - selection; Arr(1,2) - Context shape
1702     Arr = new TopTools_HArray2OfShape (1, aSList.Extent(), 1, 2);
1703     TopTools_ListIteratorOfListOfShape it1(aSList);
1704     Standard_Integer i = 1;
1705     for(; it1.More(); it1.Next(), it.Next(), i++) {
1706       Arr->SetValue(i, 1, it1.Value());
1707       MSC.Clear();
1708       TNaming_NamingTool::CurrentShape (Valid,Forbiden,it.Value(),MSC);
1709       if(MSC.Extent() == 1) {
1710         for (TopTools_MapIteratorOfMapOfShape itM(MSC); itM.More(); itM.Next()) {
1711           const TopoDS_Shape& AS = itM.Key(); 
1712           Arr->SetValue(i, 2, AS);
1713         }
1714       } else {
1715         const TopoDS_Shape  AS = MakeShape(MSC);
1716         Arr->SetValue(i, 2, AS);
1717       }
1718     } 
1719     
1720     if(aSList.Extent() == 1) {
1721       const TopoDS_Shape& S = Arr->Value(1,1);
1722       if(S.ShapeType() != TopAbs_COMPOUND) {        
1723         const TopoDS_Shape& CS =  FindSubShapeInAncestor(S, Arr->Value(1,2));
1724         if(!CS.IsNull()) {
1725           B.Select(CS, CS);
1726         } else 
1727           return Standard_False;
1728       } 
1729       else {
1730 #ifdef MDTV_DEB_OR
1731         DbgTools_Write(Arr->Value(1,2), "Ancestor.brep");
1732 #endif
1733         if(!Aggregation(S, Arr->Value(1,2), B)) { 
1734           return Standard_False;
1735         }
1736       }
1737     }
1738     else { // > 1   
1739       for(Standard_Integer i = Arr->LowerRow();i <= Arr->UpperRow();i++) {
1740         const TopoDS_Shape& S = Arr->Value(i,1);
1741         const TopoDS_Shape& AC = Arr->Value(i,2);
1742         if(S.ShapeType() != TopAbs_COMPOUND) {      
1743           const TopoDS_Shape& CS =  FindSubShapeInAncestor(S, AC);
1744           if(!CS.IsNull()) {
1745             B.Select(CS, CS);
1746           } else 
1747             return Standard_False;
1748         }
1749         else {
1750 #ifdef MDTV_DEB_OR
1751           DbgTools_Write(AC, "Aggregation.brep");
1752 #endif
1753           if(!Aggregation(S, AC, B)) { 
1754             return Standard_False;
1755           }
1756         }
1757       }
1758     }
1759   } // end of tmp. solution 
1760
1761   return Standard_True;
1762 }
1763
1764 //===========================================================================
1765 //function : WireIN
1766 //purpose  : to solve  WIREIN name
1767 //=======================================================================
1768 static Standard_Boolean WireIN(const TDF_Label&                L,
1769                                const TDF_LabelMap&             Valid,
1770                                const TNaming_ListOfNamedShape& Args, 
1771                                    const Handle(TNaming_NamedShape)& Stop,
1772                                    Standard_Integer Index)
1773 {
1774   Standard_Boolean aResult(Standard_False);
1775   if(!ValidArgs(Args)) return aResult;
1776   TopTools_MapOfShape MS; 
1777   TDF_LabelMap        Forbiden;
1778   if (Args.Extent() < 1 ) 
1779     Standard_ConstructionError::Raise("TNaming_Name::Solve"); 
1780   const Handle(TNaming_NamedShape)& A = Args.First();
1781   TNaming_NamingTool::CurrentShape (Valid,Forbiden,A,MS);
1782   if (MS.Extent() != 1) return aResult;
1783   TopTools_MapIteratorOfMapOfShape itM(MS); 
1784   const TopoDS_Shape& aCF = itM.Key()   ;
1785 #ifdef MDTV_DEB_WIN
1786   cout <<"MS Extent = " <<MS.Extent() <<endl;
1787   DbgTools_Write(aCF, "Context_Face.brep");
1788 #endif
1789   TNaming_Builder B(L);
1790   if(Index == 1 ){ //Outer wire case 
1791     TopoDS_Wire anOuterWire;
1792     TNaming::OuterWire(TopoDS::Face(aCF), anOuterWire);
1793         if(!anOuterWire.IsNull()) {
1794       B.Select(anOuterWire, anOuterWire);
1795           aResult = Standard_True;
1796         }
1797   } else { //has internal wires
1798         TNaming_ListOfNamedShape ArgsE;
1799     ArgsE.Assign(Args);
1800     ArgsE.RemoveFirst();
1801         // fill Map with edges 
1802     TNaming_ListIteratorOfListOfNamedShape it(ArgsE);
1803     TopTools_MapOfShape MS; 
1804     TDF_LabelMap        Forbiden;
1805   
1806     TNaming_NamingTool::BuildDescendants (Stop, Forbiden);//fill Forbidden
1807     TNaming_NamingTool::CurrentShape  (Valid, Forbiden,it.Value(),MS); // fill MS with last modifications of the first additional argument
1808     TopoDS_Shape  CS = MakeShape(MS);
1809
1810     TNaming_ShapesSet aSet(CS,TopAbs_EDGE);//fill internal map of shapeset by shapes of the specified type
1811 #ifdef MDTV_DEB_WIN
1812     TCollection_AsciiString entry; 
1813     TDF_Tool::Entry(it.Value()->Label(), entry);
1814     TCollection_AsciiString Nam("Arg_");
1815     TCollection_AsciiString aNam = Nam + entry + "_" + "2.brep";
1816     DbgTools_Write(CS, aNam.ToCString());
1817     Standard_Integer ii = 2;
1818 #endif
1819     it.Next();
1820     for (; it.More(); it.Next()) {
1821 #ifdef MDTV_DEB_WIN 
1822       TDF_Tool::Entry(it.Value()->Label(), entry);
1823 #endif
1824       MS.Clear();
1825       TNaming_NamingTool::CurrentShape (Valid, Forbiden,it.Value(),MS);// fill MS with last modifications of the it.Value()
1826       CS = MakeShape(MS); 
1827       TNaming_ShapesSet OS(CS,TopAbs_EDGE);
1828       aSet.Add(OS); //concatenate both shapesets
1829  
1830 #ifdef MDTV_DEB_WIN
1831       ii++;
1832       TCollection_AsciiString aNm = Nam + entry + "_" + ii + ".brep";
1833       DbgTools_Write(CS, aNm.ToCString());
1834       cout <<"Arg: Entry = " <<entry <<"  TShape = " << CS.TShape() <<endl;
1835 #endif
1836         }
1837
1838 #ifdef MDTV_DEB_WIN
1839     cout <<"WIREIN: " << " Internal Map ext = " << aSet.Map().Extent()<<endl;
1840     TopTools_MapIteratorOfMapOfShape it1 (aSet.Map());
1841     for (int i=1;it1.More();it1.Next(),i++) {
1842       cout << "Map("<<i<<"): TShape = " << it1.Key().TShape() << " Orient = " << it1.Key().Orientation() <<" Type = " <<
1843                   it1.Key().ShapeType()<<endl;
1844     }
1845     
1846     TopExp_Explorer exp(aCF, TopAbs_EDGE);
1847     for(int i =1;exp.More();exp.Next(), i++) {
1848      cout << "Context_Face("<<i<<"): TShape = " << exp.Current().TShape() << " Orient = " << exp.Current().Orientation() <<endl;
1849     }       
1850 #endif
1851 //end for edges
1852         
1853   for (TopoDS_Iterator itF(aCF); itF.More(); itF.Next()) {// find the expected wire in the face
1854     const TopoDS_Shape& S = itF.Value();//wire
1855         if(!S.IsNull()) {
1856 #ifdef MDTV_DEB_WIN    
1857       DbgTools_Write(S, "WireIN_S.brep");
1858       cout <<"WIREIN: ShapeType = " << S.ShapeType() << " TS = " << S.TShape()->This() <<endl;
1859 #endif       
1860       if(S.ShapeType() == TopAbs_WIRE) {
1861                 TopTools_MapOfShape aView;
1862                 Standard_Integer aNum(0x7FFFFFFF);
1863             for (TopoDS_Iterator it(S);it.More();it.Next())
1864           aView.Add(it.Value());// edges of wire of the face in map
1865
1866         TopTools_MapIteratorOfMapOfShape it (aSet.Map());
1867                 aNum = aView.Extent();
1868                 if(aNum == aSet.Map().Extent()) {
1869           for (;it.More();it.Next()) {
1870                         if(aView.Contains(it.Key())) {
1871                                 aNum--;
1872                         }
1873                   }
1874                 }
1875                 if(aNum == 0) {
1876                   B.Select(S, S);
1877               aResult = Standard_True;
1878               break;
1879                 }
1880           }
1881         }       
1882   } //
1883
1884   if(!aResult) {
1885         TopoDS_Wire anOuterWire;
1886     TNaming::OuterWire(TopoDS::Face(aCF), anOuterWire);
1887         if(!anOuterWire.IsNull()) {
1888       for (TopoDS_Iterator itF(aCF); itF.More(); itF.Next()) {
1889         const TopoDS_Shape& S = itF.Value();//wire
1890             if(!S.IsNull()&& S.ShapeType() == TopAbs_WIRE) {
1891                   if(S.IsEqual(anOuterWire)) continue;
1892                   B.Select(S, S);
1893                 }
1894           }
1895         }
1896   }
1897   }
1898   return aResult;
1899 }
1900 //===========================================================================
1901 //function : ShellIN
1902 //purpose  : to solve  SHELLIN name
1903 //===========================================================================
1904 static Standard_Boolean ShellIN(const TDF_Label&                L,
1905                                const TDF_LabelMap&             Valid,
1906                                const TNaming_ListOfNamedShape& Args, 
1907                                    const Handle(TNaming_NamedShape)& Stop,
1908                                    Standard_Integer Index)
1909 {
1910   Standard_Boolean aResult(Standard_False);
1911   if(!ValidArgs(Args)) 
1912           return aResult;
1913   TopTools_MapOfShape MS; 
1914   TDF_LabelMap        Forbiden;
1915   if (Args.Extent() < 1 ) 
1916     Standard_ConstructionError::Raise("TNaming_Name::Solve"); 
1917   const Handle(TNaming_NamedShape)& A = Args.First();
1918   TNaming_NamingTool::CurrentShape (Valid,Forbiden,A,MS);
1919   if (MS.Extent() != 1) return aResult;
1920   TopTools_MapIteratorOfMapOfShape itM(MS); 
1921   const TopoDS_Shape& aCSO = itM.Key()   ;
1922 #ifdef MDTV_DEB_SHELL
1923   cout <<"MS Extent = " <<MS.Extent() <<endl;
1924   DbgTools_Write(aCSO, "Context_Solid.brep");
1925 #endif
1926   TNaming_Builder B(L);
1927   if(Index == 1 ){ //Outer Shell case  
1928         TopoDS_Shell anOuterShell;
1929         TNaming::OuterShell(TopoDS::Solid(aCSO), anOuterShell);
1930         if(!anOuterShell.IsNull()) {
1931       B.Select(anOuterShell, anOuterShell);
1932           aResult = Standard_True;
1933 #ifdef MDTV_DEB_SHELL      
1934           cout << "Outer Shell case" <<endl;
1935       PrintEntry(L);
1936           DbgTools_Write(anOuterShell, "ShellOut_S.brep");
1937           it.Initialize(aCSO);
1938                 for(;it.More();it.Next()){ 
1939           DbgTools_Write(it.Value(), "ShOut_S.brep");
1940                 }
1941 #endif       
1942         }
1943   } else { //has internal Shells
1944         TNaming_ListOfNamedShape ArgsF;
1945     ArgsF.Assign(Args);
1946     ArgsF.RemoveFirst();
1947         // fill Map with faces 
1948     TNaming_ListIteratorOfListOfNamedShape it(ArgsF);
1949     TopTools_MapOfShape MS; 
1950     TDF_LabelMap        Forbiden;
1951   
1952     TNaming_NamingTool::BuildDescendants (Stop, Forbiden);//fill Forbidden
1953     TNaming_NamingTool::CurrentShape  (Valid, Forbiden,it.Value(),MS); // fill MS with last modifications of the first additional argument
1954     TopoDS_Shape  CS = MakeShape(MS);
1955
1956     TNaming_ShapesSet aSet(CS,TopAbs_FACE);//fill internal map of shapeset by shapes of the specified type
1957 #ifdef MDTV_DEB_SHELL
1958     TCollection_AsciiString entry; 
1959     TDF_Tool::Entry(it.Value()->Label(), entry);
1960     TCollection_AsciiString Nam("Arg_");
1961     TCollection_AsciiString aNam = Nam + entry + "_" + "2.brep";
1962     DbgTools_Write(CS, aNam.ToCString());
1963     Standard_Integer ii = 2;
1964 #endif
1965     it.Next();
1966     for (; it.More(); it.Next()) {
1967 #ifdef MDTV_DEB_SHELL 
1968       TDF_Tool::Entry(it.Value()->Label(), entry);
1969 #endif
1970       MS.Clear();
1971       TNaming_NamingTool::CurrentShape (Valid, Forbiden,it.Value(),MS);// fill MS with last modifications of the it.Value()
1972       CS = MakeShape(MS); 
1973       TNaming_ShapesSet OS(CS,TopAbs_FACE);
1974       aSet.Add(OS); //concatenate both shapesets
1975  
1976 #ifdef MDTV_DEB_SHELL
1977       ii++;
1978       TCollection_AsciiString aNm = Nam + entry + "_" + ii + ".brep";
1979       DbgTools_Write(CS, aNm.ToCString());
1980       cout <<"Arg: Entry = " <<entry <<"  TShape = " << CS.TShape() <<endl;
1981 #endif
1982         }
1983
1984 #ifdef MDTV_DEB_SHELL
1985     cout <<"SHELLIN: " << " Internal Map ext = " << aSet.Map().Extent()<<endl;
1986     TopTools_MapIteratorOfMapOfShape it1 (aSet.Map());
1987     for (int i=1;it1.More();it1.Next(),i++) {
1988       cout << "Map("<<i<<"): TShape = " << it1.Key().TShape() << " Orient = " << it1.Key().Orientation() <<" Type = " <<
1989                   it1.Key().ShapeType()<<endl;
1990     }
1991     
1992     TopExp_Explorer exp(aCSO, TopAbs_FACE);
1993     for(int i = 1;exp.More();exp.Next(), i++) {
1994      cout << "Context_Solid("<<i<<"): TShape = " << exp.Current().TShape() << " Orient = " << exp.Current().Orientation() <<endl;
1995     }       
1996 #endif
1997 //end for faces
1998         
1999   for (TopoDS_Iterator itS(aCSO); itS.More(); itS.Next()) {// find the expected shell in the solid
2000     const TopoDS_Shape& S = itS.Value();//shell
2001         if(!S.IsNull()) {
2002 #ifdef MDTV_DEB_SHELL    
2003       DbgTools_Write(S, "ShellIN_S.brep");
2004       cout <<"SHELLIN: ShapeType = " << S.ShapeType() << " TS = " << S.TShape()->This() <<endl;
2005 #endif       
2006           if(S.ShapeType() == TopAbs_SHELL) {
2007                 TopTools_MapOfShape aView;
2008                 Standard_Integer aNum(0x7FFFFFFF);
2009             for (TopoDS_Iterator it(S);it.More();it.Next())
2010           aView.Add(it.Value());// faces of shell of the solid in map
2011         
2012                 aNum = aView.Extent();
2013                 if(aNum == aSet.Map().Extent()) {
2014                   TopTools_MapIteratorOfMapOfShape it (aSet.Map());
2015           for (;it.More();it.Next()) {
2016                         if(aView.Contains(it.Key())) {
2017                                 aNum--;
2018                         }
2019                   }
2020                 }
2021                 if(aNum == 0) {
2022                   B.Select(S, S);
2023               aResult = Standard_True;
2024               break;
2025                 }
2026           }
2027         }       
2028   } //
2029
2030   if(!aResult) {    
2031         TopoDS_Shell anOuterShell; 
2032         TNaming::OuterShell(TopoDS::Solid(aCSO), anOuterShell);
2033         if(!anOuterShell.IsNull()) {
2034       for (TopoDS_Iterator itS(aCSO); itS.More(); itS.Next()) {
2035         const TopoDS_Shape& S = itS.Value();//shell
2036             if(!S.IsNull()&& S.ShapeType() == TopAbs_SHELL) {
2037                   if(S.IsEqual(anOuterShell)) continue;
2038                   B.Select(S, S);
2039                 }
2040           }
2041         }
2042   }
2043   }
2044   return aResult;
2045 }
2046 #ifdef DEB
2047 //=======================================================================
2048 static  Standard_CString NameTypeToString (const TNaming_NameType Type)
2049 {
2050   switch(Type)
2051     {
2052     case  TNaming_UNKNOWN             : return "UNKNOWN";
2053     case  TNaming_IDENTITY            : return "IDENTITY";
2054     case  TNaming_MODIFUNTIL          : return "MODIFUNTIL";
2055     case  TNaming_GENERATION          : return "GENERATION";
2056     case  TNaming_INTERSECTION        : return "INTERSECTION";
2057     case  TNaming_UNION               : return "UNION";
2058     case  TNaming_SUBSTRACTION        : return "SUBSTRACTION";
2059     case  TNaming_CONSTSHAPE          : return "CONSTSHAPE";
2060     case  TNaming_FILTERBYNEIGHBOURGS : return "FILTERBYNEIGHBOURGS";
2061     case  TNaming_ORIENTATION         : return "ORIENTATION";
2062     case  TNaming_WIREIN              : return "WIREIN";
2063       default :
2064         Standard_DomainError::Raise("TNaming_NameType; enum term unknown ");
2065     }
2066   return "";
2067 }
2068 #endif
2069 //=======================================================================
2070 //function : Solve
2071 //purpose  : 
2072 //=======================================================================
2073
2074 Standard_Boolean TNaming_Name::Solve(const TDF_Label&    aLab,
2075                                      const TDF_LabelMap& Valid) const
2076 {
2077   Standard_Boolean Done = 0;
2078 #ifdef MDTV_DEB_WIN
2079   PrintEntry(aLab);
2080 #endif
2081   try {
2082   switch (myType) {
2083   case TNaming_UNKNOWN :
2084     {
2085       break;
2086     }  
2087   case TNaming_IDENTITY :
2088     {  
2089       Done = Identity(aLab,Valid,myArgs,myShapeType); 
2090       break;
2091     }
2092   case TNaming_MODIFUNTIL:
2093     {
2094       Done = ModifUntil (aLab,Valid,myArgs,myStop);
2095       break;
2096     }
2097   case TNaming_GENERATION:
2098     {
2099       Done = Generated (aLab,Valid,myArgs);
2100       break;
2101     }
2102   case TNaming_INTERSECTION:
2103     {
2104       Done = Intersection (aLab,Valid,myArgs,myStop,myShapeType,myIndex); 
2105       break;
2106     }
2107   case TNaming_UNION:
2108     {
2109       Done = Union (aLab,Valid,myArgs,myStop,myShapeType, myContextLabel);
2110       break;
2111     }
2112   case TNaming_SUBSTRACTION: 
2113     {
2114       Standard_NotImplemented::Raise();
2115 //      Done = Substraction (aLab,Valid,myArgs);
2116       break;
2117     }
2118   case TNaming_CONSTSHAPE:
2119     {
2120       Done = ConstShape (aLab,Valid,myArgs,myStop,myIndex);
2121       break;
2122     }
2123   case TNaming_FILTERBYNEIGHBOURGS:
2124     {
2125       Done = FilterByNeighbourgs (aLab,Valid,myArgs,myStop,myShapeType);
2126       break;
2127     }
2128   case TNaming_ORIENTATION: 
2129     {
2130       Done = ORientation (aLab,Valid,myArgs,myStop,myIndex);
2131       break;
2132     }
2133   case TNaming_WIREIN: 
2134     {
2135 #ifdef MDTV_DEB_WIN  
2136       cout << "Name::Solve: NameType = " << myType << "  ";
2137   PrintEntry(aLab);
2138 #endif
2139       Done = WireIN (aLab,Valid,myArgs,myStop,myIndex);
2140       break;
2141     }
2142 case TNaming_SHELLIN: 
2143     {
2144 #ifdef MDTV_DEB_SHELL
2145       cout << "Name::Solve: NameType = " << myType << "  ";
2146       PrintEntry(aLab);
2147 #endif
2148       Done = ShellIN (aLab,Valid,myArgs,myStop,myIndex);      
2149       break;
2150     }
2151   }
2152 } catch (...) {
2153 #ifdef DEB  
2154   cout << "Name::Solve: EXCEPTION==> NameType = " << NameTypeToString(myType) << "  ";
2155   PrintEntry(aLab);
2156 #endif
2157 }
2158   return Done;
2159 }
2160
2161 //=======================================================================
2162 //function : ContextLabel
2163 //purpose  : Set
2164 //=======================================================================
2165
2166 void TNaming_Name::ContextLabel(const TDF_Label& theLabel)
2167 {
2168   myContextLabel = theLabel;
2169 }
2170
2171 //=======================================================================
2172 //function : ContextLabel
2173 //purpose  : Get
2174 //=======================================================================
2175
2176 const TDF_Label&  TNaming_Name::ContextLabel() const
2177
2178   return myContextLabel;
2179 }
2180
2181 //=======================================================================
2182 //function : Orientation
2183 //purpose  : Set
2184 //=======================================================================
2185 void TNaming_Name::Orientation(const TopAbs_Orientation theOrientation) 
2186 {
2187   myOrientation = theOrientation;
2188 }
2189