1 // Copyright (c) 1999-2012 OPEN CASCADE SAS
3 // The content of this file is subject to the Open CASCADE Technology Public
4 // License Version 6.5 (the "License"). You may not use the content of this file
5 // except in compliance with the License. Please obtain a copy of the License
6 // at http://www.opencascade.org and read it completely before using this file.
8 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
9 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
11 // The Original Code and all software distributed under the License is
12 // distributed on an "AS IS" basis, without warranty of any kind, and the
13 // Initial Developer hereby disclaims all such warranties, including without
14 // limitation, any warranties of merchantability, fitness for a particular
15 // purpose or non-infringement. Please see the License for the specific terms
16 // and conditions governing the rights and limitations under the License.
18 //=======================================================================
20 // Integration to ensure SCCS base integrity
21 // 21.12.98 rln, gka S4054
22 // 28.12.98 dce S3767 New messaging system
23 //#55,#56 rln 25.12.98 UKI60878
24 //:l1 abv 10.01.99: USA60022 7289: fix missing seam
25 //#63 rln 19.01.99 UKI60878 no offset if C0 surface is converted into the grid of C1 surfaces
26 //%13 pdn 15.02.99 USA60293 entities 792, 8604 .. handling of C0 ruled surfaces, tabulated cylindres,
27 // and surfaces of revolution.
28 //:p4 abv, pdn 23.02.99: PRO9234 #15720: call BRepTools::Update() for faces
29 //%14 pdn 24.02.99 implementing of ShapeFix_Face on IGES
30 // pdn 17.04.99 S4181: Implementing of reading IGES elementary surfaces.
31 // pdn 10.05.99 S4137: Using modified ShapeDivide tools
32 //#11 smh 22.12.99 BUC60625 Transform axis.
33 //#12 smh 12.12.99 FRA62468 - Using conversion to B-Spline for Offset surface
34 //=======================================================================
36 #include <IGESToBRep_TopoSurface.ixx>
38 #include <Standard_ErrorHandler.hxx>
39 #include <IGESToBRep.hxx>
40 #include <IGESToBRep_CurveAndSurface.hxx>
41 #include <IGESToBRep_TopoCurve.hxx>
42 #include <IGESToBRep_BasicCurve.hxx>
43 #include <IGESToBRep_BasicSurface.hxx>
45 #include <BRepAdaptor_Curve.hxx>
46 #include <BRepPrimAPI_MakePrism.hxx>
47 #include <BRepPrimAPI_MakeRevol.hxx>
48 //S4054: ShapeTool_MakeWire -> ShapeExtend_WireData //:g8: BRepLib_MakeWire -> ShapeTool_MakeWire
49 #include <BRepGProp.hxx>
50 #include <BRepFill.hxx>
51 #include <BRepLib_MakeFace.hxx>
52 #include <BRep_Builder.hxx>
53 #include <BRep_Tool.hxx>
58 #include <GProp_GProps.hxx>
60 #include <GeomAbs_Shape.hxx>
62 #include <Geom2d_Line.hxx>
63 #include <Geom2d_Curve.hxx>
65 #include <Geom_BezierCurve.hxx>
66 #include <Geom_Curve.hxx>
67 #include <Geom_ConicalSurface.hxx>
68 #include <Geom_CylindricalSurface.hxx>
69 #include <Geom_OffsetSurface.hxx>
70 #include <Geom_Plane.hxx>
71 #include <Geom_Surface.hxx>
72 #include <Geom_SurfaceOfLinearExtrusion.hxx>
73 #include <Geom_RectangularTrimmedSurface.hxx>
74 #include <Geom_SphericalSurface.hxx>
75 #include <Geom_ToroidalSurface.hxx>
77 #include <IGESData_IGESEntity.hxx>
78 #include <IGESData_ToolLocation.hxx>
80 #include <IGESGeom_BSplineSurface.hxx>
81 #include <IGESGeom_BoundedSurface.hxx>
82 #include <IGESGeom_CurveOnSurface.hxx>
83 #include <IGESGeom_Line.hxx>
84 #include <IGESGeom_Point.hxx>
85 #include <IGESGeom_Direction.hxx>
87 #include <IGESSolid_CylindricalSurface.hxx>
88 #include <IGESSolid_ConicalSurface.hxx>
89 #include <IGESSolid_ToroidalSurface.hxx>
90 #include <IGESSolid_SphericalSurface.hxx>
91 #include <IGESSolid_PlaneSurface.hxx>
93 #include <Interface_Macros.hxx>
95 #include <gp_GTrsf.hxx>
97 #include <Precision.hxx>
101 #include <TopoDS.hxx>
102 #include <TopoDS_Edge.hxx>
103 #include <TopoDS_Face.hxx>
104 #include <TopoDS_Iterator.hxx>
105 #include <TopoDS_Shape.hxx>
106 #include <TopoDS_Shell.hxx>
107 #include <TopoDS_Vertex.hxx>
108 #include <TopoDS_Wire.hxx>
110 #include <TopExp.hxx>
111 #include <TopExp_Explorer.hxx>
113 #include <TopLoc_Location.hxx>
116 #include <gp_Ax1.hxx>
117 #include <gp_Cylinder.hxx>
118 #include <gp_Cone.hxx>
119 #include <gp_Dir.hxx>
120 #include <gp_Dir2d.hxx>
121 #include <gp_Pln.hxx>
122 #include <gp_Pnt.hxx>
123 #include <gp_Sphere.hxx>
124 #include <gp_Torus.hxx>
125 #include <gp_Trsf.hxx>
126 #include <gp_Vec.hxx>
130 #include <TColgp_Array1OfPnt.hxx>
131 #include <TColStd_Array1OfReal.hxx>
132 #include <TColStd_Array1OfInteger.hxx>
133 #include <Geom_BSplineCurve.hxx>
134 #include <Geom_Line.hxx>
135 #include <BRepTools.hxx>//#16
136 #include <ShapeAnalysis.hxx>
138 #include <ShapeExtend_WireData.hxx>
139 #include <ShapeFix_Wire.hxx>
140 #include <Geom_TrimmedCurve.hxx>
141 #include <GeomConvert.hxx>
142 #include <GeomLib.hxx>
143 #include <BSplCLib.hxx>
145 #include <Message_Msg.hxx>
146 #include <IGESData_IGESModel.hxx>
148 #include <IGESGeom_CircularArc.hxx>
149 #include <ElCLib.hxx>
151 #include <BRepOffset_MakeOffset.hxx>
152 #include <BRep_Tool.hxx>
153 #include <Geom_BSplineSurface.hxx>
154 #include <ShapeAlgo.hxx>
155 #include <ShapeAlgo_AlgoContainer.hxx>
156 #include <BRepBuilderAPI_MakeFace.hxx>
157 #include <Geom_SurfaceOfRevolution.hxx>
159 //=======================================================================
160 //function : IGESToBRep_TopoSurface
162 //=======================================================================
164 IGESToBRep_TopoSurface::IGESToBRep_TopoSurface()
165 :IGESToBRep_CurveAndSurface()
170 //=======================================================================
171 //function : IGESToBRep_TopoSurface
173 //=======================================================================
175 IGESToBRep_TopoSurface::IGESToBRep_TopoSurface
176 (const IGESToBRep_CurveAndSurface& CS)
177 :IGESToBRep_CurveAndSurface(CS)
182 //=======================================================================
183 //function : IGESToBRep_TopoSurface
185 //=======================================================================
187 IGESToBRep_TopoSurface::IGESToBRep_TopoSurface
188 (const Standard_Real eps,
189 const Standard_Real epsCoeff,
190 const Standard_Real epsGeom,
191 const Standard_Boolean mode,
192 const Standard_Boolean modeapprox,
193 const Standard_Boolean optimized)
194 :IGESToBRep_CurveAndSurface(eps, epsCoeff, epsGeom, mode,
195 modeapprox, optimized)
199 static Standard_Boolean extractCurve3d (const TopoDS_Shape& theEdges,
200 Handle(Geom_Curve)& theCurve)
202 TopExp_Explorer anExp(theEdges, TopAbs_EDGE);
203 Standard_Integer howMuch = 0;
205 for (; anExp.More(); anExp.Next()) {
206 TopoDS_Edge anEdge = TopoDS::Edge(anExp.Current());
210 theCurve = BRep_Tool::Curve(anEdge, f, l);
212 if ( howMuch != 1 || theCurve.IsNull() )
213 return Standard_False;
215 if ( f != theCurve->FirstParameter() || l != theCurve->LastParameter() )
216 theCurve = new Geom_TrimmedCurve ( theCurve, f, l );
217 return Standard_True;
221 //=======================================================================
222 //function : TransferTopoSurface
224 //=======================================================================
226 TopoDS_Shape IGESToBRep_TopoSurface::TransferTopoSurface
227 (const Handle(IGESData_IGESEntity)& st)
228 { // Declaration of messages//
230 //Message_Msg msg1005("IGES_1005");
231 ////////////////////////////
237 Message_Msg msg1005("IGES_1005");
238 SendFail(st, msg1005);
240 ////modified by jgv, 20.11.2009 for OCC21487///
241 else if (HasShapeResult(st))
243 res = GetShapeResult(st);
246 ///////////////////////////////////////////////
247 else if (IGESToBRep::IsBasicSurface(st)) {
248 res = TransferTopoBasicSurface(st);
250 else if (st->IsKind(STANDARD_TYPE(IGESGeom_TrimmedSurface))) {
251 DeclareAndCast(IGESGeom_TrimmedSurface, st144, st);
252 res = TransferTrimmedSurface(st144);
254 else if (st->IsKind(STANDARD_TYPE(IGESGeom_SurfaceOfRevolution))) {
255 DeclareAndCast(IGESGeom_SurfaceOfRevolution, st120, st);
256 res = TransferSurfaceOfRevolution(st120);
258 else if (st->IsKind(STANDARD_TYPE(IGESGeom_TabulatedCylinder))) {
259 DeclareAndCast(IGESGeom_TabulatedCylinder, st122, st);
260 res = TransferTabulatedCylinder(st122);
262 else if (st->IsKind(STANDARD_TYPE(IGESGeom_RuledSurface))) {
263 DeclareAndCast(IGESGeom_RuledSurface, st118, st);
264 res = TransferRuledSurface(st118);
266 else if (st->IsKind(STANDARD_TYPE(IGESGeom_Plane))) {
267 DeclareAndCast(IGESGeom_Plane, st108, st);
268 res = TransferPlane(st108);
270 else if (st->IsKind(STANDARD_TYPE(IGESGeom_BoundedSurface))) {
271 DeclareAndCast(IGESGeom_BoundedSurface, st143, st);
272 res = TransferBoundedSurface(st143);
274 else if (st->IsKind(STANDARD_TYPE(IGESGeom_OffsetSurface))) {
275 DeclareAndCast(IGESGeom_OffsetSurface, st140, st);
276 res = TransferOffsetSurface(st140);
278 //S4181 pdn IGESSolid_PlaneSurface recognized as basic surface
279 else if (st->IsKind(STANDARD_TYPE(IGESBasic_SingleParent))) {
280 DeclareAndCast(IGESBasic_SingleParent,st402_9,st);
281 res = TransferPerforate(st402_9); // limite : Planes seulement
284 // AddFail(st, "The IGESEntity is not a Topologic Surface.");
286 SetShapeResult (st, res);
290 //=======================================================================
291 //function : TransferTopoBasicSurface
293 //=======================================================================
295 TopoDS_Shape IGESToBRep_TopoSurface::TransferTopoBasicSurface
296 (const Handle(IGESData_IGESEntity)& st)
297 { // Declaration of messages//
299 //Message_Msg msg1005("IGES_1005");
300 ////////////////////////////
305 Message_Msg msg1005("IGES_1005");
306 SendFail(st, msg1005);
309 if (!IGESToBRep::IsBasicSurface(st)) {
310 // AddFail(st, "BasicSurface Transfer Error : Not Allowed IGESEntity"); This message can not occur.
314 IGESToBRep_BasicSurface BS(*this);
316 Handle(Geom_Surface) surf = BS.TransferBasicSurface(st);
318 // AddFail(st, "Surface Conversion Error"); Messages have ever been Added in the called function.
322 //#9 rln 26/02/98 UKI60106
323 if (surf->Continuity() < GeomAbs_C1) {
324 Message_Msg msg1250("IGES_1250");
325 SendWarning(st, msg1250);
327 if(surf->IsKind(STANDARD_TYPE(Geom_Plane))){
331 B.UpdateFace(plane, surf, TopLoc_Location(), Precision::Confusion());
335 BRepLib_MakeFace makeFace(surf, Precision::Confusion());
336 res = makeFace.Face();
339 if (st->HasTransf()) {
342 if (IGESData_ToolLocation::ConvertLocation
343 (GetEpsilon(),st->CompoundLocation(),trsf,GetUnitFactor())) {
344 TopLoc_Location locFace(trsf);
348 Message_Msg msg1035("IGES_1035");
349 SendWarning(st, msg1035);
356 //=======================================================================
357 //function : TransferRuledSurface
359 //=======================================================================
360 static void reparamBSpline(Handle(Geom_Curve)& curve,
361 const Standard_Real First,
362 const Standard_Real Last)
364 Handle (Geom_BSplineCurve) bscurve;
365 if (!curve->IsKind (STANDARD_TYPE (Geom_BSplineCurve))) {
366 if (curve->FirstParameter() < First || curve->LastParameter() > Last)
367 curve = new Geom_TrimmedCurve (curve, First, Last);
368 bscurve = GeomConvert::CurveToBSplineCurve (curve, Convert_RationalC1);
371 bscurve = Handle (Geom_BSplineCurve)::DownCast (curve);
372 bscurve->Segment (First, Last);
375 if (bscurve.IsNull())
378 TColStd_Array1OfReal Knots(1, bscurve->NbKnots());
379 bscurve->Knots(Knots);
380 BSplCLib::Reparametrize (0., 1., Knots);
381 bscurve->SetKnots(Knots);
385 static void ReparamCurve(TopoDS_Edge& edge)
388 Standard_Real First, Last;
390 Handle (Geom_Curve) curve = Handle (Geom_Curve)::DownCast (BRep_Tool::Curve ( edge, L, First, Last )->Copy());
391 //if ( Abs (First) <= Precision::PConfusion() && Abs (Last - 1.) <= Precision::PConfusion() ) return;
392 if(!curve->IsKind(STANDARD_TYPE(Geom_Line))) return;
394 reparamBSpline( curve, First, Last );
397 B.UpdateEdge ( edge, curve, L, Precision::Confusion() );
398 B.Range ( edge, 0., 1 );
402 //=======================================================================
403 //function : TransferRuledSurface
405 //=======================================================================
407 TopoDS_Shape IGESToBRep_TopoSurface::TransferRuledSurface
408 (const Handle(IGESGeom_RuledSurface)& st)
409 { // Declaration of messages//
411 //Message_Msg msg1005("IGES_1005");
412 ////////////////////////////////
416 Message_Msg msg1005("IGES_1005");
417 SendFail(st, msg1005);
421 IGESToBRep_TopoCurve TC(*this);
423 TC.SetContinuity (0);
424 Handle(IGESData_IGESEntity) igesCurve1 = st->FirstCurve();
425 Handle(IGESData_IGESEntity) igesCurve2 = st->SecondCurve();
427 if (igesCurve1.IsNull()) {
428 Message_Msg msg148("XSTEP_148");
429 SendFail(st, msg148); // Curve Reading Error : Null IGESEntity
432 if (igesCurve2.IsNull()) {
433 Message_Msg msg149("XSTEP_149");
434 SendFail(st, msg149); // Curve Reading Error : Null IGESEntity
438 Standard_Integer nbEdges1, nbEdges2;
439 TopoDS_Shape shape1, shape2;
440 TopoDS_Wire wire1, wire2;
441 TopoDS_Wire newWire1, newWire2;
442 //TopoDS_Edge edge1, edge2; // skl
444 if (IGESToBRep::IsTopoCurve(igesCurve1)) {
445 shape1 = TC.TransferTopoCurve(igesCurve1);
446 if (shape1.IsNull()) {
447 Message_Msg msg1156("IGES_1156");
448 const Standard_CString typeName(igesCurve1->DynamicType()->Name());
449 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesCurve1);
450 msg1156.Arg(typeName);
452 SendFail(st, msg1156);
457 //added by rln on 03/12/97
458 //if shape1 is a wire it means that the curve1 in file was of continuity C0
459 //in order to get a face instead of shell when to BRepFill shape1
460 //should be retransfered with contionuity C0 (to get an edge). Once shape1
461 //has been built with C0, it is useless to require C1 from shape2 because
462 //anyway resulting surface was of continuity C0. Thus shape2 is built with C0
463 // if (shape1.ShapeType() != TopAbs_EDGE) {
464 // TC.SetContinuity (0);
465 // shape1 = TC.TransferTopoCurve(igesCurve1);
466 // if (shape1.IsNull()) {
467 // Message_Msg msg1156("IGES_1156");
468 // const Standard_CString typeName(igesCurve1->DynamicType()->Name());
469 // Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesCurve1);
470 // msg1156.Arg(typeName);
471 // msg1156.Arg(label);
472 // SendFail(st, msg1156);
476 // Message_Msg msg1250("IGES_1250");
477 // SendWarning (st, msg1250); // RuledSurface was built with continuity C0
481 TopAbs_ShapeEnum shapeEnum1 = shape1.ShapeType();
482 switch (shapeEnum1) {
485 TopoDS_Edge edge1 = TopoDS::Edge(shape1);
492 wire1 = TopoDS::Wire(shape1);
494 for (TopoDS_Iterator hulot(wire1); hulot.More(); hulot.Next()) {
495 TopoDS_Edge edge1 = TopoDS::Edge(hulot.Value());
503 // AddFail(st, "Curve Conversion Error."); This message can not occur.
506 //break; //szv#4:S4163:12Mar99 unreachable
510 Message_Msg msg148("XSTEP_148");
511 SendFail(st, msg148);
512 // Curve Type not Allowed.
516 if (IGESToBRep::IsTopoCurve(igesCurve2)) {
517 shape2 = TC.TransferTopoCurve(igesCurve2);
518 // dirflg = 0 join first to first, last to last
519 // dirflg = 1 join first to last, last to first
521 if (shape2.IsNull()) {
522 Message_Msg msg1156("IGES_1156");
523 const Standard_CString typeName(igesCurve2->DynamicType()->Name());
524 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesCurve2);
525 msg1156.Arg(typeName);
527 SendFail(st, msg1156);
528 // Curve Conversion Error.
531 Standard_Integer dirflag = st->DirectionFlag ();
532 // if (dirflag == 1){ // gka BUC60685
537 TopAbs_ShapeEnum shapeEnum2 = shape2.ShapeType();
538 switch (shapeEnum2) {
541 TopoDS_Edge edge2 = TopoDS::Edge(shape2);
550 wire2 = TopoDS::Wire(shape2);
552 for (TopoDS_Iterator cousto(wire2); cousto.More(); cousto.Next()) {
553 TopoDS_Edge edge2 = TopoDS::Edge(cousto.Value());
557 if (dirflag == 1) { //gka BUC60685
558 Handle(ShapeExtend_WireData) sewd2 = new ShapeExtend_WireData;
561 wire2 = sewd2->Wire();
567 // AddFail(st, "Curve Conversion Error.");
570 //break; //szv#4:S4163:12Mar99 unreachable
574 Message_Msg msg149("XSTEP_149");
575 SendFail(st, msg149);
576 // Curve Type not Allowed
581 if (nbEdges1 != nbEdges2) {
583 Handle(ShapeExtend_WireData) sewd1 = new ShapeExtend_WireData;
585 wire1 = sewd1->Wire();
587 else if (nbEdges2 == 1) {
588 Handle(ShapeExtend_WireData) sewd2 = new ShapeExtend_WireData;
590 wire2 = sewd2->Wire();
593 if (!st->IsRuledByParameter()) {
594 // AddWarning (st,"Compute by parametric constant ratio");
596 if (!ShapeAlgo::AlgoContainer()->HomoWires
597 (wire1, wire2, newWire1, newWire2, st->IsRuledByParameter())) {
598 Message_Msg msg1255("IGES_1255");// "Ruled Surface Construction Error");
599 SendFail(st, msg1255);
602 nbEdges1 = 2; // a number > 1
605 else if (nbEdges1 != 1) {
613 //:e3 abv 31 Mar 98: UK4.igs 3170: ruled surface with directixes - line
614 // In IGES, line is parametrised [0;1] - this should have been kept !
615 // Let us detect the case and remake curve as bspline [0;1]
616 for ( Standard_Integer i=1; i <=2; i++ ) {
617 //#43 rln 20.11.98 S4054 BUC50047 entity D463 (circles as generatrices [0, 2*PI])
618 //reparameterisation should be for all curves not with range [0, 1] (see IGES)
619 TopoDS_Edge edge = TopoDS::Edge ( i==1 ? shape1 : shape2 );
620 //ReparamCurve(edge);
622 Standard_Real First, Last;
623 Handle (Geom_Curve) curve = Handle (Geom_Curve)::DownCast (BRep_Tool::Curve ( edge, L, First, Last )->Copy());
624 if ( Abs (First) <= Precision::PConfusion() && Abs (Last - 1.) <= Precision::PConfusion() ) continue;
626 Handle (Geom_BSplineCurve) bscurve;
627 if (!curve->IsKind (STANDARD_TYPE (Geom_BSplineCurve))) {
628 if (curve->FirstParameter() < First || curve->LastParameter() > Last)
629 curve = new Geom_TrimmedCurve (curve, First, Last);
630 bscurve = GeomConvert::CurveToBSplineCurve (curve, Convert_RationalC1);
633 bscurve = Handle (Geom_BSplineCurve)::DownCast (curve);
634 bscurve->Segment (First, Last);
636 TColStd_Array1OfReal Knots(1, bscurve->NbKnots());
637 bscurve->Knots(Knots);
638 BSplCLib::Reparametrize (0., 1., Knots);
639 bscurve->SetKnots(Knots);
642 B.UpdateEdge ( edge, bscurve, L, Precision::Confusion() );
643 B.Range ( edge, 0., 1 );
644 if ( i ==1 ) shape1 = edge;
648 res = BRepFill::Face(TopoDS::Edge(shape1), TopoDS::Edge(shape2));
649 Handle(Geom_Surface) surf = BRep_Tool::Surface(TopoDS::Face(res));
650 if(surf->Continuity()==GeomAbs_C0) {
651 Message_Msg msg1250("IGES_1250");
652 SendWarning (st, msg1250);
656 res = BRepFill::Shell(newWire1, newWire2);
659 Message_Msg msg1255("IGES_1255");// "Ruled Surface Construction Error");
660 SendFail(st, msg1255);
665 if (st->HasTransf()) {
668 if (IGESData_ToolLocation::ConvertLocation
669 (GetEpsilon(),st->CompoundLocation(), trsf,GetUnitFactor())) {
670 TopLoc_Location shapeLoc(trsf);
674 Message_Msg msg1035("IGES_1035");
675 SendWarning(st,msg1035); // Transformation : not a similarity
682 //=======================================================================
683 //function : TransferSurfaceOfRevolution
685 //=======================================================================
687 TopoDS_Shape IGESToBRep_TopoSurface::TransferSurfaceOfRevolution
688 (const Handle(IGESGeom_SurfaceOfRevolution)& st)
689 { // Declaration of messages//
691 //Message_Msg msg1005("IGES_1005");
692 ////////////////////////////////
695 Message_Msg msg1005("IGES_1005");
696 SendFail(st, msg1005);
700 IGESToBRep_TopoCurve TC(*this);
701 IGESToBRep_BasicCurve BC(*this);
702 Handle(IGESData_IGESEntity) igesGeneratrix = st->Generatrix();
703 Handle(IGESGeom_Line) igesAxis = st->AxisOfRevolution();
705 if (igesGeneratrix.IsNull() || !IGESToBRep::IsTopoCurve(igesGeneratrix) ) {
706 Message_Msg msg153("XSTEP_153");
707 SendFail(st, msg153);
708 // Generatrix Reading Error : Null IGESEntity
709 // Generatrix : Not Allowed IGESEntity.
713 DeclareAndCast(IGESGeom_Line,srgen,st->Generatrix());
714 if (!srgen.IsNull()) {
715 gp_Pnt gen1 = srgen->StartPoint();
716 gp_Pnt gen2 = srgen->EndPoint();
717 TheULength = gen1.Distance(gen2)*GetUnitFactor();
720 if (igesAxis.IsNull()) {
721 Message_Msg msg152("XSTEP_152");
722 SendFail(st, msg152);
728 TopoDS_Shape generatrix = TC.TransferTopoCurve(igesGeneratrix);
729 if (generatrix.IsNull()) {
730 Message_Msg msg1156("IGES_1156");
731 const Standard_CString typeName("generatrix");
732 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesGeneratrix);
733 msg1156.Arg(typeName);
735 SendFail(st, msg1156);
736 // Generatrix Conversion Error.
741 gp_Pnt pt1 = igesAxis->TransformedStartPoint(); //smh#11
742 gp_Pnt pt2 = igesAxis->TransformedEndPoint(); //smh#11
743 pt1.Scale(gp_Pnt(0,0,0),GetUnitFactor());
744 pt2.Scale(gp_Pnt(0,0,0),GetUnitFactor());
745 //#30 rln 19.10.98 To keep IGES surface normal CAS.CADE axis = reversed IGES axis
746 //CAS.CADE SA = 2*PI - IGES TA
747 //CAS.CADE TA = 2*PI - IGES SA
748 //gp_Ax1 revolAxis(pt1, gp_Dir(gp_Vec(pt1, pt2)));
749 //Standard_Real startAngle = st->StartAngle();
750 //Standard_Real endAngle = st->EndAngle();
751 gp_Ax1 revolAxis(pt1, gp_Dir( gp_Vec (pt2, pt1)));
752 Standard_Real startAngle = 2 * M_PI - st->EndAngle();
753 Standard_Real endAngle = 2 * M_PI - st->StartAngle();
754 Standard_Real deltaAngle = endAngle - startAngle;
755 Standard_Boolean IsFullAngle = ( deltaAngle > 2.*M_PI-Precision::PConfusion() );
756 if (IsFullAngle) deltaAngle = 2.*M_PI; // ** CKY 18-SEP-1996
757 // il faudra translater les courbes 2d de startAngle pour
758 // etre en phase IGES et BRep
759 startLoc.SetRotation(revolAxis, startAngle);
760 generatrix.Move(startLoc);
762 // PTV file D44-11325-6.igs OCC660 depends on OCC450
763 // PTV 29.05.2002 OCC450 create Surface of Revolution by native API
764 // file NIC_file5.igs
765 // (BRepPrimAPI_MakeRevol replace surface of revolution by plane then 3D and 2D curves are inconsistent;
766 // and 3D is ignored. As result shape is rectangle instead circle shape.
767 Handle(Geom_Curve) aBasisCurve;
773 if (extractCurve3d(generatrix, aBasisCurve))
775 BRepBuilderAPI_MakeFace aMakeF;
776 Handle(Geom_Surface) aResultSurf =
777 new Geom_SurfaceOfRevolution(aBasisCurve, revolAxis);
779 if ( !aResultSurf.IsNull())
783 const Standard_Real VF = aBasisCurve->FirstParameter();
784 const Standard_Real VL = aBasisCurve->LastParameter();
786 // PTV 29.08.2002 begin of OCC663 Trim surface by correct parameters
787 const Standard_Real UF = 0;
788 const Standard_Real UL = endAngle - startAngle;
789 // PTV 29.08.2002 end of OCC663
791 aMakeF = BRepBuilderAPI_MakeFace(aResultSurf, UF,
792 UL, VF, VL, Precision::Confusion());
796 aMakeF = BRepBuilderAPI_MakeFace(aResultSurf, Precision::Confusion());
801 }//if ( !aResultSurf.IsNull())
802 }//if (extractCurve3d(generatrix, aBasisCurve))
804 catch (Standard_Failure)
807 cout << "Warning: IgesToBRep_TopoSurface::"
808 "TransferSurfaceOfRevolution(): exception by Geom: ";
809 Standard_Failure::Caught()->Print ( cout ); cout << endl;
811 }//catch (Standard_Failure)
814 if ( res.IsNull() ) {
817 BRepPrimAPI_MakeRevol revol(generatrix, revolAxis, deltaAngle);
818 //mjm: si debug IsDone()est fait :
819 // if (!revol.IsDone()) {
820 // AddFail(st, "Revol Construction Error.");
826 if (res.ShapeType() == TopAbs_FACE) {
827 Handle(Geom_Surface) surf = BRep_Tool::Surface(TopoDS::Face(res));
828 if(surf->Continuity()==GeomAbs_C0) {
829 Message_Msg msg1250("IGES_1250");
830 SendWarning (st, msg1250);
834 if (st->HasTransf()) {
837 if (IGESData_ToolLocation::ConvertLocation
838 (GetEpsilon(), st->CompoundLocation(), trsf, GetUnitFactor())) {
839 TopLoc_Location shapeLoc(trsf);
843 Message_Msg msg1035("IGES_1035");
844 SendWarning(st,msg1035); // Transformation : not a similarity
852 //=======================================================================
853 //function : TransferTabulatedCylinder
855 //=======================================================================
857 TopoDS_Shape IGESToBRep_TopoSurface::TransferTabulatedCylinder
858 (const Handle(IGESGeom_TabulatedCylinder)& st)
859 { // Declaration of messages//
861 //Message_Msg msg1005("IGES_1005");
862 ////////////////////////////////
865 Message_Msg msg1005("IGES_1005");
866 SendFail(st, msg1005);
870 IGESToBRep_TopoCurve TC(*this);
871 // TopoDS_Edge firstEdge;//commented by rln on 02/12/97
873 Handle(IGESData_IGESEntity) igesDirectrix = st->Directrix();
874 if (igesDirectrix.IsNull() || !IGESToBRep::IsTopoCurve(igesDirectrix) ) {
875 Message_Msg msg153("XSTEP_153");
876 SendFail(st, msg153);
877 // Directrix Reading Error : Null IGESEntity
878 //Directrix, not allowed IGESEntity
884 TopoDS_Shape directrix = TC.TransferTopoCurve(igesDirectrix);
885 if (directrix.IsNull()) {
886 Message_Msg msg1156("IGES_1156");
887 const Standard_CString typeName("directrix");
888 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesDirectrix);
889 msg1156.Arg(typeName);
891 SendFail(st, msg1156);
892 // Directrix Conversion Error.
896 //modified by rln on 03/12/97
897 //TopoDS_Vertex firstVertex = TopExp::FirstVertex(firstEdge);
898 TopoDS_Vertex firstVertex, lastVertex;
899 ShapeAnalysis::FindBounds (directrix, firstVertex, lastVertex);
900 gp_Pnt pt1 = BRep_Tool::Pnt(firstVertex);
901 gp_Pnt pt2 = st->EndPoint();
902 pt2.Scale(gp_Pnt(0,0,0),GetUnitFactor());
904 TheULength = pt1.Distance(pt2);
905 if(TheULength < Precision::Confusion()) {
906 Message_Msg msg("Tabulated cylinder with zero length");
907 SendFail (st, msg); // TabulatedCylinder was built with continuity C0
911 // PTV file D44-11325-6.igs OCC660 depends on OCC450
912 // PTV 29.05.2002 OCC450 create Surface of LinearExtrusion by native API
913 // see description about problem in Surface of Revolution
914 Handle(Geom_Curve) aBasisCurve;
918 if (extractCurve3d(directrix, aBasisCurve)) {
919 gp_Vec dir (pt1, pt2);
920 Handle(Geom_Surface) aResultSurf =
921 new Geom_SurfaceOfLinearExtrusion(aBasisCurve, dir);
922 if (!aResultSurf.IsNull()) {
924 // new Geom_RectangularTrimmedSurface(aResultSurf,
925 // aBasisCurve->FirstParameter(),
926 // aBasisCurve->LastParameter(),
927 // 0., dir.Magnitude() );
928 BRepBuilderAPI_MakeFace aMakeF(aResultSurf, aBasisCurve->FirstParameter(),
929 aBasisCurve->LastParameter(),
931 Precision::Confusion());
937 catch (Standard_Failure) {
939 cout << "Warning: IgesToBRep_TopoSurface::TransferTabulatedCylinder(): exception by Geom: ";
940 Standard_Failure::Caught()->Print ( cout ); cout << endl;
945 if ( res.IsNull() ) {
947 BRepPrimAPI_MakePrism prism(directrix, gp_Vec(pt1, pt2));
948 //mjm: si debug IsDone() est fait
949 // if (!prism.IsDone()) {
950 // AddFail(st, "Prism Construction Error.");
955 //#16 rln 08/04/98 coq-inf-support.igs entity 2105
956 //CAS.CADE can parametrize SurfaceOfLinearExtrusion with generatrix opposite to Vec(pt1, pt2)
957 //and with parametrization V > 0, while in IGES TabulatedCylinder is parametrized with positive V
958 //direction exactly in the direction Vec(pt1, pt2)
959 if (res.ShapeType() == TopAbs_FACE) {
960 Standard_Real UMin, UMax, VMin, VMax;
961 BRepTools::UVBounds (TopoDS::Face (res), UMin, UMax, VMin, VMax);
962 if (VMax <= Precision::PConfusion() && VMin < -Precision::PConfusion()) {
966 Handle(Geom_Surface) surf = BRep_Tool::Surface(TopoDS::Face(res));
967 if(surf->Continuity()==GeomAbs_C0) {
968 Message_Msg msg1250("IGES_1250");
969 SendWarning (st, msg1250);
973 if (st->HasTransf()) {
976 if (IGESData_ToolLocation::ConvertLocation
977 (GetEpsilon(),st->CompoundLocation(), trsf, GetUnitFactor())) {
978 TopLoc_Location shapeLoc(trsf);
982 Message_Msg msg1035("IGES_1035");
983 SendWarning(st,msg1035); // Transformation : not a similarity
990 //=======================================================================
991 //function : TransferOffsetSurface
993 //=======================================================================
995 TopoDS_Shape IGESToBRep_TopoSurface::TransferOffsetSurface
996 (const Handle(IGESGeom_OffsetSurface)& st)
997 { // Declaration of messages//
999 //Message_Msg msg1005("IGES_1005");
1000 ////////////////////////////////
1003 Message_Msg msg1005("IGES_1005");
1004 SendFail(st, msg1005);
1008 TopoDS_Shape igesShape;
1010 TopLoc_Location basisLoc;
1012 Handle (IGESData_IGESEntity) igesSrf = st->Surface();
1013 if (igesSrf.IsNull() || !IGESToBRep::IsTopoSurface(igesSrf) ) {
1014 Message_Msg msg164("XSTEP_164");
1015 SendFail(st, msg164);
1016 // Basis Surface Reading Error : Null IGESEntity
1017 // Basis Surface Transfer Error : Not Allowed IGESEntity
1021 igesShape = TransferTopoSurface(igesSrf);
1022 if (igesShape.IsNull()) {
1023 Message_Msg msg1156("IGES_1156");
1024 const Standard_CString typeName("basis surface");
1025 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesSrf);
1026 msg1156.Arg(typeName);
1028 SendFail(st, msg1156); // Basis Surface Conversion Error.
1032 TopAbs_ShapeEnum shapeEnum = igesShape.ShapeType();
1033 switch (shapeEnum) {
1036 face = TopoDS::Face(igesShape);
1041 SendWarning(st, "The First Surface only will be transfered.");
1042 TopoDS_Iterator dabovil(igesShape);
1043 if (dabovil.More()) {
1044 face = TopoDS::Face(dabovil.Value());
1047 /* else AddF("... */
1051 Message_Msg msg1156("IGES_1156");
1052 const Standard_CString typeName("basis surface");
1053 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesSrf);
1054 msg1156.Arg(typeName);
1056 SendFail(st, msg1156); // Basis Surface Conversion Error.
1062 //Handle(Geom_Surface) geomSupport = BRep_Tool::Surface(face, basisLoc);
1063 // attention on ne peut construire une Geom_OffsetSurface que
1064 // si la surface de base est au moins C1, sinon on plante !
1065 //#56 rln 25.12.98 UKI60878 entity D593 (Offset surface on C0 B-Spline)
1066 //Trying to eliminate previous limitation on processing only C1 surfaces
1067 Handle(Geom_Surface) geomSupport = BRep_Tool::Surface(face);
1068 Handle(Geom_OffsetSurface) basisSrf;
1070 if (geomSupport->IsKind(STANDARD_TYPE(Geom_OffsetSurface))) {
1071 DeclareAndCast(Geom_OffsetSurface, geom140, geomSupport);
1072 geom140->SetOffsetValue(basisSrf->Offset() +
1073 st->Distance()*GetUnitFactor());
1077 if (geomSupport->Continuity() == GeomAbs_C0) {
1078 res = ShapeAlgo::AlgoContainer()->C0ShapeToC1Shape (face, Abs (st->Distance()) * GetUnitFactor());
1079 if(res.ShapeType()!=TopAbs_FACE) {
1080 Message_Msg msg1266("IGES_1266");
1081 SendFail(st, msg1266);//Basis surface is C0-continuous and cannot be corrected to C1-continuous.
1085 geomSupport = BRep_Tool::Surface (TopoDS::Face(res));
1086 if (geomSupport->Continuity() == GeomAbs_C0) {
1087 Message_Msg msg1266("IGES_1266");
1088 SendFail(st, msg1266);//Basis surface is C0-continuous and cannot be corrected to C1-continuous.
1093 Message_Msg msg1267("IGES_1267");
1094 SendWarning(st, msg1267);//Basis surface is C0-continuous but was corrected to C1-continuous
1097 if (res.IsNull()) res = face;
1098 geomSupport = BRep_Tool::Surface (TopoDS::Face(res));
1099 Standard_Real umin, umax, vmin, vmax;
1100 geomSupport->Bounds (umin, umax, vmin, vmax);
1101 if (Precision::IsInfinite (umin) || Precision::IsInfinite (umax) ||
1102 Precision::IsInfinite (vmin) || Precision::IsInfinite (vmax)) {
1103 // convert to C1 B-Spline
1104 BRepTools::UVBounds (face, umin, umax, vmin, vmax);
1105 Handle(Geom_RectangularTrimmedSurface) TS = new Geom_RectangularTrimmedSurface (geomSupport, umin, umax, vmin, vmax);
1106 Handle (Geom_BSplineSurface) BS = ShapeAlgo::AlgoContainer()->ConvertSurfaceToBSpline(TS, umin, umax, vmin, vmax);
1107 if (BS.IsNull() || BS->Continuity() == GeomAbs_C0) {
1108 Message_Msg msg1265("IGES_1265");
1109 SendFail(st, msg1265); // OffsetSurface Construction Error.
1116 basisSrf = new Geom_OffsetSurface(geomSupport, st->Distance()*GetUnitFactor());
1119 BRepLib_MakeFace MF(basisSrf, Precision::Confusion());
1121 Message_Msg msg1265("IGES_1265");
1122 SendFail(st, msg1265); // OffsetSurface Construction Error.
1128 if (st->HasTransf()) {
1131 if (IGESData_ToolLocation::ConvertLocation
1132 (GetEpsilon(),st->CompoundLocation(),trsf, GetUnitFactor())) {
1133 TopLoc_Location loc2(trsf);
1137 Message_Msg msg1035("IGES_1035");
1138 SendWarning(st,msg1035); // Transformation : not a similarity
1145 //=======================================================================
1146 //function : TransferTrimmedSurface
1148 //=======================================================================
1150 TopoDS_Shape IGESToBRep_TopoSurface::TransferTrimmedSurface
1151 (const Handle(IGESGeom_TrimmedSurface)& st)
1152 { // Declaration of messages//
1154 //Message_Msg msg1005("IGES_1005");
1155 ////////////////////////////////
1158 Message_Msg msg1005("IGES_1005");
1159 SendFail(st, msg1005);
1163 TopAbs_ShapeEnum shapeEnum;
1164 IGESToBRep_TopoCurve TC(*this);
1166 Handle (IGESData_IGESEntity) igesSurface = st->Surface();
1167 if (igesSurface.IsNull() || !IGESToBRep::IsTopoSurface(igesSurface) ) {
1168 Message_Msg msg169("XSTEP_169");
1169 SendFail(st, msg169);
1170 // BasicSurface Transfer Error : Null IGESEntity
1171 // Basis Surface, not Allowed IGESEntity.
1175 Standard_Real uFact;
1176 TopoDS_Face face, faceres;
1178 TopoDS_Shape myshape = ParamSurface(igesSurface, trans, uFact);
1180 if (!myshape.IsNull()) {
1181 shapeEnum = myshape.ShapeType();
1182 switch (shapeEnum) {
1185 face = TopoDS::Face(myshape);
1191 TopoDS_Iterator IT(myshape);
1192 Standard_Integer nbfaces = 0;
1193 for (; IT.More(); IT.Next()) {
1195 face = TopoDS::Face(IT.Value());
1198 //szv#4:S4163:12Mar99 optimized
1200 Message_Msg msg1156("IGES_1156");
1201 const Standard_CString typeName("basis surface");
1202 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesSurface);
1203 msg1156.Arg(typeName);
1205 SendFail(st, msg1156); // Not Implemented Trimmed Composite Surface.
1212 Message_Msg msg1156("IGES_1156");
1213 const Standard_CString typeName("basis surface");
1214 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesSurface);
1215 msg1156.Arg(typeName);
1217 SendFail(st, msg1156); // Basis Surface Conversion Error.
1226 //obtaining a surface
1228 Handle(Geom_Surface) aSurf = BRep_Tool::Surface(face, L);
1229 TC.SetSurface(aSurf);
1231 if (st->HasOuterContour()) {
1233 TopoDS_Shape myshape1 = TC.TransferCurveOnFace (face, st->OuterContour(), trans, uFact, Standard_False);
1234 // si ca se passe mal , on recupere au moins la face avec NaturalRestriction
1235 if (myshape1 .IsNull()) face = faceres;
1237 for (Standard_Integer i = 1; i <= st->NbInnerContours(); i++) {
1238 TopoDS_Shape myshape2 = TC.TransferCurveOnFace (face, st->InnerContour(i), trans, uFact, Standard_False);
1240 BRepTools::Update ( face ); //:p4
1246 //=======================================================================
1247 //function : TransferBoundedSurface
1249 //=======================================================================
1251 TopoDS_Shape IGESToBRep_TopoSurface::TransferBoundedSurface
1252 (const Handle(IGESGeom_BoundedSurface)& st)
1253 { // Declaration of messages//
1255 //Message_Msg msg1005("IGES_1005");
1256 ////////////////////////////////
1259 Message_Msg msg1005("IGES_1005");
1260 SendFail(st, msg1005);
1264 if (st->RepresentationType()==0) {
1265 Message_Msg msg1275("IGES_1275");
1266 SendWarning(st, msg1275);
1267 // Model Space Representation Not Implemented : the result will be the basis surface
1270 TopAbs_ShapeEnum shapeEnum;
1271 IGESToBRep_TopoCurve TC(*this);
1272 Handle (IGESData_IGESEntity) igesSrf = st->Surface();
1273 if (igesSrf.IsNull() || !IGESToBRep::IsTopoSurface(igesSrf) ) {
1274 Message_Msg msg166("XSTEP_166");
1275 SendFail( st, msg166);
1276 // Basis Surface Transfer Error : Null IGESEntity.
1277 // Basis Surface Transfer Error : Not Allowed IGESEntity.
1281 Standard_Real uFact;
1284 TopoDS_Shape myshape = ParamSurface(igesSrf, trans, uFact);
1286 if (myshape.IsNull()) {
1287 //#55 rln 24.12.98 UKI60878 entity D593
1289 cout << "Fail: IGESToBRep_TopoSurface::TransferBoundedSurface UntrimmedSurface is translated into Null" << endl;
1294 shapeEnum = myshape.ShapeType();
1295 switch (shapeEnum) {
1298 face = TopoDS::Face(myshape);
1303 TopoDS_Iterator IT(myshape);
1304 Standard_Integer nbfaces = 0;
1305 for (; IT.More(); IT.Next()) {
1307 face = TopoDS::Face(IT.Value());
1309 //szv#4:S4163:12Mar99 optimized
1311 Message_Msg msg1156("IGES_1156");
1312 const Standard_CString typeName("basis surface");
1313 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesSrf);
1314 msg1156.Arg(typeName);
1316 SendFail(st, msg1156);
1317 // Not Implemented Trimmed Composite Surface.
1324 Message_Msg msg1156("IGES_1156");
1325 const Standard_CString typeName("basis surface");
1326 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(igesSrf);
1327 msg1156.Arg(typeName);
1329 SendFail(st, msg1156);
1336 for (Standard_Integer i = 1; i <= st->NbBoundaries(); i++)
1337 TC.TransferBoundaryOnFace(face, st->Boundary(i), trans, uFact);
1339 BRepTools::Update ( face ); //:p4
1340 //#22 rln 01.06.98 UK3.igs entity 1279
1341 // ShapeFix_Face sff ( face );
1342 // sff.FixMissingSeam(); //:l1 abv 10 Jan 99: USA60022 7289: fix missing seam
1343 // if(sff.FixSmallAreaWire()) { //%14 pdn 24.02,99: USA60293: fix small area wires.
1344 // AddFail(st, "Small area wire detected, dropped");
1346 // sff.FixOrientation();
1347 // face = sff.Face();
1353 //=======================================================================
1354 //function : TransferPlane
1356 //=======================================================================
1358 TopoDS_Shape IGESToBRep_TopoSurface::TransferPlane
1359 (const Handle(IGESGeom_Plane)& st)
1360 { // Declaration of messages//
1362 //Message_Msg msg1005("IGES_1005");
1363 ////////////////////////////////
1366 Message_Msg msg1005("IGES_1005");
1367 SendFail(st, msg1005);
1373 res = TransferPlaneParts (st, pln,trsf,Standard_True);
1374 // res contient (en principe ...) une Face avec eventuellement un Wire
1375 // il reste a la mettre en position
1376 if (trsf.Form() != gp_Identity) {
1377 TopLoc_Location loc(trsf);
1384 //=======================================================================
1385 //function : TransferPlaneSurface
1386 //purpose : this function transferred into IGESToBRep_BasicSurface
1387 //=======================================================================
1390 //=======================================================================
1391 //function : TransferPerforate
1393 //=======================================================================
1395 TopoDS_Shape IGESToBRep_TopoSurface::TransferPerforate
1396 (const Handle(IGESBasic_SingleParent)& st)
1397 { // Declaration of messages//
1399 //Message_Msg msg1005("IGES_1005");
1400 ////////////////////////////////
1403 Message_Msg msg1005("IGES_1005");
1404 SendFail(st, msg1005);
1411 DeclareAndCast(IGESGeom_Plane,p0,st->SingleParent());
1414 Message_Msg msg206("XSTEP_206");
1415 SendFail(st, msg206);
1416 // SingleParent does not describe a holed face
1419 res = TransferPlaneParts (p0,pln,trsf,Standard_True);
1420 //res demarre avec la face et son contour externe
1421 Standard_Integer nb = st->NbChildren();
1422 for (Standard_Integer i = 1; i <= nb; i ++) {
1423 DeclareAndCast(IGESGeom_Plane,pi,st->Child(i));
1425 Message_Msg msg1285("IGES_1285");
1427 // A child is not a Plane, skipped, n0 %d
1428 SendWarning(st,msg1285);
1433 TopoDS_Shape wire = TransferPlaneParts (pi,pli,trsi,Standard_False);
1434 // si ce n est pas un Wire, sauter
1435 if (wire.ShapeType() != TopAbs_WIRE) {
1436 Message_Msg msg1156("IGES_1156");
1437 const Standard_CString typeName("hole");
1438 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(pi);
1439 msg1156.Arg(typeName);
1441 SendWarning(st, msg1156);
1442 // A hole could not be transferred, skipped, n0 %d
1445 // coplanaires ? verifier
1446 if (!pln.Position().IsCoplanar(pli.Position(),GetEpsGeom(),GetEpsilon())) {
1447 Message_Msg msg1295("IGES_1295");
1449 SendWarning(st,msg1295);
1450 // "A hole is not well coplanar to the face, n0 %d",i);
1452 // Ne pas oublier de composer la transformation locale a ce Wire
1453 if (trsi.Form() != gp_Identity) {
1454 TopLoc_Location locw(trsi);
1455 wire.Location(locw);
1459 // Enfin, appliquer la trsf globale
1460 if (trsf.Form() != gp_Identity) {
1461 TopLoc_Location loc(trsf);
1468 //=======================================================================
1469 //function : TransferPlaneParts
1471 //=======================================================================
1472 TopoDS_Shape IGESToBRep_TopoSurface::TransferPlaneParts(const Handle(IGESGeom_Plane)& st,
1475 const Standard_Boolean first)
1476 { // Declaration of messages//
1478 //Message_Msg msg1005("IGES_1005");
1479 ////////////////////////////////
1482 Message_Msg msg1005("IGES_1005");
1483 SendFail(st, msg1005);
1487 Standard_Real a, b, c, d;
1488 // equation de Geom : ax + by + cz + d = 0.0;
1489 // equation de IGES : ax + by + cz = d;
1490 st->Equation(a, b, c, d);
1491 pln = gp_Pln(a, b, c, -d);
1497 B.MakeFace(plane); // Just to create a empty Plane with a Tshape.
1498 Handle (Geom_Plane) geomPln = new Geom_Plane(pln);
1499 geomPln->Scale(gp_Pnt(0,0,0),GetUnitFactor());
1500 // ATTENTION, ici on CALCULE la trsf, on ne l`applique pas ...
1501 //S4054: B.UpdateFace (plane, geomPln, TopLoc_Location(),
1502 //GetEpsGeom()*GetUnitFactor());
1503 B.UpdateFace (plane, geomPln, TopLoc_Location(), Precision::Confusion());
1504 //:3 by ABV 5 Nov 97: set Infinite() flag (see below for unsetting)
1505 plane.Infinite ( Standard_True ); //:3
1508 // ATTENTION, ici on CALCULE la trsf, on ne l'appliquera qu'a la fin !
1509 if (st->HasTransf()) {
1511 if (!IGESData_ToolLocation::ConvertLocation
1512 (GetEpsilon(), st->CompoundLocation(),trsf,GetUnitFactor())) {
1513 Message_Msg msg1035("IGES_1035");
1514 SendWarning(st,msg1035); // Transformation : not a similarity
1518 if (st->HasBoundingCurve()) {
1519 IGESToBRep_TopoCurve TC(*this);
1520 Handle(IGESData_IGESEntity) crv = st->BoundingCurve();
1523 Message_Msg msg1300("IGES_1300");
1524 SendWarning(st,msg1300);
1525 //:4 by ABV 5 Nov 97: plane cannot be trimmed - let it be infinite
1526 //:4 NOTE: NB "else"
1531 if (IGESToBRep::IsTopoCurve(crv)) {
1533 if (crv->IsKind(STANDARD_TYPE(IGESGeom_CurveOnSurface))) {
1534 DeclareAndCast(IGESGeom_CurveOnSurface, crv142, crv);
1535 TopoDS_Shape myshape = TC.TransferCurveOnFace (plane, crv142, trans, TheULength, Standard_False);
1537 //:3 by ABV 5 Nov 97: set plane to be finite
1539 TopExp_Explorer ws ( plane, TopAbs_WIRE );
1540 if ( ws.More() ) plane.Infinite ( Standard_False );
1544 TopoDS_Shape shape = TC.TransferTopoCurve(crv);
1545 TopAbs_ShapeEnum shapeEnum = shape.ShapeType();
1546 switch (shapeEnum) {
1549 TopoDS_Edge edge = TopoDS::Edge(shape);
1550 Handle(ShapeExtend_WireData) sewd = new ShapeExtend_WireData;
1552 wire = sewd->Wire();
1557 wire = TopoDS::Wire(shape);
1562 Message_Msg msg1156("IGES_1156");
1563 const Standard_CString typeName("Bounding curve");
1564 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(crv);
1565 msg1156.Arg(typeName);
1567 SendWarning(st, msg1156);
1568 if (first) res = plane;
1573 //S4054 CTS18953 entity 14
1574 Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire;
1576 sfw->FixConnected (GetMaxTol());
1578 BRepLib_MakeFace MF(pln, wire, Standard_False);
1580 // AddFail(st, "Plane Construction Error.");
1584 TopoDS_Face F = MF.Face();
1586 BRepGProp::SurfaceProperties(F,G);
1588 if(!st->HasBoundingCurveHole())
1592 if( st->HasBoundingCurveHole())
1594 //:3 by ABV 5 Nov 97: set plane to be finite
1595 //:3 if (first) B.Add (plane,wire);
1597 B.Add ( plane, wire );
1598 plane.Infinite ( Standard_False );
1600 //BRepLib_MakeFace MP(pln, wire);
1601 //plane = MP.Face();
1605 Message_Msg msg1156("IGES_1156");
1606 const Standard_CString typeName("Bounding curve");
1607 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(crv);
1608 msg1156.Arg(typeName);
1610 SendWarning(st, msg1156);
1611 // Plane Cannot Be Trimmed.
1615 if (first) res = plane;
1621 //=======================================================================
1622 //function : ParamSurface
1624 //=======================================================================
1625 TopoDS_Shape IGESToBRep_TopoSurface::ParamSurface(const Handle(IGESData_IGESEntity)& st,
1627 Standard_Real& uFact)
1628 { // Declaration of messages//
1630 //Message_Msg msg1005("IGES_1005");
1631 ////////////////////////////////
1635 TopoDS_Shape basisSurface = TransferTopoSurface(st);
1636 Standard_Real uscale = 1.;
1637 Standard_Real cscale = TheULength;
1638 if (basisSurface.IsNull()) {
1639 Message_Msg msg1005("IGES_1005");
1640 SendFail(st, msg1005);
1644 TopAbs_ShapeEnum shapeEnum;
1645 shapeEnum = basisSurface.ShapeType();
1647 switch (shapeEnum) {
1650 face = TopoDS::Face(basisSurface);
1655 TopoDS_Iterator IT(basisSurface);
1656 Standard_Integer nbfaces = 0;
1657 for (; IT.More(); IT.Next()) {
1659 face = TopoDS::Face(IT.Value());
1661 //szv#4:S4163:12Mar99 optimized
1663 Message_Msg msg1156("IGES_1156");
1664 const Standard_CString typeName("basis surface");
1665 Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(st);
1666 msg1156.Arg(typeName);
1668 SendWarning(st, msg1156);
1669 return basisSurface;
1675 //AddFail(st, "Basis Surface Transfer Error.");
1680 //S4181 pdn 19.04.99 defining shift of parametric space on base
1681 // of CAS.CADE type of surface
1682 Standard_Real paramu = 0., paramv = 0.;
1684 TopoDS_Edge theedge;
1685 Handle(Geom_Surface) Surf = BRep_Tool::Surface(face);
1687 if (Surf->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) {
1688 DeclareAndCast(Geom_RectangularTrimmedSurface, rectang, Surf);
1689 Surf = rectang->BasisSurface();
1692 if ((Surf->IsKind(STANDARD_TYPE(Geom_CylindricalSurface))) ||
1693 (Surf->IsKind(STANDARD_TYPE(Geom_ConicalSurface))) ||
1694 (Surf->IsKind(STANDARD_TYPE(Geom_ToroidalSurface))) ||
1695 (Surf->IsKind(STANDARD_TYPE(Geom_SphericalSurface)))) {
1697 for ( TE.Init(face,TopAbs_EDGE); TE.More(); TE.Next()){
1698 TopoDS_Edge myedge = TopoDS::Edge(TE.Current());
1699 Standard_Real First, Last;
1700 Handle(Geom2d_Curve) Curve2d = BRep_Tool::CurveOnSurface
1701 (myedge, face, First, Last);
1702 if ( Curve2d->IsKind(STANDARD_TYPE(Geom2d_Line))) {
1703 DeclareAndCast(Geom2d_Line, Line2d, Curve2d);
1704 if (Line2d->Direction().IsParallel(gp::DY2d(),Precision::Angular())){
1711 Standard_Real First, Last;
1712 Handle(Geom_Curve) Curve3d = BRep_Tool::Curve(theedge, First, Last);
1713 if (Precision::IsNegativeInfinite(First)) First = 0.;
1715 if (Surf->IsKind(STANDARD_TYPE(Geom_CylindricalSurface))){
1716 DeclareAndCast(Geom_CylindricalSurface, Cyl, Surf);
1717 gp_Cylinder TheCyl = Cyl->Cylinder();
1718 ElSLib::CylinderParameters(TheCyl.Position(),
1720 Curve3d->Value(First), paramu , paramv );
1723 else if (Surf->IsKind(STANDARD_TYPE(Geom_ConicalSurface))){
1724 DeclareAndCast(Geom_ConicalSurface, Cone, Surf);
1725 gp_Cone TheCone = Cone->Cone();
1726 ElSLib::ConeParameters(TheCone.Position(),
1727 TheCone.RefRadius(),
1728 TheCone.SemiAngle(),
1729 Curve3d->Value(First), paramu , paramv );
1732 else if (Surf->IsKind(STANDARD_TYPE(Geom_ToroidalSurface))){
1733 DeclareAndCast(Geom_ToroidalSurface, Tore, Surf);
1734 gp_Torus TheTore = Tore->Torus();
1735 ElSLib::TorusParameters(TheTore.Position(),
1736 TheTore.MajorRadius(),
1737 TheTore.MinorRadius(),
1738 Curve3d->Value(First), paramu , paramv );
1740 else if (Surf->IsKind(STANDARD_TYPE(Geom_SphericalSurface)) &&
1741 //: abv 18.06.02: loopback on s1.brep BRep mode, face 32 - the spherical surface (192)
1742 //: in IGES is from [-90,90] by V, i.e. similar to OCC, thus only scaling is enough
1743 ! st->IsKind (STANDARD_TYPE(IGESSolid_SphericalSurface)) ) {
1744 DeclareAndCast(Geom_SphericalSurface, Sphere, Surf);
1745 gp_Sphere TheSphere = Sphere->Sphere();
1746 ElSLib::SphereParameters(TheSphere.Position(),
1748 Curve3d->Value(First), paramu , paramv );
1751 //#88 rln 06.04.99 CTS60168, BLEND.IGS entity 68
1752 //Generatrix is Transformed Circular Arc. When creating CAS.CADE surface parameterization
1754 if (st->IsKind (STANDARD_TYPE (IGESGeom_SurfaceOfRevolution))) {
1755 DeclareAndCast (IGESGeom_SurfaceOfRevolution, revol, st);
1756 Handle(IGESData_IGESEntity) generatrix = revol->Generatrix();
1757 if (generatrix->IsKind (STANDARD_TYPE (IGESGeom_CircularArc))) {
1758 DeclareAndCast (IGESGeom_CircularArc, circ, generatrix);
1759 gp_Pnt2d startpoint = circ->StartPoint();
1760 paramv -= ElCLib::Parameter (gp_Circ2d (gp_Ax2d (circ->Center(), gp_Dir2d(1,0)), circ->Radius()), startpoint);
1761 if (Surf->IsKind (STANDARD_TYPE(Geom_SphericalSurface)))
1762 paramv += ShapeAnalysis::AdjustToPeriod(paramv, - M_PI, M_PI);
1763 else if (Surf->IsKind (STANDARD_TYPE(Geom_ToroidalSurface)))
1764 paramv += ShapeAnalysis::AdjustToPeriod(paramv, 0, M_PI * 2);
1767 else if (st->IsKind (STANDARD_TYPE (IGESGeom_TabulatedCylinder))) {
1768 DeclareAndCast (IGESGeom_TabulatedCylinder, cylinder, st);
1769 Handle(IGESData_IGESEntity) directrix = cylinder->Directrix();
1770 if (directrix->IsKind (STANDARD_TYPE (IGESGeom_CircularArc))) {
1771 DeclareAndCast (IGESGeom_CircularArc, circ, directrix);
1772 gp_Pnt2d startpoint = circ->StartPoint();
1773 paramu -= ElCLib::Parameter (gp_Circ2d (gp_Ax2d (circ->Center(), gp_Dir2d(1,0)), circ->Radius()), startpoint);
1774 paramu += ShapeAnalysis::AdjustToPeriod(paramu, 0, M_PI * 2);
1780 if ( Abs(paramu) <= Precision::Confusion()) paramu = 0.;
1781 if ( Abs(paramv) <= Precision::Confusion()) paramv = 0.;
1783 //S4181 pdn 16.04.99 computation of transformation depending on
1784 //IGES Type of surface
1785 Handle(IGESData_IGESEntity) isrf = st;
1786 if (isrf->IsKind(STANDARD_TYPE(IGESGeom_OffsetSurface))){
1787 DeclareAndCast(IGESGeom_OffsetSurface, offsurf, isrf);
1788 isrf = offsurf->Surface();
1790 if (isrf->IsKind(STANDARD_TYPE(IGESGeom_SurfaceOfRevolution))) {
1791 DeclareAndCast(IGESGeom_SurfaceOfRevolution, st120, isrf);
1792 //S4181 pdn 19.04.99 defining transformation matrix
1794 tmp.SetTranslation(gp_Vec2d (0, -2 * M_PI));
1795 trans.PreMultiply(tmp);
1796 tmp.SetMirror(gp::OX2d());
1797 trans.PreMultiply(tmp);
1798 tmp.SetMirror(gp_Ax2d (gp::Origin2d(), gp_Dir2d (1.,1.)));
1799 trans.PreMultiply(tmp);
1802 //CAS.CADE SA = 2*PI - IGES TA
1803 //paramu = st120->StartAngle();
1804 paramu = -(2 * M_PI - st120->EndAngle());
1809 if (isrf->IsKind(STANDARD_TYPE(IGESGeom_RuledSurface))) {
1813 // corrected skl 13.11.2001 for BUC61054
1814 if (isrf->IsKind(STANDARD_TYPE(IGESGeom_TabulatedCylinder))) {
1815 Handle(IGESGeom_TabulatedCylinder) igtc = Handle(IGESGeom_TabulatedCylinder)::DownCast(isrf);
1816 Handle(IGESData_IGESEntity) idie = igtc->Directrix();
1817 Standard_Real uln=1;
1818 Standard_Real Umin,Umax,Vmin,Vmax;
1819 //scaling parameterization from [0,1]
1820 Surf->Bounds(Umin,Umax,Vmin,Vmax);
1821 uln = Abs(Umax-Umin);
1822 //computing shift of pcurves
1823 uscale = uln/cscale;
1827 if (isrf->IsKind(STANDARD_TYPE(IGESSolid_CylindricalSurface))||
1828 isrf->IsKind(STANDARD_TYPE(IGESSolid_ConicalSurface))) {
1832 if (isrf->IsKind(STANDARD_TYPE(IGESSolid_SphericalSurface))) {
1837 if (isrf->IsKind(STANDARD_TYPE(IGESSolid_ToroidalSurface))) {
1839 tmp.SetTranslation(gp_Vec2d (0, -360.)); // in IGES terms
1840 trans.PreMultiply(tmp);
1841 tmp.SetMirror(gp::OX2d());
1842 trans.PreMultiply(tmp);
1843 tmp.SetMirror(gp_Ax2d (gp::Origin2d(), gp_Dir2d (1.,1.)));
1844 trans.PreMultiply(tmp);
1846 paramv = paramv*180./M_PI;
1852 tmp.SetTranslation(gp_Pnt2d(0.,0.), gp_Pnt2d(paramu,paramv));
1853 trans.PreMultiply(tmp);
1855 tmp.SetScale(gp_Pnt2d(0,0),cscale);
1856 trans.PreMultiply(tmp);