summaryrefslogtreecommitdiff
path: root/src/TopOpeBRepTool/TopOpeBRepTool_face.cxx
blob: a2217ecf4b3c0b5643dda6fdf96a484c4e4ab761 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// File:	TopOpeBRepTool_face.cxx
// Created:	Thu Jan 14 10:20:08 1999
// Author:	Prestataire Xuan PHAM PHU
//		<xpu@poulopox.paris1.matra-dtv.fr>


#include <TopOpeBRepTool_face.ixx>
#include <TopOpeBRepTool_define.hxx>
#include <Standard_Failure.hxx>
#include <TopoDS.hxx>
#include <BRep_Tool.hxx>
#include <Precision.hxx>
#include <BRep_Builder.hxx>
#include <TopoDS_Iterator.hxx>
#include <BRepTopAdaptor_FClass2d.hxx>

//=======================================================================
//function : TopOpeBRepTool_face
//purpose  : 
//=======================================================================

TopOpeBRepTool_face::TopOpeBRepTool_face()
{
}

static void FUN_reverse(const TopoDS_Face& f, TopoDS_Face& frev)
{
  BRep_Builder B; 
  TopoDS_Shape aLocalShape = f.EmptyCopied();
  frev = TopoDS::Face(aLocalShape);
//  frev = TopoDS::Face(f.EmptyCopied());
  TopoDS_Iterator it(f);
  while (it.More()) {
    B.Add(frev,it.Value().Reversed());
    it.Next();
  }    
}

//=======================================================================
//function : Init
//purpose  : 
//=======================================================================

Standard_Boolean TopOpeBRepTool_face::Init(const TopoDS_Wire& W, const TopoDS_Face& Fref)
{
  myFfinite.Nullify();
  myW = W;

  // fres : 
//  TopoDS_Face fres;
//  Handle(Geom_Surface) su = BRep_Tool::Surface(Fref);  
//  BRep_Builder B; B.MakeFace(fres,su,Precision::Confusion());
  TopoDS_Shape aLocalShape = Fref.EmptyCopied();
  TopoDS_Face fres = TopoDS::Face(aLocalShape);
//  TopoDS_Face fres = TopoDS::Face(Fref.EmptyCopied());
  BRep_Builder B; B.Add(fres,W);
  B.NaturalRestriction(fres,Standard_True);

  // <myfinite> :
  BRepTopAdaptor_FClass2d FClass(fres,0.);
  Standard_Boolean infinite = ( FClass.PerformInfinitePoint() == TopAbs_IN);
  myfinite = !infinite;

  // <myFfinite> : 
  if (myfinite) myFfinite = fres;
  else          FUN_reverse(fres,myFfinite);
  return Standard_True;
}

//=======================================================================
//function : IsDone
//purpose  : 
//=======================================================================

Standard_Boolean TopOpeBRepTool_face::IsDone() const
{
  return (!myFfinite.IsNull());
}

//=======================================================================
//function : Finite
//purpose  : 
//=======================================================================

Standard_Boolean TopOpeBRepTool_face::Finite() const
{
  if (!IsDone()) Standard_Failure::Raise("TopOpeBRepTool_face NOT DONE");
  return myfinite;
}

//=======================================================================
//function : Ffinite
//purpose  : 
//=======================================================================

const TopoDS_Face& TopOpeBRepTool_face::Ffinite() const
{
  if (!IsDone()) Standard_Failure::Raise("TopOpeBRepTool_face NOT DONE");
  return myFfinite;
}

//=======================================================================
//function : W
//purpose  : 
//=======================================================================

const TopoDS_Wire& TopOpeBRepTool_face::W() const
{
  return myW;
}

//=======================================================================
//function : TopoDS_Face&
//purpose  : 
//=======================================================================

TopoDS_Face TopOpeBRepTool_face::RealF() const
{
  if (myfinite) return myFfinite;
  TopoDS_Face realf; FUN_reverse(myFfinite,realf);
  return realf;
}