]> OCCT Git - occt.git/commitdiff
0029233: Incorrect result of conversion to the STEP format.
authorasemenov <asemenov@opencascade.com>
Thu, 2 Sep 2021 12:32:11 +0000 (15:32 +0300)
committersmoskvin <smoskvin@opencascade.com>
Fri, 10 Sep 2021 17:24:53 +0000 (20:24 +0300)
Modified the method TopoDSToStep_MakeStepFace::Init
Added processing of degenerate toroidal surfaces, which are the base surfaces of offset surfaces
Added test

src/TopoDSToStep/TopoDSToStep_MakeStepFace.cxx
tests/bugs/step/bug29233 [new file with mode: 0644]

index a562a599e525209ec6a4414f71b6819a979ee979..5cf564b01fd25f524575f569d8cab224b7fdbb6b 100644 (file)
@@ -63,6 +63,7 @@
 #include <StepGeom_Surface.hxx>
 #include <StepGeom_SurfaceCurve.hxx>
 #include <StepGeom_ToroidalSurface.hxx>
+#include <Geom_OffsetSurface.hxx>
 #include <StepRepr_DefinitionalRepresentation.hxx>
 #include <StepRepr_HArray1OfRepresentationItem.hxx>
 #include <StepShape_AdvancedFace.hxx>
@@ -211,40 +212,63 @@ void TopoDSToStep_MakeStepFace::Init(const TopoDS_Face& aFace,
   //%pdn 30 Nov 98: TestRally 9 issue on r1001_ec.stp: 
   // toruses with major_radius < minor are re-coded as degenerate
   // rln 19.01.99: uncomment %30 pdn for integration into K4L
-  if(Spms->IsKind(STANDARD_TYPE(StepGeom_ToroidalSurface))) {
-    Handle(StepGeom_ToroidalSurface) trsf = Handle(StepGeom_ToroidalSurface)::DownCast(Spms);
-    Standard_Real R = trsf->MajorRadius();
-    Standard_Real r = trsf->MinorRadius();
-    if ( R < r ) { // if torus is degenerate, make revolution instead
-      Handle(Geom_ToroidalSurface) TS = Handle(Geom_ToroidalSurface)::DownCast(Su);
+{
+  // If the surface is Offset it is necessary to check the base surface 
+  Standard_Boolean aSurfaceIsOffset = Standard_False;
+  Handle(Geom_OffsetSurface) anOffsetSu;
+  if (Su->IsKind(STANDARD_TYPE(Geom_OffsetSurface)))
+  {
+    aSurfaceIsOffset = Standard_True;
+    anOffsetSu = Handle(Geom_OffsetSurface)::DownCast(Su);
+  }
+  if ((Spms->IsKind(STANDARD_TYPE(StepGeom_ToroidalSurface))) ||
+     ((aSurfaceIsOffset) && anOffsetSu->BasisSurface()->IsKind(STANDARD_TYPE(Geom_ToroidalSurface))))
+  {
+    Handle(Geom_ToroidalSurface) TS;
+    if (aSurfaceIsOffset)
+      TS = Handle(Geom_ToroidalSurface)::DownCast(anOffsetSu->BasisSurface());
+    else
+      TS = Handle(Geom_ToroidalSurface)::DownCast(Su);
+    Standard_Real R = TS->MajorRadius();
+    Standard_Real r = TS->MinorRadius();
+    if (R < r) // if torus is degenerate or base surface is degenerate, make revolution instead
+    { 
       gp_Ax3 Ax3 = TS->Position();
       gp_Pnt pos = Ax3.Location();
       gp_Dir dir = Ax3.Direction();
-      gp_Dir X   = Ax3.XDirection();
-      
+      gp_Dir X = Ax3.XDirection();
       // create basis curve
       Standard_Real UF, VF, UL, VL;
-      ShapeAlgo::AlgoContainer()->GetFaceUVBounds ( aFace, UF, UL, VF, VL );
-      gp_Ax2 Ax2 ( pos.XYZ() + X.XYZ() * TS->MajorRadius(), X ^ dir, X );
-      Handle(Geom_Curve) BasisCurve = new Geom_Circle ( Ax2, TS->MinorRadius() );
-      
+      ShapeAlgo::AlgoContainer()->GetFaceUVBounds(aFace, UF, UL, VF, VL);
+      gp_Ax2 Ax2(pos.XYZ() + X.XYZ() * TS->MajorRadius(), X ^ dir, X);
+      Handle(Geom_Curve) BasisCurve = new Geom_Circle(Ax2, TS->MinorRadius());
       // convert basis curve to bspline in order to avoid self-intersecting
       // surface of revolution (necessary e.g. for CATIA)
-      if ( VL - VF - 2 * M_PI < -Precision::PConfusion() ) 
-       BasisCurve = ShapeAlgo::AlgoContainer()->ConvertCurveToBSpline (BasisCurve, VF, VL, Precision::Approximation(),
-                                                                       GeomAbs_C1, 100, 9);
-//     BasisCurve = new Geom_TrimmedCurve ( BasisCurve, VF, VL );
+      if (VL - VF - 2 * M_PI < -Precision::PConfusion())
+        BasisCurve = ShapeAlgo::AlgoContainer()->ConvertCurveToBSpline(BasisCurve, VF, VL, Precision::Approximation(),
+                                                                       GeomAbs_C1, 100, 9);
+      //BasisCurve = new Geom_TrimmedCurve ( BasisCurve, VF, VL );
 
       // create surface of revolution
       gp_Ax1 Axis = Ax3.Axis();
-      if ( ! Ax3.Direct() ) Axis.Reverse();
-      Handle(Geom_SurfaceOfRevolution) Rev = new Geom_SurfaceOfRevolution ( BasisCurve, Axis );
-      
+      if (!Ax3.Direct()) Axis.Reverse();
+      Handle(Geom_SurfaceOfRevolution) Rev = new Geom_SurfaceOfRevolution(BasisCurve, Axis);
+
       // and translate it
-      GeomToStep_MakeSurface MkRev(Rev);
-      Spms = MkRev.Value();
+      if (aSurfaceIsOffset)
+      {
+        anOffsetSu->SetBasisSurface(Rev);
+        GeomToStep_MakeSurface MkRev(anOffsetSu);
+        Spms = MkRev.Value();
+      }
+      else
+      {
+        GeomToStep_MakeSurface MkRev(Rev);
+        Spms = MkRev.Value();
+      }
     }
   }
+}
 
   // ----------------
   // Translates Wires
diff --git a/tests/bugs/step/bug29233 b/tests/bugs/step/bug29233
new file mode 100644 (file)
index 0000000..441e5da
--- /dev/null
@@ -0,0 +1,15 @@
+puts "============"
+puts "OCC29233"
+puts "============"
+puts ""
+#####################################################
+# Incorrect result of conversion to the STEP format.
+#####################################################
+
+restore [locate_data_file bug29233.brep] orig
+set aTmpFile "$imagedir/${casename}.brep"
+testwritestep "$aTmpFile" orig
+testreadstep  "$aTmpFile" result
+file delete   "$aTmpFile"
+checknbshapes result -face 22
+checkmaxtol result -ref 1.e-7
\ No newline at end of file