0027961: Visualization - remove unused and no more working OpenGl_AVIWriter
[occt.git] / src / TestTopOpe / TestTopOpe_BOOPCommands.cxx
1 // Created on: 1996-10-21
2 // Created by: Jean Yves LEBEY
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <BRep_Tool.hxx>
19 #include <DBRep.hxx>
20 #include <Draw.hxx>
21 #include <TColStd_HArray1OfBoolean.hxx>
22 #include <TestTopOpe.hxx>
23 #include <TestTopOpe_BOOP.hxx>
24 #include <TopExp_Explorer.hxx>
25 #include <TopoDS.hxx>
26 #include <TopoDS_Shape.hxx>
27 #include <TopOpeBRepBuild_HBuilder.hxx>
28 #include <TopOpeBRepDS_HDataStructure.hxx>
29
30 extern void suppressarg(Standard_Integer& na,const char** a,const Standard_Integer d);
31 #ifdef OCCT_DEBUG
32 extern void TopOpeBRepTool_SettraceEND(const Standard_Boolean);
33 extern Standard_Boolean TopOpeBRepTool_GettraceEND();
34 #endif
35
36 static const char* kboo[TESTTOPOPE_NKEYS] = {"topo","secc","sece","sec","com","c12","c21","fus"};
37 static TestTopOpe_BOOP LOCALBOOP(kboo, "r");
38 TestTopOpe_BOOP* PBOOP=&LOCALBOOP;
39
40 void CATIND
41 (TCollection_AsciiString& s,const Standard_Integer I,const TCollection_AsciiString& a,const TCollection_AsciiString& b) {s=s+a+TCollection_AsciiString(I)+b;}
42 void CATSHA
43 (TCollection_AsciiString& s,const TopoDS_Shape& S,const TopOpeBRepDS_DataStructure& BDS,const TCollection_AsciiString& a,const TCollection_AsciiString& b)
44 {if (S.IsNull()) return;::CATIND(s,BDS.Shape(S),a,b);}
45 void CATLOSHA
46 (TCollection_AsciiString& s,const TopTools_ListOfShape& L,const TopOpeBRepDS_DataStructure& BDS,const TCollection_AsciiString& a,const TCollection_AsciiString& aa,const TCollection_AsciiString& bb,const TCollection_AsciiString& b)
47
48   if (!L.Extent()) return;
49   s=s+a;for(TopTools_ListIteratorOfListOfShape i(L);i.More();i.Next())::CATSHA(s,i.Value(),BDS,aa,bb);s=s+b;
50 }
51
52 Standard_Integer TOPOCHKCOMMANDS(TestTopOpe_BOOP& P,Standard_Integer na,const char**a);
53 Standard_Integer TOPOSETCOMMANDS(TestTopOpe_BOOP& P,Standard_Integer na,const char**a, Draw_Interpretor& di);
54 Standard_Integer TOPOCOMMANDS(TestTopOpe_BOOP& PT,Standard_Integer na,const char**a, Draw_Interpretor& di);
55
56 // ----------------------------------------------------------------------
57 Standard_Integer TOPOC(Draw_Interpretor& interpretor,Standard_Integer na,const char** a)
58 {
59   if (PBOOP == NULL) return 0;
60   Standard_Integer err=0, i;
61
62   if      (!strncmp(a[0],kboo[BOOP_TOPX],4)) {
63     err = TOPOCOMMANDS((*PBOOP),na,a,interpretor);
64     return err;
65   }  
66   else if (PBOOP->IsBooope(a[0])) {
67     PBOOP->Booope(a[0],(na >= 2) ? a[1] : NULL);
68     return 0;
69   }
70   else if (!strcmp(a[0],"toposet")) {
71     err = TOPOSETCOMMANDS((*PBOOP),na,a,interpretor);
72     return err;
73   }
74   else if (!strcmp(a[0],"tsp") ) {
75     TopAbs_State sta = TopAbs_UNKNOWN;
76     if (na >= 2) {
77       if      (!strcmp(a[1],"IN"))  sta = TopAbs_IN;
78       else if (!strcmp(a[1],"OUT")) sta = TopAbs_OUT;
79       else if (!strcmp(a[1],"ON"))  sta = TopAbs_ON;
80       
81       if (sta != TopAbs_UNKNOWN) {
82         if (na==2) { PBOOP->GetSplit(sta); } // tsp IN/ON/OUT
83         else if ( na > 2 ) {
84           TopAbs_ShapeEnum typ = TopAbs_SHAPE;
85           if      (!strcmp(a[2],"e")) typ = TopAbs_EDGE;
86           else if (!strcmp(a[2],"f")) typ = TopAbs_FACE;
87           else if (!strcmp(a[2],"s")) typ = TopAbs_SOLID;
88           if (typ != TopAbs_SHAPE) {
89             if (na == 3) { 
90               // tsp IN/ON/OUT e/f/s
91               PBOOP->GetSplit(typ,sta);
92             }
93             else if (na > 3) { 
94               // tsp IN/ON/OUT e/f/s i1 i2 ...
95               for(i=3;i<na;i++) PBOOP->GetSplit(typ,sta,Draw::Atoi(a[i])); 
96             }
97           }
98           else {
99             // tsp IN/ON/OUT i1 i2 ...
100             for(i=2;i<na;i++) PBOOP->GetSplit(sta,Draw::Atoi(a[i])); 
101           }
102         }
103       }
104       else { // tsp i1 i2 ...
105         for (i = 1; i < na; i++) {
106           if ( ISINTEGER(a[i]) ) PBOOP->GetSplit(Draw::Atoi(a[i]));
107         }
108       }
109     }
110     else { 
111       PBOOP->GetSplit(TopAbs_IN);
112       PBOOP->GetSplit(TopAbs_ON);
113       PBOOP->GetSplit(TopAbs_OUT); 
114     } // tsp
115   } // arg0 = tsp
116   
117   else if (!strcmp(a[0],"tme") ) {
118     TopAbs_State sta = TopAbs_UNKNOWN;
119     if (na >= 2) {
120       if      (!strcmp(a[1],"IN"))  sta = TopAbs_IN;
121       else if (!strcmp(a[1],"OUT")) sta = TopAbs_OUT;
122       else if (!strcmp(a[1],"ON"))  sta = TopAbs_ON;
123       
124       if (sta != TopAbs_UNKNOWN) {
125         if (na==2) { PBOOP->GetMerged(sta); } // tme IN/ON/OUT
126         else if ( na > 2 ) {
127           TopAbs_ShapeEnum typ = TopAbs_SHAPE;
128           if      (!strcmp(a[2],"e")) typ = TopAbs_EDGE;
129           else if (!strcmp(a[2],"f")) typ = TopAbs_FACE;
130           else if (!strcmp(a[2],"s")) typ = TopAbs_SOLID;
131           if (typ != TopAbs_SHAPE) {
132             if (na == 3) { 
133               // tme IN/ON/OUT e/f/s
134               PBOOP->GetMerged(typ,sta);
135             }
136             else if (na > 3) { 
137               // tme IN/ON/OUT e/f/s i1 i2 ...
138               for(i=3;i<na;i++) PBOOP->GetMerged(typ,sta,Draw::Atoi(a[i])); 
139             }
140           }
141           else {
142             // tme IN/ON/OUT i1 i2 ...
143             for(i=2;i<na;i++) PBOOP->GetMerged(sta,Draw::Atoi(a[i])); 
144           }
145         }
146       }
147       else { // tme i1 i2 ...
148         for (i = 1; i < na; i++) {
149           if ( ISINTEGER(a[i]) ) PBOOP->GetMerged(Draw::Atoi(a[i]));
150         }
151       }
152     }
153     else { 
154       PBOOP->GetMerged(TopAbs_IN);
155       PBOOP->GetMerged(TopAbs_ON);
156       PBOOP->GetMerged(TopAbs_OUT); 
157     } // tme
158   } // arg0 = tme
159   
160   else if (!strcmp(a[0],"csecanc") ) {
161     Standard_Integer ia;
162
163     Standard_Boolean outdraw = Standard_False,outclear = Standard_False,outAB = Standard_False;
164     for (ia=1; ia<na; ia++ ) {
165       if      (!strcmp(a[ia],"-d")) outdraw = Standard_True;
166       else if (!strcmp(a[ia],"-c")) outclear = Standard_True;
167       else if (!strcmp(a[ia],"-AB")) outAB = Standard_True;
168     }
169     
170     Handle(TopOpeBRepBuild_HBuilder) HB = PBOOP->HBuilder();
171     Handle(TopOpeBRepDS_HDataStructure) HDS = HB->DataStructure();
172     const TopOpeBRepDS_DataStructure& BDS = HDS->DS();
173     const TopTools_ListOfShape& loe = HB->Section();
174
175     Standard_Boolean onedef = Standard_False;
176     Standard_Integer n = loe.Extent();
177     Handle(TColStd_HArray1OfBoolean) tabloe = new TColStd_HArray1OfBoolean(1,n,Standard_False);
178     for (ia=1; ia<na; ia++ ) {
179       if (!strcmp(a[ia],"-d")) continue;
180       if (!strcmp(a[ia],"-c")) continue;
181       if (!strcmp(a[ia],"-AB")) continue;
182       Standard_Integer ie = Draw::Atoi(a[ia]);
183       if (ie>=1 && ie<=n) { onedef = Standard_True; tabloe->SetValue(ie,Standard_True); }
184     }
185     if (!onedef) tabloe->Init(Standard_True);
186     
187     TopTools_ListIteratorOfListOfShape itloe(loe);
188     for (Standard_Integer ie=1;itloe.More();itloe.Next(),ie++) {
189       if (!tabloe->Value(ie)) continue;
190       const TopoDS_Shape& es = itloe.Value();
191       TopoDS_Shape F1,F2; Standard_Integer IC; TopTools_ListOfShape LF1,LF2,LE1,LE2;
192       Standard_Boolean eca = HB->EdgeCurveAncestors(es,F1,F2,IC);
193       Standard_Boolean esa = HB->EdgeSectionAncestors(es,LF1,LF2,LE1,LE2);
194       TCollection_AsciiString namie("se"); namie = namie + TCollection_AsciiString(ie); 
195       DBRep::Set(namie.ToCString(),es);
196       if (eca) {
197         TCollection_AsciiString s;
198
199         if (outdraw) {
200           if (outclear) s = s + "clear; ";
201           ::CATSHA(s,F1,BDS,"tsee f ","; ");
202           ::CATSHA(s,F2,BDS,"tsee f ","; ");
203           ::CATIND(s,IC,"tsee c ","; ");
204           s = s + "cdins " + namie;
205           interpretor<<s.ToCString()<<"\n";
206           if (outAB) {
207             s = "     ";
208             ::CATSHA(s,F1,BDS,"mksol A f_","; ");
209             ::CATSHA(s,F2,BDS,"mksol B f_","; ");
210             s = s + "topopeload A B; ";
211             s = s + "# " + namie;
212             interpretor<<s.ToCString()<<"\n";
213           }
214         }
215         else {
216           s = s + "section edge " + TCollection_AsciiString(ie) + " ";
217           ::CATSHA(s,F1,BDS,"  f1 : ","");
218           ::CATSHA(s,F2,BDS,"  f2 : ","");
219           ::CATIND(s,IC,"  c : ","");
220           interpretor<<s.ToCString()<<"\n";
221         }
222       }
223
224       if (esa) { 
225         TCollection_AsciiString s;
226 #ifdef OCCT_DEBUG
227         TopTools_ListIteratorOfListOfShape ils;
228 #endif
229         if (outdraw) { 
230           if (outclear) s = s + "clear; ";
231           ::CATLOSHA(s,LF1,BDS,"tsee f ",""," ","; ");
232           ::CATLOSHA(s,LF2,BDS,"tsee f ",""," ","; ");
233           ::CATLOSHA(s,LE1,BDS,"tsee e ",""," ","; ");
234           ::CATLOSHA(s,LE2,BDS,"tsee e ",""," ","; ");
235           s = s + "cdins " + "-p 0.5 " + namie;
236           interpretor<<s.ToCString()<<"\n";
237           if (outAB) {
238             s = "     ";
239             ::CATLOSHA(s,LF1,BDS,"mksol A ","f_"," ","; ");
240             ::CATLOSHA(s,LF2,BDS,"mksol B ","f_"," ","; ");
241             s = s + "topopeload A B;";
242             s = s + " # " + namie;
243             interpretor<<s.ToCString()<<"\n";
244           }
245         }
246         else {
247           s = s + "section edge " + TCollection_AsciiString(ie) + " ";
248           ::CATLOSHA(s,LF1,BDS,"  f1 : ",""," ","");
249           ::CATLOSHA(s,LF2,BDS,"  f2 : ",""," ","");
250           ::CATLOSHA(s,LE1,BDS,"  e1 : ",""," ","");
251           ::CATLOSHA(s,LE2,BDS,"  e2 : ",""," ","");
252           interpretor<<s.ToCString()<<"\n";
253         }
254       }
255       if ( !eca && !esa ) {
256         interpretor<<"edge "<<ie<<" has no ancestors\n";
257       }
258     }
259   }
260   else if (!strcmp(a[0],"parvi") ) {
261     TopoDS_Shape S = DBRep::Get(a[1]);
262     TopExp_Explorer ee(S,TopAbs_EDGE);
263     for(Standard_Integer ie=1; ee.More(); ee.Next(),ie++) {
264       TopoDS_Edge e = TopoDS::Edge(ee.Current());
265       e.Orientation(TopAbs_FORWARD);
266       TCollection_AsciiString enam("VIe");enam=enam+TCollection_AsciiString(ie);
267       TopExp_Explorer ev(e,TopAbs_VERTEX);
268       for(Standard_Integer iv=1; ev.More(); ev.Next(),iv++) {
269         const TopoDS_Vertex v = TopoDS::Vertex(ev.Current());
270         if (v.Orientation()!=TopAbs_INTERNAL) continue;
271         TCollection_AsciiString vnam;vnam=enam+"i"+TCollection_AsciiString(iv);
272         DBRep::Set(enam.ToCString(),e);
273         DBRep::Set(vnam.ToCString(),v);
274         interpretor<<"din "<<enam.ToCString()<<" "<<vnam.ToCString();
275         interpretor<<" ;#par("<<vnam.ToCString()<<"/"<<enam.ToCString()<<") ";
276         //cout.flush();
277         interpretor<<"\n";
278         Standard_Real p = BRep_Tool::Parameter(v,e);
279         interpretor<<p<<"\n"; 
280       }
281     }
282   }
283   else if (!strcmp(a[0],"parvi2d") ) {
284     TopoDS_Shape S = DBRep::Get(a[1]);
285     TopExp_Explorer ef(S,TopAbs_FACE);
286     for(Standard_Integer ifa=1; ef.More(); ef.Next(),ifa++) {
287       TopoDS_Face f = TopoDS::Face(ef.Current());
288       f.Orientation(TopAbs_FORWARD);
289       TCollection_AsciiString fnam("VIf");fnam=fnam+TCollection_AsciiString(ifa);
290       DBRep::Set(fnam.ToCString(),f);
291       TopExp_Explorer ee(f,TopAbs_EDGE);
292       for(Standard_Integer ie=1; ee.More(); ee.Next(),ie++) {
293         TopoDS_Edge e = TopoDS::Edge(ee.Current());
294         e.Orientation(TopAbs_FORWARD);
295         TCollection_AsciiString enam;enam=fnam+"e"+TCollection_AsciiString(ie);
296         TopExp_Explorer ev(e,TopAbs_VERTEX);
297         for(Standard_Integer iv=1; ev.More(); ev.Next(),iv++) {
298           const TopoDS_Vertex v = TopoDS::Vertex(ev.Current());
299           if (v.Orientation()!=TopAbs_INTERNAL) continue;
300           TCollection_AsciiString vnam;vnam=enam+"vi"+TCollection_AsciiString(iv);
301           DBRep::Set(enam.ToCString(),e);
302           DBRep::Set(vnam.ToCString(),v);
303           interpretor<<"din "<<fnam.ToCString()<<" "<<enam.ToCString()<<" "<<vnam.ToCString();
304           interpretor<<" ;#par("<<vnam.ToCString()<<"/"<<enam.ToCString()<<","<<fnam.ToCString()<<") ";
305           //cout.flush();
306           interpretor<<"\n";
307           Standard_Real p=BRep_Tool::Parameter(v,e,f);
308           interpretor<<p<<"\n"; 
309         }
310       }
311     }
312   }
313   return 0 ;
314 } // TOPO
315
316 // ----------------------------------------------------------------------
317 #ifdef OCCT_DEBUG
318 Standard_Integer BOOPCHK(Draw_Interpretor& ,Standard_Integer na,const char** a)
319 {
320   if (!strcmp(a[0],"tchk")) { 
321 //    Standard_IMPORT extern Standard_Integer TopOpeBRepTool_BOOOPE_CHECK_DEB;
322     Standard_IMPORT Standard_Integer TopOpeBRepTool_BOOOPE_CHECK_DEB;
323     if ( na >= 2 ) TopOpeBRepTool_BOOOPE_CHECK_DEB = (Draw::Atoi(a[1])) ? 1 : 0;
324     return 0;
325   }
326   return 0;
327 }
328 #else
329 Standard_Integer BOOPCHK(Draw_Interpretor& ,Standard_Integer,const char**) {return 0;}
330 #endif
331
332 // ----------------------------------------------------
333 Standard_Integer TOPOSETCOMMANDS(TestTopOpe_BOOP& PT,Standard_Integer na,const char** a, Draw_Interpretor& di)
334
335   switch(na) {
336   case 1:
337     di<<"toposet <kind> <index> <tol>\n";
338     di<<"toposet <kind = Point> <index> <x> <y> <z>\n";
339     di<<"kind = p | c | s | v | e | f | w \n";
340     return 1;
341   case 4:
342     if(!strcasecmp(a[1],"p"))
343       PT.SetTol(TopOpeBRepDS_POINT,Draw::Atoi(a[2]),Draw::Atof(a[3]));
344     else if(!strcasecmp(a[1],"c"))// c ou C
345       PT.SetTol(TopOpeBRepDS_CURVE,Draw::Atoi(a[2]),Draw::Atof(a[3]));
346     else if(!strcasecmp(a[1],"s"))
347       PT.SetTol(TopOpeBRepDS_SURFACE,Draw::Atoi(a[2]),Draw::Atof(a[3]));
348     else if(!strcasecmp(a[1],"sh") ||
349             !strcasecmp(a[1],"v") ||
350             !strcasecmp(a[1],"e") ||
351             !strcasecmp(a[1],"f") ||
352             !strcasecmp(a[1],"w"))
353       PT.SetTol(Draw::Atoi(a[2]),Draw::Atof(a[3])); 
354     break;
355   case 6:
356     if(!strcasecmp(a[1],"p"))
357       PT.SetPnt(Draw::Atoi(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]));
358     else
359       return 1;
360     break;
361   default:
362     break;
363   } // switch na
364   return 0;
365 }
366
367 // -----------------------------------------------------
368 void TOPOHELP(TestTopOpe_BOOP& PT, Draw_Interpretor& di)
369 {
370   di<<"\n";
371   di<<"Help on topo command :\n";
372   di<<"----------------------\n";
373   for (Standard_Integer ic=0;ic<PT.Tnb();ic++) di<<PT.Tkeys(ic).ToCString()<<" : "<<PT.Thelp(ic).ToCString()<<"\n";
374   di<<"args :\n";
375   di<<"-2d -no2d : produce (or not) 2d curves in section\n";
376   di<<"-a : section curves approximated (default)\n";
377   di<<"-p : section curve discretisated\n";
378   di<<"-tx [default] | tol1 tol2 : set approximation tolerances\n";
379   di<<"-ti [shape] | tol1 tol2 : set intersection tolerances\n";
380   di<<"-c 0/[1] : clear view before displaying result\n";
381   di<<"-m [0]/1 : execute methods / explode methods\n";
382   di<<"-f [name] : retrieve shape/index <name> among input shapes (exploration index)\n";
383   di<<"-v [0]/1 : do not trace / trace methods name\n";
384   di<<"-d : dump all control variables\n";
385   di<<"-i : initialize control variables to default values\n";
386   di<<"-h : help\n";
387   di<<"----------------------\n";
388 }
389
390 // -------------------------------------------------------
391 Standard_Integer VARSTOPOARGS(TestTopOpe_BOOP& PT,Standard_Integer& na,const char** a, Draw_Interpretor& di)
392 {
393   VarsTopo& VT = PT.ChangeVarsTopo();
394
395   Standard_Boolean dump = Standard_False;
396   Standard_Boolean help = Standard_False;
397   Standard_Integer ia = 1;
398   while (ia < na) {
399     const char *thea = a[ia];
400     if (!strcmp(thea,"-f")) {
401       suppressarg(na,a,ia);
402       if (ia < na) {
403         PT.FindShape(a[ia]);
404         suppressarg(na,a,ia);
405       }
406       else {
407         PT.FindShape(0);
408       }
409     }
410     else if      (!strcasecmp(thea,"-2d")) {
411       VT.SetC2D(Standard_True);
412       suppressarg(na,a,ia);
413     } 
414     else if (!strcasecmp(thea,"-no2d")){
415       VT.SetC2D(Standard_False);
416       suppressarg(na,a,ia);
417     } 
418     else if (!strcasecmp(thea,"-a")) {
419       VT.SetOCT(TopOpeBRepTool_APPROX);
420       suppressarg(na,a,ia);
421     }
422     else if (!strcasecmp(thea,"-p")) {
423       VT.SetOCT(TopOpeBRepTool_BSPLINE1);
424       suppressarg(na,a,ia);
425     }
426     else if (!strcmp(thea,"-tx")) {
427       suppressarg(na,a,ia);
428       if (ia + 1 < na) {
429         VT.SetTolx(Draw::Atof(a[ia]),Draw::Atof(a[ia + 1]));
430         suppressarg(na,a,ia);
431         suppressarg(na,a,ia);
432       }
433       else if (ia < na) {
434         if (!strcmp(a[ia],"default")) {
435           VT.SetTolxDef();
436           suppressarg(na,a,ia);
437         }
438         else {
439           VT.SetTolx(Draw::Atof(a[ia]),Draw::Atof(a[ia]));
440           suppressarg(na,a,ia);
441         }
442       }
443     }
444     else if (!strcmp(thea,"-ti")) {
445       suppressarg(na,a,ia);
446       if (ia + 1 < na) {
447         VT.SetToli(Draw::Atof(a[ia]),Draw::Atof(a[ia + 1]));
448         suppressarg(na,a,ia);
449         suppressarg(na,a,ia);
450       }
451       else if (ia < na) {
452         if (!strcmp(a[ia],"shape")) {
453           VT.SetToliDef();
454           suppressarg(na,a,ia);
455         }
456         else {
457           VT.SetToli(Draw::Atof(a[ia]),Draw::Atof(a[ia]));
458           suppressarg(na,a,ia);
459         }
460       }
461     }
462     else if (!strcmp(thea,"-c")) {
463       suppressarg(na,a,ia);
464       if (ia < na) {
465         VT.SetClear (Draw::Atoi(a[ia]) != 0);
466         suppressarg(na,a,ia);
467       }
468       else VT.SetClear(Standard_True);
469     }
470     else if (!strcasecmp(thea,"-d")) {
471       dump = Standard_True;
472       suppressarg(na,a,ia);
473     }
474     else if (!strcasecmp(thea,"-i")) {
475       VT.Init();
476       suppressarg(na,a,ia);
477     }
478     else if (!strcmp(thea,"-m")) {
479       suppressarg(na,a,ia);
480       if (ia < na) {
481         VT.SetMode(Draw::Atoi(a[ia]));
482         suppressarg(na,a,ia);
483       }
484       else VT.SetMode(0);
485     }
486     else if (!strcmp(thea,"-v")) {
487       suppressarg(na,a,ia);
488       if (ia < na) {
489         VT.SetVerbose(Draw::Atoi(a[ia]));
490         suppressarg(na,a,ia);
491       }
492       else VT.SetVerbose(0);
493     }
494     else if (!strcasecmp(thea,"-h")) {
495       help = Standard_True;
496       suppressarg(na,a,ia);
497     }
498     else {
499       ia++;
500     }
501   } // while (ia < na)
502   if (dump) VT.Dump(cout);
503   if (help) TOPOHELP(PT, di);
504   return 0;
505
506 } // VARSTOPOARGS
507
508 // ----------------------------------------------------
509 Standard_Integer SETTOPOCOMMANDS(TestTopOpe_BOOP& PT)
510 {
511   PT.Tinit();
512   PT.Tadd("-def",0  ,"[a b] : load shapes");
513   PT.Tadd("-iss",100,"[a b] : intersection");
514   PT.Tadd("-gap",110,"[a b] : gap filler");
515   PT.Tadd("-cds",115,"[a b] : complete DS");
516   PT.Tadd("-fil",120,"[a b] : filter");
517   PT.Tadd("-red",130,"[a b] : reducer");
518   PT.Tadd("-rug",140,"[a b] : remove unshared geometry");
519   PT.Tadd("-chk",150,"[a b] : check DS");
520   PT.Tadd("-bui",200,"[a b] : section building");
521   PT.Tadd("-all",290,"[a b] : all");
522   return 0;
523 }
524
525 // ----------------------------------------------------
526 Standard_Integer SETTOPOPREP(TestTopOpe_BOOP& PT,Standard_Integer& na,const char** a)
527 {
528   if (na < 2) return 0;
529   const char* thea = a[0];
530   PT.mytodoPREP = 999;
531   if (!strcasecmp(thea,"topo") && na == 3) {
532     PT.mylastPREP = -1;
533     return 0;
534   }
535   if (na == 4) {
536     PT.mylastPREP = -1;
537   }
538
539   Standard_Integer ia = 1;
540   while (ia < na) {
541     thea = a[ia];
542     Standard_Integer ik = PT.Tstep(thea);
543     if (ik != -1) {
544       PT.mytodoPREP = ik; 
545       suppressarg(na,a,ia); 
546     }
547     else {
548       ia++;
549     }
550   }
551   return 0;
552 }
553
554 // ----------------------------------------------------
555 Standard_Integer TOPOCOMMANDS(TestTopOpe_BOOP& PT,Standard_Integer na,const char** a, Draw_Interpretor& di)
556
557   Standard_Integer err = 0;
558   if (strncmp(a[0],"topo",4)) return 1;
559   if (na == 2 && !strcasecmp(a[1],"-h")) { TOPOHELP(PT, di); return 0; }
560   err = VARSTOPOARGS(PT,na,a, di); if (err) return err;
561   if (na == 1) return 0; 
562   err = SETTOPOPREP(PT,na,a); if (err) return err;
563   
564 #ifdef OCCT_DEBUG
565   Standard_Boolean tend = TopOpeBRepTool_GettraceEND();
566   TopOpeBRepTool_SettraceEND(PT.ChangeVarsTopo().GetVerbose() != 0);
567 #endif
568
569   err = 0;
570   TopOpeBRep_DSFiller* PDSF = PT.myPDSF;
571   while (PT.mylastPREP <= PT.mytodoPREP) {
572     switch (PT.mylastPREP) {
573     case -1   : if (na >= 3) err = PT.LoadShapes(a[1],a[2]);break;
574     case  0   : err = PT.LoadnewDS(); PDSF = PT.myPDSF; break;
575     case  100 : err = PT.DSF_Insert_InsertIntersection(*PDSF); break;
576     case  110 : err = PT.DSF_Insert_Complete_GapFiller(*PDSF);break;
577     case  115 : err = PT.DSF_Insert_Complete_CompleteDS(*PDSF); break;
578     case  120 : err = PT.DSF_Insert_Complete_Filter(*PDSF); break;
579     case  130 : err = PT.DSF_Insert_Complete_Reducer(*PDSF); break;
580     case  140 : err = PT.DSF_Insert_Complete_RemoveUnsharedGeometry(*PDSF); break;
581     case  150 : err = PT.DSF_Insert_Complete_Checker(*PDSF); break;
582     case  160 : err = PT.LoadnewHB(); break;
583     case  200 : err = PT.Builder_Perform(); break;
584     case  290 : PT.mylastPREP = 1000; break;
585     default   : PT.mylastPREP = 1000; break;
586     }
587     if (err) return err;
588   }
589
590 #ifdef OCCT_DEBUG
591   TopOpeBRepTool_SettraceEND(tend);
592 #endif
593   return 0;
594 }
595
596 //=======================================================================
597 //function : BOOPCommands
598 //purpose  : 
599 //=======================================================================
600 void TestTopOpe::BOOPCommands(Draw_Interpretor& theCommands)
601 {
602   SETTOPOCOMMANDS(*PBOOP);
603   theCommands.Add(kboo[BOOP_TOPX],"-h for help",__FILE__,TOPOC);
604   theCommands.Add(kboo[BOOP_SECC],"secc [r]",__FILE__,TOPOC);
605   theCommands.Add(kboo[BOOP_SECE],"sece [r]",__FILE__,TOPOC);
606   theCommands.Add(kboo[BOOP_SEC],"sec [r]",__FILE__,TOPOC);
607   theCommands.Add(kboo[BOOP_C12],"c12 [r]",__FILE__,TOPOC);
608   theCommands.Add(kboo[BOOP_C21],"c21 [r]",__FILE__,TOPOC);
609   theCommands.Add(kboo[BOOP_COM],"com [r]",__FILE__,TOPOC);
610   theCommands.Add(kboo[BOOP_FUS],"fus [r]",__FILE__,TOPOC);
611   theCommands.Add("toposet","",__FILE__,TOPOC);
612   theCommands.Add("tsp","tsp [state] iS1 : get split parts",__FILE__,TOPOC);
613   theCommands.Add("tme","tme [state] iS1 : get merged parts",__FILE__,TOPOC);
614   theCommands.Add("csecanc","section edge ancestors. use : puts [csecanc]",__FILE__,TOPOC);
615   theCommands.Add("parvi","parvi <shape> : get parameter of internal vertices",__FILE__,TOPOC);
616   theCommands.Add("parvi2d","parvi <shape> : get parameter of internal vertices",__FILE__,TOPOC);
617   theCommands.Add("tchk","tchk 1/0 : check SameParameter edges or not in BRepBuilderAPI",__FILE__,BOOPCHK);
618 }
619
620 #if 0
621     if      (!strcasecmp(thea,"-def")) { PT.mytodoPREP = 0;   suppressarg(na,a,ia); }
622     else if (!strcasecmp(thea,"-iss")) { PT.mytodoPREP = 100; suppressarg(na,a,ia); }
623     else if (!strcasecmp(thea,"-gap")) { PT.mytodoPREP = 110; suppressarg(na,a,ia); }
624     else if (!strcasecmp(thea,"-cds")) { PT.mytodoPREP = 115; suppressarg(na,a,ia); }
625     else if (!strcasecmp(thea,"-fil")) { PT.mytodoPREP = 120; suppressarg(na,a,ia); }
626     else if (!strcasecmp(thea,"-red")) { PT.mytodoPREP = 130; suppressarg(na,a,ia); }
627     else if (!strcasecmp(thea,"-rug")) { PT.mytodoPREP = 140; suppressarg(na,a,ia); }
628     else if (!strcasecmp(thea,"-chk")) { PT.mytodoPREP = 150; suppressarg(na,a,ia); }
629     else if (!strcasecmp(thea,"-bui")) { PT.mytodoPREP = 200; suppressarg(na,a,ia); }
630     else if (!strcasecmp(thea,"-all")) { PT.mytodoPREP = 290; suppressarg(na,a,ia); }
631 #endif