0024023: Revamp the OCCT Handle - gcc and clang
[occt.git] / src / ViewerTest / ViewerTest_RelationCommands.cxx
1 // Created on: 1998-11-12
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1998-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 <ViewerTest.hxx>
18
19 #include <AIS_AngleDimension.hxx>
20 #include <AIS_Circle.hxx>
21 #include <AIS_DiameterDimension.hxx>
22 #include <AIS_DisplayMode.hxx>
23 #include <AIS_InteractiveContext.hxx>
24 #include <AIS_LengthDimension.hxx>
25 #include <AIS_ListIteratorOfListOfInteractive.hxx>
26 #include <AIS_ListOfInteractive.hxx>
27 #include <AIS_MapOfInteractive.hxx>
28 #include <AIS_Point.hxx>
29 #include <AIS_RadiusDimension.hxx>
30 #include <AIS_Relation.hxx>
31 #include <AIS_Shape.hxx>
32 #include <BRepAdaptor_Curve.hxx>
33 #include <BRep_Builder.hxx>
34 #include <BRep_Tool.hxx>
35 #include <BRepTools.hxx>
36 #include <Draw_Interpretor.hxx>
37 #include <Draw.hxx>
38 #include <Draw_Appli.hxx>
39 #include <Draw_Window.hxx>
40 #include <DBRep.hxx>
41 #include <ElSLib.hxx>
42 #include <GC_MakePlane.hxx>
43 #include <Geom_CartesianPoint.hxx>
44 #include <Geom_Circle.hxx>
45 #include <Geom_Line.hxx>
46 #include <Geom_Plane.hxx>
47 #include <GeomAPI_IntCS.hxx>
48 #include <gce_MakeLin.hxx>
49 #include <gce_MakePln.hxx>
50 #include <gp_Circ.hxx>
51 #include <gp_Pln.hxx>
52 #include <IntAna_IntConicQuad.hxx>
53 #include <IntAna_Quadric.hxx>
54 #include <Precision.hxx>
55 #include <StdSelect.hxx>
56 #include <TCollection_AsciiString.hxx>
57 #include <TCollection_ExtendedString.hxx>
58 #include <TColStd_MapOfInteger.hxx>
59 #include <TopAbs.hxx>
60 #include <TopAbs_ShapeEnum.hxx>
61 #include <TopExp.hxx>
62 #include <TopoDS.hxx>
63 #include <TopoDS_Face.hxx>
64 #include <TopoDS_Solid.hxx>
65 #include <TopoDS_Vertex.hxx>
66 #include <V3d_Viewer.hxx>
67 #include <V3d_View.hxx>
68 #include <V3d.hxx>
69 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
70 #include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
71 #include <ViewerTest_EventManager.hxx>
72
73 extern Standard_Boolean VDisplayAISObject (const TCollection_AsciiString& theName,
74                                            const Handle(AIS_InteractiveObject)& theAISObj,
75                                            Standard_Boolean theReplaceIfExists = Standard_True);
76 extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
77 extern int ViewerMainLoop(Standard_Integer argc, const char** argv);
78 extern Handle(AIS_InteractiveContext)& TheAISContext ();
79
80 #define VertexMask 0x01
81 #define EdgeMask 0x02
82 #define FaceMask 0x04
83
84 //=======================================================================
85 //function : Get3DPointAtMousePosition
86 //purpose  : Calculates the 3D points corresponding to the mouse position
87 //           in the plane of the view
88 //=======================================================================
89 static gp_Pnt Get3DPointAtMousePosition()
90 {
91   Handle(V3d_View) aView = ViewerTest::CurrentView();
92
93   Standard_Real xv,yv,zv;
94   aView->Proj (xv,yv,zv);
95   Standard_Real xat,yat,zat;
96   aView->At(xat,yat,zat);
97   gp_Pln aPlane (gp_Pnt(xat,yat,zat), gp_Dir(xv,yv,zv));
98   
99   Standard_Integer aPixX, aPixY;
100   Standard_Real aX, aY, aZ, aDX, aDY, aDZ;
101
102   ViewerTest::GetMousePosition (aPixX, aPixY);
103   aView->ConvertWithProj (aPixX, aPixY, aX, aY, aZ, aDX, aDY, aDZ);
104   gp_Lin aLine( gp_Pnt(aX, aY, aZ), gp_Dir(aDX, aDY, aDZ) );
105
106   // Compute intersection
107   Handle(Geom_Line) aGeomLine = new Geom_Line (aLine);
108   Handle(Geom_Plane) aGeomPlane = new Geom_Plane (aPlane);
109   GeomAPI_IntCS anIntersector (aGeomLine, aGeomPlane);
110   if (!anIntersector.IsDone() || anIntersector.NbPoints() == 0)
111   {
112     return gp::Origin();
113   }
114   return anIntersector.Point (1);
115 }
116
117 //=======================================================================
118 //function : Get3DPointAtMousePosition
119 //purpose  : Calculates the 3D points corresponding to the mouse position
120 //           in the plane of the view
121 //=======================================================================
122 static Standard_Boolean Get3DPointAtMousePosition (const gp_Pnt& theFirstPoint,
123                                                    const gp_Pnt& theSecondPoint,
124                                                    gp_Pnt& theOutputPoint)
125 {
126   theOutputPoint = gp::Origin();
127
128   Handle(V3d_View) aView = ViewerTest::CurrentView();
129
130   Standard_Integer aPixX, aPixY;
131   Standard_Real aX, aY, aZ, aDx, aDy, aDz, aUx, aUy, aUz;
132
133   // Get 3D point in view coordinates and projection vector from the pixel point.
134   ViewerTest::GetMousePosition (aPixX, aPixY);
135   aView->ConvertWithProj (aPixX, aPixY, aX, aY, aZ, aDx, aDy, aDz);
136   gp_Lin aProjLin (gp_Pnt(aX, aY, aZ), gp_Dir(aDx, aDy, aDz));
137
138   // Get plane
139   gp_Vec aDimVec (theFirstPoint, theSecondPoint);
140   aView->Up (aUx, aUy, aUz);
141   gp_Vec aViewUp (aUx, aUy, aUz);
142
143   if (aDimVec.IsParallel (aViewUp, Precision::Angular()))
144   {
145     theOutputPoint = Get3DPointAtMousePosition();
146     return Standard_True;
147   }
148
149   gp_Vec aDimNormal = aDimVec ^ aViewUp;
150   gp_Pln aViewPlane= gce_MakePln (theFirstPoint, aDimNormal);
151
152   // Get intersection of view plane and projection line
153   Handle(Geom_Plane) aPlane = new Geom_Plane (aViewPlane);
154   Handle(Geom_Line) aProjLine = new Geom_Line (aProjLin);
155   GeomAPI_IntCS anIntersector (aProjLine, aPlane);
156   if (!anIntersector.IsDone() || anIntersector.NbPoints() == 0)
157   {
158     return Standard_False;
159   }
160
161   theOutputPoint = anIntersector.Point (1);
162   return Standard_True;
163 }
164
165 //=======================================================================
166 //function : ParseDimensionParams
167 //purpose  : Auxilliary function: sets aspect parameters for
168 //           length, angle, radius and diameter dimension.
169 //
170 //draw args: -text [3d|2d] [wf|sh|wireframe|shading] [Size]
171 //           -label [left|right|hcenter|hfit] [top|bottom|vcenter|vfit]
172 //           -arrow [external|internal|fit] [Length(int)]
173 //           -arrowangle ArrowAngle(degrees)
174 //           -plane xoy|yoz|zox
175 //           -flyout FloatValue -extension FloatValue
176 //           -value CustomNumberValue
177 //           -dispunits DisplayUnitsString
178 //           -modelunits ModelUnitsString
179 //           -showunits
180 //           -hideunits
181 //
182 // Warning! flyout is not an aspect value, it is for dimension parameter
183 // likewise text position, but text position override other paramaters.
184 // For text position changing use 'vmovedim'.
185 //=======================================================================
186 static int ParseDimensionParams (Standard_Integer  theArgNum,
187                                  const char**      theArgVec,
188                                  Standard_Integer  theStartIndex,
189                                  const Handle(Prs3d_DimensionAspect)& theAspect,
190                                  Standard_Boolean& theIsCustomPlane, gp_Pln& thePlane,
191                                  NCollection_DataMap<TCollection_AsciiString, Standard_Real>& theRealParams,
192                                  NCollection_DataMap<TCollection_AsciiString, TCollection_AsciiString>& theStringParams,
193                                  NCollection_List<Handle(AIS_InteractiveObject)>* theShapeList = NULL)
194 {
195   theRealParams.Clear();
196   theStringParams.Clear();
197
198   theIsCustomPlane  = Standard_False;
199
200   // Begin from the second parameter: the first one is dimension name
201   for (Standard_Integer anIt = theStartIndex; anIt < theArgNum; ++anIt)
202   {
203     TCollection_AsciiString aParam (theArgVec[anIt]);
204     aParam.LowerCase();
205
206     if (aParam.Search ("-") == -1)
207     {
208       continue;
209     }
210
211     // Boolean flags
212     if (aParam.IsEqual ("-showunits"))
213     {
214       theAspect->MakeUnitsDisplayed (Standard_True);
215       continue;
216     }
217     else if (aParam.IsEqual ("-hideunits"))
218     {
219       theAspect->MakeUnitsDisplayed (Standard_False);
220       continue;
221     }
222
223     // Before all non-boolean flags parsing check if a flag have at least one value.
224     if (anIt + 1 >= theArgNum)
225     {
226       std::cerr << "Error: "<< aParam <<" flag should have value.\n";
227       return 1;
228     }
229
230     // Non-boolean flags
231     if (aParam.IsEqual ("-shape")
232      || aParam.IsEqual ("-shapes"))
233     {
234       if (!theShapeList)
235       {
236         std::cerr << "Error: unknown parameter '" << aParam << "'\n";
237         return 1;
238       }
239
240       do
241       {
242         anIt++;
243         TCollection_AsciiString anArgString = theArgVec[anIt];
244         Handle(AIS_InteractiveObject) anAISObject;
245         Standard_CString aStr   = anArgString.ToCString();
246         TopoDS_Shape     aShape =  DBRep::Get (aStr);
247         if (!aShape.IsNull())
248         {
249           anAISObject = new AIS_Shape (aShape);
250         }
251         else
252         {
253           if (!GetMapOfAIS().IsBound2 (anArgString))
254           {
255             std::cerr << "Error: shape with name '" << aStr << "' is not found.\n";
256             return 1;
257           }
258
259           anAISObject = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (anArgString));
260           if (anAISObject.IsNull())
261           {
262             std::cerr << "Error: " << aStr <<" is not a shape.\n";
263             return 1;
264           }
265         }
266         theShapeList->Append (anAISObject);
267       }
268       while (anIt + 1 < theArgNum && theArgVec[anIt + 1][0] != '-');
269     }
270     else if (aParam.IsEqual ("-text"))
271     {
272       do
273       {
274         anIt++;
275         TCollection_AsciiString aValue (theArgVec[anIt]);
276         aValue.LowerCase();
277         if (aValue.IsEqual ("3d"))
278         {
279           theAspect->MakeText3d (Standard_True);
280         }
281         else if (aValue.IsEqual ("2d"))
282         {
283           theAspect->MakeText3d (Standard_False);
284         }
285         else if (aValue.IsEqual ("wf") || aValue.IsEqual ("wireframe"))
286         {
287            theAspect->MakeTextShaded (Standard_False);
288         }
289         else if ( aValue.IsEqual ("sh") || aValue.IsEqual ("shading"))
290         {
291           theAspect->MakeTextShaded (Standard_True);
292         }
293         else if (aValue.IsIntegerValue()) // text size
294         {
295           theAspect->TextAspect()->SetHeight (Draw::Atoi (aValue.ToCString()));
296         }
297       }
298       while (anIt + 1 < theArgNum && theArgVec[anIt + 1][0] != '-');
299     }
300     else if (aParam.IsEqual ("-label"))
301     {
302       do
303       {
304         anIt++;
305         TCollection_AsciiString aParamValue (theArgVec[anIt]);
306         aParamValue.LowerCase();
307
308         if (aParamValue == "left")         { theAspect->SetTextHorizontalPosition (Prs3d_DTHP_Left);  }
309         else if (aParamValue == "right")   { theAspect->SetTextHorizontalPosition (Prs3d_DTHP_Right); }
310         else if (aParamValue == "hcenter") { theAspect->SetTextHorizontalPosition (Prs3d_DTHP_Center);}
311         else if (aParamValue == "hfit")    { theAspect->SetTextHorizontalPosition (Prs3d_DTHP_Fit);   }
312         else if (aParamValue == "above")   { theAspect->SetTextVerticalPosition   (Prs3d_DTVP_Above); }
313         else if (aParamValue == "below")   { theAspect->SetTextVerticalPosition   (Prs3d_DTVP_Below); }
314         else if (aParamValue == "vcenter") { theAspect->SetTextVerticalPosition   (Prs3d_DTVP_Center);}
315         else
316         {
317           std::cerr << "Error: invalid label position: '" << aParamValue << "'.\n";
318           return 1;
319         }
320       }
321       while (anIt + 1 < theArgNum && theArgVec[anIt+1][0] != '-');
322     }
323     else if (aParam.IsEqual ("-arrow"))
324     {
325       TCollection_AsciiString aParam (theArgVec[++anIt]);
326       aParam.LowerCase();
327
328       if (aParam == "external") { theAspect->SetArrowOrientation (Prs3d_DAO_External); }
329       if (aParam == "internal") { theAspect->SetArrowOrientation (Prs3d_DAO_Internal); }
330       if (aParam == "fit")      { theAspect->SetArrowOrientation (Prs3d_DAO_Fit); }
331     }
332     else if (aParam.IsEqual ("-arrowlength") || aParam.IsEqual ("-arlen"))
333     {
334       TCollection_AsciiString aValue (theArgVec[++anIt]);
335       if (!aValue.IsRealValue())
336       {
337         std::cerr << "Error: arrow lenght should be float degree value.\n";
338         return 1;
339       }
340       theAspect->ArrowAspect()->SetLength (Draw::Atof (aValue.ToCString()));
341     }
342     else if (aParam.IsEqual ("-arrowangle") || aParam.IsEqual ("-arangle"))
343     {
344       TCollection_AsciiString aValue (theArgVec[++anIt]);
345       if (!aValue.IsRealValue())
346       {
347         std::cerr << "Error: arrow angle should be float degree value.\n";
348         return 1;
349       }
350       theAspect->ArrowAspect()->SetAngle (Draw::Atof (aValue.ToCString()));
351     }
352     else if (aParam.IsEqual ("-color"))
353     {
354       theAspect->SetCommonColor (Quantity_Color (ViewerTest::GetColorFromName (theArgVec[++anIt])));
355     }
356     else if (aParam.IsEqual ("-extension"))
357     {
358       TCollection_AsciiString aParam (theArgVec[++anIt]);
359       if (!aParam.IsRealValue())
360       {
361         std::cerr << "Error: extension size for dimension should be real value.\n";
362         return 1;
363       }
364       theAspect->SetExtensionSize (Draw::Atof (aParam.ToCString()));
365     }
366     else if (aParam.IsEqual ("-plane"))
367     {
368       TCollection_AsciiString aValue (theArgVec[++anIt]);
369       aValue.LowerCase();
370       if (aValue == "xoy")
371       {
372         theIsCustomPlane = Standard_True;
373         thePlane = gp_Pln (gp_Ax3 (gp::XOY()));
374       }
375       else if (aValue == "zox")
376       {
377         theIsCustomPlane = Standard_True;
378         thePlane = gp_Pln (gp_Ax3 (gp::ZOX()));
379       }
380       else if (aValue == "yoz")
381       {
382         theIsCustomPlane = Standard_True;
383         thePlane = gp_Pln (gp_Ax3 (gp::YOZ()));
384       }
385       else
386       {
387         std::cerr << "Error: wrong plane '" << aValue << "'.\n";
388         return 1;
389       }
390     }
391     else if (aParam.IsEqual ("-flyout"))
392     {
393       TCollection_AsciiString aParam (theArgVec[++anIt]);
394       if (!aParam.IsRealValue())
395       {
396         std::cerr << "Error: flyout for dimension should be real value.\n";
397         return 1;
398       }
399
400       theRealParams.Bind ("flyout", Draw::Atof (aParam.ToCString()));
401     }
402     else if (aParam.IsEqual ("-value"))
403     {
404       TCollection_AsciiString aParam (theArgVec[++anIt]);
405       if (!aParam.IsRealValue())
406       {
407         std::cerr << "Error: dimension value for dimension should be real value.\n";
408         return 1;
409       }
410
411       theRealParams.Bind ("value", Draw::Atof (aParam.ToCString()));
412     }
413     else if (aParam.IsEqual ("-modelunits"))
414     {
415       TCollection_AsciiString aParam (theArgVec[++anIt]);
416
417       theStringParams.Bind ("modelunits", aParam);
418     }
419     else if (aParam.IsEqual ("-dispunits"))
420     {
421       TCollection_AsciiString aParam (theArgVec[++anIt]);
422
423       theStringParams.Bind ("dispunits", aParam);
424     }
425     else
426     {
427       std::cerr << "Error: unknown parameter '" << aParam << "'.\n";
428       return 1;
429     }
430   }
431
432   return 0;
433 }
434
435 //=======================================================================
436 //function : SetDimensionParams
437 //purpose  : Sets parameters for dimension
438 //=======================================================================
439 static void SetDimensionParams (const Handle(AIS_Dimension)& theDim,
440                                 const NCollection_DataMap<TCollection_AsciiString, Standard_Real>& theRealParams,
441                                 const NCollection_DataMap<TCollection_AsciiString, TCollection_AsciiString>& theStringParams)
442 {
443   if (theRealParams.IsBound ("flyout"))
444   {
445     theDim->SetFlyout (theRealParams.Find ("flyout"));
446   }
447
448   if (theRealParams.IsBound ("value"))
449   {
450     theDim->SetCustomValue (theRealParams.Find ("value"));
451   }
452
453   if (theStringParams.IsBound ("modelunits"))
454   {
455     theDim->SetModelUnits (theStringParams.Find ("modelunits"));
456   }
457
458   if (theStringParams.IsBound ("dispunits"))
459   {
460     theDim->SetDisplayUnits (theStringParams.Find ("dispunits"));
461   }
462 }
463
464 //=======================================================================
465 //function : VDimBuilder
466 //purpose  : Command for building dimension presentations: angle,
467 //           length, radius, diameter
468 //=======================================================================
469 static int VDimBuilder (Draw_Interpretor& /*theDi*/,
470                         Standard_Integer  theArgsNb,
471                         const char**      theArgs)
472 {
473   if (theArgsNb < 2)
474   {
475     std::cerr << "Error: wrong number of arguments.\n";
476     return 1;
477   }
478
479   // Parse parameters
480   TCollection_AsciiString aName (theArgs[1]);
481
482   NCollection_List<Handle(AIS_InteractiveObject)> aShapes;
483   Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect;
484   Standard_Boolean isPlaneCustom = Standard_False;
485   gp_Pln aWorkingPlane;
486
487   NCollection_DataMap<TCollection_AsciiString, Standard_Real> aRealParams;
488   NCollection_DataMap<TCollection_AsciiString, TCollection_AsciiString> aStringParams;
489
490   TCollection_AsciiString aDimType(theArgs[2]);
491   aDimType.LowerCase();
492   AIS_KindOfDimension aKindOfDimension;
493   if (aDimType == "-length")
494   {
495     aKindOfDimension = AIS_KOD_LENGTH;
496   }
497   else if (aDimType == "-angle")
498   {
499     aKindOfDimension = AIS_KOD_PLANEANGLE;
500   }
501   else if (aDimType == "-radius")
502   {
503     aKindOfDimension = AIS_KOD_RADIUS;
504   }
505   else if (aDimType == "-diameter" || aDimType == "-diam")
506   {
507     aKindOfDimension = AIS_KOD_DIAMETER;
508   }
509   else
510   {
511     std::cerr << "Error: wrong type of dimension.\n";
512     return 1;
513   }
514
515
516   if (ParseDimensionParams (theArgsNb, theArgs, 3,
517                             anAspect,isPlaneCustom,aWorkingPlane,
518                             aRealParams, aStringParams, &aShapes))
519   {
520     return 1;
521   }
522
523   // Build dimension
524   Handle(AIS_Dimension) aDim;
525   switch (aKindOfDimension)
526   {
527     case AIS_KOD_LENGTH:
528     {
529       if (!isPlaneCustom)
530       {
531         std::cerr << theArgs[0] << ": can not build dimension without working plane.\n";
532         return 1;
533       }
534       if (aShapes.Extent() == 1)
535       {
536         if (aShapes.First()->Type() == AIS_KOI_Shape
537           && (Handle(AIS_Shape)::DownCast(aShapes.First()))->Shape().ShapeType() != TopAbs_EDGE)
538         {
539           std::cerr << theArgs[0] << ": wrong shape type.\n";
540           return 1;
541         }
542         // Adjust working plane
543         TopoDS_Edge anEdge = TopoDS::Edge ((Handle(AIS_Shape)::DownCast(aShapes.First()))->Shape());
544         TopoDS_Vertex aFirst, aSecond;
545         TopExp::Vertices (anEdge, aFirst, aSecond);
546         aDim = new AIS_LengthDimension (anEdge, aWorkingPlane);
547
548         // Move standard plane (XOY, YOZ or ZOX) to the first point to make it working for dimension
549         aWorkingPlane.SetLocation (Handle(AIS_LengthDimension)::DownCast (aDim)->FirstPoint());
550       }
551       else if (aShapes.Extent() == 2)
552       {
553         TopoDS_Shape aShape1, aShape2;
554
555         // Getting shapes
556         if (aShapes.First()->DynamicType() == STANDARD_TYPE (AIS_Point))
557         {
558           Handle(AIS_Point) aPoint1 = Handle(AIS_Point)::DownCast (aShapes.First ());
559           aShape1 = aPoint1->Vertex();
560         }
561         else if (aShapes.First()->Type() == AIS_KOI_Shape)
562         {
563           aShape1 = (Handle(AIS_Shape)::DownCast (aShapes.First()))->Shape();
564         }
565
566         if (aShapes.Last()->DynamicType() == STANDARD_TYPE (AIS_Point))
567         {
568           Handle(AIS_Point) aPoint2 = Handle(AIS_Point)::DownCast (aShapes.Last ());
569           aShape2 = aPoint2->Vertex();
570         }
571         else if (aShapes.Last()->Type() == AIS_KOI_Shape)
572         {
573           aShape2 = (Handle(AIS_Shape)::DownCast (aShapes.Last()))->Shape();
574         }
575
576         if (aShape1.IsNull() || aShape2.IsNull())
577         {
578           std::cerr << theArgs[0] << ": wrong shape type.\n";
579           return 1;
580         }
581
582         // Adjust working plane
583         if (aShape1.ShapeType() == TopAbs_VERTEX)
584         {
585           aWorkingPlane.SetLocation (BRep_Tool::Pnt (TopoDS::Vertex (aShape1)));
586         }
587         else if (aShape2.ShapeType() == TopAbs_VERTEX)
588         {
589           aWorkingPlane.SetLocation (BRep_Tool::Pnt (TopoDS::Vertex (aShape2)));
590         }
591
592         aDim = new AIS_LengthDimension (aShape1, aShape2, aWorkingPlane);
593       }
594       else
595       {
596         std::cerr << theArgs[0] << ": wrong number of shapes to build dimension.\n";
597         return 1;
598       }
599
600       break;
601     }
602     case AIS_KOD_PLANEANGLE:
603     {
604       if (aShapes.Extent() == 1 && aShapes.First()->Type()==AIS_KOI_Shape)
605       {
606         Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aShapes.First());
607         if (aShape->Shape().ShapeType() == TopAbs_FACE)
608           aDim = new AIS_AngleDimension (TopoDS::Face(aShape->Shape()));
609       }
610       if (aShapes.Extent() == 2)
611       {
612         Handle(AIS_Shape) aShape1 = Handle(AIS_Shape)::DownCast(aShapes.First());
613         Handle(AIS_Shape) aShape2 = Handle(AIS_Shape)::DownCast(aShapes.Last());
614         if (!aShape1.IsNull() && !aShape2.IsNull()
615           && aShape1->Shape().ShapeType() == TopAbs_EDGE
616           && aShape2->Shape().ShapeType() == TopAbs_EDGE)
617           aDim = new AIS_AngleDimension (TopoDS::Edge(aShape1->Shape()),TopoDS::Edge(aShape2->Shape()));
618         else
619         {
620           std::cerr << theArgs[0] << ": wrong shapes for angle dimension.\n";
621           return 1;
622         }
623       }
624       else if (aShapes.Extent() == 3)
625       {
626         gp_Pnt aP1, aP2, aP3;
627         Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast (aShapes.First());
628         if (aPoint.IsNull())
629           return 1;
630         aP1 = aPoint->Component()->Pnt();
631         aShapes.RemoveFirst();
632         aPoint = Handle(AIS_Point)::DownCast (aShapes.First());
633         if (aPoint.IsNull())
634           return 1;
635         aP2 = aPoint->Component()->Pnt();
636         aShapes.RemoveFirst();
637         aPoint = Handle(AIS_Point)::DownCast (aShapes.First());
638         if (aPoint.IsNull())
639           return 1;
640         aP3 = aPoint->Component()->Pnt();
641         aDim = new AIS_AngleDimension (aP1, aP2, aP3);
642       }
643       else
644       {
645         std::cerr << theArgs[0] << ": wrong number of shapes to build dimension.\n";
646         return 1;
647       }
648
649       break;
650     }
651     case AIS_KOD_RADIUS: // radius of the circle
652     {
653       if (aShapes.Extent() == 1)
654       {
655         if (aShapes.First()->DynamicType() == STANDARD_TYPE(AIS_Circle))
656         {
657           Handle(AIS_Circle) aShape = Handle(AIS_Circle)::DownCast (aShapes.First());
658           gp_Circ aCircle = aShape->Circle()->Circ();
659           aDim = new AIS_RadiusDimension (aCircle);
660         }
661         else
662         {
663           Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (aShapes.First());
664           if (aShape.IsNull())
665           {
666             std::cerr << "Error: shape for radius is of wrong type.\n";
667             return 1;
668           }
669           aDim = new AIS_RadiusDimension (aShape->Shape());
670         }
671       }
672       else
673       {
674         std::cerr << theArgs[0] << ": wrong number of shapes to build dimension.\n";
675         return 1;
676       }
677
678       break;
679     }
680     case AIS_KOD_DIAMETER:
681     {
682       if (aShapes.Extent() == 1)
683       {
684         if (aShapes.First()->DynamicType() == STANDARD_TYPE(AIS_Circle))
685         {
686           Handle(AIS_Circle) aShape = Handle(AIS_Circle)::DownCast (aShapes.First());
687           gp_Circ aCircle = aShape->Circle()->Circ();
688           aDim = new AIS_DiameterDimension (aCircle);
689         }
690         else
691         {
692           Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (aShapes.First());
693           if (aShape.IsNull())
694           {
695             std::cerr << "Error: shape for radius is of wrong type.\n";
696             return 1;
697           }
698           aDim = new AIS_DiameterDimension (aShape->Shape());
699         }
700       }
701       else
702       {
703         std::cerr << theArgs[0] << ": wrong number of shapes to build dimension.\n";
704         return 1;
705       }
706
707       break;
708     }
709     default:
710     {
711       std::cerr << theArgs[0] << ": wrong type of dimension. Type help for more information.\n";
712       return 1;
713     }
714   }
715
716   // Check dimension geometry
717   if (!aDim->IsValid())
718   {
719     std::cerr << theArgs[0] << ":dimension geometry is invalid, " << aDimType.ToCString()
720       << " dimension can't be built on input shapes.\n";
721     return 1;
722   }
723
724   aDim->SetDimensionAspect (anAspect);
725
726   SetDimensionParams (aDim, aRealParams, aStringParams);
727
728   VDisplayAISObject (aName,aDim);
729
730   return 0;
731 }
732
733 //=======================================================================
734 //function : VAngleDimBuilder
735 //purpose  : 
736 //=======================================================================
737
738 static int VAngleDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
739 {
740   Standard_Integer aCurrentIndex;
741   if (argc!=2)
742   {
743     di << argv[0] << " error : wrong number of parameters.\n";
744     return 1;
745   }
746
747   TheAISContext()->CloseAllContexts();
748   aCurrentIndex =  TheAISContext()->OpenLocalContext();
749   // Set selection mode for edges.
750   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2));
751   di << "Select two edges coplanar or not.\n";
752
753   Standard_Integer anArgsNum = 5;
754   const char *aBuffer[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
755   const char **anArgsVec = (const char **) aBuffer;
756   while (ViewerMainLoop (anArgsNum, anArgsVec)) { }
757
758   TopoDS_Shape aFirstShape;
759   for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected())
760   {
761     aFirstShape = TheAISContext()->SelectedShape();
762   }
763
764   if (aFirstShape.IsNull())
765   {
766     di << argv[0] << " error : no picked shape.\n";
767     return 1;
768   }
769
770   if (aFirstShape.ShapeType()== TopAbs_EDGE)
771   {
772     while (ViewerMainLoop (anArgsNum, anArgsVec)) { }
773
774     TopoDS_Shape aSecondShape;
775     for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected())
776     {
777       aSecondShape = TheAISContext()->SelectedShape();
778     }
779
780     if (aSecondShape.IsNull())
781     {
782       di << argv[0] << " error : no picked shape.\n";
783       return 1;
784     }
785
786     if (aSecondShape.ShapeType() != TopAbs_EDGE)
787     {
788       di << argv[0] <<" error: you should have selected an edge.\n"; return 1;
789     }
790
791     // Close local context to draw dimension in the neutral point.
792     TheAISContext()->CloseLocalContext (aCurrentIndex);
793
794     // Construct the dimension.
795     Handle (AIS_AngleDimension) aDim= new AIS_AngleDimension (TopoDS::Edge(aFirstShape) ,TopoDS::Edge(aSecondShape));
796     VDisplayAISObject (argv[1], aDim);
797   }
798   else
799   {
800     di << argv[0] << " error: you must select 2 edges.\n";
801     return 1;
802   }
803
804   return 0;
805 }
806
807 //==============================================================================
808 //function : VDiameterDim
809 //purpose  : Display the diameter dimension of a face or an edge.
810 //Draw arg : vdiameterdim Name 
811 //==============================================================================
812
813 static int VDiameterDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
814 {
815   // Declarations
816   Standard_Integer aCurrentIndex;
817
818   // Verification
819   if (argc != 2)
820   {
821     di<<" vdiameterdim error"<<"\n";
822     return 1;
823   }
824
825   // Close all local contexts
826   TheAISContext()->CloseAllContexts();
827   // Open local context and get its index for recovery
828   TheAISContext()->OpenLocalContext();
829   aCurrentIndex = TheAISContext()->IndexOfCurrentLocal();
830   
831   // Activate 'edge' selection mode
832   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
833   di<<" Select an circled edge."<<"\n";
834   
835   // Loop that will handle the picking.
836   Standard_Integer argcc = 5;
837   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
838   const char **argvv = (const char **) buff;
839   while (ViewerMainLoop( argcc, argvv) ) { }
840   // end of the loop.
841   
842   TopoDS_Shape aShape;
843   for(TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected())
844   {
845     aShape = TheAISContext()->SelectedShape();
846   }
847
848   if (aShape.IsNull())
849   {
850     di << argv[0] << ": no shape is selected." << "\n";
851     return 1;
852   }
853
854   if (aShape.ShapeType() != TopAbs_EDGE)
855   {
856     di << " vdiameterdim error: the selection of a face or an edge was expected." << "\n";
857     return 1;
858   }
859
860   // Compute the radius
861   BRepAdaptor_Curve aCurve (TopoDS::Edge (aShape));
862
863   if (aCurve.GetType() != GeomAbs_Circle)
864   {
865     di << "vdiameterdim error: the edge is not a circular one." << "\n";
866     return 1;
867   }
868
869   // Construction of the diameter dimension.
870   TheAISContext()->CloseLocalContext (aCurrentIndex);
871   Handle (AIS_DiameterDimension) aDiamDim= new AIS_DiameterDimension (aShape);
872   VDisplayAISObject (argv[1], aDiamDim);
873
874   return 0;
875 }
876
877
878 //==============================================================================
879 // Fonction  vconcentric
880 // -----------------  Uniquement par selection dans le viewer.
881 //==============================================================================
882
883 //==============================================================================
884 //function : VConcentric
885 //purpose  : Display the concentric relation between two surfaces.
886 //Draw arg : vconcentric Name
887 //==============================================================================
888 #include <AIS_ConcentricRelation.hxx>
889 #include <Geom_Plane.hxx>
890 #include <gp_Pln.hxx>
891 #include <GC_MakePlane.hxx>
892 #include <BRepAdaptor_Curve.hxx>
893 #include <TopExp_Explorer.hxx>
894
895
896 static int VConcentricBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
897 {
898   // Declarations
899   Standard_Integer myCurrentIndex;
900   
901   // Verification
902   if (argc!=2) {di<<"vconcentric  error."<<"\n";return 1;}
903   // Fermeture des contextes locaux
904   TheAISContext()->CloseAllContexts();
905   // Ouverture d'un contexte local et recuperation de son index.
906   TheAISContext()->OpenLocalContext();
907   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
908   
909   // On active les modes de selections Edges et Faces.
910   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
911   di<<" Select a circled edge."<<"\n";
912   
913   // Boucle d'attente waitpick.
914   Standard_Integer argcc = 5;
915   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
916   const char **argvv = (const char **) buff;
917   while (ViewerMainLoop( argcc, argvv) ) { }
918   // fin de la boucle
919   
920   TopoDS_Shape ShapeA;
921   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
922     ShapeA = TheAISContext()->SelectedShape();
923   }
924   // ShapeA est un edge
925   // ==================
926   if (ShapeA.ShapeType()==TopAbs_EDGE  ) {
927     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
928     di<<" Select an edge."<<"\n";
929     
930     // Boucle d'attente waitpick.
931     Standard_Integer argccc = 5;
932     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
933     const char **argvvv = (const char **) bufff;
934     while (ViewerMainLoop( argccc, argvvv) ) { }
935     // fin de la boucle
936     
937     TopoDS_Shape ShapeB;
938     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
939       ShapeB = TheAISContext()->SelectedShape();
940     }
941     if (ShapeB.ShapeType()!=TopAbs_EDGE  ) {
942       di<<" vconcentric error: select an edge."<<"\n";return 1;
943     }
944      
945     // Construction du plane.
946     // On recupere le centre du cercle A.
947     BRepAdaptor_Curve theCurveA(TopoDS::Edge(ShapeA) );
948     gp_Circ theCircleA=theCurveA.Circle();
949     gp_Pnt theCenterA=theCircleA.Location();
950     // On recupere deux points sur le cercle A
951     gp_Pnt B= theCurveA.Value(0.25);
952     gp_Pnt C= theCurveA.Value(0.75);
953     // Construction du plane.
954     GC_MakePlane MkPlane(theCenterA ,B ,C );
955     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
956     
957     // Fermeture du context local
958     TheAISContext()->CloseLocalContext(myCurrentIndex);
959     
960     Handle (AIS_ConcentricRelation) myConcentry= new AIS_ConcentricRelation(ShapeA, ShapeB, theGeomPlane );
961     TheAISContext()->Display(myConcentry );
962     GetMapOfAIS().Bind (myConcentry,argv[1]);
963   }
964   
965   
966   else {
967     di<<" vconcentric  error: the selection of a face or an edge was expected."<<"\n";return 1;
968   }
969   
970   return 0;
971   
972   
973   
974   
975 }
976
977 //==============================================================================
978 //function : VEqualDistRelation
979 //purpose  : 
980 //Draw arg : vdiameterdim Name DiameterValue
981 //==============================================================================
982 #include <AIS_EqualDistanceRelation.hxx>
983 #include <BRepExtrema_ExtCC.hxx>
984 #include <GC_MakePlane.hxx>
985
986
987 static int VEqualDistRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
988 {
989   // Declarations
990   Standard_Integer myCurrentIndex;
991   
992   // Verification
993   if (argc!=2) {di<<" vequaldistrelation error: no arguments allowed."<<"\n";return 1;}
994   
995   // Fermeture des contextes locaux
996   TheAISContext()->CloseAllContexts();
997   
998   // Ouverture d'un contexte local et recuperation de son index.
999   TheAISContext()->OpenLocalContext();
1000   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1001   
1002   // On active les modes de selections Edges et Vertexes.
1003   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
1004   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
1005   di<<" Select an edge or a vertex"<<"\n";
1006   
1007   // Boucle d'attente waitpick.
1008   Standard_Integer argc1 = 5;
1009   const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1010   const char **argv1 = (const char **) buf1;
1011   while (ViewerMainLoop( argc1, argv1) ) { }
1012   // fin de la boucle
1013   
1014   TopoDS_Shape ShapeA;
1015   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1016     ShapeA = TheAISContext()->SelectedShape();
1017   }
1018   
1019   di<<" Select an edge or a vertex"<<"\n";
1020   // Boucle d'attente waitpick.
1021   Standard_Integer argc2 = 5;
1022   const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1023   const char **argv2 = (const char **) buf2;
1024   while (ViewerMainLoop( argc2, argv2) ) { }
1025   // fin de la boucle
1026   
1027   TopoDS_Shape ShapeB;
1028   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1029     ShapeB = TheAISContext()->SelectedShape();
1030   }
1031   
1032   // Verification des resultats.
1033   if (ShapeA.ShapeType()==TopAbs_EDGE && ShapeB.ShapeType()==TopAbs_EDGE  ) {
1034     // A et B sont des edges ils doivent etre paralleles
1035     BRepExtrema_ExtCC myDeltaEdge (TopoDS::Edge(ShapeA) ,TopoDS::Edge(ShapeB)  );
1036     // on verifie qu'ils sont pas paralleles.
1037     if (!myDeltaEdge.IsParallel() ) {di<<"vequaldist error: non parallel edges."<<"\n";return 1; }
1038     
1039   }
1040   
1041   
1042   di<<" Select an edge or a vertex"<<"\n";
1043   // Boucle d'attente waitpick.
1044   Standard_Integer argc3 = 5;
1045   const char *buf3[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1046   const char **argv3 = (const char **) buf3;
1047   while (ViewerMainLoop( argc3, argv3) ) { }
1048   // fin de la boucle
1049   
1050   TopoDS_Shape ShapeC;
1051   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1052     ShapeC = TheAISContext()->SelectedShape();
1053   }
1054   
1055   di<<" Select an edge or a vertex"<<"\n";
1056   // Boucle d'attente waitpick.
1057   Standard_Integer argc4 = 5;
1058   const char *buf4[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1059   const char **argv4 = (const char **) buf4;
1060   while (ViewerMainLoop( argc4, argv4) ) { }
1061   // fin de la boucle
1062   
1063   TopoDS_Shape ShapeD;
1064   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1065     ShapeD = TheAISContext()->SelectedShape();
1066   }
1067   // Verification des resultats.
1068   if (ShapeC.ShapeType()==TopAbs_EDGE && ShapeD.ShapeType()==TopAbs_EDGE  ) {
1069     // C et D sont des edges ils doivent etre paralleles
1070     BRepExtrema_ExtCC myDeltaEdge2 (TopoDS::Edge(ShapeC) ,TopoDS::Edge(ShapeD)  );
1071     // on verifie qu'ils sont pas paralleles.
1072     if (!myDeltaEdge2.IsParallel() ) {di<<"vequaldist error: non parallel edges."<<"\n";return 1; }
1073     
1074   }
1075   
1076   // Creation du plan porteur de la contrainte.Methode lourde!
1077   gp_Pnt A,B,C;
1078   if (ShapeA.ShapeType()==TopAbs_EDGE) {
1079     // A est un edge
1080     TopoDS_Vertex Va,Vb;
1081     TopExp::Vertices (TopoDS::Edge(ShapeA) ,Va ,Vb );
1082     A=BRep_Tool::Pnt(Va);
1083     B=BRep_Tool::Pnt(Vb);
1084     
1085     if (ShapeB.ShapeType()==TopAbs_EDGE) {
1086       // B est un edge aussi
1087       TopoDS_Vertex Vc,Vd;
1088       TopExp::Vertices (TopoDS::Edge(ShapeB) ,Vc ,Vd );
1089       // besoin que de 1 point.
1090       C=BRep_Tool::Pnt(Vc);
1091       
1092     }
1093     else {
1094       // B est un vertex
1095       C=BRep_Tool::Pnt(TopoDS::Vertex(ShapeB) );
1096     }
1097   }
1098   else {
1099     // A est un vertex
1100     A=BRep_Tool::Pnt(TopoDS::Vertex(ShapeA) );
1101     
1102     if (ShapeB.ShapeType()==TopAbs_EDGE ) {
1103       // B est un edge 
1104       TopoDS_Vertex Vb,Vc;
1105       TopExp::Vertices (TopoDS::Edge(ShapeB) ,Vb ,Vc );
1106       // besoin que de 2 points.
1107       B=BRep_Tool::Pnt(Vb);
1108       C=BRep_Tool::Pnt(Vc);
1109       
1110     }
1111     else {
1112       // B est un vertex
1113       B=BRep_Tool::Pnt(TopoDS::Vertex(ShapeB) );
1114       C.SetX(B.X()+5.);
1115       C.SetY(B.Y()+5.);
1116       C.SetZ(B.Z()+5.);
1117       
1118     }
1119   }
1120   
1121   // Fermeture du context local.
1122   TheAISContext()->CloseLocalContext(myCurrentIndex);
1123   
1124   // construction du plane 
1125   GC_MakePlane MkPlane(A ,B ,C );
1126   Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1127   
1128   // Construction de l'AIS_EqualDistanceRelation
1129   Handle (AIS_EqualDistanceRelation ) myRelation= new AIS_EqualDistanceRelation (ShapeA, ShapeB, ShapeC ,ShapeD , theGeomPlane );
1130   TheAISContext()->Display(myRelation );
1131   GetMapOfAIS().Bind (myRelation,argv[1]);
1132   
1133
1134   
1135   return 0;
1136   
1137 }
1138
1139 //==============================================================================
1140 //function : VEqualRadiusRelation
1141 //purpose  : 
1142 //Draw arg : vdiameterdim Name DiameterValue
1143 //==============================================================================
1144 #include <AIS_EqualRadiusRelation.hxx>
1145 #include <GC_MakePlane.hxx>
1146 #include <BRepAdaptor_Curve.hxx>
1147
1148
1149 static int VEqualRadiusRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1150 {
1151   // Declarations
1152   Standard_Integer myCurrentIndex;
1153   
1154   // Verification
1155   if (argc!=2) {di<<" vequalrad error: no arguments allowed."<<"\n";return 1;}
1156   
1157   // Fermeture des contextes locaux
1158   TheAISContext()->CloseAllContexts();
1159   
1160   // Ouverture d'un contexte local et recuperation de son index.
1161   TheAISContext()->OpenLocalContext();
1162   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1163   
1164   // On active les modes de selections Edges.
1165   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
1166   di<<" Select an circled edge "<<"\n";
1167   
1168   // Boucle d'attente waitpick.
1169   Standard_Integer argc1 = 5;
1170   const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1171   const char **argv1 = (const char **) buf1;
1172   while (ViewerMainLoop( argc1, argv1) ) { }
1173   // fin de la boucle
1174   
1175   TopoDS_Shape ShapeA;
1176   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1177     ShapeA = TheAISContext()->SelectedShape();
1178   }
1179   
1180   di<<" Select the last circled edge."<<"\n";
1181   // Boucle d'attente waitpick.
1182   Standard_Integer argc2 = 5;
1183   const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1184   const char **argv2 = (const char **) buf2;
1185   while (ViewerMainLoop( argc2, argv2) ) { }
1186   // fin de la boucle
1187   
1188   TopoDS_Shape ShapeB;
1189   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1190     ShapeB = TheAISContext()->SelectedShape();
1191   }
1192   // creation du plan qui contient la contrainte.
1193   TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
1194   TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
1195   BRepAdaptor_Curve theCurveA(EdgeA);
1196   // On recupere 3 points A,B,C de la curve.
1197   gp_Pnt A=theCurveA.Value(0.1);
1198   gp_Pnt B=theCurveA.Value(0.5);
1199   gp_Pnt C=theCurveA.Value(0.9);
1200   
1201   // fermeture du contexte local.
1202   TheAISContext()->CloseLocalContext(myCurrentIndex);
1203   
1204   // Creation du plane.
1205   GC_MakePlane MkPlane (A ,B ,C );
1206   Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1207   // Construction de l'AIS_EqualRadiusRelation
1208   Handle (AIS_EqualRadiusRelation ) myRelation= new AIS_EqualRadiusRelation (EdgeA,EdgeB, theGeomPlane );
1209   TheAISContext()->Display(myRelation );
1210   GetMapOfAIS().Bind (myRelation,argv[1]);
1211   
1212   return 0;
1213   
1214 }
1215
1216
1217 //==============================================================================
1218 //function : VFixRelation
1219 //purpose  : 
1220 //Draw arg : vdiameterdim Name DiameterValue
1221 //==============================================================================
1222 #include <AIS_FixRelation.hxx>
1223 #include <GC_MakePlane.hxx>
1224 #include <BRepAdaptor_Curve.hxx>
1225
1226 static int VFixRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1227 {
1228   // Declarations
1229   Standard_Integer myCurrentIndex;
1230   
1231   // Verification
1232   if (argc!=2) {di<<" vfix  error: no arguments allowed."<<"\n";return 1;}
1233   
1234   // Fermeture des contextes locaux
1235   TheAISContext()->CloseAllContexts();
1236   
1237   // Ouverture d'un contexte local et recuperation de son index.
1238   TheAISContext()->OpenLocalContext();
1239   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1240   
1241   // On active les modes de selections edge.
1242   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
1243   di<<" Select an edge. "<<"\n";
1244   
1245   // Boucle d'attente waitpick.
1246   Standard_Integer argc1 = 5;
1247   const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1248   const char **argv1 = (const char **) buf1;
1249   while (ViewerMainLoop( argc1, argv1) ) { }
1250   // fin de la boucle
1251   
1252   TopoDS_Shape ShapeA;
1253   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1254     ShapeA = TheAISContext()->SelectedShape();
1255   }
1256   
1257   // creation du plan qui contient la contrainte.
1258   TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
1259   BRepAdaptor_Curve theCurveA(EdgeA);
1260   // On recupere 3 points A,B,C de la curve.
1261   gp_Pnt A=theCurveA.Value(0.1);
1262   gp_Pnt B=theCurveA.Value(0.5);
1263   gp_Pnt D=theCurveA.Value(0.9);
1264   gp_Pnt C(B.X()+5,B.Y()+5,B.Z()+5);
1265   
1266   // fermeture du contexte local.
1267   TheAISContext()->CloseLocalContext(myCurrentIndex);
1268   
1269   // Creation du plane.
1270   GC_MakePlane MkPlane (A ,D ,C );
1271   Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1272   // Construction de l'AIS_EqualRadiusRelation
1273   Handle (AIS_FixRelation) myRelation= new AIS_FixRelation (EdgeA,theGeomPlane );
1274   TheAISContext()->Display(myRelation );
1275   GetMapOfAIS().Bind (myRelation,argv[1]);
1276   
1277   
1278   return 0;
1279   
1280 }
1281
1282 //==============================================================================
1283 //function : VIdenticRelation
1284 //purpose  : 
1285 //Draw arg : vdiameterdim Name DiameterValue
1286 //==============================================================================
1287 #include <AIS_IdenticRelation.hxx>
1288 #include <BRepAdaptor_Curve.hxx>
1289 #include <TopExp_Explorer.hxx>
1290
1291
1292 static int VIdenticRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1293 {
1294   // Declarations
1295   Standard_Integer myCurrentIndex;
1296   
1297   // Verification
1298   if (argc!=2) {di<<" videntity error: no arguments allowed."<<"\n";return 1;}
1299   
1300   // Fermeture des contextes locaux
1301   TheAISContext()->CloseAllContexts();
1302   
1303   // Ouverture d'un contexte local et recuperation de son index.
1304   TheAISContext()->OpenLocalContext();
1305   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1306   
1307   // On active les modes de selections  vertex et face.
1308   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
1309   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
1310   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
1311   di<<" Select an edge, a face or a vertex. "<<"\n";
1312   
1313   // Boucle d'attente waitpick.
1314   Standard_Integer argc1 = 5;
1315   const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1316   const char **argv1 = (const char **) buf1;
1317   while (ViewerMainLoop( argc1, argv1) ) { }
1318   // fin de la boucle
1319   
1320   TopoDS_Shape ShapeA;
1321   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1322     ShapeA = TheAISContext()->SelectedShape();
1323   }
1324   
1325   di<<" Select an edge, a face or a vertex. "<<"\n";
1326   // Boucle d'attente waitpick.
1327   Standard_Integer argc2 = 5;
1328   const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1329   const char **argv2 = (const char **) buf2;
1330   while (ViewerMainLoop( argc2, argv2) ) { }
1331   // fin de la boucle
1332   
1333   TopoDS_Shape ShapeB;
1334   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1335     ShapeB = TheAISContext()->SelectedShape();
1336   }
1337   
1338   // Recuperation de points pour construir le Geom_Plnae.
1339   gp_Pnt A,B,C;
1340   if (ShapeA.ShapeType()==TopAbs_EDGE) {
1341     // A est un edge; on peut supposer qu'il sera element d'une face ou possesseur d'un vertex ou identic a un autre edge.
1342     // on recupere deux points sur l'edge (il peut etre rectiligne)
1343     TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
1344     BRepAdaptor_Curve theCurveA(EdgeA);
1345     // Creation des 3 points.
1346     A=theCurveA.Value(0.1);
1347     B=theCurveA.Value(0.9);
1348     C.SetX(B.X()+5.);
1349     C.SetY(B.Y()+5.);
1350     C.SetZ(B.Z()+5.);
1351   }
1352   else if (ShapeA.ShapeType()==TopAbs_VERTEX ) {
1353     // SahpeA est un Vertex
1354     // On va utiliser ShapeB
1355     if (ShapeB.ShapeType()==TopAbs_EDGE) {
1356       // B est un edge 
1357       TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
1358       BRepAdaptor_Curve theCurveB(EdgeB);
1359       // Creation des 3 points.
1360       A=theCurveB.Value(0.1);
1361       B=theCurveB.Value(0.9);
1362       C.SetX(B.X()+5.);
1363       C.SetY(B.Y()+5.);
1364       C.SetZ(B.Z()+5.);
1365       
1366     }
1367     else if (ShapeB.ShapeType()==TopAbs_FACE ) {
1368       // Shape B est une face
1369       TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
1370       // On recupere 1 edge de FaceB(la face n'a pas forcement de vertex) (l'element A est forcement dans B).
1371       TopExp_Explorer FaceExp(FaceB,TopAbs_EDGE);
1372       TopoDS_Edge EdgeFromB=TopoDS::Edge(FaceExp.Current() );
1373       // On recupere les 3 points de l'edge de face B
1374       BRepAdaptor_Curve theCurveB(EdgeFromB);
1375       // On recupere 3 points A,B,C de la curve.
1376       A=theCurveB.Value(0.1);
1377       B=theCurveB.Value(0.5);
1378       C=theCurveB.Value(0.9);
1379       
1380     }
1381     else {
1382       // B ets un vetex aussi
1383       A=BRep_Tool::Pnt(TopoDS::Vertex(ShapeA) );
1384       B=BRep_Tool::Pnt(TopoDS::Vertex(ShapeB) );
1385       C.SetX(B.X()+5.);
1386       C.SetY(B.Y()+5.);
1387       C.SetZ(B.Z()+5.);
1388       
1389     }
1390     
1391   }
1392   else {
1393     // A est une face.
1394     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
1395     // On recupere 1 edge de FaceA
1396     TopExp_Explorer FaceExp(FaceA,TopAbs_EDGE);
1397     TopoDS_Edge EdgeFromA=TopoDS::Edge(FaceExp.Current() );
1398     // On recupere les 3 points de l'edge
1399     BRepAdaptor_Curve theCurveA(EdgeFromA);
1400     // On recupere 3 points A,B,C de la curve.
1401     A=theCurveA.Value(0.1);
1402     B=theCurveA.Value(0.5);
1403     C=theCurveA.Value(0.9);
1404     
1405   }
1406   
1407   // Fermeture du context local.
1408   TheAISContext()->CloseLocalContext(myCurrentIndex);
1409   // On construit le plane 
1410   GC_MakePlane MkPlane (A ,B ,C );
1411   Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1412   
1413   // Construction de l'AIS_IdenticRelation
1414   Handle ( AIS_IdenticRelation ) myRelation= new AIS_IdenticRelation  (ShapeA ,ShapeB, theGeomPlane );
1415   TheAISContext()->Display(myRelation );
1416   GetMapOfAIS().Bind (myRelation,argv[1]);
1417   
1418
1419   
1420   return 0;
1421   
1422 }
1423 //==============================================================================
1424 //function : VLengthDimension
1425 //purpose  : Display the diameter dimension of a face or an edge.
1426 //Draw arg : vdiameterdim Name DiameterValue
1427 //==============================================================================
1428 #include <AIS_LengthDimension.hxx>
1429 #include <BRepExtrema_ExtCC.hxx>
1430 #include <BRepExtrema_ExtPC.hxx>
1431 #include <BRepExtrema_ExtCF.hxx>
1432 #include <BRepExtrema_ExtPF.hxx>
1433 #include <BRepExtrema_ExtFF.hxx>
1434 #include <TCollection_ExtendedString.hxx>
1435 #include <BRepExtrema_DistShapeShape.hxx>
1436 #include <gce_MakePln.hxx>
1437 #include <TopExp_Explorer.hxx>
1438 #include <BRepBuilderAPI_MakeVertex.hxx>
1439
1440 static int VLenghtDimension(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1441 {
1442   // Declarations
1443   Standard_Integer aCurrentIndex;
1444   // Verification
1445   if (argc != 2)
1446   {
1447     di << argv[0] << " error: wrong number of arguments.\n";
1448     return 1;
1449   }
1450
1451   // Close all local contexts
1452   TheAISContext()->CloseAllContexts();
1453
1454   // Open local context
1455   aCurrentIndex = TheAISContext()->OpenLocalContext();
1456   // Activate 'edge', 'face' and 'vertex' selection modes.
1457   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2));
1458   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1));
1459   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4));
1460
1461   // First shape picking
1462   di << " Select an edge, a face or a vertex. " << "\n";
1463   // Loop that will handle the picking.
1464   Standard_Integer argc1 = 5;
1465   const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1466   const char **argv1 = (const char **) buf1;
1467   while (ViewerMainLoop( argc1, argv1) ) { }
1468   // end of the loop.
1469
1470   TopoDS_Shape aFirstShape;
1471   for(TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected())
1472   {
1473     aFirstShape = TheAISContext()->SelectedShape();
1474   }
1475
1476   if (aFirstShape.IsNull())
1477   {
1478     di << argv[0] << "error: no first picked shape.\n";
1479     return 1;
1480   }
1481
1482   // Second shape picking
1483   di << " Select an edge, a face or a vertex. " << "\n";
1484   // Loop that will handle the picking.
1485   Standard_Integer argc2 = 5;
1486   const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1487   const char **argv2 = (const char **) buf2;
1488   while (ViewerMainLoop( argc2, argv2) ) { }
1489
1490   TopoDS_Shape aSecondShape;
1491   for(TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected())
1492   {
1493     aSecondShape = TheAISContext()->SelectedShape();
1494   }
1495
1496   if (aSecondShape.IsNull())
1497   {
1498     di << argv[0] << "error: no second picked shape.\n";
1499     return 1;
1500   }
1501
1502   if (aFirstShape.ShapeType() == TopAbs_EDGE)
1503   {
1504     TopoDS_Edge EdgeA = TopoDS::Edge (aFirstShape);
1505
1506     if (aSecondShape.ShapeType() == TopAbs_EDGE)
1507     {
1508       TopoDS_Edge EdgeB = TopoDS::Edge (aSecondShape);
1509       BRepExtrema_ExtCC myDeltaEdge (EdgeA ,EdgeB);
1510
1511       if (!myDeltaEdge.IsParallel())
1512       {
1513         di << argv[0] << " error: non parallel edges." << "\n";
1514         return 1;
1515       }
1516
1517       // 3 points of edges is recovered to build a plane
1518       TopoDS_Vertex aVertex1, aVertex2, aVertex3, aVertex4;
1519       TopExp::Vertices (EdgeA, aVertex1, aVertex2);
1520       TopExp::Vertices (EdgeB, aVertex3, aVertex4);
1521       gp_Pnt A = BRep_Tool::Pnt (aVertex1);
1522       gp_Pnt B = BRep_Tool::Pnt (aVertex2);
1523       gp_Pnt C = BRep_Tool::Pnt (aVertex3);
1524
1525       gce_MakePln aMakePlane (A,B,C);
1526       gp_Pln aPlane= aMakePlane.Value();
1527
1528       // Close local context
1529       TheAISContext()->CloseLocalContext (aCurrentIndex);
1530
1531       // Construct the dimension
1532       Handle(AIS_LengthDimension ) aLenghtDim = new AIS_LengthDimension (EdgeA, EdgeB, aPlane);
1533       TheAISContext()->Display (aLenghtDim);
1534       GetMapOfAIS().Bind (aLenghtDim, argv[1]);
1535     }
1536
1537     else if (aSecondShape.ShapeType() == TopAbs_VERTEX)
1538     {
1539       TopoDS_Vertex aVertex = TopoDS::Vertex (aSecondShape);
1540       BRepExtrema_ExtPC myDeltaEdgeVertex  (aVertex ,EdgeA);
1541
1542       TopoDS_Vertex aVertex1, aVertex2;
1543       TopExp::Vertices (EdgeA, aVertex1, aVertex2);
1544       gp_Pnt A=BRep_Tool::Pnt (aVertex1);
1545       gp_Pnt B=BRep_Tool::Pnt (aVertex2);
1546       gp_Pnt C=BRep_Tool::Pnt (aVertex);
1547
1548       gce_MakePln aMakePlane (A,B,C);
1549       gp_Pln aPlane= aMakePlane.Value();
1550
1551       TheAISContext()->CloseLocalContext (aCurrentIndex);
1552       Handle(AIS_LengthDimension) aLenghtDim=new AIS_LengthDimension (EdgeA, aVertex, aPlane);
1553       TheAISContext()->Display (aLenghtDim);
1554       GetMapOfAIS().Bind (aLenghtDim, argv[1]);
1555     }
1556
1557     // Second shape is a face
1558     else
1559     {
1560       TopoDS_Face FaceB = TopoDS::Face (aSecondShape);
1561       BRepExtrema_ExtCF aDeltaEdgeFace (EdgeA,FaceB);
1562
1563       if (!aDeltaEdgeFace.IsParallel())
1564       {
1565         di << argv[0] << "error: the edge isn't parallel to the face;can't compute the distance." << "\n";
1566         return 1;
1567       }
1568
1569       Handle(AIS_LengthDimension) aLenghtDim = new AIS_LengthDimension (FaceB, EdgeA);
1570       TheAISContext()->Display (aLenghtDim);
1571       GetMapOfAIS().Bind (aLenghtDim, argv[1]);
1572     }
1573   }
1574   else if (aFirstShape.ShapeType() == TopAbs_VERTEX)
1575   {
1576     TopoDS_Vertex  VertexA = TopoDS::Vertex (aFirstShape);
1577     if (aSecondShape.ShapeType() == TopAbs_EDGE )
1578     {
1579       TopoDS_Edge  EdgeB=TopoDS::Edge (aSecondShape);
1580       BRepExtrema_ExtPC aDeltaEdgeVertex (VertexA, EdgeB);
1581
1582       TopoDS_Vertex aVertex1, aVertex2;
1583       TopExp::Vertices(EdgeB, aVertex1, aVertex2);
1584       gp_Pnt A = BRep_Tool::Pnt (aVertex1);
1585       gp_Pnt B = BRep_Tool::Pnt (aVertex2);
1586       gp_Pnt C = BRep_Tool::Pnt (VertexA);
1587
1588       gce_MakePln aMakePlane (A,B,C);
1589       gp_Pln aPlane = aMakePlane.Value();
1590
1591       // Close local contex by its index.
1592       TheAISContext()->CloseLocalContext (aCurrentIndex);
1593
1594       // Construct the dimension.
1595       Handle(AIS_LengthDimension) aLenghtDim = new AIS_LengthDimension (EdgeB,VertexA, aPlane);
1596       TheAISContext()->Display (aLenghtDim);
1597       GetMapOfAIS().Bind (aLenghtDim, argv[1]);
1598     }
1599
1600     else if (aSecondShape.ShapeType() == TopAbs_VERTEX)
1601     {
1602       TopoDS_Vertex  VertexB = TopoDS::Vertex (aSecondShape);
1603
1604       gp_Pnt A = BRep_Tool::Pnt (VertexA);
1605       gp_Pnt B = BRep_Tool::Pnt (VertexB);
1606       gp_Pnt C(B.X() + 10.0, B.Y() + 10.0, B.Z() + 10.0);
1607
1608       gce_MakePln aMakePlane (A,B,C);
1609       gp_Pln aPlane= aMakePlane.Value();
1610
1611       TheAISContext()->CloseLocalContext (aCurrentIndex);
1612
1613       Handle(AIS_LengthDimension ) aLenghtDim = new AIS_LengthDimension (VertexA, VertexB, aPlane);
1614       TheAISContext()->Display (aLenghtDim);
1615       GetMapOfAIS().Bind (aLenghtDim, argv[1]);
1616     }
1617     // The second shape is face
1618     else
1619     {
1620       TopoDS_Face  FaceB = TopoDS::Face (aSecondShape);
1621
1622       BRepExtrema_ExtPF aDeltaVertexFace (VertexA, FaceB);
1623
1624       gp_Pnt A = BRep_Tool::Pnt (VertexA);
1625
1626       // Recover edge from face.
1627       TopExp_Explorer aFaceExp (FaceB,TopAbs_EDGE);
1628       TopoDS_Edge aSecondEdge = TopoDS::Edge (aFaceExp.Current());
1629
1630       TopoDS_Vertex aVertex1, aVertex2;
1631       TopExp::Vertices (aSecondEdge, aVertex1, aVertex2);
1632       gp_Pnt C = BRep_Tool::Pnt (aVertex2);
1633
1634       gp_Pnt aProjA = aDeltaVertexFace.Point(1);
1635       BRepBuilderAPI_MakeVertex aVertexMaker (aProjA);
1636       TopoDS_Vertex aVertexAProj = aVertexMaker.Vertex();
1637
1638       // Create working plane for the dimension.
1639       gce_MakePln aMakePlane (A, aProjA, C);
1640       gp_Pln aPlane = aMakePlane.Value();
1641
1642       TheAISContext()->CloseLocalContext (aCurrentIndex);
1643
1644       // Construct the dimension.
1645       Handle(AIS_LengthDimension ) aLenghtDim = new AIS_LengthDimension (VertexA, aVertexAProj, aPlane);
1646       TheAISContext()->Display (aLenghtDim);
1647       GetMapOfAIS().Bind (aLenghtDim, argv[1]);
1648     }
1649   }
1650
1651   // The first shape is a face.
1652   else
1653   {
1654     TopoDS_Face FaceA = TopoDS::Face (aFirstShape);
1655
1656     if (aSecondShape.ShapeType() == TopAbs_EDGE)
1657     {
1658       TopoDS_Edge EdgeB = TopoDS::Edge (aSecondShape);
1659       BRepExtrema_ExtCF aDeltaEdgeFace (EdgeB,FaceA );
1660
1661       if (!aDeltaEdgeFace.IsParallel())
1662       {
1663         di << argv[0] << " error: the edge isn't parallel to the face;can't compute the distance. " << "\n";
1664         return 1;
1665       }
1666
1667       Handle(AIS_LengthDimension) aLenghtDim = new AIS_LengthDimension (FaceA, EdgeB);
1668       TheAISContext()->Display (aLenghtDim);
1669       GetMapOfAIS().Bind (aLenghtDim, argv[1]);
1670     }
1671
1672     else if (aSecondShape.ShapeType() == TopAbs_VERTEX)
1673     {
1674       TopoDS_Vertex  VertexB = TopoDS::Vertex (aSecondShape);
1675       BRepExtrema_ExtPF aDeltaVertexFace (VertexB, FaceA);
1676
1677       gp_Pnt B = BRep_Tool::Pnt (VertexB);
1678
1679       TopExp_Explorer aFaceExp (FaceA, TopAbs_EDGE);
1680       TopoDS_Edge anEdgeFromA = TopoDS::Edge (aFaceExp.Current());
1681       TopoDS_Vertex  aVertex1, aVertex2;
1682       TopExp::Vertices(anEdgeFromA, aVertex1, aVertex2);
1683       gp_Pnt A=BRep_Tool::Pnt(aVertex1);
1684
1685 #ifdef OCCT_DEBUG
1686       gp_Pnt C = BRep_Tool::Pnt(aVertex2);
1687 #endif
1688
1689       gp_Pnt aProjB = aDeltaVertexFace.Point(1);
1690       BRepBuilderAPI_MakeVertex aVertexMaker (aProjB);
1691       TopoDS_Vertex aVertexBProj = aVertexMaker.Vertex();
1692       gce_MakePln aMakePlane (A, B, aProjB);
1693       gp_Pln aPlane= aMakePlane.Value();
1694
1695       TheAISContext()->CloseLocalContext(aCurrentIndex);
1696
1697       Handle(AIS_LengthDimension) aLenghtDim  =new AIS_LengthDimension (VertexB, aVertexBProj, aPlane);
1698       TheAISContext()->Display (aLenghtDim);
1699       GetMapOfAIS().Bind (aLenghtDim, argv[1]);
1700     }
1701     // the second shape is face.
1702     else
1703     {
1704       TopoDS_Face FaceB = TopoDS::Face (aSecondShape);
1705       BRepExtrema_ExtFF aDeltaFaceFace (FaceA, FaceB);
1706
1707       if (!aDeltaFaceFace.IsParallel())
1708       {
1709         di << argv[0] << " error: the faces are not parallel. "<<"\n";
1710         return 1;
1711       }
1712
1713       TheAISContext()->CloseLocalContext (aCurrentIndex);
1714
1715       Handle(AIS_LengthDimension) aLenghtDim = new AIS_LengthDimension (FaceA,FaceB);
1716       TheAISContext()->Display (aLenghtDim);
1717       GetMapOfAIS().Bind (aLenghtDim, argv[1]);
1718     }
1719   }
1720
1721   return 0;
1722 }
1723
1724
1725 //==============================================================================
1726 //function : VRadiusDim
1727 //purpose  : Display the radius dimension of a face or an edge.
1728 //Draw arg : vradiusdim Name 
1729 //==============================================================================
1730 #include <AIS_RadiusDimension.hxx>
1731 #include <TCollection_ExtendedString.hxx>
1732 #include <BRepAdaptor_Curve.hxx>
1733 #include <gp_Circ.hxx>
1734
1735
1736 static int VRadiusDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1737 {
1738   // Declarations
1739   Standard_Integer aCurrentIndex;
1740   TopoDS_Edge anEdge;
1741   // Verification
1742   if (argc != 2)
1743   {
1744     di << argv[0] << " error: wrong number of parameters." << "\n";
1745     return 1;
1746   }
1747
1748   // Close all local contexts
1749   TheAISContext()->CloseAllContexts();
1750
1751   // Open local context and get its index for recovery.
1752   TheAISContext()->OpenLocalContext();
1753   aCurrentIndex = TheAISContext()->IndexOfCurrentLocal();
1754
1755   // Current selection modes - faces and edges
1756   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2));
1757   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4));
1758   di << " Select a circled edge or face." << "\n";
1759
1760   // Loop that will be handle picking.
1761   Standard_Integer argcc = 5;
1762   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1763   const char **argvv = (const char **) buff;
1764   while (ViewerMainLoop (argcc, argvv)) { }
1765   // end of the loop
1766
1767   TopoDS_Shape aShape;
1768
1769   for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() )
1770   {
1771     aShape = TheAISContext()->SelectedShape();
1772   }
1773
1774   if (aShape.IsNull())
1775   {
1776     di << argv[0] << ": no shape is selected." << "\n";
1777     return 1;
1778   }
1779
1780   if (aShape.ShapeType() != TopAbs_EDGE && aShape.ShapeType() != TopAbs_FACE)
1781   {
1782     di << argv[0] << " error: the selection of a face or an edge was expected." << "\n";
1783     return 1;
1784   }
1785
1786   if (aShape.ShapeType() == TopAbs_EDGE)
1787   {
1788     anEdge = TopoDS::Edge (aShape);
1789   }
1790   else // Face
1791   {
1792     // Recover an edge of the face.
1793     TopoDS_Face aFace = TopoDS::Face (aShape);
1794
1795     TopExp_Explorer aFaceExp (aFace,TopAbs_EDGE);
1796     anEdge = TopoDS::Edge (aFaceExp.Current());
1797   }
1798
1799   // Compute the radius
1800   BRepAdaptor_Curve aCurve (anEdge);
1801   if (aCurve.GetType() != GeomAbs_Circle)
1802   {
1803     di << argv[0] << " error: the edge is not a circular one." << "\n";
1804     return 1;
1805   }
1806   // Close the context
1807   TheAISContext()->CloseLocalContext (aCurrentIndex);
1808
1809   // Construct radius dimension
1810   Handle (AIS_RadiusDimension) aRadDim= new AIS_RadiusDimension (aShape);
1811   VDisplayAISObject (argv[1], aRadDim);
1812
1813   return 0;
1814 }
1815
1816
1817
1818 //==============================================================================
1819 //function : VOffsetDim
1820 //purpose  : Display the offset dimension
1821 //Draw arg : voffsetdim Name 
1822 //==============================================================================
1823 #include <AIS_OffsetDimension.hxx>
1824 #include <TCollection_ExtendedString.hxx>
1825 #include <BRepExtrema_ExtFF.hxx>
1826
1827
1828 static int VOffsetDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1829 {
1830   // Declarations
1831   Standard_Integer myCurrentIndex;
1832   Standard_Real    theDist;
1833   
1834   // Verification
1835   if (argc!=2) {di<<" voffsetdim error"<<"\n";return 1;}
1836   
1837   // Fermeture des contextes locaux
1838   TheAISContext()->CloseAllContexts();
1839   
1840   // Ouverture d'un contexte local et recuperation de son index.
1841   TheAISContext()->OpenLocalContext();
1842   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1843   
1844   // On active les modes de selections Faces.
1845   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
1846   di<<" Select a face."<<"\n";
1847   
1848   // Boucle d'attente waitpick.
1849   Standard_Integer argcc = 5;
1850   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1851   const char **argvv = (const char **) buff;
1852   while (ViewerMainLoop( argcc, argvv) ) { }
1853   // fin de la boucle
1854   
1855   TopoDS_Shape ShapeA;
1856   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1857     ShapeA = TheAISContext()->SelectedShape();
1858   }
1859   
1860   di<<" Select a face."<<"\n";
1861   // Boucle d'attente waitpick.
1862   Standard_Integer argccc = 5;
1863   const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1864   const char **argvvv = (const char **) bufff;
1865   while (ViewerMainLoop( argccc, argvvv) ) { }
1866   // fin de la boucle
1867   
1868   TopoDS_Shape ShapeB;
1869   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1870     ShapeB = TheAISContext()->SelectedShape();
1871   }
1872   
1873   
1874   // Shape A et B est une face
1875   if (ShapeA.ShapeType()==TopAbs_FACE && ShapeB.ShapeType()==TopAbs_FACE ) {
1876     
1877     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
1878     TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
1879     
1880     BRepExtrema_ExtFF myDeltaFaceFace  (FaceA ,FaceB );
1881     // On verifie que les deux faces sont bien parelles.
1882     if (!myDeltaFaceFace.IsParallel() ) {di<<"vdistdim error: the faces are not parallel. "<<"\n";return 1; }
1883     
1884     // On saisit la distance et on l'arrondit!
1885     theDist=Round (sqrt (myDeltaFaceFace.SquareDistance(1))*10. )/10.;
1886     // Fermeture du contexte local.
1887     TheAISContext()->CloseLocalContext(myCurrentIndex);
1888     // Construction du texte.
1889     TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("offset=")+TCollection_ExtendedString(theDist ) );
1890     
1891     // on construit l'AIS_OffsetDimension
1892     Handle(AIS_OffsetDimension) myOffsetDim=new AIS_OffsetDimension (FaceA,FaceB,theDist,TheMessage_Str );
1893     TheAISContext()->Display(myOffsetDim );
1894     GetMapOfAIS().Bind (myOffsetDim ,argv[1]);
1895     
1896     
1897     
1898   }
1899   
1900   else {
1901     di<<" voffsetdim error: the selection of a face was expected."<<"\n";return 1;
1902   }
1903   
1904   return 0;
1905   
1906 }
1907
1908
1909
1910
1911 //==============================================================================
1912 //function : VParallel
1913 //purpose  : Display the parallel relation 
1914 //Draw arg : vparallel Name 
1915 //==============================================================================
1916 #include <AIS_ParallelRelation.hxx>
1917 #include <TCollection_ExtendedString.hxx>
1918 #include <BRepExtrema_ExtFF.hxx>
1919 #include <BRepExtrema_ExtCC.hxx>
1920 #include <GC_MakePlane.hxx>
1921 #include <BRepAdaptor_Curve.hxx>
1922 #include <TopExp_Explorer.hxx>
1923
1924
1925 static int VParallelBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1926 {
1927   // Declarations
1928   Standard_Integer myCurrentIndex;
1929  
1930   // Verification
1931   if (argc!=2) {di<<" vparallel error"<<"\n";return 1;}
1932   
1933   // Fermeture des contextes locaux
1934   TheAISContext()->CloseAllContexts();
1935   
1936   // Ouverture d'un contexte local et recuperation de son index.
1937   TheAISContext()->OpenLocalContext();
1938   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1939   
1940   // On active les modes de selections Edges.
1941   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
1942   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
1943   di<<" Select an edge or a face "<<"\n";
1944   
1945   // Boucle d'attente waitpick.
1946   Standard_Integer argcc = 5;
1947   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1948   const char **argvv = (const char **) buff;
1949   while (ViewerMainLoop( argcc, argvv) ) { }
1950   // fin de la boucle
1951   
1952   TopoDS_Shape ShapeA;
1953   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1954     ShapeA = TheAISContext()->SelectedShape();
1955   }
1956   
1957   // SahpeA est un edge.
1958   // ===================
1959   if (ShapeA.ShapeType()==TopAbs_EDGE ) {
1960     
1961     // desactivation du mode face
1962     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
1963     di<<" Select a second edge"<<"\n";
1964     // Boucle d'attente waitpick.
1965     Standard_Integer argccc = 5;
1966     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1967     const char **argvvv = (const char **) bufff;
1968     while (ViewerMainLoop( argccc, argvvv) ) { }
1969     // fin de la boucle
1970     
1971     TopoDS_Shape ShapeB;
1972     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1973       ShapeB = TheAISContext()->SelectedShape();
1974     }
1975     
1976     // recuperation des edges.
1977     TopoDS_Edge  EdgeA=TopoDS::Edge(ShapeA);
1978     TopoDS_Edge  EdgeB=TopoDS::Edge(ShapeB);
1979     BRepExtrema_ExtCC myDeltaEdge (EdgeA ,EdgeB );
1980     // on verifie qu'ils ne sont pas paralleles.
1981     if (!myDeltaEdge.IsParallel() ) {di<<"vparallel error: non parallel edges."<<"\n";return 1; }
1982     
1983     
1984     // On recupere les  vertexes extremites des edge A et B.
1985     BRepAdaptor_Curve theCurveA(EdgeA);
1986     BRepAdaptor_Curve theCurveB(EdgeB);
1987     // On recupere 3 points A,B,C des  curves.
1988     gp_Pnt A=theCurveA.Value(0.1);
1989     gp_Pnt B=theCurveA.Value(0.9);
1990     gp_Pnt C=theCurveB.Value(0.5);
1991     
1992     // Construction du Geom_Plane
1993     GC_MakePlane MkPlane(A,B,C);
1994     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1995     // Fermeture du contexte local.
1996     TheAISContext()->CloseLocalContext(myCurrentIndex);
1997     // Construction de l'AIS_ParallelRelation
1998     Handle(AIS_ParallelRelation) myParaRelation= new AIS_ParallelRelation(EdgeA ,EdgeB ,theGeomPlane );
1999     TheAISContext()->Display(myParaRelation );
2000     GetMapOfAIS().Bind (myParaRelation ,argv[1]);
2001     
2002     
2003   }
2004   
2005   // Shape A est une face
2006   // ====================
2007   else {
2008     
2009     // desactivation du mode edge
2010     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
2011     di<<" Select a second edge"<<"\n";
2012     // Boucle d'attente waitpick.
2013     Standard_Integer argccc = 5;
2014     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2015     const char **argvvv = (const char **) bufff;
2016     while (ViewerMainLoop( argccc, argvvv) ) { }
2017     // fin de la boucle
2018     
2019     TopoDS_Shape ShapeB;
2020     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2021       ShapeB = TheAISContext()->SelectedShape();
2022     }
2023     
2024     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
2025     TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
2026     
2027     BRepExtrema_ExtFF myDeltaFaceFace  (FaceA ,FaceB );
2028     // On verifie que les deux faces sont bien parelles.
2029     if (!myDeltaFaceFace.IsParallel() ) {di<<"vdistdim error: the faces are not parallel. "<<"\n";return 1; }
2030     
2031     // recuperation des edges des faces.
2032     TopExp_Explorer FaceExpA(FaceA,TopAbs_EDGE);
2033     TopExp_Explorer FaceExpB(FaceB,TopAbs_EDGE);
2034     
2035     TopoDS_Edge EdgeA=TopoDS::Edge(FaceExpA.Current() );
2036     TopoDS_Edge EdgeB=TopoDS::Edge(FaceExpB.Current() );
2037     
2038     // On recupere les  vertexes extremites des edge A et B.
2039     BRepAdaptor_Curve theCurveA(EdgeA);
2040     BRepAdaptor_Curve theCurveB(EdgeB);
2041     // On recupere 3 points A,B,C des  curves.
2042     gp_Pnt A=theCurveA.Value(0.1);
2043     gp_Pnt B=theCurveA.Value(0.9);
2044     gp_Pnt C=theCurveB.Value(0.5);
2045     
2046     // Construction du Geom_Plane
2047     GC_MakePlane MkPlane(A,B,C);
2048     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2049     // Fermeture du contexte local.
2050     TheAISContext()->CloseLocalContext(myCurrentIndex);
2051     // Construction de l'AIS_ParallelRelation
2052     Handle(AIS_ParallelRelation) myParaRelation= new AIS_ParallelRelation(FaceA ,FaceB ,theGeomPlane );
2053     TheAISContext()->Display(myParaRelation );
2054     GetMapOfAIS().Bind (myParaRelation ,argv[1]);
2055     
2056     
2057     
2058   }
2059   
2060   
2061   return 0;
2062   
2063 }
2064
2065
2066
2067
2068 //==============================================================================
2069 //function : VPerpendicularRelation
2070 //purpose  : Display the Perpendicular Relation
2071 //Draw arg : vperpendicular Name 
2072 //==============================================================================
2073 #include <AIS_PerpendicularRelation.hxx>
2074 #include <TCollection_ExtendedString.hxx>
2075 #include <GC_MakePlane.hxx>
2076 #include <BRepAdaptor_Curve.hxx>
2077 #include <TopExp_Explorer.hxx>
2078
2079
2080
2081 static int VPerpendicularBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
2082 {
2083   // Declarations
2084   Standard_Integer myCurrentIndex;
2085  
2086   // Verification
2087   if (argc!=2) {di<<" vortho error"<<"\n";return 1;}
2088   
2089   // Fermeture des contextes locaux
2090   TheAISContext()->CloseAllContexts();
2091   
2092   // Ouverture d'un contexte local et recuperation de son index.
2093   TheAISContext()->OpenLocalContext();
2094   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
2095   
2096   // On active les modes de selections Edges.
2097   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
2098   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
2099   di<<" Select an edge or a face "<<"\n";
2100   
2101   // Boucle d'attente waitpick.
2102   Standard_Integer argcc = 5;
2103   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2104   const char **argvv = (const char **) buff;
2105   while (ViewerMainLoop( argcc, argvv) ) { }
2106   // fin de la boucle
2107   
2108   TopoDS_Shape ShapeA;
2109   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2110     ShapeA = TheAISContext()->SelectedShape();
2111   }
2112   
2113   // ShapeA est un edge.
2114   // ===================
2115   if (ShapeA.ShapeType()==TopAbs_EDGE ) {
2116     
2117     // desactivation du mode face
2118     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
2119     di<<" Select a second edge"<<"\n";
2120     // Boucle d'attente waitpick.
2121     Standard_Integer argccc = 5;
2122     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2123     const char **argvvv = (const char **) bufff;
2124     while (ViewerMainLoop( argccc, argvvv) ) { }
2125     // fin de la boucle
2126     
2127     TopoDS_Shape ShapeB;
2128     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2129       ShapeB = TheAISContext()->SelectedShape();
2130     }
2131     
2132     // recuperation des edges.
2133     TopoDS_Edge  EdgeA=TopoDS::Edge(ShapeA);
2134     TopoDS_Edge  EdgeB=TopoDS::Edge(ShapeB);
2135     
2136     // On recupere les  curves
2137     BRepAdaptor_Curve theCurveA(EdgeA);
2138     BRepAdaptor_Curve theCurveB(EdgeB);
2139     // on verifie si les edges sont orthogonaux.
2140     //gp_Lin theLineA=theCurveA.Line();
2141     //gp_Lin theLineB=theCurveB.Line();
2142     //if (abs(theLineA.Angle(theLineB) ) != M_PI/2 ) {cout<<"vperpendicular error: Edges are not  othogonals."<<endl;return 1;}
2143     
2144     // On recupere 3 points A,B,C des  curves.
2145     gp_Pnt A=theCurveA.Value(0.1);
2146     gp_Pnt B=theCurveA.Value(0.9);
2147     gp_Pnt C=theCurveB.Value(0.5);
2148     // Construction du Geom_Plane
2149     GC_MakePlane MkPlane(A,B,C);
2150     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2151     // Fermeture du contexte local.
2152     TheAISContext()->CloseLocalContext(myCurrentIndex);
2153     // Construction de l'AIS_ParallelRelation
2154     Handle(AIS_PerpendicularRelation) myOrthoRelation= new AIS_PerpendicularRelation (EdgeA ,EdgeB ,theGeomPlane );
2155     TheAISContext()->Display(myOrthoRelation );
2156     GetMapOfAIS().Bind (myOrthoRelation ,argv[1]);
2157     
2158     
2159   }
2160   
2161   // Shape A est une face
2162   // ====================
2163   else {
2164     
2165     // desactivation du mode edge
2166     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
2167     di<<" Select a second edge"<<"\n";
2168     // Boucle d'attente waitpick.
2169     Standard_Integer argccc = 5;
2170     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2171     const char **argvvv = (const char **) bufff;
2172     while (ViewerMainLoop( argccc, argvvv) ) { }
2173     // fin de la boucle
2174     
2175     TopoDS_Shape ShapeB;
2176     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2177       ShapeB = TheAISContext()->SelectedShape();
2178     }
2179     
2180     // pas de verification d'orthogonalite.
2181     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
2182     TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
2183     
2184     // recuperation des edges des faces.
2185     TopExp_Explorer FaceExpA(FaceA,TopAbs_EDGE);
2186     TopExp_Explorer FaceExpB(FaceB,TopAbs_EDGE);
2187     
2188     TopoDS_Edge EdgeA=TopoDS::Edge(FaceExpA.Current() );
2189     TopoDS_Edge EdgeB=TopoDS::Edge(FaceExpB.Current() );
2190     
2191     // On recupere les  vertexes extremites des edge A et B.
2192     BRepAdaptor_Curve theCurveA(EdgeA);
2193     BRepAdaptor_Curve theCurveB(EdgeB);
2194     // On recupere 3 points A,B,C des  curves.
2195     gp_Pnt A=theCurveA.Value(0.1);
2196     gp_Pnt B=theCurveA.Value(0.9);
2197     gp_Pnt C=theCurveB.Value(0.5);
2198     // Construction du Geom_Plane
2199     GC_MakePlane MkPlane(A,B,C);
2200     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2201     // Fermeture du contexte local.
2202     TheAISContext()->CloseLocalContext(myCurrentIndex);
2203     // Construction de l'AIS_PerpendicularRelation
2204     Handle(AIS_PerpendicularRelation) myOrthoRelation= new AIS_PerpendicularRelation(FaceA ,FaceB );
2205     TheAISContext()->Display(myOrthoRelation );
2206     GetMapOfAIS().Bind (myOrthoRelation  ,argv[1]);
2207     
2208     
2209     
2210   }
2211   
2212   
2213   return 0;
2214   
2215 }
2216
2217
2218 //==============================================================================
2219 //function : VTangentRelation
2220 //purpose  : Display the tangent Relation
2221 //Draw arg : vtangent Name 
2222 //==============================================================================
2223 #include <AIS_TangentRelation.hxx>
2224
2225
2226 static int VTangentBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
2227 {
2228   // Declarations
2229   Standard_Integer myCurrentIndex;
2230  
2231   // Verification
2232   if (argc!=2) {di<<" vtangent error"<<"\n";return 1;}
2233   
2234   // Fermeture des contextes locaux
2235   TheAISContext()->CloseAllContexts();
2236   
2237   // Ouverture d'un contexte local et recuperation de son index.
2238   TheAISContext()->OpenLocalContext();
2239   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
2240   
2241   // On active les modes de selections Edges.
2242   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
2243   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
2244   di<<" Select two coplanar edges(First the circular edge then the tangent edge) or two faces "<<"\n";
2245   
2246   // Boucle d'attente waitpick.
2247   Standard_Integer argcc = 5;
2248   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2249   const char **argvv = (const char **) buff;
2250   while (ViewerMainLoop( argcc, argvv) ) { }
2251   // fin de la boucle
2252   
2253   TopoDS_Shape ShapeA;
2254   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2255     ShapeA = TheAISContext()->SelectedShape();
2256   }
2257   
2258   // ShapeA est un edge.
2259   // ===================
2260   if (ShapeA.ShapeType()==TopAbs_EDGE ) {
2261     
2262     // desactivation du mode face
2263     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
2264     di<<" Select a second edge"<<"\n";
2265     // Boucle d'attente waitpick.
2266     Standard_Integer argccc = 5;
2267     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2268     const char **argvvv = (const char **) bufff;
2269     while (ViewerMainLoop( argccc, argvvv) ) { }
2270     // fin de la boucle
2271     
2272     TopoDS_Shape ShapeB;
2273     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2274       ShapeB = TheAISContext()->SelectedShape();
2275     }
2276     
2277     // recuperation des edges.
2278     TopoDS_Edge  EdgeA=TopoDS::Edge(ShapeA);
2279     TopoDS_Edge  EdgeB=TopoDS::Edge(ShapeB);
2280     
2281     // On recupere les  curves
2282     BRepAdaptor_Curve theCurveA(EdgeA);
2283     BRepAdaptor_Curve theCurveB(EdgeB);
2284     
2285     // On recupere 3 points A,B,C des  curves.
2286     gp_Pnt A=theCurveA.Value(0.1);
2287     gp_Pnt B=theCurveA.Value(0.9);
2288     gp_Pnt C=theCurveB.Value(0.5);
2289
2290     // Construction du Geom_Plane
2291     GC_MakePlane MkPlane(A,B,C);
2292     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2293     // Fermeture du contexte local.
2294     TheAISContext()->CloseLocalContext(myCurrentIndex);
2295     // Construction de l'AIS_TangentRelation
2296     Handle(AIS_TangentRelation) myTanRelation= new AIS_TangentRelation  (EdgeA ,EdgeB ,theGeomPlane );
2297     TheAISContext()->Display(myTanRelation );
2298     GetMapOfAIS().Bind (myTanRelation ,argv[1]);
2299     
2300     
2301   }
2302   
2303   // Shape A est une face
2304   // ====================
2305   else {
2306     
2307     // desactivation du mode edge
2308     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
2309     di<<" Select a second edge"<<"\n";
2310     // Boucle d'attente waitpick.
2311     Standard_Integer argccc = 5;
2312     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2313     const char **argvvv = (const char **) bufff;
2314     while (ViewerMainLoop( argccc, argvvv) ) { }
2315     // fin de la boucle
2316     
2317     TopoDS_Shape ShapeB;
2318     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2319       ShapeB = TheAISContext()->SelectedShape();
2320     }
2321     
2322     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
2323     TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
2324     
2325     // recuperation des edges des faces.
2326     TopExp_Explorer FaceExpA(FaceA,TopAbs_EDGE);
2327     TopExp_Explorer FaceExpB(FaceB,TopAbs_EDGE);
2328     
2329     TopoDS_Edge EdgeA=TopoDS::Edge(FaceExpA.Current() );
2330     TopoDS_Edge EdgeB=TopoDS::Edge(FaceExpB.Current() );
2331     
2332     // On recupere les  vertexes extremites des edge A et B.
2333     BRepAdaptor_Curve theCurveA(EdgeA);
2334     BRepAdaptor_Curve theCurveB(EdgeB);
2335     // On recupere 3 points A,B,C des  curves.
2336     gp_Pnt A=theCurveA.Value(0.1);
2337     gp_Pnt B=theCurveA.Value(0.9);
2338     gp_Pnt C=theCurveB.Value(0.5);
2339
2340     // Construction du Geom_Plane
2341     GC_MakePlane MkPlane(A,B,C);
2342     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2343     // Fermeture du contexte local.
2344     TheAISContext()->CloseLocalContext(myCurrentIndex);
2345     // Construction de l'AIS_PerpendicularRelation
2346     Handle(AIS_TangentRelation) myTanRelation= new AIS_TangentRelation(FaceA ,FaceB,theGeomPlane );
2347     TheAISContext()->Display(myTanRelation );
2348     GetMapOfAIS().Bind (myTanRelation  ,argv[1]);
2349     
2350     
2351     
2352   }
2353   
2354   
2355   return 0;
2356   
2357 }
2358
2359 //==============================================================================
2360 //function : VSymetricalRelation
2361 //purpose  : Display the Symetrical Relation
2362 //Draw arg : vsymetric Name 
2363 //==============================================================================
2364 #include <AIS_SymmetricRelation.hxx>
2365 #include <AIS_InteractiveObject.hxx>
2366 #include <AIS_Dimension.hxx>
2367
2368
2369 static int VSymmetricBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
2370 {
2371   // Declarations
2372   Standard_Integer myCurrentIndex;
2373  
2374   // Verification
2375   if (argc!=2) {di<<" vSymmetric error"<<"\n";return 1;}
2376   
2377   // Fermeture des contextes locaux
2378   TheAISContext()->CloseAllContexts();
2379   
2380   // Ouverture d'un contexte local et recuperation de son index.
2381   TheAISContext()->OpenLocalContext();
2382   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
2383   
2384   // On active les modes de selections
2385   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
2386   di<<" Select an edge:the axis of symetry "<<"\n";
2387   
2388   // Boucle d'attente waitpick.
2389   Standard_Integer argcc = 5;
2390   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2391   const char **argvv = (const char **) buff;
2392   while (ViewerMainLoop( argcc, argvv) ) { }
2393   // fin de la boucle
2394   
2395   TopoDS_Shape ShapeA;
2396   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2397     ShapeA = TheAISContext()->SelectedShape();
2398   }
2399   // recuperation des edges.
2400   TopoDS_Edge  EdgeA=TopoDS::Edge(ShapeA);
2401   
2402   // On active les modes de selections
2403   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
2404   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
2405   di<<" Select two edges or two vertices. "<<"\n";
2406   
2407   // Boucle d'attente waitpick.
2408   Standard_Integer argcc2 = 5;
2409 //  const char *buff2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2410   const char **argvv2 = (const char **) buff;
2411   while (ViewerMainLoop( argcc2, argvv2) ) { }
2412   // fin de la boucle
2413   
2414   TopoDS_Shape ShapeB;
2415   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2416     ShapeB = TheAISContext()->SelectedShape();
2417   }
2418   
2419   
2420   
2421   
2422   
2423   // ShapeB est un edge.
2424   // ===================
2425   if (ShapeB.ShapeType()==TopAbs_EDGE ) {
2426     
2427     // desactivation du mode vertex
2428     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(1) );
2429     di<<" Select a second edge"<<"\n";
2430     // Boucle d'attente waitpick.
2431     Standard_Integer argccc = 5;
2432     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2433     const char **argvvv = (const char **) bufff;
2434     while (ViewerMainLoop( argccc, argvvv) ) { }
2435     // fin de la boucle
2436     
2437     TopoDS_Shape ShapeC;
2438     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2439       ShapeC = TheAISContext()->SelectedShape();
2440     }
2441     
2442     // recuperation des edges.
2443     TopoDS_Edge  EdgeB=TopoDS::Edge(ShapeB);
2444     TopoDS_Edge  EdgeC=TopoDS::Edge(ShapeC);
2445     // on verifie que les edges sont paralleles
2446     BRepExtrema_ExtCC myDeltaEdgeAB (EdgeA ,EdgeB );
2447     BRepExtrema_ExtCC myDeltaEdgeAC (EdgeA ,EdgeC );
2448     // on verifie qu'ils  sont paralleles.
2449     if (!myDeltaEdgeAB.IsParallel() ) {di<<"vsymetric error: non parallel edges."<<"\n";return 1; }
2450     if (!myDeltaEdgeAC.IsParallel() ) {di<<"vsymetric error: non parallel edges."<<"\n";return 1; }
2451     // on recupere les vertexs
2452     TopoDS_Vertex  Va,Vb,Vc,Vd;
2453     TopExp::Vertices(EdgeB,Va,Vb );
2454     TopExp::Vertices(EdgeC,Vc,Vd );
2455     gp_Pnt A=BRep_Tool::Pnt(Va);
2456     gp_Pnt B=BRep_Tool::Pnt(Vc);
2457     gp_Pnt C = Get3DPointAtMousePosition();
2458     
2459     //    gp_Pnt C=BRep_Tool::Pnt(Vc);
2460     // Construction du Geom_Plane
2461     GC_MakePlane MkPlane(A,B,C);
2462     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2463     // Fermeture du contexte local.
2464     TheAISContext()->CloseLocalContext(myCurrentIndex);
2465     // Construction de l'AIS_SymmetricRelation
2466     Handle(AIS_SymmetricRelation) mySymRelation= new AIS_SymmetricRelation (EdgeA ,EdgeB ,EdgeC, theGeomPlane );
2467     TheAISContext()->Display(mySymRelation );
2468     GetMapOfAIS().Bind (mySymRelation ,argv[1]);
2469     
2470     
2471   }
2472   
2473   // Shape B est un vertex
2474   // =====================
2475   else {
2476     
2477     // desactivation du mode edge
2478     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
2479     di<<" Select a second edge"<<"\n";
2480     // Boucle d'attente waitpick.
2481     Standard_Integer argccc = 5;
2482     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2483     const char **argvvv = (const char **) bufff;
2484     while (ViewerMainLoop( argccc, argvvv) ) { }
2485     // fin de la boucle
2486     
2487     TopoDS_Shape ShapeC;
2488     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2489       ShapeC = TheAISContext()->SelectedShape();
2490     }
2491     
2492     // recuperation des Vertex
2493     TopoDS_Vertex  VertexB=TopoDS::Vertex(ShapeB);
2494     TopoDS_Vertex  VertexC=TopoDS::Vertex(ShapeC);
2495     // transfo en gp_Pnt
2496     gp_Pnt B=BRep_Tool::Pnt(VertexB);
2497     gp_Pnt C=BRep_Tool::Pnt(VertexC);
2498     
2499     // on recupere les vertexes de l'axe de sym
2500     TopoDS_Vertex  Va,Vb;
2501     TopExp::Vertices(EdgeA,Va,Vb );
2502     gp_Pnt A=BRep_Tool::Pnt(Va);
2503     // Construction du Geom_Plane
2504     GC_MakePlane MkPlane(A,B,C);
2505     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2506     // Fermeture du contexte local.
2507     TheAISContext()->CloseLocalContext(myCurrentIndex);
2508     // Construction de l'AIS_SymmetricRelation
2509     Handle(AIS_SymmetricRelation) mySymRelation= new AIS_SymmetricRelation (EdgeA ,VertexB ,VertexC, theGeomPlane );
2510     TheAISContext()->Display(mySymRelation );
2511     GetMapOfAIS().Bind (mySymRelation ,argv[1]);
2512     
2513     
2514     
2515   }
2516   
2517   
2518   return 0;
2519   
2520 }
2521
2522 //=======================================================================
2523 //function : VDimParam
2524 //purpose  : Sets aspect parameters to dimension.
2525 //=======================================================================
2526 static int VDimParam (Draw_Interpretor& theDi, Standard_Integer theArgNum, const char** theArgVec)
2527 {
2528   if (theArgNum < 3)
2529   {
2530     theDi << theArgVec[0] << " error: the wrong number of input parameters.\n";
2531     return 1;
2532   }
2533
2534
2535   TCollection_AsciiString aName (theArgVec[1]);
2536   gp_Pln aWorkingPlane;
2537   Standard_Boolean isCustomPlane = Standard_False;
2538   Standard_Boolean toUpdate = Standard_True;
2539
2540   NCollection_DataMap<TCollection_AsciiString, Standard_Real> aRealParams;
2541   NCollection_DataMap<TCollection_AsciiString, TCollection_AsciiString> aStringParams;
2542
2543   if (!GetMapOfAIS().IsBound2 (aName))
2544   {
2545     theDi << theArgVec[0] << "error: no object with this name.\n";
2546     return 1;
2547   }
2548
2549   Handle(AIS_InteractiveObject) anObject = Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2 (aName));
2550   if (anObject->Type() != AIS_KOI_Dimension)
2551   {
2552     theDi << theArgVec[0] << "error: no dimension with this name.\n";
2553     return 1;
2554   }
2555
2556   Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast (anObject);
2557   Handle(Prs3d_DimensionAspect) anAspect = aDim->DimensionAspect();
2558
2559   if (ParseDimensionParams (theArgNum, theArgVec, 2, anAspect,
2560                             isCustomPlane, aWorkingPlane,
2561                             aRealParams, aStringParams))
2562   {
2563     return 1;
2564   }
2565
2566   if (isCustomPlane)
2567   {
2568     aDim->SetCustomPlane (aWorkingPlane);
2569   }
2570
2571   SetDimensionParams (aDim, aRealParams, aStringParams);
2572
2573   if (!aDim->IsValid())
2574   {
2575     std::cerr << "Error: Dimension geometry or plane is not valid.\n";
2576     return 1;
2577   }
2578
2579   // Redisplay a dimension after parameter changing.
2580   if (ViewerTest::GetAISContext()->IsDisplayed (aDim))
2581   {
2582     ViewerTest::GetAISContext()->Redisplay (aDim, toUpdate);
2583   }
2584
2585   return 0;
2586 }
2587
2588 //=======================================================================
2589 //function : VMoveDim
2590 //purpose  : Moves dimension or relation text label to defined or picked
2591 //           position and updates the object.
2592 //draw args: vmovedim [name] [x y z]
2593 //=======================================================================
2594 static int VMoveDim (Draw_Interpretor& theDi, Standard_Integer theArgNum, const char** theArgVec) 
2595 {
2596   if (theArgNum > 5)
2597   {
2598     theDi << theArgVec[0] << " error: the wrong number of parameters.\n";
2599     return 1;
2600   }
2601
2602   // Parameters parsing
2603   Standard_Boolean isNameSet = (theArgNum ==2 || theArgNum == 5);
2604   Standard_Boolean isPointSet = (theArgNum == 4 || theArgNum == 5);
2605
2606   Handle(AIS_InteractiveObject) aPickedObj;
2607   gp_Pnt aPoint (gp::Origin());
2608   Standard_Integer aMaxPickNum = 5;
2609
2610   // Find object
2611   if (isNameSet)
2612   {
2613      TCollection_AsciiString aName (theArgVec[1]);
2614      if (!GetMapOfAIS().IsBound2 (aName))
2615      {
2616        theDi << theArgVec[0] << " error: no object with this name.\n";
2617        return 1;
2618      }
2619
2620      aPickedObj = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aName));
2621      
2622      if (aPickedObj.IsNull())
2623      {
2624        theDi << theArgVec[0] << " error: the object with this name is not valid.\n";
2625        return 1;
2626      }
2627
2628      if (aPickedObj->Type() != AIS_KOI_Dimension && aPickedObj->Type() != AIS_KOI_Relation)
2629      {
2630        theDi << theArgVec[0] << " error: no dimension or relation with this name.\n";
2631        return 1;
2632      }
2633   }
2634   else // Pick dimension or relation
2635   {
2636     // Close all local contexts
2637     TheAISContext()->CloseAllContexts();
2638
2639     // Open local context and get its index for recovery.
2640     TheAISContext()->OpenLocalContext();
2641
2642     // Loop that will be handle picking.
2643     Standard_Integer anArgNum = 5;
2644     const char *aBuffer[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2645     const char **anArgVec = (const char **) aBuffer;
2646
2647     Standard_Boolean isPicked = Standard_False;
2648     Standard_Integer aPickNum = 0;
2649     while (!isPicked && aPickNum < aMaxPickNum)
2650     {
2651       while (ViewerMainLoop (anArgNum, anArgVec)) { }
2652
2653       for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected())
2654       {
2655         aPickedObj = TheAISContext()->SelectedInteractive();
2656       }
2657
2658       isPicked = (!aPickedObj.IsNull() && (aPickedObj->Type() == AIS_KOI_Dimension || aPickedObj->Type() == AIS_KOI_Relation));
2659
2660       if (isPicked)
2661       {
2662         break;
2663       }
2664       aPickNum++;
2665     }
2666     if (!isPicked)
2667     {
2668       theDi << theArgVec[0] << ": no dimension or relation is selected." << "\n";
2669       return 1;
2670     }
2671   }
2672
2673   // Find point
2674   if (isPointSet)
2675   {
2676     aPoint = theArgNum == 4 ? gp_Pnt (atoi (theArgVec[1]), atoi (theArgVec[2]), atoi (theArgVec[3]))
2677                             : gp_Pnt (atoi (theArgVec[2]), atoi (theArgVec[3]), atoi (theArgVec[4]));
2678   }
2679   else // Pick the point
2680   {
2681     Standard_Integer aPickArgNum = 5;
2682     const char *aPickBuff[] = {"VPick", "X", "VPickY", "VPickZ", "VPickShape"};
2683     const char **aPickArgVec = (const char **) aPickBuff;
2684
2685     while (ViewerMainLoop (aPickArgNum, aPickArgVec)) { }
2686
2687     // Set text position, update relation or dimension.
2688     if (aPickedObj->Type() == AIS_KOI_Relation)
2689     {
2690       Handle(AIS_Relation) aRelation = Handle(AIS_Relation)::DownCast (aPickedObj);
2691       aPoint = Get3DPointAtMousePosition();
2692       aRelation->SetPosition (aPoint);
2693       TheAISContext()->Redisplay (aRelation);
2694     }
2695     else
2696     {
2697       Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast (aPickedObj);
2698       gp_Pnt aFirstPoint, aSecondPoint;
2699       if (aDim->KindOfDimension() == AIS_KOD_PLANEANGLE)
2700       {
2701         Handle(AIS_AngleDimension) anAngleDim = Handle(AIS_AngleDimension)::DownCast (aDim);
2702         aFirstPoint = anAngleDim->FirstPoint();
2703         aSecondPoint = anAngleDim->SecondPoint();
2704       }
2705       else if (aDim->KindOfDimension() == AIS_KOD_LENGTH)
2706       {
2707         Handle(AIS_LengthDimension) aLengthDim = Handle(AIS_LengthDimension)::DownCast (aDim);
2708         aFirstPoint = aLengthDim->FirstPoint();
2709         aSecondPoint = aLengthDim->SecondPoint();
2710       }
2711       else if (aDim->KindOfDimension() == AIS_KOD_RADIUS)
2712       {
2713         Handle(AIS_RadiusDimension) aRadiusDim = Handle(AIS_RadiusDimension)::DownCast (aDim);
2714         aFirstPoint = aRadiusDim->AnchorPoint();
2715         aSecondPoint = aRadiusDim->Circle().Location();
2716       }
2717       else if (aDim->KindOfDimension() == AIS_KOD_DIAMETER)
2718       {
2719         Handle(AIS_DiameterDimension) aDiameterDim = Handle(AIS_DiameterDimension)::DownCast (aDim);
2720         aFirstPoint = aDiameterDim->AnchorPoint();
2721         aSecondPoint = aDiameterDim->Circle().Location();
2722       }
2723
2724       if (!Get3DPointAtMousePosition (aFirstPoint, aSecondPoint, aPoint))
2725       {
2726         return 1;
2727       }
2728
2729       aDim->SetTextPosition (aPoint);
2730       TheAISContext()->Redisplay (aDim);
2731     }
2732
2733   }
2734
2735   // Set text position, update relation or dimension.
2736   if (aPickedObj->Type() == AIS_KOI_Relation)
2737   {
2738     Handle(AIS_Relation) aRelation = Handle(AIS_Relation)::DownCast (aPickedObj);
2739     aRelation->SetPosition (aPoint);
2740     TheAISContext()->Redisplay (aRelation);
2741   }
2742   else
2743   {
2744     Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast (aPickedObj);
2745     aDim->SetTextPosition (aPoint);
2746     TheAISContext()->Redisplay (aDim);
2747   }
2748
2749   return 0;
2750 }
2751
2752 //=======================================================================
2753 //function : RelationsCommands
2754 //purpose  : 
2755 //=======================================================================
2756       
2757
2758 void ViewerTest::RelationCommands(Draw_Interpretor& theCommands)
2759 {
2760   const char *group = "AISRelations";
2761
2762   theCommands.Add("vdimension",
2763       "vdimension name {-angle|-length|-radius|-diameter} -shapes shape1 [shape2 [shape3]]\n"
2764       "[-text 3d|2d wf|sh|wireframe|shading IntegerSize]\n"
2765       "[-label left|right|hcenter|hfit top|bottom|vcenter|vfit]\n"
2766       "[-arrow external|internal|fit]\n"
2767       "[{-arrowlength|-arlen} RealArrowLength]\n"
2768       "[{-arrowangle|-arangle} ArrowAngle(degrees)]\n"
2769       "[-plane xoy|yoz|zox]\n"
2770       "[-flyout FloatValue -extension FloatValue]\n"
2771       "[-value CustomNumberValue]\n"
2772       "[-dispunits DisplayUnitsString]\n"
2773       "[-modelunits ModelUnitsString]\n"
2774       "[-showunits | -hideunits]\n"
2775       " -Builds angle, length, radius and diameter dimensions.\n"
2776       " -See also: vdimparam, vmovedim.\n",
2777       __FILE__,VDimBuilder,group);
2778
2779   theCommands.Add("vdimparam",
2780     "vdimparam name"
2781     "[-text 3d|2d wf|sh|wireframe|shading IntegerSize]\n"
2782     "[-label left|right|hcenter|hfit top|bottom|vcenter|vfit]\n"
2783     "[-arrow external|internal|fit]\n"
2784     "[{-arrowlength|-arlen} RealArrowLength]\n"
2785     "[{-arrowangle|-arangle} ArrowAngle(degrees)]\n"
2786     "[-plane xoy|yoz|zox]\n"
2787     "[-flyout FloatValue -extension FloatValue]\n"
2788     "[-value CustomNumberValue]\n"
2789     "[-dispunits DisplayUnitsString]\n"
2790     "[-modelunits ModelUnitsString]\n"
2791     "[-showunits | -hideunits]\n"
2792     " -Sets parameters for angle, length, radius and diameter dimensions.\n"
2793     " -See also: vmovedim, vdimension.\n",
2794     __FILE__,VDimParam,group);
2795
2796   theCommands.Add("vangledim",
2797                   "vangledim Name:Selection in the viewer only ",
2798                   __FILE__,VAngleDimBuilder,group);
2799   
2800   theCommands.Add("vdiameterdim",
2801                   "vdiameterdim Name : Selection in the viewer only ",
2802                   __FILE__,VDiameterDimBuilder,group);
2803   
2804   theCommands.Add("vconcentric",
2805                   "vconcentric Name : Selection in the viewer only ",
2806                   __FILE__,VConcentricBuilder,group);
2807
2808   theCommands.Add("vequaldist",
2809                   "vequaldist Name Selection in the viewer only ",
2810                   __FILE__,VEqualDistRelation ,group);
2811   
2812   theCommands.Add("vequalrad",
2813                   "vequalrad Name Selection in the viewer only ",
2814                   __FILE__,VEqualRadiusRelation  ,group);
2815   
2816   theCommands.Add("vfix",  
2817                   "vfix Name Selection in the viewer only ",
2818                   __FILE__,VFixRelation  ,group);
2819   
2820   theCommands.Add("videntity",
2821                   "videntity Name Selection in the viewer only ",
2822                   __FILE__,VIdenticRelation  ,group);
2823   
2824   theCommands.Add("vdistdim",
2825                   "vdistdim Name Selection in the viewer only ",
2826                   __FILE__,VLenghtDimension ,group);
2827   
2828   theCommands.Add("vradiusdim",
2829                   "vradiusdim Name Selection in the viewer only ",
2830                   __FILE__,VRadiusDimBuilder ,group);
2831   
2832   theCommands.Add("voffsetdim",
2833                   "voffsetdim Name Selection in the viewer only ",
2834                   __FILE__,VOffsetDimBuilder ,group);
2835   
2836   theCommands.Add("vparallel",
2837                   "vparallel Name Selection in the viewer only ",
2838                   __FILE__,VParallelBuilder ,group);
2839   
2840   theCommands.Add("vortho",
2841                   "vortho Name Selection in the viewer only ",
2842                   __FILE__,VPerpendicularBuilder ,group);
2843   
2844   theCommands.Add("vtangent",  
2845                   "vtangent Name Selection in the viewer only ",
2846                   __FILE__,VTangentBuilder ,group);
2847   
2848   
2849   theCommands.Add("vsymetric",
2850                   "vsymetric Name Selection in the viewer only ",
2851                   __FILE__,VSymmetricBuilder ,group);
2852
2853   theCommands.Add("vmovedim",
2854                   "vmovedim [name] [x y z]: moves picked or named (if name defined) "
2855           "dimension to picked mouse position or input point.",
2856                   __FILE__,VMoveDim,group);
2857
2858 }