0031336: Modeling data - extend BRepPrimAPI_MakeBox with planar shape creation
[occt.git] / src / BRepTest / BRepTest_PrimitiveCommands.cxx
1 // Created on: 1993-07-22
2 // Created by: Remi LEQUETTE
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <BRepTest.hxx>
18 #include <DBRep.hxx>
19 #include <Draw_Interpretor.hxx>
20 #include <Draw_Appli.hxx>
21 #include <DrawTrSurf.hxx>
22 #include <TopoDS_Solid.hxx>
23 #include <BRep_Builder.hxx>
24 #include <BRepBuilderAPI.hxx>
25 #include <BRepPreviewAPI_MakeBox.hxx>
26 #include <BRepPrimAPI_MakeBox.hxx>
27 #include <BRepPrimAPI_MakeWedge.hxx>
28 #include <BRepPrimAPI_MakeCylinder.hxx>
29 #include <BRepPrimAPI_MakeCone.hxx>
30 #include <BRepPrimAPI_MakeSphere.hxx>
31 #include <BRepPrimAPI_MakeTorus.hxx>
32 #include <BRepPrimAPI_MakeSphere.hxx>
33 #include <Geom_Plane.hxx>
34 #include <gp_Pln.hxx>
35
36
37 //=======================================================================
38 // box
39 //=======================================================================
40
41 static Standard_Integer box(Draw_Interpretor& , Standard_Integer n, const char** a)
42 {
43   gp_Pnt anOrigin;
44   gp_XYZ aParams;
45   gp_Dir aDir;
46   gp_Dir aXDir;
47   Standard_Boolean isMinMax = Standard_False;
48   Standard_Boolean isPreview = Standard_False;
49   Standard_Boolean isAxis = Standard_False;
50
51   for (Standard_Integer anArgIter = 2; anArgIter < n; ++anArgIter)
52   {
53     TCollection_AsciiString anArgCase (a[anArgIter]);
54     anArgCase.LowerCase();
55     if (anArgCase == "-min" && anArgIter + 3 <= n)
56     {
57       anOrigin.SetX (Draw::Atof(a[anArgIter + 1]));
58       anOrigin.SetY (Draw::Atof(a[anArgIter + 2]));
59       anOrigin.SetZ (Draw::Atof(a[anArgIter + 3]));
60       anArgIter += 3;
61     }
62     else if (anArgCase == "-max" && anArgIter + 3 <= n)
63     {
64       aParams.SetX (Draw::Atof(a[anArgIter + 1]));
65       aParams.SetY (Draw::Atof(a[anArgIter + 2]));
66       aParams.SetZ (Draw::Atof(a[anArgIter + 3]));
67       isMinMax = Standard_True;
68       anArgIter += 3;
69     }
70     else if (anArgCase == "-size" && anArgIter + 3 <= n)
71     {
72       aParams.SetX (Draw::Atof(a[anArgIter + 1]));
73       aParams.SetY (Draw::Atof(a[anArgIter + 2]));
74       aParams.SetZ (Draw::Atof(a[anArgIter + 3]));
75       isMinMax = Standard_False;
76       anArgIter += 3;
77     }
78     else if (anArgCase == "-dir" && anArgIter + 3 <= n)
79     {
80       Standard_Real aX = Draw::Atof(a[anArgIter + 1]);
81       Standard_Real anY = Draw::Atof(a[anArgIter + 2]);
82       Standard_Real aZ = Draw::Atof(a[anArgIter + 3]);
83       aDir.SetCoord (aX, anY, aZ);
84       isAxis = Standard_True;
85       anArgIter += 3;
86     }
87     else if (anArgCase == "-xdir" && anArgIter + 3 <= n)
88     {
89       Standard_Real aX = Draw::Atof(a[anArgIter + 1]);
90       Standard_Real anY = Draw::Atof(a[anArgIter + 2]);
91       Standard_Real aZ = Draw::Atof(a[anArgIter + 3]);
92       aXDir.SetCoord (aX, anY, aZ);
93       isAxis = Standard_True;
94       anArgIter += 3;
95     }
96     else if (anArgCase == "-preview")
97     {
98       isPreview = Standard_True;
99     }
100     else if (anArgIter + 5 < n || anArgIter + 2 < n)
101     {
102       Standard_Real aValue = 0.0;
103       Standard_Integer aCountReal = 0;
104       Standard_Integer anIter = anArgIter;
105       while (anIter < n && Draw::ParseReal(a[anIter], aValue))
106       {
107         anIter++;
108         aCountReal++;
109       }
110
111       if (aCountReal == 6)
112       {
113         anOrigin.SetX (Draw::Atof(a[anArgIter]));
114         anOrigin.SetY (Draw::Atof(a[anArgIter + 1]));
115         anOrigin.SetZ (Draw::Atof(a[anArgIter + 2]));
116
117         aParams.SetX (Draw::Atof(a[anArgIter + 3]));
118         aParams.SetY (Draw::Atof(a[anArgIter + 4]));
119         aParams.SetZ (Draw::Atof(a[anArgIter + 5]));
120         anArgIter += 5;
121       }
122
123       else if (aCountReal == 3)
124       {
125         aParams.SetX (Draw::Atof(a[anArgIter]));
126         aParams.SetY (Draw::Atof(a[anArgIter + 1]));
127         aParams.SetZ (Draw::Atof(a[anArgIter + 2]));
128         anArgIter += 2;
129       }
130       else
131       {
132         std::cout<<"Syntax error\n";
133         return 1;
134       }
135     }
136   }
137
138   if (isPreview)
139   {
140     TopoDS_Shape S;
141     BRepPreviewAPI_MakeBox aPreview;
142
143     if (isMinMax == Standard_True)
144     {
145       aPreview.Init (anOrigin, aParams);
146     }
147     else if (isMinMax == Standard_False && isAxis == Standard_False)
148     {
149       aPreview.Init (anOrigin, aParams.X(), aParams.Y(), aParams.Z());
150     }
151     else if (isAxis)
152     {
153       gp_Ax2 anAxis (anOrigin, aDir, aXDir);
154       aPreview.Init (anAxis, aParams.X(), aParams.Y(), aParams.Z());
155     }
156     else
157     {
158       aPreview.Init (aParams.X(), aParams.Y(), aParams.Z());
159     }
160
161     S = aPreview;
162     DBRep::Set(a[1],S);
163   }
164   else
165   {
166     TopoDS_Solid S;
167     if (isMinMax == Standard_True)
168     {
169       S = BRepPrimAPI_MakeBox(anOrigin, aParams);
170     }
171     else if (isMinMax == Standard_False && isAxis == Standard_False)
172     {
173       S = BRepPrimAPI_MakeBox(anOrigin, aParams.X(), aParams.Y(), aParams.Z());
174     }
175     else if (isAxis)
176     {
177       gp_Ax2 anAxis (anOrigin, aDir, aXDir);
178       S = BRepPrimAPI_MakeBox(anAxis, aParams.X(), aParams.Y(), aParams.Z());
179     }
180     else
181     {
182       S = BRepPrimAPI_MakeBox(aParams.X(), aParams.Y(), aParams.Z());
183     }
184     DBRep::Set(a[1],S);
185   }
186   return 0;
187 }
188
189
190 //=======================================================================
191 // wedge
192 //=======================================================================
193
194 static Standard_Integer wedge(Draw_Interpretor& , Standard_Integer n, const char** a)
195 {
196   TopoDS_Solid S;
197
198 //  Standard_Integer i = 0;
199   if ( n == 15 || n == 18) {
200     gp_Pnt LocalP(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]));
201     gp_Dir LocalN(Draw::Atof(a[5]),Draw::Atof(a[6]),Draw::Atof(a[7]));
202     gp_Dir LocalVx(Draw::Atof(a[8]),Draw::Atof(a[9]),Draw::Atof(a[10]));
203     gp_Ax2 Axis(LocalP,LocalN,LocalVx);
204 //    gp_Ax2 Axis(gp_Pnt(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4])),
205 //              gp_Dir(Draw::Atof(a[5]),Draw::Atof(a[6]),Draw::Atof(a[7])),
206 //              gp_Dir(Draw::Atof(a[8]),Draw::Atof(a[9]),Draw::Atof(a[10])));
207     if ( n == 15) {
208       S = BRepPrimAPI_MakeWedge(Axis,
209                             Draw::Atof(a[11]),Draw::Atof(a[12]),Draw::Atof(a[13]),Draw::Atof(a[14]));
210     }
211     else {
212       S = BRepPrimAPI_MakeWedge(Axis,
213                             Draw::Atof(a[11]),Draw::Atof(a[12]),Draw::Atof(a[13]),
214                             Draw::Atof(a[14]),Draw::Atof(a[15]),Draw::Atof(a[16]),Draw::Atof(a[17]));
215     }
216   }
217   else if (n == 6) {
218     S = BRepPrimAPI_MakeWedge(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]));
219   }
220   else if (n == 9){
221     S = BRepPrimAPI_MakeWedge(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]),
222                           Draw::Atof(a[5]),Draw::Atof(a[6]),Draw::Atof(a[7]),Draw::Atof(a[8]));
223   }
224   else
225     return 1;
226
227   DBRep::Set(a[1],S);
228   return 0;
229 }
230
231 //=======================================================================
232 // cylinder
233 //=======================================================================
234
235 static Standard_Integer cylinder(Draw_Interpretor& , Standard_Integer n, const char** a)
236 {
237   if (n < 3) return 1;
238   TopoDS_Solid S;
239   Handle(Geom_Plane) P =
240     Handle(Geom_Plane)::DownCast(DrawTrSurf::Get(a[2]));
241
242   if (n == 4) {
243       S = BRepPrimAPI_MakeCylinder(Draw::Atof(a[2]),Draw::Atof(a[3]));
244   }
245   else if (n == 5) {
246     if (P.IsNull())
247       S = BRepPrimAPI_MakeCylinder(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]) * (M_PI / 180.0));
248     else
249       S = BRepPrimAPI_MakeCylinder(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]));
250   }
251   else if (n == 6) {
252     if (P.IsNull())
253       return 1;
254     else
255       S = BRepPrimAPI_MakeCylinder(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]) * (M_PI / 180.0));
256   }
257   else
258     return 1;
259
260   DBRep::Set(a[1],S);
261   return 0;
262 }
263
264 //=======================================================================
265 // cone
266 //=======================================================================
267
268 static Standard_Integer cone(Draw_Interpretor& , Standard_Integer n, const char** a)
269 {
270   if (n < 3) return 1;
271   TopoDS_Solid S;
272
273   Handle(Geom_Plane) P =
274     Handle(Geom_Plane)::DownCast(DrawTrSurf::Get(a[2]));
275
276   if (n == 5) {
277     S = BRepPrimAPI_MakeCone(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]));
278   }
279   else if (n == 6) {
280     if (P.IsNull())
281       S = BRepPrimAPI_MakeCone(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]) * (M_PI / 180.0));
282     else
283       S = BRepPrimAPI_MakeCone(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]));
284   }
285   else if (n == 7) {
286     S = BRepPrimAPI_MakeCone(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]),Draw::Atof(a[6]) * (M_PI / 180.0));
287   }
288   else
289     return 1;
290
291   DBRep::Set(a[1],S);
292   return 0;
293 }
294
295 //=======================================================================
296 // sphere
297 //=======================================================================
298
299 static Standard_Integer sphere(Draw_Interpretor& , Standard_Integer n, const char** a)
300 {
301   if (n < 3) return 1;
302   TopoDS_Solid S;
303
304   Handle(Geom_Plane) P =
305     Handle(Geom_Plane)::DownCast(DrawTrSurf::Get(a[2]));
306
307   if (n == 3) {
308     S = BRepPrimAPI_MakeSphere(Draw::Atof(a[2]));
309   }
310   else if (n == 4) {
311     if (P.IsNull())
312       S = BRepPrimAPI_MakeSphere(Draw::Atof(a[2]),Draw::Atof(a[3]) * (M_PI / 180.0));
313     else
314       S = BRepPrimAPI_MakeSphere(P->Pln().Position().Ax2(),Draw::Atof(a[3]));
315   }
316   else if (n == 5) {
317     if (P.IsNull())
318       S = BRepPrimAPI_MakeSphere(Draw::Atof(a[2]),Draw::Atof(a[3]) * (M_PI / 180.0),Draw::Atof(a[4]) * (M_PI / 180.0));
319     else
320       S = BRepPrimAPI_MakeSphere(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]) * (M_PI / 180.0));
321   }
322   else if (n == 6) {
323     if (P.IsNull())
324       S = BRepPrimAPI_MakeSphere(Draw::Atof(a[2]),Draw::Atof(a[3]) * (M_PI / 180.0),Draw::Atof(a[4]) * (M_PI / 180.0),Draw::Atof(a[5]) * (M_PI / 180.0));
325     else
326       S = BRepPrimAPI_MakeSphere(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]) * (M_PI / 180.0),Draw::Atof(a[5]) * (M_PI / 180.0));
327   }
328   else if (n == 7) {
329     S = BRepPrimAPI_MakeSphere(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]) * (M_PI / 180.0),Draw::Atof(a[5]) * (M_PI / 180.0),Draw::Atof(a[6]) * (M_PI / 180.0));
330   }
331   else
332     return 1;
333
334   DBRep::Set(a[1],S);
335   return 0;
336 }
337
338 //=======================================================================
339 // torus
340 //=======================================================================
341
342 static Standard_Integer torus(Draw_Interpretor& , Standard_Integer n, const char** a)
343 {
344   if (n < 3) return 1;
345   TopoDS_Solid S;
346
347   Handle(Geom_Plane) P =
348     Handle(Geom_Plane)::DownCast(DrawTrSurf::Get(a[2]));
349
350   if (n == 4) {
351     S = BRepPrimAPI_MakeTorus(Draw::Atof(a[2]),Draw::Atof(a[3]));
352   }
353   else if (n == 5) {
354     if (P.IsNull())
355       S = BRepPrimAPI_MakeTorus(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]) * (M_PI / 180.0));
356     else
357       S = BRepPrimAPI_MakeTorus(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]));
358   }
359   else if (n == 6) {
360     if (P.IsNull())
361       S = BRepPrimAPI_MakeTorus(Draw::Atof(a[2]),Draw::Atof(a[3]),
362                             Draw::Atof(a[4]) * (M_PI / 180.0),Draw::Atof(a[5]) * (M_PI / 180.0));
363     else
364       S = BRepPrimAPI_MakeTorus(P->Pln().Position().Ax2(),
365                             Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]) * (M_PI / 180.0));
366   }
367   else if (n == 7) {
368     if (P.IsNull())
369       S = BRepPrimAPI_MakeTorus(Draw::Atof(a[2]),Draw::Atof(a[3]),
370                             Draw::Atof(a[4]) * (M_PI / 180.0),Draw::Atof(a[5]) * (M_PI / 180.0),Draw::Atof(a[6]) * (M_PI / 180.0));
371     else
372       S = BRepPrimAPI_MakeTorus(P->Pln().Position().Ax2(),Draw::Atof(a[3]),
373                             Draw::Atof(a[4]),Draw::Atof(a[5]) * (M_PI / 180.0),Draw::Atof(a[6]) * (M_PI / 180.0));
374   }
375   else if (n == 8) {
376     S = BRepPrimAPI_MakeTorus(P->Pln().Position().Ax2(),Draw::Atof(a[3]),Draw::Atof(a[4]),
377                           Draw::Atof(a[5]) * (M_PI / 180.0),Draw::Atof(a[6]) * (M_PI / 180.0),Draw::Atof(a[7]) * (M_PI / 180.0));
378   }
379   else
380     return 1;
381
382   DBRep::Set(a[1],S);
383   return 0;
384 }
385
386
387
388 //=======================================================================
389 //function : PrimitiveCommands
390 //purpose  : 
391 //=======================================================================
392
393 void  BRepTest::PrimitiveCommands(Draw_Interpretor& theCommands)
394 {
395   static Standard_Boolean done = Standard_False;
396   if (done) return;
397   done = Standard_True;
398
399   DBRep::BasicCommands(theCommands);
400
401   const char* g = "Primitive building commands";
402     
403   theCommands.Add ("box",
404                    "box name [dx dy dz] [x y z dx dy dz]"
405          "\n\t\t:            [-min x y z] [-size dx dy dz] [-max x y z]"
406          "\n\t\t:            [-dir x y z -xdir x y z] [-preview]"
407          "\n\t\t: Construct axes-aligned box and put result into 'name' variable"
408          "\n\t\t:  -min   box lower corner, origin; (0,0,0) by default"
409          "\n\t\t:  -size  box dimensions   (alternative to -max)"
410          "\n\t\t:  -max   box upper corner (alternative to -size)"
411          "\n\t\t:  -dir   main direction of coordinate system (DZ by default)"
412          "\n\t\t:  -xdir  x direction of coordinate system (DX by default)"
413          "\n\t\t:  -preview non-solid shape will be created (vertex, edge, rectangle or box);"
414          "\n\t\t:           otherwise, return NULL shape in case of zero box dimension.",
415                   __FILE__,box,g);
416
417   theCommands.Add("wedge","wedge name [Ox Oy Oz Zx Zy Zz Xx Xy Xz] dx dy dz ltx / xmin zmin xmax zmax",__FILE__,wedge,g);
418   
419   theCommands.Add("pcylinder","pcylinder name [plane(ax2)] R H [angle]",__FILE__,cylinder,g);
420   theCommands.Add("pcone",    "pcone name [plane(ax2)] R1 R2 H [angle]",__FILE__,cone,g);
421   theCommands.Add("psphere",  "psphere name [plane(ax2)] R [angle1 angle2] [angle]",__FILE__,sphere,g);
422   theCommands.Add("ptorus",   "ptorus name [plane(ax2)] R1 R2 [angle1 angle2] [angle]",__FILE__,torus,g);
423 }
424
425