1 // Created on: 1995-02-23
2 // Created by: Remi LEQUETTE
3 // Copyright (c) 1995-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 // Modif : DFO 05/11/96
19
20 #include <Draw.hxx>
21 #include <Draw_Appli.hxx>
22 #include <Draw_Display.hxx>
23 #include <Draw_Drawable3D.hxx>
24 #include <Draw_Grid.hxx>
25 #include <Draw_ProgressIndicator.hxx>
26 #include <Draw_Text2D.hxx>
27 #include <Draw_Text3D.hxx>
28 #include <Message.hxx>
29 #include <Standard_Stream.hxx>
30 #include <TCollection_AsciiString.hxx>
31
32 #include <stdio.h>
33 #ifdef _WIN32
34 extern Draw_Viewer dout;
35 extern Standard_Boolean Draw_Batch;
36 #endif
37
38 extern Standard_Boolean Draw_BlackBackGround;
39
40
41 #define DEFROTATE (5 * M_PI/ 180.)
42 #define DEFMAGNIFY 1.1
43 #define DEFPANNING 0.1
44 #define DEFFOCAL 1.1
45 #define DEFFRAME 10
46 #define DEFGRIDSTEP 100.0
47 static Standard_Real steprot = DEFROTATE;
48 static Standard_Real steppan = DEFPANNING;
49 static Standard_Real stepmagnify = DEFMAGNIFY;
50 static Standard_Real stepfocal = DEFFOCAL;
51 static Standard_Real frame = DEFFRAME;
52 static Standard_Real DefaultGridStep = DEFGRIDSTEP ;
53
54 #define FONTLENGTH
55 static char Draw_fontname[FONTLENGTH]="Helvetica";
56 static char Draw_fontsize[FONTLENGTH]="150";
57 static char Draw_fontnamedefault[FONTLENGTH]="Helvetica";
58 static char Draw_fontsizedefault[FONTLENGTH]="150";
59
60 // *******************************************************************
61 // Graphic commands
62 // *******************************************************************
63
ViewId(const Standard_CString a)64 static Standard_Integer ViewId(const Standard_CString a)
65 {
66 Standard_Integer id = Draw::Atoi(a);
67 if ((id < 0) || (id >= MAXVIEW)) {
68 std::cout << "Incorrect view-id, must be in 0.."<<MAXVIEW-1<<std::endl;
69 return -1;
70 }
71 if (!dout.HasView(id)) {
72 std::cout <<"View "<<id<<" does not exist."<<std::endl;
73 return -1;
74 }
75 return id;
76 }
77
SetTitle(const Standard_Integer id)78 static void SetTitle(const Standard_Integer id)
79 {
80 if (dout.HasView(id)) {
81 char title[255];
82 Sprintf(title,"%d : %s - Zoom %f",id,dout.GetType(id),dout.Zoom(id));
83 dout.SetTitle(id,title);
84 }
85 }
86
87 //=======================================================================
88 //function : zoom
89 //purpose :
90 //=======================================================================
91
zoom(Draw_Interpretor &,Standard_Integer n,const char ** a)92 static Standard_Integer zoom(Draw_Interpretor& , Standard_Integer n, const char** a)
93 {
94 // one argument -> All Views
95 // two argument -> First is the view
96 Standard_Boolean z2d = !strcasecmp(a[0],"2dzoom");
97 if (n == 2) {
98 Standard_Real z = Draw::Atof(a[1]);
99 for (Standard_Integer id = 0; id < MAXVIEW; id++) {
100 if (dout.HasView(id)) {
101 if ((z2d && !dout.Is3D(id)) || (!z2d && dout.Is3D(id))) {
102 dout.SetZoom(id,z);
103 SetTitle(id);
104 dout.RepaintView(id);
105 }
106 }
107 }
108 return 0;
109 }
110 else if (n >= 3) {
111 Standard_Integer id = ViewId(a[1]);
112 if (id < 0) return 1;
113 Standard_Real z = Draw::Atof(a[2]);
114 dout.SetZoom(id,z);
115 dout.RepaintView(id);
116 SetTitle(id);
117 return 0;
118 }
119 else
120 return 1;
121 }
122
123 //=======================================================================
124 //function : wzoom
125 //purpose :
126 //=======================================================================
127
wzoom(Draw_Interpretor & di,Standard_Integer argc,const char ** argv)128 static Standard_Integer wzoom(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
129 {
130 Standard_Integer id,X,Y,W,H,X1,Y1,X2 = 0,Y2 = 0,b;
131 Standard_Real dX1,dY1,dX2,dY2,zx,zy;
132 if(argc != 1 && argc != 6)
133 {
134 di<<"Usage : " << argv[0] << " [view-id X1 Y1 X2 Y2]\n";
135 return 1;
136 }
137 if(argc == 1)
138 {
139 di << "Pick first corner\n";
140 dout.Select(id,X1,Y1,b);
141
142 gp_Trsf T;
143 gp_Pnt P0(0,0,0);
144 dout.GetTrsf(id,T);
145 T.Invert();
146 P0.Transform(T);
147 Standard_Real z = dout.Zoom(id);
148
149 dX1=X1; dY1=Y1;
150 dX1-=P0.X(); dY1-=P0.Y();
151 dX1/=z; dY1/=z;
152
153 if (b != 1) return 0;
154 if (id < 0) return 0;
155 Draw_Display d = dout.MakeDisplay(id);
156 d.SetColor(Draw_blanc);
157 d.SetMode(10);
158 Standard_Real dOX2 = dX1;
159 Standard_Real dOY2 = dY1;
160 d.Draw(gp_Pnt2d(dX1,dY1),gp_Pnt2d(dX1,dOY2));
161 d.Draw(gp_Pnt2d(dX1,dOY2),gp_Pnt2d(dOX2,dOY2));
162 d.Draw(gp_Pnt2d(dOX2,dOY2),gp_Pnt2d(dOX2,dY1));
163 d.Draw(gp_Pnt2d(dOX2,dY1),gp_Pnt2d(dX1,dY1));
164 d.Flush();
165 dout.GetPosSize(id,X,Y,W,H);
166 di << "Pick second corner\n";
167 b = 0;
168 while (b == 0) {
169 dout.Select(id,X2,Y2,b,Standard_False);
170 dX2=X2; dY2=Y2;
171 dX2-=P0.X(); dY2-=P0.Y();
172 dX2/=z; dY2/=z;
173
174 d.Draw(gp_Pnt2d(dX1,dY1),gp_Pnt2d(dX1,dOY2));
175 d.Draw(gp_Pnt2d(dX1,dOY2),gp_Pnt2d(dOX2,dOY2));
176 d.Draw(gp_Pnt2d(dOX2,dOY2),gp_Pnt2d(dOX2,dY1));
177 d.Draw(gp_Pnt2d(dOX2,dY1),gp_Pnt2d(dX1,dY1));
178 d.Draw(gp_Pnt2d(dX1,dY1),gp_Pnt2d(dX1,dY2));
179 d.Draw(gp_Pnt2d(dX1,dY2),gp_Pnt2d(dX2,dY2));
180 d.Draw(gp_Pnt2d(dX2,dY2),gp_Pnt2d(dX2,dY1));
181 d.Draw(gp_Pnt2d(dX2,dY1),gp_Pnt2d(dX1,dY1));
182 d.Flush();
183 dOX2 = dX2;
184 dOY2 = dY2;
185 }
186 d.Draw(gp_Pnt2d(dX1,dY1),gp_Pnt2d(dX1,dOY2));
187 d.Draw(gp_Pnt2d(dX1,dOY2),gp_Pnt2d(dOX2,dOY2));
188 d.Draw(gp_Pnt2d(dOX2,dOY2),gp_Pnt2d(dOX2,dY1));
189 d.Draw(gp_Pnt2d(dOX2,dY1),gp_Pnt2d(dX1,dY1));
190 d.Flush();
191 if (b != 1) return 0;
192 d.SetMode(0);
193 }
194 else
195 {
196 id = atoi(argv[1]);
197 if ((id < 0) || (id >= MAXVIEW))
198 {
199 Message::SendFail() << "Incorrect view-id, must be in 0.." << (MAXVIEW-1);
200 return 1;
201 }
202 if (!dout.HasView(id))
203 {
204 Message::SendFail() << "View " << id << " does not exist";
205 return 1;
206 }
207 X1 = atoi (argv [2]);
208 Y1 = atoi (argv [3]);
209 X2 = atoi (argv [4]);
210 Y2 = atoi (argv [5]);
211
212 dout.GetPosSize(id,X,Y,W,H);
213 }
214
215 if ((X1 == X2) || (Y1 == Y2)) return 0;
216 zx = (Standard_Real) Abs(X2-X1) / (Standard_Real) W;
217 zy = (Standard_Real) Abs(Y2-Y1) / (Standard_Real) H;
218 if (zy > zx) zx = zy;
219 zx = 1/zx;
220 if (X2 < X1) X1 = X2;
221 if (Y2 > Y1) Y1 = Y2;
222 X1 = (Standard_Integer ) (X1*zx);
223 Y1 = (Standard_Integer ) (Y1*zx);
224 dout.SetZoom(id,zx*dout.Zoom(id));
225 dout.SetPan(id,-X1,-Y1);
226 dout.RepaintView(id);
227 SetTitle(id);
228 return 0;
229 }
230
231 //=======================================================================
232 //function : wclick
233 //purpose :
234 //=======================================================================
235
wclick(Draw_Interpretor & di,Standard_Integer,const char **)236 static Standard_Integer wclick(Draw_Interpretor& di, Standard_Integer, const char**)
237 {
238 Standard_Integer id1,X1,Y1,b;
239 dout.Flush();
240 di << "Just click.\n";
241 dout.Select(id1,X1,Y1,b);
242 return 0;
243 }
244
245 //=======================================================================
246 //function : view
247 //purpose :
248 //=======================================================================
249
view(Draw_Interpretor & di,Standard_Integer n,const char ** a)250 static Standard_Integer view(Draw_Interpretor& di, Standard_Integer n, const char** a)
251 {
252 if (Draw_Batch) return 1;
253
254 if ((n >= 3) && (n != 4)) {
255 Standard_Integer id = Draw::Atoi(a[1]);
256 if ((id < 0) || (id >= MAXVIEW)) {
257 di <<"View-id must be in 0.."<<MAXVIEW-1<<"\n";
258 return 1;
259 }
260 Standard_Integer X = 0;
261 Standard_Integer Y = 0;
262 Standard_Integer W = 500;
263 Standard_Integer H = 500;
264 // if view exist, get old values
265 if (dout.HasView(id))
266 dout.GetPosSize(id,X,Y,W,H);
267 if (n >= 4)
268 X = Draw::Atoi(a[3]);
269 if (n >= 5)
270 Y = Draw::Atoi(a[4]);
271 if (n >= 6)
272 W = Draw::Atoi(a[5]);
273 if (n >= 7)
274 H = Draw::Atoi(a[6]);
275 dout.MakeView(id,a[2],X,Y,W,H);
276 if (!dout.HasView(id)) {
277 di << "View creation failed\n";
278 return 1;
279 }
280 SetTitle(id);
281 dout.DisplayView(id);
282 return 0;
283 }
284 else if (n == 4) {
285 // create a view on a given window
286 Standard_Integer id = Draw::Atoi(a[1]);
287 if ((id < 0) || (id >= MAXVIEW)) {
288 di <<"View-id must be in 0.."<<MAXVIEW-1<<"\n";
289 return 1;
290 }
291 dout.MakeView(id,a[2],a[3]);
292 if (!dout.HasView(id)) {
293 di << "View creation failed\n";
294 return 1;
295 }
296 SetTitle(id);
297 dout.DisplayView(id);
298 return 0;
299 }
300 else
301 return 1;
302 }
303
304 //=======================================================================
305 //function : delview
306 //purpose :
307 //=======================================================================
308
delview(Draw_Interpretor &,Standard_Integer n,const char ** a)309 static Standard_Integer delview(Draw_Interpretor& , Standard_Integer n, const char** a)
310 {
311 if (n == 1) {
312 for (Standard_Integer id = 0; id < MAXVIEW; id++)
313 dout.DeleteView(id);
314 return 0;
315 }
316 else if (n >= 2) {
317 Standard_Integer id = ViewId(a[1]);
318 if (id < 0) return 1;
319 dout.DeleteView(id);
320 return 0;
321 }
322 else
323 return 1;
324 }
325
326 //=======================================================================
327 //function : fit
328 //purpose :
329 //=======================================================================
330
fit(Draw_Interpretor &,Standard_Integer n,const char ** a)331 static Standard_Integer fit(Draw_Interpretor& , Standard_Integer n, const char** a)
332 {
333 Standard_Boolean f2d = !strcasecmp(a[0],"2dfit");
334 if (n == 1) {
335 Standard_Real zoom = RealLast();
336 Standard_Integer id;
337 for ( id = 0; id < MAXVIEW; id++) {
338 if (dout.HasView(id)) {
339 if ((f2d && !dout.Is3D(id)) || (!f2d && dout.Is3D(id))) {
340 // dout.FitView(id,frame);
341 dout.FitView(id,(Standard_Integer ) frame);
342 if (dout.Zoom(id) < zoom) zoom = dout.Zoom(id);
343 }
344 }
345 }
346 for (id = 0; id < MAXVIEW; id++) {
347 if (dout.HasView(id)) {
348 if ((f2d && !dout.Is3D(id)) || (!f2d && dout.Is3D(id))) {
349 dout.SetZoom(id,zoom);
350 dout.RepaintView(id);
351 SetTitle(id);
352 }
353 }
354 }
355 return 0;
356 }
357 else if (n >= 2) {
358 Standard_Integer id = ViewId(a[1]);
359 if (id < 0) return 1;
360 // dout.FitView(id,frame);
361 dout.FitView(id,(Standard_Integer ) frame);
362 dout.RepaintView(id);
363 SetTitle(id);
364 return 0;
365 }
366 else
367 return 1;
368 }
369
370 //=======================================================================
371 //function : focal
372 //purpose :
373 //=======================================================================
374
focal(Draw_Interpretor &,Standard_Integer n,const char ** a)375 static Standard_Integer focal(Draw_Interpretor& , Standard_Integer n, const char** a)
376 {
377 Standard_Integer start = 0;
378 Standard_Integer end = MAXVIEW-1;
379 if (n >= 2) {
380 Standard_Integer anid = ViewId(a[1]);
381 if (anid < 0) return 1;
382 start = end = anid;
383 }
384 Standard_Real df = 1.;
385 if (!strcasecmp(a[0],"fu"))
386 df = stepfocal;
387 if (!strcasecmp(a[0],"fd"))
388 df = 1./stepfocal;
389
390 for (Standard_Integer id = start; id <= end; id++) {
391 if (!strcasecmp(dout.GetType(id),"PERS")) {
392 dout.SetFocal(id,dout.Focal(id) * df);
393 dout.RepaintView(id);
394 }
395 }
396 return 0;
397 }
398
399 //=======================================================================
400 //function : setfocal
401 //purpose :
402 //=======================================================================
403
setfocal(Draw_Interpretor & di,Standard_Integer n,const char ** a)404 static Standard_Integer setfocal(Draw_Interpretor& di, Standard_Integer n, const char** a)
405 {
406 if (n == 1) {
407 for (Standard_Integer id = 0; id < MAXVIEW; id++) {
408 if (!strcasecmp(dout.GetType(id),"PERS"))
409 di << "Focal view "<<id<<" is "<<dout.Focal(id)<<"\n";
410 }
411 }
412 else {
413 Standard_Real f = Draw::Atof(a[1]);
414 for (Standard_Integer id = 0; id < MAXVIEW; id++) {
415 if (!strcasecmp(dout.GetType(id),"PERS"))
416 dout.SetFocal(id,f);
417 }
418 dout.RepaintAll();
419 }
420 return 0;
421 }
422
423 //=======================================================================
424 //function : magnify
425 //purpose :
426 //=======================================================================
427
428 //static Standard_Integer magnify(Draw_Interpretor& di, Standard_Integer n, const char** a)
magnify(Draw_Interpretor &,Standard_Integer n,const char ** a)429 static Standard_Integer magnify(Draw_Interpretor& , Standard_Integer n, const char** a)
430 {
431 Standard_Integer start = 0;
432 Standard_Integer end = MAXVIEW-1;
433 if (n >= 2) {
434 Standard_Integer anid = ViewId(a[1]);
435 if (anid < 0) return 1;
436 start = end = anid;
437 }
438 Standard_Boolean v2d = (a[0][0] == '2'); // 2dmu, 2dmd
439 const char* com = a[0];
440 if (v2d) com += 2;
441 Standard_Real dz = 1.;
442 if (!strcasecmp(com,"mu")) // mu, 2dmu
443 dz = stepmagnify;
444 else // md, 2dmd
445 dz = 1/stepmagnify;
446
447 for (Standard_Integer id = start; id <= end; id++) {
448 if (dout.HasView(id)) {
449 if ((v2d && !dout.Is3D(id)) || (!v2d && dout.Is3D(id))) {
450 dout.SetZoom(id,dout.Zoom(id) * dz);
451 SetTitle(id);
452 dout.RepaintView(id);
453 }
454 }
455 }
456 return 0;
457 }
458
Draw_magnify(Draw_Interpretor & di,Standard_Integer n,const char ** a)459 Standard_EXPORT Standard_Integer Draw_magnify(Draw_Interpretor& di, Standard_Integer n, const char** a)
460 {
461 return magnify(di,n,a);
462 }
463
464 //=======================================================================
465 //function : rotate
466 //purpose :
467 //=======================================================================
468
rotate(Draw_Interpretor &,Standard_Integer n,const char ** a)469 static Standard_Integer rotate(Draw_Interpretor& , Standard_Integer n, const char** a)
470 {
471 Standard_Integer start = 0;
472 Standard_Integer end = MAXVIEW-1;
473 if (n >= 2) {
474 Standard_Integer anid = ViewId(a[1]);
475 if (anid < 0) return 1;
476 start = end = anid;
477 }
478
479 gp_Dir2d D;
480 Standard_Real ang=0;
481 if (!strcasecmp(a[0],"u")) {
482 D.SetCoord(1.,0.);
483 ang = -steprot;
484 }
485 if (!strcasecmp(a[0],"d")) {
486 D.SetCoord(1.,0.);
487 ang = steprot;
488 }
489 if (!strcasecmp(a[0],"l")) {
490 D.SetCoord(0.,1.);
491 ang = -steprot;
492 }
493 if (!strcasecmp(a[0],"r")) {
494 D.SetCoord(0.,1.);
495 ang = steprot;
496 }
497
498 for (Standard_Integer id = start; id <= end; id++) {
499 if ((!strcasecmp(dout.GetType(id),"AXON")) ||
500 (!strcasecmp(dout.GetType(id),"PERS"))) {
501 dout.RotateView(id,D,ang);
502 dout.RepaintView(id);
503 }
504 }
505 return 0;
506 }
507
508 //=======================================================================
509 //function : panning
510 //purpose :
511 //=======================================================================
512
panning(Draw_Interpretor &,Standard_Integer n,const char ** a)513 static Standard_Integer panning(Draw_Interpretor& , Standard_Integer n, const char** a)
514 {
515 Standard_Integer start = 0;
516 Standard_Integer end = MAXVIEW-1;
517 if (n >= 2) {
518 Standard_Integer anid = ViewId(a[1]);
519 if (anid < 0) return 1;
520 start = end = anid;
521 }
522 Standard_Integer DX = 0;
523 Standard_Integer DY = 0;
524 Standard_Integer X,Y,W,H;
525
526 Standard_Boolean v2d = (a[0][0] == '2'); // pu2d, pd2d, pr2d, pl2d
527 const char* com = a[0];
528 if (v2d) com += 2;
529
530 if (!strcasecmp(com,"pu")) // pu , 2dpu
531 DY = 1;
532 if (!strcasecmp(com,"pd")) // pd , 2dpd
533 DY = -1;
534 if (!strcasecmp(com,"pl")) // pl , 2dpl
535 DX = -1;
536 if (!strcasecmp(com,"pr")) // pr , 2dpr
537 DX = 1;
538
539 for (Standard_Integer id = start; id <= end; id++) {
540 if (dout.HasView(id)) {
541 if ((v2d && !dout.Is3D(id)) || (!v2d && dout.Is3D(id))) {
542 dout.GetPosSize(id,X,Y,W,H);
543 // dout.PanView(id,W * DX * steppan, H * DY * steppan);
544 dout.PanView(id,(Standard_Integer )( W * DX * steppan),(Standard_Integer )( H * DY * steppan));
545 dout.RepaintView(id);
546 }
547 }
548 }
549 return 0;
550 }
551
552 //=======================================================================
553 //function : ptv
554 //purpose :
555 //=======================================================================
556
ptv(Draw_Interpretor &,Standard_Integer n,const char ** a)557 static Standard_Integer ptv(Draw_Interpretor& , Standard_Integer n, const char** a)
558 {
559 Standard_Real X,Y,Z;
560 Standard_Integer start = 0;
561 Standard_Integer end = MAXVIEW-1;
562 if (n < 4) return 1;
563 if (n >= 5) {
564 Standard_Integer anid = ViewId(a[1]);
565 if (anid < 0) return 1;
566 start = end = anid;
567 X = Draw::Atof(a[2]);
568 Y = Draw::Atof(a[3]);
569 Z = Draw::Atof(a[4]);
570 }
571 else {
572 X = Draw::Atof(a[1]);
573 Y = Draw::Atof(a[2]);
574 Z = Draw::Atof(a[3]);
575 }
576
577 for (Standard_Integer id = start; id <= end; id++) {
578 gp_Trsf T;
579 dout.GetTrsf(id,T);
580 T.SetTranslationPart(gp_Vec(0,0,0));
581 gp_Trsf T1;
582 T1.SetTranslationPart(gp_Vec(-X,-Y,-Z));
583 gp_Trsf aLocalTrsf(T*T1);
584 dout.SetTrsf(id,aLocalTrsf);
585 // dout.SetTrsf(id,T*T1);
586 dout.RepaintView(id);
587 }
588 return 0;
589 }
590
591 //=======================================================================
592 //function : dptv
593 //purpose :
594 //=======================================================================
595
dptv(Draw_Interpretor &,Standard_Integer n,const char ** a)596 static Standard_Integer dptv(Draw_Interpretor& , Standard_Integer n, const char** a)
597 {
598 Standard_Real DX,DY,DZ;
599 Standard_Integer start = 0;
600 Standard_Integer end = MAXVIEW-1;
601 if (n < 4) return 1;
602 if (n >= 5) {
603 Standard_Integer anid = ViewId(a[1]);
604 if (anid < 0) return 1;
605 start = end = anid;
606 DX = Draw::Atof(a[2]);
607 DY = Draw::Atof(a[3]);
608 DZ = Draw::Atof(a[4]);
609 }
610 else {
611 DX = Draw::Atof(a[1]);
612 DY = Draw::Atof(a[2]);
613 DZ = Draw::Atof(a[3]);
614 }
615
616 for (Standard_Integer id = start; id <= end; id++) {
617 gp_Trsf T;
618 dout.GetTrsf(id,T);
619 gp_Trsf T1;
620 T1.SetTranslationPart(gp_Vec(-DX,-DY,-DZ));
621 gp_Trsf M = T*T1;
622 dout.SetTrsf(id,M);
623 dout.RepaintView(id);
624 }
625 return 0;
626 }
627
628
629 //=======================================================================
630 //function : color
631 //purpose :
632 //=======================================================================
633
color(Draw_Interpretor & di,Standard_Integer n,const char ** a)634 static Standard_Integer color(Draw_Interpretor& di, Standard_Integer n, const char** a)
635 {
636 if (n < 3) {
637 Draw_BlackBackGround = !Draw_BlackBackGround;
638 }
639 else if (!dout.DefineColor(Draw::Atoi(a[1]),a[2])) {
640 di << "Could not allocate color "<<a[2]<<"\n";
641 return 1;
642 }
643 return 0;
644 }
645
646
647
648 //=======================================================================
649 //function : hardcopy
650 //purpose : hardcopy --> hardcopy of view 1
651 // in file a4.ps
652 // in format a4
653 // hardcopy name view --> hardcopy of view <view>
654 // in file <name>
655 // in format a4
656 // hardcopy name view format --> hardcopy of view <view>
657 // in file <name>
658 // in format <a4,a3,a2,a1,a0>
659 //=======================================================================
660
hardcopy(Draw_Interpretor &,Standard_Integer n,const char ** a)661 static Standard_Integer hardcopy(Draw_Interpretor& ,
662 Standard_Integer n, const char** a)
663 {
664 // Inch = 25.40001969 mm.
665 // 28.4 pixels / mm.
666 // format par default papier a4 210 297 mm avec marge de 3 mm.
667
668 Standard_Real rap = 28.4;
669 Standard_Real cad = 3;
670 Standard_Real dx = 210;
671 Standard_Real dy = 210 * Sqrt(2.);
672
673 Standard_Integer iview = 1;
674 const char* file = "a4.ps";
675 if (n >= 2) {
676 file = a[1];
677 if (n >= 3) {
678 iview = ViewId(a[2]);
679 if (iview < 0) return 1;
680 if (n >= 4) {
681 if (!strcmp(a[3],"a7")) {
682 cad = cad / (2 * Sqrt(2));
683 dx = dx / (2 * Sqrt(2));
684 dy = dy / (2 * Sqrt(2));
685 }
686 else if (!strcmp(a[3],"a6")) {
687 cad = cad / 2;
688 dx = dx / 2;
689 dy = dy / 2;
690 }
691 else if (!strcmp(a[3],"a5")) {
692 cad = cad / Sqrt(2);
693 dx = dx / Sqrt(2);
694 dy = dy / Sqrt(2);
695 }
696 else if (!strcmp(a[3],"a4")) {
697 // Do nothing
698 //cad == cad;
699 //dx == dx;
700 //dy == dy;
701 }
702 else if (!strcmp(a[3],"a3")) {
703 cad = cad * Sqrt(2);
704 dx = dx * Sqrt(2);
705 dy = dy * Sqrt(2);
706 }
707 else if (!strcmp(a[3],"a2")) {
708 cad = cad * 2;
709 dx = dx * 2;
710 dy = dy * 2;
711 }
712 else if (!strcmp(a[3],"a1")) {
713 cad = cad * 2 * Sqrt(2);
714 dx = dx * 2 * Sqrt(2);
715 dy = dy * 2 * Sqrt(2);
716 }
717 else if (!strcmp(a[3],"a0")) {
718 cad = cad * 4;
719 dx = dx * 4;
720 dy = dy * 4;
721 }
722 }
723 }
724 }
725
726 Standard_Integer pxmin = (Standard_Integer)(cad * rap);
727 Standard_Integer pymin = (Standard_Integer)(cad * rap);
728 Standard_Integer pxmax = (Standard_Integer)((dx - cad) * rap);
729 Standard_Integer pymax = (Standard_Integer)((dy - cad) * rap);
730
731 std::ofstream os(file);
732
733 Standard_Integer vxmin,vymin,vxmax,vymax;
734 if (dout.HasView(iview)) {
735 dout.GetFrame(iview,vxmin,vymin,vxmax,vymax);
736 Standard_Real kx = (Standard_Real) (pxmax - pxmin) / (vxmax - vxmin);
737 Standard_Real ky = (Standard_Real) (pymax - pymin) / (vymax - vymin);
738 Standard_Real k = Min(Abs(kx),Abs(ky));
739 kx = (kx > 0) ? k : -k;
740 ky = (ky > 0) ? k : -k;
741 pxmax = (Standard_Integer )( pxmin + kx * (vxmax - vxmin));
742 pymax = (Standard_Integer )( pymin + ky * (vymax - vymin));
743
744 // si on veut choisir l'orientation : 90 rotate
745
746 // ecriture du header
747
748 os << "%!PS-Adobe-3.0 EPSF-3.0\n";
749 os << "%%BoundingBox: " << pxmin << " " << pymin << " "
750 << pxmax << " " << pymax << "\n";
751 os << "%%Pages: 1\n";
752 os << "%%DocumentFonts: "<<Draw_fontname<<"\n";
753 os << "%%EndComments\n";
754
755 os << "/"<<Draw_fontname<<" findfont\n"<<Draw_fontsize<<" scalefont\nsetfont\n";
756 os << "/m {moveto} bind def\n";
757 os << "/l {lineto} bind def\n";
758 os <<".1 .1 scale\n";
759
760 // draw the frame
761
762 os <<"3 setlinewidth\n0 setgray\nnewpath\n";
763 os << pxmin << " " << pymin << " m\n";
764 os << pxmax << " " << pymin << " l\n";
765 os << pxmax << " " << pymax << " l\n";
766 os << pxmin << " " << pymax << " l\n";
767 os << "closepath\nstroke\n";
768
769 // frame the view
770
771 os <<"newpath\n";
772 os << pxmin << " " << pymin << " m\n";
773 os << pxmax << " " << pymin << " l\n";
774 os << pxmax << " " << pymax << " l\n";
775 os << pxmin << " " << pymax << " l\n";
776 os << "closepath\nclip\n";
777
778 dout.PostScriptView(iview,
779 vxmin,vymin,vxmax,vymax,
780 pxmin,pymin,pxmax,pymax,os);
781 os <<"showpage\n";
782 os <<"%%EOF\n";
783 }
784
785 return 0;
786 }
787
dfont(Draw_Interpretor & di,Standard_Integer n,const char ** a)788 static Standard_Integer dfont(Draw_Interpretor& di,
789 Standard_Integer n, const char** a)
790 {
791 if ( n == 1 ) {
792 strcpy(Draw_fontname, Draw_fontnamedefault);
793 strcpy(Draw_fontsize, Draw_fontsizedefault);
794 } else if ( n == 2 ) {
795 strcpy(Draw_fontname, a[1]);
796 } else if ( n == 3 ) {
797 strcpy(Draw_fontname, a[1]);
798 strcpy(Draw_fontsize, a[2]);
799 }
800 di<<Draw_fontname<<" "<<Draw_fontsize<<"\n";
801 return 0;
802 } // dfont
803
804 //=======================================================================
805 //function : hcolor
806 //purpose :
807 //=======================================================================
808
hcolor(Draw_Interpretor & di,Standard_Integer n,const char ** a)809 static Standard_Integer hcolor(Draw_Interpretor& di, Standard_Integer n, const char** a)
810 {
811 if (n < 4) {
812 di << "code de couleur (Draw.cxx) : \n" ;
813 di << "0 = White,\t 1 = Red,\t 2 = Green,\t 3 = Blue\n" ;
814 di << "4 = Cyan,\t 5 = Gold,\t 6 = Magenta,\t 7 = Maroon" << "\n" ;
815 di << "8 = Orange,\t 9 = Pink,\t 10 = Salmon,\t 11 = Violet\n" ;
816 di << "12 = Yellow,\t 13 = Khaki,\t 14 = Coral\n" ;
817 di << "1 <= width <= 11, 0 (noir) <= gray <= 1 (blanc)\n" ;
818 } else {
819 dout.PostColor(Draw::Atoi(a[1]),Draw::Atoi(a[2]),Draw::Atof(a[3]));
820 }
821 return 0;
822 }
823
824 //=======================================================================
825 //function : xwd
826 //purpose : xwd file from a view
827 //=======================================================================
828
829 extern void Draw_RepaintNowIfNecessary();
830
xwd(Draw_Interpretor &,Standard_Integer n,const char ** a)831 static Standard_Integer xwd(Draw_Interpretor& , Standard_Integer n, const char** a)
832 {
833 if (n < 2) return 1;
834
835 // enforce repaint if necessary
836 Draw_RepaintNowIfNecessary();
837
838 Standard_Integer id = 1;
839 const char* file = a[1];
840 if (n > 2) {
841 id = Draw::Atoi(a[1]);
842 file = a[2];
843 }
844 if (!dout.SaveView(id,file))
845 return 1;
846
847 return 0;
848 }
849
850 //=======================================================================
851 //function : grid
852 //purpose : Creation/Suppression d'une grille.
853 //=======================================================================
854
grid(Draw_Interpretor &,Standard_Integer NbArg,const char ** Arg)855 static Standard_Integer grid (Draw_Interpretor& , Standard_Integer NbArg, const char **Arg)
856 {
857 Standard_Real StepX, StepY, StepZ ;
858
859 switch (NbArg) {
860 case 1 :
861 StepX = DefaultGridStep ;
862 StepY = DefaultGridStep ;
863 StepZ = DefaultGridStep ;
864 break ;
865 case 2 :
866 StepX = Abs (Draw::Atof (Arg[1])) ;
867 StepY = Abs (Draw::Atof (Arg[1])) ;
868 StepZ = Abs (Draw::Atof (Arg[1])) ;
869 break ;
870 case 3 :
871 StepX = Abs (Draw::Atof (Arg[1])) ;
872 StepY = Abs (Draw::Atof (Arg[2])) ;
873 StepZ = Abs (Draw::Atof (Arg[2])) ;
874 break ;
875 case 4 :
876 StepX = Abs (Draw::Atof (Arg[1])) ;
877 StepY = Abs (Draw::Atof (Arg[2])) ;
878 StepZ = Abs (Draw::Atof (Arg[3])) ;
879 break ;
880 default :
881 return 1 ;
882 }
883
884 #ifdef HPUX
885 const char *temp = "grid";
886 #else
887 char temp1[] = "grid";
888 const char *temp = temp1;
889 #endif
890 Handle (Draw_Grid) Grille = Handle(Draw_Grid)::DownCast (Draw::Get(temp)) ;
891
892 Grille->Steps (StepX, StepY, StepZ) ;
893 dout.RepaintAll () ;
894
895 return 0 ;
896 }
897
898 //=======================================================================
899 //function : dflush
900 //purpose :
901 //=======================================================================
902
dflush(Draw_Interpretor &,Standard_Integer,const char **)903 static Standard_Integer dflush (Draw_Interpretor& , Standard_Integer, const char **)
904 {
905 dout.Flush();
906 return 0;
907 }
908
909 //=======================================================================
910 //function : dtext
911 //purpose :
912 //=======================================================================
913
dtext(Draw_Interpretor & di,Standard_Integer n,const char ** a)914 static Standard_Integer dtext(Draw_Interpretor& di, Standard_Integer n, const char** a)
915 {
916 gp_Pnt P;
917 Standard_Boolean is3d;
918 if (n == 2) {
919 Standard_Integer id,X,Y,b;
920 di << "Pick position with button 1, other button escape\n";
921 dout.Select(id,X,Y,b);
922 if (b != 1)
923 return 0;
924 Standard_Real z = dout.Zoom(id);
925 P.SetCoord((Standard_Real)X /z,(Standard_Real)Y /z,0);
926 gp_Trsf T;
927 dout.GetTrsf(id,T);
928 T.Invert();
929 P.Transform(T);
930 is3d = dout.Is3D(id);
931 }
932 else if (n >= 4) {
933 is3d = n > 4;
934 P.SetCoord(Draw::Atof(a[1]),Draw::Atof(a[2]),is3d ? Draw::Atof(a[3]) : 0);
935 }
936 else
937 return 0;
938
939 if (is3d) {
940 Handle(Draw_Text3D) D = new Draw_Text3D(P,a[n-1],Draw_vert);
941 dout << D;
942 }
943 else {
944 Handle(Draw_Text2D) D = new Draw_Text2D(gp_Pnt2d(P.X(),P.Y()),
945 a[n-1],Draw_vert);
946 dout << D;
947 }
948 return 0;
949 }
950
GraphicCommands(Draw_Interpretor & theCommands)951 void Draw::GraphicCommands(Draw_Interpretor& theCommands)
952 {
953 static Standard_Boolean Done = Standard_False;
954 if (Done) return;
955 Done = Standard_True;
956
957 const char* g = "DRAW Graphic Commands";
958 theCommands.Add("wclick","wait for a mouse click",
959 __FILE__,wclick,g);
960 theCommands.Add("zoom","zoom [view-id] z, or zoom z for all 3d views",
961 __FILE__,zoom,g);
962 theCommands.Add("2dzoom","2dzoom [view-id] z, or zoom2d z for all 2d views",
963 __FILE__,zoom,g);
964 theCommands.Add("wzoom","wzoom [view-id X1 Y1 X2 Y2]\n"
965 "- fits the contents of a given rectangle into a view window.\n"
966 "- The view window and rectangle corners are specified through the arguments\n"
967 "- or selected interactively by the user if no arguments are given",
968 __FILE__,wzoom,g);
969 theCommands.Add("view","view view-id type X(0) Y(0) W(500) H(500)",
970 __FILE__,view,g);
971 theCommands.Add("delete","delete [view-id]",
972 __FILE__,delview,g);
973 theCommands.Add("fit","fit [view-id]",
974 __FILE__,fit,g);
975 theCommands.Add("2dfit","2dfit [view-id]",
976 __FILE__,fit,g);
977 theCommands.Add("fu","fu [view-id], focal up",
978 __FILE__,focal,g);
979 theCommands.Add("fd","fd [view-id], focal down",
980 __FILE__,focal,g);
981 theCommands.Add("focal","focal [f]",
982 __FILE__,setfocal,g);
983 theCommands.Add("mu","mu [view-id], magnify up",
984 __FILE__,magnify,g);
985 theCommands.Add("2dmu","2dmu [view-id], magnify up",
986 __FILE__,magnify,g);
987 theCommands.Add("md","md [view-id], magnify down",
988 __FILE__,magnify,g);
989 theCommands.Add("2dmd","2dmd [view-id], magnify down",
990 __FILE__,magnify,g);
991 theCommands.Add("u","u [view-id], rotate up",
992 __FILE__,rotate,g);
993 theCommands.Add("d","d [view-id], rotate down",
994 __FILE__,rotate,g);
995 theCommands.Add("l","l [view-id], rotate left",__FILE__,rotate,g);
996 theCommands.Add("r","r [view-id], rotate right",__FILE__,rotate,g);
997 theCommands.Add("pu","pu [view-id], panning up",__FILE__,panning,g);
998 theCommands.Add("pd","pd [view-id], panning down",__FILE__,panning,g);
999 theCommands.Add("pl","pl [view-id], panning left",__FILE__,panning,g);
1000 theCommands.Add("pr","pr [view-id], panning right",__FILE__,panning,g);
1001 theCommands.Add("2dpu","2dpu [view-id], panning up",__FILE__,panning,g);
1002 theCommands.Add("2dpd","2dpd [view-id], panning down",__FILE__,panning,g);
1003 theCommands.Add("2dpl","2dpl [view-id], panning left",__FILE__,panning,g);
1004 theCommands.Add("2dpr","2dpr [view-id], panning right",__FILE__,panning,g);
1005 theCommands.Add("ptv","ptv [view-id], X , Y , Z",
1006 __FILE__,ptv,g);
1007 theCommands.Add("dptv","dptv [view-id], dX , dY , dZ",
1008 __FILE__,dptv,g);
1009 theCommands.Add("color","color i colorname, define color i",
1010 __FILE__,color,g);
1011 theCommands.Add("hardcopy","hardcopy [file = a4.ps] [view-id = 1] [format = a4]", __FILE__,hardcopy,g);
1012 theCommands.Add("xwd","xwd [id = 1] <filename>.{png|bmp|jpg|gif}\n\t\t: Dump contents of viewer window to PNG, BMP, JPEG or GIF file",
1013 __FILE__,xwd,g);
1014 theCommands.Add("hcolor","hcolor icol width gray (< 1, 0 black)",
1015 __FILE__,hcolor,g);
1016 theCommands.Add("grid", "grid [stepX(100) [stepY [stepZ]]] / 0",
1017 __FILE__,grid, g);
1018 theCommands.Add("dflush","dflush, flush the viewer",
1019 __FILE__,dflush,g);
1020 theCommands.Add("dtext","dtext [x y [z]] string",
1021 __FILE__,dtext,g);
1022 theCommands.Add("dfont","dfont [name size] : set name and size of Draw font, or reset to default",
1023 __FILE__,dfont,g);
1024 }
1025
1026