]> OCCT Git - occt.git/commitdiff
0033326: Data Exchange, IGES Import - Ignoring unit value for validating geometry
authordpasukhi <dpasukhi@opencascade.com>
Wed, 8 Feb 2023 17:42:55 +0000 (17:42 +0000)
committerdpasukhi <dpasukhi@opencascade.com>
Thu, 9 Mar 2023 16:00:39 +0000 (16:00 +0000)
Updated IGESToBRep_BasicCurve and Surface to work with geometry as is not scaled yet.
Updated IGESControl_IGESBoundary to check existence of fields w/o number of iteration.
Scaling appends only after creating geometry, that is why we need to compare with no scaled value

src/IGESControl/IGESControl_IGESBoundary.cxx
src/IGESToBRep/IGESToBRep_BasicCurve.cxx
src/IGESToBRep/IGESToBRep_BasicSurface.cxx
tests/bugs/iges/bug33326 [new file with mode: 0644]

index bdcae284d958e51c6639bf9df0390c9a441f175b..1fd082252b35b12d869ce6eef6c3372ebd496abe 100644 (file)
@@ -150,6 +150,7 @@ static Standard_Boolean Connect (const Handle(ShapeAnalysis_Wire)& theSAW,
                                                      const Standard_Integer number,
                                                      Handle(ShapeExtend_WireData)& Gsewd) 
 {
+  (void)number;
   Gsewd                                = new ShapeExtend_WireData;//local translation (for mysewd)
   Handle(ShapeExtend_WireData) Gsewd3d = new ShapeExtend_WireData;//local translation (for mysewd3d)
   Handle(ShapeExtend_WireData) Gsewd2d = new ShapeExtend_WireData;//local translation (for mysewd2d)
@@ -384,17 +385,31 @@ static Standard_Boolean Connect (const Handle(ShapeAnalysis_Wire)& theSAW,
     }
   }
   
-  if (number > 1) {
-    okCurve   = okCurve && Connect (saw, mysewd, Gsewd, (len3d > 1) || (len2d > 1), maxtol,
-      distmin, revsewd, revnextsewd);
+  if (!mysewd.IsNull())
+  {
+    okCurve = okCurve && Connect(saw, mysewd, Gsewd, (len3d > 1) || (len2d > 1), maxtol,
+                                 distmin, revsewd, revnextsewd);
+  }
+  else
+  {
+    mysewd = Gsewd;
+  }
+  if (!mysewd3d.IsNull())
+  {
     okCurve3d = okCurve3d && Connect (saw3d, mysewd3d, Gsewd3d, len3d > 1, maxtol,
       distmin, revsewd, revnextsewd);
+  }
+  else
+  {
+    mysewd3d = Gsewd3d;
+  }
+  if (!mysewd2d.IsNull())
+  {
     okCurve2d = okCurve2d && Connect (saw2d, mysewd2d, Gsewd2d, len2d > 1, maxtol,
       distmin, revsewd, revnextsewd);
   }
-  else {
-    mysewd   = Gsewd;
-    mysewd3d = Gsewd3d;
+  else
+  {
     mysewd2d = Gsewd2d;
   }
   return okCurve;
index 5dd82b3e2d96c54606b72172ad1b6bb1594ebe68..3d151e60e25e14bfb9319d9d3270e09abc298fd0 100644 (file)
@@ -1249,7 +1249,7 @@ Handle(Geom_Curve)  IGESToBRep_BasicCurve::TransferLine
 
   // modif du 15/10/97  : test moins severe
   // beaucoup de points confondus a GetEpsGeom()*GetUnitFactor()
-  if (!Ps.IsEqual(Pe,Precision::Confusion())) { //:l3 abv 11 Jan 99: GetEpsGeom()*GetUnitFactor()/10.)) {
+  if (!Ps.IsEqual(Pe,Precision::Confusion() / GetUnitFactor())) { //:l3 abv 11 Jan 99: GetEpsGeom()*GetUnitFactor()/10.)) {
     gp_Lin line(Ps, gp_Dir(gp_Vec(Ps,Pe)));
     Standard_Real t1 = ElCLib::Parameter(line, Ps);
     Standard_Real t2 = ElCLib::Parameter(line, Pe);
@@ -1299,7 +1299,7 @@ Handle(Geom2d_Curve)  IGESToBRep_BasicCurve::Transfer2dLine
                 start->EndPoint().Y());
   }
 
-  if (!beg.IsEqual(end,Precision::PConfusion())) { //:l3 abv 11 Jan 99: GetEpsCoeff())) {
+  if (!beg.IsEqual(end,Precision::PConfusion() / GetUnitFactor())) { //:l3 abv 11 Jan 99: GetEpsCoeff())) {
     gp_Lin2d line2d(beg, gp_Dir2d(gp_Vec2d(beg,end)));
     Standard_Real t1 = ElCLib::Parameter(line2d, beg);
     Standard_Real t2 = ElCLib::Parameter(line2d, end);
index 8e5b0be91468b8a06622d9feff4ac92edf324206..b10587eb8c73da7692f896150a5d8f4cafd5d19b 100644 (file)
@@ -312,7 +312,7 @@ Handle(Geom_CylindricalSurface) IGESToBRep_BasicSurface::TransferRigthCylindrica
     // Direction Reading Error : Null IGESEntity
     return res;
   }
-  if (radius < Precision::Confusion()) {
+  if (radius < (Precision::Confusion() / GetUnitFactor())) {
     return res;
   }
     
@@ -374,7 +374,7 @@ Handle(Geom_ConicalSurface) IGESToBRep_BasicSurface::TransferRigthConicalSurface
   if (radius < 0) {
     return res;
   }
-  if (radius < Precision::Confusion())
+  if (radius < (Precision::Confusion() / GetUnitFactor()))
     radius = 0.;
   
   gp_Pnt Pt = Point->Value();
@@ -427,7 +427,7 @@ Handle(Geom_SphericalSurface) IGESToBRep_BasicSurface::TransferSphericalSurface
     // Direction Reading Error : Null IGESEntity
     return res;
   }
-  if (radius < Precision::Confusion()){
+  if (radius < (Precision::Confusion() / GetUnitFactor())){
    
     return res;
   }
@@ -483,7 +483,7 @@ Handle(Geom_ToroidalSurface) IGESToBRep_BasicSurface::TransferToroidalSurface
     // Direction Reading Error : Null IGESEntity
     return res;
   }
-  if (major < Precision::Confusion()||minor < Precision::Confusion()){
+  if (major < (Precision::Confusion() / GetUnitFactor()) || minor < (Precision::Confusion() / GetUnitFactor())){
    
     return res;
   }
diff --git a/tests/bugs/iges/bug33326 b/tests/bugs/iges/bug33326
new file mode 100644 (file)
index 0000000..b1ddac6
--- /dev/null
@@ -0,0 +1,17 @@
+puts "==================================================="
+puts "0033326: Data Exchange, IGES Import - Ignoring unit value for validating geometry"
+puts "==================================================="
+puts ""
+
+pload DCAF
+
+Close D -silent
+
+ReadIges D [locate_data_file "bug33326.igs"]
+vclear
+vinit View1
+XDisplay -dispMode 1 D
+vfit
+vdump "$imagedir/${casename}_src.png"
+
+Close D