summaryrefslogtreecommitdiff
path: root/src/TopOpeBRepDS/TopOpeBRepDS_funk.cxx
blob: e64d7483eeccdc659f8149cc7dbbeb46cf6dba37 (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
// File:	TopOpeBRepDS_funk.cxx
// Created:	Mon Nov 10 16:17:42 1997
// Author:	Jean Yves LEBEY
//		<jyl@bistrox.paris1.matra-dtv.fr>

#include <TopOpeBRepDS_define.hxx>

#include <gp_Pnt2d.hxx>
#include <TopOpeBRepDS_ProcessInterferencesTool.hxx>
#include <TopOpeBRepDS_FaceEdgeInterference.hxx>
#include <TopOpeBRepDS_FaceInterferenceTool.hxx>
#include <TopoDS.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TColStd_DataMapIteratorOfDataMapOfIntegerListOfInteger.hxx>
#include <TColStd_DataMapOfIntegerListOfInteger.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <TColStd_ListOfInteger.hxx>
#include <TopOpeBRepTool_ShapeTool.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <BRepClass3d_SolidClassifier.hxx>
#include <TopoDS_Shell.hxx>
#include <TopoDS_Solid.hxx>
#include <gp_Vec.hxx>
#include <Precision.hxx>
#include <TopOpeBRepDS_FaceEdgeInterference.hxx>
#include <TopOpeBRepTool_EXPORT.hxx>
#include <TopOpeBRepTool_SC.hxx>
#include <TopOpeBRepTool_box.hxx>
#include <TopOpeBRepTool_tol.hxx>
#include <Geom_Curve.hxx>
#include <Geom_Surface.hxx>
#include <GeomAPI_ProjectPointOnSurf.hxx>
#include <BRepTools.hxx>
#include <GeomProjLib.hxx>
#include <Geom2d_Curve.hxx>
#include <ProjLib_ProjectedCurve.hxx>
#include <Geom_Surface.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepAdaptor_HSurface.hxx>
#include <BRepAdaptor_HCurve.hxx>
#include <GeomAdaptor_Curve.hxx>
#include <GeomAdaptor_HCurve.hxx>

Standard_EXPORT Handle(Geom2d_Curve) MakePCurve(const ProjLib_ProjectedCurve& PC);

static TopAbs_State FUN_staPinF3d(const gp_Pnt& P, const TopoDS_Face& F)
// prequesitory : the compute of state(P,3dmatter of F)     
// - solid classifier - 
{
  TopAbs_State st = TopAbs_UNKNOWN;
  gp_Pnt2d UV; Standard_Real d = 1.e2; Standard_Boolean ok = FUN_tool_projPonboundedF(P,F,UV,d);
  if (!ok) return st;
  Standard_Real tolF = BRep_Tool::Tolerance(F);
  if (d < tolF) return TopAbs_IN; // TopAbs_ON;
  gp_Pnt pF; FUN_tool_value(UV,F,pF);
  gp_Dir ntF = FUN_tool_nggeomF(UV,F);
  if (F.Orientation() == TopAbs_REVERSED) ntF.Reverse();
  gp_Dir PpF(gp_Vec(P,pF));
  Standard_Real dot = ntF.Dot(PpF);
  st = (dot > 0) ? TopAbs_IN : TopAbs_OUT;
  return st;
}

Standard_EXPORT void FUN_UNKFstasta(const TopoDS_Face& FF,const TopoDS_Face& FS,
				    const TopoDS_Edge& EE,const Standard_Boolean EEofFF,
				    TopAbs_State& stateb,TopAbs_State& statea,
                                    TopOpeBRepTool_PShapeClassifier pClassif)
{
  BRep_Builder BB;
  
  stateb = statea = TopAbs_UNKNOWN;
  Standard_Real fE,lE; Handle(Geom_Curve) CEE = BRep_Tool::Curve(EE,fE,lE);
  
  if (CEE.IsNull()) return; // NYI : get points from 2d curve
  Handle(Geom_Surface) SFF = BRep_Tool::Surface(FF);
  
  Standard_Real ttE = 0.41237118973; Standard_Real parE = (1-ttE)*fE + ttE*lE;
  gp_Pnt PE;gp_Vec VE;CEE->D1(parE,PE,VE);
  
  GeomAPI_ProjectPointOnSurf PonS(PE,SFF);
  if (!PonS.Extrema().IsDone()) return;
  if (PonS.NbPoints() == 0) return;
  
  Standard_Real u,v; PonS.Parameters(1,u,v);
  gp_Vec d1u,d1v;gp_Pnt puv; SFF->D1(u,v,puv,d1u,d1v);
  gp_Vec N = d1u.Crossed(d1v);
  Standard_Real FUMin,FUMax,FVMin,FVMax;
  
  // les bornes de FF
  BRepTools::UVBounds(FF,FUMin,FUMax,FVMin,FVMax);
  
  // les bornes de EE dans FF
  Standard_Real EUMin,EUMax,EVMin,EVMax;
  if (EEofFF) {
    BRepTools::UVBounds(FF,EE,EUMin,EUMax,EVMin,EVMax);
  }
  else { // EE n'est pas une arete de FF => EE est une arete de FS
    Handle(Geom2d_Curve) CEEFFx;
    if (CEE.IsNull()) {
      Standard_Boolean compminmaxUV = Standard_False;
      BRepAdaptor_Surface BAS(FS,compminmaxUV);
      Handle(BRepAdaptor_HSurface) BAHS = new BRepAdaptor_HSurface(BAS);
      BRepAdaptor_Curve AC(EE,FS);
      Handle(BRepAdaptor_HCurve) AHC = new BRepAdaptor_HCurve(AC);
      Standard_Real tolin; FTOL_FaceTolerances3d(FF,FS,tolin);
      ProjLib_ProjectedCurve projcurv(BAHS,AHC,tolin);
      CEEFFx = MakePCurve(projcurv);
    }
    else {
      // modified by NIZHNY-MKK  Mon Apr  2 15:41:01 2001.BEGIN
      TopExp_Explorer anExp(FF, TopAbs_EDGE);
      for(; anExp.More(); anExp.Next()) {
        if(EE.IsSame(anExp.Current())) {
	  CEEFFx = BRep_Tool::CurveOnSurface(EE, FF, fE, lE);
	}
      }
      if(CEEFFx.IsNull()) {
	// modified by NIZHNY-MKK  Mon Apr  2 15:41:16 2001.END

	CEEFFx = GeomProjLib::Curve2d(CEE,fE,lE,SFF);

      // modified by NIZHNY-MKK  Mon Apr  2 15:41:26 2001.BEGIN
      }
      // modified by NIZHNY-MKK  Mon Apr  2 15:41:31 2001.END
    }
    if (CEEFFx.IsNull()) return;

    TopoDS_Edge EEx; BB.MakeEdge(EEx,CEE,BRep_Tool::Tolerance(EE));
    TopoDS_Vertex vf,vr; TopExp::Vertices(EE,vf,vr);
    BB.Add(EEx,vf); BB.UpdateVertex(vf,fE,EEx,BRep_Tool::Tolerance(vf));
    BB.Add(EEx,vr); BB.UpdateVertex(vr,lE,EEx,BRep_Tool::Tolerance(vr));

    TopoDS_Face FFx; BB.MakeFace(FFx,SFF,BRep_Tool::Tolerance(FF));
    BB.UpdateEdge(EEx,CEEFFx,FFx,BRep_Tool::Tolerance(FF));
    BRepTools::UVBounds(FFx,EEx,EUMin,EUMax,EVMin,EVMax);
  }

  //  Standard_Boolean EisoU = (abs(EVMax-EVMin) < Precision::Confusion()); 
  Standard_Boolean EisoU = (fabs(EVMax-EVMin) < Precision::Confusion()); 
  //  Standard_Boolean EisoV = (abs(EUMax-EUMin) < Precision::Confusion()); 
  Standard_Boolean EisoV = (fabs(EUMax-EUMin) < Precision::Confusion()); 
  // xpu161098 : bad analysis : we should choose smaller factor
  //   cto009C1 (FF3,FS10,EG9)
  Standard_Real ttu = 1.e-2; //Standard_Real ttu = 0.1; 
  Standard_Real paru = fabs(ttu*(FUMax-FUMin));
  Standard_Real ttv = 1.e-2;//Standard_Real ttv = 0.1; 
  Standard_Real parv = fabs(ttv*(FVMax-FVMin));
  
  Standard_Real up = u; Standard_Real vp = v;
  if      ( EisoV ) up += paru;
  else if ( EisoU ) vp += parv;
  else { up += paru; vp += parv; }
  gp_Pnt Pb; SFF->D0(up,vp,Pb);
  
  Standard_Real um = u; Standard_Real vm = v;
  if      ( EisoV ) um -= paru;
  else if ( EisoU ) vm -= parv;
  else { um -= paru; vm -= parv; }
  gp_Pnt Pa; SFF->D0(um,vm,Pa);
  
  Standard_Boolean permute = Standard_False;
  Standard_Real dot;
  gp_Vec VEcroN = VE.Crossed(N);
  if      ( EisoV ) {
    dot = VEcroN.Dot(d1u);
    if ( dot < 0.) permute = Standard_True;
  }
  else if ( EisoU ) {
    dot = VEcroN.Dot(d1v);
    if ( dot < 0.) permute = Standard_True;
  }
  else {
    dot = VEcroN.Dot(d1v);
    if ( dot < 0.) permute = Standard_True;
  }
  if (permute) {
    gp_Pnt P;
    P = Pa;
    Pa = Pb;
    Pb = P;
  }

  if (pClassif) {
    // xpu151098 : evolution solid classifier (ex cto009H1)
    // MSV : made it!
    pClassif->StateP3DReference(Pb);
    stateb = pClassif->State();
    pClassif->StateP3DReference(Pa);
    statea = pClassif->State();
  }
  else {
    stateb = ::FUN_staPinF3d(Pb,FS);
    statea = ::FUN_staPinF3d(Pa,FS);
  }
}