1 // Created on: 1993-11-10
2 // Created by: Jean Yves LEBEY
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <TopOpeBRep_LineInter.hxx>
18
19 #include <Adaptor2d_Curve2d.hxx>
20 #include <BRepAdaptor_Curve2d.hxx>
21 #include <BRepAdaptor_Surface.hxx>
22 #include <Geom_Circle.hxx>
23 #include <Geom_Curve.hxx>
24 #include <Geom_Ellipse.hxx>
25 #include <Geom_Hyperbola.hxx>
26 #include <Geom_Line.hxx>
27 #include <Geom_Parabola.hxx>
28 #include <Geom_TrimmedCurve.hxx>
29 #include <GeomAbs_SurfaceType.hxx>
30 #include <gp_Pnt.hxx>
31 #include <IntPatch_ALine.hxx>
32 #include <IntPatch_ALineToWLine.hxx>
33 #include <IntPatch_GLine.hxx>
34 #include <IntPatch_IType.hxx>
35 #include <IntPatch_Line.hxx>
36 #include <IntPatch_RLine.hxx>
37 #include <IntPatch_SequenceOfLine.hxx>
38 #include <IntPatch_WLine.hxx>
39 #include <IntSurf_Quadric.hxx>
40 #include <Standard_NotImplemented.hxx>
41 #include <Standard_ProgramError.hxx>
42 #include <TCollection_AsciiString.hxx>
43 #include <TopAbs.hxx>
44 #include <TopoDS_Face.hxx>
45 #include <TopoDS_Shape.hxx>
46 #include <TopOpeBRep.hxx>
47 #include <TopOpeBRep_Bipoint.hxx>
48 #include <TopOpeBRep_FFTransitionTool.hxx>
49 #include <TopOpeBRep_VPointInter.hxx>
50 #include <TopOpeBRep_VPointInterIterator.hxx>
51 #include <TopOpeBRep_WPointInter.hxx>
52 #include <TopOpeBRepDS_Transition.hxx>
53
54 #include <BRepAdaptor_Surface.hxx>
55
56 #ifdef OCCT_DEBUG
57 extern Standard_Boolean TopOpeBRep_GetcontextALWLNBP(Standard_Integer&);
58 extern Standard_Boolean TopOpeBRep_GettraceCONIC();
59 #endif
60
61 //-----------------------------------------------------------------------
FUN_ALINETOWLINE(const Handle (IntPatch_ALine)& AL,const Handle (BRepAdaptor_Surface)surf1,const Handle (BRepAdaptor_Surface)surf2,IntPatch_SequenceOfLine & theLines)62 static void FUN_ALINETOWLINE (const Handle(IntPatch_ALine)& AL,
63 const Handle(BRepAdaptor_Surface) surf1,
64 const Handle(BRepAdaptor_Surface) surf2,
65 IntPatch_SequenceOfLine& theLines)
66 {
67 Standard_Integer nbpointsmax = 200;
68 #ifdef OCCT_DEBUG
69 Standard_Integer newnbp;
70 if (TopOpeBRep_GetcontextALWLNBP(newnbp)) nbpointsmax = newnbp;
71 #endif
72 IntPatch_ALineToWLine
73 AToL(surf1,surf2,nbpointsmax);
74
75 AToL.MakeWLine(AL, theLines);
76 }
77
78 //=======================================================================
79 //function : SetLine
80 //purpose :
81 //=======================================================================
82
SetLine(const Handle (IntPatch_Line)& L,const BRepAdaptor_Surface & S1,const BRepAdaptor_Surface & S2)83 void TopOpeBRep_LineInter::SetLine(const Handle(IntPatch_Line)& L,
84 const BRepAdaptor_Surface& S1,
85 const BRepAdaptor_Surface& S2)
86 {
87 // load line according to its type
88 myIL = L;
89 IntPatch_IType type = L->ArcType();
90 switch (type) {
91 case IntPatch_Analytic : myTypeLineCurve = TopOpeBRep_ANALYTIC; break;
92 case IntPatch_Restriction : myTypeLineCurve = TopOpeBRep_RESTRICTION; break;
93 case IntPatch_Walking : myTypeLineCurve = TopOpeBRep_WALKING; break;
94 case IntPatch_Lin : myTypeLineCurve = TopOpeBRep_LINE; break;
95 case IntPatch_Circle : myTypeLineCurve = TopOpeBRep_CIRCLE; break;
96 case IntPatch_Ellipse : myTypeLineCurve = TopOpeBRep_ELLIPSE; break;
97 case IntPatch_Parabola : myTypeLineCurve = TopOpeBRep_PARABOLA; break;
98 case IntPatch_Hyperbola : myTypeLineCurve = TopOpeBRep_HYPERBOLA; break;
99 default :
100 myTypeLineCurve = TopOpeBRep_OTHERTYPE;
101 SetOK(Standard_False);
102 break;
103 }
104
105 switch (type) {
106 case IntPatch_Analytic :
107 myILA = Handle(IntPatch_ALine)::DownCast (L); break;
108 case IntPatch_Restriction :
109 myILR = Handle(IntPatch_RLine)::DownCast (L); break;
110 case IntPatch_Walking :
111 myILW = Handle(IntPatch_WLine)::DownCast (L); break;
112 default : //"geometric" line
113 myILG = Handle(IntPatch_GLine)::DownCast (L); break;
114 }
115
116 // transform an analytic line to a walking line
117 if (myTypeLineCurve == TopOpeBRep_ANALYTIC) {
118 IntPatch_SequenceOfLine aSLin;
119 FUN_ALINETOWLINE(myILA,new BRepAdaptor_Surface(S1),
120 new BRepAdaptor_Surface(S2), aSLin);
121
122 if(aSLin.Length() > 0)
123 myILW = Handle(IntPatch_WLine)::DownCast(aSLin.Value(1));
124
125 myTypeLineCurve = TopOpeBRep_WALKING;
126 }
127
128 // number of points found on restriction(s)
129 Standard_Integer n = 0;
130 switch (myTypeLineCurve) {
131 case TopOpeBRep_ANALYTIC : n = myILA->NbVertex(); break;
132 case TopOpeBRep_RESTRICTION : n = myILR->NbVertex(); break;
133 case TopOpeBRep_WALKING : n = myILW->NbVertex(); break;
134 case TopOpeBRep_LINE : n = myILG->NbVertex(); break;
135 case TopOpeBRep_CIRCLE : n = myILG->NbVertex(); break;
136 case TopOpeBRep_ELLIPSE : n = myILG->NbVertex(); break;
137 case TopOpeBRep_PARABOLA : n = myILG->NbVertex(); break;
138 case TopOpeBRep_HYPERBOLA : n = myILG->NbVertex(); break;
139 default :
140 SetOK(Standard_False);
141 break;
142 }
143 myNbVPoint = n;
144
145 // prepare VPoints from intersection points
146 myHAVP = new TopOpeBRep_HArray1OfVPointInter(0,n);
147 for (Standard_Integer i=1;i<=n;i++) {
148 TopOpeBRep_VPointInter& VP = myHAVP->ChangeValue(i);
149 switch (myTypeLineCurve) {
150 case TopOpeBRep_ANALYTIC : VP.SetPoint(myILA->Vertex(i)); break;
151 case TopOpeBRep_RESTRICTION : VP.SetPoint(myILR->Vertex(i)); break;
152 case TopOpeBRep_WALKING : VP.SetPoint(myILW->Vertex(i)); break;
153 default : VP.SetPoint(myILG->Vertex(i)); break;
154 }
155 VP.Index(i);
156 }
157 }
158
159 //=======================================================================
160 //function : VPoint
161 //purpose :
162 //=======================================================================
163
VPoint(const Standard_Integer I) const164 const TopOpeBRep_VPointInter& TopOpeBRep_LineInter::VPoint(const Standard_Integer I) const
165 {
166 return myHAVP->Value(I);
167 }
168
169 //=======================================================================
170 //function : ChangeVPoint
171 //purpose :
172 //=======================================================================
173
ChangeVPoint(const Standard_Integer I)174 TopOpeBRep_VPointInter& TopOpeBRep_LineInter::ChangeVPoint(const Standard_Integer I)
175 {
176 return myHAVP->ChangeValue(I);
177 }
178
179 //=======================================================================
180 //function : SetINL
181 //purpose :
182 //=======================================================================
183
SetINL()184 void TopOpeBRep_LineInter::SetINL()
185 {
186 TopOpeBRep_VPointInterIterator VPI(*this);
187 if (!VPI.More()) {
188 myINL = Standard_False;
189 return;
190 }
191 const Standard_Real p0 = VPI.CurrentVP().ParameterOnLine();
192 VPI.Next();
193 if (!VPI.More()) {
194 myINL = Standard_True;
195 return;
196 }
197 for (; VPI.More(); VPI.Next() ) {
198 const Standard_Real p = VPI.CurrentVP().ParameterOnLine();
199 if ( p != p0 ) {
200 myINL = Standard_False;
201 return;
202 }
203 }
204 myINL = Standard_True;
205 }
206
207 //=======================================================================
208 //function : SetIsVClosed
209 //purpose :
210 //=======================================================================
211
SetIsVClosed()212 void TopOpeBRep_LineInter::SetIsVClosed()
213 {
214 if (myINL) {
215 myIsVClosed = Standard_False;
216 return;
217 }
218
219 /*Standard_Boolean newV = Standard_True;
220 if (!newV) {
221 if (myTypeLineCurve != TopOpeBRep_WALKING) {
222 myIsVClosed = Standard_False;
223 return;
224 }
225 }*/
226
227 TopOpeBRep_VPointInterIterator VPI(*this);
228 Standard_Integer nV = myNbVPoint;
229 Standard_Real pmin = RealLast(),pmax = RealFirst();
230 Standard_Integer imin=0, imax = 0; // index of IsOnArc VPoints
231 if (nV >= 2) {
232 for (; VPI.More(); VPI.Next() ) {
233 const TopOpeBRep_VPointInter& P = VPI.CurrentVP();
234 if ( ! P.IsInternal() ) {
235 const Standard_Integer i = VPI.CurrentVPIndex();
236 const Standard_Real p = P.ParameterOnLine();
237 if ( p < pmin ) { imin = i; pmin = p; }
238 if ( p > pmax ) { imax = i; pmax = p; }
239 }
240 }
241 if ( imax == 0 ) { // no VPoint on restriction found
242 myIsVClosed = Standard_True;
243 return;
244 }
245
246 const TopOpeBRep_VPointInter& P1 = VPoint(imin);
247 const TopOpeBRep_VPointInter& P2 = VPoint(imax);
248
249 const gp_Pnt& pp1 = P1.Value();
250 const gp_Pnt& pp2 = P2.Value();
251
252 const Standard_Real tol1 = P1.Tolerance();
253 const Standard_Real tol2 = P2.Tolerance();
254 const Standard_Real tol = Max(tol1,tol2);
255
256 myIsVClosed = pp1.IsEqual(pp2,tol);
257 }
258 else {
259 SetOK(Standard_False);
260 myIsVClosed = Standard_False;
261 }
262 }
263
264 //=======================================================================
265 //function : SetHasVPonR
266 //purpose :
267 //=======================================================================
268
SetHasVPonR()269 void TopOpeBRep_LineInter::SetHasVPonR()
270 {
271 myHasVPonR = Standard_False;
272 TopOpeBRep_VPointInterIterator VPI(*this);
273 for (; VPI.More(); VPI.Next()) {
274 const TopOpeBRep_VPointInter& P = VPI.CurrentVP();
275 if (P.IsOnDomS1() || P.IsOnDomS2()) {
276 myHasVPonR = Standard_True;
277 break;
278 }
279 }
280 }
281
282 //=======================================================================
283 //function : SetVPBounds
284 //purpose :
285 //=======================================================================
286
SetVPBounds()287 void TopOpeBRep_LineInter::SetVPBounds()
288 {
289 myVPF = myVPL = myVPN = 0;
290 myVPBDefined = Standard_True;
291
292 TopOpeBRep_VPointInterIterator VPI(*this);
293 Standard_Integer f = myNbVPoint + 1, l = 0, n = 0;
294
295 for (; VPI.More(); VPI.Next()) {
296 if (VPI.CurrentVP().Keep()) {
297 n++;
298 const Standard_Integer i = VPI.CurrentVPIndex();
299 if ( i < f ) f = i;
300 if ( i > l ) l = i;
301 }
302 }
303
304 myVPF = f; myVPL = l; myVPN = n;
305 }
306
307 //=======================================================================
308 //function : VPBounds
309 //purpose :
310 //=======================================================================
311
VPBounds(Standard_Integer & f,Standard_Integer & l,Standard_Integer & n) const312 void TopOpeBRep_LineInter::VPBounds
313 (Standard_Integer& f, Standard_Integer& l, Standard_Integer& n) const
314 {
315 if ( !myVPBDefined ) {
316 TopOpeBRep_LineInter* p = (TopOpeBRep_LineInter*)this; // NYI deconst
317 p->SetOK(Standard_False);
318 f = l = n = 0;
319 return;
320 }
321 f = myVPF;
322 l = myVPL;
323 n = myVPN;
324 }
325
326 //=======================================================================
327 //function : IsPeriodic
328 //purpose :
329 //=======================================================================
330
IsPeriodic() const331 Standard_Boolean TopOpeBRep_LineInter::IsPeriodic() const
332 {
333 switch (myTypeLineCurve)
334 {
335 case TopOpeBRep_CIRCLE :
336 case TopOpeBRep_ELLIPSE : return Standard_True;
337 default:
338 break;
339 }
340 return Standard_False;
341 }
342
343 //=======================================================================
344 //function : Period
345 //purpose :
346 //=======================================================================
Period() const347 Standard_Real TopOpeBRep_LineInter::Period() const
348 {
349 Standard_Real aFirst = 0.0, aLast = 0.0;
350 Bounds (aFirst, aLast);
351 return (aLast - aFirst);
352 }
353
354 //=======================================================================
355 //function : Bounds
356 //purpose :
357 //=======================================================================
Bounds(Standard_Real & theFirst,Standard_Real & theLast) const358 void TopOpeBRep_LineInter::Bounds (Standard_Real& theFirst, Standard_Real& theLast) const
359 {
360 theFirst = 0.0; theLast = 0.0;
361 if (myILG.IsNull())
362 {
363 TopOpeBRep_LineInter* aPtr = const_cast<TopOpeBRep_LineInter*>(this); // NYI deconst
364 aPtr->SetOK (Standard_False);
365 return;
366 }
367
368 if (IsPeriodic())
369 {
370 theLast = Curve()->Period();
371 }
372
373 if (myILG->HasFirstPoint())
374 {
375 theFirst = myILG->FirstPoint().ParameterOnLine();
376 }
377
378 if (myILG->HasLastPoint())
379 {
380 theLast = myILG->LastPoint().ParameterOnLine();
381 }
382 }
383
384 //=======================================================================
385 //function : HasVInternal
386 //purpose :
387 //=======================================================================
388
HasVInternal()389 Standard_Boolean TopOpeBRep_LineInter::HasVInternal()
390 {
391 TopOpeBRep_VPointInterIterator VPI(*this);
392 for (; VPI.More(); VPI.Next()) {
393 if (VPI.CurrentVP().IsInternal()) return Standard_True;
394 }
395 return Standard_False;
396 }
397
398
399 //=======================================================================
400 //function : NbWPoint
401 //purpose :
402 //=======================================================================
403
NbWPoint() const404 Standard_Integer TopOpeBRep_LineInter::NbWPoint() const
405 {
406 switch (myTypeLineCurve)
407 {
408 case TopOpeBRep_WALKING : return myILW->NbPnts();
409 default:
410 break;
411 }
412 return 0;
413 }
414
415
416 //=======================================================================
417 //function : WPoint
418 //purpose :
419 //=======================================================================
420
WPoint(const Standard_Integer IW)421 const TopOpeBRep_WPointInter& TopOpeBRep_LineInter::WPoint(const Standard_Integer IW)
422 {
423 switch (myTypeLineCurve)
424 {
425 case TopOpeBRep_RESTRICTION : myCurrentWP.Set(myILR->Point(IW)); break;
426 case TopOpeBRep_WALKING : myCurrentWP.Set(myILW->Point(IW)); break;
427 default : break;
428 }
429 return myCurrentWP;
430 }
431
432 //=======================================================================
433 //function : Curve
434 //purpose :
435 //=======================================================================
436
Handle(Geom_Curve)437 Handle(Geom_Curve) TopOpeBRep_LineInter::Curve() const
438 {
439 // Build the 3d curve
440 Handle(Geom_Curve) C3D;
441 switch (myTypeLineCurve) {
442 case TopOpeBRep_LINE :
443 C3D = new Geom_Line(myILG->Line()); break;
444 case TopOpeBRep_CIRCLE :
445 C3D = new Geom_Circle(myILG->Circle()); break;
446 case TopOpeBRep_ELLIPSE :
447 C3D = new Geom_Ellipse(myILG->Ellipse()); break;
448 case TopOpeBRep_PARABOLA :
449 C3D = new Geom_Parabola(myILG->Parabola()); break;
450 case TopOpeBRep_HYPERBOLA :
451 C3D = new Geom_Hyperbola(myILG->Hyperbola()); break;
452 default :
453 TopOpeBRep_LineInter* p = (TopOpeBRep_LineInter*)this; // NYI deconst
454 p->SetOK(Standard_False);
455 break;
456 }
457 return C3D;
458 }
459
460 //=======================================================================
461 //function : Curve
462 //purpose :
463 //=======================================================================
464
Handle(Geom_Curve)465 Handle(Geom_Curve) TopOpeBRep_LineInter::Curve
466 (const Standard_Real parmin, const Standard_Real parmax) const
467 {
468 // Build the trimmed 3d curve
469 Handle(Geom_Curve) C3D = Curve();
470 Handle(Geom_TrimmedCurve) TC3D = new Geom_TrimmedCurve(C3D,parmin,parmax);
471 #ifdef OCCT_DEBUG
472 if ( TopOpeBRep_GettraceCONIC() ) {
473 std::cout<<"TopOpeBRep_LineInter::Curve on a ";
474 TopOpeBRep::Print(myTypeLineCurve,std::cout);std::cout<<std::endl;
475 std::cout<<" ... Trimmed from "<<parmin<<" to "<<parmax<<std::endl;
476 }
477 #endif
478 return TC3D;
479 }
480
481 //=======================================================================
482 //function : Arc
483 //purpose :
484 //=======================================================================
485
Arc() const486 const TopoDS_Shape& TopOpeBRep_LineInter::Arc() const
487 {
488 if (myTypeLineCurve == TopOpeBRep_RESTRICTION) {
489 if(myILR->IsArcOnS1()) {
490 const Handle(Adaptor2d_Curve2d)& AHC2D = myILR->ArcOnS1();
491 const BRepAdaptor_Curve2d& BC2DP = *((BRepAdaptor_Curve2d*)AHC2D.get());
492 const TopoDS_Shape& S = BC2DP.Edge();
493 return S;
494 }
495 else {
496 const Handle(Adaptor2d_Curve2d)& AHC2D = myILR->ArcOnS2();
497 const BRepAdaptor_Curve2d& BC2DP = *((BRepAdaptor_Curve2d*)AHC2D.get());
498 const TopoDS_Shape& S = BC2DP.Edge();
499 return S;
500 }
501 }
502 else
503 return myNullShape;
504 }
505
506 //=======================================================================
507 //function : ArcIsEdge
508 //purpose :
509 //=======================================================================
510
ArcIsEdge(const Standard_Integer Index) const511 Standard_Boolean TopOpeBRep_LineInter::ArcIsEdge(const Standard_Integer Index) const
512 {
513 if (myTypeLineCurve == TopOpeBRep_RESTRICTION) {
514 const Standard_Boolean r = myILR->IsArcOnS1();
515 return ( Index == 2 ? !r : r );
516 }
517 return Standard_False;
518 }
519
520 //=======================================================================
521 //function : HasFirstPoint
522 //purpose :
523 //=======================================================================
524
HasFirstPoint() const525 Standard_Boolean TopOpeBRep_LineInter::HasFirstPoint() const
526 {
527 if (myILG.IsNull())
528 throw Standard_ProgramError("TopOpeBRep_LineInter::HasFirstPoint sur line != GLine");
529 return myILG->HasFirstPoint();
530 }
531
532 //=======================================================================
533 //function : HasLastPoint
534 //purpose :
535 //=======================================================================
536
HasLastPoint() const537 Standard_Boolean TopOpeBRep_LineInter::HasLastPoint() const
538 {
539 if (myILG.IsNull())
540 throw Standard_ProgramError("TopOpeBRep_LineInter::HasLastPoint sur line != GLine");
541 return myILG->HasLastPoint();
542 }
543
544 //=======================================================================
545 //function : ComputeFaceFaceTransition
546 //purpose :
547 //=======================================================================
548
ComputeFaceFaceTransition()549 void TopOpeBRep_LineInter::ComputeFaceFaceTransition()
550 {
551 TopAbs_Orientation F1ori = myF1.Orientation();
552 TopAbs_Orientation F2ori = myF2.Orientation();
553 myLineTonF1=TopOpeBRep_FFTransitionTool::ProcessFaceTransition(*this,1,F2ori);
554 myLineTonF2=TopOpeBRep_FFTransitionTool::ProcessFaceTransition(*this,2,F1ori);
555 }
556
557 //=======================================================================
558 //function : FaceFaceTransition
559 //purpose :
560 //=======================================================================
FaceFaceTransition(const Standard_Integer I) const561 const TopOpeBRepDS_Transition& TopOpeBRep_LineInter::FaceFaceTransition
562 (const Standard_Integer I) const
563 {
564 if (I == 1) return myLineTonF1;
565 if (I == 2) return myLineTonF2;
566 throw Standard_ProgramError("TopOpeBRep_LineInter::FaceFaceTransition");
567 }
568
569 //=======================================================================
570 //function : DumpType
571 //purpose :
572 //=======================================================================
573
DumpType() const574 void TopOpeBRep_LineInter::DumpType()const
575 {
576 #ifdef OCCT_DEBUG
577 TopOpeBRep::Print(myTypeLineCurve,std::cout);
578 #endif
579 }
580
581 //=======================================================================
582 //function : DumpVPoint
583 //purpose :
584 //=======================================================================
585
DumpVPoint(const Standard_Integer,const TCollection_AsciiString &,const TCollection_AsciiString &) const586 void TopOpeBRep_LineInter::DumpVPoint
587 #ifndef OCCT_DEBUG
588 (const Standard_Integer ,
589 const TCollection_AsciiString& ,
590 const TCollection_AsciiString& ) const
591 {
592 #else
593 (const Standard_Integer I,
594 const TCollection_AsciiString& s1,
595 const TCollection_AsciiString& s2) const
596 {
597 const TopOpeBRep_VPointInter& VP = VPoint(I);
598 const gp_Pnt& P = VP.Value();
599 std::cout<<s1;
600 std::cout<<"L"<<Index()<<"P"<<VP.Index();
601 if (VP.Keep()) std::cout<<"K";
602 std::cout<<" "<<P.X()<<" "<<P.Y()<<" "<<P.Z();
603 std::cout<<s2;
604 #endif
605 }
606
607 //=======================================================================
608 //function : DumpBipoint
609 //purpose :
610 //=======================================================================
611
612 void TopOpeBRep_LineInter::DumpBipoint
613 #ifndef OCCT_DEBUG
614 (const TopOpeBRep_Bipoint& ,
615 const TCollection_AsciiString& ,
616 const TCollection_AsciiString& ) const
617 {
618 #else
619 (const TopOpeBRep_Bipoint& bip,
620 const TCollection_AsciiString& s1,
621 const TCollection_AsciiString& s2) const
622 {
623 Standard_Integer i1 = bip.I1();
624 Standard_Integer i2 = bip.I2();
625 std::cout<<s1;
626 std::cout<<"("<<i1<<","<<i2<<")";
627 std::cout<<s2;
628 #endif
629 }
630
631 //=======================================================================
632 //function : SetOK
633 //purpose :
634 //=======================================================================
635
636 void TopOpeBRep_LineInter::SetOK(const Standard_Boolean B)
637 {
638 myOK = B;
639 }
640
641 //=======================================================================
642 //function : SetTraceIndex
643 //purpose :
644 //=======================================================================
645
646 void TopOpeBRep_LineInter::SetTraceIndex(const Standard_Integer exF1,
647 const Standard_Integer exF2)
648 {
649 myexF1 = exF1;
650 myexF2 = exF2;
651 }
652
653 //=======================================================================
654 //function : GetTraceIndex
655 //purpose :
656 //=======================================================================
657
658 void TopOpeBRep_LineInter::GetTraceIndex(Standard_Integer& exF1,
659 Standard_Integer& exF2)const
660 {
661 exF1 = myexF1;
662 exF2 = myexF2;
663 }
664
665 //=======================================================================
666 //function : DumpLineTransitions
667 //purpose :
668 //=======================================================================
669 Standard_OStream& TopOpeBRep_LineInter::DumpLineTransitions(Standard_OStream& OS) const
670 {
671 #ifdef OCCT_DEBUG
672 OS<<"transition from f1 / f2 "; TopAbs::Print(myF2.Orientation(),OS);
673 OS<<"transition from f2 / f1 "; TopAbs::Print(myF1.Orientation(),OS);
674 #endif
675 return OS;
676 }
677