0022746: Progress indicator in ShapeHealing
[occt.git] / src / SWDRAW / SWDRAW.cxx
1 #include <SWDRAW.ixx>
2
3 #include <DBRep.hxx>
4 // CKY 4-AOUT-1998 : pb avec GeomFill
5 //#include <GeometryTest.hxx>
6 //#include <BRepTest.hxx>
7 //#include <MeshTest.hxx>
8
9 #include <SWDRAW_ShapeTool.hxx>
10 #include <SWDRAW_ShapeAnalysis.hxx>
11 #include <SWDRAW_ShapeBuild.hxx>
12 #include <SWDRAW_ShapeConstruct.hxx>
13 #include <SWDRAW_ShapeCustom.hxx>
14 #include <SWDRAW_ShapeExtend.hxx>
15 #include <SWDRAW_ShapeFix.hxx>
16 #include <SWDRAW_ShapeUpgrade.hxx>
17 #include <SWDRAW_ShapeProcess.hxx>
18 #include <SWDRAW_ShapeProcessAPI.hxx>
19
20 //  tovrml
21 #include <TopoDS_Shape.hxx>
22 #include <SWDRAW_ToVRML.hxx>
23 //#72 rln 09.03.99 Packaging of SWDRAW
24
25 #include <ShapeProcess_OperLibrary.hxx>
26 #include <BRepTools.hxx>
27 #include <Draw_Window.hxx>
28 #include <BRep_Builder.hxx>
29 #include <gp_Trsf.hxx>
30   
31 //  for NSPApply -- CKY 12 JUL 2001
32 #include <XSAlgo.hxx>
33 #include <XSAlgo_AlgoContainer.hxx>
34
35 #include <Draw_ProgressIndicator.hxx>
36
37 static int dejadraw = 0;
38
39 //=======================================================================
40 //function : cpulimit (WNT)
41 //purpose  : 
42 //=======================================================================
43
44 #ifdef WNT
45 #include "cpulimit.pc"
46
47 static Standard_Integer cpulimit_draw(Draw_Interpretor& di, Standard_Integer n, const char** a)
48 {
49   if (n < 2) { di<<"Give a value"<<"\n"; return 1; }
50   int nn = atoi(a[1]);
51   di<<"LIMIT ELASPED TIME = "<<nn<<" seconds"<<"\n";
52   limitelapsed(nn);
53
54   return 0;
55 }
56 #endif
57
58 //#72 rln 09.03.99 Packaging of SWDRAW
59
60 //=======================================================================
61 //function : tovrml
62 //purpose  : 
63 //=======================================================================
64
65 static Standard_Integer tovrml(Draw_Interpretor& /*di*/, Standard_Integer n, const char** a)
66 {
67   if (n < 3) return 1;
68   SWDRAW_ToVRML avrml;
69   TopoDS_Shape sh = DBRep::Get (a[1]);
70   const char* filename = a[2];
71   if (!avrml.Write (sh,filename)) return 1;
72   return 0;
73 }
74
75 //=======================================================================
76 //function : LocSet
77 //purpose  : 
78 //=======================================================================
79
80 static Standard_Integer LocSet (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
81 {
82   if (argc < 2) {
83     di << argv[0] << "LocSet a [b [c]]: set location for shape \"a\":" << "\n";
84     di << "- to Null if one argument is given" << "\n";
85     di << "- to location of shape b if two arguments are given" << "\n";
86     di << "- to difference of locations of shapes b and c if three arguments are given" << "\n";
87     return 1;
88   }
89
90   TopoDS_Shape a = DBRep::Get ( argv[1] );
91   if ( a.IsNull() ) {
92     di << "No shape named \"" << argv[1] << "\" found" << "\n";
93     return 1;
94   }
95   TopLoc_Location L;
96   if ( argc >2 ) {
97     TopoDS_Shape b = DBRep::Get ( argv[2] );
98     if ( b.IsNull() ) {
99       di << "No shape named \"" << argv[2] << "\" found" << "\n";
100       return 1;
101     }
102     if ( argc >3 ) {
103       TopoDS_Shape c = DBRep::Get ( argv[3] );
104       if ( c.IsNull() ) {
105         di << "No shape named \"" << argv[3] << "\" found" << "\n";
106         return 1;
107       }
108       L = b.Location().Multiplied ( c.Location().Inverted() );
109     }
110     else L = b.Location();
111   }
112   a.Location ( L );
113   DBRep::Set ( argv[1], a );
114   
115   return 0; 
116 }
117
118 //=======================================================================
119 //function : LocDump
120 //purpose  : 
121 //=======================================================================
122
123 static Standard_Integer LocDump (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
124 {
125   if (argc < 2) {
126     di << argv[0] << "LocDump a: dump location of shape \"a\"" << "\n";
127     return 1;
128   }
129
130   TopoDS_Shape a = DBRep::Get ( argv[1] );
131   if ( a.IsNull() ) {
132     di << "No shape named \"" << argv[1] << "\" found" << "\n";
133     return 1;
134   }
135
136   TopLoc_Location L = a.Location();
137   di << "Location of shape " << argv[1] << ":" << "\n";
138 //  L.ShallowDump ( di );
139   di << "Results in:" << "\n";
140   gp_Trsf T = L.Transformation();
141   TopLoc_Location l ( T );
142   //l.ShallowDump ( di );
143   Standard_SStream aSStream;
144   l.ShallowDump ( aSStream );
145   di << aSStream;
146   
147   return 0; 
148 }
149
150 //=======================================================================
151 //function : NSPApply
152 //purpose  : CKY , 12 JUL 2001
153 //=======================================================================
154
155 static Standard_Integer NSPApply (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
156 {
157   if ( argc < 6) {
158     di<<"NSPApply result(new shape) shape(initial shape) rscfile sequence tol [maxtol, default=1]"<<"\n";
159     return 1;
160   }
161   TopoDS_Shape shape = DBRep::Get ( argv[2] );
162   if (shape.IsNull()) {
163     di << "No shape named \"" << argv[1] << "\" found" << "\n";
164     return 1;
165   }
166   TopoDS_Shape newshape;
167   Standard_Real tol = atof(argv[5]);
168   Standard_Real maxtol = 1.;
169   if (argc > 6) maxtol = atof(argv[6]);
170
171   XSAlgo::AlgoContainer()->PrepareForTransfer();
172   Handle(Standard_Transient) info;  // reserved for special uses
173   Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di, 1);
174   newshape = XSAlgo::AlgoContainer()->ProcessShape
175     ( shape, tol, maxtol, argv[3] , argv[4] , info, aProgress);
176 //    WHAT IS MISSING HERE IS MERGING with starting transfer map
177
178   if (newshape.IsNull()) {
179     di<<"No result produced"<<"\n";
180   }
181   else
182     DBRep::Set ( argv[1], newshape );
183   return 0;
184 }
185
186 //=======================================================================
187 //function : Init
188 //purpose  : 
189 //=======================================================================
190
191 void  SWDRAW::Init (Draw_Interpretor& theCommands)
192 {
193   if (!dejadraw) {
194     dejadraw = 1;
195 //    DBRep::BasicCommands(theCommands);
196 // CKY 4-AOUT-1998 : pb avec GeomFill
197 //    GeometryTest::AllCommands(theCommands);
198 //    BRepTest::AllCommands(theCommands);
199 //    MeshTest::Commands(theCommands);
200   }
201
202   SWDRAW_ShapeTool::InitCommands (theCommands);
203   SWDRAW_ShapeAnalysis::InitCommands (theCommands);
204   SWDRAW_ShapeBuild::InitCommands (theCommands);
205   SWDRAW_ShapeConstruct::InitCommands (theCommands);
206   SWDRAW_ShapeCustom::InitCommands (theCommands);
207   SWDRAW_ShapeExtend::InitCommands (theCommands);
208   SWDRAW_ShapeFix::InitCommands (theCommands);
209   SWDRAW_ShapeUpgrade::InitCommands (theCommands);
210   SWDRAW_ShapeProcess::InitCommands (theCommands);
211   SWDRAW_ShapeProcessAPI::InitCommands (theCommands);
212
213 #ifdef WNT
214   theCommands.Add("limitelapsed", "nn seconds",__FILE__, cpulimit_draw, "essai");
215 #endif
216
217   // locations
218   theCommands.Add("LocSet", "a [b [c]]: set loc b->a; use no args to get help",__FILE__,LocSet,"essai");
219   theCommands.Add("LocDump", "a: dump location of a",__FILE__,LocDump,"essai");
220
221   //tovrml
222   theCommands.Add("tovrml", "shape filename",__FILE__, tovrml, "essai");
223
224   // register operators for ShapeProcessing
225   ShapeProcess_OperLibrary::Init();
226
227   // new shape processing
228   theCommands.Add ("NSPApply","NSPApply result shape rscfilename sequence tol [maxtol, default=1]",
229                    __FILE__,NSPApply,"essai");
230 }
231
232 //=======================================================================
233 //function : GroupName
234 //purpose  : 
235 //=======================================================================
236
237 Standard_CString SWDRAW::GroupName()
238 {
239   return "Shape Healing";
240 }