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

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

1/ Extension de fonctionalites de gestion de repertoires (Lock, ...)
2/ Plus de NTupIntf_Adapter quand les objets heritent de NTupleInterface
3/ Support pour affichage info texte, ds PINtuple et PIStarList

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