68172125ca7fc1069f3099a45de28add56587f27
[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-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22
23 #include <ViewerTest.hxx>
24 #ifdef HAVE_CONFIG_H
25 # include <config.h>
26 #endif
27
28 #include <AIS_AngleDimension.hxx>
29 #include <AIS_Circle.hxx>
30 #include <AIS_DiameterDimension.hxx>
31 #include <AIS_DisplayMode.hxx>
32 #include <AIS_InteractiveContext.hxx>
33 #include <AIS_LengthDimension.hxx>
34 #include <AIS_ListIteratorOfListOfInteractive.hxx>
35 #include <AIS_ListOfInteractive.hxx>
36 #include <AIS_MapOfInteractive.hxx>
37 #include <AIS_Point.hxx>
38 #include <AIS_RadiusDimension.hxx>
39 #include <AIS_Relation.hxx>
40 #include <AIS_Shape.hxx>
41 #include <BRepAdaptor_Curve.hxx>
42 #include <BRep_Builder.hxx>
43 #include <BRep_Tool.hxx>
44 #include <BRepTools.hxx>
45 #include <Draw_Interpretor.hxx>
46 #include <Draw.hxx>
47 #include <Draw_Appli.hxx>
48 #include <Draw_Window.hxx>
49 #include <DBRep.hxx>
50 #include <ElSLib.hxx>
51 #include <GC_MakePlane.hxx>
52 #include <Geom_CartesianPoint.hxx>
53 #include <Geom_Circle.hxx>
54 #include <Geom_Plane.hxx>
55 #include <gp_Circ.hxx>
56 #include <gp_Pln.hxx>
57 #include <IntAna_IntConicQuad.hxx>
58 #include <IntAna_Quadric.hxx>
59 #include <Precision.hxx>
60 #include <Select3D_Projector.hxx>
61 #include <StdSelect.hxx>
62 #include <string.h>
63 #include <TCollection_AsciiString.hxx>
64 #include <TCollection_ExtendedString.hxx>
65 #include <TColStd_MapOfInteger.hxx>
66 #include <TopAbs.hxx>
67 #include <TopAbs_ShapeEnum.hxx>
68 #include <TopExp.hxx>
69 #include <TopoDS.hxx>
70 #include <TopoDS_Face.hxx>
71 #include <TopoDS_Solid.hxx>
72 #include <TopoDS_Vertex.hxx>
73 #include <V3d_Viewer.hxx>
74 #include <V3d_View.hxx>
75 #include <V3d.hxx>
76 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
77 #include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
78 #include <ViewerTest_EventManager.hxx>
79
80 extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
81 extern int ViewerMainLoop(Standard_Integer argc, const char** argv);
82 extern Handle(AIS_InteractiveContext)& TheAISContext ();
83
84 #ifdef HAVE_STRINGS_H
85 # include <strings.h>
86 #endif
87
88 #define VertexMask 0x01
89 #define EdgeMask 0x02
90 #define FaceMask 0x04
91
92 static Standard_Boolean ComputeIntersection(const gp_Lin& L,const gp_Pln& ThePl, gp_Pnt& TheInter)
93 {
94   static IntAna_Quadric TheQuad;
95   TheQuad.SetQuadric(ThePl);
96   static IntAna_IntConicQuad QQ;
97    QQ.Perform(L,TheQuad);
98   if(QQ.IsDone()){
99     if(QQ.NbPoints()>0){
100       TheInter = QQ.Point(1);
101       return Standard_True;
102     }
103   }
104   return Standard_False;
105 }
106
107 //=======================================================================
108 //function : Get3DPointAtMousePosition
109 //purpose  : calcul du point 3D correspondant a la position souris dans le plan de 
110 // la vue...
111 //=======================================================================
112
113 static gp_Pnt Get3DPointAtMousePosition ()
114 {
115   Handle(V3d_View) aview = ViewerTest::CurrentView();
116   static Select3D_Projector prj;
117   prj.SetView(aview);
118   
119   // le plan de la vue...
120   Standard_Real xv,yv,zv;
121   aview->Proj(xv,yv,zv);
122   Standard_Real xat,yat,zat;
123   aview->At(xat,yat,zat);
124   gp_Pln ThePl(gp_Pnt(xat,yat,zat),gp_Dir(xv,yv,zv));
125   Standard_Integer xpix,ypix;
126   Standard_Real x,y;
127   ViewerTest::GetMousePosition(xpix,ypix);
128   aview->Convert(xpix,ypix,x,y); // espace reel 2D de la vue...
129   gp_Lin L = prj.Shoot(x,y);
130   gp_Pnt P(0.,0.,0.);
131
132   ComputeIntersection(L,ThePl,P);
133   return P;
134 }
135
136 //=======================================================================
137 //function : ComputeNewPlaneForDim
138 //purpose  : 
139 //=======================================================================
140
141 static void ComputeNewPlaneForDim (const Handle(AIS_Relation)& R,
142                                    gp_Pln& ,
143                                    gp_Pnt&)
144 {
145 // 0    COMPOUND,
146 // 1    COMPSOLID,
147 // 2    SOLID,
148 // 3    SHELL,
149 // 4    FACE,
150 // 5    WIRE,
151 // 6    EDGE,
152 // 7    VERTEX,
153 // 8    SHAPE
154   TopoDS_Shape S1 = R->FirstShape();
155   TopoDS_Shape S2 = R->SecondShape();
156   TopAbs_ShapeEnum Typ1 = S1.ShapeType();
157   TopAbs_ShapeEnum Typ2 = S2.ShapeType();
158   
159   gp_Pnt thepoint [3];
160   thepoint[0] = Get3DPointAtMousePosition();
161   
162   // on met l'objet le plus petit en 1...
163   if((Standard_Integer)Typ2>(Standard_Integer)Typ1){
164     
165     TopoDS_Shape tmpS = S1;
166     TopAbs_ShapeEnum tmpT = Typ1;
167     S1= S2;
168     Typ1 = Typ2;
169     S2= tmpS;
170     Typ2 = tmpT;
171   }
172 /*  
173   switch (Typ1){
174   case TopAbs_VERTEX:{
175     thepoint[0]  = BRep_Tool::Pnt(S1);
176     if(Typ2==TopAbs_VERTEX)
177       thepoint[1] = BRep_Tool::Pnt(S2);
178     else if(Typ2==TopAbs_EDGE){
179       TopoDS_Vertex  Va,Vb;
180       TopExp::Vertices(S2,Va,Vb);
181       thepoint[1] = BRep_Tool::Pnt(Va);
182     }
183     else if(Typ2==TopAbs_FACE){
184     }
185     break;
186   }
187   case TopAbs_EDGE:
188   }
189 */
190 }
191
192 //=======================================================================
193 //function : VDimBuilder
194 //purpose  : Command for updated dimenasions: angle, length, radius, diameter
195 //draw args : vdim -{angle|length|radius|diameter} -name={Dim_Name} 
196 //                 shape1 [shape2 [shape3]] [-text={2d|3d} -plane={xoy|yoz|zox}]
197 //=======================================================================
198
199 static int VDimBuilder(Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgs)
200 {
201   if (theArgsNb < 2)
202   {
203     theDi << theArgs[0] << ": command argument is required. Type help for more information.\n";
204     return 1;
205   }
206
207   // Parse parameters
208   TCollection_AsciiString aDimType(theArgs[1]);
209   AIS_KindOfDimension aKindOfDimension;
210   if (aDimType == "-length")
211   {
212     aKindOfDimension = AIS_KOD_LENGTH;
213   }
214   else if (aDimType == "-angle")
215   {
216     aKindOfDimension = AIS_KOD_PLANEANGLE;
217   }
218   else if (aDimType == "-radius")
219   {
220     aKindOfDimension = AIS_KOD_RADIUS;
221   }
222   else if (aDimType == "-diameter" || aDimType == "-diam")
223   {
224     aKindOfDimension = AIS_KOD_DIAMETER;
225   }
226   else
227   {
228     theDi << theArgs[0] << ": wrong type of dimension. Type help for more information.\n";
229     return 1;
230   }
231   NCollection_List<Handle(AIS_InteractiveObject)> aShapes;
232   Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect;
233   Standard_Boolean isPlaneCustom = Standard_False;
234   TCollection_AsciiString aName;
235   gp_Pln aWorkingPlane;
236   for (Standard_Integer anIt = 2; anIt < theArgsNb; ++anIt)
237   {
238     TCollection_AsciiString aParam (theArgs[anIt]);
239     if (aParam.Search("-text") == 1)
240     {
241       anAspect->MakeText3d(aParam.Search("3d") != -1 ? Standard_True : Standard_False);
242     }
243     else if (aParam.Search("-name") == 1)
244     {
245       Standard_Integer aParamNameEnd = aParam.FirstLocationInSet("=",1, aParam.Length());
246       if (aParamNameEnd == 0)
247       {
248         theDi << theArgs[0] << ": no name for dimension.\n";
249         return 1;
250       }
251       aName = aParam.Split(aParamNameEnd);
252     }
253     else if (aParam.Search("-plane") == 1)
254     {
255       isPlaneCustom = Standard_True;
256       if (aParam.Search("xoy") != -1)
257         aWorkingPlane = gp_Pln (gp_Ax3(gp::XOY()));
258       else if (aParam.Search("zox") != -1)
259         aWorkingPlane = gp_Pln (gp_Ax3(gp::ZOX()));
260       else if (aParam.Search("yoz") != -1)
261         aWorkingPlane = gp_Pln (gp_Ax3(gp::YOZ()));
262       else
263       {
264         theDi << theArgs[0] << ": wrong plane.\n";
265         return 1;
266       }
267     }
268     else if (aParam.Search("-") != 1) // Shape
269     {
270       if (!GetMapOfAIS().IsBound2 (aParam))
271       {
272         theDi << theArgs[0] << ": wrong name of shape. May be here is a wrong parameter.\n";
273         return 1;
274       }
275       Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aParam));
276       if (aShape.IsNull())
277         return 1;
278       aShapes.Append (aShape);
279     }
280   }
281
282   // Build dimension
283   Handle(AIS_Dimension) aDim;
284   switch (aKindOfDimension)
285   {
286   case AIS_KOD_LENGTH:
287     {
288       if (!isPlaneCustom)
289       {
290         theDi << theArgs[0] << ": can build dimension without working plane.\n";
291         return 1;
292       }
293       if (aShapes.Extent() == 1)
294       {
295         if (aShapes.First()->Type() == AIS_KOI_Shape
296             && (Handle(AIS_Shape)::DownCast(aShapes.First()))->Shape().ShapeType() != TopAbs_EDGE)
297         {
298           theDi << theArgs[0] << ": wrong shape type.\n";
299           return 1;
300         }
301         aDim = new AIS_LengthDimension (TopoDS::Edge ((Handle(AIS_Shape)::DownCast(aShapes.First()))->Shape()), aWorkingPlane);
302       }
303       else if (aShapes.Extent() == 2)
304       {
305         if (aShapes.First()->Type() == AIS_KOI_Shape && aShapes.Last()->Type() == AIS_KOI_Shape)
306           aDim = new AIS_LengthDimension ((Handle(AIS_Shape)::DownCast(aShapes.First ()))->Shape(),
307                                           (Handle(AIS_Shape)::DownCast(aShapes.Last ()))->Shape(),
308                                           aWorkingPlane);
309         else// AIS_Point
310         {
311           Handle(AIS_Point) aPoint1 = Handle(AIS_Point)::DownCast(aShapes.First ());
312           Handle(AIS_Point) aPoint2 = Handle(AIS_Point)::DownCast(aShapes.Last ());
313           aDim = new AIS_LengthDimension (aPoint1->Component()->Pnt(),
314                                           aPoint2->Component()->Pnt(),
315                                           aWorkingPlane);
316         }
317       }
318       else
319       {
320         theDi << theArgs[0] << ": wrong number of shapes to build dimension.\n";
321         return 1;
322       }
323     }
324     break;
325   case AIS_KOD_PLANEANGLE:
326     {
327       if (aShapes.Extent() == 1 && aShapes.First()->Type()==AIS_KOI_Shape)
328       {
329         Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aShapes.First());
330         if (aShape->Shape().ShapeType() == TopAbs_FACE)
331           aDim = new AIS_AngleDimension (TopoDS::Face(aShape->Shape()));
332       }
333       if (aShapes.Extent() == 2)
334       {
335         Handle(AIS_Shape) aShape1 = Handle(AIS_Shape)::DownCast(aShapes.First());
336         Handle(AIS_Shape) aShape2 = Handle(AIS_Shape)::DownCast(aShapes.Last());
337         if (!aShape1.IsNull() && !aShape2.IsNull()
338             && aShape1->Shape().ShapeType() == TopAbs_EDGE
339             && aShape2->Shape().ShapeType() == TopAbs_EDGE)
340           aDim = new AIS_AngleDimension (TopoDS::Edge(aShape1->Shape()),TopoDS::Edge(aShape2->Shape()));
341         else
342         {
343           theDi << theArgs[0] << ": wrong shapes for angle dimension.\n";
344           return 1;
345         }
346       }
347       else if (aShapes.Extent() == 3)
348       {
349         gp_Pnt aP1, aP2, aP3;
350         Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast (aShapes.First());
351         if (aPoint.IsNull())
352           return 1;
353         aP1 = aPoint->Component()->Pnt();
354         aShapes.RemoveFirst();
355         aPoint = Handle(AIS_Point)::DownCast (aShapes.First());
356         if (aPoint.IsNull())
357           return 1;
358         aP2 = aPoint->Component()->Pnt();
359         aShapes.RemoveFirst();
360         aPoint = Handle(AIS_Point)::DownCast (aShapes.First());
361         if (aPoint.IsNull())
362           return 1;
363         aP3 = aPoint->Component()->Pnt();
364         aDim = new AIS_AngleDimension (aP1, aP2, aP3);
365       }
366       else
367       {
368         theDi << theArgs[0] << ": wrong number of shapes to build dimension.\n";
369         return 1;
370       }
371     }
372     break;
373   case AIS_KOD_RADIUS: // radius of the circle
374     {
375       if (aShapes.Extent() == 1)
376       {
377         Handle(AIS_Circle) aShape = Handle(AIS_Circle)::DownCast (aShapes.First());
378         gp_Circ aCircle = aShape->Circle()->Circ();
379         aDim = new AIS_RadiusDimension (aCircle);
380       }
381       else
382       {
383         theDi << theArgs[0] << ": wrong number of shapes to build dimension.\n";
384         return 1;
385       }
386     }
387     break;
388   case AIS_KOD_DIAMETER:
389     {
390       if (aShapes.Extent() == 1)
391       {
392         Handle(AIS_Circle) aShape = Handle(AIS_Circle)::DownCast (aShapes.First());
393         gp_Circ aCircle = aShape->Circle()->Circ();
394         aDim = new AIS_DiameterDimension (aCircle);
395       }
396       else
397       {
398         theDi << theArgs[0] << ": wrong number of shapes to build dimension.\n";
399         return 1;
400       }
401     }
402     break;
403   default:
404     {
405       theDi << theArgs[0] << ": wrong type of dimension. Type help for more information.\n";
406       return 1;
407     }
408   }
409   aDim->SetDimensionAspect (anAspect);
410   if (GetMapOfAIS().IsBound2(aName))
411   {
412     theDi << theArgs[0] << ": shape with name " << aName.ToCString ()<< " already exists. It will be replaced\n";
413     Handle(AIS_InteractiveObject) anObj = 
414         Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(aName));
415     TheAISContext()->Remove(anObj, Standard_False);
416     GetMapOfAIS().UnBind2(aName);
417   }
418   GetMapOfAIS().Bind (aDim,aName);
419   return 0;
420 }
421
422 //=======================================================================
423 //function : VAngleDimBuilder
424 //purpose  : 
425 //=======================================================================
426
427 static int VAngleDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
428 {
429   Standard_Integer myCurrentIndex;
430   if (argc!=2) {di<<" vangledim error."<<"\n";return 1;}
431   TheAISContext()->CloseAllContexts();
432   TheAISContext()->OpenLocalContext();
433   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
434   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
435   di<<" Select two  edges coplanar or not."<<"\n";
436   Standard_Integer argcc = 5;
437   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
438   const char **argvv = (const char **) buff;
439   while (ViewerMainLoop( argcc, argvv) ) { }
440   
441   TopoDS_Shape ShapeA;
442   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
443     ShapeA = TheAISContext()->SelectedShape();
444   }
445   // Si ShapeA est un Edge.
446   if (ShapeA.ShapeType()== TopAbs_EDGE ) {
447     
448     // Boucle d'attente waitpick.
449     Standard_Integer argccc = 5;
450     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
451     const char **argvvv = (const char **) bufff;
452     while (ViewerMainLoop( argccc, argvvv) ) { }
453     // fin de la boucle
454     
455     TopoDS_Shape ShapeB;
456     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
457       ShapeB = TheAISContext()->SelectedShape();
458     }
459     // ShapeB doit etre un Edge
460     if (ShapeB.ShapeType()!= TopAbs_EDGE ) {
461       di<<" vangledim error: you shoud have selected an edge."<<"\n";return 1;
462     }
463     
464     // on recupere les vertexes de edgeA
465     TopoDS_Vertex Va,Vb;
466     TopExp::Vertices(TopoDS::Edge(ShapeA),Va ,Vb );
467     // Recuperation des points.
468     gp_Pnt A=BRep_Tool::Pnt(Va);
469     gp_Pnt B=BRep_Tool::Pnt(Vb);
470     gp_Pnt C(A.X()+5 ,A.Y()+5 ,A.Z()+5 );
471
472
473     // Construction du plane. Methode pas orthodoxe!
474     GC_MakePlane MkPlane(A ,B ,C );
475     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
476     
477     // Construction du texte.
478     TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString( 90 ) );
479     
480     // Fermeture du context local.
481     TheAISContext()->CloseLocalContext(myCurrentIndex);
482     
483     // Construction de l'AIS dimension
484     Handle (AIS_AngleDimension) myAISDim= new AIS_AngleDimension (TopoDS::Edge(ShapeA) ,TopoDS::Edge(ShapeB) ,theGeomPlane->Pln());
485     GetMapOfAIS().Bind (myAISDim,argv[1]);
486     TheAISContext()->Display(myAISDim );
487     
488   }
489 else {
490   di<<" vangledim error: you must select 2 edges."<<"\n";return 1;
491 }
492   
493   
494   return 0;
495 }
496
497 //==============================================================================
498 //function : VDiameterDim
499 //purpose  : Display the diameter dimension of a face or an edge.
500 //Draw arg : vdiameterdim Name 
501 //==============================================================================
502
503 static int VDiameterDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
504 {
505   // Declarations
506   Standard_Integer myCurrentIndex;
507   Standard_Real theRadius;
508     
509   // Verification
510   if (argc!=2) {di<<" vdiameterdim error"<<"\n";return 1;}
511   // Fermeture des contextes locaux
512   TheAISContext()->CloseAllContexts();
513   // Ouverture d'un contexte local et recuperation de son index.
514   TheAISContext()->OpenLocalContext();
515   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
516   
517   // On active les modes de selections Edges et Faces.
518   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
519   di<<" Select an circled edge."<<"\n";
520   
521   // Boucle d'attente waitpick.
522   Standard_Integer argcc = 5;
523   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
524   const char **argvv = (const char **) buff;
525   while (ViewerMainLoop( argcc, argvv) ) { }
526   // fin de la boucle
527   
528   TopoDS_Shape ShapeA;
529   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
530     ShapeA = TheAISContext()->SelectedShape();
531   }
532   if (ShapeA.ShapeType()==TopAbs_EDGE  ) {
533     
534     // Recuperation du rayon 
535     BRepAdaptor_Curve theCurve(TopoDS::Edge(ShapeA));
536     if (theCurve.GetType()!=GeomAbs_Circle ) {di<<"vdiameterdim error: the edge is not a circular one."<<"\n";return 1;}
537     else {
538       gp_Circ theGpCircle=theCurve.Circle();
539       theRadius=2.*theGpCircle.Radius();
540     }
541     
542     // Construction du texte.
543     TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theRadius  ) );
544     // Construction de L'AIS_AngleDimension.
545     TheAISContext()->CloseLocalContext(myCurrentIndex);
546     
547     Handle (AIS_DiameterDimension) myDiamDim= new AIS_DiameterDimension(ShapeA);
548     GetMapOfAIS().Bind (myDiamDim,argv[1]);
549     TheAISContext()->Display(myDiamDim );
550     
551   }
552   
553   else {
554     di<<" vdiameterdim error: the selection of a face or an edge was expected."<<"\n";return 1;
555   }
556   
557   return 0;
558   
559 }
560
561
562 //==============================================================================
563 // Fonction  vconcentric
564 // -----------------  Uniquement par selection dans le viewer.
565 //==============================================================================
566
567 //==============================================================================
568 //function : VConcentric
569 //purpose  : Display the concentric relation between two surfaces.
570 //Draw arg : vconcentric Name
571 //==============================================================================
572 #include <AIS_ConcentricRelation.hxx>
573 #include <Geom_Plane.hxx>
574 #include <gp_Pln.hxx>
575 #include <GC_MakePlane.hxx>
576 #include <BRepAdaptor_Curve.hxx>
577 #include <TopExp_Explorer.hxx>
578
579
580 static int VConcentricBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
581 {
582   // Declarations
583   Standard_Integer myCurrentIndex;
584   
585   // Verification
586   if (argc!=2) {di<<"vconcentric  error."<<"\n";return 1;}
587   // Fermeture des contextes locaux
588   TheAISContext()->CloseAllContexts();
589   // Ouverture d'un contexte local et recuperation de son index.
590   TheAISContext()->OpenLocalContext();
591   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
592   
593   // On active les modes de selections Edges et Faces.
594   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
595   di<<" Select a circled edge."<<"\n";
596   
597   // Boucle d'attente waitpick.
598   Standard_Integer argcc = 5;
599   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
600   const char **argvv = (const char **) buff;
601   while (ViewerMainLoop( argcc, argvv) ) { }
602   // fin de la boucle
603   
604   TopoDS_Shape ShapeA;
605   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
606     ShapeA = TheAISContext()->SelectedShape();
607   }
608   // ShapeA est un edge
609   // ==================
610   if (ShapeA.ShapeType()==TopAbs_EDGE  ) {
611     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
612     di<<" Select an edge."<<"\n";
613     
614     // Boucle d'attente waitpick.
615     Standard_Integer argccc = 5;
616     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
617     const char **argvvv = (const char **) bufff;
618     while (ViewerMainLoop( argccc, argvvv) ) { }
619     // fin de la boucle
620     
621     TopoDS_Shape ShapeB;
622     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
623       ShapeB = TheAISContext()->SelectedShape();
624     }
625     if (ShapeB.ShapeType()!=TopAbs_EDGE  ) {
626       di<<" vconcentric error: select an edge."<<"\n";return 1;
627     }
628      
629     // Construction du plane.
630     // On recupere le centre du cercle A.
631     BRepAdaptor_Curve theCurveA(TopoDS::Edge(ShapeA) );
632     gp_Circ theCircleA=theCurveA.Circle();
633     gp_Pnt theCenterA=theCircleA.Location();
634     // On recupere deux points sur le cercle A
635     gp_Pnt B= theCurveA.Value(0.25);
636     gp_Pnt C= theCurveA.Value(0.75);
637     // Construction du plane.
638     GC_MakePlane MkPlane(theCenterA ,B ,C );
639     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
640     
641     // Fermeture du context local
642     TheAISContext()->CloseLocalContext(myCurrentIndex);
643     
644     Handle (AIS_ConcentricRelation) myConcentry= new AIS_ConcentricRelation(ShapeA, ShapeB, theGeomPlane );
645     TheAISContext()->Display(myConcentry );
646     GetMapOfAIS().Bind (myConcentry,argv[1]);
647   }
648   
649   
650   else {
651     di<<" vconcentric  error: the selection of a face or an edge was expected."<<"\n";return 1;
652   }
653   
654   return 0;
655   
656   
657   
658   
659 }
660
661 //==============================================================================
662 //function : VEqualDistRelation
663 //purpose  : 
664 //Draw arg : vdiameterdim Name DiameterValue
665 //==============================================================================
666 #include <AIS_EqualDistanceRelation.hxx>
667 #include <BRepExtrema_ExtCC.hxx>
668 #include <GC_MakePlane.hxx>
669
670
671 static int VEqualDistRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
672 {
673   // Declarations
674   Standard_Integer myCurrentIndex;
675   
676   // Verification
677   if (argc!=2) {di<<" vequaldistrelation error: no arguments allowed."<<"\n";return 1;}
678   
679   // Fermeture des contextes locaux
680   TheAISContext()->CloseAllContexts();
681   
682   // Ouverture d'un contexte local et recuperation de son index.
683   TheAISContext()->OpenLocalContext();
684   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
685   
686   // On active les modes de selections Edges et Vertexes.
687   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
688   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
689   di<<" Select an edge or a vertex"<<"\n";
690   
691   // Boucle d'attente waitpick.
692   Standard_Integer argc1 = 5;
693   const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
694   const char **argv1 = (const char **) buf1;
695   while (ViewerMainLoop( argc1, argv1) ) { }
696   // fin de la boucle
697   
698   TopoDS_Shape ShapeA;
699   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
700     ShapeA = TheAISContext()->SelectedShape();
701   }
702   
703   di<<" Select an edge or a vertex"<<"\n";
704   // Boucle d'attente waitpick.
705   Standard_Integer argc2 = 5;
706   const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
707   const char **argv2 = (const char **) buf2;
708   while (ViewerMainLoop( argc2, argv2) ) { }
709   // fin de la boucle
710   
711   TopoDS_Shape ShapeB;
712   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
713     ShapeB = TheAISContext()->SelectedShape();
714   }
715   
716   // Verification des resultats.
717   if (ShapeA.ShapeType()==TopAbs_EDGE && ShapeB.ShapeType()==TopAbs_EDGE  ) {
718     // A et B sont des edges ils doivent etre paralleles
719     BRepExtrema_ExtCC myDeltaEdge (TopoDS::Edge(ShapeA) ,TopoDS::Edge(ShapeB)  );
720     // on verifie qu'ils sont pas paralleles.
721     if (!myDeltaEdge.IsParallel() ) {di<<"vequaldist error: non parallel edges."<<"\n";return 1; }
722     
723   }
724   
725   
726   di<<" Select an edge or a vertex"<<"\n";
727   // Boucle d'attente waitpick.
728   Standard_Integer argc3 = 5;
729   const char *buf3[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
730   const char **argv3 = (const char **) buf3;
731   while (ViewerMainLoop( argc3, argv3) ) { }
732   // fin de la boucle
733   
734   TopoDS_Shape ShapeC;
735   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
736     ShapeC = TheAISContext()->SelectedShape();
737   }
738   
739   di<<" Select an edge or a vertex"<<"\n";
740   // Boucle d'attente waitpick.
741   Standard_Integer argc4 = 5;
742   const char *buf4[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
743   const char **argv4 = (const char **) buf4;
744   while (ViewerMainLoop( argc4, argv4) ) { }
745   // fin de la boucle
746   
747   TopoDS_Shape ShapeD;
748   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
749     ShapeD = TheAISContext()->SelectedShape();
750   }
751   // Verification des resultats.
752   if (ShapeC.ShapeType()==TopAbs_EDGE && ShapeD.ShapeType()==TopAbs_EDGE  ) {
753     // C et D sont des edges ils doivent etre paralleles
754     BRepExtrema_ExtCC myDeltaEdge2 (TopoDS::Edge(ShapeC) ,TopoDS::Edge(ShapeD)  );
755     // on verifie qu'ils sont pas paralleles.
756     if (!myDeltaEdge2.IsParallel() ) {di<<"vequaldist error: non parallel edges."<<"\n";return 1; }
757     
758   }
759   
760   // Creation du plan porteur de la contrainte.Methode lourde!
761   gp_Pnt A,B,C;
762   if (ShapeA.ShapeType()==TopAbs_EDGE) {
763     // A est un edge
764     TopoDS_Vertex Va,Vb;
765     TopExp::Vertices (TopoDS::Edge(ShapeA) ,Va ,Vb );
766     A=BRep_Tool::Pnt(Va);
767     B=BRep_Tool::Pnt(Vb);
768     
769     if (ShapeB.ShapeType()==TopAbs_EDGE) {
770       // B est un edge aussi
771       TopoDS_Vertex Vc,Vd;
772       TopExp::Vertices (TopoDS::Edge(ShapeB) ,Vc ,Vd );
773       // besoin que de 1 point.
774       C=BRep_Tool::Pnt(Vc);
775       
776     }
777     else {
778       // B est un vertex
779       C=BRep_Tool::Pnt(TopoDS::Vertex(ShapeB) );
780     }
781   }
782   else {
783     // A est un vertex
784     A=BRep_Tool::Pnt(TopoDS::Vertex(ShapeA) );
785     
786     if (ShapeB.ShapeType()==TopAbs_EDGE ) {
787       // B est un edge 
788       TopoDS_Vertex Vb,Vc;
789       TopExp::Vertices (TopoDS::Edge(ShapeB) ,Vb ,Vc );
790       // besoin que de 2 points.
791       B=BRep_Tool::Pnt(Vb);
792       C=BRep_Tool::Pnt(Vc);
793       
794     }
795     else {
796       // B est un vertex
797       B=BRep_Tool::Pnt(TopoDS::Vertex(ShapeB) );
798       C.SetX(B.X()+5.);
799       C.SetY(B.Y()+5.);
800       C.SetZ(B.Z()+5.);
801       
802     }
803   }
804   
805   // Fermeture du context local.
806   TheAISContext()->CloseLocalContext(myCurrentIndex);
807   
808   // construction du plane 
809   GC_MakePlane MkPlane(A ,B ,C );
810   Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
811   
812   // Construction de l'AIS_EqualDistanceRelation
813   Handle (AIS_EqualDistanceRelation ) myRelation= new AIS_EqualDistanceRelation (ShapeA, ShapeB, ShapeC ,ShapeD , theGeomPlane );
814   TheAISContext()->Display(myRelation );
815   GetMapOfAIS().Bind (myRelation,argv[1]);
816   
817
818   
819   return 0;
820   
821 }
822
823 //==============================================================================
824 //function : VEqualRadiusRelation
825 //purpose  : 
826 //Draw arg : vdiameterdim Name DiameterValue
827 //==============================================================================
828 #include <AIS_EqualRadiusRelation.hxx>
829 #include <GC_MakePlane.hxx>
830 #include <BRepAdaptor_Curve.hxx>
831
832
833 static int VEqualRadiusRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
834 {
835   // Declarations
836   Standard_Integer myCurrentIndex;
837   
838   // Verification
839   if (argc!=2) {di<<" vequalrad error: no arguments allowed."<<"\n";return 1;}
840   
841   // Fermeture des contextes locaux
842   TheAISContext()->CloseAllContexts();
843   
844   // Ouverture d'un contexte local et recuperation de son index.
845   TheAISContext()->OpenLocalContext();
846   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
847   
848   // On active les modes de selections Edges.
849   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
850   di<<" Select an circled edge "<<"\n";
851   
852   // Boucle d'attente waitpick.
853   Standard_Integer argc1 = 5;
854   const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
855   const char **argv1 = (const char **) buf1;
856   while (ViewerMainLoop( argc1, argv1) ) { }
857   // fin de la boucle
858   
859   TopoDS_Shape ShapeA;
860   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
861     ShapeA = TheAISContext()->SelectedShape();
862   }
863   
864   di<<" Select the last circled edge."<<"\n";
865   // Boucle d'attente waitpick.
866   Standard_Integer argc2 = 5;
867   const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
868   const char **argv2 = (const char **) buf2;
869   while (ViewerMainLoop( argc2, argv2) ) { }
870   // fin de la boucle
871   
872   TopoDS_Shape ShapeB;
873   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
874     ShapeB = TheAISContext()->SelectedShape();
875   }
876   // creation du plan qui contient la contrainte.
877   TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
878   TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
879   BRepAdaptor_Curve theCurveA(EdgeA);
880   // On recupere 3 points A,B,C de la curve.
881   gp_Pnt A=theCurveA.Value(0.1);
882   gp_Pnt B=theCurveA.Value(0.5);
883   gp_Pnt C=theCurveA.Value(0.9);
884   
885   // fermeture du contexte local.
886   TheAISContext()->CloseLocalContext(myCurrentIndex);
887   
888   // Creation du plane.
889   GC_MakePlane MkPlane (A ,B ,C );
890   Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
891   // Construction de l'AIS_EqualRadiusRelation
892   Handle (AIS_EqualRadiusRelation ) myRelation= new AIS_EqualRadiusRelation (EdgeA,EdgeB, theGeomPlane );
893   TheAISContext()->Display(myRelation );
894   GetMapOfAIS().Bind (myRelation,argv[1]);
895   
896   return 0;
897   
898 }
899
900
901 //==============================================================================
902 //function : VFixRelation
903 //purpose  : 
904 //Draw arg : vdiameterdim Name DiameterValue
905 //==============================================================================
906 #include <AIS_FixRelation.hxx>
907 #include <GC_MakePlane.hxx>
908 #include <BRepAdaptor_Curve.hxx>
909
910 static int VFixRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
911 {
912   // Declarations
913   Standard_Integer myCurrentIndex;
914   
915   // Verification
916   if (argc!=2) {di<<" vfix  error: no arguments allowed."<<"\n";return 1;}
917   
918   // Fermeture des contextes locaux
919   TheAISContext()->CloseAllContexts();
920   
921   // Ouverture d'un contexte local et recuperation de son index.
922   TheAISContext()->OpenLocalContext();
923   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
924   
925   // On active les modes de selections edge.
926   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
927   di<<" Select an edge. "<<"\n";
928   
929   // Boucle d'attente waitpick.
930   Standard_Integer argc1 = 5;
931   const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
932   const char **argv1 = (const char **) buf1;
933   while (ViewerMainLoop( argc1, argv1) ) { }
934   // fin de la boucle
935   
936   TopoDS_Shape ShapeA;
937   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
938     ShapeA = TheAISContext()->SelectedShape();
939   }
940   
941   // creation du plan qui contient la contrainte.
942   TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
943   BRepAdaptor_Curve theCurveA(EdgeA);
944   // On recupere 3 points A,B,C de la curve.
945   gp_Pnt A=theCurveA.Value(0.1);
946   gp_Pnt B=theCurveA.Value(0.5);
947   gp_Pnt D=theCurveA.Value(0.9);
948   gp_Pnt C(B.X()+5,B.Y()+5,B.Z()+5);
949   
950   // fermeture du contexte local.
951   TheAISContext()->CloseLocalContext(myCurrentIndex);
952   
953   // Creation du plane.
954   GC_MakePlane MkPlane (A ,D ,C );
955   Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
956   // Construction de l'AIS_EqualRadiusRelation
957   Handle (AIS_FixRelation) myRelation= new AIS_FixRelation (EdgeA,theGeomPlane );
958   TheAISContext()->Display(myRelation );
959   GetMapOfAIS().Bind (myRelation,argv[1]);
960   
961   
962   return 0;
963   
964 }
965
966 //==============================================================================
967 //function : VIdenticRelation
968 //purpose  : 
969 //Draw arg : vdiameterdim Name DiameterValue
970 //==============================================================================
971 #include <AIS_IdenticRelation.hxx>
972 #include <BRepAdaptor_Curve.hxx>
973 #include <TopExp_Explorer.hxx>
974
975
976 static int VIdenticRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
977 {
978   // Declarations
979   Standard_Integer myCurrentIndex;
980   
981   // Verification
982   if (argc!=2) {di<<" videntity error: no arguments allowed."<<"\n";return 1;}
983   
984   // Fermeture des contextes locaux
985   TheAISContext()->CloseAllContexts();
986   
987   // Ouverture d'un contexte local et recuperation de son index.
988   TheAISContext()->OpenLocalContext();
989   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
990   
991   // On active les modes de selections  vertex et face.
992   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
993   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
994   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
995   di<<" Select an edge, a face or a vertex. "<<"\n";
996   
997   // Boucle d'attente waitpick.
998   Standard_Integer argc1 = 5;
999   const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1000   const char **argv1 = (const char **) buf1;
1001   while (ViewerMainLoop( argc1, argv1) ) { }
1002   // fin de la boucle
1003   
1004   TopoDS_Shape ShapeA;
1005   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1006     ShapeA = TheAISContext()->SelectedShape();
1007   }
1008   
1009   di<<" Select an edge, a face or a vertex. "<<"\n";
1010   // Boucle d'attente waitpick.
1011   Standard_Integer argc2 = 5;
1012   const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1013   const char **argv2 = (const char **) buf2;
1014   while (ViewerMainLoop( argc2, argv2) ) { }
1015   // fin de la boucle
1016   
1017   TopoDS_Shape ShapeB;
1018   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1019     ShapeB = TheAISContext()->SelectedShape();
1020   }
1021   
1022   // Recuperation de points pour construir le Geom_Plnae.
1023   gp_Pnt A,B,C;
1024   if (ShapeA.ShapeType()==TopAbs_EDGE) {
1025     // 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.
1026     // on recupere deux points sur l'edge (il peut etre rectiligne)
1027     TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
1028     BRepAdaptor_Curve theCurveA(EdgeA);
1029     // Creation des 3 points.
1030     A=theCurveA.Value(0.1);
1031     B=theCurveA.Value(0.9);
1032     C.SetX(B.X()+5.);
1033     C.SetY(B.Y()+5.);
1034     C.SetZ(B.Z()+5.);
1035   }
1036   else if (ShapeA.ShapeType()==TopAbs_VERTEX ) {
1037     // SahpeA est un Vertex
1038     // On va utiliser ShapeB
1039     if (ShapeB.ShapeType()==TopAbs_EDGE) {
1040       // B est un edge 
1041       TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
1042       BRepAdaptor_Curve theCurveB(EdgeB);
1043       // Creation des 3 points.
1044       A=theCurveB.Value(0.1);
1045       B=theCurveB.Value(0.9);
1046       C.SetX(B.X()+5.);
1047       C.SetY(B.Y()+5.);
1048       C.SetZ(B.Z()+5.);
1049       
1050     }
1051     else if (ShapeB.ShapeType()==TopAbs_FACE ) {
1052       // Shape B est une face
1053       TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
1054       // On recupere 1 edge de FaceB(la face n'a pas forcement de vertex) (l'element A est forcement dans B).
1055       TopExp_Explorer FaceExp(FaceB,TopAbs_EDGE);
1056       TopoDS_Edge EdgeFromB=TopoDS::Edge(FaceExp.Current() );
1057       // On recupere les 3 points de l'edge de face B
1058       BRepAdaptor_Curve theCurveB(EdgeFromB);
1059       // On recupere 3 points A,B,C de la curve.
1060       A=theCurveB.Value(0.1);
1061       B=theCurveB.Value(0.5);
1062       C=theCurveB.Value(0.9);
1063       
1064     }
1065     else {
1066       // B ets un vetex aussi
1067       A=BRep_Tool::Pnt(TopoDS::Vertex(ShapeA) );
1068       B=BRep_Tool::Pnt(TopoDS::Vertex(ShapeB) );
1069       C.SetX(B.X()+5.);
1070       C.SetY(B.Y()+5.);
1071       C.SetZ(B.Z()+5.);
1072       
1073     }
1074     
1075   }
1076   else {
1077     // A est une face.
1078     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
1079     // On recupere 1 edge de FaceA
1080     TopExp_Explorer FaceExp(FaceA,TopAbs_EDGE);
1081     TopoDS_Edge EdgeFromA=TopoDS::Edge(FaceExp.Current() );
1082     // On recupere les 3 points de l'edge
1083     BRepAdaptor_Curve theCurveA(EdgeFromA);
1084     // On recupere 3 points A,B,C de la curve.
1085     A=theCurveA.Value(0.1);
1086     B=theCurveA.Value(0.5);
1087     C=theCurveA.Value(0.9);
1088     
1089   }
1090   
1091   // Fermeture du context local.
1092   TheAISContext()->CloseLocalContext(myCurrentIndex);
1093   // On construit le plane 
1094   GC_MakePlane MkPlane (A ,B ,C );
1095   Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1096   
1097   // Construction de l'AIS_IdenticRelation
1098   Handle ( AIS_IdenticRelation ) myRelation= new AIS_IdenticRelation  (ShapeA ,ShapeB, theGeomPlane );
1099   TheAISContext()->Display(myRelation );
1100   GetMapOfAIS().Bind (myRelation,argv[1]);
1101   
1102
1103   
1104   return 0;
1105   
1106 }
1107 //==============================================================================
1108 //function : VLengthDimension
1109 //purpose  : Display the diameter dimension of a face or an edge.
1110 //Draw arg : vdiameterdim Name DiameterValue
1111 //==============================================================================
1112 #include <AIS_LengthDimension.hxx>
1113 #include <BRepExtrema_ExtCC.hxx>
1114 #include <BRepExtrema_ExtPC.hxx>
1115 #include <BRepExtrema_ExtCF.hxx>
1116 #include <BRepExtrema_ExtPF.hxx>
1117 #include <BRepExtrema_ExtFF.hxx>
1118 #include <TCollection_ExtendedString.hxx>
1119 #include <BRepExtrema_DistShapeShape.hxx>
1120 #include <GC_MakePlane.hxx>
1121 #include <TopExp_Explorer.hxx>
1122 #include <BRepBuilderAPI_MakeVertex.hxx>
1123 static int VLenghtDimension(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1124 {
1125   // Declarations
1126   Standard_Integer myCurrentIndex;
1127   Standard_Real theDist;
1128   
1129   // Verification
1130   if (argc!=2) {di<<" videntity error: no arguments allowed."<<"\n";return 1;}
1131   
1132   // Fermeture des contextes locaux
1133   TheAISContext()->CloseAllContexts();
1134   
1135   // Ouverture d'un contexte local et recuperation de son index.
1136   myCurrentIndex = TheAISContext()->OpenLocalContext();
1137   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
1138   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
1139   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
1140   di<<" Select an edge, a face or a vertex. "<<"\n";
1141   
1142   // Boucle d'attente waitpick.
1143   Standard_Integer argc1 = 5;
1144   const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1145   const char **argv1 = (const char **) buf1;
1146   while (ViewerMainLoop( argc1, argv1) ) { }
1147
1148   // fin de la boucle
1149   TopoDS_Shape ShapeA;
1150   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1151     ShapeA = TheAISContext()->SelectedShape();
1152   }
1153   di<<" Select an edge, a face or a vertex. "<<"\n";
1154   // Boucle d'attente waitpick.
1155   Standard_Integer argc2 = 5;
1156   const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1157   const char **argv2 = (const char **) buf2;
1158   while (ViewerMainLoop( argc2, argv2) ) { }
1159   // fin de la boucle
1160   
1161   TopoDS_Shape ShapeB;
1162   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1163     ShapeB = TheAISContext()->SelectedShape();
1164   }
1165   // ShapeA est un edge.
1166   // ===================
1167   if (ShapeA.ShapeType()==TopAbs_EDGE ) {
1168     TopoDS_Edge  EdgeA=TopoDS::Edge(ShapeA);
1169     
1170     // Si ShapeB est un edge
1171     if (ShapeB.ShapeType()==TopAbs_EDGE ) {
1172       TopoDS_Edge  EdgeB=TopoDS::Edge(ShapeB);
1173       BRepExtrema_ExtCC myDeltaEdge (EdgeA ,EdgeB );
1174       // on verifie qu'ils ne sont pas paralleles.
1175       if (!myDeltaEdge.IsParallel() ) {di<<"vlenghtdim error: non parallel edges."<<"\n";return 1; }
1176       
1177       // On saisit la distance et on l'arrondit!
1178       theDist=Round (sqrt(myDeltaEdge.SquareDistance(1))*10. )/10.;
1179       
1180       // On recupere 3 Points des edges pour construire un plane.
1181       TopoDS_Vertex  Va,Vb,Vc,Vd;
1182       TopExp::Vertices(EdgeA,Va,Vb);
1183       TopExp::Vertices(EdgeB,Vc,Vd);
1184       gp_Pnt A=BRep_Tool::Pnt(Va);
1185       gp_Pnt B=BRep_Tool::Pnt(Vb);
1186       gp_Pnt C=BRep_Tool::Pnt(Vc);
1187       
1188       // Creation du Plane contenant la relation.
1189       GC_MakePlane MkPlane(A,B,C);
1190       Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1191       
1192       TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
1193       
1194       // On ferme le contexte local.
1195       TheAISContext()->CloseLocalContext(myCurrentIndex);
1196       
1197       // on construit l'AISLenghtDimension.
1198       Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (EdgeA,EdgeB,theGeomPlane->Pln());
1199       TheAISContext()->Display(myLenghtDim );
1200       GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
1201     }
1202     
1203     // Si ShapeB est un vertex.
1204     else if (ShapeB.ShapeType()==TopAbs_VERTEX ) {
1205       
1206       TopoDS_Vertex  VertexB=TopoDS::Vertex(ShapeB);
1207       BRepExtrema_ExtPC myDeltaEdgeVertex  (VertexB ,EdgeA );
1208       
1209       // On saisit la distance et on l'arrondit!
1210       theDist=Round (sqrt (myDeltaEdgeVertex.SquareDistance(1))*10. )/10.;
1211       
1212       // On recupere 2 Points de EdgeA pour construire un plane.
1213       TopoDS_Vertex  Va,Vb;
1214       TopExp::Vertices(EdgeA,Va,Vb);
1215       gp_Pnt A=BRep_Tool::Pnt(Va);
1216       gp_Pnt B=BRep_Tool::Pnt(Vb);
1217       gp_Pnt C=BRep_Tool::Pnt(VertexB);
1218       
1219       GC_MakePlane MkPlane(A,B,C);
1220       Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1221       
1222       TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
1223       TheAISContext()->CloseLocalContext(myCurrentIndex);
1224       Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (EdgeA,VertexB,theGeomPlane->Pln());
1225       TheAISContext()->Display(myLenghtDim );
1226       GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
1227       
1228       
1229     }
1230     
1231     // Si ShapeB est une Face
1232     else
1233     {
1234       TopoDS_Face FaceB=TopoDS::Face(ShapeB);
1235       BRepExtrema_ExtCF myDeltaEdgeFace  (EdgeA,FaceB );
1236       // On verifie que l'edge est bien parallele a la face.
1237       if (!myDeltaEdgeFace.IsParallel() ) {di<<"vdistdim error: the edge isn't parallel to the face;can't compute the distance. "<<"\n";return 1; }
1238
1239       // on construit l'AISLenghtDimension.
1240       Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (FaceB,EdgeA);
1241       TheAISContext()->Display(myLenghtDim );
1242       GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
1243     }
1244   }
1245
1246   // ShapeA est un vertex
1247   // ====================
1248   if (ShapeA.ShapeType()==TopAbs_VERTEX ) {
1249     TopoDS_Vertex  VertexA=TopoDS::Vertex(ShapeA);
1250     
1251     // Si ShapeB est un edge.
1252     if (ShapeB.ShapeType()==TopAbs_EDGE ) {
1253       TopoDS_Edge  EdgeB=TopoDS::Edge(ShapeB);
1254       BRepExtrema_ExtPC myDeltaEdgeVertex  (VertexA ,EdgeB );
1255       // On saisit la distance et on l'arrondit!
1256       theDist=Round (sqrt (myDeltaEdgeVertex.SquareDistance(1))*10. )/10.;
1257       
1258       // On recupere 2 Points de EdgeB pour construire un plane.
1259       TopoDS_Vertex  Va,Vb;
1260       TopExp::Vertices(EdgeB,Va,Vb);
1261       gp_Pnt A=BRep_Tool::Pnt(Va);
1262       gp_Pnt B=BRep_Tool::Pnt(Vb);
1263       gp_Pnt C=BRep_Tool::Pnt(VertexA);
1264       
1265       // Creation du Plane contenant la relation.
1266       GC_MakePlane MkPlane(A,B,C);
1267       Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1268       
1269       // Fermeture du contexte local.
1270       TheAISContext()->CloseLocalContext(myCurrentIndex);
1271       // Construction du texte.
1272       TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
1273       
1274       // on construit l'AISLenghtDimension.
1275       Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (EdgeB,VertexA,theGeomPlane->Pln());
1276       TheAISContext()->Display(myLenghtDim );
1277       GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
1278       
1279     }
1280     
1281     // Si ShapeB est un vertex.
1282     else if (ShapeB.ShapeType()==TopAbs_VERTEX ) {
1283       TopoDS_Vertex  VertexB=TopoDS::Vertex(ShapeB);
1284       BRepExtrema_DistShapeShape myDeltaVertexVertex  (VertexA ,VertexB );
1285       // On saisit la distance et on l'arrondit!
1286       theDist=Round (myDeltaVertexVertex.Value()*10. )/10.;
1287       
1288       // Les deux premiers points.
1289       gp_Pnt A=BRep_Tool::Pnt(VertexA);
1290       gp_Pnt B=BRep_Tool::Pnt(VertexB);
1291       gp_Pnt C(B.X()+10,B.Y()+10,B.Z()+10);
1292
1293       GC_MakePlane MkPlane(A,B,C);
1294       Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1295       
1296       // Fermeture du contexte local.
1297       TheAISContext()->CloseLocalContext(myCurrentIndex);
1298       // Construction du texte.
1299       TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
1300       
1301       // on construit l'AISLenghtDimension.
1302       Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (VertexA,VertexB,theGeomPlane->Pln());
1303       TheAISContext()->Display(myLenghtDim );
1304       GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
1305       
1306       
1307       
1308       
1309     }
1310     
1311     // Si ShapeB est une Face
1312     else {
1313       
1314       TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
1315       BRepExtrema_ExtPF myDeltaVertexFace  (VertexA ,FaceB );
1316       // On saisit la distance et on l'arrondit!
1317       theDist=Round (sqrt (myDeltaVertexFace.SquareDistance(1))*10. )/10.;
1318       
1319       // Premier point.
1320       gp_Pnt A=BRep_Tool::Pnt(VertexA);
1321       
1322       // On recupere 1 edge de FaceB.
1323       TopExp_Explorer FaceExp(FaceB,TopAbs_EDGE);
1324       TopoDS_Edge EdFromB=TopoDS::Edge(FaceExp.Current() );
1325       // On recupere les deux vertexes extremites de l'edge de face B
1326       TopoDS_Vertex  Vb,Vc;
1327       TopExp::Vertices(EdFromB,Vb,Vc);
1328 #ifdef DEB
1329       gp_Pnt B=
1330 #endif
1331                BRep_Tool::Pnt(Vb);
1332       gp_Pnt C=BRep_Tool::Pnt(Vc);
1333       
1334       // On projette le point B sur la Face car il 
1335       // n'existe pas de constructeurs AIS_LD PointFace
1336       // on est donc oblige de creer un nouveau TopoDS_Vertex.
1337       gp_Pnt theProjA=myDeltaVertexFace.Point(1);
1338       BRepBuilderAPI_MakeVertex theVertexMaker(theProjA);
1339       TopoDS_Vertex VertexAproj=theVertexMaker.Vertex();
1340       // Creation du Plane contenant la relation.
1341       GC_MakePlane MkPlane(A,theProjA,C);
1342       Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1343       
1344       // Fermeture du contexte local.
1345       TheAISContext()->CloseLocalContext(myCurrentIndex);
1346       // Construction du texte.
1347       TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
1348       
1349       // on construit l'AISLenghtDimension.
1350       Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (VertexA,VertexAproj,theGeomPlane->Pln());
1351       TheAISContext()->Display(myLenghtDim );
1352       GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
1353       
1354     }
1355     
1356     
1357     
1358   }
1359   
1360   // ShapeA est une Face
1361   // ===================
1362   else {
1363     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
1364     // Si ShapeB est un edge.
1365     if (ShapeB.ShapeType()==TopAbs_EDGE ) {
1366       TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
1367       BRepExtrema_ExtCF myDeltaEdgeFace  (EdgeB,FaceA );
1368       // On verifie que l'edge est bien parallele a la face.
1369       if (!myDeltaEdgeFace.IsParallel() ) {di<<"vdistdim error: the edge isn't parallel to the face;can't compute the distance. "<<"\n";return 1; }
1370       
1371       // On saisit la distance et on l'arrondit!
1372       theDist=Round (sqrt (myDeltaEdgeFace.SquareDistance(1))*10. )/10.;
1373       
1374       // Construction du texte.
1375       TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
1376       
1377       // on construit l'AISLenghtDimension.
1378       Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (FaceA,EdgeB);
1379       TheAISContext()->Display(myLenghtDim );
1380       GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
1381       
1382     }
1383     
1384     // Si ShapeB est un vertex.
1385     else if (ShapeB.ShapeType()==TopAbs_VERTEX ) {
1386       
1387       TopoDS_Vertex  VertexB=TopoDS::Vertex(ShapeB);
1388       BRepExtrema_ExtPF myDeltaVertexFace  (VertexB ,FaceA );
1389       // On saisit la distance et on l'arrondit!
1390       theDist=Round (sqrt (myDeltaVertexFace.SquareDistance(1))*10. )/10.;
1391       
1392       // Premier point.
1393       gp_Pnt B=BRep_Tool::Pnt(VertexB);
1394       
1395       // On recupere 1 edge de FaceA.
1396       TopExp_Explorer FaceExp(FaceA,TopAbs_EDGE);
1397       TopoDS_Edge EdFromA=TopoDS::Edge(FaceExp.Current() );
1398       // On recupere les deux vertexes extremites de l'edge de face A
1399       TopoDS_Vertex  Va,Vc;
1400       TopExp::Vertices(EdFromA,Va,Vc);
1401       gp_Pnt A=BRep_Tool::Pnt(Va);
1402 #ifdef DEB
1403       gp_Pnt C=
1404 #endif
1405                BRep_Tool::Pnt(Vc);
1406
1407       // On projette le point B sur la Face car il 
1408       // n'existe pas de constructeurs AIS_LD PointFace
1409       // on est donc oblige de creer un nouveau TopoDS_Vertex.
1410       gp_Pnt theProjB=myDeltaVertexFace.Point(1);
1411       BRepBuilderAPI_MakeVertex theVertexMaker(theProjB);
1412       TopoDS_Vertex VertexBproj=theVertexMaker.Vertex();
1413       // Creation du Plane contenant la relation.
1414       GC_MakePlane MkPlane(A,B,theProjB);
1415       Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1416       
1417       // Fermeture du contexte local.
1418       TheAISContext()->CloseLocalContext(myCurrentIndex);
1419       // Construction du texte.
1420       TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
1421       
1422       // on construit l'AISLenghtDimension mais en utilisant le constructeur Vertex Vertex.
1423       Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (VertexB,VertexBproj,theGeomPlane->Pln());
1424       TheAISContext()->Display(myLenghtDim );
1425       GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
1426       
1427     }
1428     
1429     // Si ShapeB est une Face
1430     else {
1431       
1432       TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
1433       BRepExtrema_ExtFF myDeltaFaceFace  (FaceA ,FaceB );
1434       // On verifie que les deux faces sont bien parelles.
1435       if (!myDeltaFaceFace.IsParallel() ) {di<<"vdistdim error: the faces are not parallel. "<<"\n";return 1; }
1436       
1437       // On saisit la distance et on l'arrondit!
1438       theDist=Round (sqrt (myDeltaFaceFace.SquareDistance(1))*10. )/10.;
1439       // Fermeture du contexte local.
1440       TheAISContext()->CloseLocalContext(myCurrentIndex);
1441       // Construction du texte.
1442       TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
1443       
1444       // on construit l'AISLenghtDimension.
1445       Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (FaceA,FaceB);
1446       TheAISContext()->Display(myLenghtDim );
1447       GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
1448       
1449     }
1450     
1451   }
1452   
1453   
1454   
1455   return 0;
1456   
1457 }
1458
1459
1460 //==============================================================================
1461 //function : VRadiusDim
1462 //purpose  : Display the radius dimension of a face or an edge.
1463 //Draw arg : vradiusdim Name 
1464 //==============================================================================
1465 #include <AIS_RadiusDimension.hxx>
1466 #include <TCollection_ExtendedString.hxx>
1467 #include <BRepAdaptor_Curve.hxx>
1468 #include <gp_Circ.hxx>
1469
1470
1471 static int VRadiusDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1472 {
1473   // Declarations
1474   Standard_Integer myCurrentIndex;
1475   Standard_Real theRadius;
1476     
1477   // Verification
1478   if (argc!=2) {di<<" vradiusdim error"<<"\n";return 1;}
1479   
1480   // Fermeture des contextes locaux
1481   TheAISContext()->CloseAllContexts();
1482   
1483   // Ouverture d'un contexte local et recuperation de son index.
1484   TheAISContext()->OpenLocalContext();
1485   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1486   
1487   // On active les modes de selections Edges et Faces.
1488   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
1489   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
1490   di<<" Select an circled edge or face."<<"\n";
1491   
1492   // Boucle d'attente waitpick.
1493   Standard_Integer argcc = 5;
1494   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1495   const char **argvv = (const char **) buff;
1496   while (ViewerMainLoop( argcc, argvv) ) { }
1497   // fin de la boucle
1498   
1499   TopoDS_Shape ShapeA;
1500   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1501     ShapeA = TheAISContext()->SelectedShape();
1502   }
1503   
1504   // Shape A est un edge.
1505   if (ShapeA.ShapeType()==TopAbs_EDGE  ) {
1506     
1507     TopoDS_Edge  EdgeA=TopoDS::Edge(ShapeA);
1508     // Recuperation du rayon
1509     BRepAdaptor_Curve theCurve(TopoDS::Edge(ShapeA));
1510     if (theCurve.GetType()!=GeomAbs_Circle ) {di<<"vradiusdim error: the edge is not a circular one."<<"\n";return 1;}
1511     else {
1512       gp_Circ theGpCircle=theCurve.Circle();
1513       theRadius=theGpCircle.Radius();
1514       // On arrondit le rayon
1515       theRadius=Round (theRadius*10. )/10.;
1516     }
1517     
1518     // Construction du texte.
1519     TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("r=")+TCollection_ExtendedString(theRadius  ) );
1520     
1521     // Fermeture du contexte.
1522     TheAISContext()->CloseLocalContext(myCurrentIndex);
1523     
1524     // Construction de L'AIS_RadiusDimension.
1525     Handle (AIS_RadiusDimension) myRadDim= new AIS_RadiusDimension(ShapeA);
1526     GetMapOfAIS().Bind (myRadDim,argv[1]);
1527     TheAISContext()->Display(myRadDim );
1528     
1529     
1530   }
1531   
1532   // Shape A est une face
1533   else if (ShapeA.ShapeType()==TopAbs_FACE ) {
1534     
1535     // on recupere un edge de la face.
1536     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
1537     // on explore.
1538     TopExp_Explorer FaceExp(FaceA,TopAbs_EDGE);
1539     TopoDS_Edge EdgeFromA=TopoDS::Edge(FaceExp.Current() );
1540     
1541     // Recuperation du rayon
1542     BRepAdaptor_Curve theCurve(EdgeFromA );
1543     if (theCurve.GetType()!=GeomAbs_Circle ) {di<<"vradiusdim error: the face is not a circular one."<<"\n";return 1;}
1544     else {
1545       gp_Circ theGpCircle=theCurve.Circle();
1546       theRadius=theGpCircle.Radius();
1547       // On arrondit le rayon
1548       theRadius=Round (theRadius*10. )/10.;
1549     }
1550     
1551     // Construction du texte.
1552     TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("r=")+TCollection_ExtendedString(theRadius  ) );
1553     
1554     // Fermeture du contexte.
1555     TheAISContext()->CloseLocalContext(myCurrentIndex);
1556     
1557     // Construction de L'AIS_RadiusDimension.
1558     Handle (AIS_RadiusDimension) myRadDim= new AIS_RadiusDimension(ShapeA);
1559     GetMapOfAIS().Bind (myRadDim,argv[1]);
1560     TheAISContext()->Display(myRadDim );
1561     
1562     
1563   }
1564   
1565   else {
1566     di<<" vradiusdim error: the selection of a face or an edge was expected."<<"\n";return 1;
1567   }
1568   
1569   return 0;
1570   
1571 }
1572
1573
1574
1575 //==============================================================================
1576 //function : VOffsetDim
1577 //purpose  : Display the offset dimension
1578 //Draw arg : voffsetdim Name 
1579 //==============================================================================
1580 #include <AIS_OffsetDimension.hxx>
1581 #include <TCollection_ExtendedString.hxx>
1582 #include <BRepExtrema_ExtFF.hxx>
1583
1584
1585 static int VOffsetDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1586 {
1587   // Declarations
1588   Standard_Integer myCurrentIndex;
1589   Standard_Real    theDist;
1590   
1591   // Verification
1592   if (argc!=2) {di<<" voffsetdim error"<<"\n";return 1;}
1593   
1594   // Fermeture des contextes locaux
1595   TheAISContext()->CloseAllContexts();
1596   
1597   // Ouverture d'un contexte local et recuperation de son index.
1598   TheAISContext()->OpenLocalContext();
1599   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1600   
1601   // On active les modes de selections Faces.
1602   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
1603   di<<" Select a face."<<"\n";
1604   
1605   // Boucle d'attente waitpick.
1606   Standard_Integer argcc = 5;
1607   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1608   const char **argvv = (const char **) buff;
1609   while (ViewerMainLoop( argcc, argvv) ) { }
1610   // fin de la boucle
1611   
1612   TopoDS_Shape ShapeA;
1613   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1614     ShapeA = TheAISContext()->SelectedShape();
1615   }
1616   
1617   di<<" Select a face."<<"\n";
1618   // Boucle d'attente waitpick.
1619   Standard_Integer argccc = 5;
1620   const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1621   const char **argvvv = (const char **) bufff;
1622   while (ViewerMainLoop( argccc, argvvv) ) { }
1623   // fin de la boucle
1624   
1625   TopoDS_Shape ShapeB;
1626   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1627     ShapeB = TheAISContext()->SelectedShape();
1628   }
1629   
1630   
1631   // Shape A et B est une face
1632   if (ShapeA.ShapeType()==TopAbs_FACE && ShapeB.ShapeType()==TopAbs_FACE ) {
1633     
1634     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
1635     TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
1636     
1637     BRepExtrema_ExtFF myDeltaFaceFace  (FaceA ,FaceB );
1638     // On verifie que les deux faces sont bien parelles.
1639     if (!myDeltaFaceFace.IsParallel() ) {di<<"vdistdim error: the faces are not parallel. "<<"\n";return 1; }
1640     
1641     // On saisit la distance et on l'arrondit!
1642     theDist=Round (sqrt (myDeltaFaceFace.SquareDistance(1))*10. )/10.;
1643     // Fermeture du contexte local.
1644     TheAISContext()->CloseLocalContext(myCurrentIndex);
1645     // Construction du texte.
1646     TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("offset=")+TCollection_ExtendedString(theDist ) );
1647     
1648     // on construit l'AIS_OffsetDimension
1649     Handle(AIS_OffsetDimension) myOffsetDim=new AIS_OffsetDimension (FaceA,FaceB,theDist,TheMessage_Str );
1650     TheAISContext()->Display(myOffsetDim );
1651     GetMapOfAIS().Bind (myOffsetDim ,argv[1]);
1652     
1653     
1654     
1655   }
1656   
1657   else {
1658     di<<" voffsetdim error: the selection of a face was expected."<<"\n";return 1;
1659   }
1660   
1661   return 0;
1662   
1663 }
1664
1665
1666
1667
1668 //==============================================================================
1669 //function : VParallel
1670 //purpose  : Display the parallel relation 
1671 //Draw arg : vparallel Name 
1672 //==============================================================================
1673 #include <AIS_ParallelRelation.hxx>
1674 #include <TCollection_ExtendedString.hxx>
1675 #include <BRepExtrema_ExtFF.hxx>
1676 #include <BRepExtrema_ExtCC.hxx>
1677 #include <GC_MakePlane.hxx>
1678 #include <BRepAdaptor_Curve.hxx>
1679 #include <TopExp_Explorer.hxx>
1680
1681
1682 static int VParallelBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1683 {
1684   // Declarations
1685   Standard_Integer myCurrentIndex;
1686  
1687   // Verification
1688   if (argc!=2) {di<<" vparallel error"<<"\n";return 1;}
1689   
1690   // Fermeture des contextes locaux
1691   TheAISContext()->CloseAllContexts();
1692   
1693   // Ouverture d'un contexte local et recuperation de son index.
1694   TheAISContext()->OpenLocalContext();
1695   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1696   
1697   // On active les modes de selections Edges.
1698   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
1699   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
1700   di<<" Select an edge or a face "<<"\n";
1701   
1702   // Boucle d'attente waitpick.
1703   Standard_Integer argcc = 5;
1704   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1705   const char **argvv = (const char **) buff;
1706   while (ViewerMainLoop( argcc, argvv) ) { }
1707   // fin de la boucle
1708   
1709   TopoDS_Shape ShapeA;
1710   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1711     ShapeA = TheAISContext()->SelectedShape();
1712   }
1713   
1714   // SahpeA est un edge.
1715   // ===================
1716   if (ShapeA.ShapeType()==TopAbs_EDGE ) {
1717     
1718     // desactivation du mode face
1719     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
1720     di<<" Select a second edge"<<"\n";
1721     // Boucle d'attente waitpick.
1722     Standard_Integer argccc = 5;
1723     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1724     const char **argvvv = (const char **) bufff;
1725     while (ViewerMainLoop( argccc, argvvv) ) { }
1726     // fin de la boucle
1727     
1728     TopoDS_Shape ShapeB;
1729     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1730       ShapeB = TheAISContext()->SelectedShape();
1731     }
1732     
1733     // recuperation des edges.
1734     TopoDS_Edge  EdgeA=TopoDS::Edge(ShapeA);
1735     TopoDS_Edge  EdgeB=TopoDS::Edge(ShapeB);
1736     BRepExtrema_ExtCC myDeltaEdge (EdgeA ,EdgeB );
1737     // on verifie qu'ils ne sont pas paralleles.
1738     if (!myDeltaEdge.IsParallel() ) {di<<"vparallel error: non parallel edges."<<"\n";return 1; }
1739     
1740     
1741     // On recupere les  vertexes extremites des edge A et B.
1742     BRepAdaptor_Curve theCurveA(EdgeA);
1743     BRepAdaptor_Curve theCurveB(EdgeB);
1744     // On recupere 3 points A,B,C des  curves.
1745     gp_Pnt A=theCurveA.Value(0.1);
1746     gp_Pnt B=theCurveA.Value(0.9);
1747     gp_Pnt C=theCurveB.Value(0.5);
1748     
1749     // Construction du Geom_Plane
1750     GC_MakePlane MkPlane(A,B,C);
1751     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1752     // Fermeture du contexte local.
1753     TheAISContext()->CloseLocalContext(myCurrentIndex);
1754     // Construction de l'AIS_ParallelRelation
1755     Handle(AIS_ParallelRelation) myParaRelation= new AIS_ParallelRelation(EdgeA ,EdgeB ,theGeomPlane );
1756     TheAISContext()->Display(myParaRelation );
1757     GetMapOfAIS().Bind (myParaRelation ,argv[1]);
1758     
1759     
1760   }
1761   
1762   // Shape A est une face
1763   // ====================
1764   else {
1765     
1766     // desactivation du mode edge
1767     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
1768     di<<" Select a second edge"<<"\n";
1769     // Boucle d'attente waitpick.
1770     Standard_Integer argccc = 5;
1771     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1772     const char **argvvv = (const char **) bufff;
1773     while (ViewerMainLoop( argccc, argvvv) ) { }
1774     // fin de la boucle
1775     
1776     TopoDS_Shape ShapeB;
1777     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1778       ShapeB = TheAISContext()->SelectedShape();
1779     }
1780     
1781     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
1782     TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
1783     
1784     BRepExtrema_ExtFF myDeltaFaceFace  (FaceA ,FaceB );
1785     // On verifie que les deux faces sont bien parelles.
1786     if (!myDeltaFaceFace.IsParallel() ) {di<<"vdistdim error: the faces are not parallel. "<<"\n";return 1; }
1787     
1788     // recuperation des edges des faces.
1789     TopExp_Explorer FaceExpA(FaceA,TopAbs_EDGE);
1790     TopExp_Explorer FaceExpB(FaceB,TopAbs_EDGE);
1791     
1792     TopoDS_Edge EdgeA=TopoDS::Edge(FaceExpA.Current() );
1793     TopoDS_Edge EdgeB=TopoDS::Edge(FaceExpB.Current() );
1794     
1795     // On recupere les  vertexes extremites des edge A et B.
1796     BRepAdaptor_Curve theCurveA(EdgeA);
1797     BRepAdaptor_Curve theCurveB(EdgeB);
1798     // On recupere 3 points A,B,C des  curves.
1799     gp_Pnt A=theCurveA.Value(0.1);
1800     gp_Pnt B=theCurveA.Value(0.9);
1801     gp_Pnt C=theCurveB.Value(0.5);
1802     
1803     // Construction du Geom_Plane
1804     GC_MakePlane MkPlane(A,B,C);
1805     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1806     // Fermeture du contexte local.
1807     TheAISContext()->CloseLocalContext(myCurrentIndex);
1808     // Construction de l'AIS_ParallelRelation
1809     Handle(AIS_ParallelRelation) myParaRelation= new AIS_ParallelRelation(FaceA ,FaceB ,theGeomPlane );
1810     TheAISContext()->Display(myParaRelation );
1811     GetMapOfAIS().Bind (myParaRelation ,argv[1]);
1812     
1813     
1814     
1815   }
1816   
1817   
1818   return 0;
1819   
1820 }
1821
1822
1823
1824
1825 //==============================================================================
1826 //function : VPerpendicularRelation
1827 //purpose  : Display the Perpendicular Relation
1828 //Draw arg : vperpendicular Name 
1829 //==============================================================================
1830 #include <AIS_PerpendicularRelation.hxx>
1831 #include <TCollection_ExtendedString.hxx>
1832 #include <GC_MakePlane.hxx>
1833 #include <BRepAdaptor_Curve.hxx>
1834 #include <TopExp_Explorer.hxx>
1835
1836
1837
1838 static int VPerpendicularBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1839 {
1840   // Declarations
1841   Standard_Integer myCurrentIndex;
1842  
1843   // Verification
1844   if (argc!=2) {di<<" vortho error"<<"\n";return 1;}
1845   
1846   // Fermeture des contextes locaux
1847   TheAISContext()->CloseAllContexts();
1848   
1849   // Ouverture d'un contexte local et recuperation de son index.
1850   TheAISContext()->OpenLocalContext();
1851   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1852   
1853   // On active les modes de selections Edges.
1854   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
1855   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
1856   di<<" Select an edge or a face "<<"\n";
1857   
1858   // Boucle d'attente waitpick.
1859   Standard_Integer argcc = 5;
1860   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1861   const char **argvv = (const char **) buff;
1862   while (ViewerMainLoop( argcc, argvv) ) { }
1863   // fin de la boucle
1864   
1865   TopoDS_Shape ShapeA;
1866   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1867     ShapeA = TheAISContext()->SelectedShape();
1868   }
1869   
1870   // ShapeA est un edge.
1871   // ===================
1872   if (ShapeA.ShapeType()==TopAbs_EDGE ) {
1873     
1874     // desactivation du mode face
1875     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
1876     di<<" Select a second edge"<<"\n";
1877     // Boucle d'attente waitpick.
1878     Standard_Integer argccc = 5;
1879     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1880     const char **argvvv = (const char **) bufff;
1881     while (ViewerMainLoop( argccc, argvvv) ) { }
1882     // fin de la boucle
1883     
1884     TopoDS_Shape ShapeB;
1885     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1886       ShapeB = TheAISContext()->SelectedShape();
1887     }
1888     
1889     // recuperation des edges.
1890     TopoDS_Edge  EdgeA=TopoDS::Edge(ShapeA);
1891     TopoDS_Edge  EdgeB=TopoDS::Edge(ShapeB);
1892     
1893     // On recupere les  curves
1894     BRepAdaptor_Curve theCurveA(EdgeA);
1895     BRepAdaptor_Curve theCurveB(EdgeB);
1896     // on verifie si les edges sont orthogonaux.
1897     //gp_Lin theLineA=theCurveA.Line();
1898     //gp_Lin theLineB=theCurveB.Line();
1899     //if (abs(theLineA.Angle(theLineB) ) != M_PI/2 ) {cout<<"vperpendicular error: Edges are not  othogonals."<<endl;return 1;}
1900     
1901     // On recupere 3 points A,B,C des  curves.
1902     gp_Pnt A=theCurveA.Value(0.1);
1903     gp_Pnt B=theCurveA.Value(0.9);
1904     gp_Pnt C=theCurveB.Value(0.5);
1905     // Construction du Geom_Plane
1906     GC_MakePlane MkPlane(A,B,C);
1907     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1908     // Fermeture du contexte local.
1909     TheAISContext()->CloseLocalContext(myCurrentIndex);
1910     // Construction de l'AIS_ParallelRelation
1911     Handle(AIS_PerpendicularRelation) myOrthoRelation= new AIS_PerpendicularRelation (EdgeA ,EdgeB ,theGeomPlane );
1912     TheAISContext()->Display(myOrthoRelation );
1913     GetMapOfAIS().Bind (myOrthoRelation ,argv[1]);
1914     
1915     
1916   }
1917   
1918   // Shape A est une face
1919   // ====================
1920   else {
1921     
1922     // desactivation du mode edge
1923     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
1924     di<<" Select a second edge"<<"\n";
1925     // Boucle d'attente waitpick.
1926     Standard_Integer argccc = 5;
1927     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
1928     const char **argvvv = (const char **) bufff;
1929     while (ViewerMainLoop( argccc, argvvv) ) { }
1930     // fin de la boucle
1931     
1932     TopoDS_Shape ShapeB;
1933     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
1934       ShapeB = TheAISContext()->SelectedShape();
1935     }
1936     
1937     // pas de verification d'orthogonalite.
1938     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
1939     TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
1940     
1941     // recuperation des edges des faces.
1942     TopExp_Explorer FaceExpA(FaceA,TopAbs_EDGE);
1943     TopExp_Explorer FaceExpB(FaceB,TopAbs_EDGE);
1944     
1945     TopoDS_Edge EdgeA=TopoDS::Edge(FaceExpA.Current() );
1946     TopoDS_Edge EdgeB=TopoDS::Edge(FaceExpB.Current() );
1947     
1948     // On recupere les  vertexes extremites des edge A et B.
1949     BRepAdaptor_Curve theCurveA(EdgeA);
1950     BRepAdaptor_Curve theCurveB(EdgeB);
1951     // On recupere 3 points A,B,C des  curves.
1952     gp_Pnt A=theCurveA.Value(0.1);
1953     gp_Pnt B=theCurveA.Value(0.9);
1954     gp_Pnt C=theCurveB.Value(0.5);
1955     // Construction du Geom_Plane
1956     GC_MakePlane MkPlane(A,B,C);
1957     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
1958     // Fermeture du contexte local.
1959     TheAISContext()->CloseLocalContext(myCurrentIndex);
1960     // Construction de l'AIS_PerpendicularRelation
1961     Handle(AIS_PerpendicularRelation) myOrthoRelation= new AIS_PerpendicularRelation(FaceA ,FaceB );
1962     TheAISContext()->Display(myOrthoRelation );
1963     GetMapOfAIS().Bind (myOrthoRelation  ,argv[1]);
1964     
1965     
1966     
1967   }
1968   
1969   
1970   return 0;
1971   
1972 }
1973
1974
1975 //==============================================================================
1976 //function : VTangentRelation
1977 //purpose  : Display the tangent Relation
1978 //Draw arg : vtangent Name 
1979 //==============================================================================
1980 #include <AIS_TangentRelation.hxx>
1981
1982
1983 static int VTangentBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
1984 {
1985   // Declarations
1986   Standard_Integer myCurrentIndex;
1987  
1988   // Verification
1989   if (argc!=2) {di<<" vtangent error"<<"\n";return 1;}
1990   
1991   // Fermeture des contextes locaux
1992   TheAISContext()->CloseAllContexts();
1993   
1994   // Ouverture d'un contexte local et recuperation de son index.
1995   TheAISContext()->OpenLocalContext();
1996   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
1997   
1998   // On active les modes de selections Edges.
1999   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
2000   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
2001   di<<" Select two coplanar edges(First the circular edge then the tangent edge) or two faces "<<"\n";
2002   
2003   // Boucle d'attente waitpick.
2004   Standard_Integer argcc = 5;
2005   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2006   const char **argvv = (const char **) buff;
2007   while (ViewerMainLoop( argcc, argvv) ) { }
2008   // fin de la boucle
2009   
2010   TopoDS_Shape ShapeA;
2011   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2012     ShapeA = TheAISContext()->SelectedShape();
2013   }
2014   
2015   // ShapeA est un edge.
2016   // ===================
2017   if (ShapeA.ShapeType()==TopAbs_EDGE ) {
2018     
2019     // desactivation du mode face
2020     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
2021     di<<" Select a second edge"<<"\n";
2022     // Boucle d'attente waitpick.
2023     Standard_Integer argccc = 5;
2024     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2025     const char **argvvv = (const char **) bufff;
2026     while (ViewerMainLoop( argccc, argvvv) ) { }
2027     // fin de la boucle
2028     
2029     TopoDS_Shape ShapeB;
2030     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2031       ShapeB = TheAISContext()->SelectedShape();
2032     }
2033     
2034     // recuperation des edges.
2035     TopoDS_Edge  EdgeA=TopoDS::Edge(ShapeA);
2036     TopoDS_Edge  EdgeB=TopoDS::Edge(ShapeB);
2037     
2038     // On recupere les  curves
2039     BRepAdaptor_Curve theCurveA(EdgeA);
2040     BRepAdaptor_Curve theCurveB(EdgeB);
2041     
2042     // On recupere 3 points A,B,C des  curves.
2043     gp_Pnt A=theCurveA.Value(0.1);
2044     gp_Pnt B=theCurveA.Value(0.9);
2045     gp_Pnt C=theCurveB.Value(0.5);
2046
2047     // Construction du Geom_Plane
2048     GC_MakePlane MkPlane(A,B,C);
2049     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2050     // Fermeture du contexte local.
2051     TheAISContext()->CloseLocalContext(myCurrentIndex);
2052     // Construction de l'AIS_TangentRelation
2053     Handle(AIS_TangentRelation) myTanRelation= new AIS_TangentRelation  (EdgeA ,EdgeB ,theGeomPlane );
2054     TheAISContext()->Display(myTanRelation );
2055     GetMapOfAIS().Bind (myTanRelation ,argv[1]);
2056     
2057     
2058   }
2059   
2060   // Shape A est une face
2061   // ====================
2062   else {
2063     
2064     // desactivation du mode edge
2065     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
2066     di<<" Select a second edge"<<"\n";
2067     // Boucle d'attente waitpick.
2068     Standard_Integer argccc = 5;
2069     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2070     const char **argvvv = (const char **) bufff;
2071     while (ViewerMainLoop( argccc, argvvv) ) { }
2072     // fin de la boucle
2073     
2074     TopoDS_Shape ShapeB;
2075     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2076       ShapeB = TheAISContext()->SelectedShape();
2077     }
2078     
2079     TopoDS_Face  FaceA=TopoDS::Face(ShapeA);
2080     TopoDS_Face  FaceB=TopoDS::Face(ShapeB);
2081     
2082     // recuperation des edges des faces.
2083     TopExp_Explorer FaceExpA(FaceA,TopAbs_EDGE);
2084     TopExp_Explorer FaceExpB(FaceB,TopAbs_EDGE);
2085     
2086     TopoDS_Edge EdgeA=TopoDS::Edge(FaceExpA.Current() );
2087     TopoDS_Edge EdgeB=TopoDS::Edge(FaceExpB.Current() );
2088     
2089     // On recupere les  vertexes extremites des edge A et B.
2090     BRepAdaptor_Curve theCurveA(EdgeA);
2091     BRepAdaptor_Curve theCurveB(EdgeB);
2092     // On recupere 3 points A,B,C des  curves.
2093     gp_Pnt A=theCurveA.Value(0.1);
2094     gp_Pnt B=theCurveA.Value(0.9);
2095     gp_Pnt C=theCurveB.Value(0.5);
2096
2097     // Construction du Geom_Plane
2098     GC_MakePlane MkPlane(A,B,C);
2099     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2100     // Fermeture du contexte local.
2101     TheAISContext()->CloseLocalContext(myCurrentIndex);
2102     // Construction de l'AIS_PerpendicularRelation
2103     Handle(AIS_TangentRelation) myTanRelation= new AIS_TangentRelation(FaceA ,FaceB,theGeomPlane );
2104     TheAISContext()->Display(myTanRelation );
2105     GetMapOfAIS().Bind (myTanRelation  ,argv[1]);
2106     
2107     
2108     
2109   }
2110   
2111   
2112   return 0;
2113   
2114 }
2115
2116 //==============================================================================
2117 //function : VSymetricalRelation
2118 //purpose  : Display the Symetrical Relation
2119 //Draw arg : vsymetric Name 
2120 //==============================================================================
2121 #include <AIS_SymmetricRelation.hxx>
2122
2123
2124 static int VSymmetricBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
2125 {
2126   // Declarations
2127   Standard_Integer myCurrentIndex;
2128  
2129   // Verification
2130   if (argc!=2) {di<<" vSymmetric error"<<"\n";return 1;}
2131   
2132   // Fermeture des contextes locaux
2133   TheAISContext()->CloseAllContexts();
2134   
2135   // Ouverture d'un contexte local et recuperation de son index.
2136   TheAISContext()->OpenLocalContext();
2137   myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
2138   
2139   // On active les modes de selections
2140   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
2141   di<<" Select an edge:the axis of symetry "<<"\n";
2142   
2143   // Boucle d'attente waitpick.
2144   Standard_Integer argcc = 5;
2145   const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2146   const char **argvv = (const char **) buff;
2147   while (ViewerMainLoop( argcc, argvv) ) { }
2148   // fin de la boucle
2149   
2150   TopoDS_Shape ShapeA;
2151   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2152     ShapeA = TheAISContext()->SelectedShape();
2153   }
2154   // recuperation des edges.
2155   TopoDS_Edge  EdgeA=TopoDS::Edge(ShapeA);
2156   
2157   // On active les modes de selections
2158   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
2159   TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
2160   di<<" Select two edges or two vertices. "<<"\n";
2161   
2162   // Boucle d'attente waitpick.
2163   Standard_Integer argcc2 = 5;
2164 //  const char *buff2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2165   const char **argvv2 = (const char **) buff;
2166   while (ViewerMainLoop( argcc2, argvv2) ) { }
2167   // fin de la boucle
2168   
2169   TopoDS_Shape ShapeB;
2170   for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2171     ShapeB = TheAISContext()->SelectedShape();
2172   }
2173   
2174   
2175   
2176   
2177   
2178   // ShapeB est un edge.
2179   // ===================
2180   if (ShapeB.ShapeType()==TopAbs_EDGE ) {
2181     
2182     // desactivation du mode vertex
2183     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(1) );
2184     di<<" Select a second edge"<<"\n";
2185     // Boucle d'attente waitpick.
2186     Standard_Integer argccc = 5;
2187     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2188     const char **argvvv = (const char **) bufff;
2189     while (ViewerMainLoop( argccc, argvvv) ) { }
2190     // fin de la boucle
2191     
2192     TopoDS_Shape ShapeC;
2193     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2194       ShapeC = TheAISContext()->SelectedShape();
2195     }
2196     
2197     // recuperation des edges.
2198     TopoDS_Edge  EdgeB=TopoDS::Edge(ShapeB);
2199     TopoDS_Edge  EdgeC=TopoDS::Edge(ShapeC);
2200     // on verifie que les edges sont paralleles
2201     BRepExtrema_ExtCC myDeltaEdgeAB (EdgeA ,EdgeB );
2202     BRepExtrema_ExtCC myDeltaEdgeAC (EdgeA ,EdgeC );
2203     // on verifie qu'ils  sont paralleles.
2204     if (!myDeltaEdgeAB.IsParallel() ) {di<<"vsymetric error: non parallel edges."<<"\n";return 1; }
2205     if (!myDeltaEdgeAC.IsParallel() ) {di<<"vsymetric error: non parallel edges."<<"\n";return 1; }
2206     // on recupere les vertexs
2207     TopoDS_Vertex  Va,Vb,Vc,Vd;
2208     TopExp::Vertices(EdgeB,Va,Vb );
2209     TopExp::Vertices(EdgeC,Vc,Vd );
2210     gp_Pnt A=BRep_Tool::Pnt(Va);
2211     gp_Pnt B=BRep_Tool::Pnt(Vc);
2212     gp_Pnt C = Get3DPointAtMousePosition();
2213     
2214     //    gp_Pnt C=BRep_Tool::Pnt(Vc);
2215     // Construction du Geom_Plane
2216     GC_MakePlane MkPlane(A,B,C);
2217     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2218     // Fermeture du contexte local.
2219     TheAISContext()->CloseLocalContext(myCurrentIndex);
2220     // Construction de l'AIS_SymmetricRelation
2221     Handle(AIS_SymmetricRelation) mySymRelation= new AIS_SymmetricRelation (EdgeA ,EdgeB ,EdgeC, theGeomPlane );
2222     TheAISContext()->Display(mySymRelation );
2223     GetMapOfAIS().Bind (mySymRelation ,argv[1]);
2224     
2225     
2226   }
2227   
2228   // Shape B est un vertex
2229   // =====================
2230   else {
2231     
2232     // desactivation du mode edge
2233     TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
2234     di<<" Select a second edge"<<"\n";
2235     // Boucle d'attente waitpick.
2236     Standard_Integer argccc = 5;
2237     const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2238     const char **argvvv = (const char **) bufff;
2239     while (ViewerMainLoop( argccc, argvvv) ) { }
2240     // fin de la boucle
2241     
2242     TopoDS_Shape ShapeC;
2243     for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
2244       ShapeC = TheAISContext()->SelectedShape();
2245     }
2246     
2247     // recuperation des Vertex
2248     TopoDS_Vertex  VertexB=TopoDS::Vertex(ShapeB);
2249     TopoDS_Vertex  VertexC=TopoDS::Vertex(ShapeC);
2250     // transfo en gp_Pnt
2251     gp_Pnt B=BRep_Tool::Pnt(VertexB);
2252     gp_Pnt C=BRep_Tool::Pnt(VertexC);
2253     
2254     // on recupere les vertexes de l'axe de sym
2255     TopoDS_Vertex  Va,Vb;
2256     TopExp::Vertices(EdgeA,Va,Vb );
2257     gp_Pnt A=BRep_Tool::Pnt(Va);
2258     // Construction du Geom_Plane
2259     GC_MakePlane MkPlane(A,B,C);
2260     Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
2261     // Fermeture du contexte local.
2262     TheAISContext()->CloseLocalContext(myCurrentIndex);
2263     // Construction de l'AIS_SymmetricRelation
2264     Handle(AIS_SymmetricRelation) mySymRelation= new AIS_SymmetricRelation (EdgeA ,VertexB ,VertexC, theGeomPlane );
2265     TheAISContext()->Display(mySymRelation );
2266     GetMapOfAIS().Bind (mySymRelation ,argv[1]);
2267     
2268     
2269     
2270   }
2271   
2272   
2273   return 0;
2274   
2275 }
2276 //=======================================================================
2277 //function : VMoveDim
2278 //purpose  : 
2279 //=======================================================================
2280 static int VMoveDim(Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
2281 {
2282   if(argc>2) return 1;
2283   
2284   const Handle(V3d_View) aview = ViewerTest::CurrentView();
2285   Handle(AIS_InteractiveObject) pickedobj;
2286   if(argc==1){
2287     pickedobj = TheAISContext()->FirstCurrentObject();
2288     if(pickedobj.IsNull() || pickedobj->Type()!=AIS_KOI_Relation)
2289       pickedobj = ViewerTest::PickObject(AIS_KOI_Relation);
2290   }
2291   else{
2292     // reperage dans le viewer...
2293     if(!strcasecmp(argv[1],".")){
2294       pickedobj = ViewerTest::PickObject(AIS_KOI_Relation);
2295       
2296     }
2297     else if(GetMapOfAIS().IsBound2(argv[1]))
2298       pickedobj = Handle(AIS_InteractiveObject)::DownCast
2299         (GetMapOfAIS().Find2(argv[1]));
2300   }
2301   
2302   if(pickedobj.IsNull()){
2303     di<<"Bad Type Object"<<"\n";
2304     return 1 ;}
2305   
2306   if(pickedobj->Type() != AIS_KOI_Relation)
2307     return 1;
2308   Standard_Integer argccc = 5;
2309   
2310   const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
2311   const char **argvvv = (const char **) bufff;
2312
2313   Handle(AIS_Relation) R = *((Handle(AIS_Relation)*)&pickedobj);
2314   Handle(Geom_Plane) ThePl;
2315 //  Standard_Real x,y,z,xv,yv,zv;
2316   Standard_Real x,y,xv,yv,zv;
2317   static Standard_Real last_xv(0),last_yv(0),last_zv(0);
2318   Standard_Integer xpix,ypix;
2319 //  Standard_Boolean SameAsLast(Standard_False);
2320   Select3D_Projector prj(aview);
2321   
2322   
2323   while (ViewerMainLoop( argccc, argvvv) ) {
2324     //....... la ligne de tir
2325     ViewerTest::GetMousePosition(xpix,ypix);
2326     aview->Convert(xpix,ypix,x,y); // espace reel 2D de la vue...
2327     gp_Lin L = prj.Shoot(x,y);
2328
2329     
2330     
2331     // ....... le plan de la vue...
2332     aview->Proj(xv,yv,zv);
2333     static Standard_Boolean haschanged(Standard_False);
2334     if(Abs(last_xv-xv)>Precision::Confusion() ||
2335        Abs(last_yv-yv)>Precision::Confusion() ||
2336        Abs(last_zv-zv)>Precision::Confusion() ){
2337       last_xv = xv;
2338       last_yv = yv;
2339       last_zv = zv;
2340       Standard_Real xat,yat,zat;
2341       aview->At(xat,yat,zat);
2342       ThePl = new Geom_Plane(gp_Pnt(xat,yat,zat),gp_Dir(xv,yv,zv));
2343       haschanged = Standard_True;
2344       di <<"changement de plan"<<"\n";
2345     }
2346     
2347     //  
2348 //    Standard_Integer xpix,ypix;
2349 //    Standard_Real x,y;
2350     gp_Pnt GoodPoint;
2351     if(haschanged){
2352       gp_Pln NewPlane;;
2353       ComputeNewPlaneForDim(R,NewPlane,GoodPoint);
2354       haschanged = Standard_False;
2355     }
2356     else{
2357       if(ComputeIntersection(L,ThePl->Pln(),GoodPoint)){
2358         R->SetPosition(GoodPoint);
2359       }
2360       TheAISContext()->Redisplay(R);
2361     }
2362   }
2363   
2364   return 0;
2365 }
2366
2367 //=======================================================================
2368 //function : RelationsCommands
2369 //purpose  : 
2370 //=======================================================================
2371       
2372
2373 void ViewerTest::RelationCommands(Draw_Interpretor& theCommands)
2374 {
2375   const char *group = "AISRelations";
2376
2377   theCommands.Add("vdim",
2378       "vdim -{angle|length|radius|diameter} -name={Dim_Name}"
2379       " shape1 [shape2 [shape3]] [-text={2d|3d} -plane={xoy|yoz|zox}]"
2380       " -Build a angle, length, radius and diameter dimensions;"
2381       " -Workis only with interactive objects",
2382       __FILE__,VDimBuilder,group);
2383
2384   theCommands.Add("vangledim",
2385                   "vangledim Name:Selection in the viewer only ",
2386                   __FILE__,VAngleDimBuilder,group);
2387   
2388   theCommands.Add("vdiameterdim",
2389                   "vdiameterdim Name : Selection in the viewer only ",
2390                   __FILE__,VDiameterDimBuilder,group);
2391   
2392   theCommands.Add("vconcentric",
2393                   "vconcentric Name : Selection in the viewer only ",
2394                   __FILE__,VConcentricBuilder,group);
2395
2396   theCommands.Add("vequaldist",
2397                   "vequaldist Name Selection in the viewer only ",
2398                   __FILE__,VEqualDistRelation ,group);
2399   
2400   theCommands.Add("vequalrad",
2401                   "vequalrad Name Selection in the viewer only ",
2402                   __FILE__,VEqualRadiusRelation  ,group);
2403   
2404   theCommands.Add("vfix",  
2405                   "vfix Name Selection in the viewer only ",
2406                   __FILE__,VFixRelation  ,group);
2407   
2408   theCommands.Add("videntity",
2409                   "videntity Name Selection in the viewer only ",
2410                   __FILE__,VIdenticRelation  ,group);
2411   
2412   theCommands.Add("vdistdim",
2413                   "vdistdim Name Selection in the viewer only ",
2414                   __FILE__,VLenghtDimension ,group);
2415   
2416   theCommands.Add("vradiusdim",
2417                   "vradiusdim Name Selection in the viewer only ",
2418                   __FILE__,VRadiusDimBuilder ,group);
2419   
2420   theCommands.Add("voffsetdim",
2421                   "voffsetdim Name Selection in the viewer only ",
2422                   __FILE__,VOffsetDimBuilder ,group);
2423   
2424   theCommands.Add("vparallel",
2425                   "vparallel Name Selection in the viewer only ",
2426                   __FILE__,VParallelBuilder ,group);
2427   
2428   theCommands.Add("vortho",
2429                   "vortho Name Selection in the viewer only ",
2430                   __FILE__,VPerpendicularBuilder ,group);
2431   
2432   theCommands.Add("vtangent",  
2433                   "vtangent Name Selection in the viewer only ",
2434                   __FILE__,VTangentBuilder ,group);
2435   
2436   
2437   theCommands.Add("vsymetric",
2438                   "vsymetric Name Selection in the viewer only ",
2439                   __FILE__,VSymmetricBuilder ,group);
2440
2441   theCommands.Add("vmovedim",
2442                   "vmovedim [name] : move Mouse in the viewer; click MB1 to stop motion...",
2443                   __FILE__,VMoveDim,group);
2444
2445 }