1 // MED MED : implemetation of MED idl descriptions
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : Med_Gen_i.cxx
25 // Author : Paul RASCLE, EDF
30 #include "Med_Gen_i.hxx"
32 #include "MEDMEM_Mesh_i.hxx"
33 #include "MEDMEM_Med_i.hxx"
34 #include "MEDMEM_FieldInt_i.hxx"
35 #include "MEDMEM_FieldDouble_i.hxx"
36 #include "MEDMEM_Support_i.hxx"
39 #include "MEDMEM_Mesh.hxx"
40 #include "MEDMEM_Field.hxx"
41 #include "MEDMEM_Med.hxx"
42 #include "MEDMEM_MedMedDriver.hxx"
43 #include "MEDMEM_MedMeshDriver.hxx"
44 #include "MEDMEM_MedFieldDriver.hxx"
45 #include "MEDMEM_define.hxx"
46 #include "MEDMEM_DriversDef.hxx"
49 #include "Utils_SINGLETON.hxx"
51 #include "Utils_CorbaException.hxx"
52 #include "utilities.h"
58 #include <TCollection_AsciiString.hxx>
59 #include <TColStd_SequenceOfAsciiString.hxx>
60 #include <HDFascii.hxx>
61 #include "SALOMEDS_Tool.hxx"
63 using namespace MEDMEM;
65 // Initialisation des variables statiques
66 map <string, string> Med_Gen_i::_MedCorbaObj;
67 string Med_Gen_i::_myFileName="";
68 string Med_Gen_i::_saveFileName="";
70 //=============================================================================
72 * default constructor: not for use
74 //=============================================================================
76 Med_Gen_i::Med_Gen_i()
78 MESSAGE("Med_Gen_i::Med_Gen_i");
81 //=============================================================================
83 * standard constructor
85 //=============================================================================
87 Med_Gen_i:: Med_Gen_i(CORBA::ORB_ptr orb,
88 PortableServer::POA_ptr poa,
89 PortableServer::ObjectId * contId,
90 const char *instanceName,
91 const char *interfaceName) :
92 Engines_Component_i(orb, poa, contId, instanceName, interfaceName)
94 MESSAGE("activate object");
96 _id = _poa->activate_object(_thisObj);
99 // get an NamingService interface
100 _NS = SINGLETON_<SALOME_NamingService>::Instance() ;
101 ASSERT(SINGLETON_<SALOME_NamingService>::IsAlreadyExisting()) ;
102 _NS->init_orb( _orb ) ;
104 //=============================================================================
106 * private method : change a study name in SALOMEDS::Study_var
108 //=============================================================================
110 SALOMEDS::Study_var Med_Gen_i::studyName2Study(const char* studyName)
111 throw(SALOME::SALOME_Exception)
113 string myStudyName(studyName);
115 if (myStudyName.size() == 0)
116 THROW_SALOME_CORBA_EXCEPTION("No Study Name given", \
119 // Get StudyManager Reference, current study,
121 CORBA::Object_var obj = _NS->Resolve("/myStudyManager");
122 SALOMEDS::StudyManager_var myStudyManager =
123 SALOMEDS::StudyManager::_narrow(obj);
124 if(CORBA::is_nil(myStudyManager))
125 THROW_SALOME_CORBA_EXCEPTION("No StudyManager Found in NameService", \
128 SALOMEDS::Study_var myStudy =
129 myStudyManager->GetStudyByName(myStudyName.c_str());
130 if (CORBA::is_nil(myStudy))
131 THROW_SALOME_CORBA_EXCEPTION("Wrong Study Name", \
134 return SALOMEDS::Study::_duplicate(myStudy) ;
137 //=============================================================================
139 * private method : add Med component in Study (Not MedGen ???)
141 //=============================================================================
143 void Med_Gen_i::addInStudy(SALOMEDS::Study_var myStudy)
144 throw(SALOME::SALOME_Exception)
146 SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
148 myBuilder->NewCommand();
150 // Create SComponent labelled 'Med' if it doesn't already exit
151 SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
152 if ( CORBA::is_nil(medfather) )
154 // mpv: component label must be created in spite of "Locked" study flag state
155 bool aLocked = myStudy->GetProperties()->IsLocked();
156 if (aLocked) myStudy->GetProperties()->SetLocked(false);
158 MESSAGE("Add Component Med");
159 medfather = myBuilder->NewComponent("MED");
160 SALOMEDS::GenericAttribute_var anAttr = myBuilder->FindOrCreateAttribute(medfather, "AttributeName");
161 SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
162 //NRI aName->SetValue("Med");
164 CORBA::Object_var objVarN = _NS->Resolve("/Kernel/ModulCatalog");
165 SALOME_ModuleCatalog::ModuleCatalog_var Catalogue = SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
166 SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "MED" );
167 if ( !Comp->_is_nil() ) {
168 aName->SetValue( Comp->componentusername() );
171 // Utilisation de this deconseillee par Paul ??
172 // myBuilder->DefineComponentInstance(medfather,POA_Engines::Med_Gen::_this());
173 CORBA::Object_var myO = _poa->id_to_reference(*_id); // this ior...
174 myBuilder->DefineComponentInstance(medfather,myO);
176 if (aLocked) myStudy->GetProperties()->SetLocked(true);
179 myBuilder->CommitCommand();
183 //=============================================================================
185 * Lit tous les objets contenus dans un fichier med et les lit en memoire
187 //=============================================================================
188 SALOME_MED::MED_ptr Med_Gen_i::readStructFile (const char* fileName,
189 const char* studyName)
190 throw(SALOME::SALOME_Exception)
193 SALOMEDS::Study_var myStudy = studyName2Study(studyName) ;
194 if (!_duringLoad) addInStudy(myStudy) ;
196 SALOME_MED::MED_ptr myMedIOR ;
199 // we create a new MED_i and add in study
200 MED_i * myMedI = new MED_i();
201 myMedIOR = myMedI->_this() ;
202 if (!_duringLoad) myMedI->addInStudy(myStudy,myMedIOR) ;
203 // create ::MED object, read all and add in study !
204 myMedI->init(myStudy,MED_DRIVER,fileName) ;
206 catch (const SALOMEDS::StudyBuilder::LockProtection & lp) {}
209 MESSAGE("Erreur a la lecture du fichier");
210 THROW_SALOME_CORBA_EXCEPTION("Unable to open File "\
213 return SALOME_MED::MED::_duplicate(myMedIOR) ;
216 //=============================================================================
218 * Prepare un Maillage sans le lire en memoire avec stokage dans l'etude
219 * des champs avec leur type
221 //=============================================================================
222 void Med_Gen_i::readStructFileWithFieldType (const char* fileName,
223 const char* studyName)
224 throw (SALOME::SALOME_Exception)
226 BEGIN_OF("Med_Gen_i::readStructFileWithFieldType (const char* fileName,const char* studyName)");
229 SALOMEDS::Study_var myStudy = studyName2Study(studyName) ;
231 if (!_duringLoad) addInStudy(myStudy) ;
235 // we create a new MED_i and add in study
236 MED_i * myMedI = new MED_i();
237 SALOME_MED::MED_ptr myMedIOR = myMedI->_this() ;
238 if (!_duringLoad) myMedI->addInStudy(myStudy,myMedIOR) ;
239 // create ::MED object, read all and add in study !
240 myMedI->initWithFieldType(myStudy,MED_DRIVER,fileName) ;
242 catch (const SALOMEDS::StudyBuilder::LockProtection & lp) {}
245 MESSAGE("Erreur a la lecture du fichier");
246 THROW_SALOME_CORBA_EXCEPTION("Unable to open File "\
250 END_OF("Med_Gen_i::readStructFileWithFieldType (const char* fileName,const char* studyName)");
255 //=============================================================================
259 //=============================================================================
260 SALOME_MED::MESH_ptr Med_Gen_i::readMeshInFile(const char* fileName,
261 const char* studyName,
262 const char* meshName)
263 throw (SALOME::SALOME_Exception)
266 SALOMEDS::Study_var myStudy = studyName2Study(studyName) ;
268 if (!_duringLoad) addInStudy(myStudy) ;
270 // Creation du maillage
272 MESH * myMesh= new MESH() ;
273 myMesh->setName(meshName);
274 MED_MESH_RDONLY_DRIVER myMeshDriver(fileName,myMesh);
277 myMeshDriver.setMeshName(meshName);
280 catch (const exception & ex)
282 MESSAGE("Exception Interceptee : ");
284 THROW_SALOME_CORBA_EXCEPTION("Unable to find this mesh in this file",SALOME::BAD_PARAM);
289 MESSAGE("apres read");
290 myMeshDriver.close();
292 catch (const exception & ex)
294 MESSAGE("Exception Interceptee : ");
296 THROW_SALOME_CORBA_EXCEPTION("Unable to read this mesh in this file",SALOME::BAD_PARAM);
299 MESH_i * meshi = new MESH_i(myMesh);
300 //SALOME_MED::MESH_var mesh = SALOME_MED::MESH::_narrow(meshi->_this());
301 SALOME_MED::MESH_ptr mesh = meshi->_this();
304 // add the mesh object in study
305 if (!_duringLoad) meshi->addInStudy(myStudy,mesh);
307 catch (const SALOMEDS::StudyBuilder::LockProtection & lp) {}
308 return SALOME_MED::MESH::_duplicate(mesh);
310 //=============================================================================
314 //=============================================================================
315 SALOME_MED::FIELD_ptr Med_Gen_i::readFieldInFile(const char* fileName,
316 const char* studyName,
317 const char* fieldName,
320 throw (SALOME::SALOME_Exception)
323 string myStudyName(studyName);
325 if (myStudyName.size() == 0)
326 THROW_SALOME_CORBA_EXCEPTION("No Study Name given", \
329 // Get StudyManager Reference, current study,
331 CORBA::Object_var obj = _NS->Resolve("/myStudyManager");
332 SALOMEDS::StudyManager_var myStudyManager =
333 SALOMEDS::StudyManager::_narrow(obj);
334 ASSERT(! CORBA::is_nil(myStudyManager));
335 SALOMEDS::Study_var myStudy =
336 myStudyManager->GetStudyByName(myStudyName.c_str());
337 if (CORBA::is_nil(myStudy))
338 THROW_SALOME_CORBA_EXCEPTION("Wrong Study Name", \
341 SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
342 SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
343 if (CORBA::is_nil(medfather))
345 myBuilder->NewCommand();
346 // mpv: component label must be created in spite of "Locked" study flag state
347 bool aLocked = myStudy->GetProperties()->IsLocked();
348 if (aLocked) myStudy->GetProperties()->SetLocked(false);
350 medfather = myBuilder->NewComponent("MED");
351 SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
352 myBuilder->FindOrCreateAttribute(medfather, "AttributeName"));
353 //NRI aName->SetValue("Med");
355 CORBA::Object_var objVarN = _NS->Resolve("/Kernel/ModulCatalog");
356 SALOME_ModuleCatalog::ModuleCatalog_var Catalogue = SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
357 SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "MED" );
358 if ( !Comp->_is_nil() ) {
359 aName->SetValue( Comp->componentusername() );
362 CORBA::Object_var myO = _poa->id_to_reference(*_id); // this ior...
363 myBuilder->DefineComponentInstance(medfather,myO);
365 if (aLocked) myStudy->GetProperties()->SetLocked(true);
366 myBuilder->CommitCommand();
370 MESSAGE("MED dejà dans l étude");
372 MESSAGE("Lecture du fichier ")
377 FIELD_ * myField= new FIELD_() ;
378 MED * mymed = new MED(MED_DRIVER,fileName) ;
381 deque<string> fieldsNames = mymed->getFieldNames() ;
382 int numberOfFields = fieldsNames.size();
384 for (i=0; i<numberOfFields; i++)
386 if (fieldsNames[i]== fieldName) break;
388 if (i == numberOfFields)
390 THROW_SALOME_CORBA_EXCEPTION("Unable to find this field ",SALOME::BAD_PARAM);
394 deque<DT_IT_> myIteration = mymed->getFieldIteration (fieldName);
395 if (myIteration.size() != 1)
397 MESSAGE("WARNING : My iteration size is ")
398 SCRUTE(myIteration.size());
401 myField = mymed->getField(fieldName,iter,ordre);
403 catch (const exception & ex)
405 MESSAGE("Exception Interceptee : ");
407 THROW_SALOME_CORBA_EXCEPTION("Unable to find this field in this file",SALOME::BAD_PARAM);
410 SUPPORT * fieldSupport;
411 SALOME_MED::SUPPORT_ptr mySupportIOR;
414 fieldSupport=(SUPPORT *)myField->getSupport() ;
415 ASSERT(fieldSupport != NULL);
416 MESH * myMesh=(MESH *)fieldSupport->getMesh();
417 ASSERT(myMesh != NULL);
419 SCRUTE(myMesh->getName());
420 fieldSupport->update();
421 SUPPORT_i * mySupportI = new SUPPORT_i(fieldSupport);
422 mySupportIOR=mySupportI->_this();
424 catch (const exception & ex)
426 MESSAGE("Exception Interceptee : ");
428 THROW_SALOME_CORBA_EXCEPTION("Unable to find associated support",SALOME::BAD_PARAM);
431 med_type_champ type = myField->getValueType() ;
434 case MED_FR::MED_INT32:
438 ((FIELD<int>*)myField)->read() ;
439 FIELDINT_i * myFieldIntI = new FIELDINT_i(mySupportIOR,(FIELD<int>*)myField);
440 POA_SALOME_MED::FIELD_tie<FIELD_i> * myFieldTie = new POA_SALOME_MED::FIELD_tie<FIELD_i>(myFieldIntI);
441 SALOME_MED::FIELD_ptr myFieldIOR = myFieldTie->_this() ;
442 if (!_duringLoad) myFieldIntI->addInStudy(myStudy,myFieldIOR) ;
443 return SALOME_MED::FIELD::_duplicate(myFieldIOR);
445 catch (const SALOMEDS::StudyBuilder::LockProtection & lp) {}
446 catch (const exception & ex)
448 MESSAGE("Exception Interceptee : ");
450 THROW_SALOME_CORBA_EXCEPTION("Unable to read int field",SALOME::BAD_PARAM);
454 case MED_FR::MED_REEL64:
458 ((FIELD<double>*)myField)->read() ;
459 FIELDDOUBLE_i * myFieldDoubleI = new FIELDDOUBLE_i(mySupportIOR,(FIELD<double>*)myField);
460 POA_SALOME_MED::FIELD_tie<FIELD_i> * myFieldTie = new POA_SALOME_MED::FIELD_tie<FIELD_i>(myFieldDoubleI);
461 SALOME_MED::FIELD_ptr myFieldIOR = myFieldTie->_this() ;
462 if (!_duringLoad) myFieldDoubleI->addInStudy(myStudy,myFieldIOR) ;
463 return SALOME_MED::FIELD::_duplicate(myFieldIOR);
465 catch (const SALOMEDS::StudyBuilder::LockProtection & lp) {}
466 catch (const exception & ex)
468 MESSAGE("Exception Interceptee : ");
470 THROW_SALOME_CORBA_EXCEPTION("Unable to read double field",SALOME::BAD_PARAM);
480 //=============================================================================
484 //=============================================================================
486 Med_Gen_i::~Med_Gen_i()
488 MESSAGE("Med_Gen_i::~Med_Gen_i");
491 //=============================================================================
493 * CORBA: Save Mesh objects (called when a study is saved)
495 //=============================================================================
496 SALOMEDS::TMPFile* Med_Gen_i::Save(SALOMEDS::SComponent_ptr theComponent,
499 const char* LOC = "Med_Gen_i::Save";
502 SALOMEDS::TMPFile_var aStreamFile;
503 // Get a temporary directory to store a file
504 TCollection_AsciiString aTmpDir = (isMultiFile)?TCollection_AsciiString((char*)theURL):SALOMEDS_Tool::GetTmpDir();
505 // Create a list to store names of created files
506 SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
507 TColStd_SequenceOfAsciiString aFileNames;
509 CORBA::String_var aSaveStudyName = strdup(SALOMEDS_Tool::GetNameFromPath(theComponent->GetStudy()->URL()));
511 SALOMEDS::SObject_var aMedMeshFather = theComponent->GetStudy()->FindObject("MEDMESH");
512 if (!CORBA::is_nil(aMedMeshFather)) {
513 SALOMEDS::ChildIterator_var anIter = theComponent->GetStudy()->NewChildIterator(aMedMeshFather);
514 for(; anIter->More(); anIter->Next()) {
515 SALOMEDS::SObject_var aSO = anIter->Value();
516 SALOMEDS::GenericAttribute_var anAttr;
517 if (aSO->FindAttribute(anAttr,"AttributeIOR")) {
518 CORBA::Object_var myIOR = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
519 SALOME_MED::MESH_var myMesh = SALOME_MED::MESH::_narrow(myIOR);
520 if (! CORBA::is_nil(myMesh)) {
521 TCollection_AsciiString aName(strdup(aSaveStudyName));
522 aName += "_MEDMESH_";
523 aName += myMesh->getName();
525 MESSAGE("Save mesh with name "<<aName.ToCString());
526 long driverId = myMesh->addDriver(SALOME_MED::MED_DRIVER,(aTmpDir+aName).ToCString(),myMesh->getName());
527 myMesh->write(driverId,"");
528 aFileNames.Append(aName);
534 SALOMEDS::SObject_var aMedFieldFather = theComponent->GetStudy()->FindObject("MEDFIELD");
535 if (!CORBA::is_nil(aMedFieldFather)) {
536 SALOMEDS::ChildIterator_var anIter = theComponent->GetStudy()->NewChildIterator(aMedFieldFather);
537 for(; anIter->More(); anIter->Next()) {
538 SALOMEDS::SObject_var aSO = anIter->Value();
539 SALOMEDS::GenericAttribute_var anAttr;
540 if (aSO->FindAttribute(anAttr,"AttributeIOR")) {
541 CORBA::Object_var myIOR = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
542 SALOME_MED::FIELD_var myField = SALOME_MED::FIELD::_narrow(myIOR);
543 if (! CORBA::is_nil(myField)) {
545 a<< myField->getOrderNumber();
546 b<< myField->getIterationNumber();
548 TCollection_AsciiString aName(strdup(aSaveStudyName));
549 aName += "_MEDFIELD_";
550 aName += myField->getName();
552 aName += strdup(a.str().c_str());
554 aName += strdup(b.str().c_str());
556 MESSAGE("Save mesh with name "<<aName.ToCString());
557 long driverId = myField->addDriver(SALOME_MED::MED_DRIVER,(aTmpDir+aName).ToCString(),myField->getName());
558 myField->write(driverId,"");
559 aFileNames.Append(aName);
566 aSeq->length(aFileNames.Length());
567 for(i = aFileNames.Length(); i > 0; i--) aSeq[i-1] = CORBA::string_dup(aFileNames.Value(i).ToCString());
568 // Conver a file to the byte stream
569 aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.ToCString(), aSeq.in(), isMultiFile);
570 // Remove the created file and tmp directory
571 if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.ToCString(), aSeq.in(), true);
572 // Return the created byte stream
573 return aStreamFile._retn();
578 SALOMEDS::TMPFile* Med_Gen_i::SaveASCII(SALOMEDS::SComponent_ptr theComponent,
581 const char* LOC = "Med_Gen_i::SaveASCII";
584 SALOMEDS::TMPFile_var aStreamFile;
585 // Get a temporary directory to store a file
586 TCollection_AsciiString aTmpDir = (isMultiFile)?TCollection_AsciiString((char*)theURL):SALOMEDS_Tool::GetTmpDir();
587 // Create a list to store names of created files
588 SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
589 TColStd_SequenceOfAsciiString aFileNames;
591 CORBA::String_var aSaveStudyName = strdup(SALOMEDS_Tool::GetNameFromPath(theComponent->GetStudy()->URL()));
593 SALOMEDS::SObject_var aMedMeshFather = theComponent->GetStudy()->FindObject("MEDMESH");
594 if (!CORBA::is_nil(aMedMeshFather)) {
595 SALOMEDS::ChildIterator_var anIter = theComponent->GetStudy()->NewChildIterator(aMedMeshFather);
596 for(; anIter->More(); anIter->Next()) {
597 SALOMEDS::SObject_var aSO = anIter->Value();
598 SALOMEDS::GenericAttribute_var anAttr;
599 if (aSO->FindAttribute(anAttr,"AttributeIOR")) {
600 CORBA::Object_var myIOR = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
601 SALOME_MED::MESH_var myMesh = SALOME_MED::MESH::_narrow(myIOR);
602 if (! CORBA::is_nil(myMesh)) {
603 TCollection_AsciiString aName(strdup(aSaveStudyName));
604 aName += "_MEDMESH_";
605 aName += myMesh->getName();
607 MESSAGE("Save mesh with name "<<aName.ToCString());
608 long driverId = myMesh->addDriver(SALOME_MED::MED_DRIVER,(aTmpDir+aName).ToCString(),myMesh->getName());
609 myMesh->write(driverId,"");
610 HDFascii::ConvertFromHDFToASCII(strdup((aTmpDir+aName).ToCString()), true);
611 aFileNames.Append(aName);
617 SALOMEDS::SObject_var aMedFieldFather = theComponent->GetStudy()->FindObject("MEDFIELD");
618 if (!CORBA::is_nil(aMedFieldFather)) {
619 SALOMEDS::ChildIterator_var anIter = theComponent->GetStudy()->NewChildIterator(aMedFieldFather);
620 for(; anIter->More(); anIter->Next()) {
621 SALOMEDS::SObject_var aSO = anIter->Value();
622 SALOMEDS::GenericAttribute_var anAttr;
623 if (aSO->FindAttribute(anAttr,"AttributeIOR")) {
624 CORBA::Object_var myIOR = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
625 SALOME_MED::FIELD_var myField = SALOME_MED::FIELD::_narrow(myIOR);
626 if (! CORBA::is_nil(myField)) {
628 a<< myField->getOrderNumber();
629 b<< myField->getIterationNumber();
631 TCollection_AsciiString aName(strdup(aSaveStudyName));
632 aName += "_MEDFIELD_";
633 aName += myField->getName();
635 aName += strdup(a.str().c_str());
637 aName += strdup(b.str().c_str());
639 MESSAGE("Save mesh with name "<<aName.ToCString());
640 long driverId = myField->addDriver(SALOME_MED::MED_DRIVER,(aTmpDir+aName).ToCString(),myField->getName());
641 myField->write(driverId,"");
642 HDFascii::ConvertFromHDFToASCII(strdup((aTmpDir+aName).ToCString()), true);
643 aFileNames.Append(aName);
650 aSeq->length(aFileNames.Length());
651 for(i = aFileNames.Length(); i > 0; i--) aSeq[i-1] = CORBA::string_dup(aFileNames.Value(i).ToCString());
652 // Conver a file to the byte stream
653 aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.ToCString(), aSeq.in(), isMultiFile);
654 // Remove the created file and tmp directory
655 if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.ToCString(), aSeq.in(), true);
656 // Return the created byte stream
657 return aStreamFile._retn();
662 //=============================================================================
664 * CORBA: Load Mesh objects (called when an existing study is opened)
666 //=============================================================================
668 CORBA::Boolean Med_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent,
669 const SALOMEDS::TMPFile& theStream,
672 const char* LOC = "Med_Gen_i::Load";
675 // Get a temporary directory for a file
676 TCollection_AsciiString aTmpDir =
677 (isMultiFile)?TCollection_AsciiString((char*)theURL):SALOMEDS_Tool::GetTmpDir();
678 _saveFileName = CORBA::string_dup(aTmpDir.ToCString());
679 SALOMEDS::ListOfFileNames_var aSeq =
680 SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir.ToCString(), isMultiFile);
686 CORBA::Boolean Med_Gen_i::LoadASCII(SALOMEDS::SComponent_ptr theComponent,
687 const SALOMEDS::TMPFile& theStream,
690 return Load(theComponent, theStream, theURL, isMultiFile);
693 //=============================================================================
697 //=============================================================================
699 void Med_Gen_i::Close(SALOMEDS::SComponent_ptr theComponent)
701 MESSAGE("Med_Gen_i::Close");
702 SALOMEDS::SObject_var aMedMeshFather = theComponent->GetStudy()->FindObject("MEDMESH");
703 if (!CORBA::is_nil(aMedMeshFather)) {
704 SALOMEDS::ChildIterator_var anIter = theComponent->GetStudy()->NewChildIterator(aMedMeshFather);
705 for(; anIter->More(); anIter->Next()) {
706 SALOMEDS::SObject_var aSO = anIter->Value();
707 SALOMEDS::GenericAttribute_var anAttr;
708 if (aSO->FindAttribute(anAttr,"AttributeIOR")) {
709 CORBA::Object_var myIOR = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
710 SALOME_MED::MESH_var myMesh = SALOME_MED::MESH::_narrow(myIOR);
711 // here must call method destroy of myMesh, but it not implented yet
717 //=============================================================================
721 //=============================================================================
723 char* Med_Gen_i::ComponentDataType()
725 MESSAGE("Med_Gen_i::ComponentDataType");
726 return strdup("MED") ; /* What is this type ? */
729 //=============================================================================
731 * CORBA: give a persistent reference of a transient object (for study save)
733 //=============================================================================
735 char* Med_Gen_i::IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject,
736 const char* IORString,
737 CORBA::Boolean isMultiFile,
738 CORBA::Boolean isASCII) {
739 const char * LOC = "Med_Gen_i::IORToLocalPersistentID" ;
743 string aSaveStudyName(strdup(SALOMEDS_Tool::GetNameFromPath(theSObject->GetStudy()->URL())));
746 if (string(IORString).size()==0) return strdup((aSaveStudyName+"_MED").c_str());
747 // Well, we know where put object (_saveFilename) and we know object (IORString)
749 CORBA::Object_var myIOR = _orb->string_to_object(IORString);
752 SALOME_MED::MED_var myMed = SALOME_MED::MED::_narrow(myIOR);
753 if (! CORBA::is_nil(myMed))
755 // nothing to save : Support will be saved inside the mesh
756 string str_MedName=aSaveStudyName + "_MED Objet Med + /OBJ_MED/";
757 return strdup(str_MedName.c_str()) ;
761 SALOME_MED::MESH_var myMesh = SALOME_MED::MESH::_narrow(myIOR);
762 if (! CORBA::is_nil(myMesh))
764 CORBA::String_var aName((aSaveStudyName+"_MEDMESH_"+ myMesh->getName() + ".med").c_str());
765 return strdup(aName._retn()) ;
769 SALOME_MED::SUPPORT_var mySupport = SALOME_MED::SUPPORT::_narrow(myIOR);
770 if (! CORBA::is_nil(mySupport))
772 // nothing to save : Support will be saved inside the mesh
773 string str_SupportName;
776 str_SupportName=string("/FAS/")+string(mySupport->getName());
777 str_SupportName+=string("/ENS_MAA/")+string(mySupport->getMesh()->getName());
778 SCRUTE(str_SupportName);
782 MESSAGE("Unable to save the support");
783 THROW_SALOME_CORBA_EXCEPTION("Unable to save Field in Med"\
784 ,SALOME::INTERNAL_ERROR);
786 return strdup((aSaveStudyName+"_MED"+str_SupportName).c_str());
789 SALOME_MED::FIELD_var myField = SALOME_MED::FIELD::_narrow(myIOR);
790 if (! CORBA::is_nil(myField))
792 string str_FieldName;
794 a<< myField->getOrderNumber();
795 b<< myField->getIterationNumber();
796 CORBA::String_var aName((aSaveStudyName+"_MEDFIELD_"+ myField->getName() +
797 string("_ORDRE_")+a.str()+
798 string("_ITER_")+b.str() +
800 return strdup(aName._retn());
803 //THROW_SALOME_CORBA_EXCEPTION("Unable to save IOR",SALOME::BAD_PARAM);
804 return strdup((aSaveStudyName+"_MED").c_str());
809 //=============================================================================
811 * CORBA: give a transient reference (when loading an object, opening study)
813 //=============================================================================
815 char* Med_Gen_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject,
816 const char* aLocalPersistentID,
817 CORBA::Boolean isMultiFile,
818 CORBA::Boolean isASCII)
819 throw(SALOME::SALOME_Exception)
821 const char * LOC = "Med_Gen_i::LocalPersistentIDToIOR" ;
823 TCollection_AsciiString aTmpDir(CORBA::string_dup(_saveFileName.c_str()));
825 string aSaveStudyName(strdup(SALOMEDS_Tool::GetNameFromPath(theSObject->GetStudy()->URL())));
826 int aStudyNameLen = strlen(aSaveStudyName.c_str());
828 if (strlen(aLocalPersistentID) <= aStudyNameLen) return strdup("");
829 if (strcmp(aLocalPersistentID, "Objet Med + /OBJ_MED/") == 0) return strdup(""); // MED
831 if (strncmp(&(aLocalPersistentID[aStudyNameLen]), "_MEDMESH_",9) == 0) {// MESH
832 MESH * myMesh= new MESH() ;
833 int aMeshNameLen = strlen(aLocalPersistentID) - 12 - aStudyNameLen;
834 char* aMeshName = new char[aMeshNameLen];
835 strncpy(aMeshName, &(aLocalPersistentID[aStudyNameLen + 9]), aMeshNameLen-1);
836 aMeshName[aMeshNameLen-1] = 0;
837 myMesh->setName(aMeshName);
841 char* aResultPath = HDFascii::ConvertFromASCIIToHDF((aTmpDir + strdup(aLocalPersistentID)).ToCString());
842 aFileName = new char[strlen(aResultPath) + 19];
843 sprintf(aFileName, "%shdf_from_ascii.hdf", aResultPath);
845 } else aFileName = strdup((aTmpDir + strdup(aLocalPersistentID)).ToCString());
846 MED_MESH_RDONLY_DRIVER myMeshDriver(aFileName,myMesh);
849 myMeshDriver.setMeshName(aMeshName);
852 catch (const exception & ex)
854 MESSAGE("Exception Interceptee : ");
856 THROW_SALOME_CORBA_EXCEPTION("Unable to find this mesh in this file",SALOME::BAD_PARAM);
861 MESSAGE("apres read");
862 myMeshDriver.close();
864 catch (const exception & ex)
866 MESSAGE("Exception Interceptee : ");
868 THROW_SALOME_CORBA_EXCEPTION("Unable to read this mesh in this file",SALOME::BAD_PARAM);
870 MESH_i * meshi = new MESH_i(myMesh);
871 //SALOME_MED::MESH_var mesh = SALOME_MED::MESH::_narrow(meshi->_this());
872 SALOME_MED::MESH_ptr mesh = meshi->_this();
873 SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
875 aSeq[0]=CORBA::string_dup(aLocalPersistentID);
876 if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.ToCString(), aSeq.in(), true);
878 SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames;
879 aFilesToRemove->length(1);
880 aFilesToRemove[0] = strdup(&(aFileName[strlen(SALOMEDS_Tool::GetDirFromPath(aFileName))]));
881 SALOMEDS_Tool::RemoveTemporaryFiles(SALOMEDS_Tool::GetDirFromPath(aFileName), aFilesToRemove, true);
884 return(CORBA::string_dup(_orb->object_to_string(mesh)));
885 } else if (strncmp(&(aLocalPersistentID[aStudyNameLen]), "_MEDFIELD_",14) == 0) { // FIELD
886 return(strdup("")); // not implemented yet
894 //=============================================================================
896 * returns true, if can publish object
898 //=============================================================================
899 bool Med_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) {
900 SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(theIOR);
901 return !(aMesh->_is_nil());
904 //=============================================================================
906 * publish the given object
908 //=============================================================================
909 SALOMEDS::SObject_ptr Med_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
910 SALOMEDS::SObject_ptr theSObject,
911 CORBA::Object_ptr theObject,
912 const char* theName) throw (SALOME::SALOME_Exception)
914 SALOMEDS::SObject_var aResultSO;
916 if(CORBA::is_nil(theObject)) return aResultSO;
917 if(theStudy->_is_nil()) return aResultSO;
919 SALOMEDS::StudyBuilder_var aBuilder = theStudy->NewBuilder();
920 SALOMEDS::GenericAttribute_var anAttr;
921 SALOMEDS::AttributeName_var aName;
922 SALOMEDS::AttributeIOR_var anIOR;
923 SALOMEDS::SComponent_var aFather = theStudy->FindComponent("MED");
925 if (aFather->_is_nil()) {
926 aFather = aBuilder->NewComponent("MED");
927 if (aFather->_is_nil()) return aResultSO;
928 anAttr = aBuilder->FindOrCreateAttribute(aFather, "AttributeName");
929 aName = SALOMEDS::AttributeName::_narrow(anAttr);
930 //NRI aName->SetValue("MED");
932 CORBA::Object_var objVarN = _NS->Resolve("/Kernel/ModulCatalog");
933 SALOME_ModuleCatalog::ModuleCatalog_var Catalogue = SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
934 SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "MED" );
935 if ( !Comp->_is_nil() ) {
936 aName->SetValue( Comp->componentusername() );
938 aBuilder->DefineComponentInstance(aFather, MED_Gen::_this());
941 if (CORBA::is_nil(theSObject)) {
942 SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(theObject);
943 aMesh->addInStudy(theStudy, aMesh);
944 SALOMEDS::SObject_var aResultSO = theStudy->FindObjectIOR(_orb->object_to_string(theObject));
946 if (!theSObject->ReferencedObject(aResultSO))
947 THROW_SALOME_CORBA_EXCEPTION("Publish in study MED object error",SALOME::BAD_PARAM);
949 // aBuilder->Addreference(theObject, aResultSO);
950 return aResultSO._retn();
953 //=============================================================================
955 * returns true, if can copy the object
957 //=============================================================================
958 CORBA::Boolean Med_Gen_i::CanCopy(SALOMEDS::SObject_ptr theObject) {
959 // Try to retrieve known by MED component mesh by given IOR
960 SALOMEDS::GenericAttribute_var anAttr;
961 if (!theObject->FindAttribute(anAttr, "AttributeIOR")) return false;
962 CORBA::Object_var anObj = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
963 SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(anObj);
964 // If the object is null one it can't be copied: return false
965 if (aMesh->_is_nil()) return false;
969 //=============================================================================
971 * create copy of the object and put it to the stream
973 //=============================================================================
974 SALOMEDS::TMPFile* Med_Gen_i::CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID) {
975 // Declare a sequence of the byte to store the copied object
976 SALOMEDS::TMPFile_var aStreamFile;
978 // Try to get GEOM_Shape object by given SObject
979 SALOMEDS::GenericAttribute_var anAttr;
980 if (!theObject->FindAttribute(anAttr, "AttributeIOR")) return new SALOMEDS::TMPFile(0);
981 CORBA::String_var anIOR = strdup(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
982 CORBA::Object_var anObj = _orb->string_to_object(anIOR);
983 SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(anObj);
984 if (aMesh->_is_nil()) return new SALOMEDS::TMPFile(0);
986 // Get a temporary directory to store a temporary file
987 CORBA::String_var aTmpDir = SALOMEDS_Tool::GetTmpDir();
988 // Create a list to store names of created files
989 SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
991 aSeq[0] = strdup(aMesh->getName());
992 char* aFullName = new char[strlen(aTmpDir)+strlen(aSeq[0])+1];
993 strcpy(aFullName, aTmpDir);
994 strcpy(aFullName+strlen(aTmpDir), aSeq[0]);
995 long driverId = aMesh->addDriver(SALOME_MED::MED_DRIVER,strdup(aFullName) , aMesh->getName());
996 aMesh->write(driverId,"");
999 aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir, aSeq.in(), false);
1000 SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aSeq.in(), true);
1002 // Assign an ID = 1 the the type SALOME_MED::MESH
1005 return aStreamFile._retn();
1008 //=============================================================================
1010 * returns true, if can copy the object
1012 //=============================================================================
1013 CORBA::Boolean Med_Gen_i::CanPaste(const char* theComponentName, CORBA::Long theObjectID) {
1014 // The MED component can paste only objects copied by MED component
1015 // and with the object type = 1 (mesh)
1016 if (strcmp(theComponentName, ComponentDataType()) != 0 || theObjectID != 1) return false;
1020 //=============================================================================
1022 * returns true, if can copy the object
1024 //=============================================================================
1025 SALOMEDS::SObject_ptr Med_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream,
1026 CORBA::Long theObjectID,
1027 SALOMEDS::SObject_ptr theObject) {
1028 SALOMEDS::SObject_var aResultSO = SALOMEDS::SObject::_duplicate(theObject);
1029 if (theStream.length() == 0) return aResultSO._retn();
1031 SALOMEDS::Study_var aStudy = theObject->GetStudy();
1033 CORBA::String_var aTmpDir = strdup(SALOMEDS_Tool::GetTmpDir());
1034 SALOMEDS::ListOfFileNames_var aSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir, false);
1035 CORBA::String_var aMeshName = strdup(aSeq[0]);
1036 char* aFullName = new char[strlen(aTmpDir)+strlen(aMeshName)+1];
1037 strcpy(aFullName, aTmpDir);
1038 strcpy(aFullName+strlen(aTmpDir), aMeshName);
1040 MESH * myMesh= new MESH() ;
1041 myMesh->setName((char*)aMeshName);
1042 MED_MESH_RDONLY_DRIVER myMeshDriver(aFullName, myMesh);
1044 myMeshDriver.setMeshName((char*)aMeshName);
1045 myMeshDriver.open();
1046 } catch (const exception & ex) {
1047 MESSAGE("Exception Interceptee : ");
1050 return aResultSO._retn();
1053 myMeshDriver.read();
1055 myMeshDriver.close();
1056 } catch (const exception & ex) {
1057 MESSAGE("Exception Interceptee : ");
1060 return aResultSO._retn();
1062 // set new mesh name, becouse now there are no possibility to operate meshes with the same names
1063 // srand((unsigned int)time(NULL));
1064 int aRND = rand(); //Get a random number to present a name of a copied mesh
1065 char aCopiedMeshName[20];
1066 sprintf(aCopiedMeshName,"MESH_COPY_%d",aRND);
1067 myMesh->setName(aCopiedMeshName);
1068 MESH_i * meshi = new MESH_i(myMesh);
1069 SALOME_MED::MESH_ptr mesh = meshi->_this();
1070 // add the mesh object in study
1071 meshi->addInStudy(aStudy,mesh);
1072 // get the IOR attribute of just added mesh
1073 CORBA::String_var anIORString = _orb->object_to_string(mesh);
1074 aResultSO = aStudy->FindObjectIOR(anIORString);
1076 SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aSeq.in(), true);
1078 return aResultSO._retn();
1086 //=============================================================================
1088 * C factory, accessible with dlsym, after dlopen
1090 //=============================================================================
1094 PortableServer::ObjectId * MEDEngine_factory(
1096 PortableServer::POA_ptr poa,
1097 PortableServer::ObjectId * contId,
1098 const char *instanceName,
1099 const char *interfaceName)
1101 MESSAGE("PortableServer::ObjectId * MedEngine_factory()");
1102 SCRUTE(interfaceName);
1103 Med_Gen_i * myMed_Gen
1104 = new Med_Gen_i(orb, poa, contId, instanceName, interfaceName);
1105 return myMed_Gen->getId() ;