0022627: Change OCCT memory management defaults
[occt.git] / src / BRepSweep / BRepSweep_Translation.cxx
CommitLineData
7fd59977 1// File: BRepSweep_Translation.cxx
2// Created: Thu Feb 4 16:09:37 1993
3// Author: Laurent BOURESCHE
4// <lbo@phylox>
5
6#include <BRepSweep_Translation.ixx>
7#include <BRep_Tool.hxx>
8#include <BRepTools.hxx>
9#include <BRepAdaptor_Surface.hxx>
10#include <TopoDS.hxx>
11#include <TopoDS_Vertex.hxx>
12#include <ElSLib.hxx>
13#include <GeomAbs_SurfaceType.hxx>
14#include <GeomAdaptor_Surface.hxx>
15#include <GeomAdaptor_Curve.hxx>
16#include <Geom_SurfaceOfLinearExtrusion.hxx>
17#include <Geom_Plane.hxx>
18#include <Geom_CylindricalSurface.hxx>
19#include <Geom_Line.hxx>
20#include <Geom2d_Line.hxx>
21#include <gp.hxx>
22#include <gp_Trsf.hxx>
23#include <gp_Pnt.hxx>
24#include <gp_Pnt2d.hxx>
25#include <gp_Lin.hxx>
26#include <gp_Lin2d.hxx>
27#include <gp_Dir.hxx>
28#include <gp_Dir2d.hxx>
29#include <Precision.hxx>
30#include <Standard_ConstructionError.hxx>
31
32#include <GeomAdaptor_HCurve.hxx>
33#include <Adaptor3d_SurfaceOfLinearExtrusion.hxx>
34
35#include <BRepAdaptor_Curve.hxx>
36#include <BRep_TEdge.hxx>
37#include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
38#include <BRep_CurveRepresentation.hxx>
39#include <TopExp_Explorer.hxx>
40
41static void SetThePCurve(const BRep_Builder& B,
42 TopoDS_Edge& E,
43 const TopoDS_Face& F,
44 const TopAbs_Orientation O,
45 const Handle(Geom2d_Curve)& C)
46{
47 // check if there is already a pcurve on non planar faces
48 Standard_Real f,l;
49 Handle(Geom2d_Curve) OC;
50 TopLoc_Location SL;
51 Handle(Geom_Plane) GP = Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(F,SL));
52 if (GP.IsNull())
53 OC = BRep_Tool::CurveOnSurface(E,F,f,l);
54 if (OC.IsNull())
55 B.UpdateEdge(E,C,F,Precision::Confusion());
56 else {
57 if (O == TopAbs_REVERSED)
58 B.UpdateEdge(E,OC,C,F,Precision::Confusion());
59 else
60 B.UpdateEdge(E,C,OC,F,Precision::Confusion());
61 }
62}
63
64//=======================================================================
65//function : BRepSweep_Translation
66//purpose :
67//=======================================================================
68
69BRepSweep_Translation::BRepSweep_Translation(const TopoDS_Shape& S,
70 const Sweep_NumShape& N,
71 const TopLoc_Location& L,
72 const gp_Vec& V,
73 const Standard_Boolean C,
74 const Standard_Boolean Canonize) :
75 BRepSweep_Trsf(BRep_Builder(),S,N,L,C),
76 myVec(V),
77 myCanonize(Canonize)
78{
79
80 Standard_ConstructionError_Raise_if
81 (V.Magnitude()<Precision::Confusion(),
82 "BRepSweep_Translation::Constructor");
83 Init();
84}
85
86void BRepSweep_Translation::Delete()
87{}
88
89
90//=======================================================================
91//function : MakeEmptyVertex
92//purpose :
93//=======================================================================
94
95TopoDS_Shape BRepSweep_Translation::MakeEmptyVertex
96 (const TopoDS_Shape& aGenV,
97 const Sweep_NumShape& aDirV)
98{
99 //Only called when the option of construction is with copy.
100 Standard_ConstructionError_Raise_if
101 (!myCopy,"BRepSweep_Translation::MakeEmptyVertex");
102 gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aGenV));
103 if (aDirV.Index()==2) P.Transform(myLocation.Transformation());
104 TopoDS_Vertex V;
105 ////// modified by jgv, 5.10.01, for buc61008 //////
106 //myBuilder.Builder().MakeVertex(V,P,Precision::Confusion());
107 myBuilder.Builder().MakeVertex( V, P, BRep_Tool::Tolerance(TopoDS::Vertex(aGenV)) );
108 ////////////////////////////////////////////////////
109 return V;
110}
111
112
113//=======================================================================
114//function : MakeEmptyDirectingEdge
115//purpose :
116//=======================================================================
117
118TopoDS_Shape BRepSweep_Translation::MakeEmptyDirectingEdge
119 (const TopoDS_Shape& aGenV,
120 const Sweep_NumShape&)
121{
122 gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aGenV));
123 gp_Lin L(P,myVec);
124 Handle(Geom_Line) GL = new Geom_Line(L);
125 TopoDS_Edge E;
126 myBuilder.Builder().MakeEdge
127 (E,GL,BRep_Tool::Tolerance(TopoDS::Vertex(aGenV)));
128 return E;
129}
130
131
132//=======================================================================
133//function : MakeEmptyGeneratingEdge
134//purpose :
135//=======================================================================
136
137TopoDS_Shape BRepSweep_Translation::MakeEmptyGeneratingEdge
138 (const TopoDS_Shape& aGenE,
139 const Sweep_NumShape& aDirV)
140{
0d969553 141 //Call only in case of construction with copy.
7fd59977 142 Standard_ConstructionError_Raise_if
143 (!myCopy,"BRepSweep_Translation::MakeEmptyVertex");
144 TopLoc_Location L;
145 Standard_Real First,Last;
146 Handle(Geom_Curve) C = BRep_Tool::Curve(TopoDS::Edge(aGenE),L,First,Last);
147 C = Handle(Geom_Curve)::DownCast(C->Copy());
148 C->Transform(L.Transformation());
149 if (aDirV.Index() == 2) C->Transform(myLocation.Transformation());
150 TopoDS_Edge newE;
151 myBuilder.Builder().MakeEdge
152 (newE,C,BRep_Tool::Tolerance(TopoDS::Edge(aGenE)));
153 return newE;
154}
155
156
157//=======================================================================
158//function : SetParameters
159//purpose :
160//=======================================================================
161
162void BRepSweep_Translation::SetParameters
163 (const TopoDS_Shape& aNewFace,
164 TopoDS_Shape& aNewVertex,
165 const TopoDS_Shape& aGenF,
166 const TopoDS_Shape& aGenV,
167 const Sweep_NumShape&)
168{
0d969553 169 //Glue the parameter of vertices directly included in cap faces.
7fd59977 170 gp_Pnt2d pnt2d = BRep_Tool::Parameters(TopoDS::Vertex(aGenV),
171 TopoDS::Face(aGenF));
172 myBuilder.Builder().UpdateVertex
173 (TopoDS::Vertex(aNewVertex),pnt2d.X(),pnt2d.Y(),
174 TopoDS::Face(aNewFace),Precision::PConfusion());
175}
176
177
178//=======================================================================
179//function : SetDirectingParameter
180//purpose :
181//=======================================================================
182
183void BRepSweep_Translation::SetDirectingParameter
184 (const TopoDS_Shape& aNewEdge,
185 TopoDS_Shape& aNewVertex,
186 const TopoDS_Shape&,
187 const Sweep_NumShape&,
188 const Sweep_NumShape& aDirV)
189{
190 Standard_Real param = 0;
191 if (aDirV.Index() == 2) param = myVec.Magnitude();
192 myBuilder.Builder().UpdateVertex(TopoDS::Vertex(aNewVertex),
193 param,TopoDS::Edge(aNewEdge),
194 Precision::PConfusion());
195}
196
197
198//=======================================================================
199//function : SetGeneratingParameter
200//purpose :
201//=======================================================================
202
203void BRepSweep_Translation::SetGeneratingParameter
204 (const TopoDS_Shape& aNewEdge,
205 TopoDS_Shape& aNewVertex,
206 const TopoDS_Shape& aGenE,
207 const TopoDS_Shape& aGenV,
208 const Sweep_NumShape&)
209{
210 TopoDS_Vertex vbid = TopoDS::Vertex(aNewVertex);
211 vbid.Orientation(aGenV.Orientation());
212 myBuilder.Builder().UpdateVertex
213 (vbid,
214 BRep_Tool::Parameter(TopoDS::Vertex(aGenV),TopoDS::Edge(aGenE)),
215 TopoDS::Edge(aNewEdge),Precision::PConfusion());
216}
217
218
219//=======================================================================
220//function : MakeEmptyFace
221//purpose :
222//=======================================================================
223
224TopoDS_Shape BRepSweep_Translation::MakeEmptyFace
225 (const TopoDS_Shape& aGenS,
226 const Sweep_NumShape& aDirS)
227{
228 Standard_Real toler;
229 TopoDS_Face F;
230 Handle(Geom_Surface) S;
231 if (myDirShapeTool.Type(aDirS)==TopAbs_EDGE){
232 TopLoc_Location L;
233 Standard_Real First,Last;
234 Handle(Geom_Curve) C = BRep_Tool::Curve(TopoDS::Edge(aGenS),L,First,Last);
235 toler = BRep_Tool::Tolerance(TopoDS::Edge(aGenS));
236 gp_Trsf Tr = L.Transformation();
237 C = Handle(Geom_Curve)::DownCast(C->Copy());
0d969553 238 //extruded surfaces are inverted correspondingly to the topology, so reverse.
7fd59977 239 C->Transform(Tr);
240 gp_Dir D(myVec);
241 D.Reverse();
242
243 if (myCanonize) {
244 Handle(GeomAdaptor_HCurve) HC = new GeomAdaptor_HCurve(C,First,Last);
245 Adaptor3d_SurfaceOfLinearExtrusion AS(HC,D);
246 switch(AS.GetType()){
247
248 case GeomAbs_Plane :
249 S = new Geom_Plane(AS.Plane());
250 break;
251 case GeomAbs_Cylinder :
252 S = new Geom_CylindricalSurface(AS.Cylinder());
253 break;
254 default:
255 S = new Geom_SurfaceOfLinearExtrusion(C,D);
256 break;
257 }
258 }
259 else {
260 S = new Geom_SurfaceOfLinearExtrusion(C,D);
261 }
262 }
263 else {
264 TopLoc_Location L;
265 S = BRep_Tool::Surface(TopoDS::Face(aGenS),L);
266 toler = BRep_Tool::Tolerance(TopoDS::Face(aGenS));
267 gp_Trsf Tr = L.Transformation();
268 S = Handle(Geom_Surface)::DownCast(S->Copy());
269 S->Transform(Tr);
270 if (aDirS.Index()==2) S->Translate(myVec);
271 }
272 myBuilder.Builder().MakeFace(F,S,toler);
273 return F;
274}
275
276
277//=======================================================================
278//function : SetPCurve
279//purpose :
280//=======================================================================
281
282void BRepSweep_Translation::SetPCurve
283 (const TopoDS_Shape& aNewFace,
284 TopoDS_Shape& aNewEdge,
285 const TopoDS_Shape& aGenF,
286 const TopoDS_Shape& aGenE,
287 const Sweep_NumShape&,
288 const TopAbs_Orientation)
289{
0d969553
Y
290 //Set on edges of cap faces the same pcurves as
291 //edges of the generating face.
7fd59977 292 Standard_Real First,Last;
293 myBuilder.Builder().UpdateEdge
294 (TopoDS::Edge(aNewEdge),
295 BRep_Tool::CurveOnSurface
296 (TopoDS::Edge(aGenE),TopoDS::Face(aGenF),First,Last),
297 TopoDS::Face(aNewFace),Precision::PConfusion());
298}
299
300
301//=======================================================================
302//function : SetGeneratingPCurve
303//purpose :
304//=======================================================================
305
306void BRepSweep_Translation::SetGeneratingPCurve
307 (const TopoDS_Shape& aNewFace,
308 TopoDS_Shape& aNewEdge,
309 const TopoDS_Shape& ,
310 const Sweep_NumShape&,
311 const Sweep_NumShape& aDirV,
312 const TopAbs_Orientation orien)
313{
314 TopLoc_Location Loc;
315 GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewFace),Loc));
316// Standard_Real First,Last;
317 gp_Lin2d L;
318 TopoDS_Edge aNewOrientedEdge = TopoDS::Edge(aNewEdge);
319 aNewOrientedEdge.Orientation(orien);
320
321 if (AS.GetType()==GeomAbs_Plane){
0d969553 322/* nothing is done JAG
7fd59977 323 gp_Pln pln = AS.Plane();
324 gp_Ax3 ax3 = pln.Position();
325
0d969553 326// JYL : the following produces bugs on an edge constructed from a trimmed 3D curve :
7fd59977 327//
328// Handle(Geom_Line)
329// GL = Handle(Geom_Line)::DownCast(BRep_Tool::Curve(TopoDS::Edge(aGenE),
330// Loc,First,Last));
331// gp_Lin gl = GL->Lin();
332// gl.Transform(Loc.Transformation());
333//
334// correction :
335 const TopoDS_Edge& EE = TopoDS::Edge(aGenE);
336 BRepAdaptor_Curve BRAC(EE);
337 gp_Lin gl = BRAC.Line();
338
339 if(aDirV.Index()==2) gl.Translate(myVec);
340 gp_Pnt pnt = gl.Location();
341 gp_Dir dir = gl.Direction();
342 Standard_Real u,v;
343 ElSLib::PlaneParameters(ax3,pnt,u,v);
344 gp_Pnt2d pnt2d(u,v);
345 gp_Dir2d dir2d(dir.Dot(ax3.XDirection()),dir.Dot(ax3.YDirection()));
346 L.SetLocation(pnt2d);
347 L.SetDirection(dir2d);
348*/
349 }
350 else{
351 Standard_Real v = 0;
352 if (aDirV.Index() == 2) v = -myVec.Magnitude();
353 L.SetLocation(gp_Pnt2d(0,v));
354 L.SetDirection(gp_Dir2d(1,0));
355// }
356 Handle(Geom2d_Line) GL = new Geom2d_Line(L);
357 SetThePCurve(myBuilder.Builder(),
358 TopoDS::Edge(aNewEdge),
359 TopoDS::Face(aNewFace),
360 orien,
361 GL);
362 }
363}
364
365
366//=======================================================================
367//function : SetDirectingPCurve
368//purpose :
369//=======================================================================
370
371void BRepSweep_Translation::SetDirectingPCurve
372 (const TopoDS_Shape& aNewFace,
373 TopoDS_Shape& aNewEdge,
374 const TopoDS_Shape& aGenE,
375 const TopoDS_Shape& aGenV,
376 const Sweep_NumShape&,
377 const TopAbs_Orientation orien)
378{
379 TopLoc_Location Loc;
380 GeomAdaptor_Surface AS(BRep_Tool::Surface(TopoDS::Face(aNewFace),Loc));
381 gp_Lin2d L;
382 if(AS.GetType()!=GeomAbs_Plane){
383 L.SetLocation(gp_Pnt2d(BRep_Tool::Parameter(TopoDS::Vertex(aGenV),
384 TopoDS::Edge(aGenE)),0));
385 L.SetDirection(gp_Dir2d(0,-1));
386/* JAG
387 }
388 else{
389
390 gp_Pln pln = AS.Plane();
391 gp_Ax3 ax3 = pln.Position();
392 gp_Pnt pv = BRep_Tool::Pnt(TopoDS::Vertex(aGenV));
393 gp_Dir dir(myVec);
394 Standard_Real u,v;
395 ElSLib::PlaneParameters(ax3,pv,u,v);
396 gp_Pnt2d pnt2d(u,v);
397 gp_Dir2d dir2d(dir.Dot(ax3.XDirection()),dir.Dot(ax3.YDirection()));
398 L.SetLocation(pnt2d);
399 L.SetDirection(dir2d);
400
401 }
402*/
403 Handle(Geom2d_Line) GL = new Geom2d_Line(L);
404 SetThePCurve(myBuilder.Builder(),
405 TopoDS::Edge(aNewEdge),
406 TopoDS::Face(aNewFace),
407 orien,GL);
408 }
409}
410
411//=======================================================================
412//function : DirectSolid
413//purpose :
414//=======================================================================
415
416TopAbs_Orientation BRepSweep_Translation::DirectSolid
417 (const TopoDS_Shape& aGenS,
418 const Sweep_NumShape&)
419{
420 // compare the face normal and the direction
421 BRepAdaptor_Surface surf(TopoDS::Face(aGenS));
422 gp_Pnt P;
423 gp_Vec du,dv;
424 surf.D1((surf.FirstUParameter() + surf.LastUParameter()) / 2.,
425 (surf.FirstVParameter() + surf.LastVParameter()) / 2.,
426 P,du,dv);
427
428 Standard_Real x = myVec.DotCross(du,dv);
429 TopAbs_Orientation orient = (x > 0) ? TopAbs_REVERSED : TopAbs_FORWARD;
430 return orient;
431}
432
433
434//=======================================================================
435//function : GGDShapeIsToAdd
436//purpose :
437//=======================================================================
438
439Standard_Boolean BRepSweep_Translation::GGDShapeIsToAdd
440 (const TopoDS_Shape& ,
441 const TopoDS_Shape& ,
442 const TopoDS_Shape& ,
443 const TopoDS_Shape& ,
444 const Sweep_NumShape& )const
445{
446 return Standard_True;
447}
448
449
450//=======================================================================
451//function : GDDShapeIsToAdd
452//purpose :
453//=======================================================================
454
455Standard_Boolean BRepSweep_Translation::GDDShapeIsToAdd
456 (const TopoDS_Shape& ,
457 const TopoDS_Shape& ,
458 const TopoDS_Shape& ,
459 const Sweep_NumShape& ,
460 const Sweep_NumShape& )const
461{
462 return Standard_True;
463}
464
465
466//=======================================================================
467//function : SeparatedWires
468//purpose :
469//=======================================================================
470
471Standard_Boolean BRepSweep_Translation::SeparatedWires
472 (const TopoDS_Shape& ,
473 const TopoDS_Shape& ,
474 const TopoDS_Shape& ,
475 const TopoDS_Shape& ,
476 const Sweep_NumShape& )const
477{
478 return Standard_False;
479}
480
481
482//=======================================================================
483//function : HasShape
484//purpose :
485//=======================================================================
486
487Standard_Boolean BRepSweep_Translation::HasShape
488 (const TopoDS_Shape& aGenS,
489 const Sweep_NumShape& aDirS)const
490{
491 if(myDirShapeTool.Type(aDirS) == TopAbs_EDGE) {
492
493 if(myGenShapeTool.Type(aGenS) == TopAbs_EDGE) {
494 TopoDS_Edge E = TopoDS::Edge(aGenS);
495
496 // check if the edge is degenerated
497 if(BRep_Tool::Degenerated(E)) {
498 return Standard_False;
499 }
500 // check if the edge is a sewing edge
501
502// modified by NIZHNY-EAP Fri Dec 24 11:13:09 1999 ___BEGIN___
503// const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
504
505// BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
506// BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
507
508// while (itcr.More()) {
509// const Handle(BRep_CurveRepresentation)& cr = itcr.Value();
510// if (cr->IsCurveOnSurface() &&
511// cr->IsCurveOnClosedSurface() ) {
512// cout<<"sewing edge"<<endl;
513// return Standard_False;
514// }
515// itcr.Next();
516// }
517 TopExp_Explorer FaceExp(myGenShape, TopAbs_FACE);
518 for (;FaceExp.More(); FaceExp.Next()) {
519 TopoDS_Face F = TopoDS::Face(FaceExp.Current());
520 if (BRepTools::IsReallyClosed(E, F))
521 return Standard_False;
522 }
523// modified by NIZHNY-EAP Fri Dec 24 11:13:21 1999 ___END___
524 }
525 }
526
527 return Standard_True;
528}
529
530//=======================================================================
531//function : IsInvariant
532//purpose :
533//=======================================================================
534
535Standard_Boolean BRepSweep_Translation::IsInvariant
536 (const TopoDS_Shape& )const
537{
538 return Standard_False;
539}
540
541
542//=======================================================================
543//function : Vec
544//purpose :
545//=======================================================================
546
547gp_Vec BRepSweep_Translation::Vec()const
548{
549 return myVec;
550}
551
552