0023129: BRepTools::OuterShell() works wrong - it always returns the first shell
authorpkv <pkv@opencascade.com>
Thu, 27 Sep 2012 08:03:12 +0000 (12:03 +0400)
committerpkv <pkv@opencascade.com>
Thu, 27 Sep 2012 08:03:12 +0000 (12:03 +0400)
src/BRepClass3d/BRepClass3d.cdl
src/BRepClass3d/BRepClass3d.cxx [new file with mode: 0644]
src/BRepTest/BRepTest_ShellCommands.cxx

index 057789d..c435db5 100755 (executable)
@@ -46,22 +46,19 @@ is
        DataMap from TCollection(Shape          from TopoDS,
                                Address        from Standard,
                                 ShapeMapHasher from TopTools);
-                               
 
     class SolidExplorer;
         
-    class SolidPassiveClassifier instantiates Classifier3d from TopClass
-       (Intersector3d  from BRepClass3d);
+    class SolidPassiveClassifier instantiates  
+       Classifier3d from TopClass  (Intersector3d  from BRepClass3d);
 
-    ---class SClassifier instantiates SolidClassifier from TopClass
-    ---   (SolidExplorer from BRepClass3d,
-    ---        Intersector3d from BRepClass3d);
-     
-    
     class SClassifier;       
 
     class SolidClassifier;
-    
        
+    OuterShell(S : Solid from TopoDS)  
+           returns Shell from TopoDS;
+       ---Purpose: Returns the outer most shell of <S>. Returns a Null
+       --          shell if <S> has no outer shell. 
        
 end BRepClass3d;
diff --git a/src/BRepClass3d/BRepClass3d.cxx b/src/BRepClass3d/BRepClass3d.cxx
new file mode 100644 (file)
index 0000000..cffa340
--- /dev/null
@@ -0,0 +1,112 @@
+// Created on: 1993-01-21
+// Created by: Peter KURNEV
+// Copyright (c) 1993-1999 Matra Datavision
+// Copyright (c) 1999-2012 OPEN CASCADE SAS
+//
+// The content of this file is subject to the Open CASCADE Technology Public
+// License Version 6.5 (the "License"). You may not use the content of this file
+// except in compliance with the License. Please obtain a copy of the License
+// at http://www.opencascade.org and read it completely before using this file.
+//
+// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
+// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+//
+// The Original Code and all software distributed under the License is
+// distributed on an "AS IS" basis, without warranty of any kind, and the
+// Initial Developer hereby disclaims all such warranties, including without
+// limitation, any warranties of merchantability, fitness for a particular
+// purpose or non-infringement. Please see the License for the specific terms
+// and conditions governing the rights and limitations under the License.
+
+// File:       BRepClass3d.cxx
+// Created:    Thu Sep 20 10:05:46 2012
+// Author:     
+//             <pkv@PETREX>
+
+#include <BRepClass3d.ixx>
+
+
+#include <TopAbs_State.hxx>
+#include <TopAbs_Orientation.hxx>
+
+#include <TopoDS_Solid.hxx>
+#include <TopoDS_Shell.hxx>
+#include <TopoDS_Iterator.hxx>
+
+#include <BRep_Builder.hxx>
+#include <BRepClass3d_SolidClassifier.hxx>
+
+
+static 
+  Standard_Boolean IsInternal(const TopoDS_Shell& aSx);
+
+//=======================================================================
+//function : OuterShell
+//purpose  : 
+//=======================================================================
+TopoDS_Shell BRepClass3d::OuterShell(const TopoDS_Solid& aSolid)
+{
+  Standard_Boolean bFound;
+  Standard_Real aTol;
+  TopoDS_Solid aSDx;
+  TopoDS_Shell aShell, aDummy;
+  TopoDS_Iterator aIt;
+  BRep_Builder aBB;
+  BRepClass3d_SolidClassifier aSC;
+  //
+  if (aSolid.IsNull()) {
+    return aDummy;
+  }
+  //
+  aTol=1.e-7;
+  bFound=Standard_False;
+  //
+  aIt.Initialize(aSolid);
+  for (; aIt.More(); aIt.Next()) { 
+    const TopoDS_Shape& aSx=aIt.Value();
+    if (aSx.ShapeType()==TopAbs_SHELL) {
+      aShell=*((TopoDS_Shell*)&aSx);
+      if (!IsInternal(aShell)) {
+       aSDx=aSolid;
+       aSDx.EmptyCopy();
+       aBB.Add(aSDx, aShell);
+       //
+       aSC.Load(aSDx);
+       aSC.PerformInfinitePoint(aTol);
+       if(aSC.State()==TopAbs_OUT) {
+         bFound=Standard_True;
+         break;
+       }
+      }
+    }
+  }
+  //
+  if (!bFound) {
+    return aDummy;
+  } 
+  //
+  return aShell;
+}
+
+//=======================================================================
+//function : IsInternal
+//purpose  : 
+//=======================================================================
+Standard_Boolean IsInternal(const TopoDS_Shell& aSx)
+{
+  Standard_Boolean bInternal;
+  TopAbs_Orientation aOr;
+  TopoDS_Iterator aIt; 
+  //
+  bInternal=Standard_False;
+  //
+  aIt.Initialize(aSx);
+  for (; aIt.More(); aIt.Next()) {
+    const TopoDS_Shape& aSy=aIt.Value();
+    aOr=aSy.Orientation();
+    bInternal=(aOr==TopAbs_INTERNAL);
+    break;
+  }    
+  //
+  return bInternal;
+}
index 81fccdc..2cde4c9 100755 (executable)
 #include <TopAbs.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS.hxx>
