0024510: Remove unused local variables
[occt.git] / src / BRepTest / BRepTest_BasicCommands.cxx
1 // Created on: 1994-12-13
2 // Created by: Jacques GOUSSARD
3 // Copyright (c) 1994-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
9 // under the terms of the GNU Lesser General Public 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 <Standard_Stream.hxx>
18 #include <Standard_Macro.hxx>
19
20 #include <BRepTest.hxx>
21
22 #include <DBRep.hxx>
23 #include <Draw_Appli.hxx>
24 #include <Draw_Interpretor.hxx>
25 #include <Draw_Box.hxx>
26
27 #include <BRepBuilderAPI.hxx>
28 #include <BRepBuilderAPI_FindPlane.hxx>
29 #include <BRepBuilderAPI_Copy.hxx>
30 #include <BRepBuilderAPI_Transform.hxx>
31 #include <BRepBuilderAPI_GTransform.hxx>
32 #include <BRepBuilderAPI_NurbsConvert.hxx>
33 #include <gp_Ax2.hxx>
34 #include <gp_Mat.hxx>
35 #include <gp_GTrsf.hxx>
36 #include <BRepOffsetAPI_NormalProjection.hxx>
37 #include <BRepLib.hxx>
38 #include <BRep_Builder.hxx>
39 #include <BRepBndLib.hxx>
40 #include <Bnd_Box.hxx>
41 #include <TopExp_Explorer.hxx>
42 #include <TopoDS.hxx>
43 #include <BRepTools_WireExplorer.hxx>
44
45 #include <GCPnts_QuasiUniformAbscissa.hxx>
46 #include <Geom2dAdaptor_Curve.hxx>
47 #include <GeomAdaptor_Curve.hxx>
48 #include <ProjLib_ComputeApproxOnPolarSurface.hxx>
49 #include <DrawTrSurf.hxx>
50
51
52 #include <Draw_Segment3D.hxx>
53 #include <Draw_Marker3D.hxx>
54 #include <Draw_MarkerShape.hxx>
55
56 #include <stdio.h>
57
58 Standard_IMPORT Draw_Viewer dout;
59
60
61
62 //=======================================================================
63 // addpcurve
64 //=======================================================================
65
66 static Standard_Integer addpcurve(Draw_Interpretor& , Standard_Integer n, const char** a)
67 {
68   if(n < 4) return 1;
69   TopoDS_Shape E = DBRep::Get(a[1]);
70   if (E.IsNull()) return 1;
71   Handle(Geom2d_Curve) PC = DrawTrSurf::GetCurve2d(a[2]);
72   TopoDS_Shape F = DBRep::Get(a[3]);
73   Standard_Real tol = 1.e-7;
74   if (n > 4) {
75     tol = Draw::Atof(a[4]);
76   }
77   BRep_Builder BB;
78   BB.UpdateEdge(TopoDS::Edge(E), PC, TopoDS::Face(F),tol); 
79   DBRep::Set(a[1], E);
80   return 0;
81 }
82
83
84 //=======================================================================
85 // transform
86 //=======================================================================
87
88 static Standard_Integer transform(Draw_Interpretor& di,Standard_Integer n,const char** a)
89 {
90   if (n <= 1) return 1;
91
92   gp_Trsf T;
93   Standard_Integer last = n;
94
95   if (!strcmp(a[0],"reset")) {
96   }
97   else if (!strcmp(a[0],"tmove")) {
98     if (n < 3) return 1;
99     TopoDS_Shape SL = DBRep::Get(a[n-1]);
100     if (SL.IsNull()) return 0;
101     T = SL.Location().Transformation();
102     last = n-1;
103   }
104   else if (!strcmp(a[0],"ttranslate")) {
105     if (n < 5) return 1;
106     T.SetTranslation(gp_Vec(Draw::Atof(a[n-3]),Draw::Atof(a[n-2]),Draw::Atof(a[n-1])));
107     last = n-3;
108   }
109   else if (!strcmp(a[0],"trotate")) {
110     if (n < 9) return 1;
111     T.SetRotation(gp_Ax1(gp_Pnt(Draw::Atof(a[n-7]),Draw::Atof(a[n-6]),Draw::Atof(a[n-5])),
112                          gp_Vec(Draw::Atof(a[n-4]),Draw::Atof(a[n-3]),Draw::Atof(a[n-2]))),
113                   Draw::Atof(a[n-1])* (M_PI / 180.0));
114     last = n-7;
115   }
116   else if (!strcmp(a[0],"tmirror")) {
117     if (n < 8) return 1;
118     T.SetMirror(gp_Ax2(gp_Pnt(Draw::Atof(a[n-6]),Draw::Atof(a[n-5]),Draw::Atof(a[n-4])),
119                        gp_Vec(Draw::Atof(a[n-3]),Draw::Atof(a[n-2]),Draw::Atof(a[n-1]))));
120     last = n-6;
121   }
122   else if (!strcmp(a[0],"tscale")) {
123     if (n < 6) return 1;
124     T.SetScale(gp_Pnt(Draw::Atof(a[n-4]),Draw::Atof(a[n-3]),Draw::Atof(a[n-2])),Draw::Atof(a[n-1]));
125     last = n-4;
126
127   }
128
129   if (T.Form() == gp_Identity) {
130     TopLoc_Location L;
131     for (Standard_Integer i = 1; i < last; i++) {
132       TopoDS_Shape S = DBRep::Get(a[i]);
133       if (S.IsNull()) {
134         //cout << a[i] << " is not a valid shape" << endl;
135         di << a[i] << " is not a valid shape" << "\n";
136       }
137       else {
138         DBRep::Set(a[i],S.Located(L));
139       }
140     }
141   }
142   else {
143     BRepBuilderAPI_Transform trf(T);
144     for (Standard_Integer i = 1; i < last; i++) {
145       TopoDS_Shape S = DBRep::Get(a[i]);
146       if (S.IsNull()) {
147         //cout << a[i] << " is not a valid shape" << endl;
148         di << a[i] << " is not a valid shape" << "\n";
149       }
150       else {
151         trf.Perform(S);
152         if (trf.IsDone()){
153           DBRep::Set(a[i],trf.Shape());
154         }
155         else {
156           return 1;
157         }
158       }
159     }
160   }
161   return 0;
162 }
163
164
165 ///=======================================================================
166 // gtransform
167 //=======================================================================
168
169 static Standard_Integer deform(Draw_Interpretor& di,Standard_Integer n,const char** a)
170 {
171   if (n <= 1) return 1;
172   
173   Standard_Integer last = n;
174   
175   gp_Trsf T;
176   gp_GTrsf GT(T);
177   
178 //  gp_Mat rot(Draw::Atof(a[last-3]),0,0,0,Draw::Atof(a[last-2]),0,0,0,Draw::Atof(a[last-1]));
179   gp_Mat rot(Draw::Atof(a[3]),0,0,0,Draw::Atof(a[4]),0,0,0,Draw::Atof(a[5]));
180   GT.SetVectorialPart(rot);
181   last -= 3;
182   BRepBuilderAPI_GTransform gtrf(GT);
183   BRepBuilderAPI_NurbsConvert nbscv;
184   //  for (Standard_Integer i = 1; i < last; i++) {
185   //    TopoDS_Shape S = DBRep::Get(a[i]);
186   TopoDS_Shape S = DBRep::Get(a[2]);    
187   if (S.IsNull()) {
188     //cout << a[2] << " is not a valid shape" << endl;
189     di << a[2] << " is not a valid shape" << "\n";
190   }
191   else {
192     gtrf.Perform(S);
193     if (gtrf.IsDone()){
194       DBRep::Set(a[1],gtrf.Shape());
195     }
196     else {
197       return 1;
198     }
199   }
200   
201   return 0;
202 }
203
204 //=======================================================================
205 // tcopy
206 //=======================================================================
207
208 static Standard_Integer tcopy(Draw_Interpretor& di,Standard_Integer n,const char** a)
209 {
210   Standard_Boolean copyGeom = Standard_True;
211   Standard_Integer iFirst = 1; // index of first shape argument
212
213   if (n > 1 && a[1][0] == '-' && a[1][1] == 'n' )
214   {
215     copyGeom = Standard_False;
216     iFirst = 2;
217   }
218
219   if (n < 3 || (n - iFirst) % 2) {
220     cout << "Use: " << a[0] << " [-n(ogeom)] shape1 copy1 [shape2 copy2 [...]]" << endl;
221     cout << "Option -n forbids copying of geometry (it will be shared)" << endl; 
222     return 1;
223   }
224
225   BRepBuilderAPI_Copy cop;
226   Standard_Integer nbPairs = (n - iFirst) / 2;
227   for (Standard_Integer i=0; i < nbPairs; i++) {
228     cop.Perform(DBRep::Get(a[i+iFirst]), copyGeom);
229     DBRep::Set(a[i+iFirst+1],cop.Shape());
230     di << a[i+iFirst+1] << " ";
231   }
232   return 0;
233 }
234
235
236 //=======================================================================
237 // NurbsConvert
238 //=======================================================================
239
240 static Standard_Integer nurbsconvert(Draw_Interpretor& di,Standard_Integer n,const char** a)
241 {
242   if (n < 3) return 1;
243   if ((n-1)%2 != 0) return 1;
244   BRepBuilderAPI_NurbsConvert nbscv;
245   for (Standard_Integer i=0; i<(n-1)/2; i++) {
246     TopoDS_Shape S = DBRep::Get(a[2*i+2]);
247     if (S.IsNull()) {
248       //cout << a[2*i+2] << " is not a valid shape" << endl;
249       di << a[2*i+2] << " is not a valid shape" << "\n";
250     }
251     else {
252       nbscv.Perform(S);
253       if (nbscv.IsDone()){
254         DBRep::Set(a[2*i+1],nbscv.Shape());
255       }
256       else {
257         return 1;
258       }
259     }
260   }
261   
262   return 0;
263   
264 }
265
266 //=======================================================================
267 // make a 3D edge curve
268 //=======================================================================
269
270 static Standard_Integer mkedgecurve (Draw_Interpretor& ,Standard_Integer n,const char** a)
271 {
272
273   if (n < 3) return 1;
274   Standard_Real Tolerance = Draw::Atof(a[2]) ;
275
276   TopoDS_Shape S = DBRep::Get(a[1]);
277   
278   if (S.IsNull()) return 1;
279   
280    BRepLib::BuildCurves3d(S,
281                           Tolerance) ;
282    return 0 ;
283 }
284
285 //=======================================================================
286 // sameparameter
287 //=======================================================================
288
289 static Standard_Integer sameparameter(Draw_Interpretor& ,Standard_Integer n,const char** a)
290 {
291   if (n < 2) return 1;
292   Standard_Real tol = 1.e-7;
293   TopoDS_Shape S = DBRep::Get(a[1]);
294   if (S.IsNull()) return 1;
295   Standard_Boolean force  = !strcmp(a[0],"fsameparameter");
296   if (n == 3) tol = Draw::Atof(a[2]);
297
298   BRepLib::SameParameter(S,tol,force);
299
300   DBRep::Set(a[1],S);
301   return 0;
302 }
303 //=======================================================================
304 //function : updatetol
305 //purpose  : 
306 //=======================================================================
307 static Standard_Integer updatetol(Draw_Interpretor& ,Standard_Integer n,const char** a)
308 {
309   if (n < 2) return 1;
310
311   TopoDS_Shape S = DBRep::Get(a[1]);
312   if (S.IsNull()) return 1;
313
314   if (n==2) BRepLib::UpdateTolerances(S);
315   else BRepLib::UpdateTolerances(S,Standard_True);
316   DBRep::Set(a[1],S);
317   return 0;
318
319 }
320
321 //=======================================================================
322 //function : OrienSolid
323 //purpose  : 
324 //=======================================================================
325 static Standard_Integer orientsolid(Draw_Interpretor& ,Standard_Integer n,const char** a)
326 {
327   if (n < 2) return 1;
328
329   TopoDS_Shape S = DBRep::Get(a[1]);
330   if (S.IsNull()) return 1;
331   if (S.ShapeType()!=TopAbs_SOLID) return 1;
332
333   BRepLib::OrientClosedSolid(TopoDS::Solid(S));
334
335   DBRep::Set(a[1],S);
336   return 0;
337
338 }
339
340 //=======================================================================
341 //function : boundingstr
342 //purpose  : 
343 //=======================================================================
344 static Standard_Integer boundingstr(Draw_Interpretor& di,Standard_Integer n,const char** a)
345 {
346   if (n < 2) return 1;
347   TopoDS_Shape S = DBRep::Get(a[1]);
348   if (S.IsNull()) return 1;
349   Bnd_Box B;
350   BRepBndLib::Add(S,B);
351   Standard_Real axmin,aymin,azmin,axmax,aymax,azmax;
352   B.Get(axmin,aymin,azmin,axmax,aymax,azmax);
353   di << axmin<<" "<< aymin<<" "<< azmin<<" "<< axmax<<" "<< aymax<<" "<< azmax;
354   if (n >= 8) {
355     Draw::Set(a[2],axmin) ;
356     Draw::Set(a[3],aymin) ;
357     Draw::Set(a[4],azmin) ;
358     Draw::Set(a[5],axmax) ;
359     Draw::Set(a[6],aymax) ;
360     Draw::Set(a[7],azmax) ;
361   }
362   return 0;
363 }
364
365 //=======================================================================
366 //function : getcoords
367 //purpose  : 
368 //=======================================================================
369 static Standard_Integer getcoords(Draw_Interpretor& di,Standard_Integer n,const char** a)
370 {
371   if(n < 2) 
372     return 1;
373
374   for (Standard_Integer i = 1; i < n; i++) 
375   {
376     const TopoDS_Shape aShape = DBRep::Get (a[i]);
377
378     if (aShape.IsNull())
379       continue;
380
381     if (aShape.ShapeType() == TopAbs_VERTEX)
382     {
383       const TopoDS_Vertex& aVertex = TopoDS::Vertex(aShape);
384       gp_Pnt aPnt = BRep_Tool::Pnt(aVertex);
385
386       di << a[i] << " (x,y,z) : " << aPnt.X() << " " << aPnt.Y() << " " << aPnt.Z() << "\n";
387     }
388   }
389
390   return 0;
391 }
392
393 //=======================================================================
394 //function : bounding
395 //purpose  : 
396 //=======================================================================
397 static Standard_Integer bounding(Draw_Interpretor& di,Standard_Integer n,const char** a)
398 {
399   if (n < 2) return 1;
400   Standard_Real axmin,aymin,azmin,axmax,aymax,azmax;
401   Bnd_Box B; Handle(Draw_Box) DB;
402   
403   if (n == 2) { 
404     TopoDS_Shape S = DBRep::Get(a[1]);
405     if (S.IsNull()) return 1;
406     BRepBndLib::Add(S,B);
407     B.Get(axmin,aymin,azmin,axmax,aymax,azmax);
408     DB = new Draw_Box(gp_Pnt(axmin,aymin,azmin),gp_Pnt(axmax,aymax,azmax),Draw_orange);
409     dout<<DB;
410     di << axmin<<" "<< aymin<<" "<< azmin<<" "<< axmax<<" "<< aymax<<" "<< azmax;
411   }
412   else if (n == 7) {
413     axmin=Draw::Atof(a[1]);
414     aymin=Draw::Atof(a[2]);
415     azmin=Draw::Atof(a[3]);
416     axmax=Draw::Atof(a[4]);
417     aymax=Draw::Atof(a[5]);
418     azmax=Draw::Atof(a[6]);
419     DB = new Draw_Box(gp_Pnt(axmin,aymin,azmin),gp_Pnt(axmax,aymax,azmax),Draw_orange);
420     dout<<DB;
421   }
422   return 0;
423 }
424 //=======================================================================
425 //function : findplane
426 //purpose  : 
427 //=======================================================================
428 static Standard_Integer findplane(Draw_Interpretor& di,Standard_Integer n,const char** a)
429 {
430   if (n < 3) return 1;
431   TopoDS_Shape S = DBRep::Get(a[1]);
432   if (S.IsNull()) return 1;
433   Standard_Real tolerance = 1.0e-5 ;
434   BRepBuilderAPI_FindPlane a_plane_finder(S,
435                                    tolerance) ;
436   if (a_plane_finder.Found()) {
437     //cout << " a plane is found "   ;
438     di << " a plane is found \n";
439     DrawTrSurf::Set(a[2],a_plane_finder.Plane()) ;
440   }
441   return 0 ;
442 }
443 //=======================================================================
444 //function : precision
445 //purpose  : 
446 //=======================================================================
447
448 static Standard_Integer precision(Draw_Interpretor& di,Standard_Integer n,const char** a)
449 {
450   n--;
451
452   if ( n == 0) {
453     //cout << " Current Precision = " << BRepBuilderAPI::Precision() << endl;
454     di << " Current Precision = " << BRepBuilderAPI::Precision() << "\n";
455   }
456   else {
457     BRepBuilderAPI::Precision(Draw::Atof(a[1]));
458   }
459   return 0;
460 }
461
462
463 //=======================================================================
464 //function : reperage shape (Int lin Shape) + pointe double click   + maxtol
465 //purpose  : 
466 //=======================================================================
467 #include <IntCurvesFace_ShapeIntersector.hxx>
468 #include <gp_Lin.hxx>
469
470 static Standard_Integer reperageshape(Draw_Interpretor& di, Standard_Integer narg , const char** a) 
471 {
472   Standard_Integer details=0;
473   if(narg<2) return 1;
474   if(narg==3) details=1;
475   const char *id1 = a[1];
476   TopoDS_Shape TheShape1 = DBRep::Get(id1);
477   
478   //cout << "Pick positions with button "<<endl;
479   di << "Pick positions with button "<< "\n";
480   Standard_Integer id,X,Y,b;
481   gp_Trsf T;
482   gp_Pnt P1,P2;
483   dout.Select(id,X,Y,b);
484   
485   dout.GetTrsf(id,T);
486   T.Invert();
487   Standard_Real z = dout.Zoom(id);
488   P2.SetCoord((Standard_Real)X /z,(Standard_Real)Y /z, 0.0);
489   P2.Transform(T);
490   P1.SetCoord((Standard_Real)X /z,(Standard_Real)Y /z,-1.0);
491   P1.Transform(T);
492   
493   
494   gp_Ax1 Axe(P1,gp_Vec(P1,P2));
495   IntCurvesFace_ShapeIntersector Inter;
496   Inter.Load(TheShape1,1e-7);
497   
498   Inter.Perform(Axe,-RealLast(),RealLast());
499   
500   //cout<<"\n --> ";
501   di <<"\n --> ";
502   if(Inter.NbPnt()) { 
503     for(Standard_Integer i=1; i<=Inter.NbPnt(); i++) { 
504       Standard_Integer numface=1;
505       TopExp_Explorer ExF;
506       for(ExF.Init(TheShape1,TopAbs_FACE);
507           ExF.More();
508           ExF.Next(),numface++) { 
509         TopoDS_Face Face=TopoDS::Face(ExF.Current());
510         if(Face.IsEqual(Inter.Face(i))) { 
511           //cout<<" "<<a[1]<<"_"<<numface;
512           di<<" "<<a[1]<<"_"<<numface;
513           continue;       
514         }
515       }
516       const gp_Pnt& P = Inter.Pnt(i);
517       Standard_Real PMin = Inter.WParameter(i);
518       if(details) { 
519         //cout<<" w:"<<PMin<<endl;
520         di<<" w:"<<PMin<< "\n";
521       }
522       if(Inter.Transition(i) == IntCurveSurface_In) { 
523         if(Inter.State(i) == TopAbs_IN) { 
524           Handle(Draw_Marker3D) p = new Draw_Marker3D(P, Draw_Square, Draw_rouge,2); 
525           dout << p;   dout.Flush();
526         }
527         else if(Inter.State(i) == TopAbs_ON) { 
528           Handle(Draw_Marker3D) p = new Draw_Marker3D(P, Draw_Square, Draw_vert,2); 
529           dout << p;   dout.Flush();
530         }
531       }
532       else { 
533         if(Inter.Transition(i) == IntCurveSurface_Out) { 
534           if(Inter.State(i) == TopAbs_IN) { 
535             Handle(Draw_Marker3D) p = new Draw_Marker3D(P, Draw_X, Draw_rouge,2); 
536             dout << p;   dout.Flush();
537           }
538           else if(Inter.State(i) == TopAbs_ON) { 
539             Handle(Draw_Marker3D) p = new Draw_Marker3D(P, Draw_X, Draw_vert,2); 
540             dout << p;   dout.Flush();
541           }
542         } 
543       }
544     }
545   }
546   //cout<<endl;
547   di << "\n";
548   return(0);
549 }
550
551
552 static Standard_Integer maxtolerance(Draw_Interpretor& theCommands, 
553                                      Standard_Integer n, const char** a) { 
554   if(n<2) return(1);
555   TopoDS_Shape TheShape = DBRep::Get(a[1]);
556   if(TheShape.IsNull()) return(1);
557
558   Standard_Real T,TMF,TME,TMV,TmF,TmE,TmV;
559   Standard_Integer nbF,nbE,nbV;
560   TMF=TME=TMV=-RealLast();
561   TmF=TmE=TmV=RealLast();
562   
563   TopTools_MapOfShape mapS;
564   mapS.Clear();
565
566   for(TopExp_Explorer ex(TheShape,TopAbs_FACE);
567       ex.More();
568       ex.Next()) { 
569     TopoDS_Face Face=TopoDS::Face(ex.Current());
570     T=BRep_Tool::Tolerance(Face);
571     if(T>TMF) TMF=T;
572     if(T<TmF) TmF=T;
573     mapS.Add(Face);
574   }
575   
576   nbF = mapS.Extent();
577   mapS.Clear();
578   
579   for(TopExp_Explorer ex(TheShape,TopAbs_EDGE);
580       ex.More();
581       ex.Next()) { 
582     TopoDS_Edge Edge=TopoDS::Edge(ex.Current());
583     T=BRep_Tool::Tolerance(Edge);
584     if(T>TME) TME=T;
585     if(T<TmE) TmE=T;
586     mapS.Add(Edge);
587   }
588
589   nbE = mapS.Extent();
590   mapS.Clear();
591
592   for(TopExp_Explorer ex(TheShape,TopAbs_VERTEX);
593       ex.More();
594       ex.Next()) { 
595     TopoDS_Vertex Vertex=TopoDS::Vertex(ex.Current());
596     T=BRep_Tool::Tolerance(Vertex);
597     if(T>TMV) TMV=T;
598     if(T<TmV) TmV=T;
599     mapS.Add(Vertex);
600   }
601
602   nbV = mapS.Extent();
603
604 //#ifndef WNT
605   Standard_SStream sss;
606   sss << "\n## Tolerances on the shape " << a[1] << "  (nbFaces:" << nbF
607       << "  nbEdges:" << nbE << " nbVtx:" << nbV << ")\n" ;
608   sss.precision(5);
609   sss.setf(ios::scientific);
610   if(TmF<=TMF) sss << "\n    Face   : Min " << setw(8) << TmF <<"    Max  " << setw(8) << TMF << " \n ";
611   if(TmE<=TME) sss << "\n    Edge   : Min " << setw(8) << TmE <<"    Max  " << setw(8) << TME << " \n ";
612   if(TmV<=TMV) sss << "\n    Vertex : Min " << setw(8) << TmV <<"    Max  " << setw(8) << TMV << " \n ";
613   theCommands << sss;
614   //#endif*/
615   return 0;
616 }
617
618
619 static Standard_Integer vecdc(Draw_Interpretor& di,Standard_Integer ,const char** ) {
620   //cout << "Pick positions with button "<<endl;
621   di << "Pick positions with button "<< "\n";
622
623   Standard_Integer id,X,Y,b;
624   gp_Trsf T;
625   gp_Pnt P1,P2,PP1,PP2;
626   
627   //-----------------------------------------------------------
628   dout.Select(id,X,Y,b);    dout.GetTrsf(id,T);
629   T.Invert();
630   Standard_Real z = dout.Zoom(id);
631   P1.SetCoord((Standard_Real)X /z,(Standard_Real)Y /z,0.0);
632   P1.Transform(T);
633   
634   dout.Select(id,X,Y,b);  dout.GetTrsf(id,T);
635   T.Invert();  z = dout.Zoom(id);
636   
637   P2.SetCoord((Standard_Real)X /z,(Standard_Real)Y /z,0.0);
638   P2.Transform(T);
639   Standard_Real xa,ya,za;
640   if(Abs(P1.X())>Abs(P2.X())) xa = P1.X(); else xa = P2.X();
641   if(Abs(P1.Y())>Abs(P2.Y())) ya = P1.Y(); else ya = P2.Y();
642   if(Abs(P1.Z())>Abs(P2.Z())) za = P1.Z(); else za = P2.Z();
643   P1.SetCoord(xa,ya,za);
644   Handle(Draw_Marker3D) D0 = new Draw_Marker3D(gp_Pnt(P1.X(),
645                                                       P1.Y(),
646                                                       P1.Z()),
647                                                Draw_Square,Draw_blanc,1);
648   
649   dout << D0;
650   dout.Flush();
651   //-----------------------------------------------------------
652   dout.Select(id,X,Y,b);  
653   dout.GetTrsf(id,T);
654   T.Invert();
655   z = dout.Zoom(id);
656   PP1.SetCoord((Standard_Real)X /z,(Standard_Real)Y /z,0.0);
657   PP1.Transform(T);
658   dout.Select(id,X,Y,b);
659   dout.GetTrsf(id,T);
660   T.Invert();
661   z = dout.Zoom(id);
662   PP2.SetCoord((Standard_Real)X /z,(Standard_Real)Y /z,0.0);
663   PP2.Transform(T);
664   if(Abs(PP1.X())>Abs(PP2.X())) xa = PP1.X(); else xa = PP2.X();
665   if(Abs(PP1.Y())>Abs(PP2.Y())) ya = PP1.Y(); else ya = PP2.Y();
666   if(Abs(PP1.Z())>Abs(PP2.Z())) za = PP1.Z(); else za = PP2.Z();
667   PP1.SetCoord(xa,ya,za);
668   Handle(Draw_Segment3D) d = new Draw_Segment3D(P1,PP1,Draw_blanc);
669   dout << d;
670   dout.Flush();
671   //cout<<"\nttran   "<<PP1.X()-P1.X()<<" "<<PP1.Y()-P1.Y()<<" "<<PP1.Z()-P1.Z()<<endl;
672   di <<"\nttran   "<<PP1.X()-P1.X()<<" "<<PP1.Y()-P1.Y()<<" "<<PP1.Z()-P1.Z()<< "\n";
673
674   static Standard_Integer nboxvecdp=0;
675   //cout<<"\nbox  b"<<++nboxvecdp<<" "<<Min(P1.X(),PP1.X())<<" "<<Min(P1.Y(),PP1.Y())<<" "<<Min(PP1.Z(),P1.Z());
676   //cout<<"  "<<Abs(PP1.X()-P1.X())<<" "<<Abs(PP1.Y()-P1.Y())<<" "<<Abs(PP1.Z()-P1.Z())<<endl;
677
678   //cout<<"\nDistance :"<<sqrt( (PP1.X()-P1.X())*(PP1.X()-P1.X())
679         //                   +(PP1.Y()-P1.Y())*(PP1.Y()-P1.Y())
680         //                   +(PP1.Z()-P1.Z())*(PP1.Z()-P1.Z()))<<endl;
681
682   di <<"\nbox  b"<<++nboxvecdp<<" "<<Min(P1.X(),PP1.X())<<" "<<Min(P1.Y(),PP1.Y())<<" "<<Min(PP1.Z(),P1.Z());
683   di <<"  "<<Abs(PP1.X()-P1.X())<<" "<<Abs(PP1.Y()-P1.Y())<<" "<<Abs(PP1.Z()-P1.Z())<< "\n";
684
685   di <<"\nDistance :"<<sqrt( (PP1.X()-P1.X())*(PP1.X()-P1.X())
686                              +(PP1.Y()-P1.Y())*(PP1.Y()-P1.Y())
687                              +(PP1.Z()-P1.Z())*(PP1.Z()-P1.Z()))<< "\n";
688   return(0);
689 }
690 //=======================================================================
691 // nproject
692 //=======================================================================
693
694 #include <TopTools_SequenceOfShape.hxx>
695  static Standard_Integer nproject(Draw_Interpretor& di, Standard_Integer n, const char** a)
696 {
697   if ( n < 4) return 1;
698   TopoDS_Shape InpShape;
699   Standard_Integer arg = 2, i;
700   TopTools_SequenceOfShape Args; 
701
702   Standard_Real Tol = 1.e-4;        
703   Standard_Real Tol2d;
704   Standard_Real MaxDistance = 1.e-3;
705   GeomAbs_Shape Continuity = GeomAbs_C2;  
706   Standard_Integer MaxDeg = 14;           
707   Standard_Integer MaxSeg = 16;           
708
709   while((n > arg) && !(InpShape = DBRep::Get(a[arg])).IsNull()){
710     Args.Append(InpShape);
711     arg++;
712   }
713   if(Args.Length() < 2) return 1;
714   
715   BRepOffsetAPI_NormalProjection OrtProj(Args.Last());
716
717   for(i = 1; i < Args.Length(); i++)
718     OrtProj.Add(Args(i));
719
720   if(n > arg)
721     if (!strcmp(a[arg],"-g")) {
722       OrtProj.SetLimit(Standard_False);
723       arg++;
724     }
725   
726   if(n > arg)
727     if (!strcmp(a[arg],"-d")) {
728       arg++;
729       if(n > arg)
730         MaxDistance = Draw::Atof(a[arg++]);
731       OrtProj.SetMaxDistance(MaxDistance);
732     }
733   if(n > arg) {
734     Tol = Max(Draw::Atof(a[arg++]),1.e-10);
735   }
736
737   if(n > arg) {
738     if (Draw::Atoi(a[arg]) == 0) Continuity = GeomAbs_C0;
739     else if (Draw::Atoi(a[arg]) == 1) Continuity = GeomAbs_C1;
740     arg++;
741   }
742
743  
744   if(n > arg) {
745     MaxDeg = Draw::Atoi(a[arg++]);
746     if (MaxDeg<1 || MaxDeg>14) MaxDeg = 14;
747   }
748
749   if(n > arg) MaxSeg = Draw::Atoi(a[arg]);
750     
751   Tol2d = Pow(Tol, 2./3);
752
753   OrtProj.SetParams(Tol, Tol2d, Continuity, MaxDeg, MaxSeg);
754   OrtProj.Build();
755   TopTools_ListOfShape Wire;
756   Standard_Boolean IsWire=OrtProj.BuildWire(Wire);
757   if (IsWire) {
758     //cout << " BuildWire OK " << endl;
759     di << " BuildWire OK " << "\n";
760   }
761   DBRep::Set(a[1], OrtProj.Shape());
762   return 0;  
763 }
764
765 //==========================================================================
766 //function : wexplo
767 //           exploration of a wire 
768 //==========================================================================
769 static Standard_Integer wexplo (Draw_Interpretor&, 
770                                 Standard_Integer argc, const char** argv)
771
772   char name[100];
773   if (argc < 2) return 1;
774   
775   TopoDS_Shape C1 = DBRep::Get (argv[1],TopAbs_WIRE);
776   TopoDS_Shape C2 ;
777
778   if (argc > 2)  C2 = DBRep::Get (argv[2],TopAbs_FACE);
779
780   if (C1.IsNull()) return 1;
781
782   BRepTools_WireExplorer we;
783   if (C2.IsNull()) we.Init(TopoDS::Wire(C1));
784   else             we.Init(TopoDS::Wire(C1),TopoDS::Face(C2));
785
786   Standard_Integer k = 1;
787   while (we.More()) {
788     TopoDS_Edge E = we.Current();
789     Sprintf(name,"WEDGE_%d",k); 
790           DBRep::Set(name,E);
791     we.Next();
792     k++;
793   }
794
795   return 0;
796 }
797
798 static Standard_Integer scalexyz(Draw_Interpretor& /*di*/, Standard_Integer n, const char** a)
799 {
800   if (n < 6) return 1;
801
802   TopoDS_Shape aShapeBase = DBRep::Get(a[2]);
803   if (aShapeBase.IsNull()) return 1;
804   
805   Standard_Real aFactorX = Draw::Atof(a[3]);
806   Standard_Real aFactorY = Draw::Atof(a[4]);
807   Standard_Real aFactorZ = Draw::Atof(a[5]);
808
809   gp_GTrsf aGTrsf;
810   gp_Mat rot (aFactorX, 0, 0,
811               0, aFactorY, 0,
812               0, 0, aFactorZ);
813   aGTrsf.SetVectorialPart(rot);
814   BRepBuilderAPI_GTransform aBRepGTrsf (aShapeBase, aGTrsf, Standard_False);
815   if (!aBRepGTrsf.IsDone())
816     Standard_ConstructionError::Raise("Scaling not done");
817   TopoDS_Shape Result = aBRepGTrsf.Shape();
818
819   DBRep::Set(a[1], Result);
820   return 0;  
821 }
822
823 void  BRepTest::BasicCommands(Draw_Interpretor& theCommands)
824 {
825   static Standard_Boolean done = Standard_False;
826   if (done) return;
827   done = Standard_True;
828
829   DBRep::BasicCommands(theCommands);
830
831   const char* g = "TOPOLOGY Basic shape commands";
832
833   theCommands.Add("addpcurve",
834                   "addpcurve edge 2dcurve face [tol (default 1.e-7)]",
835                   __FILE__,
836                   addpcurve,g);
837
838   theCommands.Add("reset",
839                   "reset name1 name2..., remove location",
840                   __FILE__,
841                   transform,g);
842
843   theCommands.Add("tmove",
844                   "tmove name1 name2 ...  name(location)",
845                   __FILE__,
846                   transform,g);
847
848   theCommands.Add("ttranslate",
849                   "tmove name1 name2 ...  dx dy dz",
850                   __FILE__,
851                   transform,g);
852
853   theCommands.Add("trotate","trotate name1 name2 ... x y z dx dy dz angle",
854                   __FILE__,
855                   transform,g);
856
857   theCommands.Add("tmirror",
858                   "tmirror name x y z dx dy dz",
859                   __FILE__,
860                   transform,g);
861
862   theCommands.Add("tscale",
863                   "tscale name  x y z scale",
864                   __FILE__,
865                   transform,g);
866
867   theCommands.Add("tcopy",
868     "tcopy [-n(ogeom)] name1 result1 [name2 result2 ...]",
869                   __FILE__,
870                   tcopy,g);
871
872   theCommands.Add("precision",
873                   "precision [preci]",
874                   __FILE__,
875                   precision,g);
876
877   theCommands.Add("mkedgecurve",
878                   "mkedgecurve name tolerance",
879                   __FILE__,
880                   mkedgecurve,g);
881
882   theCommands.Add("fsameparameter",
883                   "fsameparameter shapename [tol (default 1.e-7)], \nforce sameparameter on all edges of the shape",
884                   __FILE__,
885                   sameparameter,g);
886
887   theCommands.Add("sameparameter",
888                   "sameparameter shapename [tol (default 1.e-7)]",
889                   __FILE__,
890                   sameparameter,g);
891
892   theCommands.Add("updatetolerance",
893                   "updatetolerance myShape [param] \n  if [param] is absent - not verify of face tolerance, else - perform it",
894                   __FILE__,
895                   updatetol,g);
896
897   theCommands.Add("solidorientation",
898                   "orientsolid myClosedSolid",
899                   __FILE__,
900                   orientsolid,g);
901
902   theCommands.Add("getcoords",
903     "getcoords vertex1 vertex 2... ; shows coords of input vertices",
904     __FILE__,
905     getcoords,g);
906   
907   theCommands.Add("bounding",
908                   "bounding shape [ xmin ymin zmin xmax ymax zmax] ; draw bounds",
909                   __FILE__,
910                   bounding,g);
911
912   theCommands.Add("boundingstr",
913                   "boundingstr shape [ xmin ymin zmin xmax ymax zmax] ; print bounding box",
914                   __FILE__,
915                   boundingstr,g);
916
917   theCommands.Add("nurbsconvert",
918                   "nurbsconvert result name [result name]",
919                   __FILE__,
920                   nurbsconvert,g);
921
922   theCommands.Add("deform",
923                   "deform newname name CoeffX CoeffY CoeffZ",
924                   __FILE__,
925                   deform,g);
926   
927   theCommands.Add("findplane",
928                   "findplane name planename ",
929                   __FILE__,
930                   findplane,g) ;
931   
932   theCommands.Add("maxtolerance",
933                   "maxtolerance shape ",
934                   __FILE__,
935                   maxtolerance,g) ;
936
937   theCommands.Add("reperageshape",
938                   "reperage shape -> list of shape (result of interstion shape , line)",
939                   __FILE__,
940                   reperageshape,g) ;
941
942   theCommands.Add("vecdc",
943                   "vecdc + Pointe double click ",
944                   __FILE__,
945                   vecdc,g) ;
946
947   theCommands.Add("nproject","nproject pj e1 e2 e3 ... surf -g -d [dmax] [Tol [continuity [maxdeg [maxseg]]]",
948                   __FILE__,
949                   nproject,g);
950
951   theCommands.Add("wexplo","wexplo wire [face] create WEDGE_i",
952                   __FILE__,
953                   wexplo,g);
954
955   theCommands.Add("scalexyz",
956                   "scalexyz res shape factor_x factor_y factor_z",
957                   __FILE__,
958                   scalexyz, g);
959 }