1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-16 10:08:36 +03:00
occt/src/ShapeAnalysis/ShapeAnalysis_Shell.cxx
2012-03-05 19:23:40 +04:00

246 lines
7.2 KiB
C++
Executable File

//szv#4 S4163
#include <ShapeAnalysis_Shell.ixx>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Iterator.hxx>
#include <TopExp_Explorer.hxx>
//=======================================================================
//function : Clear
//purpose :
//=======================================================================
void ShapeAnalysis_Shell::Clear()
{
myShells.Clear();
myBad.Clear();
myFree.Clear();
myConex = Standard_False;
}
//=======================================================================
//function : LoadShells
//purpose :
//=======================================================================
void ShapeAnalysis_Shell::LoadShells(const TopoDS_Shape& shape)
{
if (shape.IsNull()) return;
if (shape.ShapeType() == TopAbs_SHELL) myShells.Add (shape); //szv#4:S4163:12Mar99 i =
else {
for (TopExp_Explorer exs (shape,TopAbs_SHELL); exs.More(); exs.Next()) {
TopoDS_Shape sh = exs.Current();
myShells.Add (sh); //szv#4:S4163:12Mar99 i =
}
}
}
// CheckOrientedShells : alimente BadEdges et FreeEdges
// BadEdges : edges presentes plus d une fois dans une meme orientation
// FreeEdges : edges presentes une seule fois
// On utilise pour cela une fonction auxiliaire : CheckEdges
// Qui alimente 2 maps auxiliaires : les edges directes et les inverses
static Standard_Boolean CheckEdges(const TopoDS_Shape& shape,
TopTools_IndexedMapOfShape& bads,
TopTools_IndexedMapOfShape& dirs,
TopTools_IndexedMapOfShape& revs,
TopTools_IndexedMapOfShape& ints)
{
Standard_Boolean res = Standard_False;
if (shape.ShapeType() != TopAbs_EDGE) {
for (TopoDS_Iterator it(shape); it.More(); it.Next()) {
if (CheckEdges (it.Value(),bads,dirs,revs,ints)) res = Standard_True;
}
}
else {
TopoDS_Edge E = TopoDS::Edge(shape);
if (BRep_Tool::Degenerated(E)) return Standard_False;
if (shape.Orientation() == TopAbs_FORWARD) {
//szv#4:S4163:12Mar99 optimized
if (dirs.FindIndex (shape) == 0) dirs.Add (shape);
else { bads.Add (shape); res = Standard_True; }
}
if (shape.Orientation() == TopAbs_REVERSED) {
//szv#4:S4163:12Mar99 optimized
if (revs.FindIndex (shape) == 0) revs.Add (shape);
else { bads.Add (shape); res = Standard_True; }
}
if (shape.Orientation() == TopAbs_INTERNAL) {
if (ints.FindIndex (shape) == 0) ints.Add (shape);
//else { bads.Add (shape); res = Standard_True; }
}
}
return res;
}
//=======================================================================
//function : CheckOrientedShells
//purpose :
//=======================================================================
Standard_Boolean ShapeAnalysis_Shell::CheckOrientedShells(const TopoDS_Shape& shape,
const Standard_Boolean alsofree,
const Standard_Boolean checkinternaledges)
{
myConex = Standard_False;
if (shape.IsNull()) return Standard_False;
Standard_Boolean res = Standard_False;
TopTools_IndexedMapOfShape dirs, revs, ints;
for (TopExp_Explorer exs(shape,TopAbs_SHELL); exs.More(); exs.Next()) {
TopoDS_Shape sh = exs.Current();
//szv#4:S4163:12Mar99 optimized
if (CheckEdges (sh,myBad,dirs,revs,ints))
if (myShells.Add (sh)) res = Standard_True;
}
// Resteraient a faire les FreeEdges
if (!alsofree) return res;
// Free Edges . Ce sont les edges d une map pas dans l autre
// et lycee de Versailles (les maps dirs et revs)
Standard_Integer nb = dirs.Extent();
Standard_Integer i; // svv Jan11 2000 : porting on DEC
for (i = 1; i <= nb; i ++) {
TopoDS_Shape sh = dirs.FindKey (i);
if (!myBad.Contains(sh)) {
if (!revs.Contains(sh)) {
if(checkinternaledges) {
if (!ints.Contains(sh)) {
myFree.Add (sh);
}
else myConex = Standard_True;
}
else {
myFree.Add (sh);
}
}
else myConex = Standard_True;
}
else myConex = Standard_True;
}
nb = revs.Extent();
for (i = 1; i <= nb; i ++) {
TopoDS_Shape sh = revs.FindKey (i);
if (!myBad.Contains(sh)) {
if (!dirs.Contains(sh)) {
if(checkinternaledges) {
if (!ints.Contains(sh)) {
myFree.Add (sh);
}
else myConex = Standard_True;
}
else {
myFree.Add (sh);
}
}
else myConex = Standard_True;
}
else myConex = Standard_True;
}
return res;
}
//=======================================================================
//function : IsLoaded
//purpose :
//=======================================================================
Standard_Boolean ShapeAnalysis_Shell::IsLoaded(const TopoDS_Shape& shape) const
{
if (shape.IsNull()) return Standard_False;
return myShells.Contains (shape);
}
//=======================================================================
//function : NbLoaded
//purpose :
//=======================================================================
Standard_Integer ShapeAnalysis_Shell::NbLoaded() const
{
return myShells.Extent();
}
//=======================================================================
//function : Loaded
//purpose :
//=======================================================================
TopoDS_Shape ShapeAnalysis_Shell::Loaded(const Standard_Integer num) const
{
return myShells.FindKey (num);
}
//=======================================================================
//function : HasBadEdges
//purpose :
//=======================================================================
Standard_Boolean ShapeAnalysis_Shell::HasBadEdges() const
{
return (myBad.Extent() > 0);
}
//=======================================================================
//function : BadEdges
//purpose :
//=======================================================================
TopoDS_Compound ShapeAnalysis_Shell::BadEdges() const
{
TopoDS_Compound C;
BRep_Builder B;
B.MakeCompound (C);
Standard_Integer n = myBad.Extent();
for (Standard_Integer i = 1; i <= n; i ++) B.Add (C,myBad.FindKey(i));
return C;
}
//=======================================================================
//function : HasFreeEdges
//purpose :
//=======================================================================
Standard_Boolean ShapeAnalysis_Shell::HasFreeEdges() const
{
return (myFree.Extent() > 0);
}
//=======================================================================
//function : FreeEdges
//purpose :
//=======================================================================
TopoDS_Compound ShapeAnalysis_Shell::FreeEdges() const
{
TopoDS_Compound C;
BRep_Builder B;
B.MakeCompound (C);
Standard_Integer n = myFree.Extent();
for (Standard_Integer i = 1; i <= n; i ++) B.Add (C,myFree.FindKey(i));
return C;
}
//=======================================================================
//function : HasConnectedEdges
//purpose :
//=======================================================================
Standard_Boolean ShapeAnalysis_Shell::HasConnectedEdges() const
{
return myConex;
}