1 // Created on: 1991-07-02
2 // Created by: Remi LEQUETTE
3 // Copyright (c) 1991-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <BRep_Builder.ixx>
19 #include <BRep_TEdge.hxx>
20 #include <BRep_Curve3D.hxx>
21 #include <BRep_GCurve.hxx>
22 #include <BRep_CurveOnClosedSurface.hxx>
23 #include <BRep_CurveOn2Surfaces.hxx>
24 #include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
26 #include <BRep_PointOnCurve.hxx>
27 #include <BRep_PointOnCurveOnSurface.hxx>
28 #include <BRep_PointOnSurface.hxx>
29 #include <BRep_ListIteratorOfListOfPointRepresentation.hxx>
32 #include <TopoDS_Iterator.hxx>
33 #include <TopoDS_LockedShape.hxx>
35 #include <Precision.hxx>
37 #include <BRep_Polygon3D.hxx>
38 #include <BRep_PolygonOnSurface.hxx>
39 #include <BRep_PolygonOnClosedSurface.hxx>
40 #include <BRep_PolygonOnTriangulation.hxx>
41 #include <BRep_PolygonOnClosedTriangulation.hxx>
43 #include <Standard_NullObject.hxx>
45 //=======================================================================
46 //function : Auxiliary methods
48 //=======================================================================
50 //=======================================================================
51 //function : UpdateCurves
52 //purpose : Insert a 3d curve <C> with location <L>
53 // in a list of curve representations <lcr>
54 //=======================================================================
56 static void UpdateCurves(BRep_ListOfCurveRepresentation& lcr,
57 const Handle(Geom_Curve)& C,
58 const TopLoc_Location& L)
60 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
61 Handle(BRep_GCurve) GC;
62 Standard_Real f = 0.,l = 0.;
65 GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
68 if (GC->IsCurve3D()) break;
75 itcr.Value()->Curve3D(C);
76 itcr.Value()->Location(L);
79 Handle(BRep_Curve3D) C3d = new BRep_Curve3D(C,L);
80 // test if there is already a range
89 //=======================================================================
90 //function : UpdateCurves
91 //purpose : Insert a pcurve <C> on surface <S> with location <L>
92 // in a list of curve representations <lcr>
93 // Remove the pcurve on <S> from <lcr> if <C> is null
94 //=======================================================================
96 static void UpdateCurves(BRep_ListOfCurveRepresentation& lcr,
97 const Handle(Geom2d_Curve)& C,
98 const Handle(Geom_Surface)& S,
99 const TopLoc_Location& L)
101 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
102 Handle(BRep_CurveRepresentation) cr;
103 Handle(BRep_GCurve) GC;
104 Standard_Real f = 0.,l = 0.;
105 Standard_Boolean rangeFound = Standard_False;
107 // search the range of the 3d curve
108 // and remove any existing representation
110 while (itcr.More()) {
111 GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
113 if (GC->IsCurve3D()) {
114 // if (!C.IsNull()) { //xpu031198, edge degeneree
116 // xpu151298 : parameters can be setted for null curves
117 // see lbo & flo, to determine whether range is defined
118 // compare first and last parameters with default values.
120 //lvt 15/6/99: On enleve la comparaison de reels infinis.
121 Standard_Boolean undefined = (Precision::IsPositiveInfinite(l) ||
122 Precision::IsNegativeInfinite(f));
125 rangeFound = Standard_True;
128 if (GC->IsCurveOnSurface(S,L)) {
129 // remove existing curve on surface
130 // cr is used to keep a reference on the curve representation
131 // this avoid deleting it as its content may be referenced by C or S
145 Handle(BRep_CurveOnSurface) COS = new BRep_CurveOnSurface(C,S,L);
146 // test if there is already a range
154 //=======================================================================
155 //function : UpdateCurves
156 //purpose : Insert a pcurve <C> on surface <S> with location <L>
157 // in a list of curve representations <lcr>
158 // Remove the pcurve on <S> from <lcr> if <C> is null
159 //=======================================================================
160 static void UpdateCurves(BRep_ListOfCurveRepresentation& lcr,
161 const Handle(Geom2d_Curve)& C,
162 const Handle(Geom_Surface)& S,
163 const TopLoc_Location& L,
167 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
168 Handle(BRep_CurveRepresentation) cr;
169 Handle(BRep_GCurve) GC;
170 Standard_Real f = 0.,l = 0.;
171 Standard_Boolean rangeFound = Standard_False;
173 // search the range of the 3d curve
174 // and remove any existing representation
176 while (itcr.More()) {
177 GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
179 if (GC->IsCurve3D()) {
180 // if (!C.IsNull()) { //xpu031198, edge degeneree
182 // xpu151298 : parameters can be setted for null curves
183 // see lbo & flo, to determine whether range is defined
184 // compare first and last parameters with default values.
186 //lvt 15/6/99: On enleve la comparaison de reels infinis.
187 Standard_Boolean undefined = (Precision::IsPositiveInfinite(l) ||
188 Precision::IsNegativeInfinite(f));
191 rangeFound = Standard_True;
194 if (GC->IsCurveOnSurface(S,L)) {
195 // remove existing curve on surface
196 // cr is used to keep a reference on the curve representation
197 // this avoid deleting it as its content may be referenced by C or S
211 Handle(BRep_CurveOnSurface) COS = new BRep_CurveOnSurface(C,S,L);
212 // test if there is already a range
216 COS->SetUVPoints(Pf,Pl);
221 //=======================================================================
222 //function : UpdateCurves
223 //purpose : Insert two pcurves <C1,C2> on surface <S> with location <L>
224 // in a list of curve representations <lcr>
225 // Remove the pcurves on <S> from <lcr> if <C1> or <C2> is null
226 //=======================================================================
228 static void UpdateCurves(BRep_ListOfCurveRepresentation& lcr,
229 const Handle(Geom2d_Curve)& C1,
230 const Handle(Geom2d_Curve)& C2,
231 const Handle(Geom_Surface)& S,
232 const TopLoc_Location& L)
234 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
235 Handle(BRep_CurveRepresentation) cr;
236 Handle(BRep_GCurve) GC;
237 Standard_Real f = 0.,l = 0.;
238 Standard_Boolean rangeFound = Standard_False;
240 while (itcr.More()) {
241 GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
242 if ( !GC.IsNull() ) {
243 if (GC->IsCurve3D()) {
245 Standard_Boolean undefined = (Precision::IsPositiveInfinite(l) ||
246 Precision::IsNegativeInfinite(f));
249 rangeFound = Standard_True;
252 Standard_Boolean iscos = GC->IsCurveOnSurface(S,L);
259 // cr is used to keep a reference on the curve representation
260 // this avoid deleting it as its content may be referenced by C or S
265 if ( !C1.IsNull() && !C2.IsNull() ) {
266 Handle(BRep_CurveOnClosedSurface) COS =
267 new BRep_CurveOnClosedSurface(C1,C2,S,L,GeomAbs_C0);
268 // test if there is already a range
276 //=======================================================================
277 //function : UpdateCurves
278 //purpose : Insert two pcurves <C1,C2> on surface <S> with location <L>
279 // in a list of curve representations <lcr>
280 // Remove the pcurves on <S> from <lcr> if <C1> or <C2> is null
281 //=======================================================================
282 static void UpdateCurves(BRep_ListOfCurveRepresentation& lcr,
283 const Handle(Geom2d_Curve)& C1,
284 const Handle(Geom2d_Curve)& C2,
285 const Handle(Geom_Surface)& S,
286 const TopLoc_Location& L,
290 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
291 Handle(BRep_CurveRepresentation) cr;
292 Handle(BRep_GCurve) GC;
293 Standard_Real f = 0.,l = 0.;
294 Standard_Boolean rangeFound = Standard_False;
296 while (itcr.More()) {
297 GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
298 if ( !GC.IsNull() ) {
299 if (GC->IsCurve3D()) {
301 Standard_Boolean undefined = (Precision::IsPositiveInfinite(l) ||
302 Precision::IsNegativeInfinite(f));
305 rangeFound = Standard_True;
308 Standard_Boolean iscos = GC->IsCurveOnSurface(S,L);
315 // cr is used to keep a reference on the curve representation
316 // this avoid deleting it as its content may be referenced by C or S
321 if ( !C1.IsNull() && !C2.IsNull() ) {
322 Handle(BRep_CurveOnClosedSurface) COS =
323 new BRep_CurveOnClosedSurface(C1,C2,S,L,GeomAbs_C0);
324 // test if there is already a range
328 COS->SetUVPoints2(Pf,Pl);
334 static void UpdateCurves(BRep_ListOfCurveRepresentation& lcr,
335 const Handle(Geom_Surface)& S1,
336 const Handle(Geom_Surface)& S2,
337 const TopLoc_Location& L1,
338 const TopLoc_Location& L2,
339 const GeomAbs_Shape C)
341 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
342 while (itcr.More()) {
343 const Handle(BRep_CurveRepresentation)& cr = itcr.Value();
344 Standard_Boolean isregu = cr->IsRegularity(S1,S2,L1,L2);
350 Handle(BRep_CurveRepresentation)& cr = itcr.Value();
354 Handle(BRep_CurveOn2Surfaces) COS = new BRep_CurveOn2Surfaces
360 static void UpdatePoints(BRep_ListOfPointRepresentation& lpr,
362 const Handle(Geom_Curve)& C,
363 const TopLoc_Location& L)
365 BRep_ListIteratorOfListOfPointRepresentation itpr(lpr);
366 while (itpr.More()) {
367 const Handle(BRep_PointRepresentation)& pr = itpr.Value();
368 Standard_Boolean isponc = pr->IsPointOnCurve(C,L);
374 Handle(BRep_PointRepresentation)& pr = itpr.Value();
378 Handle(BRep_PointOnCurve) POC = new BRep_PointOnCurve(p,C,L);
383 static void UpdatePoints(BRep_ListOfPointRepresentation& lpr,
385 const Handle(Geom2d_Curve)& PC,
386 const Handle(Geom_Surface)& S,
387 const TopLoc_Location& L)
389 BRep_ListIteratorOfListOfPointRepresentation itpr(lpr);
390 while (itpr.More()) {
391 const Handle(BRep_PointRepresentation)& pr = itpr.Value();
392 Standard_Boolean isponcons = pr->IsPointOnCurveOnSurface(PC,S,L);
393 if (isponcons) break;
398 Handle(BRep_PointRepresentation)& pr = itpr.Value();
402 Handle(BRep_PointOnCurveOnSurface) POCS =
403 new BRep_PointOnCurveOnSurface(p,PC,S,L);
409 static void UpdatePoints(BRep_ListOfPointRepresentation& lpr,
412 const Handle(Geom_Surface)& S,
413 const TopLoc_Location& L)
415 BRep_ListIteratorOfListOfPointRepresentation itpr(lpr);
416 while (itpr.More()) {
417 const Handle(BRep_PointRepresentation)& pr = itpr.Value();
418 Standard_Boolean ispons = pr->IsPointOnSurface(S,L);
424 Handle(BRep_PointRepresentation)& pr = itpr.Value();
426 // pr->Parameter(p2); // skv
427 pr->Parameter2(p2); // skv
430 Handle(BRep_PointOnSurface) POS = new BRep_PointOnSurface(p1,p2,S,L);
436 //=======================================================================
437 //function : MakeFace
439 //=======================================================================
441 void BRep_Builder::MakeFace(TopoDS_Face& F,
442 const Handle(Geom_Surface)& S,
443 const Standard_Real Tol) const
445 Handle(BRep_TFace) TF = new BRep_TFace();
446 if(!F.IsNull() && F.Locked())
448 TopoDS_LockedShape::Raise("BRep_Builder::MakeFace");
456 //=======================================================================
457 //function : MakeFace
459 //=======================================================================
461 void BRep_Builder::MakeFace(TopoDS_Face& F,
462 const Handle(Poly_Triangulation)& T) const
464 Handle(BRep_TFace) TF = new BRep_TFace();
465 if(!F.IsNull() && F.Locked())
467 TopoDS_LockedShape::Raise("BRep_Builder::MakeFace");
469 TF->Triangulation(T);
474 //=======================================================================
475 //function : MakeFace
477 //=======================================================================
479 void BRep_Builder::MakeFace(TopoDS_Face& F,
480 const Handle(Geom_Surface)& S,
481 const TopLoc_Location& L,
482 const Standard_Real Tol) const
484 Handle(BRep_TFace) TF = new BRep_TFace();
485 if(!F.IsNull() && F.Locked())
487 TopoDS_LockedShape::Raise("BRep_Builder::MakeFace");
496 //=======================================================================
497 //function : UpdateFace
499 //=======================================================================
501 void BRep_Builder::UpdateFace(const TopoDS_Face& F,
502 const Handle(Geom_Surface)& S,
503 const TopLoc_Location& L,
504 const Standard_Real Tol) const
506 const Handle(BRep_TFace)& TF = *((Handle(BRep_TFace)*) &F.TShape());
509 TopoDS_LockedShape::Raise("BRep_Builder::UpdateFace");
513 TF->Location(L.Predivided(F.Location()));
514 F.TShape()->Modified(Standard_True);
518 //=======================================================================
519 //function : UpdateFace
521 //=======================================================================
523 void BRep_Builder::UpdateFace(const TopoDS_Face& F,
524 const Handle(Poly_Triangulation)& T) const
526 const Handle(BRep_TFace)& TF = *((Handle(BRep_TFace)*) &F.TShape());
529 TopoDS_LockedShape::Raise("BRep_Builder::UpdateFace");
531 TF->Triangulation(T);
532 F.TShape()->Modified(Standard_True);
536 //=======================================================================
537 //function : UpdateFace
539 //=======================================================================
541 void BRep_Builder::UpdateFace(const TopoDS_Face& F,
542 const Standard_Real Tol) const
544 const Handle(BRep_TFace)& TF = *((Handle(BRep_TFace)*) &F.TShape());
547 TopoDS_LockedShape::Raise("BRep_Builder::UpdateFace");
550 F.TShape()->Modified(Standard_True);
554 //=======================================================================
555 //function : NaturalRestriction
557 //=======================================================================
559 void BRep_Builder::NaturalRestriction(const TopoDS_Face& F,
560 const Standard_Boolean N) const
562 const Handle(BRep_TFace)& TF = (*((Handle(BRep_TFace)*) &F.TShape()));
565 TopoDS_LockedShape::Raise("BRep_Builder::NaturalRestriction");
567 TF->NaturalRestriction(N);
568 F.TShape()->Modified(Standard_True);
572 //=======================================================================
573 //function : MakeEdge
574 //purpose : make undefined edge
575 //=======================================================================
577 void BRep_Builder::MakeEdge(TopoDS_Edge& E) const
579 Handle(BRep_TEdge) TE = new BRep_TEdge();
580 if(!E.IsNull() && E.Locked())
582 TopoDS_LockedShape::Raise("BRep_Builder::MakeEdge");
588 //=======================================================================
589 //function : UpdateEdge
591 //=======================================================================
593 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
594 const Handle(Geom_Curve)& C,
595 const TopLoc_Location& L,
596 const Standard_Real Tol) const
598 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
601 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
603 const TopLoc_Location l = L.Predivided(E.Location());
605 UpdateCurves(TE->ChangeCurves(),C,l);
607 TE->UpdateTolerance(Tol);
608 TE->Modified(Standard_True);
612 //=======================================================================
613 //function : UpdateEdge
615 //=======================================================================
617 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
618 const Handle(Geom2d_Curve)& C,
619 const Handle(Geom_Surface)& S,
620 const TopLoc_Location& L,
621 const Standard_Real Tol) const
623 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
626 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
628 const TopLoc_Location l = L.Predivided(E.Location());
630 UpdateCurves(TE->ChangeCurves(),C,S,l);
632 TE->UpdateTolerance(Tol);
633 TE->Modified(Standard_True);
637 //=======================================================================
638 //function : UpdateEdge
639 //purpose : for the second format (for XML Persistence)
640 //=======================================================================
642 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
643 const Handle(Geom2d_Curve)& C,
644 const Handle(Geom_Surface)& S,
645 const TopLoc_Location& L,
646 const Standard_Real Tol,
648 const gp_Pnt2d& Pl) const
650 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
653 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
655 const TopLoc_Location l = L.Predivided(E.Location());
657 UpdateCurves(TE->ChangeCurves(),C,S,l,Pf,Pl);
659 TE->UpdateTolerance(Tol);
660 TE->Modified(Standard_True);
664 //=======================================================================
665 //function : UpdateEdge
667 //=======================================================================
669 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
670 const Handle(Geom2d_Curve)& C1,
671 const Handle(Geom2d_Curve)& C2,
672 const Handle(Geom_Surface)& S,
673 const TopLoc_Location& L,
674 const Standard_Real Tol) const
676 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
679 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
681 const TopLoc_Location l = L.Predivided(E.Location());
683 UpdateCurves(TE->ChangeCurves(),C1,C2,S,l);
685 TE->UpdateTolerance(Tol);
686 TE->Modified(Standard_True);
690 //=======================================================================
691 //function : UpdateEdge
692 //purpose : for the second format (for XML Persistence)
693 //=======================================================================
695 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
696 const Handle(Geom2d_Curve)& C1,
697 const Handle(Geom2d_Curve)& C2,
698 const Handle(Geom_Surface)& S,
699 const TopLoc_Location& L,
700 const Standard_Real Tol,
702 const gp_Pnt2d& Pl) const
704 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
707 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
709 const TopLoc_Location l = L.Predivided(E.Location());
711 UpdateCurves(TE->ChangeCurves(),C1,C2,S,l,Pf,Pl);
713 TE->UpdateTolerance(Tol);
714 TE->Modified(Standard_True);
718 //=======================================================================
719 //function : UpdateEdge
721 //=======================================================================
723 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
724 const Handle(Poly_Polygon3D)& P,
725 const TopLoc_Location& L) const
727 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
730 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
732 BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
733 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
737 if (itcr.Value()->IsPolygon3D())
742 itcr.Value()->Polygon3D(P);
743 TE->Modified(Standard_True);
749 const TopLoc_Location l = L.Predivided(E.Location());
750 Handle(BRep_Polygon3D) P3d = new BRep_Polygon3D(P,l);
753 TE->Modified(Standard_True);
757 //=======================================================================
758 //function : UpdateEdge
760 //=======================================================================
762 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
763 const Handle(Poly_PolygonOnTriangulation)& P,
764 const Handle(Poly_Triangulation)& T,
765 const TopLoc_Location& L) const
767 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
770 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
772 const TopLoc_Location l = L.Predivided(E.Location());
774 Standard_Boolean isModified = Standard_False;
776 BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
777 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
778 Handle(BRep_CurveRepresentation) cr;
782 if (itcr.Value()->IsPolygonOnTriangulation(T,l))
784 // cr is used to keep a reference on the curve representation
785 // this avoid deleting it as its content may be referenced by T
788 isModified = Standard_True;
796 Handle(BRep_PolygonOnTriangulation) PT =
797 new BRep_PolygonOnTriangulation(P,T,l);
799 isModified = Standard_True;
803 TE->Modified(Standard_True);
807 //=======================================================================
808 //function : UpdateEdge
810 //=======================================================================
812 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
813 const Handle(Poly_PolygonOnTriangulation)& P1,
814 const Handle(Poly_PolygonOnTriangulation)& P2,
815 const Handle(Poly_Triangulation)& T,
816 const TopLoc_Location& L) const
818 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
821 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
823 const TopLoc_Location l = L.Predivided(E.Location());
825 Standard_Boolean isModified = Standard_False;
827 BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
828 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
829 Handle(BRep_CurveRepresentation) cr;
833 if (itcr.Value()->IsPolygonOnTriangulation(T,l)) //szv:was L
835 // cr is used to keep a reference on the curve representation
836 // this avoid deleting it as its content may be referenced by T
839 isModified = Standard_True;
845 if (!P1.IsNull() && !P2.IsNull())
847 Handle(BRep_PolygonOnClosedTriangulation) PT =
848 new BRep_PolygonOnClosedTriangulation(P1,P2,T,l);
850 isModified = Standard_True;
854 TE->Modified(Standard_True);
857 //=======================================================================
858 //function : UpdateEdge
860 //=======================================================================
862 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
863 const Handle(Poly_Polygon2D)& P,
864 const TopoDS_Face& F) const
867 const Handle(Geom_Surface)& S = BRep_Tool::Surface(F,l);
868 UpdateEdge(E, P, S, l);
871 //=======================================================================
872 //function : UpdateEdge
874 //=======================================================================
876 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
877 const Handle(Poly_Polygon2D)& P,
878 const Handle(Geom_Surface)& S,
879 const TopLoc_Location& L) const
881 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
884 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
886 TopLoc_Location l = L.Predivided(E.Location());
888 BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
889 Handle(BRep_CurveRepresentation) cr;
891 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
892 while (itcr.More()) {
893 if (itcr.Value()->IsPolygonOnSurface(S, l)) break;
898 // cr is used to keep a reference on the curve representation
899 // this avoid deleting it as its content may be referenced by T
905 Handle(BRep_PolygonOnSurface) PS =
906 new BRep_PolygonOnSurface(P, S, l);
910 TE->Modified(Standard_True);
913 //=======================================================================
914 //function : UpdateEdge
916 //=======================================================================
918 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
919 const Handle(Poly_Polygon2D)& P1,
920 const Handle(Poly_Polygon2D)& P2,
921 const TopoDS_Face& F) const
924 const Handle(Geom_Surface)& S = BRep_Tool::Surface(F,l);
925 UpdateEdge(E, P1, P2, S, l);
928 //=======================================================================
929 //function : UpdateEdge
931 //=======================================================================
933 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
934 const Handle(Poly_Polygon2D)& P1,
935 const Handle(Poly_Polygon2D)& P2,
936 const Handle(Geom_Surface)& S,
937 const TopLoc_Location& L) const
939 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
942 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
944 TopLoc_Location l = L.Predivided(E.Location());
946 BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
947 Handle(BRep_CurveRepresentation) cr;
949 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
950 while (itcr.More()) {
951 if (itcr.Value()->IsPolygonOnSurface(S, l)) break;
956 // cr is used to keep a reference on the curve representation
957 // this avoid deleting it as its content may be referenced by T
962 if (!P1.IsNull() && !P2.IsNull()) {
963 Handle(BRep_PolygonOnClosedSurface) PS =
964 new BRep_PolygonOnClosedSurface(P1, P2, S, TopLoc_Location());
968 TE->Modified(Standard_True);
971 //=======================================================================
972 //function : UpdateEdge
974 //=======================================================================
976 void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
977 const Standard_Real Tol) const
979 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
982 TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
984 TE->UpdateTolerance(Tol);
985 TE->Modified(Standard_True);
989 //=======================================================================
990 //function : Continuity
992 //=======================================================================
994 void BRep_Builder::Continuity(const TopoDS_Edge& E,
995 const TopoDS_Face& F1,
996 const TopoDS_Face& F2,
997 const GeomAbs_Shape C) const
999 TopLoc_Location l1,l2;
1000 const Handle(Geom_Surface)& S1 = BRep_Tool::Surface(F1,l1);
1001 const Handle(Geom_Surface)& S2 = BRep_Tool::Surface(F2,l2);
1002 Continuity(E,S1,S2,l1,l2,C);
1005 //=======================================================================
1006 //function : Continuity
1008 //=======================================================================
1010 void BRep_Builder::Continuity(const TopoDS_Edge& E,
1011 const Handle(Geom_Surface)& S1,
1012 const Handle(Geom_Surface)& S2,
1013 const TopLoc_Location& L1,
1014 const TopLoc_Location& L2,
1015 const GeomAbs_Shape C)const
1017 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
1020 TopoDS_LockedShape::Raise("BRep_Builder::Continuity");
1022 const TopLoc_Location l1 = L1.Predivided(E.Location());
1023 const TopLoc_Location l2 = L2.Predivided(E.Location());
1025 UpdateCurves(TE->ChangeCurves(),S1,S2,l1,l2,C);
1027 TE->Modified(Standard_True);
1030 //=======================================================================
1031 //function : SameParameter
1033 //=======================================================================
1035 void BRep_Builder::SameParameter(const TopoDS_Edge& E,
1036 const Standard_Boolean S) const
1038 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
1041 TopoDS_LockedShape::Raise("BRep_Builder::SameParameter");
1043 TE->SameParameter(S);
1044 TE->Modified(Standard_True);
1047 //=======================================================================
1048 //function : SameRange
1050 //=======================================================================
1052 void BRep_Builder::SameRange(const TopoDS_Edge& E,
1053 const Standard_Boolean S) const
1055 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
1058 TopoDS_LockedShape::Raise("BRep_Builder::SameRange");
1061 TE->Modified(Standard_True);
1064 //=======================================================================
1065 //function : Degenerated
1067 //=======================================================================
1069 void BRep_Builder::Degenerated(const TopoDS_Edge& E,
1070 const Standard_Boolean D) const
1072 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
1075 TopoDS_LockedShape::Raise("BRep_Builder::Degenerated");
1079 // set a null 3d curve
1080 UpdateCurves(TE->ChangeCurves(),Handle(Geom_Curve)(),E.Location());
1082 TE->Modified(Standard_True);
1086 //=======================================================================
1089 //=======================================================================
1091 void BRep_Builder::Range(const TopoDS_Edge& E,
1092 const Standard_Real First,
1093 const Standard_Real Last,
1094 const Standard_Boolean Only3d) const
1096 // set the range to all the representations if Only3d=FALSE
1097 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
1100 TopoDS_LockedShape::Raise("BRep_Builder::Range");
1102 BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
1103 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
1104 Handle(BRep_GCurve) GC;
1106 while (itcr.More()) {
1107 GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
1108 if (!GC.IsNull() && (!Only3d || GC->IsCurve3D()))
1109 GC->SetRange(First,Last);
1113 TE->Modified(Standard_True);
1117 //=======================================================================
1120 //=======================================================================
1122 void BRep_Builder::Range(const TopoDS_Edge& E,
1123 const Handle(Geom_Surface)& S,
1124 const TopLoc_Location& L,
1125 const Standard_Real First,
1126 const Standard_Real Last) const
1128 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
1131 TopoDS_LockedShape::Raise("BRep_Builder::Range");
1133 const TopLoc_Location l = L.Predivided(E.Location());
1135 BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
1136 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
1137 Handle(BRep_GCurve) GC;
1139 while (itcr.More()) {
1140 GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
1141 if (!GC.IsNull() && GC->IsCurveOnSurface(S,l))
1143 GC->SetRange(First,Last);
1150 Standard_DomainError::Raise("BRep_Builder::Range, no pcurve");
1152 TE->Modified(Standard_True);
1156 //=======================================================================
1157 //function : Transfert
1159 //=======================================================================
1161 void BRep_Builder::Transfert(const TopoDS_Edge& Ein,
1162 const TopoDS_Edge& Eout) const
1164 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &Ein.TShape());
1167 TopoDS_LockedShape::Raise("BRep_Builder::Transfert");
1169 const Standard_Real tol = TE->Tolerance();
1171 BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
1172 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
1174 while (itcr.More()) {
1176 const Handle(BRep_CurveRepresentation)& CR = itcr.Value();
1178 if (CR->IsCurveOnSurface()) {
1182 Ein.Location() * CR->Location(),tol);
1185 else if (CR->IsCurveOnClosedSurface()) {
1190 Ein.Location() * CR->Location(),tol);
1193 if (CR->IsRegularity()) {
1197 Ein.Location() * CR->Location(),
1198 Ein.Location() * CR->Location2(),
1207 //=======================================================================
1208 //function : UpdateVertex
1209 //purpose : update vertex with 3d point
1210 //=======================================================================
1212 void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V,
1214 const Standard_Real Tol) const
1216 const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &V.TShape());
1219 TopoDS_LockedShape::Raise("BRep_Builder::UpdateVertex");
1221 TV->Pnt(P.Transformed(V.Location().Inverted().Transformation()));
1222 TV->UpdateTolerance(Tol);
1223 TV->Modified(Standard_True);
1227 //=======================================================================
1228 //function : UpdateVertex
1229 //purpose : update vertex with parameter on edge
1230 //=======================================================================
1232 void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V,
1233 const Standard_Real Par,
1234 const TopoDS_Edge& E,
1235 const Standard_Real Tol) const
1237 if (Precision::IsPositiveInfinite(Par) ||
1238 Precision::IsNegativeInfinite(Par))
1239 Standard_DomainError::Raise("BRep_Builder::Infinite parameter");
1241 const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &V.TShape());
1242 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
1244 if(TV->Locked() || TE->Locked())
1246 TopoDS_LockedShape::Raise("BRep_Builder::UpdateVertex");
1249 TopLoc_Location L = E.Location().Predivided(V.Location());
1251 // Search the vertex in the edge
1252 TopAbs_Orientation ori = TopAbs_INTERNAL;
1254 TopoDS_Iterator itv(E.Oriented(TopAbs_FORWARD));
1256 // if the edge has no vertices
1257 // and is degenerated use the vertex orientation
1260 if (!itv.More() && TE->Degenerated())
1261 ori = V.Orientation();
1263 while (itv.More()) {
1264 const TopoDS_Shape& Vcur = itv.Value();
1265 if (V.IsSame(Vcur)) {
1266 ori = Vcur.Orientation();
1267 if (ori == V.Orientation()) break;
1272 BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
1273 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
1274 Handle(BRep_GCurve) GC;
1276 while (itcr.More()) {
1277 GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
1279 if (ori == TopAbs_FORWARD)
1281 else if (ori == TopAbs_REVERSED)
1284 BRep_ListOfPointRepresentation& lpr = TV->ChangePoints();
1285 const TopLoc_Location& GCloc = GC->Location();
1286 TopLoc_Location LGCloc = L*GCloc;
1287 if (GC->IsCurve3D()) {
1288 const Handle(Geom_Curve)& GC3d = GC->Curve3D();
1289 UpdatePoints(lpr,Par,GC3d,LGCloc);
1291 else if (GC->IsCurveOnSurface()) {
1292 const Handle(Geom2d_Curve)& GCpc = GC->PCurve();
1293 const Handle(Geom_Surface)& GCsu = GC->Surface();
1294 UpdatePoints(lpr,Par,GCpc,GCsu,LGCloc);
1301 if ((ori != TopAbs_FORWARD) && (ori != TopAbs_REVERSED))
1302 TV->Modified(Standard_True);
1303 TV->UpdateTolerance(Tol);
1304 TE->Modified(Standard_True);
1308 //=======================================================================
1309 //function : UpdateVertex
1310 //purpose : update vertex with parameter on edge on face
1311 //=======================================================================
1313 void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V,
1314 const Standard_Real Par,
1315 const TopoDS_Edge& E,
1316 const Handle(Geom_Surface)& S,
1317 const TopLoc_Location& L,
1318 const Standard_Real Tol) const
1320 if (Precision::IsPositiveInfinite(Par) ||
1321 Precision::IsNegativeInfinite(Par))
1322 Standard_DomainError::Raise("BRep_Builder::Infinite parameter");
1324 // Find the curve representation
1325 TopLoc_Location l = L.Predivided(V.Location());
1327 const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &V.TShape());
1328 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
1330 if(TV->Locked() || TE->Locked())
1332 TopoDS_LockedShape::Raise("BRep_Builder::UpdateVertex");
1335 // Search the vertex in the edge
1336 TopAbs_Orientation ori = TopAbs_INTERNAL;
1338 TopoDS_Iterator itv(E.Oriented(TopAbs_FORWARD));
1340 // if the edge has no vertices
1341 // and is degenerated use the vertex orientation
1344 if (!itv.More() && TE->Degenerated())
1345 ori = V.Orientation();
1347 while (itv.More()) {
1348 const TopoDS_Shape& Vcur = itv.Value();
1349 if (V.IsSame(Vcur)) {
1350 ori = Vcur.Orientation();
1351 if (ori == V.Orientation()) break;
1356 BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
1357 BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
1358 Handle(BRep_GCurve) GC;
1360 while (itcr.More()) {
1361 GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
1363 // if (GC->IsCurveOnSurface(S,l)) {
1364 if (GC->IsCurveOnSurface(S,L)) { //xpu020198 : BUC60407
1365 if (ori == TopAbs_FORWARD)
1367 else if (ori == TopAbs_REVERSED)
1370 BRep_ListOfPointRepresentation& lpr = TV->ChangePoints();
1371 const Handle(Geom2d_Curve)& GCpc = GC->PCurve();
1372 UpdatePoints(lpr,Par,GCpc,S,l);
1373 TV->Modified(Standard_True);
1382 Standard_DomainError::Raise("BRep_Builder:: no pcurve");
1384 TV->UpdateTolerance(Tol);
1385 TE->Modified(Standard_True);
1388 //=======================================================================
1389 //function : UpdateVertex
1390 //purpose : update vertex with parameters on face
1391 //=======================================================================
1393 void BRep_Builder::UpdateVertex(const TopoDS_Vertex& Ve,
1394 const Standard_Real U,
1395 const Standard_Real V,
1396 const TopoDS_Face& F,
1397 const Standard_Real Tol) const
1399 const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &Ve.TShape());
1403 TopoDS_LockedShape::Raise("BRep_Builder::UpdateVertex");
1407 const Handle(Geom_Surface)& S = BRep_Tool::Surface(F,L);
1408 L = L.Predivided(Ve.Location());
1409 BRep_ListOfPointRepresentation& lpr = TV->ChangePoints();
1410 UpdatePoints(lpr,U,V,S,L);
1412 TV->UpdateTolerance(Tol);
1413 TV->Modified(Standard_True);
1416 //=======================================================================
1417 //function : UpdateVertex
1418 //purpose : update vertex with 3d point
1419 //=======================================================================
1421 void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V,
1422 const Standard_Real Tol) const
1424 const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &V.TShape());
1428 TopoDS_LockedShape::Raise("BRep_Builder::UpdateVertex");
1431 TV->UpdateTolerance(Tol);
1432 TV->Modified(Standard_True);
1436 //=======================================================================
1437 //function : Transfert
1439 //=======================================================================
1441 void BRep_Builder::Transfert(const TopoDS_Edge& Ein,
1442 const TopoDS_Edge& Eout,
1443 const TopoDS_Vertex& Vin,
1444 const TopoDS_Vertex& Vout) const
1446 const Standard_Real tol = BRep_Tool::Tolerance(Vin);
1447 const Standard_Real parin = BRep_Tool::Parameter(Vin,Ein);
1448 UpdateVertex(Vout,parin,Eout,tol);