source: Sophya/trunk/SophyaPI/PIext/nobjmgr.cc@ 376

Last change on this file since 376 was 374, checked in by ercodmgr, 26 years ago

Corrections diverses et fichier de numero de version pour piapp Reza 9/8/99

File size: 31.6 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <ctype.h>
4
5#include <typeinfo>
6#include <iostream.h>
7#include <string>
8#include <list>
9#include <map>
10#if defined(__KCC__)
11using std::string ;
12#include <list.h>
13#include <map.h>
14#endif
15
16#include "strutil.h"
17#include "datatypes.h"
18
19#include "nobjmgr.h"
20#include "servnobjm.h"
21#include "nomgadapter.h"
22#include "pistdimgapp.h"
23
24
25// EVOL-PLANCK
26#ifdef SANS_EVOLPLANCK
27#include "fitsimage.h"
28#endif
29
30#include "pisurfdr.h"
31#include "pipodrw.h"
32
33#include "pintuple.h"
34#include "pintup3d.h"
35#include "pigfd1.h"
36#include "pigfd2.h"
37
38
39//++
40// Class NamedObjMgr
41// Lib PI
42// include nobjmgr.h
43//
44// Cette classe fournit les services nécéssaires à la gestion des objets
45// (l'ensemble des objets PPersist de PEIDA++) au sein du programme
46// d'analyse interactive *piapp* . Elle constitue en outre l'interface
47// entre les fonctions utilisateur et l'application graphique.
48//--
49//++
50// Links Voir aussi
51// PIStdImgApp
52// Services2NObjMgr
53// PIACmd
54//--
55
56
57// ..................................................................
58// ...... Gestion des objets nommes, variables globales ............
59struct nobj_diritem {
60 int id; // Directory Id
61 int nobj; // Number of objects in directory
62 bool lock; // True -> directory locked, No Add, del or rename
63 bool keepold; // True -> When duplicate object name, old object moved to /old
64};
65
66typedef map<string, nobj_diritem, less<string> > NObjDirList;
67
68struct nobj_item {
69 AnyDataObj* obj; // Object pointer
70 NObjMgrAdapter* obja; // Object adapter pointer
71 int oid; // object Id
72 int dirid; // Directory Id
73 list<int> wrsid; // List of Window Resource Id (Drawer, PIBaseWdg, ...)
74 // (for PIStdImgApp)
75 bool operator==(nobj_item const& b) const
76 { return (this->obj == b.obj); }
77};
78
79typedef map<string, nobj_item, less<string> > NObjList;
80
81static NObjDirList* myDirs = NULL;
82static NObjList* myObjs = NULL;
83static int fgOInit = 0;
84static int myNObj = 0;
85static int myDirId = 0;
86static string* currDir;
87
88static PIStdImgApp* myImgApp=NULL;
89static Services2NObjMgr* servnobjm=NULL;
90
91static string* TmpDir; // Repertoire pour les compilations / link dynamique
92
93static bool BeQuiet = false; // Moins de messages ...
94
95// Pour completer le nom de l'objet avec le nom du repertoire
96static void RemoveSpacesFromName(string & nom);
97static bool CheckDirName(string & nom);
98static int ParseObjectName(string & nom, string & nomrep, string & nomobj);
99// ..................................................................
100
101//++
102// Titre Constructeurs
103//--
104//++
105// NamedObjMgr()
106// Constructeur. Les différents instantiation de la classe "NamedObjMgr"
107// dans une même application créent des objets qui travaillent sur la même
108// liste d'objets. Les objets de cette classe ne possedent en effet pas
109// de variables membres.
110//--
111
112/* --Methode-- */
113NamedObjMgr::NamedObjMgr()
114{
115if (fgOInit == 0) {
116 myNObj = 0;
117 myDirId = 0;
118 myDirs = new NObjDirList;
119 myObjs = new NObjList;
120 currDir = new string("home");
121 string dirn = "home";
122 CreateDir(dirn);
123 SetKeepOldDirAtt(dirn, true);
124 dirn = "tmp";
125 CreateDir(dirn);
126 SetKeepOldDirAtt(dirn, false);
127 dirn = "func";
128 CreateDir(dirn);
129 SetKeepOldDirAtt(dirn, false);
130 dirn = "old";
131 CreateDir(dirn);
132 SetKeepOldDirAtt(dirn, false);
133 dirn = "home";
134 SetCurrentDir(dirn);
135 myDirId = 50;
136 char* varenv;
137 TmpDir = new string("");
138 if ( (varenv=getenv("PEIDA_TMP")) != NULL ) (*TmpDir) = varenv;
139 else if ( (varenv=getenv("TMPDIR")) != NULL ) (*TmpDir) = varenv;
140 int l = (*TmpDir).length();
141 if ( (l>0) && ((*TmpDir)[l-1] != '/') ) (*TmpDir) += '/';
142 servnobjm = new Services2NObjMgr(this, (*TmpDir));
143 }
144fgOInit++;
145}
146
147
148/* --Methode-- */
149NamedObjMgr::~NamedObjMgr()
150{
151fgOInit--;
152if (fgOInit == 0) delete myObjs;
153}
154
155//++
156// Titre Méthodes
157//--
158//++
159// void SetImgApp(PIStdImgApp* app)
160// Spécifie l'objet "PIStdImgApp" associé.
161// PIStdImgApp* GetImgApp()
162// Accès à l'objet "PIStdImgApp" associé.
163//--
164
165/* --Methode-- */
166void NamedObjMgr::SetImgApp(PIStdImgApp* app)
167{
168myImgApp = app;
169servnobjm->SetImgApp(app);
170
171NObjDirList::iterator it;
172string cn;
173for(it= myDirs->begin(); it != myDirs->end(); it++) {
174 cn = '/' + (*it).first;
175 (myImgApp->ObjMgrW())->AddDirectory(cn.c_str(), (*it).second.id);
176 }
177}
178
179/* --Methode-- */
180PIStdImgApp* NamedObjMgr::GetImgApp()
181{
182return(myImgApp);
183}
184
185/* --Methode-- */
186Services2NObjMgr* NamedObjMgr::GetServiceObj()
187{
188return(servnobjm);
189}
190
191/* --Methode-- */
192bool NamedObjMgr::CreateDir(string & dirname)
193{
194if ( !CheckDirName(dirname) ) {
195 cout << "NamedObjMgr::CreateDir( " << dirname << ") Error - Invalid name !" << endl;
196 return(false);
197 }
198NObjDirList::iterator it = myDirs->find(dirname);
199if (it != myDirs->end()) {
200 cout << "NamedObjMgr::CreateDir( " << dirname << ") Error - Existing directory !" << endl;
201 return(false);
202 }
203myDirId++;
204nobj_diritem di;
205di.id = myDirId;
206di.nobj = 0;
207di.lock = false;
208di.keepold = false;
209(*myDirs)[dirname] = di;
210if (myImgApp) {
211 string str = '/' + dirname;
212 (myImgApp->ObjMgrW())->AddDirectory(str.c_str(), myDirId);
213 }
214cout << "NamedObjMgr::CreateDir() " << dirname << " Created " << endl;
215return(true);
216}
217
218/* --Methode-- */
219bool NamedObjMgr::DeleteDir(string & dirname)
220{
221if ( !CheckDirName(dirname) ) {
222 cout << "NamedObjMgr::DeleteDir( " << dirname << ") Error - Invalid name !" << endl;
223 return(false);
224 }
225NObjDirList::iterator it = myDirs->find(dirname);
226if (it == myDirs->end()) {
227 cout << "NamedObjMgr::DeleteDir( " << dirname << ") Error - No such directory !" << endl;
228 return(false);
229 }
230if ((*it).second.nobj > 0) {
231 cout << "NamedObjMgr::DeleteDir() " << dirname << " not empty ! " << endl;
232 return(false);
233 }
234if ((*it).second.lock ) {
235 cout << "NamedObjMgr::DeleteDir() " << dirname << " locked ! " << endl;
236 return(false);
237 }
238if ((*it).second.id < 50) {
239 cout << "NamedObjMgr::DeleteDir() " << dirname << " cannot be deleted ! " << endl;
240 return(false);
241 }
242
243if (myImgApp)
244 (myImgApp->ObjMgrW())->DelDirectory((*it).second.id);
245myDirs->erase(it);
246cout << "NamedObjMgr::DeleteDir() " << dirname << " deleted " << endl;
247return(true);
248}
249
250/* --Methode-- */
251void NamedObjMgr::LockDir(string & dirname)
252{
253if ( !CheckDirName(dirname) ) return;
254NObjDirList::iterator it = myDirs->find(dirname);
255if (it == myDirs->end()) return;
256(*it).second.lock = true;
257cout << "NamedObjMgr::LockDir() " << dirname << " Locked " << endl;
258return;
259}
260
261/* --Methode-- */
262void NamedObjMgr::UnlockDir(string & dirname)
263{
264if ( !CheckDirName(dirname) ) return;
265NObjDirList::iterator it = myDirs->find(dirname);
266if (it == myDirs->end()) return;
267(*it).second.lock = true;
268cout << "NamedObjMgr::UnlockDir() " << dirname << " Unlocked " << endl;
269return;
270}
271
272/* --Methode-- */
273void NamedObjMgr::SetKeepOldDirAtt(string & dirname, bool keepold)
274{
275if ( !CheckDirName(dirname) ) return;
276NObjDirList::iterator it = myDirs->find(dirname);
277if (it == myDirs->end()) return;
278(*it).second.keepold = keepold;
279cout << "NamedObjMgr::SetKeepOldDirAtt() " << dirname << " -> ";
280if ( keepold ) cout << " True " << endl;
281else cout << " False " << endl;
282return;
283}
284
285
286/* --Methode-- */
287bool NamedObjMgr::SetCurrentDir(string & dirname)
288{
289if ( !CheckDirName(dirname) ) {
290 cout << "NamedObjMgr::SetCurrentDir( " << dirname << ") Error - Invalid name !" << endl;
291 return(false);
292 }
293NObjDirList::iterator it = myDirs->find(dirname);
294if (it == myDirs->end()) {
295 cout << "NamedObjMgr::SetCurrentDir( " << dirname << ") Error - No such directory !" << endl;
296 return(false);
297 }
298*currDir = dirname;
299cout << "NamedObjMgr::SetCurrentDir() -> " << dirname << endl;
300return(true);
301}
302
303/* --Methode-- */
304void NamedObjMgr::GetCurrentDir(string & dirname)
305{
306dirname = *currDir;
307}
308
309/* --Methode-- */
310void NamedObjMgr::ListDirs(string & patt)
311{
312NObjDirList::iterator it;
313string cn;
314cout << "NamedObjMgr::ListDirs( " << patt << " ) " << endl;
315int k = 0;
316for(it= myDirs->begin(); it != myDirs->end(); it++) {
317 cn = (*it).first;
318 if (csh_parse(cn.c_str(), patt.c_str()) == 0) continue;
319 k++;
320 cout << k << "- " << (*it).first;
321 if ( (*it).second.lock ) cout << " Locked " ;
322 if ( (*it).second.keepold ) cout << " KeepOld " ;
323 cout << " (Id= " << (*it).second.id << " NbObj= " << (*it).second.nobj << ")" << endl;
324
325 }
326}
327
328/* --Methode-- */
329void NamedObjMgr::GetDirList(string & patt, vector<string>& lstd)
330{
331NObjDirList::iterator it;
332string cn;
333for(it= myDirs->begin(); it != myDirs->end(); it++) {
334 cn = (*it).first;
335 if (csh_parse(cn.c_str(), patt.c_str()) == 0) continue;
336 lstd.push_back(cn);
337 }
338}
339
340/* --Methode-- */
341void NamedObjMgr::CleanDir(string & dirname)
342{
343if ( !CheckDirName(dirname) ) {
344 cout << "NamedObjMgr::CleanDir( " << dirname << ") Error - Invalid name !" << endl;
345 }
346NObjDirList::iterator itr = myDirs->find(dirname);
347if (itr == myDirs->end()) {
348 cout << "NamedObjMgr::CleanDir( " << dirname << ") Error - No such directory !" << endl;
349 }
350
351int did = (*itr).second.id;
352NObjList::iterator it;
353list<int>::iterator iwr;
354bool nodisp = true;
355list<string> odel;
356for(it = myObjs->begin(); it != myObjs->end(); it++) {
357 if ((*it).second.dirid != did) continue;
358 nodisp = true;
359 if (myImgApp)
360 for(iwr=(*it).second.wrsid.begin(); iwr != (*it).second.wrsid.end(); iwr++)
361 if (myImgApp->CheckWRsId(*iwr)) { nodisp = false; break; }
362 if (nodisp) odel.push_back((*it).first);
363 }
364list<string>::iterator ii;
365for(ii=odel.begin(); ii != odel.end(); ii++) DelObj(*ii,true);
366}
367
368
369
370//++
371// Titre Gestion de la liste des objets
372//--
373//++
374// void AddObj(AnyDataObj* obj, string& nom)
375// Ajoute l'objet "obj" à la liste, identifié par "nom".
376// Si un objet de même nom existe, l'ancien objet est renommé en concaténant
377// un numéro à son nom.
378// void DelObj(string const& nom, bool fgd=true)
379// Supprime l'objet "nom" de la liste. L'objet est détruit si "fgd==true" ("delete obj")
380// void DelObjects(string const& patt, bool fgd=true)
381// Supprime l'ensemble des objets dont le nom correspond au patron "patt".
382// Le patron peut contenir les caractères "*" et "?" . Les objets sont détruits si "fgd==true"
383// AnyDataObj* GetObj(string const& nom)
384// Retourne l'objet identifié par "nom" dans la liste. Retourne "NULL" si "nom" n'est
385// pas dans la liste.
386// void RenameObj(string const& nom, string& nomnew)
387// Change le nom d'un objet dans la liste.
388//--
389
390
391/* --Methode-- */
392bool NamedObjMgr::AddObj(AnyDataObj* obj, string & nom, bool crd)
393{
394
395if (obj == NULL) return(false);
396// On verifie si l'objet est deja dans la liste
397NObjList::iterator it;
398for(it = myObjs->begin(); it != myObjs->end(); it++) {
399 if ((*it).second.obj == obj) {
400 cout << "NamedObjMgr::AddObj() Object already present with name " << (*it).first << endl;
401 return(false);
402 }
403 }
404string nobj;
405string nrep;
406char buff[32];
407int did = ParseObjectName(nom, nrep, nobj);
408if (did == 0) {
409 if (!crd) {
410 cout << "NamedObjMgr::AddObj() No " << nrep << " Directory " << endl;
411 return(false);
412 }
413 else { CreateDir(nrep); did = myDirId; }
414 }
415
416// Si c'est le repertoire /func, on nettoie
417if (nrep == "func") {
418 BeQuiet = true;
419 CleanDir(nrep);
420 BeQuiet = false;
421 }
422
423myNObj++;
424if (nobj.length() < 1) {
425 sprintf(buff,"O%d", myNObj);
426 nobj = buff;
427 }
428
429nom = '/' + nrep + '/' + nobj;
430NObjDirList::iterator itr = myDirs->find(nrep);
431if ((*itr).second.lock) {
432 cout << "NamedObjMgr::AddObj() " << nrep << " Locked Directory " << endl;
433 return(false);
434 }
435it = myObjs->find(nom);
436if (it != myObjs->end()) { // l'objet existe deja
437 if (nrep == "func") { // Dans /func , on garde les objets affiches, donc del. par Clean
438 sprintf(buff, "%d", (*it).second.oid);
439 string nomnew = "/func/" + nobj + buff;
440 RenameObj(nom, nomnew);
441 }
442 else if ( (*itr).second.keepold ) { // On met l'ancien objet dans /old
443 string on,od;
444// ParseObjectName((*it).first, od, on);
445 sprintf(buff, "%d", (*it).second.oid);
446 string nomnew = "/old/" + nobj + buff;
447 RenameObj(nom, nomnew);
448 }
449 else { // Sinon, on remplace l'objet
450 cout << "NamedObjMgr::AddObj() - Replacing " << nom << endl;
451 DelObj(nom);
452 }
453 }
454
455nobj_item no;
456no.obj = obj;
457no.obja = servnobjm->GetAdapter(obj); // L'adaptateur
458no.oid = myNObj;
459no.dirid = did;
460(*myObjs)[nom] = no;
461
462(*itr).second.nobj++;
463
464cout << "NamedObjMgr::AddObj() Object " << nom << " ( "
465 << typeid(*obj).name() << " ) added (Total= " << myObjs->size() << ")" << endl;
466return(true);
467}
468
469/* --Methode-- */
470bool NamedObjMgr::RenameObj(string & nom, string& nomnew)
471{
472string n1,r1,n2,r2;
473int dids = ParseObjectName(nom, r1, n1);
474NObjDirList::iterator itr1 = myDirs->find(r1);
475int did = ParseObjectName(nomnew, r2, n2);
476NObjDirList::iterator itr2 = myDirs->find(r2);
477
478if (did == 0) {
479 cout << "NamedObjMgr::RenameObj() Error - No " << r2 << " directory !" << endl;
480 return(false);
481 }
482nom = '/' + r1 + '/' + n1;
483nomnew = '/' + r2 + '/' + n2;
484NObjList::iterator it1 = myObjs->find(nom);
485if (it1 == myObjs->end()) {
486 cout << "NamedObjMgr::RenameObj() Error - No " << nom << " object !" << endl;
487 return(false);
488 }
489NObjList::iterator it2 = myObjs->find(nomnew);
490if (it2 != myObjs->end()) {
491 cout << "NamedObjMgr::RenameObj() Error - Object " << nomnew << " exist !" << endl;
492 return(false);
493 }
494
495if ( (*itr1).second.lock || (*itr2).second.lock ) {
496 cout << "NamedObjMgr::RenameObj() Error - Source or destination directory locked !"
497 << endl;
498 return(false);
499 }
500
501
502nobj_item no = (*it1).second;
503no.dirid = did;
504myObjs->erase(it1);
505NObjDirList::iterator itr = myDirs->find(r1);
506(*itr).second.nobj--;
507(*myObjs)[nomnew] = no;
508itr = myDirs->find(r2);
509(*itr).second.nobj++;
510cout << "NamedObjMgr::RenameObj() - Object " << nom << " renamed to " << nomnew << endl;
511return(true);
512}
513
514/* --Methode-- */
515bool NamedObjMgr::DelObj(string & nom, bool fgd)
516{
517string n1,r1;
518ParseObjectName(nom, r1, n1);
519nom = '/' + r1 + '/' + n1;
520NObjList::iterator it = myObjs->find(nom);
521if (it == myObjs->end()) return(false);
522NObjDirList::iterator itr = myDirs->find(r1);
523if ( (*itr).second.lock ) {
524 cout << "NamedObjMgr::DelObj() Error - Locked directory " << r1 << endl;
525 return(false);
526 }
527list<int>::iterator ii;
528if (myImgApp) {
529//DBG cerr << " *DBG* NamedObjMgr::DelObj Sz= " << (*it).second.wrsid.size() << endl;
530 for(ii=(*it).second.wrsid.begin(); ii != (*it).second.wrsid.end(); ii++)
531 myImgApp->DelWRsId((*ii));
532}
533delete (*it).second.obja; // destruction de l'adaptateur
534if (fgd) delete (*it).second.obj;
535
536myObjs->erase(it);
537(*itr).second.nobj--;
538
539if (BeQuiet) return(true);
540if (fgd) cout << "NamedObjMgr::DelObj() Object " << nom << " deleted (Total= " << myObjs->size() << ")" << endl;
541else cout << "NamedObjMgr::DelObj() Object " << nom << " removed (Total= " << myObjs->size() << ")" << endl;
542return(true);
543}
544
545/* --Methode-- */
546bool NamedObjMgr::DelObj_Id(int oid)
547{
548NObjList::iterator it;
549string nom;
550bool of = false;
551for(it = myObjs->begin(); it != myObjs->end(); it++)
552 if ( (*it).second.oid == oid ) {
553 of = true; nom = (*it).first;
554 break;
555 }
556if (of) return(DelObj(nom, true));
557else return(false);
558}
559
560/* --Methode-- */
561void NamedObjMgr::DelObjects(string & patt, bool fgd)
562{
563string n1,r1;
564ParseObjectName(patt, r1, n1);
565patt = '/' + r1 + '/' + n1;
566NObjList::iterator it;
567list<string> odel;
568string cn;
569for(it = myObjs->begin(); it != myObjs->end(); it++) {
570 cn = (*it).first;
571 if (csh_parse(cn.c_str(), patt.c_str()) != 0) odel.push_back(cn);
572 }
573list<string>::iterator ii;
574for(ii=odel.begin(); ii != odel.end(); ii++) DelObj(*ii, fgd);
575}
576
577/* --Methode-- */
578AnyDataObj* NamedObjMgr::GetObj(string & nom)
579{
580string n1,r1;
581ParseObjectName(nom, r1, n1);
582nom = '/' + r1 + '/' + n1;
583NObjList::iterator it = myObjs->find(nom);
584if (it == myObjs->end()) return(NULL);
585return((*it).second.obj);
586}
587
588/* --Methode-- */
589NObjMgrAdapter* NamedObjMgr::GetObjAdapter(string & nom)
590{
591string n1,r1;
592ParseObjectName(nom, r1, n1);
593nom = '/' + r1 + '/' + n1;
594NObjList::iterator it = myObjs->find(nom);
595if (it == myObjs->end()) return(NULL);
596return((*it).second.obja);
597}
598
599/* --Methode-- */
600void NamedObjMgr::ListObjs(string & patt)
601{
602int k;
603AnyDataObj* obj=NULL;
604string ctyp;
605char strg[256];
606
607string n1,r1;
608ParseObjectName(patt, r1, n1);
609patt = '/' + r1 + '/' + n1;
610 cout << "NamedObjMgr::ListObjs( " << patt << " ) TotNObjs= " << myObjs->size() << "\n" ;
611NObjList::iterator it; k = 0;
612string cn;
613for(it = myObjs->begin(); it != myObjs->end(); it++) {
614 cn = (*it).first;
615 if (csh_parse(cn.c_str(), patt.c_str()) == 0) continue;
616 obj = (*it).second.obj;
617 ctyp = typeid(*obj).name();
618 sprintf(strg, "%2d/ %16s : %s", k, typeid(*obj).name(), ((*it).first).c_str());
619 ctyp = strg;
620 cout << ctyp << "\n" ;
621 k++;
622}
623cout << endl;
624return;
625}
626
627/* --Methode-- */
628void NamedObjMgr::GetObjList(string & patt, vector<string> &lst)
629{
630string n1,r1;
631if (patt.length() < 1) return;
632bool fgr = (patt[0] == '/') ? true : false;
633ParseObjectName(patt, r1, n1);
634patt = '/' + r1 + '/' + n1;
635NObjList::iterator it;
636string cn;
637for(it = myObjs->begin(); it != myObjs->end(); it++) {
638 cn = (*it).first;
639 if (csh_parse(cn.c_str(), patt.c_str()) == 0) continue;
640 if (fgr) lst.push_back(cn);
641 else {
642 ParseObjectName(cn, r1, n1);
643 lst.push_back(n1);
644 }
645 }
646}
647
648//++
649// Titre Entrées-Sorties (I/O) sur les objets
650//--
651//++
652// void ReadObj(PInPersist& s, int num=-1)
653// Lit l'objet à partir avec le tag numéro "num" dans le flot "PInPersist s"
654// et l'ajoute à la liste. Si "num" est négatif, tous les objets présents
655// sur le flot "s" sont créés et ajoutés à la liste.
656// void ReadObj(string const & nomppf, string nobj="")
657// Lit le premier objet à partir du fichier PPF "nomppf". L'objet est ajouté
658// à la liste avec le nom "nobj". Si "nobj" est une chaîne vide, un nom est
659// composé à partir du nom de fichier.
660//--
661
662/* --Methode-- */
663void NamedObjMgr::ReadObj(string const & flnm, string & nobj)
664{
665PPersist* obj=NULL;
666bool ok = true;
667
668TRY{
669 PInPersist pis(flnm);
670 obj = PPersistMgr::ReadObject(pis);
671 if (obj == NULL) ok = false;
672} CATCH(merr)
673 { printf("NamedObjMgr::ReadObj()/Error Exception= %ld (%s) \n",
674 (long)merr, PeidaExc(merr)); ok = false; } ENDTRY;
675
676if (!ok) return;
677if (nobj.length()<1) nobj = servnobjm->FileName2Name(flnm);
678AddObj(obj->DataObj(), nobj, true);
679return;
680}
681
682/* --Methode-- */
683void NamedObjMgr::ReadObj(PInPersist& s, int num)
684{
685int i, cid, key, ln;
686int n0, n1;
687bool ok = true;
688PPersist* obj=NULL;
689string nom;
690
691if ( (s.NbTags() < 1) || (num >= s.NbTags()) ) {
692 if (num >= 0) {
693 printf("NamedObjMgr::ReadObj(PInPersist, %d) Error! NbTags = %d \n", num, s.NbTags());
694 return;
695 }
696 TRY {
697 obj = PPersistMgr::ReadObject(s);
698 if (obj == NULL) ok = false;
699 } CATCH(merr) {
700 printf("NamedObjMgr::ReadObj()/Error Exception= %ld (%s) \n", (long)merr, PeidaExc(merr));
701 ok = false;
702 } ENDTRY;
703 if (!ok) return;
704 nom = "";
705 AddObj(obj->DataObj(), nom);
706}
707
708if (num < 0) { n0 = 0; n1 = s.NbTags(); }
709else { n0 = num; n1 = num+1; }
710for(i=n0; i<n1; i++) {
711 key = s.TagKey(i, cid, ln);
712 if (ln <= 0) nom = "";
713 else nom = s.TagName(i);
714 s.GotoTag(i);
715 TRY {
716 obj = PPersistMgr::ReadObject(s);
717 if (obj == NULL) ok = false;
718 } CATCH(merr) {
719 printf("NamedObjMgr::ReadObj()/Error Exception= %ld (%s) \n", (long)merr, PeidaExc(merr));
720 ok = false;
721 } ENDTRY;
722 if (ok) AddObj(obj->DataObj(), nom, true);
723}
724
725return;
726}
727/* --Methode-- */
728void NamedObjMgr::ReadAll(string const & flnm)
729{
730bool ok = true;
731PPersist* obj=NULL;
732
733PInPersist* ppin;
734TRY{
735 ppin = new PInPersist(flnm);
736 if (ppin->NbTags() < 1) obj = PPersistMgr::ReadObject((*ppin));
737 else obj = NULL;
738} CATCH(merr)
739 { printf("NamedObjMgr::ReadAll()/Error Exception= %ld (%s) \n",
740 (long)merr, PeidaExc(merr)); ok = false; } ENDTRY;
741
742if (!ok) return;
743if (obj) {
744 string nom = servnobjm->FileName2Name(flnm);
745 AddObj(obj->DataObj(), nom);
746 }
747else ReadObj((*ppin), -1);
748delete ppin;
749return;
750}
751
752/* --Methode-- */
753void NamedObjMgr::ReadFits(string const & flnm, string & nobj)
754{
755bool ok = true;
756RzImage* obj;
757
758TRY{
759// obj = RzReadFits((char*)flnm.c_str(), ImgOffX, ImgOffY, ImgSizX, ImgSizY, ImgBitSgn);
760#ifdef SANS_EVOLPLANCK
761 obj = RzReadFits((char*)flnm.c_str());
762#else
763 printf("NamedObjMgr::ReadFITS( NON-Disponible EVOL-PLANCK) \n");
764 obj = NULL;
765#endif
766 if (obj == NULL) ok = false;
767} CATCH(merr) {
768 printf("NamedObjMgr::ReadFITS(_Error Exception= %ld (%s) \n", (long)merr, PeidaExc(merr));
769 ok = false;
770} ENDTRY;
771if (ok) {
772 if (nobj.length()<1) nobj = servnobjm->FileName2Name(flnm);
773 AddObj((AnyDataObj*)obj, nobj);
774}
775return;
776}
777
778
779static int key_for_write = 5000;
780/* --Methode-- */
781void NamedObjMgr::SaveObj(string & nom, POutPersist& s, bool keeppath)
782{
783if (nom.length() < 1) return;
784string nob,rep;
785ParseObjectName(nom, rep, nob);
786nom = '/' + rep + '/' + nob;
787NObjMgrAdapter* obja=NULL;
788string nomf = (keeppath) ? nom : nob;
789obja = GetObjAdapter(nom);
790if (obja == NULL) return;
791printf("NamedObjMgr::SaveObj(%s, ) (Type=%s) \n",
792 nom.c_str(), typeid(*(obja->GetDataObj())).name());
793obja->SavePPF(s, nomf);
794return;
795}
796
797/* --Methode-- */
798void NamedObjMgr::SaveObjects(string & patt, string const& flnm)
799{
800string n1,r1;
801if (patt.length() < 1) return;
802bool keeppath = (patt[0] == '/') ? true : false;
803ParseObjectName(patt, r1, n1);
804patt = '/' + r1 + '/' + n1;
805
806bool ok = true;
807POutPersist* pout;
808TRY{
809 pout = new POutPersist(flnm);
810} CATCH(merr)
811 { printf("NamedObjMgr::SaveObjects()/Error Exception= %ld (%s) \n",
812 (long)merr, PeidaExc(merr)); ok = false; } ENDTRY;
813if (!ok) return;
814NObjList::iterator it;
815string cn;
816for(it = myObjs->begin(); it != myObjs->end(); it++) {
817 cn = (*it).first;
818 if (csh_parse(cn.c_str(), patt.c_str()) == 0) continue;
819 SaveObj(cn, (*pout), keeppath);
820 }
821delete pout;
822return;
823}
824
825/* --Methode-- */
826void NamedObjMgr::SaveAll(string const& flnm)
827{
828bool ok = true;
829
830POutPersist* pout;
831TRY{
832 pout = new POutPersist(flnm);
833} CATCH(merr)
834 { printf("NamedObjMgr::SaveAll()/Error Exception= %ld (%s) \n",
835 (long)merr, PeidaExc(merr)); ok = false; } ENDTRY;
836if (!ok) return;
837NObjList::iterator it;
838string no;
839for(it = myObjs->begin(); it != myObjs->end(); it++) {
840 no = (*it).first;
841 SaveObj(no, (*pout), true);
842 }
843delete pout;
844return;
845}
846
847/* --Methode-- */
848void NamedObjMgr::SaveFits(string& nom, string const & flnm)
849{
850NObjMgrAdapter* obja=NULL;
851obja = GetObjAdapter(nom);
852if (obja == NULL) return;
853obja->SaveFits(flnm);
854return;
855}
856
857
858
859/* --Methode-- */
860void NamedObjMgr::PrintObj(string& nom)
861{
862NObjMgrAdapter* obja=NULL;
863obja = GetObjAdapter(nom);
864if (obja == NULL) return;
865
866string ctyp = typeid(*obja->GetDataObj()).name();
867cout << "NamedObjMgr::PrintObj(" << nom << ") Type: " << ctyp << endl;
868obja->Print(cout);
869
870return;
871}
872
873/* --Methode-- */
874void NamedObjMgr::DisplayObj(string& nom, string dopt)
875{
876NObjMgrAdapter* obja=NULL;
877obja = GetObjAdapter(nom);
878if (obja == NULL) {
879 cout << "NamedObjMgr::DisplayObj() Error , Pas d'objet de nom " << nom << endl;
880 return;
881}
882if (!myImgApp) return;
883
884PIDrawer * dr = NULL;
885P2DArrayAdapter* arr = NULL;
886dr = obja->GetDrawer(dopt);
887if (!dr) arr = obja->Get2DArray(dopt);
888
889if (!dr && !arr) {
890 string ctyp = typeid(*(obja->GetDataObj())).name();
891 cout << "NamedObjMgr::DisplayObj() Error , Pas de display pour " << ctyp << endl;
892 return;
893 }
894
895int wrsid = 0;
896bool fgsr = true;
897int opt = servnobjm->DecodeDispOption(dopt, fgsr);
898
899string n1,r1;
900ParseObjectName(nom, r1, n1);
901
902if (dr) {
903 PIDrawer3D * dr3 = dynamic_cast<PIDrawer3D *>(dr);
904 if(dr3) wrsid = myImgApp->Disp3DDrawer(dr3, n1, opt);
905 else wrsid = myImgApp->DispScDrawer( dr, n1, opt);
906 }
907else if (arr) wrsid = myImgApp->DispImage(arr, n1, opt);
908
909if(wrsid != 0) {
910 NObjList::iterator it = myObjs->find(nom);
911 if (it == myObjs->end()) return;
912 (*it).second.wrsid.push_back(wrsid);
913 }
914if (fgsr) myImgApp->RestoreGraphicAtt();
915return;
916}
917
918/* --Methode-- */
919void NamedObjMgr::DisplayImage(string& nom, string dopt)
920{
921NObjMgrAdapter* obja=NULL;
922obja = GetObjAdapter(nom);
923if (obja == NULL) {
924 cout << "NamedObjMgr::DisplayImage() Error , Pas d'objet de nom " << nom << endl;
925 return;
926}
927if (!myImgApp) return;
928
929P2DArrayAdapter* arr = obja->Get2DArray(dopt);
930
931if (!arr) {
932 string ctyp = typeid(*(obja->GetDataObj())).name();
933 cout << "NamedObjMgr::DisplayImage() Error , Non supporte pour " << ctyp << endl;
934 return;
935 }
936
937string n1,r1;
938ParseObjectName(nom, r1, n1);
939
940int wrsid = 0;
941bool fgsr = true;
942int opt = servnobjm->DecodeDispOption(dopt, fgsr);
943wrsid = myImgApp->DispImage(arr, n1, opt);
944
945if(wrsid != 0) {
946 NObjList::iterator it = myObjs->find(nom);
947 if (it == myObjs->end()) return;
948 (*it).second.wrsid.push_back(wrsid);
949 }
950if (fgsr) myImgApp->RestoreGraphicAtt();
951return;
952}
953/* --Methode-- */
954void NamedObjMgr::DisplaySurf3D(string& nom, string dopt)
955{
956NObjMgrAdapter* obja=NULL;
957obja = GetObjAdapter(nom);
958if (obja == NULL) {
959 cout << "NamedObjMgr::DisplayImage() Error , Pas d'objet de nom " << nom << endl;
960 return;
961}
962if (!myImgApp) return;
963
964P2DArrayAdapter* arr = obja->Get2DArray(dopt);
965
966if (!arr) {
967 string ctyp = typeid(*(obja->GetDataObj())).name();
968 cout << "NamedObjMgr::DisplaySurf3D() Error , Non supporte pour " << ctyp << endl;
969 return;
970 }
971
972if ((arr->XSize() > 250) || (arr->YSize() > 250)) {
973 cout << "NamedObjMgr::DisplaySurf3D() Error , 2D-Array(" << arr->XSize()
974 << "x" << arr->YSize() << ") trop grand (max=250x250)" << endl;
975 delete arr;
976 return;
977 }
978
979string n1,r1;
980ParseObjectName(nom, r1, n1);
981
982int wrsid = 0;
983bool fgsr = true;
984int opt = servnobjm->DecodeDispOption(dopt, fgsr);
985PISurfaceDrawer* sdr = new PISurfaceDrawer(arr, true, true, true);
986wrsid = myImgApp->Disp3DDrawer(sdr, n1, opt);
987if(wrsid >= 0) {
988 NObjList::iterator it = myObjs->find(nom);
989 if (it == myObjs->end()) return;
990 (*it).second.wrsid.push_back(wrsid);
991 }
992
993if (fgsr) myImgApp->RestoreGraphicAtt();
994return;
995}
996
997/* --Methode-- */
998void NamedObjMgr::DisplayNT(string& nom, string& nmx, string& nmy, string& nmz,
999 string& erx, string& ery, string& erz, string dopt, bool fg3d)
1000{
1001AnyDataObj* obj=GetObj(nom);
1002if (obj == NULL) {
1003 cout << "NamedObjMgr::DisplayNT() Error , Pas d'objet de nom " << nom << endl;
1004 return;
1005}
1006if (!myImgApp) return;
1007
1008NTupleInterface * nt = dynamic_cast<NTupleInterface *>(obj);
1009if (nt == NULL) {
1010// if (typeid(*obj) != typeid(NTupleInterface)) {
1011 string ctyp = typeid(*obj).name();
1012 cout << "NamedObjMgr::DisplayNT() Error , Objet n'est pas un NTuple " << ctyp << endl;
1013 return;
1014 }
1015
1016int wrsid = 0;
1017bool fgsr = true;
1018dopt = "defline," + dopt;
1019int opt = servnobjm->DecodeDispOption(dopt, fgsr);
1020
1021string n1,r1;
1022ParseObjectName(nom, r1, n1);
1023
1024if ( fg3d && (nmz.length()>0) ) { // Display 3D
1025 PINTuple3D* pin = new PINTuple3D(nt, false);
1026 pin->SelectXYZ(nmx.c_str(), nmy.c_str(), nmz.c_str());
1027 pin->SelectErrBar(erx.c_str(), ery.c_str(), erz.c_str());
1028 string titre = nmz + "%" + nmy + "%" + nmz;
1029 wrsid = myImgApp->Disp3DDrawer(pin, n1, opt, titre);
1030}
1031else {
1032 PINTuple* pin = new PINTuple(nt, false);
1033 pin->SelectXY(nmx.c_str(), nmy.c_str());
1034 pin->SelectErrBar(erx.c_str(), ery.c_str());
1035 if ( nmz.length()>0 ) pin->SelectWt(nmz.c_str());
1036 string titre = nmy + "%" + nmx;
1037 wrsid = myImgApp->DispScDrawer( (PIDrawer*)pin, n1, opt, titre);
1038 }
1039
1040if(wrsid >= 0) {
1041 NObjList::iterator it = myObjs->find(nom);
1042 if (it == myObjs->end()) return;
1043 (*it).second.wrsid.push_back(wrsid);
1044 }
1045
1046if (fgsr) myImgApp->RestoreGraphicAtt();
1047return;
1048}
1049
1050/* --Methode-- cmv 13/10/98 : Obsolete mais ne pas virer SVP */
1051void NamedObjMgr::DisplayGFD(string& nom, string& numvarx, string& numvary, string& err, string dopt)
1052// Pour le display 2D ou 3D d'un ``GeneralFitData''.
1053//| nom = nom de l'objet GeneralFitData a representer.
1054//| numvarx = numero (nombre entier) de la 1ere variable d'abscisse.
1055//| numvary = numero (nombre entier) de la 2sd variable d'abscisse (3D).
1056//| Pour le display 2D, numvary="" string vide.
1057//| err = qu'elles erreurs faut il representer ?
1058//| - 2D : x y xy (display y=f(x))
1059//| - 3D : x y z xy xz yz xzy (display z=f(x,y))
1060//| Ceci n'est suivi que si on a PI_NotDefLineAtt, sinon toutes
1061//| les barres d'erreurs sont representees.
1062//| opt = options generales pour le display.
1063{
1064AnyDataObj* obj=GetObj(nom);
1065if(obj == NULL)
1066 {cout << "NamedObjMgr::DisplayGFD() Error , Pas d'objet de nom " << nom << endl;
1067 return;}
1068if(!myImgApp) return;
1069if(typeid(*obj) != typeid(GeneralFitData))
1070 {string ctyp = typeid(*obj).name();
1071 cout<<"NamedObjMgr::DisplayGFD() Error , Objet n'est pas un GeneralFitData "<<ctyp<<endl;
1072 return;}
1073
1074// Decodage des options classiques
1075bool fgsr = true;
1076int opt = servnobjm->DecodeDispOption(dopt, fgsr);
1077// Decodage des erreurs a representer
1078bool errx=false, erry=false, errz=false;
1079if(err.length()>0) {
1080 for(int i=0;i<err.length();i++)
1081 if (err[i]=='x' || err[i]=='X') errx = true;
1082 else if(err[i]=='y' || err[i]=='Y') erry = true;
1083 else if(err[i]=='z' || err[i]=='Z') errz = true;
1084}
1085// Decodage des numeros de variables en abscisse
1086 int numvx=-1, numvy=-1;
1087 if(numvarx.length()>0) numvx = atoi(numvarx.c_str());
1088 if(numvary.length()>0) numvy = atoi(numvary.c_str());
1089
1090 string n1,r1;
1091 ParseObjectName(nom, r1, n1);
1092
1093 int wrsid = 0;
1094 if(numvy>=0) { // display 3D
1095 PIGenFitDat3D* pigfd = new PIGenFitDat3D(((GeneralFitData*)obj),false);
1096 pigfd->SelectXY(numvx,numvy);
1097 pigfd->SelectErrBar(errx,erry,errz);
1098 wrsid = myImgApp->Disp3DDrawer(pigfd,n1,opt);
1099} else { // display 2D
1100 PIGenFitDat* pigfd = new PIGenFitDat(((GeneralFitData*)obj),false);
1101 pigfd->SelectX(numvx);
1102 pigfd->SelectErrBar(errx,erry);
1103 wrsid = myImgApp->DispScDrawer((PIDrawer*)pigfd,n1,opt);
1104}
1105
1106if(wrsid >= 0) {
1107 NObjList::iterator it = myObjs->find(nom);
1108 if (it == myObjs->end()) return;
1109 (*it).second.wrsid.push_back(wrsid);
1110}
1111if (fgsr) myImgApp->RestoreGraphicAtt();
1112return;
1113}
1114
1115/* --Methode--
1116void NamedObjMgr::DisplayImage(string& nom, string dopt)
1117{
1118 cout << "NamedObjMgr::DisplayImage() a faire ! " << endl;
1119}
1120*/
1121
1122
1123
1124
1125/* --Methode-- */
1126void NamedObjMgr::SetGraphicAttributes(string gratt)
1127{
1128bool fg = false;
1129servnobjm->DecodeDispOption(gratt, fg);
1130}
1131
1132/* --Methode-- */
1133void NamedObjMgr::SetGraphicWinZone(int nzx, int nzy, bool fcr)
1134{
1135if (!myImgApp) return;
1136if (fcr) myImgApp->CreateGraphWin(nzx, nzy);
1137else myImgApp->SetZone(nzx, nzy);
1138}
1139
1140/* --Methode-- */
1141void NamedObjMgr::AddWRsId(string & nom, int wrsid)
1142{
1143if(wrsid != 0) {
1144 NObjList::iterator it = myObjs->find(nom);
1145 if (it == myObjs->end()) return;
1146 (*it).second.wrsid.push_back(wrsid);
1147 }
1148return;
1149}
1150
1151/* --Methode-- */
1152void NamedObjMgr::UpdateObjMgrWindow(int did)
1153{
1154if (!myImgApp) return;
1155(myImgApp->ObjMgrW())->ClearHelpList();
1156
1157NObjList::iterator it;
1158string cn;
1159for(it = myObjs->begin(); it != myObjs->end(); it++) {
1160 if ((*it).second.dirid != did) continue;
1161 cn = (*it).first.substr(1);
1162 cn = cn.substr(cn.find('/')+1) + " (T= " + typeid(*((*it).second.obj)).name() + ")" ;
1163 (myImgApp->ObjMgrW())->AddObj(cn.c_str());
1164 }
1165}
1166
1167
1168/* Nouvelle-Fonction */
1169void RemoveSpacesFromName(string & nom)
1170{
1171// on supprime les blancs de debut et de fin
1172size_t p = nom.find_first_not_of(" ");
1173if(p>nom.length()) { nom = ""; return; }
1174nom = nom.substr(p);
1175p = nom.find(' ');
1176if(p>nom.length()) p=nom.length();
1177nom = nom.substr(0, p);
1178}
1179
1180/* Nouvelle-Fonction */
1181bool CheckDirName(string & nom)
1182{
1183RemoveSpacesFromName(nom);
1184if (nom.length() < 1) return(false);
1185if (nom[0] == '/') nom = nom.substr(1) ;
1186size_t p = nom.find('/');
1187if (p < nom.length()) nom = nom.substr(0,p);
1188if (nom.length() < 1) return(false);
1189return(true);
1190}
1191
1192/* Nouvelle-Fonction */
1193int ParseObjectName(string & nom, string & nomrep, string & nomobj)
1194{
1195RemoveSpacesFromName(nom);
1196// Si le nom ne commence pas par un slash, c'est le repertoire courant
1197if (nom[0] != '/') { nomrep = *currDir; nomobj = nom; }
1198else {
1199 string xx = nom.substr(1);
1200 size_t p = xx.find('/');
1201 if (p < xx.length()) {
1202 nomrep = xx.substr(0,p);
1203 nomobj = xx.substr(p+1);
1204 }
1205 else {
1206 nomrep = xx;
1207 nomobj = "";
1208 }
1209 }
1210int rc = 0;
1211NObjDirList::iterator it = myDirs->find(nomrep);
1212if (it != myDirs->end()) rc = (*it).second.id;
1213return(rc);
1214}
1215
Note: See TracBrowser for help on using the repository browser.