]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
PAL8395: Improve CheckCompoundOfBlocks and RemoveExtraEdges. Improvement done by...
authorjfa <jfa@opencascade.com>
Wed, 16 Mar 2005 12:55:58 +0000 (12:55 +0000)
committerjfa <jfa@opencascade.com>
Wed, 16 Mar 2005 12:55:58 +0000 (12:55 +0000)
src/GEOMAlgo/BlockFix_CheckTool.cdl
src/GEOMAlgo/BlockFix_CheckTool.cxx
src/GEOMAlgo/BlockFix_CheckTool.hxx
src/GEOMAlgo/BlockFix_SphereSpaceModifier.cxx

index 959ada7235ffbcf83f719fefde67a5e45a7d61e7..d05d517fd4084203be393ba4a257e2fc07ed1156 100644 (file)
@@ -38,6 +38,7 @@ fields
     myNbSolids   : Integer;
     myNbBlocks   : Integer;
     myPossibleBlocks : SequenceOfShape from TopTools;
+    myNbDegen    : Integer;
     myNbUF       : Integer;
     myNbUE       : Integer;
     myNbUFUE     : Integer;
index ba902ba5ab6edd47d314af5e5d70eb3babb03bcd..2c386c961faf38cd532a88223f8a803d4f0e60c1 100644 (file)
@@ -54,6 +54,7 @@ void BlockFix_CheckTool::Perform()
 {
   myNbSolids=0;
   myNbBlocks=0;
+  myNbDegen=0;
   myNbUF=0;
   myNbUE=0;
   myNbUFUE=0;
@@ -108,13 +109,29 @@ void BlockFix_CheckTool::Perform()
       }
     }
 
-    Standard_Integer ne=0;
+    Standard_Integer nbe=0;
+    TopTools_MapOfShape DegenEdges;
     TopExp_Explorer expe;
-    for(expe.Init(aSolid, TopAbs_EDGE); expe.More(); expe.Next()) ne++;
-    ne = ne/2;
-    if(ne<12)
+    for(expe.Init(aSolid, TopAbs_EDGE); expe.More(); expe.Next()) {
+      TopoDS_Edge E = TopoDS::Edge(expe.Current());
+      if(BRep_Tool::Degenerated(E)) {
+        if(!DegenEdges.Contains(E)) {
+          DegenEdges.Add(E);
+        }
+      }
+      else {
+        nbe++;
+      }
+    }
+    if( nbe==24 && DegenEdges.Extent()>0 ) {
+      IsBlock=Standard_False;
+      myNbDegen++;
+      myPossibleBlocks.Append(aSolid);
+      continue;
+    }
+    if(nbe<24)
       IsBlock=Standard_False;
-    if(ne>12) {
+    if(nbe>24) {
       IsBlock=Standard_False;
       // check edges unification
       // creating map of edge faces
@@ -141,13 +158,13 @@ void BlockFix_CheckTool::Perform()
             }
           }
         }
-        Standard_Integer i = 1;
-        for (; i <= aMapFacesEdges.Extent(); i++) {
+        Standard_Integer i=1;
+        for(; i<=aMapFacesEdges.Extent(); i++) {
           const TopTools_ListOfShape& ListEdges = aMapFacesEdges.FindFromIndex(i);
-          if (ListEdges.Extent() > 1) break;
+          if(ListEdges.Extent()>1) break;
         }
-        if (i <= aMapFacesEdges.Extent()) {
-          MayBeUE = Standard_True;
+        if(i<=aMapFacesEdges.Extent()) {
+          MayBeUE=Standard_True;
           break;
         }
       }
@@ -214,11 +231,11 @@ void BlockFix_CheckTool::DumpCheckResult(Standard_OStream& S) const
     S<<"  total number of solids = "<<myNbSolids<<endl;
     S<<"  including: number of good blocks = "<<myNbBlocks<<endl;
     S<<"             number of possible blocks = "<<NbPossibleBlocks()<<endl;
-    Standard_Integer nbtmp = myNbSolids - myNbBlocks - NbPossibleBlocks();
-    S<<"             number of impossible blocks = "<<nbtmp<<endl;
-    S<<"             including: need unionfaces = "<<myNbUF<<endl;
+    S<<"             including: need remove degenerative = "<<myNbDegen<<endl;
+    S<<"                        need unionfaces = "<<myNbUF<<endl;
     S<<"                        need unionedges = "<<myNbUE<<endl;
     S<<"                        need both unionfaces and unionedges = "<<myNbUFUE<<endl;
+    Standard_Integer nbtmp = myNbSolids - myNbBlocks - NbPossibleBlocks();
+    S<<"             number of impossible blocks = "<<nbtmp<<endl;
   }
 }
