1 //=============================================================================
2 // File : MEDMEM_Field_i.cxx
3 // Created : mer fév 20 15:47:57 CET 2002
6 // Copyright : EDF 2002
7 // $Header: /export/home/PAL/MED_SRC/src/MEDMEM_I/MEDMEM_Field_i.cxx
8 //=============================================================================
9 #include "MEDMEM_Field_i.hxx"
11 map < int, ::FIELD_ * > FIELD_i::fieldMap ;
12 int FIELD_i::fieldIndex = 0;
13 //=============================================================================
17 //=============================================================================
19 //FIELD_i::FIELD_i():_fieldTptr(FIELD_i::constructConstField())
20 FIELD_i::FIELD_i():_fieldTptr(constructConstField())
22 BEGIN_OF("Default Constructor Field_i");
23 END_OF(" Default Constructor Field_i");
25 //=============================================================================
29 //=============================================================================
32 if (_ownCppPtr) delete _fieldTptr;
34 //=============================================================================
38 //=============================================================================
39 FIELD_i::FIELD_i(::FIELD_ * const field, bool ownCppPtr):
41 _corbaIndex(FIELD_i::fieldIndex++),
45 BEGIN_OF("Constructor FIELD_i(SALOME_MED::SUPPORT_ptr support,::FIELD<T> * const field)");
46 FIELD_i::fieldMap[_corbaIndex]=_fieldTptr;
48 MESSAGE("FIELD_i::FIELD_i Checking of pointeurs !!!");
52 END_OF("Constructor FIELD_i(SALOME_MED::SUPPORT_ptr support,::FIELD<T> * const field)");
55 //=============================================================================
57 * Constructor par recopie
59 //=============================================================================
60 FIELD_i::FIELD_i( FIELD_i & f):_fieldTptr(f._fieldTptr),
61 _corbaIndex(FIELD_i::fieldIndex++),
62 _FieldId(""), _ownCppPtr(false)
64 BEGIN_OF("Constructor Field_i");
65 FIELD_i::fieldMap[_corbaIndex]=_fieldTptr;
66 END_OF("Constructor Field_i");
68 //=============================================================================
70 * Constructor d un pointeur constant
72 //=============================================================================
73 ::FIELD_ * FIELD_i::constructConstField() const
75 ::FIELD_ * const ptrField =new ::FIELD_();
78 //=============================================================================
80 * CORBA: Accessor for Fields's Name
82 //=============================================================================
83 char * FIELD_i::getName()
84 throw (SALOME::SALOME_Exception)
87 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
88 SALOME::INTERNAL_ERROR);
91 return CORBA::string_dup(_fieldTptr->getName().c_str());
93 catch (MEDEXCEPTION &ex)
95 MESSAGE("Exception en accedant au nom");
96 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
99 //=============================================================================
101 * CORBA: Accessor for Fields's Description
103 //=============================================================================
104 char * FIELD_i::getDescription()
105 throw (SALOME::SALOME_Exception)
107 if (_fieldTptr==NULL)
108 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
109 SALOME::INTERNAL_ERROR);
112 return CORBA::string_dup(_fieldTptr->getDescription().c_str());
114 catch (MEDEXCEPTION &ex)
116 MESSAGE("Exception en accedant a la description");
117 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
120 //=============================================================================
122 * CORBA: Accessor for Fields's Support
124 //=============================================================================
126 SALOME_MED::SUPPORT_ptr FIELD_i::getSupport()
127 throw (SALOME::SALOME_Exception)
129 BEGIN_OF("SALOME_MED::SUPPORT_ptr FIELD_i::getSupport()");
131 if (_fieldTptr==NULL)
132 THROW_SALOME_CORBA_EXCEPTION("No associated Field",
133 SALOME::INTERNAL_ERROR);
135 SUPPORT_i* servant = new SUPPORT_i(_fieldTptr->getSupport());
137 SALOME_MED::SUPPORT_ptr support=servant->_this();
141 END_OF("SALOME_MED::SUPPORT_ptr FIELD_i::getSupport()");
145 //=============================================================================
147 * CORBA: Accessor for Fields's Number of components
149 //=============================================================================
150 CORBA::Long FIELD_i::getNumberOfComponents()
151 throw (SALOME::SALOME_Exception)
153 if (_fieldTptr==NULL)
154 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
155 SALOME::INTERNAL_ERROR);
158 return _fieldTptr->getNumberOfComponents();
160 catch (MEDEXCEPTION &ex)
162 MESSAGE("Exception en accedant au support");
163 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
166 //=============================================================================
168 * CORBA: Accessor for names of component I
170 //=============================================================================
171 char * FIELD_i::getComponentName(CORBA::Long i)
172 throw (SALOME::SALOME_Exception)
174 if (_fieldTptr==NULL)
175 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
176 SALOME::INTERNAL_ERROR);
179 return CORBA::string_dup(_fieldTptr->getComponentName(i).c_str());
181 catch (MEDEXCEPTION &ex)
183 MESSAGE("Exception en accedant au nom d un component");
184 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
187 //=============================================================================
189 * CORBA: Accessor for unit of component I
191 //=============================================================================
192 char * FIELD_i::getComponentUnit(CORBA::Long i)
193 throw (SALOME::SALOME_Exception)
195 if (_fieldTptr==NULL)
196 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
197 SALOME::INTERNAL_ERROR);
200 return CORBA::string_dup(_fieldTptr->getMEDComponentUnit(i).c_str());
202 catch (MEDEXCEPTION &ex)
204 MESSAGE("Exception en accedant au nom d un component");
205 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
208 //=============================================================================
210 * CORBA: Accessor for description of component I
212 //=============================================================================
213 char * FIELD_i::getComponentDescription(CORBA::Long i)
214 throw (SALOME::SALOME_Exception)
216 if (_fieldTptr==NULL)
217 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
218 SALOME::INTERNAL_ERROR);
221 return CORBA::string_dup(_fieldTptr->getComponentDescription(i).c_str());
223 catch (MEDEXCEPTION &ex)
225 MESSAGE("Exception en accedant a la description d un component");
226 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
229 //=============================================================================
231 * CORBA: Accessor for iteration number
233 //=============================================================================
234 CORBA::Long FIELD_i::getIterationNumber()
235 throw (SALOME::SALOME_Exception)
237 if (_fieldTptr==NULL)
238 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
239 SALOME::INTERNAL_ERROR);
242 return _fieldTptr->getIterationNumber();
244 catch (MEDEXCEPTION &ex)
246 MESSAGE("Exception en accedant au champ");
247 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
250 //=============================================================================
252 * CORBA: Accessor for Corba Number
254 //=============================================================================
255 CORBA::Long FIELD_i::getCorbaIndex()
256 throw (SALOME::SALOME_Exception)
258 if (_fieldTptr==NULL)
259 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
260 SALOME::INTERNAL_ERROR);
264 //=============================================================================
266 * CORBA: Accessor for iteration number
268 //=============================================================================
269 CORBA::Long FIELD_i::getOrderNumber()
270 throw (SALOME::SALOME_Exception)
272 if (_fieldTptr==NULL)
273 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
274 SALOME::INTERNAL_ERROR);
277 return _fieldTptr->getOrderNumber();
279 catch (MEDEXCEPTION &ex)
281 MESSAGE("Exception en accedant au champ");
282 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
285 //=============================================================================
289 //=============================================================================
290 CORBA::Double FIELD_i::getTime()
291 throw (SALOME::SALOME_Exception)
293 if (_fieldTptr==NULL)
294 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
295 SALOME::INTERNAL_ERROR);
298 return _fieldTptr->getTime();
300 catch (MEDEXCEPTION &ex)
302 MESSAGE("Exception en accedant au champ");
303 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
306 //=============================================================================
308 * CORBA: Accessor for Fields's Components names
310 //=============================================================================
311 SALOME_MED::string_array * FIELD_i::getComponentsNames()
312 throw (SALOME::SALOME_Exception)
314 if (_fieldTptr==NULL)
315 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
316 SALOME::INTERNAL_ERROR);
317 SALOME_MED::string_array_var myseq = new SALOME_MED::string_array;
320 int nbcom = _fieldTptr->getNumberOfComponents();
321 myseq->length(nbcom);
322 const string * namecom=_fieldTptr->getComponentsNames();
323 for (int i=0;i<nbcom;i++)
325 myseq[i]=CORBA::string_dup(namecom[i].c_str());
328 catch (MEDEXCEPTION &ex)
330 MESSAGE("Exception en accedant au champ");
331 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
333 return myseq._retn();
335 //=============================================================================
337 * CORBA: Accessor for Fields's Components units
339 //=============================================================================
340 SALOME_MED::string_array * FIELD_i::getComponentsUnits()
341 throw (SALOME::SALOME_Exception)
343 if (_fieldTptr==NULL)
344 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
345 SALOME::INTERNAL_ERROR);
346 SALOME_MED::string_array_var myseq = new SALOME_MED::string_array;
349 int nbcom = _fieldTptr->getNumberOfComponents();
350 myseq->length(nbcom);
351 const string * unitcom=_fieldTptr->getMEDComponentsUnits();
352 for (int i=0;i<nbcom;i++)
354 myseq[i]=CORBA::string_dup(unitcom[i].c_str());
357 catch (MEDEXCEPTION &ex)
359 MESSAGE("Exception en accedant au champ");
360 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
362 return myseq._retn();
364 //=============================================================================
366 * CORBA: Accessor for Fields's Components descriptions
368 //=============================================================================
369 SALOME_MED::string_array * FIELD_i::getComponentsDescriptions()
370 throw (SALOME::SALOME_Exception)
372 if (_fieldTptr==NULL)
373 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
374 SALOME::INTERNAL_ERROR);
375 SALOME_MED::string_array_var myseq = new SALOME_MED::string_array;
378 int nbcom = _fieldTptr->getNumberOfComponents();
379 myseq->length(nbcom);
380 const string * namecom=_fieldTptr->getComponentsDescriptions();
381 for (int i=0;i<nbcom;i++)
383 myseq[i]=CORBA::string_dup(namecom[i].c_str());
386 catch (MEDEXCEPTION &ex)
388 MESSAGE("Exception en accedant au champ");
389 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
391 return myseq._retn();
393 //=============================================================================
395 * CORBA: Add in Study
397 //=============================================================================
398 void FIELD_i::addInStudy(SALOMEDS::Study_ptr myStudy,
399 SALOME_MED::FIELD_ptr myIor )
400 throw (SALOME::SALOME_Exception, SALOMEDS::StudyBuilder::LockProtection)
402 BEGIN_OF(" FIELD_i::addInStudy");
403 if (_fieldTptr==NULL)
404 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
405 SALOME::INTERNAL_ERROR);
406 if ( _FieldId != "" )
408 MESSAGE("Field already in Study");
409 THROW_SALOME_CORBA_EXCEPTION("Field already in Study", \
414 SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
415 SALOMEDS::GenericAttribute_var anAttr;
416 SALOMEDS::AttributeName_var aName;
417 SALOMEDS::AttributeIOR_var aIOR;
419 // Create SComponent labelled 'Med'
420 SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
421 if ( CORBA::is_nil(medfather) )
422 THROW_SALOME_CORBA_EXCEPTION("SComponent labelled 'MED' not Found",SALOME::INTERNAL_ERROR);
424 // Create SObject labelled 'MEDFIELD' if it doesn't already exit
425 SALOMEDS::SObject_var medfieldfather = myStudy->FindObject("MEDFIELD");
426 if ( CORBA::is_nil(medfieldfather) )
428 MESSAGE("Add Object 'MEDFIELD'");
429 medfieldfather = myBuilder->NewObject(medfather);
430 anAttr = myBuilder->FindOrCreateAttribute(medfieldfather, "AttributeName");
431 aName = SALOMEDS::AttributeName::_narrow(anAttr);
432 aName->SetValue("MEDFIELD");
436 string fieldName = _fieldTptr->getName();
438 // Create SObject labelled 'FIELDNAME' if it doesn't already exit
439 SALOMEDS::SObject_var medfieldnamefather = myStudy->FindObject(fieldName.c_str());
440 if ( CORBA::is_nil(medfieldnamefather) )
442 MESSAGE("Add Object "<<fieldName);
443 medfieldnamefather = myBuilder->NewObject(medfieldfather);
444 anAttr = myBuilder->FindOrCreateAttribute(medfieldnamefather, "AttributeName");
445 aName = SALOMEDS::AttributeName::_narrow(anAttr);
446 aName->SetValue(fieldName.c_str());
450 // Create object labelled according to Field's Name
452 MESSAGE("Add a Field Object under "<<fieldName);
453 myBuilder->NewCommand();
454 SALOMEDS::SObject_var newObj = myBuilder->NewObject(medfieldnamefather);
456 ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
457 ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
458 CORBA::ORB_var &orb = init(0,0);
460 int iterationNumber = _fieldTptr->getIterationNumber();
461 SCRUTE(iterationNumber);
463 int orderNumber = _fieldTptr->getOrderNumber();
466 ostringstream iterationName ;
467 iterationName<<"(" << iterationNumber << "," << orderNumber << ")";
468 // string supportName = _support->getName();
469 string supportName = (_fieldTptr->getSupport())->getName();
470 // string meshName = (_support->getMesh())->getName();
471 string meshName = ((_fieldTptr->getSupport())->getMesh())->getName();
472 string meshNameStudy = meshName;
474 char * fieldEntryName;
475 int lenName = strlen(iterationName.str().c_str()) + 4 +
476 strlen(supportName.c_str()) + 4 + strlen(meshName.c_str()) + 1;
478 fieldEntryName = new char[lenName];
479 fieldEntryName = strcpy(fieldEntryName,iterationName.str().c_str());
480 fieldEntryName = strcat(fieldEntryName,"_ON_");
481 fieldEntryName = strcat(fieldEntryName,supportName.c_str());
482 fieldEntryName = strcat(fieldEntryName,"_OF_");
484 for (string::size_type pos=0; pos<meshNameStudy.size();++pos)
486 if (isspace(meshNameStudy[pos])) meshNameStudy[pos] = '_';
489 SCRUTE(meshNameStudy);
491 fieldEntryName = strcat(fieldEntryName,meshNameStudy.c_str());
493 SCRUTE(fieldEntryName);
495 anAttr = myBuilder->FindOrCreateAttribute(newObj, "AttributeName");
496 aName = SALOMEDS::AttributeName::_narrow(anAttr);
497 // aName->SetValue(iterationName.str().c_str());
498 aName->SetValue(fieldEntryName);
500 string iorStr = orb->object_to_string(myIor);
501 anAttr = myBuilder->FindOrCreateAttribute(newObj, "AttributeIOR");
502 aIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
503 aIOR->SetValue(iorStr.c_str());
504 myBuilder->CommitCommand();
505 _FieldId = newObj->GetID();
507 MESSAGE("Computing path to Support");
509 char * supportEntryPath;
510 lenName = 28 + 15 + strlen(meshName.c_str()) + 1 +
511 strlen(supportName.c_str()) + 1;
512 supportEntryPath = new char[lenName];
513 supportEntryPath = strcpy(supportEntryPath,"/Med/MEDMESH/MEDSUPPORTS_OF_");
514 supportEntryPath = strcat(supportEntryPath,meshNameStudy.c_str());
515 supportEntryPath = strcat(supportEntryPath,"/");
516 supportEntryPath = strcat(supportEntryPath,supportName.c_str());
518 SCRUTE(supportEntryPath);
520 MESSAGE("supportEntryPath in field " << supportEntryPath << " length " << lenName);
522 // SALOMEDS::SObject_var supportObject = myStudy->FindObject(supportName.c_str());
523 SALOMEDS::SObject_var supportObject = myStudy->FindObjectByPath(supportEntryPath);
525 SCRUTE(supportObject);
527 if ( CORBA::is_nil(supportObject) )
529 MESSAGE("supportObject is a nil corba object");
530 MESSAGE("FIELD_i::addInStudy : SUPPORT not found") ;
534 MESSAGE("supportObject is OK and is now going to be referenced !");
535 SALOMEDS::SObject_var newObjSupport = myBuilder->NewObject(newObj);
536 myBuilder->Addreference(newObjSupport,supportObject);
540 myBuilder->CommitCommand();
542 delete [] supportEntryPath;
543 delete [] fieldEntryName;
545 MESSAGE("FIELD_i::addInStudy");
547 //END_OF("FIELD_i::addInStudy");
549 //=============================================================================
553 //=============================================================================
554 void FIELD_i::write (CORBA::Long i, const char* driverFieldName)
555 throw (SALOME::SALOME_Exception)
557 if (_fieldTptr==NULL)
558 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
559 SALOME::INTERNAL_ERROR);
562 _fieldTptr->write(i,driverFieldName);
564 catch (MEDEXCEPTION &ex)
566 MESSAGE("Exception en accedant au champ");
567 THROW_SALOME_CORBA_EXCEPTION("Unable to acces Field C++ Object"\
568 ,SALOME::INTERNAL_ERROR);
571 //=============================================================================
575 //=============================================================================
576 void FIELD_i::read (CORBA::Long i)
577 throw (SALOME::SALOME_Exception)
579 if (_fieldTptr==NULL)
580 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
581 SALOME::INTERNAL_ERROR);
586 catch (MEDEXCEPTION &ex)
588 MESSAGE("Exception en accedant au champ");
589 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
592 //=============================================================================
596 //=============================================================================
597 void FIELD_i::rmDriver (CORBA::Long i)
598 throw (SALOME::SALOME_Exception)
600 if (_fieldTptr==NULL)
601 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
602 SALOME::INTERNAL_ERROR);
605 _fieldTptr->rmDriver(i);
607 catch (MEDEXCEPTION &ex)
609 MESSAGE("Exception en accedant au champ");
610 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
613 //=============================================================================
617 //=============================================================================
618 CORBA::Long FIELD_i::addDriver (SALOME_MED::medDriverTypes driverType,
619 const char* fileName, const char* fieldName) throw (SALOME::SALOME_Exception)
621 if (_fieldTptr==NULL)
622 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
623 SALOME::INTERNAL_ERROR);
626 int drivernum=_fieldTptr->addDriver(
627 convertIdlDriverToMedDriver(driverType),
632 catch (MEDEXCEPTION &ex)
634 MESSAGE("Exception en accedant au champ");
635 THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::INTERNAL_ERROR);
639 //=============================================================================
643 //=============================================================================
644 void FIELD_i::release()
646 PortableServer::ObjectId_var oid=_default_POA()->servant_to_id(this);
647 _default_POA()->deactivate_object(oid);