0024624: Lost word in license statement in source files
[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 #include <BOPTest.ixx>
17
18 #include <stdio.h>
19
20 #include <gp_Pnt2d.hxx>
21 #include <gp_Pnt.hxx>
22
23 #include <TopoDS.hxx>
24 #include <TopoDS_Shape.hxx>
25 #include <TopAbs_State.hxx>
26
27 #include <TCollection_AsciiString.hxx>
28
29 #include <BRepClass3d_SolidClassifier.hxx>
30 #include <BRepClass_FaceClassifier.hxx>
31
32 #include <BRep_Tool.hxx>
33 #include <BRep_CurveRepresentation.hxx>
34 #include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
35 #include <BRep_TEdge.hxx>
36 #include <BRep_GCurve.hxx>
37
38 #include <Draw.hxx>
39 #include <DBRep.hxx>
40 #include <DrawTrSurf.hxx>
41
42 #include <BOPTools_AlgoTools2D.hxx>
43
44 static
45   void PrintState (Draw_Interpretor& aDI,
46                    const TopAbs_State& aState);
47 static
48   Handle(Geom2d_Curve) CurveOnSurface(const TopoDS_Edge& E, 
49                                       const TopoDS_Face& F,
50                                       Standard_Real& First,
51                                       Standard_Real& Last);
52 static
53   Handle(Geom2d_Curve) CurveOnSurface(const TopoDS_Edge& E, 
54                                       const Handle(Geom_Surface)& S,
55                                       const TopLoc_Location& L,
56                                       Standard_Real& First,
57                                       Standard_Real& Last);
58
59 static  Standard_Integer bclassify   (Draw_Interpretor& , Standard_Integer , const char** );
60 static  Standard_Integer b2dclassify (Draw_Interpretor& , Standard_Integer , const char** );
61 static  Standard_Integer bhaspc      (Draw_Interpretor& , Standard_Integer , const char** );
62
63 //=======================================================================
64 //function : LowCommands
65 //purpose  : 
66 //=======================================================================
67   void  BOPTest::LowCommands(Draw_Interpretor& theCommands)
68 {
69   static Standard_Boolean done = Standard_False;
70   if (done) return;
71   done = Standard_True;
72   // Chapter's name
73   const char* g = "CCR commands";
74   theCommands.Add("bclassify"    , "Use >bclassify Solid Point [Tolerance=1.e-7]",
75                   __FILE__, bclassify   , g);
76   theCommands.Add("b2dclassify"  , "Use >bclassify Face Point2d [Tol2D=Tol(Face)] ",
77                   __FILE__, b2dclassify , g);
78   theCommands.Add("bhaspc"       , "Use >bhaspc Edge Face [do]",
79                   __FILE__, bhaspc      , g);
80 }
81
82 //=======================================================================
83 //function : bclassify
84 //purpose  : 
85 //=======================================================================
86 Standard_Integer bclassify (Draw_Interpretor& theDI,
87                             Standard_Integer  theArgNb,
88                             const char**      theArgVec)
89 {
90   if (theArgNb < 3)
91   {
92     theDI << " Use >bclassify Solid Point [Tolerance=1.e-7]\n";
93     return 1;
94   }
95
96   TopoDS_Shape aS = DBRep::Get (theArgVec[1]);
97   if (aS.IsNull())
98   {
99     theDI << " Null Shape is not allowed here\n";
100     return 1;
101   }
102   else if (aS.ShapeType() != TopAbs_SOLID)
103   {
104     theDI << " Shape type must be SOLID\n";
105     return 1;
106   }
107
108   gp_Pnt aP (8., 9., 10.);
109   DrawTrSurf::GetPoint (theArgVec[2], aP);
110   const Standard_Real aTol = (theArgNb == 4) ? Draw::Atof (theArgVec[3]) : 1.e-7; //Precision::Confusion();
111
112   BRepClass3d_SolidClassifier aSC (aS);
113   aSC.Perform (aP,aTol);
114
115   PrintState (theDI, aSC.State());
116   return 0;
117 }
118 //
119 //=======================================================================
120 //function : b2dclassify
121 //purpose  : 
122 //=======================================================================
123 Standard_Integer b2dclassify (Draw_Interpretor& theDI,
124                               Standard_Integer  theArgNb,
125                               const char**      theArgVec)
126 {
127   if (theArgNb < 3)
128   {
129     theDI << " Use >bclassify Face Point2d [Tol2D=Tol(Face)]\n";
130     return 1;
131   }
132
133   TopoDS_Shape aS = DBRep::Get (theArgVec[1]);
134   if (aS.IsNull())
135   {
136     theDI << " Null Shape is not allowed here\n";
137     return 1;
138   }
139   else if (aS.ShapeType() != TopAbs_FACE)
140   {
141     theDI << " Shape type must be FACE\n";
142     return 1;
143   }
144
145   gp_Pnt2d aP (8., 9.);
146   DrawTrSurf::GetPoint2d (theArgVec[2], aP);
147   const TopoDS_Face&  aF   = TopoDS::Face(aS);
148   const Standard_Real aTol = (theArgNb == 4) ? Draw::Atof (theArgVec[3]) : BRep_Tool::Tolerance (aF);
149
150   BRepClass_FaceClassifier aClassifier;
151   aClassifier.Perform(aF, aP, aTol);
152
153   PrintState (theDI, aClassifier.State());
154   return 0;
155 }
156
157 //=======================================================================
158 //function : bhaspc
159 //purpose  : 
160 //=======================================================================
161 Standard_Integer bhaspc (Draw_Interpretor& di, Standard_Integer n, const char** a)
162 {
163   if (n<3) {
164     di << " Use bhaspc> Edge Face [do]\n";
165     return 1;
166   }
167
168   TopoDS_Shape S1 = DBRep::Get(a[1]);
169   TopoDS_Shape S2 = DBRep::Get(a[2]);
170   
171   if (S1.IsNull() || S2.IsNull()) {
172     di << " Null shapes are not allowed \n";
173     return 1;
174   }
175   if (S1.ShapeType()!=TopAbs_EDGE || S2.ShapeType()!=TopAbs_FACE) {
176     di << " Type mismatch\n";
177     return 1;
178   }
179   //
180   const TopoDS_Edge& aE=TopoDS::Edge(S1);
181   const TopoDS_Face& aF=TopoDS::Face(S2);
182   Standard_Real f2D, l2D; 
183
184   Handle(Geom2d_Curve) C2D=CurveOnSurface(aE, aF, f2D, l2D);
185   
186   if (C2D.IsNull()) {
187     di << " No 2D Curves detected\n";
188   }
189   else {
190     di << " Ok Edge has P-Curve on this Face\n";
191   }
192   
193   if (n==4) {
194     if (!strcmp(a[3], "do")) {
195       BOPTools_AlgoTools2D::BuildPCurveForEdgeOnFace(aE, aF);  
196     }
197   }
198
199   return 0;
200 }
201
202 //=======================================================================
203 //function : PrintState
204 //purpose  :
205 //=======================================================================
206 void PrintState (Draw_Interpretor&   theDI,
207                  const TopAbs_State& theState)
208 {
209   switch (theState)
210   {
211     case TopAbs_IN:       theDI << "The point is IN shape\n";      return;
212     case TopAbs_OUT:      theDI << "The point is OUT of shape\n";  return;
213     case TopAbs_ON:       theDI << "The point is ON shape\n";      return;
214     case TopAbs_UNKNOWN:
215     default:              theDI << "The point is UNKNOWN shape\n"; return;
216   }
217 }
218
219 //=======================================================================
220 //function : CurveOnSurface
221 //purpose  : 
222 //=======================================================================
223 Handle(Geom2d_Curve) CurveOnSurface(const TopoDS_Edge& E, 
224                                     const TopoDS_Face& F,
225                                     Standard_Real& First,
226                                     Standard_Real& Last)
227 {
228   TopLoc_Location l;
229   const Handle(Geom_Surface)& S = BRep_Tool::Surface(F,l);
230   TopoDS_Edge aLocalEdge = E;
231   if (F.Orientation() == TopAbs_REVERSED) {
232     aLocalEdge.Reverse();
233   }
234   return CurveOnSurface(aLocalEdge,S,l,First,Last);
235 }
236
237 static Handle(Geom2d_Curve) nullPCurve;
238 //=======================================================================
239 //function : CurveOnSurface
240 //purpose  : 
241 //=======================================================================
242 Handle(Geom2d_Curve) CurveOnSurface(const TopoDS_Edge& E, 
243                                     const Handle(Geom_Surface)& S,
244                                     const TopLoc_Location& L,
245                                     Standard_Real& First,
246                                     Standard_Real& Last)
247 {
248   TopLoc_Location l = L.Predivided(E.Location());
249   Standard_Boolean Eisreversed = (E.Orientation() == TopAbs_REVERSED);
250
251   // find the representation
252   BRep_ListIteratorOfListOfCurveRepresentation itcr
253     ((*((Handle(BRep_TEdge)*)&E.TShape()))->ChangeCurves());
254
255   while (itcr.More()) {
256     const Handle(BRep_CurveRepresentation)& cr = itcr.Value();
257     if (cr->IsCurveOnSurface(S,l)) {
258       const Handle(BRep_GCurve)& GC = *((Handle(BRep_GCurve)*)&cr);
259       GC->Range(First,Last);
260       if (GC->IsCurveOnClosedSurface() && Eisreversed)
261         return GC->PCurve2();
262       else
263         return GC->PCurve();
264     }
265     itcr.Next();
266   }
267   return nullPCurve;
268 }