+#include <TopoDS_Shell.hxx>
+#include <TopoDS_Solid.hxx>
+#include <BRepClass3d.hxx>
 
+//
+static 
+  Standard_Boolean issame(TopoDS_Face& face, 
+                         TopoDS_Face& newface);
+static 
+  TopoDS_Face findface(TopoDS_Shape& shape, 
+                      TopoDS_Face& face);
+//
+static Standard_Integer shell(Draw_Interpretor&, Standard_Integer, const char** );
+static Standard_Integer outershell(Draw_Interpretor&, Standard_Integer, const char** );
 
+//=======================================================================
+//function : ShellCommands
+//purpose  : 
+//=======================================================================
+void BRepTest::ShellCommands(Draw_Interpretor& theCommands)
+{
+  static Standard_Boolean loaded = Standard_False;
+  if (loaded) return;
+  loaded = Standard_True;
 
+  const char* g = "Projection of wire commands";
 
-static Standard_Boolean issame(TopoDS_Face& face, TopoDS_Face& newface)
-{
-  TopExp_Explorer exp(face,TopAbs_VERTEX),newexp(newface,TopAbs_VERTEX);
-  Standard_Integer newcounter=0,counter=0;
-  for (;exp.More();exp.Next())
-    {
-      counter++;
-      gp_Pnt p(BRep_Tool::Pnt(TopoDS::Vertex(exp.Current())));
-      for (;newexp.More();newexp.Next())
-       {
-         gp_Pnt newp(BRep_Tool::Pnt(TopoDS::Vertex(newexp.Current())));
-         if (p.IsEqual(newp,1e-7))
-           {
-             newcounter++;
-             break;
-           };
-       };
-    };
-  if (counter==newcounter)
-    return Standard_True;
-  return Standard_False;
-}
+  theCommands.Add("shell","Make shell on bugged object",  __FILE__, shell,g);
+  theCommands.Add("outershell","use outershell r s",  __FILE__, outershell,g);
 
-static TopoDS_Face findface(TopoDS_Shape& shape, TopoDS_Face& face)
-{
-  TopoDS_Face newface;
-  TopExp_Explorer exp(shape,TopAbs_FACE);
-  for (;exp.More();exp.Next())
-    {
-      newface = TopoDS::Face(exp.Current());
-      if (issame(face,newface))
-       {
-         break;
-       };
-    };
-  return newface;
+}
+//modified by NIZNHY-PKV Thu Sep 20 10:44:11 2012f
+//=======================================================================
+//function : outershell
+//purpose  : 
+//=======================================================================
+Standard_Integer outershell(Draw_Interpretor& di, Standard_Integer n, const char** a)
+{  
+  TopoDS_Shape aS;
+  TopoDS_Solid aSd;
+  TopoDS_Shell aSh;
+  //
+  if (n!=3) {
+    di << " use outershell r s\n";
+    return 1;
+  }
+  //
+  aS=DBRep::Get(a[2]);
+  if (aS.IsNull()) {
+    di << " Null shape is not allowed\n";
+    return 1;
+  }
+  if (aS.ShapeType()!=TopAbs_SOLID) {
+    di << " The shape must be a solid\n";
+    return 1;
+  }
+  //
+  aSd=*((TopoDS_Solid*)&aS);
+  //
+  aSh=BRepClass3d::OuterShell(aSd);
+  if (aSh.IsNull()) {
+    di << " not found\n";
+  }
+  else {
+    DBRep::Set(a[1],aSh);
+  }
+  return 0;
 }
 
-static Standard_Integer shell(Draw_Interpretor& di, Standard_Integer n, const char** a)
+//modified by NIZNHY-PKV Thu Sep 20 10:44:17 2012t
+//=======================================================================
+//function : shell
+//purpose  : 
+//=======================================================================
+Standard_Integer shell(Draw_Interpretor& di, Standard_Integer n, const char** a)
 { 
   TopoDS_Shape Shape =  DBRep::Get(a[1]);
   TopTools_ListOfShape ListOfCorks;
@@ -117,18 +149,52 @@ static Standard_Integer shell(Draw_Interpretor& di, Standard_Integer n, const ch
   DBRep::Set("S",MKTS.Shape());
   return 0;
 }
-/*********************************************************************************/
 
-void  BRepTest::ShellCommands(Draw_Interpretor& theCommands)
+
+//=======================================================================
+//function : issame
+//purpose  : 
+//=======================================================================
+Standard_Boolean issame(TopoDS_Face& face, TopoDS_Face& newface)
 {
-  static Standard_Boolean loaded = Standard_False;
-  if (loaded) return;
-  loaded = Standard_True;
+  TopExp_Explorer exp(face,TopAbs_VERTEX),newexp(newface,TopAbs_VERTEX);
+  Standard_Integer newcounter=0,counter=0;
+  for (;exp.More();exp.Next())
+    {
+      counter++;
+      gp_Pnt p(BRep_Tool::Pnt(TopoDS::Vertex(exp.Current())));
+      for (;newexp.More();newexp.Next())
+       {
+         gp_Pnt newp(BRep_Tool::Pnt(TopoDS::Vertex(newexp.Current())));
+         if (p.IsEqual(newp,1e-7))
+           {
+             newcounter++;
+             break;
+           };
+       };
+    };
+  if (counter==newcounter)
+    return Standard_True;
+  return Standard_False;
+}
 
-  const char* g = "Projection of wire commands";
+//=======================================================================
+//function : findface
+//purpose  : 
+//=======================================================================
+TopoDS_Face findface(TopoDS_Shape& shape, TopoDS_Face& face)
+{
+  TopoDS_Face newface;
+  TopExp_Explorer exp(shape,TopAbs_FACE);
+  for (;exp.More();exp.Next())
+    {
+      newface = TopoDS::Face(exp.Current());
+      if (issame(face,newface))
+       {
+         break;
+       };
+    };
+  return newface;
+}
 
-  theCommands.Add("shell","Make shell on bugged object",
-                 __FILE__,
-                 shell,g);
 
-}