Integration of OCCT 6.5.0 from SVN
[occt.git] / src / TestTopOpeDraw / TestTopOpeDraw_OtherCommands.cxx
1 // File:        TestTopOpeDraw_OtherCommands.cxx
2 // Created:     Fri Feb  2 15:30:24 1996
3 // Author:      Jean Yves LEBEY
4 //              <jyl@meteox>
5
6 #ifdef HAVE_CONFIG_H
7 # include <config.h>
8 #endif
9 #include <TestTopOpeDraw.hxx>
10 #include <TestTopOpeDraw_Displayer.hxx>
11 #include <TestTopOpeDraw_TTOT.hxx>
12 #include <DBRep.hxx>
13 #include <BRepTools.hxx>
14 #include <BRep_Tool.hxx>
15 #include <Draw_Interpretor.hxx>
16 #include <Draw_Appli.hxx>
17 #include <TopOpeBRepTool_define.hxx>
18 #include <stdio.h>
19 #ifdef HAVE_STRINGS_H
20 # include <strings.h>
21 #endif
22
23 //-----------------------------------------------------------------------
24 // 0 = testtopopedraw_cdinp
25 // 1,2,3,4 = display point p of coords x y z
26 //-----------------------------------------------------------------------
27 Standard_Integer testtopopedraw_cdinp(Draw_Interpretor&,Standard_Integer na,const char** a)
28 {
29   if ( na < 5 ) return 0;
30   TestTopOpeDraw_P3DDisplayer PD(a[1],atof(a[2]),atof(a[3]),atof(a[4]));
31   return 0;
32 }
33
34 //-----------------------------------------------------------------------
35 // DRAWsuppressarg : remove a[d], modify na--
36 //-----------------------------------------------------------------------
37 Standard_EXPORT void DRAWsuppressarg(Standard_Integer& na,const char** a,const Standard_Integer d) 
38 {
39   for(Standard_Integer i=d;i<na;i++) {
40     a[i]=a[i+1];
41     a[i+1]=NULL;
42   }
43   na--;
44 }
45
46 //-----------------------------------------------------------------------
47 // DRAWsuppressargs : remove a[*] from <f> to <l>, modify na = na - (l - f)
48 //-----------------------------------------------------------------------
49 Standard_EXPORT void DRAWsuppressargs(Standard_Integer& na,const char** a,const Standard_Integer f,const Standard_Integer l) 
50 {
51   if(l == f) 
52     DRAWsuppressarg(na,a,l);
53   if(l <= f) return;
54   for(Standard_Integer i=0;i<na-l;i++) {
55     a[i+f]=a[i+l+1];
56     a[i+l+1]=NULL;
57   }
58   na -= l-f+1;
59 }
60
61 //-----------------------------------------------------------------------
62 Standard_EXPORT void OthersCommands_flags(Standard_Integer& na,const char** a,TestTopOpeDraw_Displayer& TD)
63 //-----------------------------------------------------------------------
64 {
65   Standard_Integer i,j,l,dloc = 0,iloc,decal = 0, NbArg = na;
66   Standard_Boolean dori = Standard_False; // display orientation
67   Standard_Boolean tgeo = Standard_False; // name with geometry
68   Standard_Boolean tori = Standard_False; // name with orientation
69   Standard_Real tpar = -1.0;
70   Standard_Integer inbr = 2; Standard_Boolean inbrdef = Standard_False;
71   Standard_Boolean col = Standard_False; // display specific color
72   Standard_Boolean tolflag = Standard_False;
73   Draw_Color Color;
74   for (i=1; i<NbArg; i++) {
75     iloc = i - decal;
76     if(!a[iloc]) break;
77     if (a[iloc][0] == '-') {
78       l = strlen(a[iloc]);
79       for (j=1; j<l; j++) {
80         if     (a[iloc][j] == 'g') tgeo=Standard_True;
81         else if(!strcmp(a[iloc],"-tol")) tolflag = Standard_True;
82         else if(a[iloc][j] == 'o') tori=Standard_True;
83         else if(a[iloc][j] == 'O') dori=Standard_True;
84         else if(a[iloc][j] == 'i') {
85           if (j<(l-1)) {
86             char sis[40]; sis[0] = '\0';
87             Standard_Integer kk = 0, k = j+1;
88             for (; k<l; k++,kk++,sis[kk] = '\0' ) sis[kk] = a[iloc][k];
89             inbr = atoi(sis);
90             inbrdef = Standard_True;
91           }
92         }
93         else if(a[iloc][j] == 'p') { 
94           if (iloc < na - 1) {
95             tpar = atof(a[iloc+1]);
96             dloc++; decal++;
97           }
98         }
99         else if(a[iloc][j] == 'c') {
100           col=Standard_True;
101           if(a[iloc+1] == "blanc") Color = Draw_blanc;
102           else if (a[iloc+1] == "rouge")   Color = Draw_rouge;
103           else if (a[iloc+1] == "vert")    Color = Draw_vert;
104           else if (a[iloc+1] == "bleu")    Color = Draw_bleu;
105           else if (a[iloc+1] == "cyan")    Color = Draw_cyan;
106           else if (a[iloc+1] == "or")      Color = Draw_or;
107           else if (a[iloc+1] == "magenta") Color = Draw_magenta;
108           else if (a[iloc+1] == "marron")  Color = Draw_marron;
109           else if (a[iloc+1] == "orange")  Color = Draw_orange;
110           else if (a[iloc+1] == "rose")    Color = Draw_rose;
111           else if (a[iloc+1] == "saumon")  Color = Draw_saumon;
112           else if (a[iloc+1] == "violet")  Color = Draw_violet;
113           else if (a[iloc+1] == "jaune")   Color = Draw_jaune;
114           else if (a[iloc+1] == "kaki")    Color = Draw_kaki;
115           else if (a[iloc+1] == "corail")  Color = Draw_corail;
116           decal++;dloc++;
117         }
118       }
119       DRAWsuppressargs(na,a,iloc,iloc+dloc);
120       decal++;
121       dloc = 0;
122     }
123   }
124   if (inbr < 0 ) inbr = 2;
125   TD.DisplayNameWithGeometry(tgeo);
126   TD.DisplayNameWithOrientation(tori);
127   TD.DisplayGeometry(dori);
128   TD.NbIsos(inbr); TD.NbIsosDef(inbrdef);
129   TD.SetPar(tpar);
130   TD.TolIs(tolflag);
131   if(col) TD.SetColor(Color);
132 }
133
134 //-----------------------------------------------------------------------
135 // OthersCommands_help
136 //-----------------------------------------------------------------------
137
138 Standard_EXPORT void OthersCommands_help(const char* CommandName, const char* syntaxe = "")
139 {
140   if(strlen(syntaxe))
141     cout<<CommandName<<syntaxe<<endl;
142   cout<<"      -p <parameter> to display the name of an edge round a point of <parameter>"<<endl;
143   cout<<"               in [0,1] on edge curve range. Default value is 0.3"<<endl;
144 //  cout<<"      -p <par> : on edge , diplay name at t in [0..1]"<<endl;
145   cout<<"      -o : display name = DBRep name + orientation"<<endl;
146   cout<<"      -g : display name = DBRep name + geometry"<<endl;
147   cout<<"      -O : visualize shape orientation"<<endl;
148   cout<<"      -i<n> : visualize face with <n> isos"<<endl;
149   cout<<"      -c <col> : display name with color col (Draw_blanc, Draw_rouge, ...)"<<endl;
150   cout<<"      -tol to display vertices with a circle of radius equal to its tolerance."<<endl;
151   cout<<"example : '"<<CommandName<<" -p 0.8 e 8 9 23'"<<endl;
152   cout<<""<<endl;
153 }
154 //-----------------------------------------------------------------------
155 // 0 = testtopopedraw_cdins
156 // 1,2,3,... = display shapes and visualise their names
157 //-----------------------------------------------------------------------
158
159 Standard_Integer testtopopedraw_cdins(Draw_Interpretor&,Standard_Integer na,const char** a)
160 {
161   if (na == 1) {
162     const char* syntaxe = " [arg] S : display shape S with its DBRep name";
163     OthersCommands_help(a[0], syntaxe);
164     return 0;
165   }
166   
167   TestTopOpeDraw_Displayer TD;
168   OthersCommands_flags(na, a, TD);
169
170   Standard_Integer i ;
171   for ( i=1;i<na;i++) {
172     const TopoDS_Shape& S = DBRep::Get(a[i]);
173     if (S.IsNull()) continue;
174     const TopAbs_ShapeEnum t = S.ShapeType();
175     if (t == TopAbs_FACE) continue;
176     if (t == TopAbs_EDGE) continue;
177     if (t == TopAbs_VERTEX) continue;
178     TD.DisplayShape(a[i],S);
179   }
180   
181   for (i=1;i<na;i++) {
182     const TopoDS_Shape& S = DBRep::Get(a[i]); if (S.IsNull()) continue;
183     const TopAbs_ShapeEnum t = S.ShapeType();    
184     if (t == TopAbs_FACE) TD.DisplayShape(a[i],S);
185   }
186   
187   for (i=1;i<na;i++) {
188     const TopoDS_Shape& S = DBRep::Get(a[i]); if (S.IsNull()) continue;
189     const TopAbs_ShapeEnum t = S.ShapeType();
190     if (t == TopAbs_EDGE) TD.DisplayShape(a[i],S);
191   }
192   
193   for (i=1;i<na;i++) {
194     const TopoDS_Shape& S = DBRep::Get(a[i]); if (S.IsNull()) continue;
195     const TopAbs_ShapeEnum t = S.ShapeType();
196     if (t != TopAbs_VERTEX) continue;
197     if(TD.TolIs()) {
198       const TopoDS_Vertex& V = TopoDS::Vertex(S);
199       Standard_Real Tol = BRep_Tool::Tolerance(V);
200       TD.SetTol(Tol);
201     }
202     TD.DisplayShape(a[i],S);
203   }
204
205   return 0;
206 }
207
208 static void BoopReadInitFile(Draw_Interpretor& di, const char* filename)
209 {
210   if (filename == NULL) return;
211   di.EvalFile(filename);
212 }
213
214 static Standard_Integer ttab(Draw_Interpretor& di, Standard_Integer narg, const char** a) {
215   char s[2000]; strcpy(s,"");
216   sprintf(s,"%s%s",s,"proc addt {at args} {upvar $at x;set L \"\";addl L [join $args];");
217   sprintf(s,"%s%s",s,"foreach l $L {set x([array size x]) $l}};");
218   di.Eval(s);
219   return 0;
220 }
221
222 Standard_IMPORT Draw_Color DrawTrSurf_CurveColor(const Draw_Color col);
223 Standard_IMPORT void DBRep_WriteColorOrientation ();
224 Standard_IMPORT Draw_Color DBRep_ColorOrientation (const TopAbs_Orientation Or);
225
226 #include <Geom2d_TrimmedCurve.hxx>
227 #include <DrawTrSurf.hxx>
228 #include <TopExp.hxx>
229
230 #include <TopTools_DataMapIteratorOfDataMapOfOrientedShapeInteger.hxx>
231 #include <TopTools_DataMapOfOrientedShapeInteger.hxx>
232 #include <TopTools_DataMapIteratorOfDataMapOfIntegerShape.hxx>
233 #include <TopTools_DataMapOfIntegerShape.hxx>
234
235 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
236 #include <TopExp_Explorer.hxx>
237 #include <TopoDS_Face.hxx>
238 #include <TopoDS_Edge.hxx>
239 #include <TopoDS_Vertex.hxx>
240 #include <TColStd_ListIteratorOfListOfAsciiString.hxx>
241 #include <TColStd_ListOfAsciiString.hxx>
242 #include <TestTopOpeDraw_ListOfPnt2d.hxx>
243
244 class cvx2d {
245   
246 public: 
247   cvx2d(Draw_Interpretor& di) { 
248     clearall();
249     mypdi = &di;
250   }
251   
252   const TopoDS_Face& face() const { return myface; }
253   const TCollection_AsciiString& facename() const { return myfacename; }
254
255   void erasevisible() {
256     TColStd_ListIteratorOfListOfAsciiString i(myvis);
257     Standard_Boolean ya = i.More();
258     TCollection_AsciiString str = "erase";
259     for (; i.More(); i.Next()) {
260       const TCollection_AsciiString& s = i.Value();
261       str = str + " " + s;
262     }
263     if (ya) {
264       TCollection_AsciiString str1 = "erase -mute;"; mypdi->Eval(str1.ToCString());
265       str = str + ";"; mypdi->Eval(str.ToCString());
266     }
267     clearvisible();
268   }
269   
270   void addvisible(const TCollection_AsciiString& N) { myvis.Append(N); }
271   void clearvisible() { myvis.Clear(); }
272   
273   const TopoDS_Edge& edge(const Standard_Integer ie) const {
274     if ( ie >= 1 && ie <= mymapis.Extent()) {
275       const TopoDS_Edge& E = TopoDS::Edge(mymapis.Find(ie));
276       return E;
277     }
278     return myemptyedge;
279   }
280
281   Standard_Integer nedge() const { return mymapis.Extent(); }
282
283   void clearall() {
284     clearvisible();
285     mymapve.Clear();
286     mymapsi.Clear(); mymapis.Clear(); mynemap = 0; myiemap = 1; myedgedisplayed = 0;
287     myface.Nullify();
288     myfacename = "";
289   }
290   
291   void addedge(const TopoDS_Shape& E) {
292     mynemap++;
293     mymapsi.Bind(E,mynemap);
294     mymapis.Bind(mynemap,E);
295   }
296   
297   void initface(const TopoDS_Face& F,const TCollection_AsciiString& N) {
298     clearall();
299     myface = F; myfacename = N;
300     TopExp::MapShapesAndAncestors(myface,TopAbs_VERTEX,TopAbs_EDGE,mymapve);
301     TopExp_Explorer e;
302     for (e.Init(F,TopAbs_EDGE);e.More();e.Next()) addedge(e.Current());
303 //    for (TopExp_Explorer e(F,TopAbs_EDGE);e.More();e.Next()) addedge(e.Current());
304     initedgeiter();
305     setedgedisplayed(0);
306   }
307   
308   void displayface() const {
309     char s[1000];
310     mypdi->Eval("info proc vx2d_displayface");
311     if (mypdi->Result()) {
312       sprintf(s,"vx2d_displayface %s",myfacename.ToCString());
313       mypdi->Eval(s);
314     }
315     else cout<<"procedure vx2d_displayface non trouvee"<<endl;
316   }
317   
318   Standard_Integer eindex(const TopoDS_Shape& E) const {
319     const Standard_Integer ie = mymapsi.Find(E);
320     return ie;
321   }
322
323   void ename(const TopoDS_Shape& S,TCollection_AsciiString& ste) const {
324     ste = "";
325     if (S.ShapeType() != TopAbs_EDGE) return;
326     const TopoDS_Edge& E = TopoDS::Edge(S);
327     const Standard_Integer ie = eindex(E);
328     TopAbs_Orientation oe = E.Orientation();
329     TCollection_AsciiString stoe;TestTopOpeDraw_TTOT::OrientationToString(oe,stoe);
330     stoe = stoe.SubString(1,1);stoe.LowerCase();
331     Standard_Boolean deg = BRep_Tool::Degenerated(E);
332     if (deg) ste="D";
333     ste=ste+"e"+ie+stoe;
334   }
335
336   void vname(const TopoDS_Shape& V, const TopoDS_Shape& E,TCollection_AsciiString& stv) const {
337     stv = "";
338     if (V.ShapeType() != TopAbs_VERTEX) return;
339     TopAbs_Orientation ov = V.Orientation();
340     TCollection_AsciiString sto;TestTopOpeDraw_TTOT::OrientationToString(ov,sto);
341     TCollection_AsciiString sto11 = sto.SubString(1,1); sto11.LowerCase();
342     const TopTools_ListOfShape& l = mymapve.FindFromKey(V);
343     Standard_Integer ne=l.Extent(); TCollection_AsciiString ste; ename(E,ste);
344     stv.Copy("v"); stv=stv+sto11+ste+"."+ne;
345   }
346
347   void fenames(TCollection_AsciiString& stef) const {
348     stef="";
349     Standard_Integer i=1,n=nedge();
350     for (;i<=n;i++) {
351       TCollection_AsciiString ste;ename(edge(i),ste);
352       stef=stef+ste+" ";
353     }
354   }
355
356   Draw_Color color(const TopoDS_Shape& S) const {
357     Draw_Color col = Draw_blanc;
358     TopAbs_Orientation o = S.Orientation();
359     TopAbs_ShapeEnum t = S.ShapeType();
360     if ( t == TopAbs_VERTEX ) { 
361       if      ( o == TopAbs_FORWARD )  col = Draw_magenta;
362       else if ( o == TopAbs_REVERSED ) col = Draw_cyan;
363       else col = DBRep_ColorOrientation(o);
364     }
365     else if ( t == TopAbs_EDGE ) {
366       if      (o == TopAbs_FORWARD)  col = Draw_magenta;
367       else if (o == TopAbs_REVERSED) col = Draw_cyan;
368       else col = DBRep_ColorOrientation(o);
369     }
370     return col;
371   }
372
373   const TopTools_ListOfShape& incidentedges(const TopoDS_Shape& V) const {
374     if ( ! mymapve.Contains(V) ) return myemptylos;
375     return mymapve.FindFromKey(V);
376   }
377   
378   void lenames(const TopTools_ListOfShape& l,TCollection_AsciiString& stel) const {
379     stel = "";Standard_Integer j = 0;
380     for (TopTools_ListIteratorOfListOfShape it(l);it.More();it.Next(),j++) {
381       if (j) stel = stel + " ";
382       TCollection_AsciiString ste; ename(it.Value(),ste);
383       stel = stel + ste;
384     }
385   }
386   
387   void subshapename(const TCollection_AsciiString& sts,const TopAbs_ShapeEnum tss,const Standard_Integer i,TCollection_AsciiString& stss) const {
388     TCollection_AsciiString s; TestTopOpeDraw_TTOT::ShapeEnumToString(tss,s);
389     stss=sts+"_"+s+i;
390   }
391
392   Handle(Geom2d_Curve) curve2d(const TopoDS_Edge& E) const {
393     Standard_Real f,l; const Handle(Geom2d_Curve) c = BRep_Tool::CurveOnSurface(E,myface,f,l);
394     if (c.IsNull()) return c;
395     Handle(Geom2d_Curve) nc = new Geom2d_TrimmedCurve(c,f,l);
396     return nc;
397   }
398
399   void printedges() const {
400     Standard_Integer n=nedge();if (!n) return;
401 //JR/Hp
402     TCollection_AsciiString se=(Standard_CString ) ((n==1)?" edge :":" edges :");
403 //    TCollection_AsciiString se=(n==1)?" edge :":" edges :";
404     TCollection_AsciiString s;s=s+"# face "+myfacename+" : "+n+se;
405     TCollection_AsciiString sb(s.Length()-1,' ');
406     cout<<endl<<s;
407     for (Standard_Integer i=1;i<=n;i++) {
408       TCollection_AsciiString stei;ename(edge(i),stei);cout<<" "<<stei;
409       if ((i>1) && (i%4 == 0) && (i<n)) cout<<endl<<"#"<<sb;
410     }
411     cout<<endl;
412     cout.flush();
413   }
414   
415   Standard_Integer displayface(const TopoDS_Shape& S, const TCollection_AsciiString& sta);
416   Standard_Integer displayedge(const TopoDS_Shape& S);
417
418   void initedgeiter() { myiemap = 1; }
419   Standard_Boolean moreedgeiter() const { return myiemap <= mynemap; }
420   void nextedgeiter(const Standard_Integer incr = +1);
421   Standard_Integer curredgeiter() const { return myiemap; }
422   void setcurredgeiter(const Standard_Integer i) { if (i>=1 &&i<=mynemap) myiemap = i; }
423   Standard_Integer edgedisplayed() const { return myedgedisplayed; }
424   void setedgedisplayed(const Standard_Integer i) { if (i>=1 &&i<=mynemap) myedgedisplayed = i; }
425
426   TopoDS_Face myface; TCollection_AsciiString myfacename;
427   TColStd_ListOfAsciiString myvis;
428   TopTools_IndexedDataMapOfShapeListOfShape mymapve;
429   
430   TopTools_DataMapOfOrientedShapeInteger mymapsi;
431   TopTools_DataMapOfIntegerShape         mymapis;
432   Standard_Integer mynemap;
433   Standard_Integer myiemap;
434   Standard_Integer myedgedisplayed;
435   
436   Draw_Interpretor* mypdi;
437   TopoDS_Edge myemptyedge;
438   TopTools_ListOfShape myemptylos;
439 }; // cvx2d
440
441 void cvx2d::nextedgeiter(const Standard_Integer incr) 
442 {
443   if (!moreedgeiter()) return;
444   myiemap += incr;
445   if      (myiemap>mynemap) myiemap = 1;
446   else if (myiemap<1) myiemap = mynemap;
447 }
448
449 Standard_Integer cvx2d::displayface(const TopoDS_Shape& S, const TCollection_AsciiString& sta) {
450   TopoDS_Shape aLocalShape = S.Oriented(TopAbs_FORWARD) ;
451   TopoDS_Face F = TopoDS::Face(aLocalShape); 
452 //  TopoDS_Face F = TopoDS::Face(S.Oriented(TopAbs_FORWARD)); 
453   Standard_Boolean init = Standard_True;
454   if (init) initface(F,sta);
455   displayface();
456   printedges();
457   return 0;
458 } // displayface
459   
460 Standard_Integer cvx2d::displayedge(const TopoDS_Shape& S) {
461   if (S.IsNull()) return 0;
462   const TopoDS_Edge& E = TopoDS::Edge(S);
463   const TopoDS_Face& F = face();
464   if (F.IsNull()) return 0;
465   
466   Draw_Color savecol = DrawTrSurf_CurveColor(Draw_Color(Draw_rouge));
467   
468   Standard_Real u,v,V,U;BRepTools::UVBounds(F,E,u,U,v,V);
469   Standard_Boolean deg = BRep_Tool::Degenerated(E);
470   gp_Pnt2d pe1(u,v);gp_Pnt2d pe2(U,V);
471   gp_Pnt2d p1,p2;BRep_Tool::UVPoints(E,F,p1,p2);
472   TopoDS_Vertex v1,v2; TopExp::Vertices(E,v1,v2);
473   gp_Pnt P1 = BRep_Tool::Pnt(v1);
474   gp_Pnt P2 = BRep_Tool::Pnt(v2);
475   Standard_Real v1v2 = P1.Distance(P2);
476   Standard_Real tole = BRep_Tool::Tolerance(E);
477   Standard_Real tol1 = BRep_Tool::Tolerance(v1);
478   Standard_Real tol2 = BRep_Tool::Tolerance(v2);
479   const TopTools_ListOfShape& l1 = incidentedges(v1);
480   const TopTools_ListOfShape& l2 = incidentedges(v2);
481   Handle(Geom2d_Curve) c2d = curve2d(E);
482  
483 //  char sdi[1000];
484   char stol[1000];
485   TCollection_AsciiString ste,stc,sv1,sv1a,sv2,sv2a,ste1,ste2;
486
487   ename(E,ste);
488   stc = "c"; stc = stc + ste;
489   vname(v1,E,sv1); sv1a = "V"; sv1a = sv1a + sv1;
490   vname(v2,E,sv2); sv2a = "V"; sv2a = sv2a + sv2;
491   lenames(l1,ste1);
492   lenames(l2,ste2);
493
494   cout<<endl;
495   sprintf(stol,"%g",tole);
496   cout<<"# "<<ste<<" : tole "<<stol<<" : uv "<<pe1.X()<<" "<<pe1.Y()<<" UV "<<pe2.X()<<" "<<pe2.Y();
497   cout<<endl;
498   sprintf(stol,"%g",tol1);
499   cout<<"# "<<sv1<<" : tol1 "<<stol<<" : uv "<<p1.X()<<" "<<p1.Y()<<" : edges "<<ste1;
500   cout<<endl;
501   sprintf(stol,"%g",tol2);
502   cout<<"# "<<sv2<<" : tol2 "<<stol<<" : uv "<<p2.X()<<" "<<p2.Y()<<" : edges "<<ste2;
503   cout<<endl;
504   sprintf(stol,"%g",v1v2); cout<<"# v1v2 = "<<stol;
505   cout<<endl;
506   cout.flush();
507
508   erasevisible();
509   TestTopOpeDraw_C2DDisplayer TDC2D;
510   TestTopOpeDraw_P2DDisplayer TDP2D;
511   TestTopOpeDraw_Displayer TD;
512
513   TDC2D.AllColors(color(E)); TDC2D.DisplayC2D(stc,ste,c2d);
514   TDP2D.AllColors(color(v1));TDP2D.DisplayP2D(sv1,p1);
515   TDP2D.AllColors(color(v2));TDP2D.DisplayP2D(sv2,p2);
516   TD.AllColors(color(E));TD.DisplayShape(ste,ste,E);
517   if (!deg) {
518     TD.AllColors(color(v1));TD.DisplayShape(sv1a,sv1,v1);
519     TD.AllColors(color(v2));TD.DisplayShape(sv2a,sv2,v2);
520   }
521   else {
522     TD.AllColors(Draw_Color(Draw_blanc));TD.DisplayShape(sv1a,"",v1);
523   }
524   addvisible(stc);
525   addvisible(sv1);
526   addvisible(sv2);
527   addvisible(ste);
528   addvisible(sv1a);
529   addvisible(sv2a);
530   Standard_Integer ie = eindex(E);
531   setcurredgeiter(ie);
532   setedgedisplayed(ie);
533   
534   DrawTrSurf_CurveColor(savecol);
535   return 0;
536 } // displayedge
537
538 //=======================================================================
539 // vx2d
540 //=======================================================================
541 Standard_Integer vx2d(Draw_Interpretor& di, Standard_Integer na, const char** a)
542 {
543   static cvx2d *pv2d = NULL;
544 #define ISINTEGER(MMstr) ((strspn((MMstr),"0123456789") == strlen((MMstr))))
545   
546   BoopReadInitFile(di,"vx2d.tcl");
547   if (na < 2) return 0;
548   if (pv2d == NULL) pv2d = (cvx2d*) new cvx2d(di);
549   
550   Standard_Integer dostep = 0;Standard_Integer doiedge= 0;
551   for(Standard_Integer ia=1;ia<na;ia++) {
552     if     (!strcasecmp(a[1],"-n")) { dostep=+1; DRAWsuppressarg(na,a,ia); }
553     else if(!strcasecmp(a[1],"-p")) { dostep=-1; DRAWsuppressarg(na,a,ia); }
554     else if (ISINTEGER(a[1])) { doiedge=atoi(a[1]); DRAWsuppressarg(na,a,ia); }
555   }
556   
557   if (dostep) {
558     if (pv2d->edgedisplayed()) pv2d->nextedgeiter(dostep);
559     if (pv2d->moreedgeiter()) pv2d->displayedge(pv2d->edge(pv2d->curredgeiter()));
560     return 0;
561   }
562   else if (doiedge) {
563     pv2d->setcurredgeiter(doiedge);
564     if (pv2d->moreedgeiter()) pv2d->displayedge(pv2d->edge(pv2d->curredgeiter()));
565     return 0;
566   }
567   
568   TopoDS_Shape S = DBRep::Get(a[1]); if (S.IsNull()) return 0;
569   TCollection_AsciiString sta1(a[1]); TopAbs_ShapeEnum t = S.ShapeType();
570   TopAbs_ShapeEnum tt = ( t == TopAbs_FACE) ? TopAbs_EDGE : TopAbs_FACE;
571
572   Standard_Integer iearg = (na >= 3) ? atoi(a[2]) : 0;
573   TCollection_AsciiString stss; Standard_Integer i = 1;
574   TopExp_Explorer ex;
575   for (ex.Init(S,tt);ex.More();ex.Next(),i++) {
576 //  for (TopExp_Explorer ex(S,tt);ex.More();ex.Next(),i++) {
577     Standard_Boolean cond = Standard_False;
578     cond = cond || (!iearg);
579     cond = cond || (iearg && (iearg == i));
580     if (cond) {
581       pv2d->subshapename(sta1,tt,i,stss);
582       DBRep::Set(stss.ToCString(),ex.Current());
583       di<<"vx2d "<<stss.ToCString()<<"\n";
584       //cout.flush();
585     }
586   }
587
588   Standard_Integer r = 0;
589   if      (t == TopAbs_FACE) r = pv2d->displayface(S,sta1);
590   else if (t == TopAbs_EDGE) r = pv2d->displayedge(S);
591   return r;
592 } // vx2d
593
594 //=======================================================================
595 //function : OtherCommands
596 //purpose  : 
597 //=======================================================================
598
599 void TestTopOpeDraw::OtherCommands(Draw_Interpretor& theCommands)
600 {
601   const char* g = "Topological Operation other commands";
602   theCommands.Add("cdinp","cdinp p x y z",__FILE__,testtopopedraw_cdinp,g);
603   theCommands.Add("cdins","cdins s1 ... ",__FILE__,testtopopedraw_cdins,g);
604   theCommands.Add("vx2d","vx2d f",__FILE__,vx2d,g);
605   BoopReadInitFile(theCommands,getenv("BOOPGLOB"));
606   theCommands.Add("ttab","",__FILE__,ttab,g);
607 }