Integration of OCCT 6.5.0 from SVN
[occt.git] / src / Draw / Draw_BasicCommands.cxx
CommitLineData
7fd59977 1// File: Draw_BasicCommands.cxx
2// Created: Thu Feb 23 18:21:17 1995
3// Author: Remi LEQUETTE
4// <rle@bravox>
5
6#include <Standard_Macro.hxx>
7#include <Standard_Stream.hxx>
8#include <Standard_SStream.hxx>
9
10#include <Draw.ixx>
11#include <Draw_Appli.hxx>
12#include <Draw_Printer.hxx>
13
14#include <Message.hxx>
15#include <Message_Messenger.hxx>
16
17#ifdef HAVE_CONFIG_H
18# include <config.h>
19#endif
20
21#if defined(HAVE_TIME_H) || defined(WNT)
22# include <time.h>
23#endif
24
25#ifdef HAVE_SIGNAL_H
26# include <signal.h>
27#endif
28
29#ifndef WNT
30# include <sys/resource.h>
31# ifdef HAVE_STRINGS_H
32# include <strings.h>
33# endif
34#else
35//WNT
36extern Standard_Boolean Draw_Batch;
37#include <windows.h>
38#include <winbase.h>
39#include <process.h>
40#include <stdio.h>
41#include <stdlib.h>
42#ifdef HAVE_LIMITS
43# include <limits>
44#elif defined (HAVE_LIMITS_H)
45# include <limits.h>
46#endif
47
48#ifdef WNT
49# include <limits>
50#endif
51
52static clock_t MDTV_CPU_LIMIT; // Cpu_limit in Sec.
53static clock_t MDTV_CPU_CURRENT; // cpu time already used at last
54 // cpulimit call. (sec.)
55//#define strcasecmp strcmp Already defined
56#define RLIM_INFINITY 0x7fffffff
57#endif
58
59#include <Draw_Chronometer.hxx>
60
61#if defined (__hpux) || defined ( HPUX )
62#define RLIM_INFINITY 0x7fffffff
63#define RLIMIT_CPU 0
64#endif
65
66
67
68//=======================================================================
69// chronom
70//=======================================================================
71
72extern Standard_Boolean Draw_Chrono;
73
74static Standard_Integer chronom(Draw_Interpretor& di,
75 Standard_Integer n,const char** a)
76{
77 if ((n == 1) || (*a[1] == '0') || (*a[1] == '1')) {
78 if (n == 1)
79 Draw_Chrono = !Draw_Chrono;
80 else
81 Draw_Chrono = (*a[1] == '1');
82
83 if (Draw_Chrono) di << "Chronometers activated."<<"\n";
84 else di << "Chronometers desactivated."<<"\n";
85 }
86 else {
87 Handle(Draw_Drawable3D) D = Draw::Get(a[1]);
88 Handle(Draw_Chronometer) C;
89 if (!D.IsNull()) {
90 C = Handle(Draw_Chronometer)::DownCast(D);
91 }
92 if (C.IsNull()) {
93 C = new Draw_Chronometer();
94 Draw::Set(a[1],C,Standard_False);
95 }
96 if (n <= 2) {
97 C->Timer().Reset();
98 }
99 else {
100 if (!strcasecmp(a[2],"reset"))
101 C->Timer().Reset();
102 if (!strcasecmp(a[2],"start"))
103 C->Timer().Start();
104 if (!strcasecmp(a[2],"stop"))
105 C->Timer().Stop();
106 if (!strcasecmp(a[2],"show"))
107 C->Timer().Show();
108 }
109 }
110 return 0;
111}
112
113static Standard_Integer dchronom(Draw_Interpretor& I,
114 Standard_Integer n,const char** a)
115{
116 if ((n == 1) || (*a[1] == '0') || (*a[1] == '1')) {
117 if (n == 1)
118 Draw_Chrono = !Draw_Chrono;
119 else
120 Draw_Chrono = (*a[1] == '1');
121
122 if (Draw_Chrono) I << "Chronometers activated."<<"\n";
123 else I << "Chronometers desactivated."<<"\n";
124 }
125 else {
126 Handle(Draw_Drawable3D) D = Draw::Get(a[1]);
127 Handle(Draw_Chronometer) C;
128 if (!D.IsNull()) {
129 C = Handle(Draw_Chronometer)::DownCast(D);
130 }
131 if (C.IsNull()) {
132 C = new Draw_Chronometer();
133 Draw::Set(a[1],C,Standard_False);
134 }
135 if (n <= 2) {
136 C->Timer().Reset();
137 }
138 else {
139 if (!strcasecmp(a[2],"reset"))
140 C->Timer().Reset();
141 if (!strcasecmp(a[2],"start"))
142 C->Timer().Start();
143 if (!strcasecmp(a[2],"stop"))
144 C->Timer().Stop();
145 if (!strcasecmp(a[2],"show")) {
146 Standard_SStream ss;
147 C->Timer().Show(ss);
148 I << ss;
149 }
150 }
151 }
152 return 0;
153}
154
155
156
157//=======================================================================
158//function : ifbatch
159//purpose :
160//=======================================================================
161
162static Standard_Integer ifbatch(Draw_Interpretor& DI, Standard_Integer , const char** )
163{
164 if (Draw_Batch)
165 DI << "1";
166 else
167 DI << "0";
168
169 return 0;
170}
171
172//=======================================================================
173//function : spy
174//purpose :
175//=======================================================================
176
177extern Standard_Boolean Draw_Spying;
178extern filebuf Draw_Spyfile;
179
180static Standard_Integer spy(Draw_Interpretor& di, Standard_Integer n, const char** a)
181{
182 if (Draw_Spying)
183 Draw_Spyfile.close();
184 Draw_Spying = Standard_False;
185 if (n > 1) {
186 if (!Draw_Spyfile.open(a[1],ios::out)) {
187 di << "Cannot open "<<a[1]<<" for writing"<<"\n";
188 return 1;
189 }
190 Draw_Spying = Standard_True;
191 }
192 return 0;
193}
194
195//=======================================================================
196//function : wait
197//purpose :
198//=======================================================================
199
200static Standard_Integer Draw_wait(Draw_Interpretor& , Standard_Integer n, const char** a)
201{
202 Standard_Integer w = 10;
203 if (n > 1)
204 w = atoi(a[1]);
205 time_t ct = time(NULL) + w;
206 while (time(NULL) < ct) {};
207 return 0;
208}
209
210
211static Standard_Integer cpulimit(Draw_Interpretor& di, Standard_Integer n, const char** a)
212{
213#ifndef WNT
214 rlimit rlp;
215 rlp.rlim_max = RLIM_INFINITY;
216 if (n <= 1)
217 rlp.rlim_cur = RLIM_INFINITY;
218 else
219 rlp.rlim_cur = atoi(a[1]);
220
221 int status;
222 status=setrlimit(RLIMIT_CPU,&rlp);
223 if (status !=0)
224 di << "status cpulimit setrlimit : " << status << "\n";
225
226#else
227//WNT
228 static int first=1;
229/*
230 unsigned int __stdcall CpuFunc(void * );
231 unsigned ThreadID;
232
233 if (n <= 1) MDTV_CPU_LIMIT = RLIM_INFINITY;
234 else {
235
236 MDTV_CPU_LIMIT = atoi(a[1]);
237 MDTV_CPU_CURRENT = clock()/1000;
238
239 if (first) // Lancer le thread au 1er appel seulement.
240 {
241 first=0 ;
242 _beginthreadex(NULL,0,CpuFunc,NULL,0,&ThreadID);
243 }
244 }
245
246*/
247#endif
248
249 return 0;
250}
251
252
253void Draw::BasicCommands(Draw_Interpretor& theCommands)
254{
255 static Standard_Boolean Done = Standard_False;
256 if (Done) return;
257 Done = Standard_True;
258
259 const char* g = "DRAW General Commands";
260
261 theCommands.Add("batch", "returns 1 in batch mode",
262 __FILE__,ifbatch,g);
263 theCommands.Add("spy","spy [file], Save commands in file. no file close",
264 __FILE__,spy,g);
265 theCommands.Add("wait","wait [time(10)], wait time seconds",
266 __FILE__,Draw_wait,g);
267 theCommands.Add("cpulimit","cpulimit [nbseconds], no args remove limits",
268 __FILE__,cpulimit,g);
269 theCommands.Add("chrono","chrono [ name start/stop/reset/show]",
270 __FILE__,chronom,g);
271 theCommands.Add("dchrono","dchrono [ name start/stop/reset/show]",
272 __FILE__,dchronom,g);
273}