0024277: DRAW command that shows coordinates of a vertex
[occt.git] / src / BRepTest / BRepTest_BasicCommands.cxx
index 642ad5e..30697b7 100755 (executable)
@@ -1,7 +1,23 @@
-// File:       BRepTest_BasicCommands.cxx
-// Created:    Tue Dec 13 09:48:16 1994
-// Author:     Jacques GOUSSARD
-//             <jag@phobox>
+// Created on: 1994-12-13
+// Created by: Jacques GOUSSARD
+// Copyright (c) 1994-1999 Matra Datavision
+// Copyright (c) 1999-2012 OPEN CASCADE SAS
+//
+// The content of this file is subject to the Open CASCADE Technology Public
+// License Version 6.5 (the "License"). You may not use the content of this file
+// except in compliance with the License. Please obtain a copy of the License
+// at http://www.opencascade.org and read it completely before using this file.
+//
+// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
+// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+//
+// The Original Code and all software distributed under the License is
+// distributed on an "AS IS" basis, without warranty of any kind, and the
+// Initial Developer hereby disclaims all such warranties, including without
+// limitation, any warranties of merchantability, fitness for a particular
+// purpose or non-infringement. Please see the License for the specific terms
+// and conditions governing the rights and limitations under the License.
+
 
 #include <Standard_Stream.hxx>
 #include <Standard_Macro.hxx>
 #include <Draw_Marker3D.hxx>
 #include <Draw_MarkerShape.hxx>
 
-#include <TopoDS_Face.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <BRep_Tool.hxx>
-#include <TopTools_ListOfShape.hxx>
-
 #include <stdio.h>
 
 Standard_IMPORT Draw_Viewer dout;
