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