source: Sophya/trunk/SophyaPI/PIext/pihisto2d.cc@ 2350

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

Ajout nouvelles options pour trace d'axes ds le Help de baseexecut.cc
et ajout d'une nouvelle option (connectpoints) ds PINTupleDrawer (et 3D)

Reza 18 Mars 2003

File size: 29.0 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <pisysdep.h>
4#include PIAPP_H
5#include "pihisto2d.h"
6#include "nbrandom.h"
7
8static int dbg = 0;
9
10//++
11// Class PIHisto2D
12// Lib PIext
13// include pihisto2d.h
14//
15// Classes de dessin des histogrammes a 2 dimensions pour
16// objets *Histo2D*
17//--
18
19//++
20// Links Parents
21// PIDrawer
22//--
23
24//++
25// Titre Constructeur, méthodes
26//--
27
28//++
29PIHisto2D::PIHisto2D(Histo2D* histo, bool ad)
30//
31// Createur d'une classe de dessin pour l'histogramme 2D histo.
32//--
33: PIDrawer(), mHisto(histo), mAdDO(ad), mLogScale(10.), mFPoints(0.5)
34{
35// mAdDO : Flag pour suppression automatique de mHisto
36// Attention: mFPoints n'est initialise que si on display par nuages de points
37// mLogScale n'est initialise que si on utilise une echelle log
38UseScale();
39UseColors();
40UseDisplay();
41UseDyn();
42UseFrac();
43SetStats();
44SetName("Histo2DDrw");
45// PIHisto2D has specific control tools
46mFgSpecContWind = true;
47}
48
49//++
50PIHisto2D::~PIHisto2D()
51//
52// Destructeur.
53//--
54{
55// La fonction virtuelle DeactivateControlWindow() doit etre appele
56// a ce niveau - En effet au niveau du destructeur de base, il
57// semble pointer sur la fonction de la classe de base
58// Reza - Octobre 2002
59// Desactivation totale de la fenetre de controle specialise
60// ---> parametre d'appel PIBaseWdgGen* wdg=NULL
61DeactivateControlWindow(NULL);
62if(mAdDO && mHisto!=NULL) delete mHisto;
63}
64
65//++
66void PIHisto2D::UseColors(bool fg,CMapId cmap,bool revcmap)
67//
68// Choix de la couleur si fg=true avec la color map cmap.
69// (pour la couleur cmap cf picmap.h).
70// Independamment du choix du display, la dynamique est
71// codee sur la color map donnant ainsi une double
72// information. Par exemple, carres de tailles variables
73// en couleur. Cette option est incontournable dans le cas
74// d'un display par des carres de taille fixe.
75// revcmap doit etre mis a "true" si on veut avoir une color map
76// inversee.
77//| -**- gestion dans H2WinArg par menu deroulant Black&White etc...
78//--
79{
80mFgCol = fg; mCmap = cmap; mRevCmap = revcmap;
81}
82
83//++
84void PIHisto2D::UseScale(unsigned short type,float logscale)
85//
86// Pour changer les echelles (lineaire ou logarithmique)
87//| Type = 0 : echelle lineaire
88//| = 1 : echelle log10
89//| -**- Explication du codage en type=0 (lineaire) :
90//| 1. [hmin,hmax] -> [0,1]
91//| h -> f = (h-hmin)/(hmax-hmin)
92//| 2. codage de f=[0,1] sur la dynamique du display choisi
93//| -**- Explication du codage en type=1 (logarithmique base 10) :
94//| 1. map lineaire entre 0 et 1:
95//| [hmin,hmax] -> [0,1]
96//| h -> f = (h-hmin)/(hmax-hmin)
97//| 2. transformation logarithmique de base 10 :
98//| [0,1] -> [0,1]
99//| f -> lf = log10(1.+f*(logscale-1))/log10(logscale)
100//| 3. codage de lf=[0,1] sur la dynamique du display choisi
101//| -**- gestion dans H2WinArg par menu deroulant Lineaire/Log10
102//| et "logscale" par saisie de valeur dans champ LogScal
103//--
104{
105if(type==0) mTypScal=0;
106else if(type==1) {mTypScal=1; if(logscale>1.) mLogScale=logscale;}
107else mTypScal=0;
108}
109
110//++
111void PIHisto2D::UseDisplay(unsigned short type,float fnpt)
112//
113// Type de Display
114//| Type = 0 : carres de tailles variables
115//| Type = 1 : nuages de points
116//| Le nombre de points a utiliser est fnpt*N
117//| ou N est le nombre de pixels ecran contenu
118//| dans un bin de l'histogramme.
119//| Type = 2 : code a la "hbook2" " .+123...9AB...YZ*"
120//| (cf detail PIHisto2D::HPrint2)
121//| Type = 3 : carres de taille fixe (couleur).
122//| -**- gestion dans H2WinArg par menu deroulant Carres_Var etc...
123//| et "fnpt" par saisie de valeur dans champ PerPt
124//--
125{
126if(type==0) mTypDisp = 0;
127else if(type==1) {
128 mTypDisp = 1;
129 if(fnpt<0.) mFPoints = 0.;
130 else if(fnpt>1.) mFPoints = 1.;
131 else mFPoints = fnpt;
132}
133else if(type==2) mTypDisp = 2;
134else if(type==3) mTypDisp = 3;
135else mTypDisp = 1;
136}
137
138//++
139void PIHisto2D::UseDyn(float hmin,float hmax)
140//
141// Gestion de la dynamique a representer:
142//| La dynamique va etre transformee de [hmin,hmax] vers [0,1] selon
143//| [hmin,hmax] -> [0,1]
144//| h -> f = (h-hmin)/(hmax-hmin)
145//| Par la suite, selon ce qui est demande, f va coder le display
146//| ou etre transforme en une autre echelle [0,1] (ex: echelle log10).
147//| Si hmax<=hmin, ils sont forces a la dynamique totale de l'histo2D.
148//| -**- gestion dans H2WinArg par saisie de valeurs dans champ Dyn
149//--
150{
151if(mHisto)
152 if(hmin>=hmax) {hmin = mHisto->VMin(); hmax = mHisto->VMax();}
153if(hmin>=hmax) hmax = hmin+1.;
154mHMin = hmin; mHMax = hmax;
155}
156
157//++
158void PIHisto2D::UseFrac(float frmin,float frmax)
159//
160// Pour definir la fraction de la dynamique a dessiner:
161//| Selon le type de display (f=[0,1] cf PIHisto2D::UseDyn),
162//| - on ne dessine rien si f <= frmin dans les cas de display avec
163//| des nuages de points ou des carres de tailles variables.
164//| Pour un display "a la hbook2" on force frmin = 0.
165//| - frmax n'est utilise que pour la representation avec
166//| des carres de tailles variables: c'est la taille
167//| maximum que peut avoir le carre exprimee en unite
168//| de la taille du bin (ex: si frmax=0.8 le carre
169//| le + grand qui pourra etre dessine dans un bin
170//| aura une taille egale a 0.8*(taille du bin)).
171//| -**- gestion dans H2WinArg par saisie de valeurs dans champ Frac
172//--
173{
174if(frmin<0. || frmin>=1.) frmin = 0.;
175if(frmax<=0. || frmax>1. ) frmax = 1.;
176if(frmin>=frmax) {frmin=0.1; frmax=0.9;}
177mFracMin = frmin; mFracMax = frmax;
178}
179
180//++
181void PIHisto2D::Print(int lp)
182//
183// Print de l'etat des options du display.
184//--
185{
186printf("PIHisto2D::Print FgCol=%d Cmap=%d (Rev=%d) TypScal=%d TypDisp=%d (FPoints=%g)\n"
187 ,(int)mFgCol,(int)mCmap,(int)mRevCmap,mTypScal,mTypDisp,mFPoints);
188printf(" Dyn=%g,%g Frac=%g,%g LogSc=%g H=%p\n"
189 ,mHMin,mHMax,mFracMin,mFracMax,mLogScale,mHisto);
190if(lp>=1) mHisto->PrintStatus();
191fflush(stdout);
192}
193
194//++
195void PIHisto2D::UpdateLimits()
196//
197// Definition des tailles graphiques en fonction
198// des caracteristiques de l'histogramme a dessiner.
199//--
200{
201 if(!mHisto) return;
202 SetLimits(mHisto->XMin(), mHisto->XMax(), mHisto->YMin() , mHisto->YMax());
203}
204
205//++
206void PIHisto2D::ShowControlWindow(PIBaseWdgGen* wdg)
207//
208// Affichage de la fenetre de controle H2WinArg
209//--
210{
211 H2WinArg::SetCurrentPIHisto2D(this);
212 H2WinArg::ShowPIHisto2DTools(wdg);
213}
214
215//++
216void PIHisto2D::DeactivateControlWindow(PIBaseWdgGen* wdg)
217//
218// Desactivation de la fenetre de controle specialisee
219//--
220{
221 if (H2WinArg::GetCurrentPIHisto2D() == this) {
222 // si wdg != NULL, c'est un Detach (Drawer detache du PIBaseWdg
223 // si wdg == NULL, c'est un delete du PIHisto2D (du PIDrawer)
224 if ((wdg == NULL) || (H2WinArg::GetCurrentBaseWdg() == wdg)) {
225 H2WinArg::SetCurrentBaseWdg(NULL);
226 H2WinArg::SetCurrentPIHisto2D(NULL);
227 H2WinArg::HidePIHisto2DTools();
228 }
229 }
230 PIDrawer::DeactivateControlWindow(wdg);
231 return;
232}
233
234//++
235void PIHisto2D::Draw(PIGraphicUC* g,double xmin,double ymin,double xmax,double ymax)
236//
237// Dessin de l'histogramme.
238//| -**- Code de dessin selon choix des options:
239//| (detail voir UseColors UseScale UseDisplay UseDyn UseFrac)
240//| - [hmin,hmax] -> f=[0,1]
241//| (Choix hmin,hmax champ Dyn de H2WinArg)
242//| - Eventuellement ech Log -> re-codage log10 entre f=[0,1]
243//| (Choix menu deroulant et champ LogScal de H2WinArg)
244//| - Restriction de f=[0,1] -> f=[Frac(min),Frac(max)]
245//| (Choix champ Frac de H2WinArg)
246//| -**- Puis selon display:
247//| 0 carres variables, menu "Carres Var." de H2WinArg:
248//| if(f>Frac(min)) taille carre = f * Frac(max) * taille_du_bin
249//| 1 nuage de points, menu "....." et champ PerPt de H2WinArg:
250//| if(f>Frac(min)) npoints = f * PerPt * npoints_ecran_dans_bin
251//| 2 code hbook2, menu ".12..Z*" de H2WinArg:
252//| if(f>0) map de f=]0,1] dans ".+...Z*"
253//| 3 carres pleins, menu "Carres Pleins" et couleurs de H2WinArg):
254//| couleur = lut[ f * nombre_d_entree_dans_la_lut ]
255//--
256{
257if (axesFlags != kAxesNone) DrawAxes(g);
258
259if(!mHisto) return;
260// Caracteristiques histogramme
261double dx = mHisto->WBinX(),dy = mHisto->WBinY();
262double p1dx,p1dy;
263g->DGrC2UC(1.,1.,p1dx,p1dy);
264
265// Gamme a representer entre [0,1] mais >=fracmin et scale fracmax
266float fracmin=FMin(), fracmax=FMax();
267float llscale = (float) log10((double)LogScale());
268
269// gestion Couleurs.
270PIColors fgcoul = GetGraphicAtt().GetFgColor();
271PIColors bgcoul = GetGraphicAtt().GetBgColor();
272PIColorMap* cmap=NULL;
273int ncol = 0;
274if (mFgCol) {
275 cmap = new PIColorMap(mCmap);
276 cmap->ReverseColorIndex(mRevCmap);
277 ncol = cmap->NCol();
278 if(mTypDisp==3) fracmin=-1.;
279}
280
281// gestion epaisseur de ligne
282PILineAtt LineAtt = GetGraphicAtt().GetLineAtt();
283if(LineAtt == PI_NotDefLineAtt) GetGraphicAtt().SetLineAtt(PI_ThinLine);
284
285// gestion Markers ou plot avec des points.
286PIMarker Mk = GetGraphicAtt().GetMarker();
287int MkSz = GetGraphicAtt().GetMarkerSize();
288int npt = 1;
289if(mTypDisp==1) {
290 g->SelMarker(1,PI_DotMarker);
291 npt = (int) ((float)NPixBin(g)*FPoints()); if(npt<=0) npt = 2;
292}
293
294// gestion Font.
295PIFontAtt FontAtt = GetGraphicAtt().GetFontAtt();
296int FontSize = GetGraphicAtt().GetFontSzPt();
297if(mTypDisp==2) {
298 double dxg,dyg,dg;
299 g->DUC2GrC(dx,dy,dxg,dyg);
300 dg =(dxg<dyg) ? dxg : dyg;
301 int npix = (int) (dg*0.9); if(npix<8) npix = 8;
302 g->SelFontSzPt(npix,FontAtt);
303 fracmin = 0;
304}
305
306// Plot de l'histogramme
307for(int i=0; i<mHisto->NBinX(); i++)
308 for(int j=0; j<mHisto->NBinY(); j++) {
309
310 r_8 left0,bottom0;
311 mHisto->BinLowEdge(i,j,left0,bottom0);
312
313 // Gestion de la dynamique a dessiner
314 float frac = ((*mHisto)(i,j)-HMin())/(HMax()-HMin());
315 if(frac<0.) continue;
316 if(mTypScal==1) { // echelle log10
317 frac = log10(1.+frac*(LogScale()-1.))/llscale;
318 if(frac<0.) continue;
319 }
320 if(frac<=fracmin) continue;
321 if(frac>1.) frac = 1.;
322 float fracred = frac * fracmax;
323
324 // Gestion de la couleur
325 int icol = 0;
326 if (cmap) {
327 icol = int( (float) ncol*frac );
328 if(icol>=ncol) icol = ncol-1; else if(icol<0) icol=0;
329 g->SelForeground(*cmap,icol);
330 }
331
332// Pour ne pas dessiner en dehors des axes
333 if ( (left0+dx/2. < xmin) || (left0+dx/2. > xmax) ||
334 (bottom0+dy/2. < ymin) || (bottom0+dy/2. > ymax) ) continue;
335
336 // Dessin proprement dit selon le choix graphique.
337 if(mTypDisp==0) {
338 //..... carres de tailles variables
339 double left = left0 + 0.5*(1.-fracred)*dx, width = fracred*dx;
340 double bottom = bottom0 + 0.5*(1.-fracred)*dy, height = fracred*dy;
341 if (cmap) g->DrawFBox(left,bottom,width,height);
342 else g->DrawBox(left,bottom,width,height);
343 } else if(mTypDisp==1) {
344 //..... nuage de points .....
345 int ipt = int( (float) npt *frac );
346 for(int k=0;k<ipt;k++) {
347 double x = left0 + frand01()*dx;
348 double y = bottom0 + frand01()*dy;
349 g->DrawMarker(x,y);
350 }
351 } else if(mTypDisp==2) {
352 //..... type hbook2/hprint .+23-Z*
353 char c[2];
354 c[0] = HPrint2(frac); c[1]='\0';
355 double x = left0 + dx/2.;
356 double y = bottom0 + dy/2.;
357 g->DrawString(x,y,c,PI_HorizontalCenter|PI_VerticalCenter);
358 } else if(mTypDisp==3) {
359 //..... carres de tailles fixes (avec gestion de continuite)
360 if (cmap) g->DrawFBox(left0,bottom0,dx+p1dx,dy+p1dy);
361 else g->DrawBox(left0,bottom0,dx+p1dx,dy+p1dy);
362 }
363
364}
365
366// Remise dans les conditions ulterieures pour la suite du graphique.
367GetGraphicAtt().SetMarkerAtt(MkSz,Mk);
368GetGraphicAtt().SetColAtt(fgcoul,bgcoul);
369g->SelFontSzPt(FontSize,FontAtt);
370GetGraphicAtt().SetLineAtt(LineAtt);
371if (cmap) delete cmap;
372
373// Fin du dessin, ecriture de la statistique.
374if(stats) DrawStats(g);
375}
376
377//++
378void PIHisto2D::GetClickInfo(string& info,double x,double y,double x0,double y0,bool fgdiff)
379//
380// Info specifique du drawer pour la position x,y
381//--
382{
383Histo2D* h = Histogram();
384if(h == NULL) return;
385
386int i,j;
387h->FindBin(x,y,i,j);
388if(i>=0 && i<h->NBinX() && j>=0 && j<h->NBinY()) {
389 char str[64];
390 if(fgdiff) {
391 int i0,j0;
392 h->FindBin(x0,y0,i0,j0);
393 if(i0>=0 && i0<h->NBinX() && j0>=0 && j0<h->NBinY()) {
394 sprintf(str," DV=%g",(*h)(i,j)-(*h)(i0,j0));
395 info += str;
396 } else {
397 info += " DV=?";
398 }
399 }
400 sprintf(str," V=%g",(*h)(i,j));
401 info += str;
402} else {
403 info += " V=?";
404}
405
406return;
407}
408
409//++
410void PIHisto2D::DrawStats(PIGraphicUC* g)
411//
412// Dessin des informations statistiques de l'histogramme.
413//--
414{
415 if (!mHisto) return;
416 if (GetGraphicAtt().GetLineAtt() == PI_NotDefLineAtt) g->SelLine(PI_ThinLine);
417 g->SelFontSz((YMax() - YMin())/30);
418
419 // La hauteur de la cellule
420 PIGrCoord a, d;
421 double cH = (double)g->GetFontHeight(a,d);
422 double cellHeight = 1.2 * cH;
423
424 // Les labels et leurs longueurs -> largeur de la cellule
425 char label[64];
426 sprintf(label,"N= %-g", mHisto->NData());
427 double cellWidth = 1.1 * (double)g->CalcStringWidth(label);
428
429 double xu, yu, cw;
430 // Les limites du cadre
431 xu = g->DeltaUCX(XMax(), -cellWidth);
432 yu = g->DeltaUCY(YMax(), -cellHeight);
433 g->DrawLine(xu,YMax(),xu,yu);
434 g->DrawLine(xu,yu,XMax(),yu);
435
436 // L'ecriture des labels
437 cw = (g->isAxeXDirRtoL()) ? -0.05*cellWidth : -0.95*cellWidth;
438 xu = g->DeltaUCX(XMax(),cw);
439 cw = (g->isAxeYDirUpDown()) ? -0.1*cH : -1.1*cH;
440 yu = g->DeltaUCY(YMax(),cw);
441 g->DrawString(xu,yu,label);
442
443 // printf("H[%d,%d] Dynamique: [%g,%g] Frac [%g,%g]\n"
444 // ,mHisto->NBinX(),mHisto->NBinY(),HMin(),HMax(),FMin(),FMax());
445}
446
447//++
448char PIHisto2D::HPrint2(float f)
449//
450// Codage des valeurs en caracteres (fct privee).
451//| f entre [0,1] mappee entre valeur=[0,37]
452//| si <0 alors =0, si >1 alors 1
453//| Display 4 ==> 4<=valeur<5
454//| C ==> 12<=valeur<13
455//| ==> valeur<=0
456//| * ==> valeur>=1
457//| . ==> 0<valeur<1
458//|------------------------------------------
459//| 1 2 3
460//| 01234567890123456789012345678901234567
461//| .+23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ*
462//|------------------------------------------
463//--
464{
465char str[39] = " .+23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ*";
466int i;
467if(f<=0.) i = 0;
468else if(f>=1.) i = 37;
469else { i = (int) (f*36.); i++;}
470if(i<0) i=0; else if (i>=38) i = 37;
471return str[i];
472}
473
474//++
475int PIHisto2D::NPixBin(PIGraphicUC* g)
476//
477// Nombre de pixels ecran dans un bin d'histogramme
478// (fct privee).
479//--
480{
481double dx = mHisto->WBinX(),dy = mHisto->WBinY();
482double dxg,dyg;
483g->DUC2GrC(dx,dy,dxg,dyg);
484int np = (int) dxg * (int) dyg;
485//printf("PIHisto2D::NPixBin H dx=%g dy=%g, G dx=%g dy=%g, np = %d\n"
486// ,dx,dy,dxg,dyg,np);
487return np;
488}
489
490//++
491int PIHisto2D::DecodeOptionString(vector<string> & opt, bool rmdecopt)
492//
493// Decodage des options
494//--
495{
496 // Decodage des options generales pidrawer
497 int optsz1 = opt.size();
498 if(optsz1<1) return(0);
499 int ndec1 = PIDrawer::DecodeOptionString(opt, rmdecopt);
500 if(optsz1-ndec1<1) return(ndec1); // si tout a ete decode
501
502 // Options generales pidrawer interessant le display Histo2D
503 bool rev;
504 if(GetGraphicAtt().GetColMapId(rev) != CMAP_OTHER) {
505 UseColors(true,GetGraphicAtt().GetColMapId(),rev);
506 } else UseColors(false);
507
508 // Decodage des options propres au display Histo2D
509 vector<string> udopt; // On gardera ici les options non decodees
510 unsigned int k = 0;
511 int ndec = opt.size();
512 bool listopt=false;
513 for( k=0; k<opt.size(); k++ ) {
514 string opts = opt[k];
515 if(opts=="h2help") {
516 string info; GetOptionsHelpInfo(info);
517 size_t q = info.find("PIHisto2D");
518 if(q<info.length()-1) cout<<info.substr(q)<<endl;
519 } else if(opts=="h2list") {
520 listopt=true;
521 } else if(opts=="sta" || opts=="stat" || opts=="stats") {
522 SetStats(true);
523 } else if( opts=="nsta" || opts=="nstat"
524 || opts=="nostat" || opts=="nostats") {
525 SetStats(false);
526 } else if(opts.substr(0,8)=="h2scale=") {
527 unsigned short t=TypScale(); float ls=LogScale();
528 if(opts.substr(8,3)=="lin") t=0;
529 else if(opts.substr(8,3)=="log")
530 {t=1; sscanf(opts.c_str(),"h2scale=log,%g",&ls);}
531 UseScale(t,ls);
532 } else if(opts.substr(0,7)=="h2disp=") {
533 unsigned short t=TypDisplay(); float fpts=FPoints();
534 if(opts.substr(7,3)=="var") t=0;
535 else if(opts.substr(7,3)=="hbk") t=2;
536 else if(opts.substr(7,3)=="img") t=3;
537 else if(opts.substr(7,3)=="pts")
538 {t=1; sscanf(opts.c_str(),"h2disp=pts,%g",&fpts);}
539 UseDisplay(t,fpts);
540 } else if(opts.substr(0,6)=="h2dyn=") {
541 float hmin=HMin(),hmax=HMax(); size_t q = opts.find(',');
542 sscanf(opts.c_str(),"h2dyn=%g",&hmin);
543 if(q<opts.length()-1) sscanf(opts.substr(q+1).c_str(),"%g",&hmax);
544 UseDyn(hmin,hmax);
545 } else if(opts.substr(0,7)=="h2frac=") {
546 float fmin=FMin(),fmax=FMax(); size_t q = opts.find(',');
547 sscanf(opts.c_str(),"h2frac=%g",&fmin);
548 if(q<opts.length()-1) sscanf(opts.substr(q+1).c_str(),"%g",&fmax);
549 UseFrac(fmin,fmax);
550 } else {
551 ndec--;
552 // S'il faut supprimer les options decodees
553 if (rmdecopt) udopt.push_back(opts);
554 }
555 }
556
557 // S'il faut supprimer les options decodees, on remplace l'argument opt
558 // par le vecteur des options non decodees.
559 if (rmdecopt) opt = udopt;
560
561 // Liste des options si demande
562 if(listopt) Print();
563
564 return(ndec+ndec1);
565}
566
567//++
568void PIHisto2D::GetOptionsHelpInfo(string& info)
569//
570// Help relatif au options
571//--
572{
573// On recupere d'abord la chaine info de la classe de base
574PIDrawer::GetOptionsHelpInfo(info);
575info += " ---- PIHisto2D options help info (see also ALT-O): \n" ;
576info += "- h2help: get this help text\n";
577info += "- h2list: list choosen options\n";
578info += "- sta,stat,stats: activate statistic display\n";
579info += " nsta,nstat,nostat,nostats: deactivate statistic display\n";
580info += "- h2disp=typ[,fracpts]: choose display type\n";
581info += " typ=var: variable size boxes\n";
582info += " typ=hbk: \"a la hbook2\"\n";
583info += " typ=img: image like (use \"h2col\" for color map)\n";
584info += " typ=pts: point clouds (fracpts=max possible fraction\n";
585info += " of used pixels per bin [0,1])\n";
586info += "- h2scale=lin/log[,logscale]: choose linear or logarithmic scale\n";
587info += "- h2dyn=[hmin][,hmax]: choose histogramme range for display\n";
588info += "- use general key to define color table (ex: grey32,midas_heat,...)\n";
589info += " (see general graphicatt description)\n";
590info += "- use key \"revcmap\" to reverse color table\n";
591info += "- h2frac=[fmin][,fmax]: choose sub-range display [0,1]\n";
592return;
593}
594
595/////////////////////////////////////////////////////////////////
596// Classe H2WinArg
597/////////////////////////////////////////////////////////////////
598//++
599// Class H2WinArg
600// Lib PIext
601// include pihisto2d.h
602//
603// Fenêtre de dialogue pour le choix des options de tracé pour "PIHisto2D"
604// Classe de fenêtre de dialogue permettant de modifier interactivement
605// Les différents attributs de visualisation pour les *PIImage* .
606//--
607//++
608// Links Parents
609// PIWindow
610//--
611//++
612// Links Voir aussi
613// PIHisto2D
614// PIH2DWdg
615//--
616
617//++
618// Titre Constructeur, méthodes
619//--
620
621PIBaseWdgGen* H2WinArg::mBWdg = NULL;
622PIHisto2D* H2WinArg::mH2DDrw = NULL;
623static H2WinArg* cur_h2winarg = NULL;
624
625void H2WinArg::ShowPIHisto2DTools()
626{
627 if (cur_h2winarg == NULL) cur_h2winarg = new H2WinArg(PIApplicationGetApp());
628 cur_h2winarg->Show();
629}
630
631void H2WinArg::ShowPIHisto2DTools(PIBaseWdgGen* cbw)
632{
633 if (cur_h2winarg == NULL) cur_h2winarg = new H2WinArg(PIApplicationGetApp());
634 mBWdg = cbw;
635 cur_h2winarg->Show();
636}
637
638void H2WinArg::HidePIHisto2DTools()
639{
640 if (cur_h2winarg != NULL) cur_h2winarg->Hide();
641}
642
643void H2WinArg::SetCurrentBaseWdg(PIBaseWdgGen* cbw)
644{
645 mBWdg = cbw;
646}
647
648void H2WinArg::SetCurrentPIHisto2D(PIHisto2D* h2ddrw)
649{
650 mH2DDrw = h2ddrw;
651}
652
653PIBaseWdgGen* H2WinArg::GetCurrentBaseWdg()
654{
655 return(mBWdg);
656}
657
658PIHisto2D* H2WinArg::GetCurrentPIHisto2D()
659{
660 return(mH2DDrw);
661}
662
663//++
664H2WinArg::H2WinArg(PIMsgHandler* par)
665//
666// Creation de la fenetre de gestion des parametres
667// des dessins des histogrammes 2D. Cette fenetre de
668// dialogue est partagee par tous les widget de dessin
669// des histogrammes 2D. Pour faire apparaitre la fenetre
670// tapez ALT-O.
671//--
672//++
673//| - Menu 1: Choix du type de display
674//| Carres variables, nuages de points, caracteres a la hbook2
675//| et carres de tailles fixe (couleur ou niveauz de gris).
676//| - Menu 2: Choix du type d'echelle
677//| Lineaire ou logarithmique
678//| - Menu 3: Choix de la couleur
679//| noir et blanc, niveau de gris et couleurs diverses.
680//| - Champ texte Dyn: Pour donner la dynamique, si min>=max
681//| alors prend le min et le max de l'histogramme
682//| (cf PIHisto2D::UseDyn)
683//| - Champ texte Frac: fraction mini et maxi
684//| (cf PIHisto2D::UseFrac)
685//| - Champ texte LogScal: niveau de scaling pour le choix d'une
686//| echelle logarithmique (cf PIHisto2D::UseScale)
687//--
688//++
689//| - Curseur interactif PerPt: pourcentage de points a dessiner
690//| dans chaque bin (cf PIHisto2D::UseDisplay)
691//| - Bouton Apply: dessiner avec les options affichees
692//| - Bouton Dismiss: fermeture de la fenetre de dialogue.
693//| - Bouton Get: re-prendre les valeurs de display stoquees
694//| pour un histogramme donne.
695//| - Bouton Print: Imprimer les caracteristiques du display
696//| et de l'histogramme.
697//--
698: PIWindow((PIMsgHandler *)par,"H2D-Options",PIWK_dialog,250,260,150,150)
699, mFgCol(false), mCmap(CMAP_GREYINV32), mRevCmap(false)
700, mTypScal(0) , mLogScale(10.)
701, mTypDisp(0) , mFPoints(0.5)
702, mHMin(1.) , mHMax(-1.)
703, mFracMin(0.1), mFracMax(0.9)
704{
705if(dbg) printf("H2WinArg::H2WinArg %p par=%p\n",this,par);
706
707// Taille automatique
708int bsx, bsy;
709PIApplicationPrefCompSize(bsx, bsy); // environ 6 lettres
710int spx = (bsx>=10) ? bsx/10 : 1; // intervalle entre lettres X
711int spy = (bsy>=5) ? bsy/5 : 1; // intervalle entre lettres Y
712int wszx = 5*spx+bsx+int(2.5*bsx); // Taille fenetre en X
713int wszy = 11*spy+int(8.5*bsy); // Taille fenetre en Y
714SetSize(wszx, wszy);
715
716// menu du style de display des bins
717 int cpx = 2*spx, cpy = 2*spy;
718mOPop[0] = new PIOptMenu(this,"optmen-h2d-1",2*bsx,bsy,cpx,cpy);
719mOPop[0]->AppendItem("Carres Var." ,6101);
720mOPop[0]->AppendItem("....." ,6102);
721mOPop[0]->AppendItem(".+12..Z*" ,6103);
722mOPop[0]->AppendItem("Carres Pleins",6104);
723mOPop[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
724
725// Menu du choix de la dynamique
726 cpy += bsy+spy;
727mOPop[1] = new PIOptMenu(this,"optmen-h2d-2",2*bsx,bsy,cpx,cpy);
728mOPop[1]->AppendItem("Lineaire",6201);
729mOPop[1]->AppendItem("Log10" ,6202);
730mOPop[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
731
732// Menu du choix de la table des couleurs
733 cpy += bsy+spy;
734mOPop[2] = new PIOptMenu(this,"optmen-h2d-3",2*bsx,bsy,cpx,cpy);
735mOPop[2]->AppendItem("Black&White",7000);
736mCasc[0] = new PIMenu(mOPop[2]->Menu(),"PIStd-128Col");
737mCasc[1] = new PIMenu(mOPop[2]->Menu(),"MIDAS-CMap");
738int kcc,nsct1=5,nsct2=9,nsct3=PIColorMap::NumberStandardColorMaps()-1;
739for(kcc=0; kcc<nsct1; kcc++)
740 mOPop[2]->AppendItem(PIColorMap::GetStandardColorMapName(kcc).c_str(),7001+kcc);
741for(kcc=nsct1; kcc<nsct2; kcc++)
742 mCasc[0]->AppendItem(PIColorMap::GetStandardColorMapName(kcc).c_str(),7001+kcc);
743mOPop[2]->AppendPDMenu(mCasc[0]);
744for(kcc=nsct2; kcc<nsct3; kcc++)
745 mCasc[1]->AppendItem(PIColorMap::GetStandardColorMapName(kcc).c_str(),7001+kcc);
746mOPop[2]->AppendPDMenu(mCasc[1]);
747for(kcc=nsct3; kcc<PIColorMap::NumberStandardColorMaps(); kcc++)
748 mOPop[2]->AppendItem(PIColorMap::GetStandardColorMapName(kcc).c_str(),7001+kcc);
749//mOPop[2]->SetValue(7000);
750mOPop[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
751
752// Reverse color map
753 cpy += bsy+spy;
754mCkb = new PICheckBox(this,"Reverse CMap",8001,2*bsx,bsy,cpx,cpy);
755mCkb->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
756
757// Labels et zones de saisie texte
758 cpy += bsy+spy;
759mLab[0] = new PILabel(this," Dyn: ",bsx,bsy,cpx,cpy);
760mLab[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
761mText[0] = new PIText(this,"Dynamique",int(2.5*bsx),bsy,cpx+bsx+spx,cpy);
762mText[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
763 cpy += bsy+spy;
764mLab[1] = new PILabel(this," Frac: ",bsx,bsy,cpx,cpy);
765mLab[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
766mText[1] = new PIText(this,"Fraction",int(2.5*bsx),bsy,cpx+bsx+spx,cpy);
767mText[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
768 cpy += bsy+spy;
769mLab[2] = new PILabel(this," LogScal: ",bsx,bsy,cpx,cpy);
770mLab[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
771mText[2] = new PIText(this,"LogScale",int(2.5*bsx),bsy,cpx+bsx+spx,cpy);
772mText[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
773
774// Labels et curseur mobile
775cpy += bsy+spy;
776mLab[3] = new PILabel(this," PerPt: ",bsx,bsy,cpx,cpy+int(0.25*bsy));
777mLab[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
778mPScal = new PIScale(this,"FracPoints",6401,kSDirLtoR
779 ,int(2.5*bsx),int(1.25*bsy),cpx+bsx+spx,cpy);
780mPScal->SetMinMax(0,100);
781mPScal->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
782
783//
784SetText();
785//
786
787// Boutons
788 cpx = 2*bsx+5*spx, cpy = 2*spy;
789mBut[0] = new PIButton(this,"Apply",6001,bsx,bsy,cpx,cpy);
790mBut[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
791 cpy += bsy+spy;
792mBut[1] = new PIButton(this,"Dismiss",6002,bsx,bsy,cpx,cpy);
793mBut[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
794 cpy += bsy+spy;
795mBut[2] = new PIButton(this,"Get",6003,bsx,bsy,cpx,cpy);
796mBut[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
797 cpy += bsy+spy;
798mBut[3] = new PIButton(this,"Print",6004,bsx,bsy,cpx,cpy);
799mBut[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
800// FinishCreate();
801}
802
803//++
804H2WinArg::~H2WinArg()
805//
806// Destructeur.
807//--
808{
809int i;
810if(dbg) printf("H2WinArg::~H2WinArg %p\n",this);
811for(i=0;i<2;i++) delete mCasc[i];
812for(i=0;i<3;i++) delete mOPop[i];
813for(i=0;i<4;i++) delete mBut[i];
814for(i=0;i<4;i++) delete mLab[i];
815for(i=0;i<3;i++) delete mText[i];
816delete mCkb;
817delete mPScal;
818}
819
820//++
821void H2WinArg::Show()
822//
823// Initialisation sur ouverture ALT-O
824//--
825{
826 if(dbg) printf("H2WinArg::Show() mH2DDrw=%p\n",mH2DDrw);
827 // Pour recuperer les valeurs du Drawer sur lequel on fait ALT-O
828 PIWindow::Show();
829 return;
830}
831
832//++
833void H2WinArg::SetText()
834//
835// Gestion des fenetres de saisie de texte et des pop-menus.
836//--
837{
838if(dbg) printf("H2WinArg::SetText()\n");
839string sdum;
840char str[256];
841
842sprintf(str,"%g %g",mHMin,mHMax);
843mText[0]->SetText(str);
844
845sprintf(str,"%g %g",mFracMin,mFracMax);
846mText[1]->SetText(str);
847
848sprintf(str,"%g",mLogScale);
849mText[2]->SetText(str);
850if(mTypScal==1) mText[2]->SetSensitive();
851 else mText[2]->SetUnSensitive();
852
853if(mTypDisp==0) {sdum="Carres Var."; mOPop[0]->SetValueStr(sdum);}
854else if(mTypDisp==1) {sdum="....."; mOPop[0]->SetValueStr(sdum);}
855else if(mTypDisp==2) {sdum=".+12..Z*"; mOPop[0]->SetValueStr(sdum);}
856else if(mTypDisp==3) {sdum="Carres Pleins"; mOPop[0]->SetValueStr(sdum);}
857
858if(mTypScal==0) {sdum="Lineaire"; mOPop[1]->SetValueStr(sdum);}
859else if(mTypScal==1) {sdum="Log10"; mOPop[1]->SetValueStr(sdum);}
860
861if(!mFgCol) {mOPop[2]->SetValue(7000);}
862else {
863 for(int kk=0;kk<PIColorMap::NumberStandardColorMaps();kk++)
864 if(mCmap == PIColorMap::GetStandardColorMapId(kk))
865 {mOPop[2]->SetValue(7001+kk); break;}
866}
867mCkb->SetState(mRevCmap);
868
869mPScal->SetValue(int(mFPoints*100.));
870if(mTypDisp==1) mPScal->SetSensitive();
871 else mPScal->SetUnSensitive();
872}
873
874//++
875void H2WinArg::Process(PIMessage msg, PIMsgHandler* sender, void*)
876//
877// Gestions des messages.
878//--
879{
880if(dbg) printf("H2WinArg::Process(%d-%d , %p ...) \n"
881 ,(int)UserMsg(msg),(int)ModMsg(msg),sender);
882
883// if(!mH2Wdg) return;
884if(!mBWdg) return;
885// PIHisto2D* mpih = mH2Wdg->GetPIHisto();
886PIHisto2D* mpih = mH2DDrw;
887if(!mpih) return;
888
889int opt = UserMsg(msg);
890
891 if(opt == 6101) {mTypDisp = 0;}
892else if(opt == 6102) {mTypDisp = 1;}
893else if(opt == 6103) {mTypDisp = 2;}
894else if(opt == 6104) {mTypDisp = 3;}
895
896else if(opt == 6201) {mTypScal = 0;}
897else if(opt == 6202) {mTypScal = 1;}
898
899else if(opt == 7000) {mFgCol = false;}
900else if(opt >= 7001 && opt <8000) {
901 int k = opt-7001;
902 mFgCol = true;
903 mCmap = PIColorMap::GetStandardColorMapId(k);
904}
905
906else if(opt == 8001) mRevCmap = mCkb->GetState();
907
908else if(opt == 6401) mFPoints = mPScal->GetValue()/100.;
909
910else if(opt==6001) {
911 sscanf(mText[0]->GetText().c_str(),"%g %g",&mHMin,&mHMax);
912 sscanf(mText[1]->GetText().c_str(),"%g %g",&mFracMin,&mFracMax);
913 sscanf(mText[2]->GetText().c_str(),"%g",&mLogScale);
914 mpih->UseColors(mFgCol,mCmap,mRevCmap);
915 mpih->UseScale(mTypScal,mLogScale);
916 mpih->UseDisplay(mTypDisp,mFPoints);
917 mpih->UseDyn(mHMin,mHMax);
918 mpih->UseFrac(mFracMin,mFracMax);
919 mBWdg->Refresh(); // On rafraichit le dessin (tout le PIScDrawWdg)
920}
921else if(opt==6002) this->Hide();
922else if (opt==6003) {
923 mFgCol = mpih->Color(); mCmap = mpih->ColMap();
924 mRevCmap = mpih->IsColMapRev();
925 mTypScal = mpih->TypScale(); mLogScale = mpih->LogScale();
926 mTypDisp = mpih->TypDisplay(); mFPoints = mpih->FPoints();
927 mHMin = mpih->HMin(); mHMax = mpih->HMax();
928 mFracMin = mpih->FMin(); mFracMax = mpih->FMax();
929}
930else if(opt==6004) mpih->Print(2);
931
932SetText();
933
934if(dbg) {
935 printf("H2WinArg::Process opt=%d col=%d,%d,%d scal=%d disp=%d npt=%g\n"
936 ,opt,(int)mFgCol,(int)mCmap,(int)mRevCmap,mTypScal,mTypDisp,mFPoints);
937 printf(" min,max= %g,%g frac= %g,%g logsc= %g\n"
938 ,mHMin,mHMax,mFracMin,mFracMax,mLogScale);
939}
940
941}
Note: See TracBrowser for help on using the repository browser.