diff --git a/src/BRepClass3d/BRepClass3d.cdl b/src/BRepClass3d/BRepClass3d.cdl index 057789de2e..c435db5279 100755 --- a/src/BRepClass3d/BRepClass3d.cdl +++ b/src/BRepClass3d/BRepClass3d.cdl @@ -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 . Returns a Null + -- shell if has no outer shell. end BRepClass3d; diff --git a/src/BRepClass3d/BRepClass3d.cxx b/src/BRepClass3d/BRepClass3d.cxx new file mode 100644 index 0000000000..cffa3402d2 --- /dev/null +++ b/src/BRepClass3d/BRepClass3d.cxx @@ -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: +// + +#include + + +#include +#include + +#include +#include +#include + +#include +#include + + +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; +} diff --git a/src/BRepTest/BRepTest_ShellCommands.cxx b/src/BRepTest/BRepTest_ShellCommands.cxx index 81fccdc202..2cde4c97a6 100755 --- a/src/BRepTest/BRepTest_ShellCommands.cxx +++ b/src/BRepTest/BRepTest_ShellCommands.cxx @@ -37,49 +37,81 @@ #include #include #include +#include +#include +#include +// +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** ); - - -static Standard_Boolean issame(TopoDS_Face& face, TopoDS_Face& newface) +//======================================================================= +//function : ShellCommands +//purpose : +//======================================================================= +void BRepTest::ShellCommands(Draw_Interpretor& theCommands) { - 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; + static Standard_Boolean loaded = Standard_False; + if (loaded) return; + loaded = Standard_True; + + const char* g = "Projection of wire commands"; + + theCommands.Add("shell","Make shell on bugged object", __FILE__, shell,g); + theCommands.Add("outershell","use outershell r s", __FILE__, outershell,g); + +} +//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 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; -} - -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; - - const char* g = "Projection of wire commands"; - - theCommands.Add("shell","Make shell on bugged object", - __FILE__, - shell,g); - + 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; } + +//======================================================================= +//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; +} + +