-
index 9e761893133bd0e0ffd4ad49602c90868dc892fc..bfb538bab0cf9c34be8e1f13d3120f51953faf89 100644 (file)
@@ -99,6 +99,7 @@ Standard_Boolean myHasCheck;
 Standard_Integer myNbSolids;
 Standard_Integer myNbBlocks;
 TopTools_SequenceOfShape myPossibleBlocks;
+Standard_Integer myNbDegen;
 Standard_Integer myNbUF;
 Standard_Integer myNbUE;
 Standard_Integer myNbUFUE;
index c5f774d82de9dcd1ea4ad732878f54e03006da56..fb9e3f27fa4ade1656bbf7010f2b1f0676231834 100644 (file)
@@ -65,16 +65,35 @@ static Standard_Boolean ModifySurface(const TopoDS_Face& aFace,
     ShapeAnalysis::GetFaceUVBounds(aFace,Umin, Umax, Vmin, Vmax);
     Standard_Real PI2 = PI/2.;
     if(Vmax > PI2 - Precision::PConfusion() || Vmin < -PI2+::Precision::PConfusion()) {
+      Handle(Geom_SphericalSurface) aSphere = Handle(Geom_SphericalSurface)::DownCast(S);
+      gp_Sphere sp = aSphere->Sphere();
+      gp_Ax3 ax3 = sp.Position();
       if(Abs(Vmax-Vmin) < PI2) {
-        Handle(Geom_SphericalSurface) aSphere = Handle(Geom_SphericalSurface)::DownCast(S);
-        gp_Sphere sp = aSphere->Sphere();
-        gp_Ax3 ax3 = sp.Position();
         gp_Ax3 axnew3(ax3.Axis().Location(), ax3.Direction()^ax3.XDirection(),ax3.XDirection());
         sp.SetPosition(axnew3);
         Handle(Geom_SphericalSurface) aNewSphere = new Geom_SphericalSurface(sp);
         aNewSurface = aNewSphere;
         return Standard_True;
       }
+      else {
+        gp_Pnt PC = ax3.Location();
+        Standard_Real Vpar;
+        if(fabs(PI2-Vmax)>fabs(-PI2-Vmin))
+          Vpar = (PI2+Vmax)/2.;
+        else
+          Vpar = (-PI2+Vmin)/2.;
+        Standard_Real Upar = (Umin+Umax)/2.;;
+        gp_Pnt PN,PX;
+        S->D0(Upar,Vpar,PN);
+        S->D0(Upar+PI2,0.,PX);
+        gp_Dir newNorm(gp_Vec(PC,PN));
+        gp_Dir newDirX(gp_Vec(PC,PX));
+        gp_Ax3 axnew3(ax3.Axis().Location(), newNorm, newDirX);
+        sp.SetPosition(axnew3);
+        Handle(Geom_SphericalSurface) aNewSphere = new Geom_SphericalSurface(sp);
+        aNewSurface = aNewSphere;
+        return Standard_True;
+      }
     }
   }
   return Standard_False;
@@ -221,4 +240,3 @@ GeomAbs_Shape BlockFix_SphereSpaceModifier::Continuity(const TopoDS_Edge& E,cons
 {
   return BRep_Tool::Continuity(E,F1,F2);
 }
-