@@ -67,7 +77,7 @@ static Standard_Integer addpcurve(Draw_Interpretor& , Standard_Integer n, const
   TopoDS_Shape F = DBRep::Get(a[3]);
   Standard_Real tol = 1.e-7;
   if (n > 4) {
-    tol = atof(a[4]);
+    tol = Draw::Atof(a[4]);
   }
   BRep_Builder BB;
   BB.UpdateEdge(TopoDS::Edge(E), PC, TopoDS::Face(F),tol); 
@@ -98,25 +108,25 @@ static Standard_Integer transform(Draw_Interpretor& di,Standard_Integer n,const
   }
   else if (!strcmp(a[0],"ttranslate")) {
     if (n < 5) return 1;
-    T.SetTranslation(gp_Vec(atof(a[n-3]),atof(a[n-2]),atof(a[n-1])));
+    T.SetTranslation(gp_Vec(Draw::Atof(a[n-3]),Draw::Atof(a[n-2]),Draw::Atof(a[n-1])));
     last = n-3;
   }
   else if (!strcmp(a[0],"trotate")) {
     if (n < 9) return 1;
-    T.SetRotation(gp_Ax1(gp_Pnt(atof(a[n-7]),atof(a[n-6]),atof(a[n-5])),
-                        gp_Vec(atof(a[n-4]),atof(a[n-3]),atof(a[n-2]))),
-                 atof(a[n-1])* (M_PI / 180.0));
+    T.SetRotation(gp_Ax1(gp_Pnt(Draw::Atof(a[n-7]),Draw::Atof(a[n-6]),Draw::Atof(a[n-5])),
+                        gp_Vec(Draw::Atof(a[n-4]),Draw::Atof(a[n-3]),Draw::Atof(a[n-2]))),
+                 Draw::Atof(a[n-1])* (M_PI / 180.0));
     last = n-7;
   }
   else if (!strcmp(a[0],"tmirror")) {
     if (n < 8) return 1;
-    T.SetMirror(gp_Ax2(gp_Pnt(atof(a[n-6]),atof(a[n-5]),atof(a[n-4])),
-                      gp_Vec(atof(a[n-3]),atof(a[n-2]),atof(a[n-1]))));
+    T.SetMirror(gp_Ax2(gp_Pnt(Draw::Atof(a[n-6]),Draw::Atof(a[n-5]),Draw::Atof(a[n-4])),
+                      gp_Vec(Draw::Atof(a[n-3]),Draw::Atof(a[n-2]),Draw::Atof(a[n-1]))));
     last = n-6;
   }
   else if (!strcmp(a[0],"tscale")) {
     if (n < 6) return 1;
-    T.SetScale(gp_Pnt(atof(a[n-4]),atof(a[n-3]),atof(a[n-2])),atof(a[n-1]));
+    T.SetScale(gp_Pnt(Draw::Atof(a[n-4]),Draw::Atof(a[n-3]),Draw::Atof(a[n-2])),Draw::Atof(a[n-1]));
     last = n-4;
 
   }
@@ -170,8 +180,8 @@ static Standard_Integer deform(Draw_Interpretor& di,Standard_Integer n,const cha
   gp_Trsf T;
   gp_GTrsf GT(T);
   
-//  gp_Mat rot(atof(a[last-3]),0,0,0,atof(a[last-2]),0,0,0,atof(a[last-1]));
-  gp_Mat rot(atof(a[3]),0,0,0,atof(a[4]),0,0,0,atof(a[5]));
+//  gp_Mat rot(Draw::Atof(a[last-3]),0,0,0,Draw::Atof(a[last-2]),0,0,0,Draw::Atof(a[last-1]));
+  gp_Mat rot(Draw::Atof(a[3]),0,0,0,Draw::Atof(a[4]),0,0,0,Draw::Atof(a[5]));
   GT.SetVectorialPart(rot);
   last -= 3;
   BRepBuilderAPI_GTransform gtrf(GT);
@@ -268,7 +278,7 @@ static Standard_Integer mkedgecurve (Draw_Interpretor& ,Standard_Integer n,const
   Standard_Boolean CurveDone ;
 
   if (n < 3) return 1;
-  Standard_Real Tolerance = atof(a[2]) ;
+  Standard_Real Tolerance = Draw::Atof(a[2]) ;
 
   TopoDS_Shape S = DBRep::Get(a[1]);
   
@@ -291,7 +301,7 @@ static Standard_Integer sameparameter(Draw_Interpretor& ,Standard_Integer n,cons
   TopoDS_Shape S = DBRep::Get(a[1]);
   if (S.IsNull()) return 1;
   Standard_Boolean force  = !strcmp(a[0],"fsameparameter");
-  if (n == 3) tol = atof(a[2]);
+  if (n == 3) tol = Draw::Atof(a[2]);
 
   BRepLib::SameParameter(S,tol,force);
 
@@ -360,6 +370,34 @@ static Standard_Integer boundingstr(Draw_Interpretor& di,Standard_Integer n,cons
   return 0;
 }
 
+//=======================================================================
+//function : getcoords
+//purpose  : 
+//=======================================================================
+static Standard_Integer getcoords(Draw_Interpretor& di,Standard_Integer n,const char** a)
+{
+  if(n < 2) 
+    return 1;
+
+  for (Standard_Integer i = 1; i < n; i++) 
+  {
+    const TopoDS_Shape aShape = DBRep::Get (a[i]);
+
+    if (aShape.IsNull())
+      continue;
+
+    if (aShape.ShapeType() == TopAbs_VERTEX)
+    {
+      const TopoDS_Vertex& aVertex = TopoDS::Vertex(aShape);
+      gp_Pnt aPnt = BRep_Tool::Pnt(aVertex);
+
+      di << a[i] << " (x,y,z) : " << aPnt.X() << " " << aPnt.Y() << " " << aPnt.Z() << "\n";
+    }
+  }
+
+  return 0;
+}
+
 //=======================================================================
 //function : bounding
 //purpose  : 
@@ -380,12 +418,12 @@ static Standard_Integer bounding(Draw_Interpretor& di,Standard_Integer n,const c
     di << axmin<<" "<< aymin<<" "<< azmin<<" "<< axmax<<" "<< aymax<<" "<< azmax;
   }
   else if (n == 7) {
-    axmin=atof(a[1]);
-    aymin=atof(a[2]);
-    azmin=atof(a[3]);
-    axmax=atof(a[4]);
-    aymax=atof(a[5]);
-    azmax=atof(a[6]);
+    axmin=Draw::Atof(a[1]);
+    aymin=Draw::Atof(a[2]);
+    azmin=Draw::Atof(a[3]);
+    axmax=Draw::Atof(a[4]);
+    aymax=Draw::Atof(a[5]);
+    azmax=Draw::Atof(a[6]);
     DB = new Draw_Box(gp_Pnt(axmin,aymin,azmin),gp_Pnt(axmax,aymax,azmax),Draw_orange);
     dout<<DB;
   }
@@ -424,7 +462,7 @@ static Standard_Integer precision(Draw_Interpretor& di,Standard_Integer n,const
     di << " Current Precision = " << BRepBuilderAPI::Precision() << "\n";
   }
   else {
-    BRepBuilderAPI::Precision(atof(a[1]));
+    BRepBuilderAPI::Precision(Draw::Atof(a[1]));
   }
   return 0;
 }
@@ -529,45 +567,49 @@ static Standard_Integer maxtolerance(Draw_Interpretor& theCommands,
   Standard_Integer nbF,nbE,nbV;
   TMF=TME=TMV=-RealLast();
   TmF=TmE=TmV=RealLast();
-  nbF=nbE=nbV=0;
+  
+  TopTools_MapOfShape mapS;
+  mapS.Clear();
 
-  TopExp_Explorer ExF;
-  for(ExF.Init(TheShape,TopAbs_FACE);
-      ExF.More();
-      ExF.Next()) { 
-    TopoDS_Face Face=TopoDS::Face(ExF.Current());
+  for(TopExp_Explorer ex(TheShape,TopAbs_FACE);
+      ex.More();
+      ex.Next()) { 
+    TopoDS_Face Face=TopoDS::Face(ex.Current());
     T=BRep_Tool::Tolerance(Face);
     if(T>TMF) TMF=T;
     if(T<TmF) TmF=T;
-    nbF++;
+    mapS.Add(Face);
   }
-  TopExp_Explorer ExE;
-  for(ExE.Init(TheShape,TopAbs_EDGE);
-      ExE.More();
-      ExE.Next()) { 
-    TopoDS_Edge Edge=TopoDS::Edge(ExE.Current());
+  
+  nbF = mapS.Extent();
+  mapS.Clear();
+  
+  for(TopExp_Explorer ex(TheShape,TopAbs_EDGE);
+      ex.More();
+      ex.Next()) { 
+    TopoDS_Edge Edge=TopoDS::Edge(ex.Current());
     T=BRep_Tool::Tolerance(Edge);
     if(T>TME) TME=T;
     if(T<TmE) TmE=T;
-    nbE++;
+    mapS.Add(Edge);
   }
-  TopExp_Explorer ExV;
-  for(ExV.Init(TheShape,TopAbs_VERTEX);
-      ExV.More();
-      ExV.Next()) { 
-    TopoDS_Vertex Vertex=TopoDS::Vertex(ExV.Current());
+
+  nbE = mapS.Extent();
+  mapS.Clear();
+
+  for(TopExp_Explorer ex(TheShape,TopAbs_VERTEX);
+      ex.More();
+      ex.Next()) { 
+    TopoDS_Vertex Vertex=TopoDS::Vertex(ex.Current());
     T=BRep_Tool::Tolerance(Vertex);
     if(T>TMV) TMV=T;
     if(T<TmV) TmV=T;
-    nbV++;
+    mapS.Add(Vertex);
   }
-//    printf("\n## Tolerances sur le shape %s  (nbFaces:%3d  nbEdges:%3d nbVtx:%3d)\n",a[1],nbF,nbE,nbV);
-//    if(TmF<=TMF) printf("\n    Face   : Min %+5.8e    Max  %+5.8e \n ",TmF,TMF);
-//    if(TmE<=TME) printf("\n    Edge   : Min %+5.8e    Max  %+5.8e \n ",TmE,TME);
-//    if(TmV<=TMV) printf("\n    Vertex : Min %+5.8e    Max  %+5.8e \n\n ",TmV,TMV);
 
-#ifndef WNT
+  nbV = mapS.Extent();
+
+//#ifndef WNT
   Standard_SStream sss;
   sss << "\n## Tolerances on the shape " << a[1] << "  (nbFaces:" << nbF
       << "  nbEdges:" << nbE << " nbVtx:" << nbV << ")\n" ;
@@ -577,8 +619,8 @@ static Standard_Integer maxtolerance(Draw_Interpretor& theCommands,
   if(TmE<=TME) sss << "\n    Edge   : Min " << setw(8) << TmE <<"    Max  " << setw(8) << TME << " \n ";
   if(TmV<=TMV) sss << "\n    Vertex : Min " << setw(8) << TmV <<"    Max  " << setw(8) << TMV << " \n ";
   theCommands << sss;
-#endif
-  return(0);
+  //#endif*/
+  return 0;
 }
 
 
@@ -693,26 +735,26 @@ static Standard_Integer vecdc(Draw_Interpretor& di,Standard_Integer ,const char*
     if (!strcmp(a[arg],"-d")) {
       arg++;
       if(n > arg)
-       MaxDistance = atof(a[arg++]);
+       MaxDistance = Draw::Atof(a[arg++]);
       OrtProj.SetMaxDistance(MaxDistance);
     }
   if(n > arg) {
-    Tol = Max(atof(a[arg++]),1.e-10);
+    Tol = Max(Draw::Atof(a[arg++]),1.e-10);
   }
 
   if(n > arg) {
-    if (atoi(a[arg]) == 0) Continuity = GeomAbs_C0;
-    else if (atoi(a[arg]) == 1) Continuity = GeomAbs_C1;
+    if (Draw::Atoi(a[arg]) == 0) Continuity = GeomAbs_C0;
+    else if (Draw::Atoi(a[arg]) == 1) Continuity = GeomAbs_C1;
     arg++;
   }
 
  
   if(n > arg) {
-    MaxDeg = atoi(a[arg++]);
+    MaxDeg = Draw::Atoi(a[arg++]);
     if (MaxDeg<1 || MaxDeg>14) MaxDeg = 14;
   }
 
-  if(n > arg) MaxSeg = atoi(a[arg]);
+  if(n > arg) MaxSeg = Draw::Atoi(a[arg]);
     
   Tol2d = Pow(Tol, 2./3);
 
@@ -752,7 +794,7 @@ static Standard_Integer wexplo (Draw_Interpretor&,
   Standard_Integer k = 1;
   while (we.More()) {
     TopoDS_Edge E = we.Current();
-    sprintf(name,"WEDGE_%d",k);        
+    Sprintf(name,"WEDGE_%d",k);        
          DBRep::Set(name,E);
     we.Next();
     k++;
@@ -761,16 +803,16 @@ static Standard_Integer wexplo (Draw_Interpretor&,
   return 0;
 }
 
-static Standard_Integer scalexyz(Draw_Interpretor& di, Standard_Integer n, const char** a)
+static Standard_Integer scalexyz(Draw_Interpretor& /*di*/, Standard_Integer n, const char** a)
 {
   if (n < 6) return 1;
 
   TopoDS_Shape aShapeBase = DBRep::Get(a[2]);
   if (aShapeBase.IsNull()) return 1;
   
-  Standard_Real aFactorX = atof(a[3]);
-  Standard_Real aFactorY = atof(a[4]);
-  Standard_Real aFactorZ = atof(a[5]);
+  Standard_Real aFactorX = Draw::Atof(a[3]);
+  Standard_Real aFactorY = Draw::Atof(a[4]);
+  Standard_Real aFactorZ = Draw::Atof(a[5]);
 
   gp_GTrsf aGTrsf;
   gp_Mat rot (aFactorX, 0, 0,
@@ -865,6 +907,11 @@ void  BRepTest::BasicCommands(Draw_Interpretor& theCommands)
                  __FILE__,
                  orientsolid,g);
 
+  theCommands.Add("getcoords",
+    "getcoords vertex1 vertex 2... ; shows coords of input vertices",
+    __FILE__,
+    getcoords,g);
+  
   theCommands.Add("bounding",
                  "bounding shape [ xmin ymin zmin xmax ymax zmax] ; draw bounds",
                  __FILE__,