source: Sophya/trunk/SophyaPI/PIext/pistdimgapp.cc@ 2217

Last change on this file since 2217 was 2217, checked in by ansari, 23 years ago

MAJ numero de version piapp, correction ds l'ordre de prise en compte

des attributs graphiques par defaut entre le Drawer et le PIScDrawWdg et
le PI3DDrawWdg Reza 20/10/02

  • Property svn:executable set to *
File size: 48.1 KB
Line 
1#include "machdefs.h"
2#include <stdlib.h>
3#include <stdio.h>
4#include <string.h>
5
6#include <typeinfo>
7
8#include <string>
9#include <vector>
10
11#include "strutil.h"
12#include "timing.h"
13#include "perrors.h"
14#include "ctimer.h"
15
16#include "psighand.h"
17
18#include "cimage.h" // pour pouvoir faire extract
19
20#include "pistdimgapp.h"
21// #include "pihisto2d.h"
22#include "psfile.h"
23#include "piimgtools.h"
24#include "pidrwtools.h"
25#include "piaxestools.h"
26
27#include "pistzwin.h"
28
29#include "piinit.h"
30#include "piversion.h"
31#include "piaversion.h"
32
33
34static char ImgDir[256];
35static char WorkDir[256];
36// Initialiseur
37static PIAppInitiator * glst_piai = NULL;
38
39// Pour la creation de fenetre info (about piapp)
40static void createInfoWindow(PIStdImgApp* app);
41static void deleteInfoWindow();
42static void showInfoWindow(PIStdImgApp* app);
43static void hideInfoWindow(PIStdImgApp* app);
44
45
46/* ........................................................... */
47/* Classe SIA_RU__Periodic : mise a jour periodique de */
48/* la fenetre Stat/Ressource info */
49/* + execution de commande soumis de l'exterieur */
50/* ........................................................... */
51
52class SIA_RU__Periodic : public PIPeriodic
53{
54public:
55 SIA_RU__Periodic(PIStdImgApp* app);
56 virtual ~SIA_RU__Periodic();
57 virtual void DoPeriodic();
58private:
59 PIStdImgApp* _app;
60};
61
62SIA_RU__Periodic::SIA_RU__Periodic(PIStdImgApp* app)
63 : PIPeriodX(1)
64{
65 _app = app;
66}
67
68SIA_RU__Periodic::~SIA_RU__Periodic()
69{
70}
71
72void SIA_RU__Periodic::DoPeriodic()
73{
74 if (_app) {
75 _app->ExecuteExtCommand();
76 _app->UpdateStatResourceInfo();
77 }
78}
79
80/* ............................................................. */
81
82
83/* ........................................................... */
84/* Classe PIStdImgApp */
85/* ........................................................... */
86
87/* --Methode-- */
88PIStdImgApp::PIStdImgApp(int narg, char* arg[])
89: PIApplication(420, 320, narg, arg)
90{
91
92// Les menus
93m[0] = new PIMenu(Menubar(),"Fichier");
94m[0]->AppendItem("About piapp", 10150);
95m[0]->AppendItem("Open-Fits", 10120);
96m[0]->AppendItem("Open-PPF", 10130);
97// m[0]->AppendItem("Options", 10101);
98m[0]->AppendItem("Help", 10100);
99m[0]->AppendSeparator();
100m[0]->AppendItem("Exit", 10105);
101
102m[1] = new PIMenu(Menubar(),"Objets");
103m[1]->AppendItem("ObjectManager", 10201);
104m[1]->AppendItem("OpenOutPPF", 10220);
105m[1]->AppendItem("CloseOutPPF", 10230);
106m[1]->AppendItem("Delete CurWdg", 10270);
107
108m[2] = new PIMenu(Menubar(),"Tools");
109m[2]->AppendItem("Show ImageTools", 10301);
110m[2]->AppendItem("Show DrawerTools", 10302);
111m[2]->AppendItem("Show AxesTools", 10303);
112m[2]->AppendItem("CxxExecutorWindow", 10304);
113m[2]->AppendItem("Ext.Pave", 10311);
114m[2]->SetSensitivityMsg(10311, false);
115m[2]->AppendItem("Ext.Pave+Org", 10312);
116m[2]->SetSensitivityMsg(10312, false);
117m[2]->AppendItem("Cuts X,Y", 10313);
118m[2]->SetSensitivityMsg(10313, false);
119mc = new PIMenu(m[2], "StackTools");
120mc->AppendItem("DispNext", 10320);
121mc->AppendItem("Blink 0.5s", 10321);
122mc->AppendItem("Blink 1s", 10322);
123mc->AppendItem("Blink 2s", 10324);
124mc->AppendItem("Stop Blink", 10329);
125mc->AppendItem("RemoveCurrent", 10330);
126m[2]->AppendPDMenu(mc);
127m[2]->SetSensitivity("StackTools", false);
128
129m[3] = new PIMenu(Menubar(),"Window");
130m[3]->AppendItem("StackWindow", 10400);
131m[3]->AppendItem("Window", 10411);
132m[3]->AppendItem("Window 2x1", 10421);
133// m[3]->AppendItem("Window 1x2", 10412);
134m[3]->AppendItem("Window 2x2", 10422);
135// m[3]->AppendItem("Window 3x1", 10431);
136m[3]->AppendItem("Window 3x3", 10433);
137m[3]->AppendItem("Cur->LastWdg", 10441);
138m[3]->AppendItem("Close CurWin", 10460);
139m[3]->AppendCheckItem("StatZoomWin", 10470);
140m[3]->SetStateMsg(10470, true);
141
142m[4] = new PIMenu(Menubar(),"PostScript");
143m[4]->AppendItem("OpenPS", 10501);
144m[4]->AppendItem("ClosePS", 10505);
145m[4]->AppendItem("Window->PS", 10511);
146m[4]->AppendItem("Image->PS", 10515);
147m[4]->AppendItem("Window->EPS", 10512);
148m[4]->AppendItem("Image->EPS", 10516);
149m[4]->SetSensitivityMsg(10515, false);
150m[4]->SetSensitivityMsg(10516, false);
151
152m[5] = new PIMenu(Menubar(),"Special");
153m[5]->AppendItem("CloseAll", 10601);
154m[5]->AppendCheckItem("Red.Out/Err", 10602);
155m[5]->AppendCheckItem("Catch SigFPE", 10603);
156m[5]->AppendCheckItem("Catch SigSEGV", 10604);
157m[5]->AppendCheckItem("ObjMgr Verb", 10605);
158m[5]->AppendItem("CxxExecOption", 10606);
159
160m[6] = new PIMenu(Menubar(),"Modules");
161
162AppendMenu(m[0]);
163AppendMenu(m[1]);
164AppendMenu(m[2]);
165AppendMenu(m[3]);
166AppendMenu(m[4]);
167AppendMenu(m[5]);
168// AppendMenu(m[6]); Menu Modules vide pour le moment
169
170int scsx, scsy;
171ScreenSize(scsx, scsy);
172if (scsy <= 600) mFgScSz = 0;
173else if (scsy <= 800) mFgScSz = 1;
174else if (scsy <= 1024) mFgScSz = 2;
175else mFgScSz = 3;
176int msx = 420+mFgScSz*60;
177int msy = 320+mFgScSz*40;
178MainWin()->SetSize(msx, msy);
179
180//------------------------------------------------------
181// On cree un container intermediaire permettant de gerer
182// le widget zoom, colormap, stats, ...
183
184int bss = 100+mFgScSz*15;
185
186int statc_szy = bss+10+14+mFgScSz*2+5;
187statcont = new PIContainer(MainWin(), "ZGCSCont", msx, statc_szy, 0, 0);
188statcont->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_fixed, PIBK_free);
189
190gimv = new PIPixmap(statcont, "GloV", bss, bss, 5, 5);
191gimv->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_free, PIBK_free);
192zoom = new PIPixmap(statcont, "Zoom", bss, bss, bss+10, 5);
193zoom->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_free, PIBK_free);
194cmapv = new PICMapView(statcont, "CMapView", msx-10, 14+mFgScSz*2, 5, bss+10);
195cmapv->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_fixed, PIBK_free);
196
197// Widget pour affichage des stats / ressources
198lab_mem = new PILabel(statcont, "memlab", msx-2*(bss+20), 20, 2*bss+20, 10);
199lab_mem->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_fixed, PIBK_free);
200lab_mem->SetLabel("MemoryUsage");
201lab_mem->SetForegroundColor(PI_Red);
202lab_mem->SetBorderWidth(1);
203therm_mem = new PIThermometer(statcont, "memtherm", msx-2*(bss+20), 20, 2*bss+20, 35);
204therm_mem->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_fixed, PIBK_free);
205therm_mem->SetThreshold(0.5, 0.75);
206
207lab_cpu = new PILabel(statcont, "cpulab", msx-2*(bss+20), 20, 2*bss+20, 60);
208lab_cpu->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_fixed, PIBK_free);
209lab_cpu->SetLabel("CPUUsage");
210lab_cpu->SetForegroundColor(PI_Black);
211lab_cpu->SetBorderWidth(1);
212therm_cpu = new PIThermometer(statcont, "cputherm", msx-2*(bss+20), 20, 2*bss+20, 85);
213therm_cpu->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_fixed, PIBK_free);
214therm_cpu->SetThreshold(0.75, 0.90);
215
216 fg_exc_cmd = false;
217UpdateStatResourceInfo();
218resupd_periodic = new SIA_RU__Periodic(this);
219//resupd_periodic->SetIntervalms(500);
220resupd_periodic->Start();
221
222statcont->Show();
223// StatZoomWindowSetVisible(true);
224//------------------------------------------------------
225
226//int cpy = bss+10+14+mFgScSz*2+5;
227int cpy = statc_szy;
228
229// Creation d'une console avec gestion des commandes
230consolecont = new PIContainer(MainWin(), "ConsoleCont", msx, msy-cpy, 0, cpy );
231consolecont->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_fixed, PIBK_fixed);
232mCons = new PIConsole(consolecont, "Console", 30200, 512, 132, msx, msy-cpy, 0, 0 );
233mCons->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_fixed, PIBK_fixed);
234mCons->AcceptCmd(true, 50);
235consolecont->Show();
236redirecout = false;
237// RedirectStdOutErr(true); pas par defaut
238
239mObjMgr = new NamedObjMgr;
240mCmd = new PIACmd(mObjMgr, this);
241
242// Pas trop de message de la part de NamedObjMgr
243m[5]->SetStateMsg(10605, false);
244mObjMgr->SetVerbose(false);
245
246char* varenv;
247ImgDir[0] = WorkDir[0] = '\0';
248if ( (varenv=getenv("PEIDA_IMAGES")) != NULL ) strncpy(ImgDir, varenv, 256);
249if ( (varenv=getenv("PEIDA_WORK")) != NULL ) strncpy(WorkDir, varenv, 256);
250
251pfc_fits = new PIFileChooser(this,"FITS-FileChooser", 10125);
252pfc_ppf = new PIFileChooser(this,"PPF-FileChooser", 10135);
253pfc_ps = new PIFileChooser(this,"PS-FileChooser", 10525);
254
255mObjmgrw = new ObjMgrWind(this);
256mPpinmgrw = new PPInMgrWind(this);
257
258// Attention : A faire apres creation de ObjMgrWind !!!
259mObjMgr->SetImgApp(this);
260
261// Gestion des feneteres widgets et drawers
262mWId = mDId = mBWId = 0;
263mCurWin = NULL;
264mCurWdg = NULL;
265mLastWdg = NULL;
266mGrW = NULL;
267mStW = NULL;
268mGrIdx = mStIdx = -1;
269
270mFCMsg = 0;
271mFgCWImg = false;
272
273// Gestion fichiers PS
274num_eps = 0;
275name_ps = "";
276name_ps = "pia.ps";
277mpsfile = new PSFile(name_ps.c_str(),PI_Portrait, PI_A4, 2., 2.);
278
279// Gestion OUT-PPF
280mPpfout = NULL;
281name_outppf = "";
282
283// Attributs graphiques courants
284mAxesFlags = kBoxAxes | kExtTicks | kLabels;
285SetInsetLimits(0.4, 0.6, 0.4, 0.6);
286mAddTitle = true;
287
288// Initialisation
289glst_piai = new PIAppInitiator(this);
290
291char buff[128];
292mCons->AddStr(" ............ starting piapp .............\n", PIVA_Blue );
293#ifdef SANS_EVOLPLANCK
294sprintf(buff, "Version: piapp=%g PI=%g PEIDA=%g \n", (double)PIAPP_VERSIONNUMBER,
295 (double)PI_VERSIONNUMBER, (float)PeidaVersion());
296#else
297sprintf(buff, "Version: piapp=%g PI=%g SOPHYA=%g \n", (double)PIAPP_VERSIONNUMBER,
298 (double)PI_VERSIONNUMBER, glst_piai->Version());
299#endif
300mCons->AddStr(buff, PIVA_Blue );
301mCons->AddStr(" ..........................................\n", PIVA_Blue );
302// PrintPeidaVersion();
303
304pfc_fits->SetPath(ImgDir);
305pfc_ppf->SetPath(WorkDir);
306pfc_ps->SetPath(WorkDir);
307
308SetReady();
309}
310
311/* --Methode-- */
312PIStdImgApp::~PIStdImgApp()
313{
314int i;
315
316// On inactive la fenetre principale
317// Sinon, ca peut provoquer un SEGV ds delete de console ?? - Reza 07/2000
318MainWin()->Hide();
319
320// Destrucion de tous les objets de NameObjMgr
321string patt = "/*/*";
322mObjMgr->DelObjects(patt, true);
323
324delete mc;
325for(i=0; i<7; i++)
326 if (m[i]) delete m[i];
327
328WindMList::iterator it;
329for(it = mWList.begin(); it != mWList.end(); it++) delete (*it).second;
330
331delete mObjMgr;
332delete mCmd;
333
334delete zoom;
335delete gimv;
336delete cmapv;
337
338delete lab_mem;
339delete therm_mem;
340delete lab_cpu;
341delete therm_cpu;
342
343delete statcont;
344
345delete pfc_fits;
346delete pfc_ppf;
347delete pfc_ps;
348
349delete mCons;
350delete consolecont;
351
352delete mObjmgrw;
353delete mPpinmgrw;
354
355deleteInfoWindow();
356
357// Les fichiers
358if (mpsfile) delete mpsfile;
359if (mPpfout) delete mPpfout;
360
361if (resupd_periodic) delete resupd_periodic;
362
363if (glst_piai) delete glst_piai; glst_piai = NULL;
364
365}
366
367/* --Methode-- */
368void PIStdImgApp::Process(PIMessage msg, PIMsgHandler* sender, void* data)
369{
370PIWdg *sndw;
371PIMessage tmsg, smm;
372
373tmsg = msg;
374msg = UserMsg(msg);
375smm = ModMsg(tmsg);
376
377//printf("SuperDebug: msg=%d Mod=%d State=%d\n", (int)msg, (int)smm, (int)GetState());
378if ((GetState()) && (msg != mFCMsg)) { PIBeep(); return; }
379
380// Messages active-window
381if (smm == PIMsg_Active)
382 {
383 sndw = dynamic_cast<PIWdg *>(sender);
384 switch(sndw->kind())
385 {
386 case PIWindow::ClassId :
387 mCurWin = dynamic_cast<PIWindow *>(sndw);
388 break;
389
390 case PIScDrawWdg::ClassId :
391 case PIDraw3DWdg::ClassId :
392 mCurWdg = dynamic_cast<PIBaseWdg *>(sender);
393// cerr << "*DBG11* ImgTools -> NonSensitive " << sndw->kind() << endl;
394 if (mFgCWImg) {
395// cerr << "*DBG* ImgTools -> NonSensitive " << endl;
396 m[2]->SetSensitivityMsg(10311, false);
397 m[2]->SetSensitivityMsg(10312, false);
398 m[2]->SetSensitivityMsg(10313, false);
399 m[4]->SetSensitivityMsg(10515, false);
400 m[4]->SetSensitivityMsg(10516, false);
401 mFgCWImg = false;
402 }
403 break;
404 case PIImage::ClassId :
405 mCurWdg = dynamic_cast<PIBaseWdg *>(sender);
406 if (!mFgCWImg) {
407// cerr << "*DBG* ImgTools -> Sensitive " << endl;
408 m[2]->SetSensitivityMsg(10311, true);
409 m[2]->SetSensitivityMsg(10312, true);
410 m[2]->SetSensitivityMsg(10313, true);
411 m[4]->SetSensitivityMsg(10515, true);
412 m[4]->SetSensitivityMsg(10516, true);
413 mFgCWImg = true;
414 }
415 break;
416 /*
417 default :
418 mCurWdg = NULL;
419 if (mFgCWImg) {
420 m[2]->SetSensitivityMsg(10311, false);
421 m[2]->SetSensitivityMsg(10312, false);
422 m[2]->SetSensitivityMsg(10313, false);
423 m[4]->SetSensitivityMsg(10515, false);
424 m[4]->SetSensitivityMsg(10516, false);
425 mFgCWImg = false;
426 }
427 break;
428 */
429 }
430 }
431// Message window-close
432else if (smm == PIMsg_Close)
433 {
434 sndw = (PIWdg *)sender;
435 if(sndw->kind() == PIWindow::ClassId)
436 {
437 mCurWin = (PIWindow *)sender;
438 if (mCurWin == mStW) m[2]->SetSensitivity("StackTools", false);
439 DeleteWindow(mCurWin);
440 }
441 else
442 printf("PIStdImgApp/Bug ? CloseMsd received from NonWindow (%d %d %lx) \n",
443 (int)tmsg, (int)sndw->kind(), (long)sender);
444 }
445
446// Traitement des messages des menus
447else if ( (msg >= 10100) && (msg < 10200) ) MBProcess1(msg, sender, data);
448else if ( (msg >= 10200) && (msg < 10300) ) MBProcess2(msg, sender, data);
449else if ( (msg >= 10300) && (msg < 10400) ) MBProcess3(msg, sender, data);
450else if ( (msg >= 10400) && (msg < 10500) ) MBProcess4(msg, sender, data);
451else if ( (msg >= 10500) && (msg < 10600) ) MBProcess5(msg, sender, data);
452else if ( (msg >= 10600) && (msg < 10700) ) MBProcess6(msg, sender, data);
453else if ( msg == 30200 ) { // Objet PIConsole
454 string s = mCons->GetCmdString();
455 // string s2 = "\nExecuting " + s + "\n";
456 mCons->AddStr("Cmd> ", PIVA_Blue, false);
457 // s2 = s + "\n";
458 mCons->AddStr(s.c_str(), PIVA_Blue|PIVA_Bold, false);
459 mCons->AddChar('\n', PIVA_Def, true);
460 SetBusy();
461#ifdef SANS_EVOLPLANCK
462 TRY {
463 mCmd->Interpret(s);
464 } CATCH(merr) {
465 fflush(stdout);
466 cout << endl;
467 cerr << endl;
468 string es = PeidaExc(merr);
469 cerr << "PIStdImgApp::Process()/ Cmd->Do() Exception :" << es << " (" << merr << ")" << endl ;
470 }
471#else
472 try {
473 mCmd->Interpret(s);
474 }
475 catch ( PThrowable & exc ) {
476 cerr << "\n PIStdImgApp::Process()/ Cmd->Interpret() Exception :"
477 << (string)typeid(exc).name() << " Msg= "
478 << exc.Msg() << endl;
479 cout << endl;
480 }
481 catch ( ... ) {
482 cerr << "\n PIStdImgApp::Process()/ Cmd->Interpret() Catched Exception ..."
483 << endl;
484 cout << endl;
485 }
486
487#endif
488 SetReady();
489 }
490
491else printf("PIStdImgApp::Process() BUG?? Msg %d (%d-%d) \n",
492 (int)tmsg,(int)msg,(int)smm);
493
494
495return;
496}
497
498/* --Methode-- */
499void PIStdImgApp::SetReady()
500{
501mCons->SetSensitive();
502gimv->SetSensitive();
503PIApplication::SetReady();
504}
505
506/* --Methode-- */
507void PIStdImgApp::SetBusy()
508{
509mCons->SetUnSensitive();
510gimv->SetUnSensitive();
511PIApplication::SetBusy();
512// Attention : Appel XSync specifique X11 - en attendant multi-thread
513XSync(PIXDisplay(), False);
514}
515
516/* --Methode-- */
517void PIStdImgApp::SetBlocked()
518{
519mCons->SetUnSensitive();
520gimv->SetUnSensitive();
521PIApplication::SetBlocked();
522// Attention : Appel XSync specifique X11 - en attendant multi-thread
523XSync(PIXDisplay(), False);
524}
525
526
527/* --Methode-- */
528int PIStdImgApp::DispImage(P2DArrayAdapter* nouv, string const & name, string const& sop, int oid)
529{
530PIImage* pii;
531PIWindow* win;
532int sx, sy, px, py, flag;
533
534if (nouv == NULL)
535 {
536 printf("PIStdImgApp::DispImage_Error Cannot Display NULL image \n");
537 return(-1);
538 }
539
540if ( (nouv->XSize() <= 0) || (nouv->YSize() <= 0))
541 {
542 printf("PIStdImgApp::DispImage_Error Pb Size Sz=%d*%d \n",
543 nouv->XSize(), nouv->YSize());
544 return(-1);
545 }
546
547// On decode les options graphiques
548vector<string> opts;
549DispWinEnum dwopt = ParseDisplayOption(sop, opts);
550
551// Pas de same ou inset pour DispImage
552if ((dwopt == Disp_Same) || (dwopt == Disp_Inset) ) dwopt = Disp_Next;
553
554// Choix de la taille de fenetre
555#define MINPIIMGSIZE 100
556sx = (nouv->XSize() > MINPIIMGSIZE) ? nouv->XSize() : MINPIIMGSIZE;
557sy = (nouv->YSize() > MINPIIMGSIZE) ? nouv->XSize() : MINPIIMGSIZE;
558if (sx > 400+mFgScSz*100) sx = 400+mFgScSz*100;
559if (sy > 400+mFgScSz*100) sy = 400+mFgScSz*100;
560px = py = 0;
561win = GetWindow(dwopt, sx, sy, px, py, flag, (char *)name.c_str());
562pii = new PIImage(win, (char *)name.c_str(), sx, sy, px,py);
563pii->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
564pii->SetZoomWin(zoom, false);
565pii->SetGloVWin(gimv, false);
566pii->SetCMapWin(cmapv, false);
567pii->ShowCursor(true);
568pii->SetUserData(NULL, oid);
569
570
571// On recalcule la taille de la fenetre si Disp_Win
572if (dwopt == Disp_Win) {
573 int sx2 = (int)((float)nouv->XSize()*pii->GetZoomF());
574 int sy2 = (int)((float)nouv->YSize()*pii->GetZoomF());
575
576 if (sx2 > 400+mFgScSz*100) sx2 = 400+mFgScSz*100;
577 if (sy2 > 400+mFgScSz*100) sy2 = 400+mFgScSz*100;
578 if (sx2 < MINPIIMGSIZE) sx = MINPIIMGSIZE;
579 if (sy2 < MINPIIMGSIZE) sy = MINPIIMGSIZE;
580 if ((sx2 != sx) || (sy2 != sy)) win->SetSize(sx2, sy2);
581}
582
583pii->SetImage(nouv, true, false);
584
585// decode des options en chaine de caracteres
586if (mAxesAtt.size() > 0)
587 pii->DecodeOptionString(mAxesAtt, false); // Les options d'axe
588if (mDefaultAtt.size() > 0)
589 pii->DecodeOptionString(mDefaultAtt, false); // d'abord les options par defaut
590if (opts.size() > 0)
591 pii->DecodeOptionString(opts); // ensuite, les options specifies en argument
592
593// printf("!!DBG!! PIImage Pos= %d %d Size= %d %d \n", pii->XPos(), pii->YPos(), pii->XSize(), pii->YSize() );
594mCurWin = win;
595mCurWdg = pii;
596mLastWdg = pii;
597mBWId++;
598mBWList[mBWId] = pii;
599// pii->Refresh();
600pii->Apply();
601cmapv->Refresh();
602return(mBWId);
603}
604
605
606/* --Methode-- */
607int PIStdImgApp::DispScDrawer(PIDrawer* scd, string const & name, string const& sop,
608 string title, int oid)
609{
610if (scd == NULL)
611 {
612 printf("PIStdImgApp::DispScDrawer_Error Cannot Add NULL ScDrawer \n");
613 return(-1);
614 }
615
616// On decode les options graphiques
617vector<string> opts;
618DispWinEnum dwopt = ParseDisplayOption(sop, opts);
619if ( (!mLastWdg) && ( (dwopt == Disp_Same) || (dwopt == Disp_Inset) ) ) dwopt = Disp_Next;
620// Trace en superpoistion
621if ( (dwopt == Disp_Same) && (mLastWdg) ) {
622 // Les options
623 scd->DecodeOptionString(mDefaultAtt, false);
624 scd->DecodeOptionString(opts, true);
625
626 if (mLastWdg->kind() == PIScDrawWdg::ClassId) ((PIScDrawWdg*)mLastWdg)->AddScDrawer(scd, true);
627 else mLastWdg->AddDrawer(scd, true, true, true);
628 scd->Refresh();
629 mDId++;
630 mDrwList[mDId] = scd;
631 return(-mDId);
632}
633// Trace en medaillon
634else if ( (dwopt == Disp_Inset) && (mLastWdg) ) {
635 PIGrCoord x1, x2, y1, y2;
636 x1 = mIXmin; x2 = mIXmax;
637 y2 = 1.-mIYmin; y1 = 1.-mIYmax;
638 // Les options
639 scd->DecodeOptionString(mDefaultAtt, false);
640 scd->DecodeOptionString(opts, true);
641
642 scd->SetAxesFlags(mAxesFlags);
643 scd->UpdateLimits();
644 mLastWdg->AddDrawer(scd, x1, y1, x2, y2, true, false, true);
645 scd->Refresh();
646 mDId++;
647 mDrwList[mDId] = scd;
648 return(-mDId);
649}
650
651// Creation d'un nouveau PIScDrawWdg
652PIWindow* win;
653PIScDrawWdg* scw;
654int sx, sy, px, py, flag;
655sx = 200+mFgScSz*100;
656sy = 200+mFgScSz*100;
657win = GetWindow(dwopt, sx, sy, px, py, flag, (char *)name.c_str());
658
659scw = new PIScDrawWdg(win, (char *)name.c_str(), sx, sy, px, py);
660scw->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
661scw->SetUserData(NULL, oid);
662
663// Decodage des options :
664vector<string> scwatt;
665scw->SetAxesFlags(mAxesFlags);
666if ( mDefaultAtt.size() > 0) {
667 scwatt = mDefaultAtt;
668 scd->DecodeOptionString(scwatt, true);
669 scw->DecodeOptionString(scwatt, true);
670}
671if ( mAxesAtt.size() > 0) {
672 scwatt = mAxesAtt;
673 scw->DecodeOptionString(scwatt, true);
674}
675if (opts.size() > 0)
676 scd->DecodeOptionString(opts, true);
677if (opts.size() > 0)
678 scw->DecodeOptionString(opts, false);
679
680// Titre du plot
681if (mAddTitle) {
682 if (title.length() <= 0) title = name; string t2="";
683 scw->SetTitles(title, t2);
684}
685
686scw->AddScDrawer(scd, true);
687// scw->Refresh(); ? Pas necessaire Reza 19/08/98, 05/05/99 $CHECK$
688
689mCurWin = win;
690mCurWdg = scw;
691mLastWdg = scw;
692mBWId++;
693mBWList[mBWId] = scw;
694return(mBWId);
695}
696
697/* --Methode-- */
698int PIStdImgApp::Disp3DDrawer(PIDrawer3D* dr3, string const & name, string const& sop,
699 string title, int oid)
700{
701if (dr3 == NULL)
702 {
703 printf("PIStdImgApp::Disp3DDrawer_Error Cannot Add NULL 3DDrawer \n");
704 return(-1);
705 }
706
707// On decode les options graphiques
708vector<string> opts;
709DispWinEnum dwopt = ParseDisplayOption(sop, opts);
710
711if ( (!mLastWdg) && ( (dwopt == Disp_Same) || (dwopt == Disp_Inset) ) ) dwopt = Disp_Next;
712// Trace en superpoistion
713if ( (dwopt == Disp_Same) && (mLastWdg) ) {
714 // Les options
715 dr3->DecodeOptionString(mDefaultAtt, false);
716 dr3->DecodeOptionString(opts, true);
717
718 if (mLastWdg->kind() == PIDraw3DWdg::ClassId) ((PIDraw3DWdg*)mLastWdg)->AddDrawer3D(dr3, true);
719 else mLastWdg->AddDrawer(dr3, true, true, true);
720 dr3->Refresh();
721 mDId++;
722 mDrwList[mDId] = dr3;
723 return(-mDId);
724}
725// Trace en medaillon
726else if ( (dwopt == Disp_Inset) && (mLastWdg) ) {
727 PIGrCoord x1, x2, y1, y2;
728 x1 = mIXmin; x2 = mIXmax;
729 y2 = 1.-mIYmin; y1 = 1.-mIYmax;
730 // Les options
731 dr3->DecodeOptionString(mDefaultAtt, false);
732 dr3->DecodeOptionString(opts, true);
733
734 dr3->SetAxesFlags(mAxesFlags);
735 dr3->UpdateLimits();
736 mLastWdg->AddDrawer(dr3, x1, y1, x2, y2, true, false, true);
737 dr3->Refresh();
738 mDId++;
739 mDrwList[mDId] = dr3;
740 return(-mDId);
741}
742
743
744PIWindow* win;
745int sx, sy, px, py, flag;
746sx = 200+mFgScSz*100;
747sy = 200+mFgScSz*100;
748win = GetWindow(dwopt, sx, sy, px, py, flag, (char *)name.c_str());
749PIDraw3DWdg* wd3 = new PIDraw3DWdg(win, (char *)name.c_str(), sx, sy, px, py);
750wd3->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
751wd3->SetUserData(NULL, oid);
752
753// Decodage des options :
754vector<string> scwatt;
755// wd3->SetAxesFlags(mAxesFlags); Attributs d'axes 3D a faire
756if ( mDefaultAtt.size() > 0) {
757 scwatt = mDefaultAtt;
758 dr3->DecodeOptionString(scwatt, true);
759 wd3->DecodeOptionString(scwatt, true);
760}
761if ( mAxesAtt.size() > 0) {
762 scwatt = mAxesAtt;
763 wd3->DecodeOptionString(scwatt, true);
764}
765if (opts.size() > 0)
766 dr3->DecodeOptionString(opts, true);
767if (opts.size() > 0)
768 wd3->DecodeOptionString(opts, false);
769
770// Titre du plot
771if (mAddTitle) {
772 if (title.length() <= 0) title = name; string t2="";
773 wd3->SetTitles(title, t2);
774}
775
776wd3->AddDrawer3D(dr3, true);
777// wd3->Refresh(); ?Pas necessaire $CHECK$ 05/05/99
778
779mCurWin = win;
780mCurWdg = wd3;
781mLastWdg = wd3;
782mBWId++;
783mBWList[mBWId] = wd3;
784return(mBWId);
785}
786
787/* --Methode-- */
788int PIStdImgApp::ExecuteExtCommand()
789{
790if (!fg_exc_cmd) return(0);
791else {
792 fg_exc_cmd = false;
793 return CmdInterpreter()->Interpret(exc_command);
794 }
795}
796
797/* --Methode-- */
798void PIStdImgApp::AddText(string const & txt, double xp, double yp, string const& sop)
799{
800PIDrawer *eld=CurrentElDrawer();
801if (eld == NULL) return;
802PIElDrawer* eld2 = dynamic_cast<PIElDrawer *>(eld);
803PIElDrawer3D* eld3 = dynamic_cast<PIElDrawer3D *>(eld);
804if ((eld2 == NULL) && (eld3 == NULL)) return;
805PIElDrwMgr* elmgr;
806if (eld2) elmgr = &(eld2->ElDrwMgr());
807else if (eld3) elmgr = &(eld3->ElDrwMgr());
808if (elmgr == NULL) return;
809
810vector<string> opts;
811ParseDisplayOption(sop, opts);
812PIGraphicAtt gratt(opts);
813elmgr->ElAddText(xp,yp,txt.c_str(), gratt);
814eld->Refresh();
815}
816
817/* --Methode-- */
818void PIStdImgApp::AddLine(double xp1, double yp1, double xp2, double yp2, string const& sop)
819{
820PIDrawer *eld=CurrentElDrawer();
821if (eld == NULL) return;
822PIElDrawer* eld2 = dynamic_cast<PIElDrawer *>(eld);
823PIElDrawer3D* eld3 = dynamic_cast<PIElDrawer3D *>(eld);
824if ((eld2 == NULL) && (eld3 == NULL)) return;
825PIElDrwMgr* elmgr = NULL;
826if (eld2) elmgr = &(eld2->ElDrwMgr());
827else if (eld3) elmgr = &(eld3->ElDrwMgr());
828if (elmgr == NULL) return;
829
830vector<string> opts;
831ParseDisplayOption(sop, opts);
832PIGraphicAtt gratt(opts);
833elmgr->ElAddLine(xp1, yp1, xp2, yp2, gratt);
834eld->Refresh();
835}
836
837/* --Methode-- */
838void PIStdImgApp::AddRectangle(double xp1, double yp1, double xp2, double yp2,
839 string const& sop, bool fgfill)
840{
841PIDrawer *eld=CurrentElDrawer();
842if (eld == NULL) return;
843PIElDrawer* eld2 = dynamic_cast<PIElDrawer *>(eld);
844PIElDrawer3D* eld3 = dynamic_cast<PIElDrawer3D *>(eld);
845if ((eld2 == NULL) && (eld3 == NULL)) return;
846PIElDrwMgr* elmgr = NULL;
847if (eld2) elmgr = &(eld2->ElDrwMgr());
848else if (eld3) elmgr = &(eld3->ElDrwMgr());
849
850double xp,yp;
851double dx, dy;
852if (xp1 < xp2) {
853 xp = xp1; dx = xp2-xp1;
854}
855else {
856 xp = xp2; dx = xp1-xp2;
857}
858if (yp1 < yp2) {
859 yp = yp1; dy = yp2-yp1;
860}
861else {
862 yp = yp2; dy = yp1-yp2;
863}
864
865vector<string> opts;
866ParseDisplayOption(sop, opts);
867PIGraphicAtt gratt(opts);
868
869if (fgfill) elmgr->ElAddFRect(xp, yp, dx, dy, gratt);
870else elmgr->ElAddRect(xp, yp, dx, dy, gratt);
871eld->Refresh();
872}
873
874/* --Methode-- */
875void PIStdImgApp::AddCircle(double xc, double yc, double r, string const& sop, bool fgfill)
876{
877PIDrawer *eld=CurrentElDrawer();
878if (eld == NULL) return;
879PIElDrawer* eld2 = dynamic_cast<PIElDrawer *>(eld);
880PIElDrawer3D* eld3 = dynamic_cast<PIElDrawer3D *>(eld);
881if ((eld2 == NULL) && (eld3 == NULL)) return;
882PIElDrwMgr* elmgr = NULL;
883if (eld2) elmgr = &(eld2->ElDrwMgr());
884else if (eld3) elmgr = &(eld3->ElDrwMgr());
885
886vector<string> opts;
887ParseDisplayOption(sop, opts);
888PIGraphicAtt gratt(opts);
889
890if (fgfill) elmgr->ElAddFCirc(xc, yc, r, gratt);
891else elmgr->ElAddCirc(xc, yc, r, gratt);
892eld->Refresh();
893}
894
895/* --Methode-- */
896void PIStdImgApp::SetTitle(string const & titletop, string const & titlebottom, string const& sop)
897{
898PIDrawer *eld=CurrentElDrawer();
899if (eld == NULL) return;
900PIElDrawer* eld2 = dynamic_cast<PIElDrawer *>(eld);
901PIElDrawer3D* eld3 = dynamic_cast<PIElDrawer3D *>(eld);
902if ((eld2 == NULL) && (eld3 == NULL)) return;
903
904vector<string> opts;
905ParseDisplayOption(sop, opts);
906PIGraphicAtt gratt(opts);
907
908if (eld2) {
909 eld2->SetTitles(titletop, titlebottom, gratt);
910 eld2->ShowTitles(true);
911}
912else if (eld3) {
913 eld3->SetTitles(titletop, titlebottom, gratt);
914 eld3->ShowTitles(true);
915}
916eld->Refresh();
917}
918/* --Methode-- */
919void PIStdImgApp::SetAxeLabels(string const & xLabel, string const & yLabel, string const& sop)
920{
921PIDrawer *eld=CurrentElDrawer();
922if (eld == NULL) return;
923PIElDrawer* eld2 = dynamic_cast<PIElDrawer *>(eld);
924if (eld2 == NULL) return;
925
926vector<string> opts;
927ParseDisplayOption(sop, opts);
928PIGraphicAtt gratt(opts);
929
930eld2->SetAxesLabels(xLabel, yLabel, gratt);
931eld2->ShowAxesLabels(true);
932
933eld->Refresh();
934}
935
936/* --Methode-- */
937PIDrawer* PIStdImgApp::CurrentElDrawer()
938{
939PIDrawer *eld=NULL;
940if (!mLastWdg) return(eld);
941PIScDrawWdg* sdw=NULL;
942PIDraw3DWdg* w3d=NULL;
943PIImage* imgw;
944switch(mLastWdg->kind()) {
945 case PIScDrawWdg::ClassId :
946 sdw = dynamic_cast<PIScDrawWdg *>(mLastWdg);
947 if (sdw) eld = sdw->BaseDrawer();
948 break;
949 case PIDraw3DWdg::ClassId :
950 w3d = dynamic_cast<PIDraw3DWdg *>(mLastWdg);
951 if (w3d) eld = w3d->BaseDrawer();
952 break;
953 case PIImage::ClassId :
954 imgw = dynamic_cast<PIImage *>(mLastWdg);
955 if (imgw) eld = imgw->BaseDrawer();
956 break;
957 default :
958 break;
959 }
960return(eld);
961}
962
963/* --Methode-- */
964void PIStdImgApp::CreateGraphWin(int nx, int ny, int sx, int sy)
965{
966if (nx < 1) nx = 1;
967if (ny < 1) ny = 1;
968if (nx > 8) nx = 8;
969if (ny > 8) ny = 8;
970if ( (sx < 50) && (sy < 50) ) sx = sy = 400+mFgScSz*100;
971char buff[64];
972mWId++;
973int px, py;
974MainWin()->GetScreenPos(px, py);
975sprintf(buff, "PI-GraphicWin (%d)",mWId);
976PIZoneWindow* win = new PIZoneWindow(this, buff, PIWK_normal, nx, ny, sx, sy, px+MainWin()->XSize()+30, 0);
977win->SetUserData(NULL, ny*10+nx); // UserFlag= nY*10 + nX
978mWList[mWId*10+1] = (PIWindow*)win;
979win->SetAutoDelChilds(true);
980// win->Show();
981mGrW = win;
982mGrIdx = 0;
983}
984
985/* --Methode-- */
986void PIStdImgApp::CreateStackWin(int sx, int sy)
987{
988if ( (sx < 50) && (sy < 50) ) sx = sy = 300+mFgScSz*100;
989char buff[64];
990mWId++;
991int px, py;
992MainWin()->GetScreenPos(px, py);
993sprintf(buff, "PI-StackWin (%d)",mWId);
994PIStackWindow* win = new PIStackWindow(this, buff, PIWK_normal, sx, sy, px+MainWin()->XSize()+30, 100);
995win->SetUserData(NULL, 9999); // UserFlag= 9999
996mWList[mWId*10+2] = (PIWindow*)win;
997win->SetAutoDelChilds(true);
998// win->Show();
999mStW = win;
1000m[2]->SetSensitivity("StackTools", true);
1001mStIdx = 0;
1002}
1003
1004/* --Methode-- */
1005PIWindow* PIStdImgApp::GetWindow(DispWinEnum typ, int& sx, int& sy, int& px, int& py, int& flag, char * nom)
1006{
1007PIWindow* rw;
1008
1009switch (typ) {
1010 case Disp_Next : // Fenetre graphique courante
1011 case Disp_Default :
1012 {
1013 if (mGrW == NULL) CreateGraphWin();
1014 int nx, ny;
1015 mGrW->NbZone(nx, ny);
1016 PIWdg* nw = mGrW->NextChildPosSize(px, py, sx, sy);
1017// cerr << "**DBG** PIStdImgApp::GetWindow() DispNext : nw = " << (long)nw << endl;
1018 if (nw) DeleteBaseWidget((PIBaseWdg*)nw, false, false);
1019 flag = mGrIdx;
1020 mGrIdx = (mGrIdx+1)%(nx*ny);
1021 rw = mGrW;
1022 break;
1023 }
1024
1025 case Disp_Stack : // Fenetre de type stack (empilement)
1026 {
1027 if (mStW == NULL) CreateStackWin(sx, sy);
1028 px = py = 0;
1029 sx = mStW->XSize();
1030 sy = mStW->YSize();
1031 flag = mStIdx;
1032 mStIdx++;
1033 rw = mStW;
1034 }
1035 break;
1036
1037 default : // Fenetre ordinaire
1038 {
1039 int pwx, pwy;
1040 MainWin()->GetScreenPos(pwx, pwy);
1041 if ( (sx < 50) && (sy < 50) ) sx = sy = 300+mFgScSz*100;
1042 rw = new PIWindow(this, nom, PIWK_normal, sx, sy, pwx+MainWin()->XSize()+30, 300);
1043 rw->SetUserData(NULL, 0); // UserFlag= 0
1044 mWId++;
1045 mWList[mWId*10] = rw;
1046 rw->SetAutoDelChilds(true);
1047 // rw->Show();
1048 px = py = 0;
1049 flag = 0;
1050 break;
1051 }
1052 }
1053
1054rw->Show();
1055mCurWin = rw;
1056return(rw);
1057}
1058
1059/* --Methode-- */
1060void PIStdImgApp::SetZone(int nzx, int nzy)
1061{
1062if (!mGrW) CreateGraphWin(nzx, nzy);
1063else {
1064 int k;
1065 PIWdg* cwd;
1066 for(k=0; k<mGrW->NbChilds(); k++) {
1067 if ((cwd = mGrW->GetChild(k)) == NULL) continue;
1068 DeleteBaseWidget((PIBaseWdg*)cwd, false, false);
1069 }
1070 mGrW->SetZone(nzx, nzy);
1071 }
1072}
1073
1074/* --Methode-- */
1075void PIStdImgApp::StackWinNext()
1076{
1077if (mStW) mStW->DispNext();
1078}
1079
1080/* --Methode-- */
1081void PIStdImgApp::DeleteWindow(PIWindow* w)
1082{
1083if (w == NULL) return;
1084w->Hide();
1085bool ownwindow=false; // To Check if this is one of our windows
1086WindMList::iterator it;
1087for(it = mWList.begin(); it != mWList.end(); it++)
1088 if ((*it).second == w) { mWList.erase(it); ownwindow = true; break; }
1089if (w == mGrW) { mGrW = NULL; mGrIdx = -1; }
1090if (w == mStW) { mStW = NULL; mStIdx = -1; m[2]->SetSensitivity("StackTools", false); }
1091if (w == mCurWin) mCurWin = NULL;
1092
1093if (!ownwindow) return; // We do nothing if this is not a window we have created ...
1094
1095int k;
1096PIWdg* cwd;
1097for(k=0; k<w->NbChilds(); k++) {
1098 if ((cwd = w->GetChild(k)) == NULL) continue;
1099 DeleteBaseWidget((PIBaseWdg*)cwd,false,false);
1100 }
1101delete w;
1102return;
1103}
1104
1105/* --Methode-- */
1106void PIStdImgApp::DeleteBaseWidget(PIBaseWdg* w, bool dw, bool dwin)
1107{
1108if (w == NULL) return;
1109BWMList::iterator it;
1110for(it = mBWList.begin(); it != mBWList.end(); it++)
1111 if ((*it).second == w) { mBWList.erase(it); break; }
1112int k;
1113PIDrawer* drw;
1114for(k=0; k<w->NbDrawers(); k++) {
1115 if ((drw = w->GetDrawer(k)) == NULL) continue;
1116 DrwMList::iterator itt;
1117 for(itt = mDrwList.begin(); itt != mDrwList.end(); itt++)
1118 if ((*itt).second == drw) { mDrwList.erase(itt); break; }
1119 }
1120
1121if (w == mCurWdg) {
1122 mCurWdg = NULL;
1123 if (mFgCWImg) {
1124 m[4]->SetSensitivityMsg(10515, false);
1125 m[4]->SetSensitivityMsg(10516, false);
1126 mFgCWImg = false;
1127 }
1128 }
1129
1130if (w == mLastWdg) mLastWdg = NULL;
1131
1132PIWdg* pw=NULL;
1133if (dwin) pw = (PIWdg*)(w->Parent());
1134//DBG printf("DeleteBaseWidget(%lx)-DBG kind = %d - %d %d \n", (long)w, w->kind(), (int)dw, (int)dwin);
1135if (dw) delete w;
1136if (pw && (pw->kind() == PIWindow::ClassId )) {
1137 PIWindow* pww = (PIWindow*) pw;
1138 if ((pww != (PIWindow*)mGrW) && (pww != (PIWindow*)mStW) && (pww->NbChilds()==0))
1139 DeleteWindow((PIWindow*)pw);
1140 }
1141return;
1142}
1143
1144
1145
1146/* --Methode-- */
1147void PIStdImgApp::DelWRsId(int k)
1148{
1149//DBG cerr << "-DBG- PIStdImgApp::DelWRsId(" << k << ")" << endl;
1150if (k > 0) { // C'est un BaseWidget
1151 BWMList::iterator it;
1152 it = mBWList.find(k);
1153 if (it == mBWList.end()) return;
1154 PIBaseWdg* wd = (*it).second;
1155//DBG cerr << "-DBG- PIStdImgApp::DelWRsId Deleting BaseWidget " << (long)(wd) << endl ;
1156 DeleteBaseWidget(wd, true, true);
1157 }
1158else { // C'est un drawer
1159 DrwMList::iterator it;
1160 it = mDrwList.find(-k);
1161 if (it == mDrwList.end()) return;
1162 delete (*it).second;
1163 mDrwList.erase(it);
1164// cerr << "+DBG+ PIStdImgApp::DelWRsId Deleting Drawer " << (long)((*it).second) << endl ;
1165 }
1166}
1167/* --Methode-- */
1168bool PIStdImgApp::CheckWRsId(int k)
1169{
1170if (k > 0) { // C'est un BaseWidget
1171 BWMList::iterator it;
1172 it = mBWList.find(k);
1173 if (it == mBWList.end()) return(false);
1174 else return(true);
1175 }
1176else { // C'est un drawer
1177 DrwMList::iterator it;
1178 it = mDrwList.find(-k);
1179 if (it == mDrwList.end()) return(false);
1180 else return(true);
1181 }
1182}
1183
1184/* --Methode-- */
1185void PIStdImgApp::StatZoomWindowSetVisible(bool fg)
1186{
1187
1188 if (fg) {
1189 consolecont->SetBinding(PIBK_free,PIBK_free,PIBK_free, PIBK_free);
1190 int szy = MainWin()->YSize();
1191 MainWin()->SetSize(MainWin()->XSize(), szy+statcont->YSize());
1192 consolecont->SetPos(0, statcont->YSize());
1193 consolecont->SetSize(MainWin()->XSize(), szy);
1194 consolecont->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_fixed, PIBK_fixed);
1195 statcont->Show();
1196 m[3]->SetStateMsg(10470, true);
1197 }
1198 else {
1199 statcont->Hide();
1200 consolecont->SetBinding(PIBK_free,PIBK_free,PIBK_free, PIBK_free);
1201 MainWin()->SetSize(MainWin()->XSize(), MainWin()->YSize()-statcont->YSize());
1202 consolecont->SetPos(0, 0);
1203 consolecont->SetSize(MainWin()->XSize(), MainWin()->YSize());
1204 consolecont->SetBinding(PIBK_fixed,PIBK_fixed,PIBK_fixed, PIBK_fixed);
1205 m[3]->SetStateMsg(10470, false);
1206 }
1207
1208}
1209
1210/* --Methode-- */
1211void PIStdImgApp::UpdateStatResourceInfo()
1212{
1213 resusg.Update();
1214 char buff[256];
1215 string lab;
1216 double frac;
1217 sprintf(buff, "Mem: %ld/Max= %ld kb" , (long)resusg.getMemorySize(),
1218 (long)resusg.getMaxMemorySize());
1219 lab = buff;
1220 lab_mem->SetLabel(lab);
1221 frac = (double)resusg.getMemorySize()/(double)resusg.getMaxMemorySize();
1222 therm_mem->SetValue(frac);
1223
1224 sprintf(buff, "CPU: %ld/elap= %ld ms" , (long)resusg.getCPUTime(),
1225 (long)resusg.getElapsedTime());
1226 lab = buff;
1227 lab_cpu->SetLabel(lab);
1228 therm_cpu->SetValue(resusg.getCPULoad());
1229
1230}
1231
1232/* --Methode-- */
1233void PIStdImgApp::RedirectStdOutErr(bool fg)
1234{
1235if (fg) {
1236 RedirectOutStream(mCons);
1237 RedirectErrStream(mCons);
1238 m[5]->SetStateMsg(10602, true);
1239 redirecout = true;
1240 }
1241else {
1242 RedirectOutStream(NULL);
1243 RedirectErrStream(NULL);
1244 m[5]->SetStateMsg(10602, false);
1245 redirecout = false;
1246 }
1247return;
1248}
1249
1250/* --Methode-- */
1251void PIStdImgApp::CatchSignals(bool fgfpe, bool fgsegv)
1252{
1253#ifdef SANS_EVOLPLANCK
1254PeidaConfigureSignalhandling(fgfpe, fgsegv, true, true);
1255#else
1256SophyaConfigureSignalhandling(fgfpe, fgsegv, true, true);
1257#endif
1258m[5]->SetStateMsg(10603, fgfpe);
1259m[5]->SetStateMsg(10604, fgsegv);
1260}
1261
1262/* --Methode-- */
1263void PIStdImgApp::CloseAllWindows()
1264{
1265WindMList::iterator it;
1266for(it = mWList.begin(); it != mWList.end(); it++) delete (*it).second;
1267mWList.clear();
1268mBWList.clear();
1269mDrwList.clear();
1270mGrW = NULL;
1271mStW = NULL;
1272mCurWin = NULL;
1273mCurWdg = NULL;
1274mLastWdg = NULL;
1275m[4]->SetSensitivityMsg(10515, false);
1276m[4]->SetSensitivityMsg(10516, false);
1277}
1278
1279//---------------------------------------------------------------------------
1280//--------- Gestion des attributs graphiques et autres options de trace -----
1281
1282/* --Methode-- */
1283void PIStdImgApp::SetInsetLimits(double xmin, double xmax, double ymin, double ymax)
1284{
1285 mIXmin = xmin; mIXmax= xmax;
1286 mIYmin = ymin; mIYmax= ymax;
1287}
1288
1289/* --Methode-- */
1290void PIStdImgApp::SetDefaultGraphicAttributes(string const & opt)
1291{
1292 ParseDisplayOption(opt, mDefaultAtt);
1293}
1294
1295/* --Methode-- */
1296void PIStdImgApp::SetDefaultAxesAttributes(string const & opt)
1297{
1298 ParseDisplayOption(opt, mAxesAtt);
1299}
1300
1301/* --Methode-- */
1302DispWinEnum PIStdImgApp::ParseDisplayOption(string const & sop, vector<string>& opts)
1303{
1304 DispWinEnum rc = Disp_Next;
1305 //DBG cerr << " DBG-Parse-A sop=" << sop << " sop.length()= " << sop.length() << endl;
1306 if (opts.size() > 0) opts.erase(opts.begin(), opts.end());
1307 if (sop.length() < 1) return(rc);
1308 string gratt = sop;
1309 for(int i=0; i<gratt.length(); i++) gratt[i] = tolower(gratt[i]);
1310 if ( (gratt == "def") || (gratt == "default") ) return(rc);
1311// On separe en mots espaces par des blancs ou tabulation
1312 size_t p = 0;
1313 size_t q = 0;
1314 size_t l = gratt.length();
1315 string token;
1316 while (q < l) {
1317 p = gratt.find_first_not_of(" \t",q); // au debut d'un token
1318 if (p >= l) break;
1319 q = gratt.find_first_of(" \t",p); // Premier blanc ou tab suivant
1320 if (q<l) token = gratt.substr(p,q-p);
1321 else token = gratt.substr(p);
1322 if (token == "") continue;
1323 // Decodage option fenetre d'affichage (win, next, ...)
1324 if (token == "win") rc = Disp_Win;
1325 else if (token == "same") rc = Disp_Same;
1326 else if (token == "inset") rc = Disp_Inset;
1327 else if (token == "stack") rc = Disp_Stack;
1328 else if (token == "next") rc = Disp_Next;
1329 // Option a etre decode par les drawers, etc ...
1330 else opts.push_back(token);
1331 }
1332
1333 //DBG cerr << " DBG-Parse-B opts.size()=" << opts.size() << endl;
1334 return (rc);
1335}
1336
1337//---------------------------------------------------------------------------
1338//------------ Methodes privees (MBProcessx, ...) ----------
1339
1340/* --Methode-- */
1341void PIStdImgApp::MBProcess1(PIMessage msg, PIMsgHandler* /*sender*/, void* data)
1342{
1343
1344 switch(msg)
1345 {
1346 case 10150 :
1347 showInfoWindow(this);
1348 break;
1349
1350 case 10155 :
1351 hideInfoWindow(this);
1352 break;
1353
1354 case 10100 :
1355 mCmd->ShowHelpWindow();
1356 break;
1357
1358 case 10120 :
1359 pfc_fits->AcceptNewFile(false);
1360 mFCMsg = 10125;
1361 pfc_fits->SetMsg(mFCMsg);
1362 SetBlocked();
1363 pfc_fits->Show();
1364 break;
1365
1366 case 10125 :
1367 SetBusy();
1368 if (data) {
1369 string nomobj="";
1370 ObjMgr()->ReadFits(pfc_fits->GetFileName(), nomobj);
1371 ObjMgr()->DisplayObj(nomobj, "win");
1372 }
1373 mFCMsg = 0;
1374 SetReady();
1375 break;
1376
1377 case 10130 :
1378 pfc_ppf->AcceptNewFile(false);
1379 mFCMsg = 10135;
1380 pfc_ppf->SetMsg(mFCMsg);
1381 SetBlocked();
1382 pfc_ppf->Show();
1383 break;
1384
1385 case 10135 :
1386 mFCMsg = 0;
1387 if (data) {
1388 PPInMgrW()->SetFile(pfc_ppf->GetFileName());
1389 PPInMgrW()->Show();
1390 }
1391 SetReady();
1392 break;
1393
1394 case 10105:
1395 Stop();
1396 break;
1397
1398 }
1399return;
1400}
1401
1402
1403
1404/* --Methode-- */
1405void PIStdImgApp::MBProcess2(PIMessage msg, PIMsgHandler* /*sender*/, void* data)
1406{
1407
1408switch (msg) {
1409 case 10201 :
1410 ObjMgrW()->Show();
1411 break;
1412
1413 case 10220 :
1414 pfc_ppf->AcceptNewFile(true);
1415 mFCMsg = 10225;
1416 pfc_ppf->SetMsg(mFCMsg);
1417 SetBlocked();
1418 pfc_ppf->Show();
1419 break;
1420
1421 case 10225 :
1422 SetBusy();
1423 if (data) {
1424 if (mPpfout) {
1425 printf("PIStdImg/Info: Closing POutPersist-File %s \n", name_outppf.c_str());
1426 delete mPpfout;
1427 }
1428 name_outppf = pfc_ppf->GetFileName();
1429 mPpfout = NULL;
1430 printf("PIStdImg/Info: Opening POutPersist-File %s \n", name_outppf.c_str());
1431 mPpfout = new POutPersist(name_outppf);
1432 }
1433 mFCMsg = 0;
1434 SetReady();
1435 break;
1436
1437 case 10230 :
1438 if (!mPpfout) break;
1439 printf("PIStdImg/Info: Closing POutPersist-File %s \n", name_outppf.c_str());
1440 delete mPpfout;
1441 name_outppf = "";
1442 mPpfout = NULL;
1443 break;
1444
1445 case 10270 :
1446 if (mCurWdg) {
1447 int oid = mCurWdg->UserFlag();
1448 DeleteBaseWidget(mCurWdg);
1449 mObjMgr->DelObj_Id(oid);
1450 }
1451 break;
1452
1453 default:
1454 cerr << "PIStdImgApp::MBProcess2() BUG?? Msg= " << msg << endl;
1455 break;
1456}
1457
1458return;
1459}
1460
1461/* --Methode-- */
1462void PIStdImgApp::MBProcess3(PIMessage msg, PIMsgHandler* /*sender*/, void* /*data*/)
1463{
1464
1465switch (msg) {
1466 case 10301 :
1467 PIImgTools::ShowPIImgTools();
1468 break;
1469 case 10302 :
1470 PIDrwTools::ShowPIDrwTools();
1471 break;
1472 case 10303 :
1473 PIAxesTools::ShowPIAxesTools();
1474 break;
1475
1476 case 10304 :
1477 mCmd->ShowCxxExecWindow();
1478 break;
1479
1480 case 10311 :
1481 case 10312 :
1482 {
1483 PIImage* curpimg = NULL;
1484 if (!mCurWdg) return;
1485 if (mCurWdg->kind() != PIImage::ClassId) return;
1486 curpimg = (PIImage*)mCurWdg;
1487 if (curpimg == NULL) return;
1488 P2DArrayAdapter* img = curpimg->Image();
1489 if (img == NULL) return;
1490 int dx = curpimg->XSzPave();
1491 int dy = curpimg->YSzPave();
1492 int x0 = curpimg->XPave()-dx/2;
1493 int y0 = curpimg->YPave()-dy/2;
1494 if (x0 < 0) x0 = 0;
1495 if (y0 < 0) y0 = 0;
1496 int x1 = x0+dx;
1497 int y1 = y0+dy;
1498 if (x1 > img->XSize()) x1 = img->XSize();
1499 if (y1 > img->YSize()) y1 = img->YSize();
1500 dx = x1-x0; dy = y1-y0;
1501 ImageR4* pim = new ImageR4(dx, dy);
1502 int ii, jj;
1503 for(jj=0; jj<dy; jj++)
1504 for(ii=0; ii<dx; ii++) (*pim)(ii,jj) = (*img)(ii+x0, jj+y0);
1505 if (msg == 10305) { // Calcul des coordonnees du sous-pave
1506 double xc1, yc1;
1507 img->Coord(x0, y0, xc1, yc1);
1508 pim->SetOrg((int)xc1, (int)yc1);
1509 }
1510 string nom = mCurWdg->Nom() + "_pave";
1511 ObjMgr()->AddObj(pim, nom);
1512 ObjMgr()->DisplayObj(nom, "w");
1513 break;
1514 }
1515
1516 case 10313 :
1517 {
1518 PIImage* curpimg = NULL;
1519 if (!mCurWdg) return;
1520 if (mCurWdg->kind() != PIImage::ClassId) return;
1521 curpimg = (PIImage*)mCurWdg;
1522 if (curpimg == NULL) return;
1523 curpimg->ShowCuts(true);
1524 break;
1525 }
1526
1527 case 10320 :
1528 if (mStW) mStW->DispNext();
1529 break;
1530
1531 case 10321 :
1532 case 10322 :
1533 case 10324 :
1534// case 10328 :
1535 if (mStW) mStW->StartAutoDisp((msg-10320)*500);
1536 break;
1537
1538 case 10329 :
1539 if (mStW) mStW->StopAutoDisp();
1540 break;
1541
1542 case 103330 :
1543 if (mStW) {
1544 PIWdg* cw = mStW->CurrentWdg();
1545 if (cw) DeleteBaseWidget((PIBaseWdg*)cw);
1546 }
1547 break;
1548
1549 default:
1550 cerr << "PIStdImgApp::MBProcess3() BUG?? Msg= " << msg << endl;
1551 break;
1552 }
1553return;
1554}
1555
1556/* --Methode-- */
1557void PIStdImgApp::MBProcess4(PIMessage msg, PIMsgHandler* /*sender*/, void* /*data*/)
1558{
1559
1560switch (msg) {
1561
1562 case 10400 :
1563 CreateStackWin();
1564 break;
1565
1566 case 10411 :
1567 CreateGraphWin(1,1);
1568 break;
1569 case 10421 :
1570 CreateGraphWin(1,2);
1571 break;
1572 case 10412 :
1573 CreateGraphWin(2,1);
1574 break;
1575 case 10422 :
1576 CreateGraphWin(2,2);
1577 break;
1578 case 10431 :
1579 CreateGraphWin(1,3);
1580 break;
1581 case 10433 :
1582 CreateGraphWin(3,3);
1583 break;
1584 case 10441 :
1585 if (mCurWdg) {
1586 mLastWdg = mCurWdg;
1587 cout << " Using current widget as last-widget (display same) " << endl;
1588 }
1589 else cout << " No current widget - select widget with mouse " << endl;
1590 break;
1591 case 10460 :
1592 DeleteWindow(mCurWin);
1593 break;
1594 case 10470 :
1595 StatZoomWindowSetVisible(m[3]->GetStateMsg(10470));
1596 break;
1597 default:
1598 cerr << "PIStdImgApp::MBProcess4() BUG?? Msg= " << msg << endl;
1599 break;
1600 }
1601return;
1602}
1603
1604
1605/* --Methode-- */
1606void PIStdImgApp::MBProcess5(PIMessage msg, PIMsgHandler* /*sender*/, void* data)
1607{
1608char nomps[64],strg[512];
1609PSFile *mps;
1610int sxt, syt, syo, syo1, sx[4], sy[4];
1611
1612switch (msg)
1613 {
1614 case 10501 :
1615 pfc_ps->AcceptNewFile(true);
1616 mFCMsg = 10525;
1617 pfc_ps->SetMsg(mFCMsg);
1618 SetBlocked();
1619 pfc_ps->Show();
1620 break;
1621
1622 case 10525 :
1623 SetBusy();
1624 if (data) {
1625 if (mpsfile) {
1626 printf("PIStdImg/Info: Closing PS-File %s \n", name_ps.c_str());
1627 delete mpsfile;
1628 }
1629 name_ps = pfc_ps->GetFileName();
1630 printf("PIStdImg/Info: Opening PS-File %s \n", name_ps.c_str());
1631 mpsfile = new PSFile(name_ps.c_str(), PI_Portrait, PI_A4, 2., 2.);
1632 }
1633 mFCMsg = 0;
1634 SetReady();
1635 break;
1636
1637 case 10505 :
1638 if (!mpsfile) break;
1639 printf("PIStdImg/Info: Closing PS-File %s \n", name_ps.c_str());
1640 delete mpsfile;
1641 mpsfile = NULL;
1642 name_ps = "";
1643 break;
1644
1645 case 10511 : // Window -> PS
1646 case 10512 : // Window -> EPS
1647 if (CurrentWindow() == NULL) break;
1648 if (msg == 10512)
1649 {
1650 num_eps++;
1651 sprintf(nomps,"pia%d.eps", num_eps);
1652 printf("PIStdImg/Info: Creating EPSFile %s (CurWin-> EPS) \n", nomps);
1653 mps = new PSFile(nomps);
1654 }
1655 else {
1656 if (mpsfile == NULL) {
1657 name_ps = "pia.ps";
1658 mpsfile = new PSFile(name_ps.c_str(), PI_Portrait, PI_A4, 0., 0.);
1659 printf("PIStdImg/Info: File PS %s opened \n", name_ps.c_str());
1660 }
1661 printf("PIStdImg/Info: CurWin-> PSFile %s\n", name_ps.c_str());
1662 mps = mpsfile;
1663 }
1664 CurrentWindow()->PSPrint(mps,0,0);
1665
1666 if (msg == 10512) delete mps; // fichier eps
1667 break;
1668
1669 case 10515 : // Image -> PS
1670 case 10516 : // Image -> EPS
1671 {
1672 PIImage* curpimg = NULL;
1673 if (!mCurWdg) return;
1674 if (mCurWdg->kind() != PIImage::ClassId) return;
1675 curpimg = (PIImage*)mCurWdg;
1676 if (curpimg == NULL) return;
1677 if (msg == 10516)
1678 {
1679 num_eps++;
1680 sprintf(nomps,"pia%d.eps", num_eps);
1681 printf("PIStdImg/Info: Creating EPSFile %s (CurImage-> EPS)\n", nomps);
1682 mps = new PSFile(nomps);
1683 }
1684 else {
1685 if (mpsfile == NULL) {
1686 name_ps = "pia.ps";
1687 mpsfile = new PSFile(name_ps.c_str(),PI_Portrait, PI_A4, 2., 2.);
1688 printf("PIStdImg/Info: File PS %s opened \n", name_ps.c_str());
1689 }
1690 printf("PIStdImg/Info: CurImage-> PSFile %s\n", name_ps.c_str());
1691 mps = mpsfile;
1692 }
1693
1694 sx[0] = gimv->XSize();
1695 sy[0] = gimv->YSize();
1696 sx[1] = zoom->XSize();
1697 sy[1] = zoom->YSize();
1698 sx[2] = cmapv->XSize();
1699 sy[2] = cmapv->YSize();
1700 sx[3] = curpimg->XSize();
1701 sy[3] = curpimg->YSize();
1702 if (sy[1] > sy[0]) { syo1 = sy[1]+50; syo = sy[1]+sy[2]+60; }
1703 else { syo1 = sy[0]+50; syo = sy[0]+sy[2]+60; }
1704 syt = sy[3]+syo;
1705 sxt = sx[3];
1706 if (sxt < (sx[0]+sx[1]+20)) sxt = sx[0]+sx[1]+20;
1707 if (sxt < sx[2]) sxt = sx[2];
1708
1709 // Pour ecrire le titre
1710 mps->NewPage((float)sxt, (float)syt, PI_Portrait);
1711 mps->NewBloc(0,0, (float)sxt, 30., (float)sxt, 30.);
1712 sprintf(strg,"Image: %s - Pave %d %d \n", curpimg->Nom().c_str(),
1713 curpimg->XPave(), curpimg->YPave());
1714 mps->DrawString(10., 25., strg, PI_Black, PI_DefaultFont, PI_BoldFont, 20);
1715 mps->EndBloc();
1716
1717 // Les quatre fenetres glovimage, zoom, cmap, image
1718 gimv->PSPrint(mps, -gimv->XPos(), -gimv->YPos()+40);
1719 zoom->PSPrint(mps, -zoom->XPos()+sx[0]+20, -zoom->YPos()+40);
1720 cmapv->PSPrint(mps, -cmapv->XPos(), -cmapv->YPos()+syo1);
1721 curpimg->PSPrint(mps, -curpimg->XPos(), -curpimg->YPos()+syo);
1722
1723 if (msg == 10516) delete mps; // fichier eps
1724 break;
1725 }
1726
1727 default:
1728 cerr << "PIStdImgApp::MBProcess5() BUG?? Msg= " << msg << endl;
1729 break;
1730 }
1731
1732}
1733
1734
1735/* --Methode-- */
1736void PIStdImgApp::MBProcess6(PIMessage msg, PIMsgHandler* /*sender*/, void* data)
1737{
1738switch (msg) {
1739 case 10601:
1740 CloseAllWindows();
1741 break;
1742 case 10602:
1743 RedirectStdOutErr(*((bool*)data));
1744 break;
1745 case 10603:
1746 case 10604:
1747 CatchSignals(m[5]->GetStateMsg(10603), m[5]->GetStateMsg(10604));
1748 break;
1749 case 10605:
1750 mObjMgr->SetVerbose(m[5]->GetStateMsg(10605));
1751 break;
1752 case 10606:
1753 mCmd->ShowCxxOptionWindow();
1754 break;
1755 default:
1756 cerr << "PIStdImgApp::MBProcess6() BUG?? Msg= " << msg << endl;
1757 break;
1758 }
1759return;
1760}
1761
1762
1763
1764// -------------------------------------------------
1765// Fenetre info piapp (About piapp)
1766// -------------------------------------------------
1767static PIWindow* infow_win = NULL;
1768static PIText* infow_txt = NULL;
1769static PICMapView* infow_cmap = NULL;
1770static PIButton* infow_but = NULL;
1771
1772/* Nouvelle-Fonction */
1773static void createInfoWindow(PIStdImgApp* app)
1774{
1775if (infow_win) return;
1776
1777int bsx, bsy;
1778PIApplicationPrefCompSize(bsx, bsy);
1779int spx, spy;
1780spx = bsx/6; spy = bsy/6;
1781
1782infow_win = new PIWindow((PIMsgHandler *)app, "About piapp",
1783 PIWK_dialog, bsx*5+3*spx, bsy*4+spy*3, 200, 200);
1784infow_win->SetAutoDelChilds(true);
1785infow_txt = new PIText(infow_win,"about_piapp_text", bsx*5+spx, bsy*3, spx, spy);
1786infow_txt->SetMutiLineMode(true);
1787infow_txt->SetTextEditable(false);
1788infow_txt->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
1789infow_cmap = new PICMapView(infow_win, "about_piapp_cmap", bsx*4, bsy*0.7, spx, 2*spy+bsy*3.15);
1790infow_cmap->SetColMapId(CMAP_COLBR32, 1., -1., false);
1791infow_cmap->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
1792infow_but = new PIButton(infow_win,"OK", 10155, bsx, bsy, bsx*4+2*spx, 2*spy+bsy*3);
1793infow_but->SetMsgParent((PIMsgHandler *)app);
1794infow_but->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
1795char buff[128];
1796#ifdef SANS_EVOLPLANCK
1797sprintf(buff, "Version: piapp=%g PI=%g PEIDA=%g \n", (double)PIAPP_VERSIONNUMBER,
1798 (double)PI_VERSIONNUMBER, (float)PeidaVersion());
1799#else
1800{
1801sprintf(buff, "Version: piapp=%g PI=%g SOPHYA=%g \n", (double)PIAPP_VERSIONNUMBER,
1802 (double)PI_VERSIONNUMBER, glst_piai->Version());
1803}
1804#endif
1805string info = "piapp : Interactive analysis program\n";
1806info += buff;
1807info += "(C) LAL-IN2P3/CNRS 1996-2002\n";
1808info += "(C) SPP-DAPNIA/CEA 1996-2002\n";
1809infow_txt->SetText(info);
1810}
1811
1812/* Nouvelle-Fonction */
1813static void showInfoWindow(PIStdImgApp* app)
1814{
1815if (!infow_win) createInfoWindow(app);
1816if (infow_win) infow_win->Show();
1817}
1818/* Nouvelle-Fonction */
1819static void hideInfoWindow(PIStdImgApp* app)
1820{
1821if (infow_win) infow_win->Hide();
1822}
1823
1824/* Nouvelle-Fonction */
1825static void deleteInfoWindow()
1826{
1827if (!infow_win) return;
1828delete infow_win;
1829infow_win = NULL;
1830infow_txt = NULL;
1831infow_cmap = NULL;
1832infow_but = NULL;
1833}
1834
1835
Note: See TracBrowser for help on using the repository browser.