0030722: Modeling Algorithms - BRepExtrema_DistShapeShape computes wrong distances
[occt.git] / src / BOPTest / BOPTest_LowCommands.cxx
1 // Created on: 2001-03-28
2 // Created by: Peter KURNEV
3 // Copyright (c) 2001-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16
17 #include <BOPTest.hxx>
18 #include <BOPTools_AlgoTools2D.hxx>
19 #include <BRep_CurveRepresentation.hxx>
20 #include <BRep_GCurve.hxx>
21 #include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
22 #include <BRep_TEdge.hxx>
23 #include <BRep_Tool.hxx>
24 #include <BRepClass3d_SolidClassifier.hxx>
25 #include <BRepClass_FaceClassifier.hxx>
26 #include <DBRep.hxx>
27 #include <Draw.hxx>
28 #include <DrawTrSurf.hxx>
29 #include <gp_Pnt.hxx>
30 #include <gp_Pnt2d.hxx>
31 #include <IntTools_FClass2d.hxx>
32 #include <TCollection_AsciiString.hxx>
33 #include <TopAbs_State.hxx>
34 #include <TopoDS.hxx>
35 #include <TopoDS_Shape.hxx>
36
37 #include <stdio.h>
38 static
39   void PrintState (Draw_Interpretor& aDI,
40                    const TopAbs_State& aState);
41 static
42   Handle(Geom2d_Curve) CurveOnSurface(const TopoDS_Edge& E, 
43                                       const TopoDS_Face& F,
44                                       Standard_Real& First,
45                                       Standard_Real& Last);
46 static
47   Handle(Geom2d_Curve) CurveOnSurface(const TopoDS_Edge& E, 
48                                       const Handle(Geom_Surface)& S,
49                                       const TopLoc_Location& L,
50                                       Standard_Real& First,
51                                       Standard_Real& Last);
52
53 static  Standard_Integer bclassify   (Draw_Interpretor& , Standard_Integer , const char** );
54 static  Standard_Integer b2dclassify (Draw_Interpretor& , Standard_Integer , const char** );
55 static  Standard_Integer b2dclassifx (Draw_Interpretor& , Standard_Integer , const char** );
56 static  Standard_Integer bhaspc      (Draw_Interpretor& , Standard_Integer , const char** );
57
58 //=======================================================================
59 //function : LowCommands
60 //purpose  : 
61 //=======================================================================
62   void  BOPTest::LowCommands(Draw_Interpretor& theCommands)
63 {
64   static Standard_Boolean done = Standard_False;
65   if (done) return;
66   done = Standard_True;
67   // Chapter's name
68   const char* g = "BOPTest commands";
69   theCommands.Add("bclassify"    , "use bclassify Solid Point [Tolerance=1.e-7]",
70                   __FILE__, bclassify   , g);
71   theCommands.Add("b2dclassify"  , "use b2dclassify Face Point2d [Tol] [UseBox] [GapCheckTol]\n" 
72     "Classify  the Point  Point2d  with  Tolerance <Tol> on the face described by <Face>.\n" 
73     "<UseBox> == 1/0 (default <UseBox> = 0): switch on/off the use Bnd_Box in the classification.\n"
74     "<GapCheckTol> (default <GapCheckTol> = 0.1): this is for additional verification of\n" 
75     "the vertex with a tolerance >= <GapCheckTol>.",
76                   __FILE__, b2dclassify , g);
77   theCommands.Add("b2dclassifx"  , "use b2dclassifx Face Point2d [Tol] ",
78                   __FILE__, b2dclassifx , g);
79   theCommands.Add("bhaspc"       , "use bhaspc Edge Face [do]",
80                   __FILE__, bhaspc      , g);
81 }
82
83
84 //lj cd
85 //=======================================================================
86 //function : b2dclassifx
87 //purpose  : 
88 //=======================================================================
89 Standard_Integer b2dclassifx (Draw_Interpretor& theDI,
90                               Standard_Integer  theArgNb,
91                               const char**      theArgVec)
92 {
93   if (theArgNb < 3)  {
94     theDI << " use b2dclassifx Face Point2d [Tol]\n";
95     return 1;
96   }
97
98   TopoDS_Shape aS = DBRep::Get (theArgVec[1]);
99   if (aS.IsNull())  {
100     theDI << " Null Shape is not allowed here\n";
101     return 1;
102   }
103   else if (aS.ShapeType() != TopAbs_FACE)  {
104     theDI << " Shape type must be FACE\n";
105     return 1;
106   }
107   TopAbs_State aState;
108   gp_Pnt2d aP (8., 9.);
109   //
110   DrawTrSurf::GetPoint2d (theArgVec[2], aP);
111   const TopoDS_Face&  aF   = TopoDS::Face(aS);
112   const Standard_Real aTol = (theArgNb == 4) ? 
113     Draw::Atof (theArgVec[3]) : BRep_Tool::Tolerance (aF);
114   //
115   IntTools_FClass2d aClassifier(aF, aTol);
116   aState=aClassifier.Perform(aP);
117   PrintState (theDI, aState);
118   //
119   return 0;
120 }
121 //
122 //=======================================================================
123 //function : b2dclassify
124 //purpose  : 
125 //=======================================================================
126 Standard_Integer b2dclassify (Draw_Interpretor& theDI,
127                               Standard_Integer  theArgNb,
128                               const char**      theArgVec)
129 {
130   if (theArgNb < 3)  {
131     theDI << " use b2dclassify Face Point2d [Tol] [UseBox] [GapCheckTol]\n";
132     return 1;
133   }
134
135   TopoDS_Shape aS = DBRep::Get (theArgVec[1]);
136   if (aS.IsNull())  {
137     theDI << " Null Shape is not allowed here\n";
138     return 1;
139   }
140   else if (aS.ShapeType() != TopAbs_FACE)  {
141     theDI << " Shape type must be FACE\n";
142     return 1;
143   }
144   //
145   gp_Pnt2d aP (8., 9.);
146   //
147   DrawTrSurf::GetPoint2d (theArgVec[2], aP);
148   const TopoDS_Face&  aF   = TopoDS::Face(aS);
149   const Standard_Real aTol = (theArgNb >= 4) ? 
150     Draw::Atof (theArgVec[3]) : BRep_Tool::Tolerance (aF);
151   const Standard_Boolean anUseBox = (theArgNb >= 5 && Draw::Atof(theArgVec[4]) == 1) ?
152     Standard_True : Standard_False;
153   const Standard_Real aGapCheckTol = (theArgNb == 6) ? Draw::Atof(theArgVec[5]) : 0.1;
154   BRepClass_FaceClassifier aClassifier;
155   aClassifier.Perform(aF, aP, aTol, anUseBox, aGapCheckTol);
156   PrintState (theDI, aClassifier.State());
157   //
158   return 0;
159 }
160
161 //=======================================================================
162 //function : bclassify
163 //purpose  : 
164 //=======================================================================
165 Standard_Integer bclassify (Draw_Interpretor& theDI,
166                             Standard_Integer  theArgNb,
167                             const char**      theArgVec)
168 {
169   if (theArgNb < 3)  {
170     theDI << " use bclassify Solid Point [Tolerance=1.e-7]\n";
171     return 1;
172   }
173
174   TopoDS_Shape aS = DBRep::Get (theArgVec[1]);
175   if (aS.IsNull())  {
176     theDI << " Null Shape is not allowed\n";
177     return 1;
178   }
179   else if (aS.ShapeType() != TopAbs_SOLID)  {
180     theDI << " Shape type must be SOLID\n";
181     return 1;
182   }
183
184   gp_Pnt aP (8., 9., 10.);
185   DrawTrSurf::GetPoint (theArgVec[2], aP);
186   const Standard_Real aTol = (theArgNb == 4) ? 
187     Draw::Atof (theArgVec[3]) : 1.e-7;
188
189   BRepClass3d_SolidClassifier aSC (aS);
190   aSC.Perform (aP,aTol);
191
192   PrintState (theDI, aSC.State());
193   return 0;
194 }
195
196 //=======================================================================
197 //function : bhaspc
198 //purpose  : 
199 //=======================================================================
200 Standard_Integer bhaspc (Draw_Interpretor& di, 
201                          Standard_Integer n, 
202                          const char** a)
203 {
204   if (n<3) {
205     di << " use bhaspc Edge Face [do]\n";
206     return 1;
207   }
208
209   TopoDS_Shape S1 = DBRep::Get(a[1]);
210   TopoDS_Shape S2 = DBRep::Get(a[2]);
211   
212   if (S1.IsNull() || S2.IsNull()) {
213     di << " Null shapes are not allowed \n";
214     return 1;
215   }
216   if (S1.ShapeType()!=TopAbs_EDGE || S2.ShapeType()!=TopAbs_FACE) {
217     di << " Type mismatch\n";
218     return 1;
219   }
220   //
221   const TopoDS_Edge& aE=TopoDS::Edge(S1);
222   const TopoDS_Face& aF=TopoDS::Face(S2);
223   Standard_Real f2D, l2D; 
224
225   Handle(Geom2d_Curve) C2D=CurveOnSurface(aE, aF, f2D, l2D);
226   
227   if (C2D.IsNull()) {
228     di << " No 2D Curves detected\n";
229   }
230   else {
231     di << " Ok Edge has P-Curve on this Face\n";
232   }
233   
234   if (n==4) {
235     if (!strcmp(a[3], "do")) {
236       BOPTools_AlgoTools2D::BuildPCurveForEdgeOnFace(aE, aF);  
237     }
238   }
239
240   return 0;
241 }
242 //=======================================================================
243 //function : PrintState
244 //purpose  :
245 //=======================================================================
246 void PrintState (Draw_Interpretor&   theDI,
247                  const TopAbs_State& theState)
248 {
249   switch (theState) {
250    case TopAbs_IN:       
251     theDI << "The point is IN shape\n";      
252     break;
253    case TopAbs_OUT:  
254     theDI << "The point is OUT of shape\n";  
255     break;
256    case TopAbs_ON: 
257     theDI << "The point is ON shape\n";      
258     break;
259    case TopAbs_UNKNOWN:
260    default:              
261     theDI << "The point is UNKNOWN shape\n"; 
262     break;
263   }
264 }
265 //=======================================================================
266 //function : CurveOnSurface
267 //purpose  : 
268 //=======================================================================
269 Handle(Geom2d_Curve) CurveOnSurface(const TopoDS_Edge& E, 
270                                     const TopoDS_Face& F,
271                                     Standard_Real& First,
272                                     Standard_Real& Last)
273 {
274   TopLoc_Location l;
275   const Handle(Geom_Surface)& S = BRep_Tool::Surface(F,l);
276   TopoDS_Edge aLocalEdge = E;
277   if (F.Orientation() == TopAbs_REVERSED) {
278     aLocalEdge.Reverse();
279   }
280   return CurveOnSurface(aLocalEdge,S,l,First,Last);
281 }
282
283 static Handle(Geom2d_Curve) nullPCurve;
284 //=======================================================================
285 //function : CurveOnSurface
286 //purpose  : 
287 //=======================================================================
288 Handle(Geom2d_Curve) CurveOnSurface(const TopoDS_Edge& E, 
289                                     const Handle(Geom_Surface)& S,
290                                     const TopLoc_Location& L,
291                                     Standard_Real& First,
292                                     Standard_Real& Last)
293 {
294   TopLoc_Location l = L.Predivided(E.Location());
295   Standard_Boolean Eisreversed = (E.Orientation() == TopAbs_REVERSED);
296
297   // find the representation
298   BRep_ListIteratorOfListOfCurveRepresentation itcr
299     ((*((Handle(BRep_TEdge)*)&E.TShape()))->ChangeCurves());
300
301   while (itcr.More()) {
302     const Handle(BRep_CurveRepresentation)& cr = itcr.Value();
303     if (cr->IsCurveOnSurface(S,l)) {
304       Handle(BRep_GCurve) GC (Handle(BRep_GCurve)::DownCast (cr));
305       GC->Range(First,Last);
306       if (GC->IsCurveOnClosedSurface() && Eisreversed)
307         return GC->PCurve2();
308       else
309         return GC->PCurve();
310     }
311     itcr.Next();
312   }
313   return nullPCurve;
314 }