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

Last change on this file since 2645 was 2645, checked in by cmv, 21 years ago

openppf modified to allow for object selection at the line command level. cmv 070205

File size: 44.0 KB
RevLine 
[165]1#include <stdio.h>
2#include <stdlib.h>
3#include <ctype.h>
4
[295]5#include <typeinfo>
[2322]6#include <iostream>
[165]7#include <string>
8#include <list>
9#include <map>
10
[2615]11#include "sopnamsp.h"
[165]12#include "strutil.h"
13#include "datatypes.h"
14
15#include "nobjmgr.h"
16#include "servnobjm.h"
[330]17#include "nomgadapter.h"
[165]18#include "pistdimgapp.h"
19
[1164]20#include "dvlist.h"
[165]21
[293]22// EVOL-PLANCK
23#ifdef SANS_EVOLPLANCK
24#include "fitsimage.h"
[1321]25#else
26#include "fitsautoreader.h"
[1525]27#include "tvector.h"
28#include "pitvmaad.h"
[1905]29#include "piyfxdrw.h"
[293]30#endif
31
[295]32#include "pisurfdr.h"
[165]33#include "pipodrw.h"
[333]34
[165]35#include "pintuple.h"
36#include "pintup3d.h"
37#include "pigfd1.h"
38#include "pigfd2.h"
39
[2491]40#include "zthread.h"
[165]41
[2491]42
[165]43//++
44// Class NamedObjMgr
45// Lib PI
46// include nobjmgr.h
47//
[344]48// Cette classe fournit les services nécéssaires à la gestion des objets
[165]49// (l'ensemble des objets PPersist de PEIDA++) au sein du programme
50// d'analyse interactive *piapp* . Elle constitue en outre l'interface
51// entre les fonctions utilisateur et l'application graphique.
52//--
53//++
54// Links Voir aussi
55// PIStdImgApp
56// Services2NObjMgr
57// PIACmd
58//--
59
60
61// ..................................................................
62// ...... Gestion des objets nommes, variables globales ............
[331]63struct nobj_diritem {
[344]64 int id; // Directory Id
65 int nobj; // Number of objects in directory
66 bool lock; // True -> directory locked, No Add, del or rename
67 bool keepold; // True -> When duplicate object name, old object moved to /old
[331]68};
69
70typedef map<string, nobj_diritem, less<string> > NObjDirList;
71
[165]72struct nobj_item {
[344]73 AnyDataObj* obj; // Object pointer
74 NObjMgrAdapter* obja; // Object adapter pointer
75 int oid; // object Id
76 int dirid; // Directory Id
77 list<int> wrsid; // List of Window Resource Id (Drawer, PIBaseWdg, ...)
78 // (for PIStdImgApp)
[165]79 bool operator==(nobj_item const& b) const
80 { return (this->obj == b.obj); }
81};
82
83typedef map<string, nobj_item, less<string> > NObjList;
84
[331]85static NObjDirList* myDirs = NULL;
86static NObjList* myObjs = NULL;
[165]87static int fgOInit = 0;
88static int myNObj = 0;
[331]89static int myDirId = 0;
90static string* currDir;
[165]91
92static PIStdImgApp* myImgApp=NULL;
93static Services2NObjMgr* servnobjm=NULL;
94
[1164]95static DVList* myVars = NULL; // Pour stocker les variables
96
[165]97static string* TmpDir; // Repertoire pour les compilations / link dynamique
98
[2491]99// Pour gestion multithread
100static ZMutex* myMutex;
[333]101// ..................................................................
102
[165]103//++
104// Titre Constructeurs
105//--
106//++
107// NamedObjMgr()
108// Constructeur. Les différents instantiation de la classe "NamedObjMgr"
109// dans une même application créent des objets qui travaillent sur la même
110// liste d'objets. Les objets de cette classe ne possedent en effet pas
111// de variables membres.
112//--
113
114/* --Methode-- */
[2490]115NamedObjMgr::NamedObjMgr(bool fgimgapp)
[165]116{
[2490]117_fgimgapp = fgimgapp;
[165]118if (fgOInit == 0) {
[333]119 myNObj = 0;
120 myDirId = 0;
[331]121 myDirs = new NObjDirList;
[165]122 myObjs = new NObjList;
[1164]123 myVars = new DVList;
[331]124 currDir = new string("home");
[333]125 string dirn = "home";
[2491]126 CreateDir_P(dirn);
[2132]127 SetKeepOldDirAtt(dirn, false);
[333]128 dirn = "tmp";
[2491]129 CreateDir_P(dirn);
[344]130 SetKeepOldDirAtt(dirn, false);
[466]131 dirn = "autoc";
[2491]132 CreateDir_P(dirn);
[368]133 SetKeepOldDirAtt(dirn, false);
[333]134 dirn = "old";
[2491]135 CreateDir_P(dirn);
[344]136 SetKeepOldDirAtt(dirn, false);
[333]137 dirn = "home";
138 SetCurrentDir(dirn);
139 myDirId = 50;
[165]140 char* varenv;
141 TmpDir = new string("");
[1276]142 if ( (varenv=getenv("TMPDIR")) != NULL ) (*TmpDir) = varenv;
[165]143 int l = (*TmpDir).length();
144 if ( (l>0) && ((*TmpDir)[l-1] != '/') ) (*TmpDir) += '/';
[2491]145 servnobjm = new Services2NObjMgr(*TmpDir);
146 myMutex = new ZMutex;
[165]147 }
148fgOInit++;
149}
150
151
152/* --Methode-- */
153NamedObjMgr::~NamedObjMgr()
154{
155fgOInit--;
[1164]156if (fgOInit == 0) {
157 string patt = "/*/*";
158 DelObjects(patt, true);
159 delete myObjs;
160 delete myDirs;
161 delete myVars;
[2491]162 delete myMutex;
[165]163}
[1164]164}
[165]165
166//++
167// Titre Méthodes
168//--
169//++
170// void SetImgApp(PIStdImgApp* app)
171// Spécifie l'objet "PIStdImgApp" associé.
172// PIStdImgApp* GetImgApp()
173// Accès à l'objet "PIStdImgApp" associé.
174//--
175
176/* --Methode-- */
177void NamedObjMgr::SetImgApp(PIStdImgApp* app)
178{
179myImgApp = app;
180servnobjm->SetImgApp(app);
[333]181
182NObjDirList::iterator it;
183string cn;
184for(it= myDirs->begin(); it != myDirs->end(); it++) {
185 cn = '/' + (*it).first;
186 (myImgApp->ObjMgrW())->AddDirectory(cn.c_str(), (*it).second.id);
187 }
[165]188}
189
[449]190
191static bool verbeux = false; // true -> plus de message (creation/suppression d'objets)
192void NamedObjMgr::SetVerbose(bool fg)
193{
194verbeux = fg;
195}
196
[165]197/* --Methode-- */
198PIStdImgApp* NamedObjMgr::GetImgApp()
199{
200return(myImgApp);
201}
202
203/* --Methode-- */
204Services2NObjMgr* NamedObjMgr::GetServiceObj()
205{
206return(servnobjm);
207}
208
[331]209/* --Methode-- */
[1268]210string const& NamedObjMgr::GetTmpDir()
[1265]211{
212return *TmpDir;
213}
214
215/* --Methode-- */
[1268]216void NamedObjMgr::SetTmpDir(string const& tmpdir)
[1265]217{
218if(tmpdir.length()<1) return;
219*TmpDir = tmpdir;
[1276]220int l = (*TmpDir).length();
221if ( (l>0) && ((*TmpDir)[l-1] != '/') ) (*TmpDir) += '/';
222servnobjm->SetTmpDir(*TmpDir);
[1265]223}
224
225/* --Methode-- */
[1164]226bool NamedObjMgr::SetVar(string const & key, string const & val)
227{
[2218]228 if ((key.length() < 1) || (! isalpha(key[0])) ) {
229 cout << "NamedObjMgr::SetVar( " << key << " ...) Bad VarName " << endl;
230 return(false);
231 }
[2491]232 ZSync(*myMutex);
[1199]233#ifdef SANS_EVOLPLANCK
234 bool fg = true;
235#else
[1164]236 bool fg = myVars->HasKey(key);
[1199]237#endif
[1164]238 myVars->SetS(key, val);
[1224]239 // cout << " DEBUG::SetVar " << *myVars << endl;
[1164]240 return(fg);
241}
242
243/* --Methode-- */
244bool NamedObjMgr::HasVar(string const & key)
245{
[2218]246 if ((key.length() < 1) || (! isalpha(key[0])) ) {
247 cout << "NamedObjMgr::HasVar( " << key << ") Bad VarName " << endl;
248 return(false);
249 }
[2491]250 ZSync(*myMutex);
[1199]251#ifdef SANS_EVOLPLANCK
[1547]252 DVList::ValList::const_iterator it;
253 for(it=myVars->Begin(); it!= myVars->End(); it++)
254 if ((*it).first == key) return true;
[1199]255 return(false);
256#else
[1164]257 return(myVars->HasKey(key));
[1199]258#endif
[1164]259}
260
261/* --Methode-- */
262bool NamedObjMgr::DeleteVar(string const & key)
263{
[2218]264 if ((key.length() < 1) || (! isalpha(key[0])) ) {
265 cout << "NamedObjMgr::DeleteVar( " << key << ") Bad VarName " << endl;
266 return(false);
267 }
[2491]268 ZSync(*myMutex);
[1199]269#ifdef SANS_EVOLPLANCK
270 return(false);
271#else
[1164]272 return(myVars->DeleteKey(key));
[1199]273#endif
[1164]274}
275
276/* --Methode-- */
277string NamedObjMgr::GetVar(string const & key)
278{
[2218]279 if ((key.length() < 1) || (! isalpha(key[0])) ) {
280 cout << "NamedObjMgr::GetVar( " << key << ") Bad VarName " << endl;
281 return("");
282 }
[2491]283 ZSync(*myMutex);
[1224]284 // cout << " DEBUG::GetVar " << *myVars << endl;
[1164]285 return(myVars->GetS(key));
286}
287
288/* --Methode-- */
289DVList& NamedObjMgr::GetVarList()
290{
[1224]291 // cout << " DEBUG::GetVarList " << *myVars << endl;
[2491]292 ZSync(*myMutex);
[1164]293 return(*myVars);
294}
295
296/* --Methode-- */
[344]297bool NamedObjMgr::CreateDir(string & dirname)
[331]298{
[2491]299 ZSync(*myMutex);
300 return CreateDir_P(dirname);
301}
302
303/* --Methode-- */
304bool NamedObjMgr::CreateDir_P(string & dirname)
305{
[333]306if ( !CheckDirName(dirname) ) {
307 cout << "NamedObjMgr::CreateDir( " << dirname << ") Error - Invalid name !" << endl;
[344]308 return(false);
[333]309 }
310NObjDirList::iterator it = myDirs->find(dirname);
311if (it != myDirs->end()) {
312 cout << "NamedObjMgr::CreateDir( " << dirname << ") Error - Existing directory !" << endl;
[344]313 return(false);
[333]314 }
315myDirId++;
316nobj_diritem di;
317di.id = myDirId;
318di.nobj = 0;
[344]319di.lock = false;
320di.keepold = false;
[333]321(*myDirs)[dirname] = di;
322if (myImgApp) {
323 string str = '/' + dirname;
[2492]324 if ( !_fgimgapp ) myImgApp->LockMutex();
[333]325 (myImgApp->ObjMgrW())->AddDirectory(str.c_str(), myDirId);
[2492]326 if ( !_fgimgapp ) myImgApp->UnlockMutex(true);
327}
[449]328if (verbeux) cout << "NamedObjMgr::CreateDir() " << dirname << " Created " << endl;
[344]329return(true);
[331]330}
331
332/* --Methode-- */
[344]333bool NamedObjMgr::DeleteDir(string & dirname)
[331]334{
[333]335if ( !CheckDirName(dirname) ) {
336 cout << "NamedObjMgr::DeleteDir( " << dirname << ") Error - Invalid name !" << endl;
[344]337 return(false);
[333]338 }
[2491]339ZSync(*myMutex);
[333]340NObjDirList::iterator it = myDirs->find(dirname);
341if (it == myDirs->end()) {
342 cout << "NamedObjMgr::DeleteDir( " << dirname << ") Error - No such directory !" << endl;
[344]343 return(false);
[333]344 }
345if ((*it).second.nobj > 0) {
346 cout << "NamedObjMgr::DeleteDir() " << dirname << " not empty ! " << endl;
[344]347 return(false);
[333]348 }
[344]349if ((*it).second.lock ) {
350 cout << "NamedObjMgr::DeleteDir() " << dirname << " locked ! " << endl;
351 return(false);
352 }
[333]353if ((*it).second.id < 50) {
354 cout << "NamedObjMgr::DeleteDir() " << dirname << " cannot be deleted ! " << endl;
[344]355 return(false);
[333]356 }
357
[2490]358if (myImgApp) {
[2492]359 if ( !_fgimgapp ) myImgApp->LockMutex();
[333]360 (myImgApp->ObjMgrW())->DelDirectory((*it).second.id);
[2492]361 if ( !_fgimgapp ) myImgApp->UnlockMutex(true);
[2490]362}
[333]363myDirs->erase(it);
[449]364if (verbeux) cout << "NamedObjMgr::DeleteDir() " << dirname << " deleted " << endl;
[344]365return(true);
[331]366}
367
368/* --Methode-- */
[344]369void NamedObjMgr::LockDir(string & dirname)
[331]370{
[2491]371ZSync(*myMutex);
[344]372if ( !CheckDirName(dirname) ) return;
373NObjDirList::iterator it = myDirs->find(dirname);
374if (it == myDirs->end()) return;
375(*it).second.lock = true;
[449]376if (verbeux) cout << "NamedObjMgr::LockDir() " << dirname << " Locked " << endl;
[344]377return;
378}
379
380/* --Methode-- */
381void NamedObjMgr::UnlockDir(string & dirname)
382{
[2491]383ZSync(*myMutex);
[344]384if ( !CheckDirName(dirname) ) return;
385NObjDirList::iterator it = myDirs->find(dirname);
386if (it == myDirs->end()) return;
387(*it).second.lock = true;
[449]388if (verbeux) cout << "NamedObjMgr::UnlockDir() " << dirname << " Unlocked " << endl;
[344]389return;
390}
391
392/* --Methode-- */
393void NamedObjMgr::SetKeepOldDirAtt(string & dirname, bool keepold)
394{
[2491]395ZSync(*myMutex);
[344]396if ( !CheckDirName(dirname) ) return;
397NObjDirList::iterator it = myDirs->find(dirname);
398if (it == myDirs->end()) return;
399(*it).second.keepold = keepold;
[449]400if (!verbeux) return;
[344]401cout << "NamedObjMgr::SetKeepOldDirAtt() " << dirname << " -> ";
402if ( keepold ) cout << " True " << endl;
403else cout << " False " << endl;
404return;
405}
406
407
408/* --Methode-- */
409bool NamedObjMgr::SetCurrentDir(string & dirname)
410{
[2491]411ZSync(*myMutex);
[333]412if ( !CheckDirName(dirname) ) {
413 cout << "NamedObjMgr::SetCurrentDir( " << dirname << ") Error - Invalid name !" << endl;
[344]414 return(false);
[333]415 }
416NObjDirList::iterator it = myDirs->find(dirname);
417if (it == myDirs->end()) {
418 cout << "NamedObjMgr::SetCurrentDir( " << dirname << ") Error - No such directory !" << endl;
[344]419 return(false);
[333]420 }
421*currDir = dirname;
[449]422if (verbeux) cout << "NamedObjMgr::SetCurrentDir() -> " << dirname << endl;
[344]423return(true);
[331]424}
425
426/* --Methode-- */
[333]427void NamedObjMgr::GetCurrentDir(string & dirname)
428{
[2491]429ZSync(*myMutex);
[333]430dirname = *currDir;
431}
432
433/* --Methode-- */
434void NamedObjMgr::ListDirs(string & patt)
435{
[2491]436ZSync(*myMutex);
[333]437NObjDirList::iterator it;
438string cn;
439cout << "NamedObjMgr::ListDirs( " << patt << " ) " << endl;
440int k = 0;
441for(it= myDirs->begin(); it != myDirs->end(); it++) {
442 cn = (*it).first;
443 if (csh_parse(cn.c_str(), patt.c_str()) == 0) continue;
444 k++;
[344]445 cout << k << "- " << (*it).first;
446 if ( (*it).second.lock ) cout << " Locked " ;
447 if ( (*it).second.keepold ) cout << " KeepOld " ;
448 cout << " (Id= " << (*it).second.id << " NbObj= " << (*it).second.nobj << ")" << endl;
449
[333]450 }
451}
452
453/* --Methode-- */
454void NamedObjMgr::GetDirList(string & patt, vector<string>& lstd)
455{
[2491]456ZSync(*myMutex);
[333]457NObjDirList::iterator it;
458string cn;
459for(it= myDirs->begin(); it != myDirs->end(); it++) {
460 cn = (*it).first;
461 if (csh_parse(cn.c_str(), patt.c_str()) == 0) continue;
462 lstd.push_back(cn);
463 }
464}
465
466/* --Methode-- */
[368]467void NamedObjMgr::CleanDir(string & dirname)
[331]468{
[2491]469ZSync(*myMutex);
470CleanDir_P(dirname);
471}
472
473/* --Methode-- */
474void NamedObjMgr::CleanDir_P(string & dirname)
475{
[368]476if ( !CheckDirName(dirname) ) {
477 cout << "NamedObjMgr::CleanDir( " << dirname << ") Error - Invalid name !" << endl;
[380]478 // return(false); $CHECK$ illegal return value in void function
[368]479 }
480NObjDirList::iterator itr = myDirs->find(dirname);
481if (itr == myDirs->end()) {
482 cout << "NamedObjMgr::CleanDir( " << dirname << ") Error - No such directory !" << endl;
[380]483 // return(false); $CHECK$ illegal return value in void function
[368]484 }
[331]485
[368]486int did = (*itr).second.id;
487NObjList::iterator it;
488list<int>::iterator iwr;
489bool nodisp = true;
490list<string> odel;
491for(it = myObjs->begin(); it != myObjs->end(); it++) {
492 if ((*it).second.dirid != did) continue;
493 nodisp = true;
494 if (myImgApp)
495 for(iwr=(*it).second.wrsid.begin(); iwr != (*it).second.wrsid.end(); iwr++)
496 if (myImgApp->CheckWRsId(*iwr)) { nodisp = false; break; }
497 if (nodisp) odel.push_back((*it).first);
498 }
499list<string>::iterator ii;
500for(ii=odel.begin(); ii != odel.end(); ii++) DelObj(*ii,true);
[2490]501if (myImgApp) {
[2492]502 if ( !_fgimgapp ) myImgApp->LockMutex();
[685]503 (myImgApp->ObjMgrW())->UpdateList(did);
[2492]504 if ( !_fgimgapp ) myImgApp->UnlockMutex(true);
[331]505}
[2490]506}
[331]507
[333]508
[368]509
[165]510//++
511// Titre Gestion de la liste des objets
512//--
513//++
[295]514// void AddObj(AnyDataObj* obj, string& nom)
[165]515// Ajoute l'objet "obj" à la liste, identifié par "nom".
516// Si un objet de même nom existe, l'ancien objet est renommé en concaténant
517// un numéro à son nom.
518// void DelObj(string const& nom, bool fgd=true)
519// Supprime l'objet "nom" de la liste. L'objet est détruit si "fgd==true" ("delete obj")
520// void DelObjects(string const& patt, bool fgd=true)
521// Supprime l'ensemble des objets dont le nom correspond au patron "patt".
522// Le patron peut contenir les caractères "*" et "?" . Les objets sont détruits si "fgd==true"
[295]523// AnyDataObj* GetObj(string const& nom)
[165]524// Retourne l'objet identifié par "nom" dans la liste. Retourne "NULL" si "nom" n'est
525// pas dans la liste.
526// void RenameObj(string const& nom, string& nomnew)
527// Change le nom d'un objet dans la liste.
[463]528// void CopyObj(string const& nom, string& nomcp)
529// Copy l'objet "nom" de la liste dans l'objet "nomcp" de la liste.
[165]530//--
531
532/* --Methode-- */
[344]533bool NamedObjMgr::AddObj(AnyDataObj* obj, string & nom, bool crd)
[165]534{
[2491]535 ZSync(*myMutex);
536 return AddObj_P(obj, nom, crd);
537}
[165]538
[2491]539/* --Methode-- */
540bool NamedObjMgr::AddObj_P(AnyDataObj* obj, string & nom, bool crd)
541{
542
[344]543if (obj == NULL) return(false);
[333]544// On verifie si l'objet est deja dans la liste
545NObjList::iterator it;
546for(it = myObjs->begin(); it != myObjs->end(); it++) {
547 if ((*it).second.obj == obj) {
548 cout << "NamedObjMgr::AddObj() Object already present with name " << (*it).first << endl;
[344]549 return(false);
[333]550 }
551 }
552string nobj;
553string nrep;
554char buff[32];
555int did = ParseObjectName(nom, nrep, nobj);
556if (did == 0) {
557 if (!crd) {
558 cout << "NamedObjMgr::AddObj() No " << nrep << " Directory " << endl;
[344]559 return(false);
[333]560 }
[2491]561 else { CreateDir_P(nrep); did = myDirId; }
[333]562 }
[165]563
[466]564// Si c'est le repertoire /autoc, on nettoie
565if (nrep == "autoc") {
[2491]566 CleanDir_P(nrep);
[368]567 }
568
[165]569myNObj++;
[2218]570if ((nobj.length() < 1) || (! isalpha(nobj[0]) ) ) {
571 cout << "NamedObjMgr::AddObj() bad object name " << nobj ;
[333]572 sprintf(buff,"O%d", myNObj);
573 nobj = buff;
[2218]574 cout << " changed to " << nobj << endl;
[333]575 }
576
577nom = '/' + nrep + '/' + nobj;
[344]578NObjDirList::iterator itr = myDirs->find(nrep);
579if ((*itr).second.lock) {
580 cout << "NamedObjMgr::AddObj() " << nrep << " Locked Directory " << endl;
581 return(false);
582 }
[333]583it = myObjs->find(nom);
[165]584if (it != myObjs->end()) { // l'objet existe deja
[466]585 if (nrep == "autoc") { // Dans /autoc , on garde les objets affiches, donc del. par Clean
[368]586 sprintf(buff, "%d", (*it).second.oid);
[466]587 string nomnew = "/autoc/" + nobj + buff;
[2491]588 RenameObj_P(nom, nomnew);
[368]589 }
590 else if ( (*itr).second.keepold ) { // On met l'ancien objet dans /old
[333]591 string on,od;
[335]592// ParseObjectName((*it).first, od, on);
[333]593 sprintf(buff, "%d", (*it).second.oid);
[335]594 string nomnew = "/old/" + nobj + buff;
[2491]595 RenameObj_P(nom, nomnew);
[333]596 }
[344]597 else { // Sinon, on remplace l'objet
598 cout << "NamedObjMgr::AddObj() - Replacing " << nom << endl;
[2491]599 DelObj_P(nom);
[344]600 }
[165]601 }
602
603nobj_item no;
604no.obj = obj;
[295]605no.obja = servnobjm->GetAdapter(obj); // L'adaptateur
[333]606no.oid = myNObj;
607no.dirid = did;
[331]608(*myObjs)[nom] = no;
[333]609
610(*itr).second.nobj++;
611
[2490]612if (myImgApp != NULL) {
[2492]613 if ( !_fgimgapp ) myImgApp->LockMutex();
[2490]614 if ( (myImgApp->ObjMgrW())->Visible() ) {
615 string oln = nobj + " (T= " + no.obja->GetDataObjType() + ")" ;
616 (myImgApp->ObjMgrW())->AddObjList(did, oln.c_str(), no.oid);
[685]617 }
[2492]618 if ( !_fgimgapp ) myImgApp->UnlockMutex(true);
[2490]619}
[449]620if (verbeux) cout << "NamedObjMgr::AddObj() Object " << nom << " ( "
[295]621 << typeid(*obj).name() << " ) added (Total= " << myObjs->size() << ")" << endl;
[344]622return(true);
[165]623}
624
[1224]625bool NamedObjMgr::AddObj(AnyDataObj& obj, string & nom, bool crd)
626{
[2491]627ZSync(*myMutex);
[1224]628NObjMgrAdapter* adap = GetServiceObj()->GetAdapter(&obj);
629if (adap == NULL) {
630 cout << "NamedObjMgr::AddObj() No Adapter ! " << nom << endl;
631 return(false);
632}
[1315]633AnyDataObj * cloneobj = adap->CloneDataObj(true);
[1224]634delete adap;
635if (cloneobj == NULL) {
636 cout << "NamedObjMgr::AddObj() Pb cloning object ! " << nom << endl;
637 return(false);
638}
[2491]639return ( AddObj_P(cloneobj , nom, crd) );
[1224]640}
641
[165]642/* --Methode-- */
[344]643bool NamedObjMgr::RenameObj(string & nom, string& nomnew)
[165]644{
[2491]645 ZSync(*myMutex);
646 return RenameObj_P(nom, nomnew);
647}
648
649/* --Methode-- */
650bool NamedObjMgr::RenameObj_P(string & nom, string& nomnew)
651{
[333]652string n1,r1,n2,r2;
[344]653int dids = ParseObjectName(nom, r1, n1);
654NObjDirList::iterator itr1 = myDirs->find(r1);
[333]655int did = ParseObjectName(nomnew, r2, n2);
[344]656NObjDirList::iterator itr2 = myDirs->find(r2);
657
[333]658if (did == 0) {
659 cout << "NamedObjMgr::RenameObj() Error - No " << r2 << " directory !" << endl;
[344]660 return(false);
[2218]661}
[333]662nom = '/' + r1 + '/' + n1;
663nomnew = '/' + r2 + '/' + n2;
664NObjList::iterator it1 = myObjs->find(nom);
665if (it1 == myObjs->end()) {
666 cout << "NamedObjMgr::RenameObj() Error - No " << nom << " object !" << endl;
[344]667 return(false);
[2218]668}
669if ((n2.length() < 1) || (! isalpha(n2[0])) ) {
670 cout << "NamedObjMgr::RenameObj() Error - bad new object name" << n2 << endl;
671 return(false);
672}
[333]673NObjList::iterator it2 = myObjs->find(nomnew);
674if (it2 != myObjs->end()) {
675 cout << "NamedObjMgr::RenameObj() Error - Object " << nomnew << " exist !" << endl;
[344]676 return(false);
[333]677 }
678
[344]679if ( (*itr1).second.lock || (*itr2).second.lock ) {
680 cout << "NamedObjMgr::RenameObj() Error - Source or destination directory locked !"
681 << endl;
682 return(false);
683 }
684
685
[333]686nobj_item no = (*it1).second;
687no.dirid = did;
688myObjs->erase(it1);
689NObjDirList::iterator itr = myDirs->find(r1);
690(*itr).second.nobj--;
691(*myObjs)[nomnew] = no;
692itr = myDirs->find(r2);
693(*itr).second.nobj++;
[685]694
[2490]695if (myImgApp != NULL) {
[2492]696 if ( !_fgimgapp ) myImgApp->LockMutex();
[2490]697 if ( (myImgApp->ObjMgrW())->Visible() ) {
698 (myImgApp->ObjMgrW())->DelObjList(dids, no.oid);
699 string oln = n2 + " (T= " + no.obja->GetDataObjType() + ")" ;
700 (myImgApp->ObjMgrW())->AddObjList(did, oln.c_str(), no.oid);
701 }
[2492]702 if ( !_fgimgapp ) myImgApp->UnlockMutex(true);
[685]703}
[449]704if (verbeux)
705 cout << "NamedObjMgr::RenameObj() - Object " << nom << " renamed to " << nomnew << endl;
[344]706return(true);
[331]707}
708
709/* --Methode-- */
[463]710bool NamedObjMgr::CopyObj(string & nom, string& nomcp)
711{
[2491]712ZSync(*myMutex);
[463]713if(nomcp.length()<=0)
714 {cout<<"NamedObjMgr::CopyObj() Error, copied obj name "<<nomcp<<" not valid"<<endl;
715 return(false);}
716NObjMgrAdapter* obnom = GetObjAdapter(nom);
717if(obnom==NULL)
718 {cout<<"NamedObjMgr::CopyObj() Error - No "<<nom<<" object !"<<endl;
719 return(false);}
[1165]720AnyDataObj* obnomcp = obnom->CloneDataObj();
[463]721if(obnomcp==NULL) return(false);
[2491]722if(! AddObj_P(obnomcp,nomcp,false) ) {delete obnomcp; return(false);}
[463]723return true;
724}
725
726/* --Methode-- */
[344]727bool NamedObjMgr::DelObj(string & nom, bool fgd)
[331]728{
[2491]729 ZSync(*myMutex);
730 return DelObj_P(nom, fgd);
731}
732
733/* --Methode-- */
734bool NamedObjMgr::DelObj_P(string & nom, bool fgd)
735{
[333]736string n1,r1;
[685]737int did = ParseObjectName(nom, r1, n1);
[333]738nom = '/' + r1 + '/' + n1;
[165]739NObjList::iterator it = myObjs->find(nom);
[344]740if (it == myObjs->end()) return(false);
741NObjDirList::iterator itr = myDirs->find(r1);
742if ( (*itr).second.lock ) {
743 cout << "NamedObjMgr::DelObj() Error - Locked directory " << r1 << endl;
744 return(false);
745 }
[165]746list<int>::iterator ii;
747if (myImgApp) {
748//DBG cerr << " *DBG* NamedObjMgr::DelObj Sz= " << (*it).second.wrsid.size() << endl;
[2492]749// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
750 bool fglock = (_fgimgapp) ? false : true;
751 if (fglock) myImgApp->LockMutex();
[165]752 for(ii=(*it).second.wrsid.begin(); ii != (*it).second.wrsid.end(); ii++)
753 myImgApp->DelWRsId((*ii));
[2492]754 if (fglock) myImgApp->UnlockMutex(true);
[165]755}
[314]756delete (*it).second.obja; // destruction de l'adaptateur
[165]757if (fgd) delete (*it).second.obj;
[333]758
[2490]759if (myImgApp != NULL) {
[2492]760 if ( !_fgimgapp ) myImgApp->LockMutex();
[2490]761 if ( (myImgApp->ObjMgrW())->Visible() ) {
762 int olid = (*it).second.oid;
763 (myImgApp->ObjMgrW())->DelObjList(did, olid);
764 }
[2492]765 if ( !_fgimgapp ) myImgApp->UnlockMutex(true);
[685]766}
[165]767myObjs->erase(it);
[333]768(*itr).second.nobj--;
769
[685]770
[449]771if (!verbeux) return(true);
[165]772if (fgd) cout << "NamedObjMgr::DelObj() Object " << nom << " deleted (Total= " << myObjs->size() << ")" << endl;
773else cout << "NamedObjMgr::DelObj() Object " << nom << " removed (Total= " << myObjs->size() << ")" << endl;
[344]774return(true);
[165]775}
776
777/* --Methode-- */
[344]778bool NamedObjMgr::DelObj_Id(int oid)
[165]779{
[2491]780ZSync(*myMutex);
[333]781NObjList::iterator it;
782string nom;
783bool of = false;
784for(it = myObjs->begin(); it != myObjs->end(); it++)
785 if ( (*it).second.oid == oid ) {
786 of = true; nom = (*it).first;
787 break;
788 }
[344]789if (of) return(DelObj(nom, true));
790else return(false);
[331]791}
792
793/* --Methode-- */
794void NamedObjMgr::DelObjects(string & patt, bool fgd)
795{
[2491]796ZSync(*myMutex);
[333]797string n1,r1;
798ParseObjectName(patt, r1, n1);
799patt = '/' + r1 + '/' + n1;
[165]800NObjList::iterator it;
801list<string> odel;
802string cn;
803for(it = myObjs->begin(); it != myObjs->end(); it++) {
804 cn = (*it).first;
805 if (csh_parse(cn.c_str(), patt.c_str()) != 0) odel.push_back(cn);
806 }
807list<string>::iterator ii;
[2491]808for(ii=odel.begin(); ii != odel.end(); ii++) DelObj_P(*ii, fgd);
[165]809}
810
811/* --Methode-- */
[331]812AnyDataObj* NamedObjMgr::GetObj(string & nom)
[165]813{
[2491]814ZSync(*myMutex);
[333]815string n1,r1;
816ParseObjectName(nom, r1, n1);
817nom = '/' + r1 + '/' + n1;
[165]818NObjList::iterator it = myObjs->find(nom);
819if (it == myObjs->end()) return(NULL);
820return((*it).second.obj);
821}
822
823/* --Methode-- */
[331]824NObjMgrAdapter* NamedObjMgr::GetObjAdapter(string & nom)
[295]825{
[2491]826ZSync(*myMutex);
[333]827string n1,r1;
828ParseObjectName(nom, r1, n1);
829nom = '/' + r1 + '/' + n1;
[295]830NObjList::iterator it = myObjs->find(nom);
831if (it == myObjs->end()) return(NULL);
832return((*it).second.obja);
833}
834
835/* --Methode-- */
[331]836void NamedObjMgr::ListObjs(string & patt)
[165]837{
[2491]838ZSync(*myMutex);
[331]839int k;
840AnyDataObj* obj=NULL;
841string ctyp;
842char strg[256];
843
[333]844string n1,r1;
845ParseObjectName(patt, r1, n1);
846patt = '/' + r1 + '/' + n1;
847 cout << "NamedObjMgr::ListObjs( " << patt << " ) TotNObjs= " << myObjs->size() << "\n" ;
[331]848NObjList::iterator it; k = 0;
[333]849string cn;
[331]850for(it = myObjs->begin(); it != myObjs->end(); it++) {
[333]851 cn = (*it).first;
852 if (csh_parse(cn.c_str(), patt.c_str()) == 0) continue;
[331]853 obj = (*it).second.obj;
854 ctyp = typeid(*obj).name();
855 sprintf(strg, "%2d/ %16s : %s", k, typeid(*obj).name(), ((*it).first).c_str());
856 ctyp = strg;
857 cout << ctyp << "\n" ;
858 k++;
859}
860cout << endl;
[165]861return;
862}
863
864/* --Methode-- */
[333]865void NamedObjMgr::GetObjList(string & patt, vector<string> &lst)
[165]866{
[2491]867ZSync(*myMutex);
[333]868string n1,r1;
869if (patt.length() < 1) return;
870bool fgr = (patt[0] == '/') ? true : false;
871ParseObjectName(patt, r1, n1);
872patt = '/' + r1 + '/' + n1;
873NObjList::iterator it;
874string cn;
875for(it = myObjs->begin(); it != myObjs->end(); it++) {
876 cn = (*it).first;
877 if (csh_parse(cn.c_str(), patt.c_str()) == 0) continue;
878 if (fgr) lst.push_back(cn);
879 else {
880 ParseObjectName(cn, r1, n1);
881 lst.push_back(n1);
882 }
883 }
[165]884}
885
886//++
887// Titre Entrées-Sorties (I/O) sur les objets
888//--
889//++
890// void ReadObj(PInPersist& s, int num=-1)
891// Lit l'objet à partir avec le tag numéro "num" dans le flot "PInPersist s"
892// et l'ajoute à la liste. Si "num" est négatif, tous les objets présents
893// sur le flot "s" sont créés et ajoutés à la liste.
894// void ReadObj(string const & nomppf, string nobj="")
895// Lit le premier objet à partir du fichier PPF "nomppf". L'objet est ajouté
896// à la liste avec le nom "nobj". Si "nobj" est une chaîne vide, un nom est
897// composé à partir du nom de fichier.
898//--
899
900/* --Methode-- */
[331]901void NamedObjMgr::ReadObj(string const & flnm, string & nobj)
[165]902{
[2491]903ZSync(*myMutex);
[495]904PPersist* ppobj=NULL;
[165]905bool ok = true;
[495]906#ifdef SANS_EVOLPLANCK
[165]907TRY{
908 PInPersist pis(flnm);
[495]909 ppobj = PPersistMgr::ReadObject(pis);
910 if (ppobj == NULL) ok = false;
[165]911} CATCH(merr)
912 { printf("NamedObjMgr::ReadObj()/Error Exception= %ld (%s) \n",
913 (long)merr, PeidaExc(merr)); ok = false; } ENDTRY;
[495]914#else
915try {
916 PInPersist pis(flnm);
917 ppobj = pis.ReadObject();
918 }
919catch (IOExc iox) {
920 cerr << "NamedObjMgr::ReadObj()/Error Exception - Msg= " << iox.Msg() << endl;
921 ok = false;
922 }
923#endif
[165]924if (!ok) return;
925if (nobj.length()<1) nobj = servnobjm->FileName2Name(flnm);
[2491]926AddObj_P(ppobj->DataObj(), nobj, true);
[685]927cout << "NamedObjMgr::ReadObj(...) object " << nobj << " read from file " << endl;
[165]928return;
929}
[2645]930/* --Methode-- */
931void NamedObjMgr::ReadObj(vector<string> & flnm_objname)
932// flnm_objname[0] = nom du fichier .ppf
933// flnm_objname[1...] = nom des tags des objects a lire
934{
935if(flnm_objname.size()<2) return;
936ZSync(*myMutex);
937int nread=0;
938try {
939 PInPersist pis(flnm_objname[0]);
940 for(int i=1;i<flnm_objname.size();i++) {
941 bool ok = pis.GotoNameTag(flnm_objname[i]);
942 if(!ok) {
943 cout<<"NamedObjMgr::ReadObj(...) Unknown object: "<<flnm_objname[i]<<endl;
944 continue;
945 }
946 PPersist *ppobj = pis.ReadObject();;
947 if(ppobj==NULL) {
948 cout<<"NamedObjMgr::ReadObj(...) impossible to read "<<flnm_objname[i]<<endl;
949 continue;
950 }
951 AddObj_P(ppobj->DataObj(),flnm_objname[i],true);
952 nread++;
953 cout<<"NamedObjMgr::ReadObj(...) object "<<flnm_objname[i]<<" read from file "<<endl;
954 }
955} catch (IOExc iox) {
956 cerr<<"NamedObjMgr::ReadObj()/Error Exception - Msg= "<<iox.Msg()<<endl;
957}
958cout<<nread<<" objects have been read"<<endl;
959return;
960}
[165]961
962/* --Methode-- */
963void NamedObjMgr::ReadObj(PInPersist& s, int num)
964{
[2491]965ZSync(*myMutex);
[2180]966int_4 i; // $CHECK$ int -> int_4 a cause de TagKey
967#ifdef SANS_EVOLPLANCK
968int_4 cid, key, ln; // $CHECK$ int -> int_4 a cause de TagKey
969#endif
[165]970int n0, n1;
971bool ok = true;
972PPersist* obj=NULL;
973string nom;
974
[449]975int nread = 0;
[2460]976int nbtags = 0;
977#ifdef SANS_EVOLPLANCK
978nbtags = s.NbTags();
979#else
980nbtags = s.NbNameTags();
981#endif
982if ( (nbtags < 1) || (num >= nbtags) ) {
[165]983 if (num >= 0) {
[495]984 cerr << "NamedObjMgr::ReadObj(PInPersist, " << num << " Error! NbTags ="
[2460]985 << nbtags << endl;
[165]986 return;
987 }
[495]988
989#ifdef SANS_EVOLPLANCK
[165]990 TRY {
991 obj = PPersistMgr::ReadObject(s);
992 if (obj == NULL) ok = false;
993 } CATCH(merr) {
994 printf("NamedObjMgr::ReadObj()/Error Exception= %ld (%s) \n", (long)merr, PeidaExc(merr));
995 ok = false;
996 } ENDTRY;
[495]997#else
998try {
999 obj = s.ReadObject();
1000 }
1001catch (IOExc iox) {
1002 cerr << "NamedObjMgr::ReadObj()/Error Exception - Msg= " << iox.Msg() << endl;
1003 ok = false;
1004 }
1005#endif
1006
[165]1007 if (!ok) return;
1008 nom = "";
[2491]1009 AddObj_P(obj->DataObj(), nom, false);
[449]1010 nread++;
[165]1011}
1012
[2460]1013if (num < 0) { n0 = 0; n1 = nbtags; }
[165]1014else { n0 = num; n1 = num+1; }
1015for(i=n0; i<n1; i++) {
[495]1016#ifdef SANS_EVOLPLANCK
[165]1017 key = s.TagKey(i, cid, ln);
1018 if (ln <= 0) nom = "";
1019 else nom = s.TagName(i);
1020 s.GotoTag(i);
1021 TRY {
1022 obj = PPersistMgr::ReadObject(s);
1023 if (obj == NULL) ok = false;
1024 } CATCH(merr) {
1025 printf("NamedObjMgr::ReadObj()/Error Exception= %ld (%s) \n", (long)merr, PeidaExc(merr));
1026 ok = false;
1027 } ENDTRY;
[495]1028#else
[2460]1029 s.GotoNameTagNum(i);
[584]1030 nom = s.GetTagName(i);
[495]1031 try {
1032 obj = s.ReadObject();
1033 }
1034 catch (IOExc iox) {
1035 cerr << "NamedObjMgr::ReadObj()/Error Exception - Msg= " << iox.Msg() << endl;
1036 ok = false;
1037 }
1038#endif
[2491]1039 if (ok) { AddObj_P(obj->DataObj(), nom, true); nread++; }
[165]1040}
1041
[449]1042cout << "NamedObjMgr::ReadObj(...) " << nread << " Objects read " << endl;
[165]1043return;
1044}
1045/* --Methode-- */
1046void NamedObjMgr::ReadAll(string const & flnm)
1047{
[2491]1048ZSync(*myMutex);
[165]1049bool ok = true;
1050PPersist* obj=NULL;
1051
[2180]1052PInPersist* ppin=NULL;
[495]1053#ifdef SANS_EVOLPLANCK
[165]1054TRY{
1055 ppin = new PInPersist(flnm);
1056 if (ppin->NbTags() < 1) obj = PPersistMgr::ReadObject((*ppin));
1057 else obj = NULL;
1058} CATCH(merr)
1059 { printf("NamedObjMgr::ReadAll()/Error Exception= %ld (%s) \n",
1060 (long)merr, PeidaExc(merr)); ok = false; } ENDTRY;
[495]1061#else
1062try {
1063 ppin = new PInPersist(flnm);
[2460]1064 if (ppin->NbNameTags() < 1) obj = ppin->ReadObject();
[495]1065 else obj = NULL;
1066}
1067catch (IOExc iox) {
1068 cerr << "NamedObjMgr::ReadAll()/Error Exception - Msg= " << iox.Msg() << endl;
1069 ok = false;
1070}
1071#endif
[165]1072if (!ok) return;
1073if (obj) {
1074 string nom = servnobjm->FileName2Name(flnm);
[2491]1075 AddObj_P(obj->DataObj(), nom, false);
[165]1076 }
1077else ReadObj((*ppin), -1);
1078delete ppin;
1079return;
1080}
1081
1082/* --Methode-- */
[331]1083void NamedObjMgr::ReadFits(string const & flnm, string & nobj)
[165]1084{
[2491]1085ZSync(*myMutex);
[293]1086#ifdef SANS_EVOLPLANCK
[2180]1087bool ok = false;
[709]1088RzImage* obj=NULL;
[495]1089TRY{
[165]1090 obj = RzReadFits((char*)flnm.c_str());
1091 if (obj == NULL) ok = false;
[709]1092 else ok = true;
[165]1093} CATCH(merr) {
1094 printf("NamedObjMgr::ReadFITS(_Error Exception= %ld (%s) \n", (long)merr, PeidaExc(merr));
1095 ok = false;
1096} ENDTRY;
[709]1097
1098if (ok && (obj != NULL)) {
[165]1099 if (nobj.length()<1) nobj = servnobjm->FileName2Name(flnm);
[2491]1100 AddObj_P((AnyDataObj*)obj, nobj);
[165]1101}
[1105]1102#else
[1321]1103 try {
1104 FITS_AutoReader fiar(flnm);
[1335]1105 char bun[16];
1106 int nhdu = fiar.NbBlocks();
[1321]1107 if (nobj.length()<1) nobj = servnobjm->FileName2Name(flnm);
1108 string name;
1109 AnyDataObj* obj;
[1513]1110 int kon = 1;
[1321]1111 for(int k=1; k<=nhdu; k++) {
1112 obj = fiar.ReadObject(k);
[1330]1113 if (obj) {
[1321]1114 cout << " NamedObjMgr::ReadFits() " << (string)typeid(*obj).name()
1115 << " read From HDU " << k << endl;
[1513]1116 if (typeid(*obj) == typeid(DVList)) {
1117 delete obj;
1118 continue;
1119 }
1120 if (kon > 1) {
1121 sprintf(bun, "%d", kon);
[1330]1122 name = nobj + bun;
1123 }
1124 else name = nobj;
[2491]1125 AddObj_P(obj, name, false);
[1513]1126 kon++;
[1330]1127 }
[1321]1128 else cerr << " NamedObjMgr::ReadFits() NULL pointer from FITS_AutoReader" << endl;
1129 }
1130 }
1131 catch(PThrowable & exc) {
1132 cerr << " NamedObjMgr::ReadFits() / Error - Catched Exception \n "
1133 << " Type= " << (string)typeid(exc).name()
1134 << " - Msg= " << exc.Msg() << endl;
1135
1136 }
[1105]1137#endif
1138
[165]1139return;
1140}
1141
[2491]1142/* --Methode-- */
1143void NamedObjMgr::SaveObj(string & nom, POutPersist& s, bool keeppath)
1144{
1145 ZSync(*myMutex);
1146 SaveObj_P(nom, s, keeppath);
1147}
[165]1148
1149static int key_for_write = 5000;
1150/* --Methode-- */
[2491]1151void NamedObjMgr::SaveObj_P(string & nom, POutPersist& s, bool keeppath)
[165]1152{
[333]1153if (nom.length() < 1) return;
1154string nob,rep;
1155ParseObjectName(nom, rep, nob);
1156nom = '/' + rep + '/' + nob;
[295]1157NObjMgrAdapter* obja=NULL;
[333]1158string nomf = (keeppath) ? nom : nob;
[295]1159obja = GetObjAdapter(nom);
1160if (obja == NULL) return;
[165]1161printf("NamedObjMgr::SaveObj(%s, ) (Type=%s) \n",
[295]1162 nom.c_str(), typeid(*(obja->GetDataObj())).name());
[333]1163obja->SavePPF(s, nomf);
[165]1164return;
1165}
1166
1167/* --Methode-- */
[333]1168void NamedObjMgr::SaveObjects(string & patt, string const& flnm)
1169{
[2491]1170ZSync(*myMutex);
[333]1171string n1,r1;
1172if (patt.length() < 1) return;
1173bool keeppath = (patt[0] == '/') ? true : false;
1174ParseObjectName(patt, r1, n1);
1175patt = '/' + r1 + '/' + n1;
1176
1177bool ok = true;
[2180]1178POutPersist* pout=NULL;
[495]1179#ifdef SANS_EVOLPLANCK
[333]1180TRY{
1181 pout = new POutPersist(flnm);
1182} CATCH(merr)
1183 { printf("NamedObjMgr::SaveObjects()/Error Exception= %ld (%s) \n",
1184 (long)merr, PeidaExc(merr)); ok = false; } ENDTRY;
[495]1185#else
1186try {
1187 pout = new POutPersist(flnm);
1188}
1189catch (IOExc iox) {
1190 cerr << "NamedObjMgr::SaveObjects()/Error Exception - Msg= " << iox.Msg() << endl;
1191 ok = false;
1192}
1193#endif
[333]1194if (!ok) return;
1195NObjList::iterator it;
1196string cn;
1197for(it = myObjs->begin(); it != myObjs->end(); it++) {
1198 cn = (*it).first;
1199 if (csh_parse(cn.c_str(), patt.c_str()) == 0) continue;
[2491]1200 SaveObj_P(cn, (*pout), keeppath);
[333]1201 }
1202delete pout;
1203return;
1204}
1205
1206/* --Methode-- */
[165]1207void NamedObjMgr::SaveAll(string const& flnm)
1208{
[2491]1209ZSync(*myMutex);
[165]1210bool ok = true;
1211
[2180]1212POutPersist* pout=NULL;
[495]1213#ifdef SANS_EVOLPLANCK
[165]1214TRY{
1215 pout = new POutPersist(flnm);
1216} CATCH(merr)
1217 { printf("NamedObjMgr::SaveAll()/Error Exception= %ld (%s) \n",
1218 (long)merr, PeidaExc(merr)); ok = false; } ENDTRY;
[495]1219#else
1220try {
1221 pout = new POutPersist(flnm);
1222}
1223catch (IOExc iox) {
1224 cerr << "NamedObjMgr::SaveAll()/Error Exception - Msg= " << iox.Msg() << endl;
1225 ok = false;
1226}
1227#endif
[165]1228if (!ok) return;
[332]1229NObjList::iterator it;
1230string no;
1231for(it = myObjs->begin(); it != myObjs->end(); it++) {
1232 no = (*it).first;
[2491]1233 SaveObj_P(no, (*pout), true);
[332]1234 }
[165]1235delete pout;
1236return;
1237}
1238
1239/* --Methode-- */
[331]1240void NamedObjMgr::SaveFits(string& nom, string const & flnm)
[165]1241{
[2491]1242ZSync(*myMutex);
1243
[295]1244NObjMgrAdapter* obja=NULL;
1245obja = GetObjAdapter(nom);
1246if (obja == NULL) return;
1247obja->SaveFits(flnm);
[293]1248return;
[165]1249}
1250
1251
1252
1253/* --Methode-- */
[331]1254void NamedObjMgr::PrintObj(string& nom)
[165]1255{
[2491]1256ZSync(*myMutex);
[295]1257NObjMgrAdapter* obja=NULL;
1258obja = GetObjAdapter(nom);
1259if (obja == NULL) return;
[594]1260AnyDataObj* ob = obja->GetDataObj();
1261if (ob == NULL) {
1262 cerr << "NamedObjMgr::PrintObj() / Error - NULL object ! in " << nom << endl;
1263 return;
1264 }
1265string ctyp = typeid(*ob).name();
[295]1266cout << "NamedObjMgr::PrintObj(" << nom << ") Type: " << ctyp << endl;
1267obja->Print(cout);
[165]1268
1269return;
1270}
1271
1272/* --Methode-- */
[331]1273void NamedObjMgr::DisplayObj(string& nom, string dopt)
[165]1274{
[2491]1275ZSync(*myMutex);
1276
[295]1277NObjMgrAdapter* obja=NULL;
1278obja = GetObjAdapter(nom);
1279if (obja == NULL) {
[594]1280 cout << "NamedObjMgr::DisplayObj() Error , No object with name " << nom << endl;
[165]1281 return;
1282}
[594]1283if (obja->GetDataObj() == NULL) {
1284 cerr << "NamedObjMgr::DisplayObj() / Error - NULL object ! in " << nom << endl;
1285 return;
1286 }
[165]1287if (!myImgApp) return;
1288
[295]1289PIDrawer * dr = NULL;
1290P2DArrayAdapter* arr = NULL;
1291dr = obja->GetDrawer(dopt);
1292if (!dr) arr = obja->Get2DArray(dopt);
[165]1293
[295]1294if (!dr && !arr) {
1295 string ctyp = typeid(*(obja->GetDataObj())).name();
[594]1296 cout << "NamedObjMgr::DisplayObj() Error , No display for " << ctyp << endl;
[295]1297 return;
1298 }
1299
[165]1300int wrsid = 0;
1301
[344]1302string n1,r1;
1303ParseObjectName(nom, r1, n1);
1304
[2491]1305// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
1306bool fglock = (_fgimgapp) ? false : true;
1307
[295]1308if (dr) {
1309 PIDrawer3D * dr3 = dynamic_cast<PIDrawer3D *>(dr);
[2491]1310 if(dr3) wrsid = myImgApp->Disp3DDrawer(dr3, n1, dopt, "", 0, fglock);
1311 else wrsid = myImgApp->DispScDrawer( dr, n1, dopt, "", 0, fglock);
[295]1312 }
[2491]1313else if (arr) wrsid = myImgApp->DispImage(arr, n1, dopt, 0, fglock);
[165]1314
[2402]1315AddWRsId(nom, wrsid);
[295]1316return;
1317}
[165]1318
[295]1319/* --Methode-- */
[331]1320void NamedObjMgr::DisplayImage(string& nom, string dopt)
[295]1321{
[2491]1322ZSync(*myMutex);
1323
[295]1324NObjMgrAdapter* obja=NULL;
1325obja = GetObjAdapter(nom);
1326if (obja == NULL) {
[449]1327 cout << "NamedObjMgr::DisplayImage() Error , No such object " << nom << endl;
[295]1328 return;
1329}
[594]1330if (obja->GetDataObj() == NULL) {
1331 cerr << "NamedObjMgr::DisplayImage() / Error - NULL object ! in " << nom << endl;
1332 return;
1333 }
[295]1334if (!myImgApp) return;
1335
1336P2DArrayAdapter* arr = obja->Get2DArray(dopt);
[165]1337
[295]1338if (!arr) {
1339 string ctyp = typeid(*(obja->GetDataObj())).name();
[449]1340 cout << "NamedObjMgr::DisplayImage() Error , Not supported for " << ctyp << endl;
[295]1341 return;
1342 }
[165]1343
[344]1344string n1,r1;
1345ParseObjectName(nom, r1, n1);
1346
[2491]1347// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
1348bool fglock = (_fgimgapp) ? false : true;
1349
[295]1350int wrsid = 0;
[2491]1351wrsid = myImgApp->DispImage(arr, n1, dopt, 0, fglock);
[165]1352
[2402]1353AddWRsId(nom, wrsid);
[295]1354return;
1355}
1356/* --Methode-- */
[331]1357void NamedObjMgr::DisplaySurf3D(string& nom, string dopt)
[295]1358{
[2491]1359ZSync(*myMutex);
1360
[295]1361NObjMgrAdapter* obja=NULL;
1362obja = GetObjAdapter(nom);
1363if (obja == NULL) {
[449]1364 cout << "NamedObjMgr::DisplaySurf3D() Error , No such object " << nom << endl;
[295]1365 return;
1366}
[594]1367if (obja->GetDataObj() == NULL) {
1368 cerr << "NamedObjMgr::DisplaySurf3D() / Error - NULL object ! in " << nom << endl;
1369 return;
1370 }
[295]1371if (!myImgApp) return;
1372
1373P2DArrayAdapter* arr = obja->Get2DArray(dopt);
[165]1374
[295]1375if (!arr) {
1376 string ctyp = typeid(*(obja->GetDataObj())).name();
[449]1377 cout << "NamedObjMgr::DisplaySurf3D() Error , Not supported " << ctyp << endl;
[295]1378 return;
1379 }
[165]1380
[295]1381if ((arr->XSize() > 250) || (arr->YSize() > 250)) {
1382 cout << "NamedObjMgr::DisplaySurf3D() Error , 2D-Array(" << arr->XSize()
[449]1383 << "x" << arr->YSize() << ") too big (max=250x250)" << endl;
[295]1384 delete arr;
1385 return;
[165]1386 }
1387
[344]1388string n1,r1;
1389ParseObjectName(nom, r1, n1);
1390
[2491]1391// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
1392bool fglock = (_fgimgapp) ? false : true;
1393
[295]1394int wrsid = 0;
1395PISurfaceDrawer* sdr = new PISurfaceDrawer(arr, true, true, true);
[2491]1396wrsid = myImgApp->Disp3DDrawer(sdr, n1, dopt, "", 0, fglock);
[2402]1397AddWRsId(nom, wrsid);
[295]1398return;
[165]1399}
1400
1401/* --Methode-- */
[331]1402void NamedObjMgr::DisplayNT(string& nom, string& nmx, string& nmy, string& nmz,
[486]1403 string& erx, string& ery, string& erz, string& wt,
1404 string& label, string dopt, bool fg3d)
[165]1405{
[2491]1406ZSync(*myMutex);
1407
[295]1408AnyDataObj* obj=GetObj(nom);
[165]1409if (obj == NULL) {
[449]1410 cout << "NamedObjMgr::DisplayNT() Error , No such object " << nom << endl;
[165]1411 return;
1412}
1413if (!myImgApp) return;
1414
[326]1415NTupleInterface * nt = dynamic_cast<NTupleInterface *>(obj);
1416if (nt == NULL) {
1417// if (typeid(*obj) != typeid(NTupleInterface)) {
[295]1418 string ctyp = typeid(*obj).name();
[449]1419 cout << "NamedObjMgr::DisplayNT() Error , Object not an NTuple " << ctyp << endl;
[165]1420 return;
1421 }
1422
1423int wrsid = 0;
[1971]1424dopt = "defline " + dopt;
[165]1425
[344]1426string n1,r1;
1427ParseObjectName(nom, r1, n1);
1428
[2491]1429// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
1430bool fglock = (_fgimgapp) ? false : true;
1431
[333]1432if ( fg3d && (nmz.length()>0) ) { // Display 3D
[326]1433 PINTuple3D* pin = new PINTuple3D(nt, false);
[165]1434 pin->SelectXYZ(nmx.c_str(), nmy.c_str(), nmz.c_str());
[486]1435 pin->SelectWt(wt.c_str());
1436 pin->SelectLabel(label.c_str());
[165]1437 pin->SelectErrBar(erx.c_str(), ery.c_str(), erz.c_str());
1438 string titre = nmz + "%" + nmy + "%" + nmz;
[2491]1439 wrsid = myImgApp->Disp3DDrawer(pin, n1, dopt, titre, 0, fglock);
[165]1440}
1441else {
[326]1442 PINTuple* pin = new PINTuple(nt, false);
[165]1443 pin->SelectXY(nmx.c_str(), nmy.c_str());
[486]1444 pin->SelectWt(wt.c_str());
1445 pin->SelectLabel(label.c_str());
[165]1446 pin->SelectErrBar(erx.c_str(), ery.c_str());
[333]1447 string titre = nmy + "%" + nmx;
[2491]1448 wrsid = myImgApp->DispScDrawer( (PIDrawer*)pin, n1, dopt, titre, 0, fglock);
[165]1449 }
1450
[2402]1451AddWRsId(nom, wrsid);
[165]1452return;
1453}
1454
[339]1455/* --Methode-- cmv 13/10/98 : Obsolete mais ne pas virer SVP */
[331]1456void NamedObjMgr::DisplayGFD(string& nom, string& numvarx, string& numvary, string& err, string dopt)
[165]1457// Pour le display 2D ou 3D d'un ``GeneralFitData''.
1458//| nom = nom de l'objet GeneralFitData a representer.
1459//| numvarx = numero (nombre entier) de la 1ere variable d'abscisse.
1460//| numvary = numero (nombre entier) de la 2sd variable d'abscisse (3D).
1461//| Pour le display 2D, numvary="" string vide.
1462//| err = qu'elles erreurs faut il representer ?
1463//| - 2D : x y xy (display y=f(x))
1464//| - 3D : x y z xy xz yz xzy (display z=f(x,y))
1465//| Ceci n'est suivi que si on a PI_NotDefLineAtt, sinon toutes
1466//| les barres d'erreurs sont representees.
1467//| opt = options generales pour le display.
1468{
[2491]1469ZSync(*myMutex);
1470
[295]1471AnyDataObj* obj=GetObj(nom);
[165]1472if(obj == NULL)
[449]1473 {cout << "NamedObjMgr::DisplayGFD() Error , No such object " << nom << endl;
[165]1474 return;}
1475if(!myImgApp) return;
[295]1476if(typeid(*obj) != typeid(GeneralFitData))
1477 {string ctyp = typeid(*obj).name();
[449]1478 cout<<"NamedObjMgr::DisplayGFD() Error , Object not a GeneralFitData "<<ctyp<<endl;
[165]1479 return;}
1480
1481// Decodage des erreurs a representer
1482bool errx=false, erry=false, errz=false;
1483if(err.length()>0) {
[2180]1484 for(int i=0;i<(int_4)err.length();i++)
[165]1485 if (err[i]=='x' || err[i]=='X') errx = true;
1486 else if(err[i]=='y' || err[i]=='Y') erry = true;
1487 else if(err[i]=='z' || err[i]=='Z') errz = true;
1488}
1489// Decodage des numeros de variables en abscisse
[339]1490 int numvx=-1, numvy=-1;
1491 if(numvarx.length()>0) numvx = atoi(numvarx.c_str());
1492 if(numvary.length()>0) numvy = atoi(numvary.c_str());
1493
[344]1494 string n1,r1;
1495 ParseObjectName(nom, r1, n1);
[2491]1496 // Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
1497 bool fglock = (_fgimgapp) ? false : true;
[344]1498
[339]1499 int wrsid = 0;
1500 if(numvy>=0) { // display 3D
[165]1501 PIGenFitDat3D* pigfd = new PIGenFitDat3D(((GeneralFitData*)obj),false);
1502 pigfd->SelectXY(numvx,numvy);
1503 pigfd->SelectErrBar(errx,erry,errz);
[2491]1504 wrsid = myImgApp->Disp3DDrawer(pigfd,n1,dopt,"",0,fglock);
[339]1505} else { // display 2D
[165]1506 PIGenFitDat* pigfd = new PIGenFitDat(((GeneralFitData*)obj),false);
1507 pigfd->SelectX(numvx);
1508 pigfd->SelectErrBar(errx,erry);
[2491]1509 wrsid = myImgApp->DispScDrawer((PIDrawer*)pigfd,n1,dopt,"",0,fglock);
[165]1510}
1511
[2402]1512AddWRsId(nom, wrsid);
[1971]1513
[165]1514return;
1515}
1516
[1525]1517/* --Methode-- */
1518void NamedObjMgr::DisplayVector(string & nomvx, string& nomvy, string dopt)
1519// Pour l'affichage 2-D de points avec coordonnees definies par deux vecteurs
1520// nomvx et nomvy
1521{
[2491]1522ZSync(*myMutex);
1523
[1525]1524#ifdef SANS_EVOLPLANCK
1525 cerr << " NamedObjMgr::DisplayVector() Error: Not implemented with PEIDA " << endl;
1526#else
1527
1528if(!myImgApp) return;
1529
1530AnyDataObj* obj;
1531obj = GetObj(nomvx);
1532if(obj == NULL) {
1533 cout << "NamedObjMgr::DisplayVector() Error , No such object " << nomvx << endl;
1534 return;
1535}
[2263]1536//Vector * vx = dynamic_cast<Vector *>(obj);
1537BaseArray* bax = dynamic_cast<BaseArray *>(obj);
1538if (bax == NULL) {
1539 cout << "NamedObjMgr::DisplayVector() Error " << nomvx << " not a BaseArray ! " << endl;
[1525]1540 return;
1541}
1542
1543obj = GetObj(nomvy);
1544if(obj == NULL) {
1545 cout << "NamedObjMgr::DisplayVector() Error , No such object " << nomvy << endl;
1546 return;
1547}
[2263]1548BaseArray* bay = dynamic_cast<BaseArray *>(obj);
1549if (bay == NULL) {
1550 cout << "NamedObjMgr::DisplayVector() Error " << nomvy << " not a BaseArray ! " << endl;
[1525]1551 return;
1552}
1553
[2263]1554Vector vx = *bax;
1555Vector vy = *bay;
[1525]1556Vector * cvx, * cvy;
1557
[2263]1558if (vx.Size() != vy.Size()) {
[1525]1559 cout << "NamedObjMgr::DisplayVector() Warning / Vx.Size() != Vy.Size() " << endl;
[2263]1560 if (vx.Size() < vy.Size()) {
1561 cvx = new Vector(vx);
1562 cvy = new Vector(vy.SubVector(Range(0, 0, vx.Size()-1)));
[1525]1563 }
1564 else {
[2263]1565 cvx = new Vector(vx.SubVector(Range(0, 0, vy.Size()-1)));
1566 cvy = new Vector(vy);
[1525]1567 }
1568}
1569else {
[2263]1570 cvx = new Vector(vx);
1571 cvy = new Vector(vy);
[1525]1572}
1573
1574POVectorAdapter * avx = new POVectorAdapter(cvx, true);
1575POVectorAdapter * avy = new POVectorAdapter(cvy, true);
1576PIYfXDrawer * vxydrw = new PIYfXDrawer(avx, avy, true);
1577
1578string nx,rx;
1579ParseObjectName(nomvx, rx, nx);
1580string ny,ry;
1581ParseObjectName(nomvy, ry, ny);
1582
[2491]1583// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
1584bool fglock = (_fgimgapp) ? false : true;
1585
[1525]1586string title = ny + " (Y) vs. " + nx + " (X)";
1587// display 2D
[2491]1588myImgApp->DispScDrawer(vxydrw, title, dopt, "", 0, fglock);
[1525]1589
1590return;
1591
1592#endif
1593}
1594
[165]1595/* --Methode--
[331]1596void NamedObjMgr::DisplayImage(string& nom, string dopt)
[165]1597{
1598 cout << "NamedObjMgr::DisplayImage() a faire ! " << endl;
1599}
1600*/
1601
1602
1603
1604
[1971]1605/* --Methode--
[165]1606void NamedObjMgr::SetGraphicAttributes(string gratt)
1607{
1608bool fg = false;
1609servnobjm->DecodeDispOption(gratt, fg);
[546]1610Services2NObjMgr::SetDefaultStatsOption(Services2NObjMgr::GetStatsOption(gratt));
[165]1611}
[333]1612
[165]1613void NamedObjMgr::SetGraphicWinZone(int nzx, int nzy, bool fcr)
1614{
1615if (!myImgApp) return;
1616if (fcr) myImgApp->CreateGraphWin(nzx, nzy);
1617else myImgApp->SetZone(nzx, nzy);
1618}
[1971]1619*/
[165]1620
1621/* --Methode-- */
[333]1622void NamedObjMgr::AddWRsId(string & nom, int wrsid)
[165]1623{
[333]1624if(wrsid != 0) {
1625 NObjList::iterator it = myObjs->find(nom);
1626 if (it == myObjs->end()) return;
1627 (*it).second.wrsid.push_back(wrsid);
[295]1628 }
[165]1629return;
1630}
1631
1632/* --Methode-- */
[333]1633void NamedObjMgr::UpdateObjMgrWindow(int did)
[165]1634{
[333]1635if (!myImgApp) return;
[2491]1636ZSync(*myMutex);
[2492]1637if ( !_fgimgapp ) myImgApp->LockMutex();
[2490]1638
[685]1639(myImgApp->ObjMgrW())->ClearObjList();
[165]1640
[333]1641NObjList::iterator it;
1642string cn;
1643for(it = myObjs->begin(); it != myObjs->end(); it++) {
1644 if ((*it).second.dirid != did) continue;
1645 cn = (*it).first.substr(1);
[1321]1646 // cn = cn.substr(cn.find('/')+1) + " (T= " + typeid(*((*it).second.obj)).name() + ")" ;
1647 cn = cn.substr(cn.find('/')+1) + " (T= " + (*it).second.obja->GetDataObjType() + ")" ;
[685]1648 (myImgApp->ObjMgrW())->AddObj(cn.c_str(), (*it).second.oid);
[165]1649 }
[2492]1650
1651if ( !_fgimgapp ) myImgApp->UnlockMutex(true);
[333]1652}
[165]1653
1654
[333]1655/* Nouvelle-Fonction */
[1207]1656void NamedObjMgr::RemoveSpacesFromName(string & nom)
[165]1657{
[333]1658// on supprime les blancs de debut et de fin
1659size_t p = nom.find_first_not_of(" ");
1660if(p>nom.length()) { nom = ""; return; }
1661nom = nom.substr(p);
1662p = nom.find(' ');
1663if(p>nom.length()) p=nom.length();
1664nom = nom.substr(0, p);
[165]1665}
1666
[333]1667/* Nouvelle-Fonction */
[1207]1668bool NamedObjMgr::CheckDirName(string & nom)
[165]1669{
[333]1670RemoveSpacesFromName(nom);
1671if (nom.length() < 1) return(false);
1672if (nom[0] == '/') nom = nom.substr(1) ;
1673size_t p = nom.find('/');
1674if (p < nom.length()) nom = nom.substr(0,p);
[2218]1675if ((nom.length() < 1) || (! isalpha(nom[0]) ) ) return(false);
[333]1676return(true);
[165]1677}
1678
[333]1679/* Nouvelle-Fonction */
[1207]1680int NamedObjMgr::ParseObjectName(string & nom, string & nomrep, string & nomobj)
[165]1681{
[333]1682RemoveSpacesFromName(nom);
1683// Si le nom ne commence pas par un slash, c'est le repertoire courant
1684if (nom[0] != '/') { nomrep = *currDir; nomobj = nom; }
[165]1685else {
[333]1686 string xx = nom.substr(1);
1687 size_t p = xx.find('/');
1688 if (p < xx.length()) {
1689 nomrep = xx.substr(0,p);
1690 nomobj = xx.substr(p+1);
[165]1691 }
[333]1692 else {
1693 nomrep = xx;
1694 nomobj = "";
[165]1695 }
1696 }
[333]1697int rc = 0;
1698NObjDirList::iterator it = myDirs->find(nomrep);
1699if (it != myDirs->end()) rc = (*it).second.id;
1700return(rc);
[165]1701}
1702
Note: See TracBrowser for help on using the repository browser.