0026377: Passing Handle objects as arguments to functions as non-const reference...
[occt.git] / src / TNaming / TNaming.cxx
CommitLineData
b311480e 1// Created on: 1998-01-20
2// Created by: Yves FRICAUD
3// Copyright (c) 1997-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 8// This library is free software; you can redistribute it and/or modify it under
9// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
7fd59977 17
18#include <BRep_Builder.hxx>
19#include <BRep_Tool.hxx>
20#include <BRepBuilderAPI_Transform.hxx>
42cf5bc1 21#include <BRepClass3d_SolidClassifier.hxx>
22#include <gp_Trsf.hxx>
23#include <IntTools_FClass2d.hxx>
24#include <TColStd_IndexedDataMapOfTransientTransient.hxx>
7fd59977 25#include <TDF_ChildIterator.hxx>
42cf5bc1 26#include <TDF_Label.hxx>
27#include <TNaming.hxx>
7fd59977 28#include <TNaming_Builder.hxx>
42cf5bc1 29#include <TNaming_DataMapOfShapePtrRefShape.hxx>
7fd59977 30#include <TNaming_Iterator.hxx>
7fd59977 31#include <TNaming_ListIteratorOfListOfNamedShape.hxx>
42cf5bc1 32#include <TNaming_ListOfNamedShape.hxx>
33#include <TNaming_NamedShape.hxx>
34#include <TNaming_NewShapeIterator.hxx>
7fd59977 35#include <TNaming_RefShape.hxx>
42cf5bc1 36#include <TNaming_ShapesSet.hxx>
7fd59977 37#include <TNaming_Tool.hxx>
7fd59977 38#include <TNaming_TranslateTool.hxx>
42cf5bc1 39#include <TNaming_UsedShapes.hxx>
40#include <TopExp_Explorer.hxx>
7fd59977 41#include <TopLoc_Datum3D.hxx>
42cf5bc1 42#include <TopLoc_Location.hxx>
43#include <TopoDS.hxx>
44#include <TopoDS_Compound.hxx>
45#include <TopoDS_Face.hxx>
46#include <TopoDS_Iterator.hxx>
47#include <TopoDS_Shape.hxx>
48#include <TopoDS_Shell.hxx>
49#include <TopoDS_Solid.hxx>
50#include <TopoDS_Wire.hxx>
51#include <TopTools_DataMapIteratorOfDataMapOfOrientedShapeShape.hxx>
52#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
53#include <TopTools_DataMapOfOrientedShapeShape.hxx>
54#include <TopTools_DataMapOfShapeShape.hxx>
55#include <TopTools_ListIteratorOfListOfShape.hxx>
56#include <TopTools_ListOfShape.hxx>
57#include <TopTools_MapIteratorOfMapOfShape.hxx>
58#include <TopTools_MapOfShape.hxx>
7fd59977 59
42cf5bc1 60// CopyShape
7fd59977 61//=======================================================================
62//function : MapShapes
63//purpose : TNaming
64//=======================================================================
7fd59977 65static void MapShapes(const TopoDS_Shape& SCible, const TopoDS_Shape& SSource, TopTools_DataMapOfShapeShape& M)
66{
67 M.Bind(SCible,SSource);
68 TopoDS_Iterator icible(SCible);
69 TopoDS_Iterator isource(SSource);
70 while (icible.More()) {
71 if (!M.IsBound(icible.Value())) MapShapes(icible.Value(),isource.Value(),M);
72 icible.Next();
73 isource.Next();
74 }
75}
76
77//=======================================================================
78//function : MapShapes
79//purpose : TNaming
80//=======================================================================
81
82static void MapShapes(const TDF_Label& LCible, const TDF_Label& LSource, TopTools_DataMapOfShapeShape& M)
83{
84 TNaming_Iterator icible(LCible);
85 TNaming_Iterator isource(LSource);
86 while (icible.More()) {
87 if (!icible.OldShape().IsNull()) {
88 if (!M.IsBound(icible.OldShape())) MapShapes(icible.OldShape(),isource.OldShape(),M);
89 }
90 if (!icible.NewShape().IsNull()) {
91 if (!M.IsBound(icible.NewShape())) MapShapes(icible.NewShape(),isource.NewShape(),M);
92 }
93 icible.Next();
94 isource.Next();
95 }
96
97 TDF_ChildIterator iccible(LCible);
98 TDF_ChildIterator icsource(LSource);
99 while (iccible.More()) {
100 MapShapes(iccible.Value(),icsource.Value(),M);
101 iccible.Next();
102 icsource.Next();
103 }
104}
105
106//=======================================================================
107//function : SubstituteShape
108//purpose : TNaming
109//=======================================================================
110
f24125b9 111static void SubstituteShape(const TopoDS_Shape& oldShape,
7fd59977 112 const TopoDS_Shape& newShape,
113 TNaming_DataMapOfShapePtrRefShape& amap)
114{
115 if (oldShape.IsSame(newShape)) {
116 cout <<"import_tool::Substitute : oldShape IsSame newShape"<<endl;
117 }
118
119 if (!amap.IsBound(oldShape)) {
120 return;
121 }
122 TNaming_RefShape* pos;
123 pos = amap.ChangeFind(oldShape);
124 pos->Shape(newShape);
125 amap.UnBind(oldShape);
126 amap.Bind(newShape,pos);
127}
128
129//=======================================================================
130//function : MakeShape
131//purpose : ANaming
132//=======================================================================
133
134TopoDS_Shape TNaming::MakeShape (const TopTools_MapOfShape& MS)
135{
136 if (!MS.IsEmpty ()) {
137 TopTools_MapIteratorOfMapOfShape it(MS);
138 if (MS.Extent() == 1) {
139 return it.Key();
140 }
141 else {
142 TopoDS_Compound C;
143 BRep_Builder B;
144 B.MakeCompound(C);
145 for (; it.More(); it.Next()){
146 B.Add(C,it.Key());
147 }
148 return C;
149 }
150 }
151 return TopoDS_Shape();
152}
153
154//=======================================================================
155//function : Substitute
156//purpose : TNaming
157//=======================================================================
158
159void TNaming::Substitute(const TDF_Label& LSource,
160 const TDF_Label& LCible ,
161 TopTools_DataMapOfShapeShape& M)
162{
163//attention pour etre en parallele au niveau structure il faut que Lciblble corresponde au premier fils recopie
164 MapShapes(LCible,LSource,M);
165 Handle(TNaming_UsedShapes) US;
166 LCible.Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
167 TNaming_DataMapOfShapePtrRefShape& amap = US->Map();
168 for (TopTools_DataMapIteratorOfDataMapOfShapeShape It(M);It.More();It.Next()) {
169 SubstituteShape(It.Key(),It.Value(),amap);
170 }
171}
172
173//=======================================================================
174//function : SubstituteSShape
175//purpose :
176//=======================================================================
177Standard_Boolean TNaming::SubstituteSShape(const TDF_Label& Lab, const TopoDS_Shape& From, TopoDS_Shape& To)
178{
179 Handle(TNaming_UsedShapes) US;
180 Lab.Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
181 TNaming_DataMapOfShapePtrRefShape& amap = US->Map();
182 if (!amap.IsBound(To))
183 return Standard_False;
184 TNaming_RefShape* pos;
185 pos = amap.ChangeFind(To);
186 if(!amap.UnBind(To)) return Standard_False;
187 //update shape
188 To.Orientation(From.Orientation());
189 pos->Shape(To);
190 return amap.Bind(To, pos);
191}
192
193//=======================================================================
194//function : Rebuild
195//purpose : TNaming
196//=======================================================================
197
198static Standard_Boolean Rebuild (const TopoDS_Shape& S,
199 TopTools_DataMapOfShapeShape& M)
200{
201 Standard_Boolean IsModified = Standard_False;
202 if (M.IsBound(S)) return IsModified;
203
204 BRep_Builder B;
205 TopoDS_Iterator iteS (S.Oriented(TopAbs_FORWARD));
206
207 // Reconstruction des sous shapes si necessaire.
208 for (; iteS.More(); iteS.Next()) {
209 const TopoDS_Shape& SS = iteS.Value();
210 if (Rebuild (SS,M)) IsModified = Standard_True;
211 }
212 if (!IsModified) {
213 M.Bind(S,S);
214 return Standard_True;
215 }
216
217 // Reconstruction de S
218 TopoDS_Shape NewS = S.Oriented(TopAbs_FORWARD);
219 NewS.EmptyCopy();
220 if (NewS.ShapeType() == TopAbs_EDGE) {
221 Standard_Real f,l;
222 BRep_Tool::Range(TopoDS::Edge(S),f,l);
223 B.Range(TopoDS::Edge(NewS),f,l);
224 }
225 iteS.Initialize(S.Oriented(TopAbs_FORWARD));
226 for (iteS.Initialize(S.Oriented(TopAbs_FORWARD)) ;iteS.More(); iteS.Next()) {
227 const TopoDS_Shape& OS = iteS.Value();
228 const TopoDS_Shape& NS = M(OS);
229 B.Add(NewS,NS.Oriented(OS.Orientation()));
230 }
231 M.Bind (S,NewS.Oriented(S.Orientation()));
232 return IsModified;
233}
234
235
236//=======================================================================
237//function : Update
238//purpose : TNaming
239//=======================================================================
240
241void TNaming::Update(const TDF_Label& L,
242 TopTools_DataMapOfShapeShape& M)
243
244{
245 //Reconstruction des shapes de L suite aux substitutions decrites dans la map M.
246 // ex : si une face est remplacee par une autre il faut reconstruire les shapes
247 // qui contiennent cette face.
248 Handle(TNaming_UsedShapes) US;
249 L.Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
250 TNaming_DataMapOfShapePtrRefShape& amap = US->Map();
251
7fd59977 252 for (TNaming_Iterator it(L); it.More(); it.Next()) {
253 if (!it.OldShape().IsNull()) {
254 const TopoDS_Shape& S = it.OldShape();
255 if (!M.IsBound(S))
96a95605 256 Rebuild (S,M);
7fd59977 257 SubstituteShape(S,M(S),amap);
258 }
259 if (!it.NewShape().IsNull()) {
260 const TopoDS_Shape& S = it.NewShape();
261 if (!M.IsBound(S))
96a95605 262 Rebuild (S,M);
7fd59977 263 SubstituteShape(S,M(S),amap);
264 }
265 }
266
267 // SI Les shapes dans les sous-labels sont des sous shapes des shapes de L
268 // si les shapes de L n ont pas changes les shapes des sous-labels ne seront
269 // pas changes non plus.
270 for (TDF_ChildIterator ciL(L); ciL.More(); ciL.Next()) {
271 TNaming::Update (ciL.Value(),M);
272 }
273}
274
275//=======================================================================
276//function : BuilCompound
277//purpose : TNaming
278//=======================================================================
279
280static void BuildCompound(TopoDS_Compound& C,
281 const TDF_Label& L)
282{
283 BRep_Builder B;
284 for (TNaming_Iterator it(L); it.More(); it.Next()) {
285 if (!it.OldShape().IsNull()) {
286 B.Add(C,it.OldShape());
287 }
288 if (!it.NewShape().IsNull()) {
289 B.Add(C,it.NewShape());
290 }
291 }
292 for (TDF_ChildIterator ciL(L); ciL.More(); ciL.Next()) {
293 BuildCompound (C,ciL.Value());
294 }
295}
296
297//=======================================================================
298//function : Update
299//purpose : TNaming
300//=======================================================================
301
302static void BuildMap(const TDF_Label& L,
303 BRepBuilderAPI_Transform& Transformer,
304 TopTools_DataMapOfShapeShape& M)
305{
306 Handle(TNaming_UsedShapes) US;
307 L.Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
308 for (TNaming_Iterator it(L); it.More(); it.Next()) {
309 if (!it.OldShape().IsNull()) {
310 const TopoDS_Shape& S = it.OldShape();
311 M.Bind(S,Transformer.ModifiedShape(S));
312 }
313 if (!it.NewShape().IsNull()) {
314 const TopoDS_Shape& S = it.NewShape();
315 M.Bind(S,Transformer.ModifiedShape(S));
316 }
317 }
318 for (TDF_ChildIterator ciL(L); ciL.More(); ciL.Next()) {
319 BuildMap (ciL.Value(),Transformer,M);
320 }
321}
322
323//=======================================================================
324//function : LoadNamedShape
325//purpose : TNaming
326//=======================================================================
327
328static void LoadNamedShape (TNaming_Builder& B,
329 TNaming_Evolution Evol,
330 const TopoDS_Shape& OS,
331 const TopoDS_Shape& NS)
332{
333 switch (Evol) {
334 case TNaming_PRIMITIVE :
335 {
336 B.Generated(NS);
337 break;
338 }
339 case TNaming_GENERATED :
340 {
341 B.Generated(OS,NS);
342 break;
343 }
344 case TNaming_MODIFY :
345 {
346 B.Modify(OS,NS);
347 break;
348 }
349 case TNaming_DELETE :
350 {
351 B.Delete (OS);
352 break;
353 }
354 case TNaming_SELECTED :
355 {
356 B.Select(NS,OS);
1ec8a59e 357 break;
7fd59977 358 }
359 default:
360 break;
361 }
362}
363
364//=======================================================================
365//function : Displace
366//purpose : TNaming
367//=======================================================================
368
369void TNaming::Displace (const TDF_Label& L,
370 const TopLoc_Location& Loc,
371 const Standard_Boolean WithOld)
372{
373
374
375 TopTools_ListOfShape Olds;
376 TopTools_ListOfShape News;
377 TNaming_Evolution Evol;
378 TNaming_Iterator it(L);
379
380 if (it.More()) { // dp on continue de visiter les fils meme s'il y a pas de shape
381 Evol = it.Evolution();
382 for ( ; it.More(); it.Next()) {
383 Olds.Append(it.OldShape());
384 News.Append(it.NewShape());
385
386 }
387
388 TopTools_ListIteratorOfListOfShape itOlds(Olds);
389 TopTools_ListIteratorOfListOfShape itNews(News);
390 TNaming_Builder B(L);
391
392 for ( ;itOlds.More() ; itOlds.Next(),itNews.Next()) {
393 TopoDS_Shape OS,NS;
394 const TopoDS_Shape& SO = itOlds.Value();
395 const TopoDS_Shape& SN = itNews.Value();
396 OS = SO;
397 if (WithOld && !SO.IsNull()) OS = SO.Moved(Loc);
398 if (!SN.IsNull()) NS = SN.Moved(Loc);
399
400 LoadNamedShape ( B, Evol, OS, NS);
401 }
402 }
403 for (TDF_ChildIterator ciL(L); ciL.More(); ciL.Next()) {
076b125a 404 Displace (ciL.Value(), Loc, WithOld);
7fd59977 405 }
406}
407
408//=======================================================================
409//function : Replace
410//purpose : TNaming
411//=======================================================================
412
413static void Replace (const TDF_Label& L,
414 const TopTools_DataMapOfShapeShape& M)
415{
416
417 TNaming_Evolution Evol;
418 TNaming_Iterator it(L);
419
420 if (!it.More()) return;
421 Evol = it.Evolution();
422
423 TNaming_Builder B(L);
424
425 TopoDS_Shape OS,NS;
426
427 for ( ; it.More(); it.Next()) {
428 if (!it.OldShape().IsNull()) {
429 OS = it.OldShape();
430 if (M.IsBound(OS)) OS = M(OS);
431 }
432 if (!it.NewShape().IsNull()) {
433 NS = it.NewShape();
434 if (M.IsBound(NS)) NS = M(NS);
435 }
436 LoadNamedShape ( B, Evol, OS, NS);
437 }
438 for (TDF_ChildIterator ciL(L); ciL.More(); ciL.Next()) {
439 Replace (ciL.Value(),M);
440 }
441}
442
443//=======================================================================
444//function : Update
445//purpose : TNaming
446//=======================================================================
447
448void TNaming::Transform(const TDF_Label& L,
449 const gp_Trsf& T)
450{
451
452 //--------------------------------------------------------------------
453 // Construction du compound qui contient tous les shapes sous le label
454 // et ses fils.
455 //--------------------------------------------------------------------
456 TopoDS_Compound CompShape;
457 BRep_Builder B;
458 B.MakeCompound(CompShape);
459
460 BuildCompound (CompShape,L);
461
462 //----------------------------
463 // Transformation du compound.
464 //-----------------------------
465 BRepBuilderAPI_Transform Transformer(CompShape, T);
466
467 //-----------------------------------------------------------
468 //Remplacement des shapes initiaux par les shapes transformes.
469 //-----------------------------------------------------------
470 TopTools_DataMapOfShapeShape M;
471 BuildMap (L,Transformer,M);
472 Replace (L,M);
473}
474
475//=======================================================================
476//function : IDList
477//purpose : TNaming
478//=======================================================================
479
480void TNaming::IDList(TDF_IDList& anIDList)
481{ anIDList.Append(TNaming_NamedShape::GetID()); }
482
483
484//=======================================================================
485//function : Replicate
486//purpose :
487//=======================================================================
488
489void TNaming::Replicate(const Handle(TNaming_NamedShape)& NS,
490 const gp_Trsf& T,
491 const TDF_Label& L)
492{
493 TopoDS_Shape SH = TNaming_Tool::CurrentShape(NS);
494 TNaming::Replicate(SH, T, L);
495}
496
497//=======================================================================
498//function : Replicate
499//purpose : TNaming
500//=======================================================================
501
502void TNaming::Replicate (const TopoDS_Shape& SH,
503 const gp_Trsf& T,
504 const TDF_Label& L)
505{
506 // transform
507 BRepBuilderAPI_Transform opeTrsf(T);
508 if (SH.ShapeType() == TopAbs_FACE || SH.ShapeType() == TopAbs_WIRE ) {
509 opeTrsf.Perform(SH, Standard_True); // pour le pattern de prism
510 }
511 else {
512 opeTrsf.Perform(SH, Standard_False);
513 }
514 const TopoDS_Shape& newSH = opeTrsf.Shape();
515 //BRepLib::UpdateTolerances(newSH, Standard_True);
516
517 // principal shape
518
519 TNaming_Builder Builder(L);
520 Builder.Generated(SH, newSH);
521
522 // sub shape
523 TopAbs_ShapeEnum SST = TopAbs_FACE;
524 if (SH.ShapeType() == TopAbs_FACE || SH.ShapeType() == TopAbs_WIRE )
525 SST = TopAbs_EDGE;
526
527 TNaming_Builder Builder2 (L.FindChild(1,Standard_True));
528 for (TopExp_Explorer exp(SH, SST); exp.More(); exp.Next()) {
529 const TopoDS_Shape& oldSubShape = exp.Current();
346cf025 530 TopoDS_Shape newSubShape = opeTrsf.ModifiedShape(oldSubShape);
7fd59977 531 Builder2.Generated(oldSubShape, newSubShape);
532 }
533}
534
535
536//=======================================================================
537//function : ShapeCopy
538//purpose : TNaming
539//=======================================================================
540
541static TopoDS_Shape ShapeCopy(const TopoDS_Shape& S,
542 TopTools_DataMapOfShapeShape& M)
543{
544 if (S.IsNull()) return S;
545 if (M.IsBound(S)) return M(S);
546 //----------------------------
547 //construction de la copie.
548 // 1- copie des sous shapes.
549 // 2- reconstruction du TShape
550 //----------------------------
551 BRep_Builder B;
552 TopoDS_Iterator it (S.Oriented(TopAbs_FORWARD));
553
554 for ( ; it.More(); it.Next()) {
555 const TopoDS_Shape& SS = it.Value();
556 TopoDS_Shape NewSS = ShapeCopy(SS,M);
557 }
558 TopoDS_Shape NewS = S.Oriented(TopAbs_FORWARD);
559 NewS.EmptyCopy();
560 if (NewS.ShapeType() == TopAbs_EDGE) {
561 Standard_Real f,l;
562 BRep_Tool::Range(TopoDS::Edge(S),f,l);
563 B.Range(TopoDS::Edge(NewS),f,l);
564 }
565 for (it.Initialize(S.Oriented(TopAbs_FORWARD)) ;it.More(); it.Next()) {
566 const TopoDS_Shape& OS = it.Value();
567 const TopoDS_Shape& NS = M(OS);
568 B.Add(NewS,NS.Oriented(OS.Orientation()));
569 }
570 NewS.Orientation(S.Orientation());
571
572 NewS.Free (S.Free()) ;NewS.Modified(S.Modified());NewS.Checked (S.Checked());
573 NewS.Orientable(S.Orientable());NewS.Closed (S.Closed()) ;NewS.Infinite(S.Infinite());
574 NewS.Convex (S.Convex());
575
576 M.Bind (S,NewS);
577 return NewS;
578}
579
580//=======================================================================
581//function : ChangeShapes
582//purpose : TNaming
583//=======================================================================
584
585void TNaming::ChangeShapes(const TDF_Label& L,
586 TopTools_DataMapOfShapeShape& M)
587{
588 TopTools_ListOfShape Olds;
589 TopTools_ListOfShape News;
590
591 Handle(TNaming_NamedShape) NS;
592 L.FindAttribute(TNaming_NamedShape::GetID(),NS);
593
594 if (!NS.IsNull()) {
595 TNaming_Evolution Evol = NS->Evolution();
596 for (TNaming_Iterator it(L); it.More(); it.Next()) {
597 const TopoDS_Shape& S1 = it.OldShape();
598 const TopoDS_Shape& S2 = it.NewShape();
599 Olds.Append(ShapeCopy(S1,M));News.Append(ShapeCopy(S2,M));
600 }
601
602 TopTools_ListIteratorOfListOfShape itOlds(Olds);
603 TopTools_ListIteratorOfListOfShape itNews(News);
604
605 TNaming_Builder B(L);
606
607 for ( ;itOlds.More() ; itOlds.Next(),itNews.Next()) {
608 LoadNamedShape ( B, Evol, itOlds.Value(), itNews.Value());
609 }
610 }
611
612 for (TDF_ChildIterator ciL(L); ciL.More(); ciL.Next()) {
613 ChangeShapes (ciL.Value(),M);
614 }
615}
616
617
618//=======================================================================
619//function :
620//purpose :
621//=======================================================================
622
623Standard_OStream& TNaming::Print (const TNaming_Evolution EVOL, Standard_OStream& s)
624{
625 switch(EVOL){
626 case TNaming_PRIMITIVE :
627 {
628 s <<"PRIMITIVE"; break;
629 }
630 case TNaming_GENERATED :
631 {
632 s <<"GENERATED"; break;
633 }
634 case TNaming_MODIFY :
635 {
636 s <<"MODIFY"; break;
637 }
638 case TNaming_DELETE :
639 {
640 s <<"DELETE"; break;
641 }
642 case TNaming_SELECTED :
643 {
644 s <<"SELECTED"; break;
645 }
646 default :
647 s << "UNKNOWN_Evolution"; break;
648 }
649 return s;
650}
651
652
653
654//=======================================================================
655//function :
656//purpose :
657//=======================================================================
658
659Standard_OStream& TNaming::Print (const TNaming_NameType NAME, Standard_OStream& s)
660{
661
662 switch (NAME) {
663 case TNaming_UNKNOWN :
664 {
665 s <<"UNKNOWN"; break;
666 }
667 case TNaming_IDENTITY :
668 {
669 s <<"IDENTITY"; break;
670 }
671 case TNaming_MODIFUNTIL :
672 {
673 s <<"MODIFUNTIL"; break;
674 }
675 case TNaming_GENERATION :
676 {
677 s <<"GENERATION"; break;
678 }
679 case TNaming_INTERSECTION :
680 {
681 s <<"INTERSECTION"; break;
682 }
683 case TNaming_UNION:
684 {
685 s <<"UNION"; break;
686 }
687 case TNaming_SUBSTRACTION :
688 {
689 s <<"SUBSTRACTION"; break;
690 }
691 case TNaming_CONSTSHAPE :
692 {
693 s <<"CONSTSHAPE"; break;
694 }
695 case TNaming_FILTERBYNEIGHBOURGS:
696 {
697 s <<"FILTERBYNEIGHBOURGS"; break;
698 }
699 case TNaming_ORIENTATION:
700 {
701 s <<"ORIENTATION"; break;
702 }
703 case TNaming_WIREIN:
704 {
705 s <<"WIREIN"; break;
1ec8a59e 706 }
707 case TNaming_SHELLIN:
708 {
709 s <<"SHELLIN"; break;
7fd59977 710 }
711 default :
712 {
713 s <<"UNKNOWN_NameType"; break;
714 }
715 }
716 return s;
717}
718
7fd59977 719//=======================================================================
720//function : Print
721//purpose : Prints UsedShapes.
722//=======================================================================
723
724Standard_OStream& TNaming::Print (const TDF_Label& ACCESS, Standard_OStream& s) {
725 Handle(TNaming_UsedShapes) US;
726 if (!ACCESS.Root().FindAttribute(TNaming_UsedShapes::GetID(), US)) {
0797d9d3 727#ifdef OCCT_DEBUG
7fd59977 728 cout<<"TNaming::Print(US): Bad access"<<endl;
729#endif
730 return s;
731 }
732 return US->Dump(s);
733}
734
7fd59977 735//=======================================================================
736//function : BuildMapIn
737//purpose :
738//=======================================================================
739static void BuildMapIn(const TopoDS_Shape& Context, const TopAbs_ShapeEnum StopType,
740 TopTools_DataMapOfOrientedShapeShape& Map)
741{
742 TopAbs_ShapeEnum aType;
743 if((Context.ShapeType() == TopAbs_SOLID || Context.ShapeType() == TopAbs_FACE) && (StopType - Context.ShapeType()) != 1)
744 aType = (TopAbs_ShapeEnum)(Context.ShapeType() +2);
745 else
746 aType = (TopAbs_ShapeEnum)(Context.ShapeType()+1);
747 for (TopExp_Explorer exp(Context,aType); exp.More(); exp.Next()) {
0797d9d3 748#ifdef OCCT_DEBUG
7fd59977 749 if(!Map.Bind(exp.Current(), Context))
750 cout << "Not bind = " <<exp.Current().ShapeType() <<endl;
751 else
752 cout <<"Bind = " <<exp.Current().ShapeType() << " to Context = " <<Context.ShapeType()<<endl;
753#else
754 Map.Bind(exp.Current(), Context);
755#endif
756 if(exp.Current().ShapeType() < StopType ) {
757 BuildMapIn(exp.Current(), StopType, Map);
758 }
759 }
760 // fix for NMT case
761 if(Context.ShapeType() < StopType) {
762 TopoDS_Iterator it(Context);
763 for(;it.More();it.Next()) {
764 if(it.Value().Orientation() != TopAbs_FORWARD && it.Value().Orientation() != TopAbs_REVERSED) {
765 Map.Bind(it.Value(), Context);
766 //cout << "INTERNAL || EXTERNAL Orientation found" <<endl;
767 }
768 }
769 }
770}
771//=======================================================================
772//function : BuildMapC0
773//purpose : builds data map: key - context, C0 - top context
774//=======================================================================
775static void BuildMapC0(const TopoDS_Shape& Context, const TopoDS_Shape& C0, const TopAbs_ShapeEnum StopType,
776 TopTools_DataMapOfOrientedShapeShape& Map)
777{
778 TopoDS_Iterator anIt(Context);
779 while(anIt.More()) {
780 const TopoDS_Shape& aKey = anIt.Value();
0797d9d3 781#ifdef OCCT_DEBUG
7fd59977 782 if(!Map.Bind(aKey, C0))
783 cout << "Not bind = " <<aKey.ShapeType() <<endl;
784#else
785 Map.Bind(aKey, C0);
786#endif
787 if(aKey.ShapeType() < StopType ) {
788 if(aKey.ShapeType() < TopAbs_SOLID) {
789 BuildMapC0(aKey, Context, StopType, Map);
790 }
791 else
792 BuildMapIn(aKey, StopType, Map);
793 }
794 anIt.Next();
795 }
796}
797
798//=======================================================================
799//function : BuildMap
800//purpose : builds data map: key - context
801//=======================================================================
802static void BuildMap(const TopoDS_Shape& Context, const TopAbs_ShapeEnum StopType,
803 TopTools_DataMapOfOrientedShapeShape& Map)
804{
7fd59977 805 TopoDS_Iterator anIt(Context);
806 while(anIt.More()) {
807 const TopoDS_Shape& aKey = anIt.Value();
0797d9d3 808#ifdef OCCT_DEBUG
7fd59977 809 if(!Map.Bind(aKey, Context))
810 cout << "Not bind = " <<aKey.ShapeType() <<endl;
811#else
812 Map.Bind(aKey, Context);
813#endif
814 if(aKey.ShapeType() < StopType ) {
815 if(aKey.ShapeType() < TopAbs_SOLID)
816 BuildMapC0(aKey, Context, StopType, Map);
817 else
818 BuildMapIn(aKey, StopType, Map);
819 }
820 anIt.Next();
821 }
822}
823//=======================================================================
824//function : FindUniqueContext
825//purpose : Find unique context of selection
826//=======================================================================
827TopoDS_Shape TNaming::FindUniqueContext(const TopoDS_Shape& Selection, const TopoDS_Shape& Context)
828{
829 TopTools_DataMapOfOrientedShapeShape aMap;
830 BuildMap(Context, Selection.ShapeType(), aMap);
0797d9d3 831#ifdef OCCT_DEBUG
7fd59977 832 TopTools_DataMapIteratorOfDataMapOfOrientedShapeShape it (aMap);
833 for (;it.More();it.Next()) {
1c29294e 834 cout <<"FindUniqueContext: Key - " <<it.Key().ShapeType()<< " " << it.Key().TShape().get() <<" OR = " <<it.Key().Orientation() <<
835 " Context - " << it.Value().ShapeType() << " " << it.Value().TShape().get() << " OR = " <<it.Value().Orientation() <<endl;
7fd59977 836 }
837#endif
838 if(aMap.IsBound(Selection))
839 return aMap.Find(Selection);
840 return TopoDS_Shape();
841}
842
843//=======================================================================
844//function : FindUniqueContexts
845//purpose : Find unique context of selection which is pure concatenation
846// : of atomic shapes (Compound)
847//=======================================================================
848TopoDS_Shape TNaming::FindUniqueContextSet(const TopoDS_Shape& Selection, const TopoDS_Shape& Context,
849 Handle(TopTools_HArray1OfShape)& Arr)
850{
851 if(Selection.ShapeType() == TopAbs_COMPOUND) {
852 TopTools_DataMapOfOrientedShapeShape aMap;
853 Standard_Integer Up(0);
854 TopAbs_ShapeEnum aStopType(TopAbs_COMPOUND);
51740958 855 TopoDS_Iterator anIter(Selection);
856 for(; anIter.More(); anIter.Next()) {
857 const TopoDS_Shape& aS = anIter.Value();
7fd59977 858 if(aS.ShapeType() > aStopType)
859 aStopType = aS.ShapeType();
860 Up++;
861 }
862 if(Up > 0)
863 Arr = new TopTools_HArray1OfShape(1, Up);
864 if(aStopType == TopAbs_SHAPE)
865 aStopType = Selection.ShapeType();
866 BuildMap(Context, aStopType, aMap);
867 if(aMap.IsBound(Selection))
868 return aMap.Find(Selection);
869 else if(Selection.ShapeType() == TopAbs_COMPOUND) {
870 Standard_Integer num1(0),num2(0);
871 TopoDS_Compound CompShape;
872 BRep_Builder B;
873 B.MakeCompound(CompShape);
874 TopoDS_Iterator it(Selection);
875 TopTools_MapOfShape aView;
876 for(;it.More(); it.Next(),num1++) {
877 if(aMap.IsBound(it.Value())) {
878 if(aView.Add(aMap.Find(it.Value()))) {
879 B.Add(CompShape, aMap.Find(it.Value()));
880 }
881 if(!Arr.IsNull())
882 Arr->SetValue(num1+1, aMap.Find(it.Value()));
883
884 if(aMap.Find(it.Value()) == Context)
885 num2++;
886 }
887 }
888 if(num1 == num2 && num2)
889 return Context;
890 else {
51740958 891 TopoDS_Iterator anIt(CompShape);
7fd59977 892 Standard_Integer n(0);
893 TopoDS_Shape aCmp;
51740958 894 for(; anIt.More(); anIt.Next()) {
7fd59977 895 n++;
51740958 896 aCmp = anIt.Value();
7fd59977 897 }
898 if(n == 1) {
0797d9d3 899#ifdef OCCT_DEBUG_FSET
7fd59977 900 cout << "FindUniqueContextSet: n = " << n <<endl;
901#endif
902 return aCmp;
903 }
904 return CompShape;
905 }
906 }
907 }
908 return TopoDS_Shape();
909}
910
1ec8a59e 911//=======================================================================
912//function : OuterWire
913//purpose : Returns True & <theWire> if Outer wire is found.
914//=======================================================================
915Standard_Boolean TNaming::OuterWire(const TopoDS_Face& theFace, TopoDS_Wire& theWire)
916{
917 TopoDS_Face aFx;
918 TopoDS_Wire aWx;
919 BRep_Builder aBB;
920 IntTools_FClass2d aFC;
921 Standard_Boolean bFlag(Standard_False);
922 Standard_Real aTol = BRep_Tool::Tolerance(theFace);
923 TopoDS_Iterator aIt(theFace);
924 for (; aIt.More(); aIt.Next()) {
925 aWx=*((TopoDS_Wire*)&aIt.Value());
926 aFx = theFace;
927 aFx.EmptyCopy();
928 aBB.Add(aFx, aWx);
929 aFC.Init(aFx, aTol);
930 bFlag = aFC.IsHole();
931 if (!bFlag)
932 break;
933 }
934 theWire=aWx;
935 return !bFlag;// if bFlag == True - not found
936}
937//=======================================================================
938//function : IsInternal
939//purpose :
940//=======================================================================
941static Standard_Boolean IsInternal(const TopoDS_Shape& aSx)
b2197f93 942{
943 TopAbs_Orientation aOr;
944 Standard_Boolean bInternal(Standard_False);
945 TopoDS_Iterator aIt(aSx);
946 if(aIt.More()) {
947 const TopoDS_Shape& aSy = aIt.Value();
948 aOr = aSy.Orientation();
949 bInternal = (aOr == TopAbs_INTERNAL || aOr == TopAbs_EXTERNAL);
1ec8a59e 950 }
951 return bInternal;
952}
953//=======================================================================
954//function : OuterShell
955//purpose : returns True & <theShell>, if Outer shell is found
956//=======================================================================
957Standard_Boolean TNaming::OuterShell(const TopoDS_Solid& theSolid,
958 TopoDS_Shell& theShell)
959{
960 TopoDS_Solid aSDx;
961 TopoDS_Shell aSHx;
962 TopAbs_State aState;
963 Standard_Boolean bFound(Standard_False);
964 Standard_Real aTol(1.e-7);
965 //
966 BRep_Builder aBB;
967 BRepClass3d_SolidClassifier aSC;
968 TopoDS_Iterator aIt(theSolid);
969 for (; aIt.More(); aIt.Next()) {
970 const TopoDS_Shape& aSx = aIt.Value();
971
972 if (aSx.ShapeType() != TopAbs_SHELL)
973 continue;
974 if (IsInternal(aSx))
975 continue;
976 //
977 aSHx = *((TopoDS_Shell*)&aSx);
978 //
979 aSDx = theSolid;
980 aSDx.EmptyCopy();
981 //
982 aBB.Add(aSDx, aSHx);
983 //
984 aSC.Load(aSDx);
985 //BRepClass3d_SolidClassifier& aSC=aCtx.SolidClassifier(aSDx);
986 aSC.PerformInfinitePoint(aTol);
987 aState = aSC.State();
988 if(aState == TopAbs_OUT) {
989 bFound = Standard_True;
990 break;
991 }
992 }
993 theShell = aSHx;
994
995 return bFound;
996}
7fd59977 997
998
999