1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // File: NMTTools_PaveFiller_8.cxx
21 // Created: Fri Dec 19 11:15:53 2003
22 // Author: Peter KURNEV
26 #include <NMTTools_PaveFiller.ixx>
28 #include <TColStd_MapOfInteger.hxx>
29 #include <TColStd_ListOfInteger.hxx>
30 #include <TColStd_ListIteratorOfListOfInteger.hxx>
32 #include <BooleanOperations_ShapesDataStructure.hxx>
33 #include <BooleanOperations_OnceExplorer.hxx>
35 #include <BOPTools_PaveBlock.hxx>
36 #include <BOPTools_ListIteratorOfListOfPaveBlock.hxx>
37 #include <BOPTools_ListOfPaveBlock.hxx>
39 #include <NMTDS_ShapesDataStructure.hxx>
41 #include <NMTTools_ListOfCommonBlock.hxx>
42 #include <NMTTools_ListIteratorOfListOfCommonBlock.hxx>
43 #include <NMTTools_CommonBlock.hxx>
44 #include <NMTTools_CommonBlockAPI.hxx>
47 // Modified to add new method Thu Sep 14 14:35:18 2006
48 // Contribution of Samtech www.samcef.com BEGIN
49 //=======================================================================
50 // function: SharedEdges
52 //=======================================================================
53 void NMTTools_PaveFiller::SharedEdges(const Standard_Integer nF1,
54 const Standard_Integer nF2,
55 TColStd_ListOfInteger& aLNE,
56 TopTools_ListOfShape& aLSE)
58 Standard_Integer nE1, nE2;
59 TColStd_MapOfInteger aM1;
61 BooleanOperations_ShapesDataStructure *pDS=myDS;
62 BooleanOperations_OnceExplorer aExp(*pDS);
64 aExp.Init(nF1, TopAbs_EDGE);
65 for (; aExp.More(); aExp.Next()) {
70 aExp.Init(nF2, TopAbs_EDGE);
71 for (; aExp.More(); aExp.Next()) {
73 if (aM1.Contains(nE2)) {
75 const TopoDS_Shape& aE2=myDS->Shape(nE2);
80 // Contribution of Samtech www.samcef.com END
82 //=======================================================================
83 // function: RealPaveBlock
85 //=======================================================================
86 const BOPTools_PaveBlock& NMTTools_PaveFiller::RealPaveBlock
87 (const BOPTools_PaveBlock& aPB,
88 TColStd_ListOfInteger& aLB,
89 Standard_Integer& aIsCommonBlock)
91 Standard_Integer nE, nSpx;
92 BOPTools_ListIteratorOfListOfPaveBlock aItPBx;
96 nE=aPB.OriginalEdge();
97 const NMTTools_ListOfCommonBlock& aLCBE=myCommonBlockPool(myDS->RefEdge(nE));
98 NMTTools_CommonBlockAPI aCBAPI(aLCBE);
99 if (aCBAPI.IsCommonBlock(aPB)) {
100 NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB);
104 const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks();
105 aItPBx.Initialize(aLPBx);
106 for (; aItPBx.More(); aItPBx.Next()) {
107 const BOPTools_PaveBlock& aPBx=aItPBx.Value();
112 const BOPTools_PaveBlock& aPBx=aCB.PaveBlock1();
118 //=======================================================================
119 // function: RealPaveBlock
121 //=======================================================================
122 const BOPTools_PaveBlock& NMTTools_PaveFiller::RealPaveBlock(const BOPTools_PaveBlock& aPB)
126 nE=aPB.OriginalEdge();
127 const NMTTools_ListOfCommonBlock& aLCBE=myCommonBlockPool(myDS->RefEdge(nE));
128 NMTTools_CommonBlockAPI aCBAPI(aLCBE);
129 if (aCBAPI.IsCommonBlock(aPB)) {
130 NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB);
131 const BOPTools_PaveBlock& aPBx=aCB.PaveBlock1();
136 //=======================================================================
137 // function: CommonBlocksFace
139 //=======================================================================
140 Standard_Integer NMTTools_PaveFiller::CommonBlocksFace(const Standard_Integer nF,
141 NMTTools_ListOfCommonBlock& aLCB)
145 NMTTools_ListIteratorOfListOfCommonBlock anIt;
147 aT=myDS->GetShapeType(nF);
149 if (aT!=TopAbs_FACE) {
150 return 1; // Type mismatch
153 BooleanOperations_ShapesDataStructure *pDS=myDS;
154 BooleanOperations_OnceExplorer aExp(*pDS);
156 aExp.Init(nF, TopAbs_EDGE);
157 for (; aExp.More(); aExp.Next()) {
159 const NMTTools_ListOfCommonBlock& aLCBE=myCommonBlockPool(myDS->RefEdge(nE));
160 anIt.Initialize(aLCBE);
161 for (; anIt.More(); anIt.Next()) {
162 const NMTTools_CommonBlock& aCBE=anIt.Value();
172 //=======================================================================
173 // function: RealSplitsFace
175 //=======================================================================
176 void NMTTools_PaveFiller::RealSplitsFace(const Standard_Integer nF,
177 BOPTools_ListOfPaveBlock& aLPB)
180 BOPTools_ListIteratorOfListOfPaveBlock anIt;
182 BooleanOperations_ShapesDataStructure *pDS=myDS;
183 BooleanOperations_OnceExplorer aExp(*pDS);
185 aExp.Init(nF, TopAbs_EDGE);
186 for (; aExp.More(); aExp.Next()) {
188 const BOPTools_ListOfPaveBlock& aLPBE=mySplitShapesPool(myDS->RefEdge(nE));
189 anIt.Initialize(aLPBE);
190 for (; anIt.More(); anIt.Next()) {
191 const BOPTools_PaveBlock& aPB=anIt.Value();
192 const BOPTools_PaveBlock& aPBR=RealPaveBlock(aPB);
197 //=======================================================================
198 // function: HasRealSplitsInOnFace
200 //=======================================================================
201 Standard_Boolean NMTTools_PaveFiller::HasRealSplitsInOnFace(const Standard_Integer nF1,
202 const Standard_Integer nF2)
204 Standard_Boolean bFlag;
205 BOPTools_ListOfPaveBlock aLPB;
207 RealSplitsInFace(0, nF1, nF2, aLPB);
209 bFlag=!aLPB.IsEmpty();
214 RealSplitsInFace(0, nF1, nF2, aLPB);
216 bFlag=!aLPB.IsEmpty();
219 //=======================================================================
220 // function: RealSplitsInFace
222 //=======================================================================
223 void NMTTools_PaveFiller::RealSplitsInFace(const Standard_Integer ,//for overriding
224 const Standard_Integer nF1,
225 const Standard_Integer nF2,
226 BOPTools_ListOfPaveBlock& aLPB)
228 Standard_Integer nE1;
230 BooleanOperations_ShapesDataStructure *pDS=myDS;
231 BooleanOperations_OnceExplorer aExp(*pDS);
232 aExp.Init(nF1, TopAbs_EDGE);
233 for (; aExp.More(); aExp.Next()) {
235 RealSplitsInFace (nE1, nF2, aLPB);
238 //=======================================================================
239 // function: RealSplitsInFace
241 //=======================================================================
242 void NMTTools_PaveFiller::RealSplitsInFace(const Standard_Integer nE1,
243 const Standard_Integer nF2,
244 BOPTools_ListOfPaveBlock& aLPB)
246 Standard_Integer nF1;
248 TColStd_ListIteratorOfListOfInteger anItLFCB;
249 NMTTools_ListIteratorOfListOfCommonBlock anItCB;
251 const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nE1));
253 anItCB.Initialize(aLCB);
254 for (; anItCB.More(); anItCB.Next()) {
255 NMTTools_CommonBlock& aCB=anItCB.Value();
256 const BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1);
257 const BOPTools_PaveBlock& aPB1R=RealPaveBlock(aPB1);
259 const TColStd_ListOfInteger& aLFCB=aCB.Faces();
260 anItLFCB.Initialize(aLFCB);
261 for (; anItLFCB.More(); anItLFCB.Next()) {
262 nF1=anItLFCB.Value();
269 //=======================================================================
270 // function: RealSplitsOnEdge
272 //=======================================================================
273 void NMTTools_PaveFiller::RealSplitsOnEdge(const Standard_Integer nE1,
274 const Standard_Integer nE2,
275 BOPTools_ListOfPaveBlock& aLPB)
279 BOPTools_ListIteratorOfListOfPaveBlock anIt;
280 NMTTools_ListIteratorOfListOfCommonBlock anItCB;
282 const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nE1));
284 anItCB.Initialize(aLCB);
285 for (; anItCB.More(); anItCB.Next()) {
286 NMTTools_CommonBlock& aCB=anItCB.Value();
287 const BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1);
288 const BOPTools_PaveBlock& aPB1R=RealPaveBlock(aPB1);
290 const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks();
291 anIt.Initialize(aLPBx);
292 for (; anIt.More(); anIt.Next()) {
293 const BOPTools_PaveBlock& aPB2=anIt.Value();
294 nE=aPB2.OriginalEdge();
301 //=======================================================================
302 // function: RealSplitsOnFace
304 //=======================================================================
305 void NMTTools_PaveFiller::RealSplitsOnFace(const Standard_Integer nE1,
306 const Standard_Integer nF2,
307 BOPTools_ListOfPaveBlock& aLPB)
309 Standard_Integer nE2;
311 BooleanOperations_ShapesDataStructure *pDS=myDS;
312 BooleanOperations_OnceExplorer aExp(*pDS);
313 aExp.Init(nF2, TopAbs_EDGE);
314 for (; aExp.More(); aExp.Next()) {
316 RealSplitsOnEdge(nE1, nE2, aLPB);
319 //=======================================================================
320 // function: RealSplitsOnFace
322 //=======================================================================
323 void NMTTools_PaveFiller::RealSplitsOnFace(const Standard_Integer ,//for overriding
324 const Standard_Integer nF1,
325 const Standard_Integer nF2,
326 BOPTools_ListOfPaveBlock& aLPB)
328 Standard_Integer nE1;
330 BooleanOperations_ShapesDataStructure *pDS=myDS;
331 BooleanOperations_OnceExplorer aExp(*myDS);
332 aExp.Init(nF1, TopAbs_EDGE);
333 for (; aExp.More(); aExp.Next()) {
335 RealSplitsOnFace(nE1, nF2, aLPB);
340 //=======================================================================
341 // function: SplitsFace
343 //=======================================================================
344 Standard_Integer NMTTools_PaveFiller::SplitsFace(const Standard_Integer nF,
345 BOPTools_ListOfPaveBlock& aLPB)
349 BOPTools_ListIteratorOfListOfPaveBlock anIt;
351 aT=myDS->GetShapeType(nF);
353 if (aT!=TopAbs_FACE) {
354 return 1; // Type mismatch
357 BooleanOperations_ShapesDataStructure *pDS=myDS;
358 BooleanOperations_OnceExplorer aExp(*pDS);
360 aExp.Init(nF, TopAbs_EDGE);
361 for (; aExp.More(); aExp.Next()) {
363 const BOPTools_ListOfPaveBlock& aLPBE=mySplitShapesPool(myDS->RefEdge(nE));
364 anIt.Initialize(aLPBE);
365 for (; anIt.More(); anIt.Next()) {
366 const BOPTools_PaveBlock& aPBE=anIt.Value();
373 //=======================================================================
374 // function: SplitsInFace
375 // purpose: splits of edges from nF1 in nF2
376 //=======================================================================
377 Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer ,//for overriding
378 const Standard_Integer nF1,
379 const Standard_Integer nF2,
380 BOPTools_ListOfPaveBlock& aLPB)
382 Standard_Integer nE1;
383 TopAbs_ShapeEnum aT1, aT2;
385 aT1=myDS->GetShapeType(nF1);
386 aT2=myDS->GetShapeType(nF2);
388 if (aT1!=TopAbs_FACE || aT2!=TopAbs_FACE) {
389 return 1; // Type mismatch
391 BooleanOperations_ShapesDataStructure *pDS=myDS;
392 BooleanOperations_OnceExplorer aExp(*pDS);
393 aExp.Init(nF1, TopAbs_EDGE);
394 for (; aExp.More(); aExp.Next()) {
396 SplitsInFace (nE1, nF2, aLPB);
400 //=======================================================================
401 // function: SplitsInFace
402 // purpose: splits of edge nE1 in aFace2
403 //=======================================================================
404 Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer nE1,
405 const Standard_Integer nF2,
406 BOPTools_ListOfPaveBlock& aLPB)
408 Standard_Integer nF1;
409 TopAbs_ShapeEnum aT1, aT2;
411 aT1=myDS->GetShapeType(nE1);
412 aT2=myDS->GetShapeType(nF2);
414 if (aT1!=TopAbs_EDGE || aT2!=TopAbs_FACE) {
415 return 1; // Type mismatch
418 TColStd_ListIteratorOfListOfInteger anItLFCB;
419 NMTTools_ListIteratorOfListOfCommonBlock anItCB;
421 const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nE1));
423 anItCB.Initialize(aLCB);
424 for (; anItCB.More(); anItCB.Next()) {
425 NMTTools_CommonBlock& aCB=anItCB.Value();
426 const BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1);
428 const TColStd_ListOfInteger& aLFCB=aCB.Faces();
429 anItLFCB.Initialize(aLFCB);
430 for (; anItLFCB.More(); anItLFCB.Next()) {
431 nF1=anItLFCB.Value();
439 //=======================================================================
440 // function: SplitsOnEdge
441 // purpose: splits of edge nE1 on nE2
442 //=======================================================================
443 Standard_Integer NMTTools_PaveFiller::SplitsOnEdge(const Standard_Integer nE1,
444 const Standard_Integer nE2,
445 BOPTools_ListOfPaveBlock& aLPB)
448 TopAbs_ShapeEnum aT1, aT2;
450 aT1=myDS->GetShapeType(nE1);
451 aT2=myDS->GetShapeType(nE2);
453 if (aT1!=TopAbs_EDGE || aT2!=TopAbs_EDGE) {
454 return 1; // Type mismatch
457 BOPTools_ListIteratorOfListOfPaveBlock anIt;
458 NMTTools_ListIteratorOfListOfCommonBlock anItCB;
460 const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nE1));
462 anItCB.Initialize(aLCB);
463 for (; anItCB.More(); anItCB.Next()) {
464 NMTTools_CommonBlock& aCB=anItCB.Value();
465 const BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1);//XXX
467 const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks();
468 anIt.Initialize(aLPBx);
469 for (; anIt.More(); anIt.Next()) {
470 const BOPTools_PaveBlock& aPB2=anIt.Value();
471 nE=aPB2.OriginalEdge();
479 //=======================================================================
480 // function: SplitsOnFace
481 // purpose: splits of edge nE1 on face nF2
482 //=======================================================================
483 Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer nE1,
484 const Standard_Integer nF2,
485 BOPTools_ListOfPaveBlock& aLPB)
487 Standard_Integer nE2, ip;
488 TopAbs_ShapeEnum aT1, aT2;
490 aT1=myDS->GetShapeType(nE1);
491 aT2=myDS->GetShapeType(nF2);
493 if (aT1!=TopAbs_EDGE || aT2!=TopAbs_FACE) {
494 return 1; // Type mismatch
496 BooleanOperations_ShapesDataStructure *pDS=myDS;
497 BooleanOperations_OnceExplorer aExp(*pDS);
498 aExp.Init(nF2, TopAbs_EDGE);
499 for (; aExp.More(); aExp.Next()) {
501 ip=SplitsOnEdge(nE1, nE2, aLPB);
508 //=======================================================================
509 // function: SplitsOnFace
510 // purpose: splits of edges from face nF1 on face nF2
511 //=======================================================================
512 Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer ,//for overriding
513 const Standard_Integer nF1,
514 const Standard_Integer nF2,
515 BOPTools_ListOfPaveBlock& aLPB)
517 Standard_Integer nE1, ip;
518 TopAbs_ShapeEnum aT1, aT2;
520 aT1=myDS->GetShapeType(nF1);
521 aT2=myDS->GetShapeType(nF2);
523 if (aT1!=TopAbs_FACE || aT2!=TopAbs_FACE) {
524 return 1; // Type mismatch
526 BooleanOperations_ShapesDataStructure *pDS=myDS;
527 BooleanOperations_OnceExplorer aExp(*myDS);
528 aExp.Init(nF1, TopAbs_EDGE);
529 for (; aExp.More(); aExp.Next()) {
531 ip=SplitsOnFace(nE1, nF2, aLPB);
539 // 3 Simple Splits indices
540 //=======================================================================
541 // function: SplitsFace
543 //=======================================================================
544 Standard_Integer NMTTools_PaveFiller::SplitsFace(const Standard_Integer nF,
545 TColStd_ListOfInteger& aSplits)
547 Standard_Integer nE, iErr;
548 BOPTools_ListIteratorOfListOfPaveBlock aIt;
549 BOPTools_ListOfPaveBlock aLPB;
551 iErr=SplitsFace(nF, aLPB);
556 aIt.Initialize(aLPB);
557 for (; aIt.More(); aIt.Next()) {
558 const BOPTools_PaveBlock& aPB=aIt.Value();
565 //=======================================================================
566 // function: SplitsInFace
567 // purpose: splits of edges from nF1 in nF2
568 //=======================================================================
569 Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer ,//for overriding
570 const Standard_Integer nF1,
571 const Standard_Integer nF2,
572 TColStd_ListOfInteger& aSplits)
574 Standard_Integer nE, iErr;
575 BOPTools_ListIteratorOfListOfPaveBlock aIt;
576 BOPTools_ListOfPaveBlock aLPB;
578 iErr=SplitsInFace(0, nF1, nF2, aLPB);
582 aIt.Initialize(aLPB);
583 for (; aIt.More(); aIt.Next()) {
584 const BOPTools_PaveBlock& aPB=aIt.Value();
590 //=======================================================================
591 // function: SplitsInFace
592 // purpose: splits of edge nE1 in aFace2
593 //=======================================================================
594 Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer nE1,
595 const Standard_Integer nF2,
596 TColStd_ListOfInteger& aSplits)
598 Standard_Integer nE, iErr;
599 BOPTools_ListIteratorOfListOfPaveBlock aIt;
600 BOPTools_ListOfPaveBlock aLPB;
602 iErr=SplitsInFace(nE1, nF2, aLPB);
606 aIt.Initialize(aLPB);
607 for (; aIt.More(); aIt.Next()) {
608 const BOPTools_PaveBlock& aPB=aIt.Value();
614 //=======================================================================
615 // function: SplitsOnEdge
616 // purpose: splits of edge nE1 on nE2
617 //=======================================================================
618 Standard_Integer NMTTools_PaveFiller::SplitsOnEdge(const Standard_Integer nE1,
619 const Standard_Integer nE2,
620 TColStd_ListOfInteger& aSplits)
622 Standard_Integer nE, iErr;
623 BOPTools_ListIteratorOfListOfPaveBlock aIt;
624 BOPTools_ListOfPaveBlock aLPB;
626 iErr=SplitsOnEdge(nE1, nE2, aLPB);
630 aIt.Initialize(aLPB);
631 for (; aIt.More(); aIt.Next()) {
632 const BOPTools_PaveBlock& aPB=aIt.Value();
638 //=======================================================================
639 // function: SplitsOnFace
640 // purpose: splits of edge nE1 on face nF2
641 //=======================================================================
642 Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer nE1,
643 const Standard_Integer nF2,
644 TColStd_ListOfInteger& aSplits)
646 Standard_Integer nE, iErr;
647 BOPTools_ListIteratorOfListOfPaveBlock aIt;
648 BOPTools_ListOfPaveBlock aLPB;
650 iErr=SplitsOnEdge(nE1, nF2, aLPB);
654 aIt.Initialize(aLPB);
655 for (; aIt.More(); aIt.Next()) {
656 const BOPTools_PaveBlock& aPB=aIt.Value();
662 //=======================================================================
663 // function: SplitsOnFace
664 // purpose: splits of edges from face nF1 on face nF2
665 //=======================================================================
666 Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer ,//for overriding
667 const Standard_Integer nF1,
668 const Standard_Integer nF2,
669 TColStd_ListOfInteger& aSplits)
671 Standard_Integer nE, iErr;
672 BOPTools_ListIteratorOfListOfPaveBlock aIt;
673 BOPTools_ListOfPaveBlock aLPB;
675 iErr=SplitsOnFace(0, nF1, nF2, aLPB);
680 aIt.Initialize(aLPB);
681 for (; aIt.More(); aIt.Next()) {
682 const BOPTools_PaveBlock& aPB=aIt.Value();