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