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"
38 #include "MEDMEM_Mesh.hxx"
39 #include "MEDMEM_Field.hxx"
40 #include "MEDMEM_Med.hxx"
41 #include "MEDMEM_MedMedDriver.hxx"
42 #include "MEDMEM_MedMeshDriver.hxx"
43 #include "MEDMEM_MedFieldDriver.hxx"
44 #include "MEDMEM_define.hxx"
45 #include "MEDMEM_DriversDef.hxx"
48 #include "Utils_SINGLETON.hxx"
50 #include "Utils_CorbaException.hxx"
51 #include "utilities.h"
57 #include <TCollection_AsciiString.hxx>
58 #include <TColStd_SequenceOfAsciiString.hxx>
59 #include <HDFascii.hxx>
60 #include "SALOMEDS_Tool.hxx"
62 using namespace MEDMEM;
64 // Initialisation des variables statiques
65 map <string, string> Med_Gen_i::_MedCorbaObj;
66 string Med_Gen_i::_myFileName="";
67 string Med_Gen_i::_saveFileName="";
69 //=============================================================================
71 * default constructor: not for use
73 //=============================================================================
75 Med_Gen_i::Med_Gen_i()
77 MESSAGE("Med_Gen_i::Med_Gen_i");
80 //=============================================================================
82 * standard constructor
84 //=============================================================================
86 Med_Gen_i:: Med_Gen_i(CORBA::ORB_ptr orb,
87 PortableServer::POA_ptr poa,
88 PortableServer::ObjectId * contId,
89 const char *instanceName,
90 const char *interfaceName) :
91 Engines_Component_i(orb, poa, contId, instanceName, interfaceName)
93 MESSAGE("activate object");
95 _id = _poa->activate_object(_thisObj);
98 // get an NamingService interface
99 _NS = SINGLETON_<SALOME_NamingService>::Instance() ;
100 ASSERT(SINGLETON_<SALOME_NamingService>::IsAlreadyExisting()) ;
101 _NS->init_orb( _orb ) ;
103 //=============================================================================
105 * private method : change a study name in SALOMEDS::Study_var
107 //=============================================================================
109 SALOMEDS::Study_var Med_Gen_i::studyName2Study(const char* studyName)
110 throw(SALOME::SALOME_Exception)
112 string myStudyName(studyName);
114 if (myStudyName.size() == 0)
115 THROW_SALOME_CORBA_EXCEPTION("No Study Name given", \
118 // Get StudyManager Reference, current study,
120 CORBA::Object_var obj = _NS->Resolve("/myStudyManager");
121 SALOMEDS::StudyManager_var myStudyManager =
122 SALOMEDS::StudyManager::_narrow(obj);
123 if(CORBA::is_nil(myStudyManager))
124 THROW_SALOME_CORBA_EXCEPTION("No StudyManager Found in NameService", \
127 SALOMEDS::Study_var myStudy =
128 myStudyManager->GetStudyByName(myStudyName.c_str());
129 if (CORBA::is_nil(myStudy))
130 THROW_SALOME_CORBA_EXCEPTION("Wrong Study Name", \
133 return SALOMEDS::Study::_duplicate(myStudy) ;
136 //=============================================================================
138 * private method : add Med component in Study (Not MedGen ???)
140 //=============================================================================
142 void Med_Gen_i::addInStudy(SALOMEDS::Study_var myStudy)
143 throw(SALOME::SALOME_Exception)
145 SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
147 // Create SComponent labelled 'Med' if it doesn't already exit
148 SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
149 if ( CORBA::is_nil(medfather) )
151 myBuilder->NewCommand();
152 // mpv: component label must be created in spite of "Locked" study flag state
153 bool aLocked = myStudy->GetProperties()->IsLocked();
154 if (aLocked) myStudy->GetProperties()->SetLocked(false);
156 MESSAGE("Add Component Med");
157 medfather = myBuilder->NewComponent("MED");
158 SALOMEDS::GenericAttribute_var anAttr = myBuilder->FindOrCreateAttribute(medfather, "AttributeName");
159 SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
160 //NRI aName->SetValue("Med");
162 CORBA::Object_var objVarN = _NS->Resolve("/Kernel/ModulCatalog");
163 SALOME_ModuleCatalog::ModuleCatalog_var Catalogue = SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
164 SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "MED" );
165 if ( !Comp->_is_nil() ) {
166 aName->SetValue( Comp->componentusername() );
169 // Utilisation de this deconseillee par Paul ??
170 // myBuilder->DefineComponentInstance(medfather,POA_Engines::MED_Gen::_this());
171 CORBA::Object_var myO = _poa->id_to_reference(*_id); // this ior...
172 myBuilder->DefineComponentInstance(medfather,myO);
174 if (aLocked) myStudy->GetProperties()->SetLocked(true);
175 myBuilder->CommitCommand();
181 //=============================================================================
183 * Lit tous les objets contenus dans un fichier med et les lit en memoire
185 //=============================================================================
186 SALOME_MED::MED_ptr Med_Gen_i::readStructFile (const char* fileName,
187 const char* studyName)
188 throw(SALOME::SALOME_Exception)
190 beginService("Med_Gen_i::readStructFile");
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 // if (!_duringLoad) myMedI->addInStudy(myStudy,myMedIOR,fileName) ;
204 // create ::MED object, read all and add in study !
205 myMedI->init(myStudy,MED_DRIVER,fileName) ;
207 catch (const SALOMEDS::StudyBuilder::LockProtection & lp) {}
210 MESSAGE("Erreur a la lecture du fichier");
211 THROW_SALOME_CORBA_EXCEPTION("Unable to open File "\
215 endService("Med_Gen_i::readStructFile");
219 //=============================================================================
221 * Prepare un Maillage sans le lire en memoire avec stokage dans l'etude
222 * des champs avec leur type
224 //=============================================================================
225 void Med_Gen_i::readStructFileWithFieldType (const char* fileName,
226 const char* studyName)
227 throw (SALOME::SALOME_Exception)
229 beginService("Med_Gen_i::readStructFileWithFieldType");
231 BEGIN_OF("Med_Gen_i::readStructFileWithFieldType (const char* fileName,const char* studyName)");
234 SALOMEDS::Study_var myStudy = studyName2Study(studyName) ;
236 if (!_duringLoad) addInStudy(myStudy) ;
240 // we create a new MED_i and add in study
241 MED_i * myMedI = new MED_i();
242 SALOME_MED::MED_ptr myMedIOR = myMedI->_this() ;
243 if (!_duringLoad) myMedI->addInStudy(myStudy,myMedIOR,fileName) ;
244 // create ::MED object, read all and add in study !
245 myMedI->initWithFieldType(myStudy,MED_DRIVER,fileName) ;
247 catch (const SALOMEDS::StudyBuilder::LockProtection & lp) {}
250 MESSAGE("Erreur a la lecture du fichier");
251 THROW_SALOME_CORBA_EXCEPTION("Unable to open File "\
255 endService("Med_Gen_i::readStructFileWithFieldType");
256 END_OF("Med_Gen_i::readStructFileWithFieldType (const char* fileName,const char* studyName)");
261 //=============================================================================
265 //=============================================================================
266 SALOME_MED::MESH_ptr Med_Gen_i::readMeshInFile(const char* fileName,
267 const char* studyName,
268 const char* meshName)
269 throw (SALOME::SALOME_Exception)
271 beginService("Med_Gen_i::readMeshInFile");
273 SALOMEDS::Study_var myStudy = studyName2Study(studyName) ;
275 // if (!_duringLoad) addInStudy(myStudy) ;
277 // Creation du maillage
279 MESH * myMesh= new MESH() ;
280 myMesh->setName(meshName);
281 MED_MESH_RDONLY_DRIVER myMeshDriver(fileName,myMesh);
284 myMeshDriver.setMeshName(meshName);
287 catch (const exception & ex)
289 MESSAGE("Exception Interceptee : ");
291 THROW_SALOME_CORBA_EXCEPTION("Unable to find this mesh in this file",SALOME::BAD_PARAM);
296 MESSAGE("apres read");
297 myMeshDriver.close();
299 catch (const exception & ex)
301 MESSAGE("Exception Interceptee : ");
303 THROW_SALOME_CORBA_EXCEPTION("Unable to read this mesh in this file",SALOME::BAD_PARAM);
306 MESH_i * meshi = new MESH_i(myMesh);
307 //SALOME_MED::MESH_var mesh = SALOME_MED::MESH::_narrow(meshi->_this());
308 SALOME_MED::MESH_ptr mesh = meshi->_this();
311 // add the mesh object in study
312 // if (!_duringLoad) meshi->addInStudy(myStudy,mesh);
314 catch (const SALOMEDS::StudyBuilder::LockProtection & lp) {}
316 endService("Med_Gen_i::readMeshInFile");
319 //=============================================================================
323 //=============================================================================
324 SALOME_MED::FIELD_ptr Med_Gen_i::readFieldInFile(const char* fileName,
325 const char* studyName,
326 const char* fieldName,
329 throw (SALOME::SALOME_Exception)
331 beginService("Med_Gen_i::readFieldInFile");
333 string myStudyName(studyName);
335 if (myStudyName.size() == 0)
336 THROW_SALOME_CORBA_EXCEPTION("No Study Name given", \
339 // Get StudyManager Reference, current study,
341 CORBA::Object_var obj = _NS->Resolve("/myStudyManager");
342 SALOMEDS::StudyManager_var myStudyManager =
343 SALOMEDS::StudyManager::_narrow(obj);
344 ASSERT(! CORBA::is_nil(myStudyManager));
345 SALOMEDS::Study_var myStudy =
346 myStudyManager->GetStudyByName(myStudyName.c_str());
347 if (CORBA::is_nil(myStudy))
348 THROW_SALOME_CORBA_EXCEPTION("Wrong Study Name", \
351 SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
352 SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
353 if (CORBA::is_nil(medfather))
355 myBuilder->NewCommand();
356 // mpv: component label must be created in spite of "Locked" study flag state
357 bool aLocked = myStudy->GetProperties()->IsLocked();
358 if (aLocked) myStudy->GetProperties()->SetLocked(false);
360 medfather = myBuilder->NewComponent("MED");
361 SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
362 myBuilder->FindOrCreateAttribute(medfather, "AttributeName"));
363 //NRI aName->SetValue("Med");
365 CORBA::Object_var objVarN = _NS->Resolve("/Kernel/ModulCatalog");
366 SALOME_ModuleCatalog::ModuleCatalog_var Catalogue = SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
367 SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "MED" );
368 if ( !Comp->_is_nil() ) {
369 aName->SetValue( Comp->componentusername() );
372 CORBA::Object_var myO = _poa->id_to_reference(*_id); // this ior...
373 myBuilder->DefineComponentInstance(medfather,myO);
375 if (aLocked) myStudy->GetProperties()->SetLocked(true);
376 myBuilder->CommitCommand();
380 MESSAGE("MED dejà dans l étude");
382 MESSAGE("Lecture du fichier ")
388 MED * mymed = new MED(MED_DRIVER,fileName) ;
391 deque<string> fieldsNames = mymed->getFieldNames() ;
392 int numberOfFields = fieldsNames.size();
394 for (i=0; i<numberOfFields; i++)
396 if (fieldsNames[i]== fieldName) break;
398 if (i == numberOfFields)
400 THROW_SALOME_CORBA_EXCEPTION("Unable to find this field ",SALOME::BAD_PARAM);
404 deque<DT_IT_> myIteration = mymed->getFieldIteration (fieldName);
405 if (myIteration.size() != 1)
407 MESSAGE("WARNING : My iteration size is ")
408 SCRUTE(myIteration.size());
411 myField = mymed->getField(fieldName,iter,ordre);
413 catch (const exception & ex)
415 MESSAGE("Exception Interceptee : ");
417 THROW_SALOME_CORBA_EXCEPTION("Unable to find this field in this file",SALOME::BAD_PARAM);
420 SUPPORT * fieldSupport;
423 fieldSupport=(SUPPORT *)myField->getSupport() ;
424 ASSERT(fieldSupport != NULL);
425 MESH * myMesh=(MESH *)fieldSupport->getMesh();
426 ASSERT(myMesh != NULL);
428 SCRUTE(myMesh->getName());
429 fieldSupport->update();
431 catch (const exception & ex)
433 MESSAGE("Exception Interceptee : ");
435 THROW_SALOME_CORBA_EXCEPTION("Unable to find associated support",SALOME::BAD_PARAM);
438 med_type_champ type = myField->getValueType() ;
441 case MED_FR::MED_INT32:
445 ((FIELD<int>*)myField)->read() ;
446 FIELDINT_i * myFieldIntI = new FIELDINT_i((FIELD<int>*)myField);
447 SALOME_MED::FIELD_ptr myFieldIOR = myFieldIntI->_this();
448 // if (!_duringLoad) myFieldIntI->addInStudy(myStudy,myFieldIOR) ;
449 endService("Med_Gen_i::readFieldInFile");
452 catch (const SALOMEDS::StudyBuilder::LockProtection & lp) {}
453 catch (const exception & ex)
455 MESSAGE("Exception Interceptee : ");
457 THROW_SALOME_CORBA_EXCEPTION("Unable to read int field",SALOME::BAD_PARAM);
461 case MED_FR::MED_REEL64:
465 ((FIELD<double>*)myField)->read() ;
466 FIELDDOUBLE_i * myFieldDoubleI = new FIELDDOUBLE_i((FIELD<double>*)myField);
467 SALOME_MED::FIELD_ptr myFieldIOR = myFieldDoubleI->_this() ;
468 // if (!_duringLoad) myFieldDoubleI->addInStudy(myStudy,myFieldIOR) ;
469 endService("Med_Gen_i::readFieldInFile");
472 catch (const SALOMEDS::StudyBuilder::LockProtection & lp) {}
473 catch (const exception & ex)
475 MESSAGE("Exception Interceptee : ");
477 THROW_SALOME_CORBA_EXCEPTION("Unable to read double field",SALOME::BAD_PARAM);
487 //=============================================================================
491 //=============================================================================
493 Med_Gen_i::~Med_Gen_i()
495 MESSAGE("Med_Gen_i::~Med_Gen_i");
498 //=============================================================================
500 * CORBA: Save Mesh objects (called when a study is saved)
502 //=============================================================================
503 SALOMEDS::TMPFile* Med_Gen_i::Save(SALOMEDS::SComponent_ptr theComponent,
506 const char* LOC = "Med_Gen_i::Save";
509 SALOMEDS::TMPFile_var aStreamFile;
510 // Get a temporary directory to store a file
511 TCollection_AsciiString aTmpDir = (isMultiFile)?TCollection_AsciiString((char*)theURL):(char*)SALOMEDS_Tool::GetTmpDir().c_str();
512 // Create a list to store names of created files
513 SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
514 TColStd_SequenceOfAsciiString aFileNames;
516 CORBA::String_var aSaveStudyName("");
517 if (isMultiFile) aSaveStudyName = CORBA::string_dup(SALOMEDS_Tool::GetNameFromPath(theComponent->GetStudy()->URL()).c_str());
519 SALOMEDS::SObject_var aMedMeshFather = theComponent->GetStudy()->FindObject("MEDMESH");
520 if (!CORBA::is_nil(aMedMeshFather)) {
521 SALOMEDS::ChildIterator_var anIter = theComponent->GetStudy()->NewChildIterator(aMedMeshFather);
523 for(; anIter->More(); anIter->Next()) {
524 SALOMEDS::SObject_var aSO = anIter->Value();
525 SALOMEDS::GenericAttribute_var anAttr;
526 if (aSO->FindAttribute(anAttr,"AttributeIOR")) {
527 CORBA::Object_var myIOR = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
528 SALOME_MED::MESH_var myMesh = SALOME_MED::MESH::_narrow(myIOR);
529 if (! CORBA::is_nil(myMesh)) {
530 TCollection_AsciiString aName(aSaveStudyName);
531 aName += "_MEDMESH_";
532 aName += myMesh->getName();
534 MESSAGE("Save mesh with name "<<aName.ToCString());
535 long driverId = myMesh->addDriver(SALOME_MED::MED_DRIVER,(aTmpDir+aName).ToCString(),myMesh->getName());
536 myMesh->write(driverId,"");
537 aFileNames.Append(aName);
543 SALOMEDS::SObject_var aMedFieldFather = theComponent->GetStudy()->FindObject("MEDFIELD");
544 if (!CORBA::is_nil(aMedFieldFather)) {
545 SALOMEDS::ChildIterator_var anIter = theComponent->GetStudy()->NewChildIterator(aMedFieldFather);
547 for(; anIter->More(); anIter->Next()) {
548 SALOMEDS::SObject_var aSO = anIter->Value();
549 SALOMEDS::GenericAttribute_var anAttr;
550 if (aSO->FindAttribute(anAttr,"AttributeIOR")) {
551 CORBA::Object_var myIOR = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
552 SALOME_MED::FIELD_var myField = SALOME_MED::FIELD::_narrow(myIOR);
553 if (! CORBA::is_nil(myField)) {
555 a<< myField->getOrderNumber();
556 b<< myField->getIterationNumber();
558 TCollection_AsciiString aName(aSaveStudyName);
559 aName += "_MEDFIELD_";
560 aName += myField->getName();
562 aName += (char*)(a.str().c_str());
564 aName += (char*)(b.str().c_str());
566 MESSAGE("Save mesh with name "<<aName.ToCString());
567 long driverId = myField->addDriver(SALOME_MED::MED_DRIVER,(aTmpDir+aName).ToCString(),myField->getName());
568 myField->write(driverId,"");
569 aFileNames.Append(aName);
576 aSeq->length(aFileNames.Length());
577 for(i = aFileNames.Length(); i > 0; i--) aSeq[i-1] = CORBA::string_dup(aFileNames.Value(i).ToCString());
578 // Conver a file to the byte stream
579 aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.ToCString(), aSeq.in(), isMultiFile);
580 // Remove the created file and tmp directory
581 if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.ToCString(), aSeq.in(), true);
582 // Return the created byte stream
583 return aStreamFile._retn();
588 SALOMEDS::TMPFile* Med_Gen_i::SaveASCII(SALOMEDS::SComponent_ptr theComponent,
591 const char* LOC = "Med_Gen_i::SaveASCII";
594 SALOMEDS::TMPFile_var aStreamFile;
595 // Get a temporary directory to store a file
596 TCollection_AsciiString aTmpDir = (isMultiFile)?TCollection_AsciiString((char*)theURL):(char*)SALOMEDS_Tool::GetTmpDir().c_str();
597 // Create a list to store names of created files
598 SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
599 TColStd_SequenceOfAsciiString aFileNames;
601 CORBA::String_var aSaveStudyName("");
602 if (isMultiFile) aSaveStudyName = CORBA::string_dup(SALOMEDS_Tool::GetNameFromPath(theComponent->GetStudy()->URL()).c_str());
604 SALOMEDS::SObject_var aMedMeshFather = theComponent->GetStudy()->FindObject("MEDMESH");
605 if (!CORBA::is_nil(aMedMeshFather)) {
606 SALOMEDS::ChildIterator_var anIter = theComponent->GetStudy()->NewChildIterator(aMedMeshFather);
608 for(; anIter->More(); anIter->Next()) {
609 SALOMEDS::SObject_var aSO = anIter->Value();
610 SALOMEDS::GenericAttribute_var anAttr;
611 if (aSO->FindAttribute(anAttr,"AttributeIOR")) {
612 CORBA::Object_var myIOR = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
613 SALOME_MED::MESH_var myMesh = SALOME_MED::MESH::_narrow(myIOR);
614 if (! CORBA::is_nil(myMesh)) {
615 TCollection_AsciiString aName(aSaveStudyName);
616 aName += "_MEDMESH_";
617 aName += myMesh->getName();
619 MESSAGE("Save mesh with name "<<aName.ToCString());
620 long driverId = myMesh->addDriver(SALOME_MED::MED_DRIVER,(aTmpDir+aName).ToCString(),myMesh->getName());
621 myMesh->write(driverId,"");
622 HDFascii::ConvertFromHDFToASCII((aTmpDir+aName).ToCString(), true);
623 aFileNames.Append(aName);
629 SALOMEDS::SObject_var aMedFieldFather = theComponent->GetStudy()->FindObject("MEDFIELD");
630 if (!CORBA::is_nil(aMedFieldFather)) {
631 SALOMEDS::ChildIterator_var anIter = theComponent->GetStudy()->NewChildIterator(aMedFieldFather);
633 for(; anIter->More(); anIter->Next()) {
634 SALOMEDS::SObject_var aSO = anIter->Value();
635 SALOMEDS::GenericAttribute_var anAttr;
636 if (aSO->FindAttribute(anAttr,"AttributeIOR")) {
637 CORBA::Object_var myIOR = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
638 SALOME_MED::FIELD_var myField = SALOME_MED::FIELD::_narrow(myIOR);
639 if (! CORBA::is_nil(myField)) {
641 a<< myField->getOrderNumber();
642 b<< myField->getIterationNumber();
644 TCollection_AsciiString aName(aSaveStudyName);
645 aName += "_MEDFIELD_";
646 aName += myField->getName();
648 aName += (char*)(a.str().c_str());
650 aName += (char*)(b.str().c_str());
652 MESSAGE("Save mesh with name "<<aName.ToCString());
653 long driverId = myField->addDriver(SALOME_MED::MED_DRIVER,(aTmpDir+aName).ToCString(),myField->getName());
654 myField->write(driverId,"");
655 HDFascii::ConvertFromHDFToASCII((aTmpDir+aName).ToCString(), true);
656 aFileNames.Append(aName);
663 aSeq->length(aFileNames.Length());
664 for(i = aFileNames.Length(); i > 0; i--) aSeq[i-1] = CORBA::string_dup(aFileNames.Value(i).ToCString());
665 // Conver a file to the byte stream
666 aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.ToCString(), aSeq.in(), isMultiFile);
667 // Remove the created file and tmp directory
668 if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.ToCString(), aSeq.in(), true);
669 // Return the created byte stream
670 return aStreamFile._retn();
675 //=============================================================================
677 * CORBA: Load Mesh objects (called when an existing study is opened)
679 //=============================================================================
681 CORBA::Boolean Med_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent,
682 const SALOMEDS::TMPFile& theStream,
685 const char* LOC = "Med_Gen_i::Load";
688 // Get a temporary directory for a file
689 TCollection_AsciiString aTmpDir =
690 (isMultiFile)?TCollection_AsciiString((char*)theURL):(char*)SALOMEDS_Tool::GetTmpDir().c_str();
691 _saveFileName = CORBA::string_dup(aTmpDir.ToCString());
692 SALOMEDS::ListOfFileNames_var aSeq =
693 SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir.ToCString(), isMultiFile);
699 CORBA::Boolean Med_Gen_i::LoadASCII(SALOMEDS::SComponent_ptr theComponent,
700 const SALOMEDS::TMPFile& theStream,
703 return Load(theComponent, theStream, theURL, isMultiFile);
706 //=============================================================================
710 //=============================================================================
712 void Med_Gen_i::Close(SALOMEDS::SComponent_ptr theComponent)
714 MESSAGE("Med_Gen_i::Close");
715 SALOMEDS::SObject_var aMedMeshFather = theComponent->GetStudy()->FindObject("MEDMESH");
716 if (!CORBA::is_nil(aMedMeshFather)) {
717 SALOMEDS::ChildIterator_var anIter = theComponent->GetStudy()->NewChildIterator(aMedMeshFather);
718 for(; anIter->More(); anIter->Next()) {
719 SALOMEDS::SObject_var aSO = anIter->Value();
720 SALOMEDS::GenericAttribute_var anAttr;
721 if (aSO->FindAttribute(anAttr,"AttributeIOR")) {
722 CORBA::Object_var myIOR = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
723 SALOME_MED::MESH_var myMesh = SALOME_MED::MESH::_narrow(myIOR);
724 // here must call method destroy of myMesh, but it not implented yet
730 //=============================================================================
734 //=============================================================================
736 char* Med_Gen_i::ComponentDataType()
738 MESSAGE("Med_Gen_i::ComponentDataType");
739 return CORBA::string_dup("MED") ; /* What is this type ? */
742 //=============================================================================
744 * CORBA: give a persistent reference of a transient object (for study save)
746 //=============================================================================
748 char* Med_Gen_i::IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject,
749 const char* IORString,
750 CORBA::Boolean isMultiFile,
751 CORBA::Boolean isASCII) {
752 const char * LOC = "Med_Gen_i::IORToLocalPersistentID" ;
757 if (string(IORString).size()==0) return "_MED";
758 // Well, we know where put object (_saveFilename) and we know object (IORString)
760 CORBA::Object_var myIOR = _orb->string_to_object(IORString);
763 SALOME_MED::MED_var myMed = SALOME_MED::MED::_narrow(myIOR);
764 if (! CORBA::is_nil(myMed))
766 // nothing to save : Support will be saved inside the mesh
767 string str_MedName="_MED Objet Med + /OBJ_MED/";
768 return CORBA::string_dup(str_MedName.c_str()) ;
772 SALOME_MED::MESH_var myMesh = SALOME_MED::MESH::_narrow(myIOR);
773 if (! CORBA::is_nil(myMesh))
775 CORBA::String_var aName((string("_MEDMESH_")+ myMesh->getName() + ".med").c_str());
776 return aName._retn() ;
780 SALOME_MED::SUPPORT_var mySupport = SALOME_MED::SUPPORT::_narrow(myIOR);
781 if (! CORBA::is_nil(mySupport))
783 // nothing to save : Support will be saved inside the mesh
784 string str_SupportName;
787 str_SupportName=string("/FAS/")+string(mySupport->getName());
788 str_SupportName+=string("/ENS_MAA/")+string(mySupport->getMesh()->getName());
789 SCRUTE(str_SupportName);
793 MESSAGE("Unable to save the support");
794 THROW_SALOME_CORBA_EXCEPTION("Unable to save Field in Med"\
795 ,SALOME::INTERNAL_ERROR);
797 return CORBA::string_dup(("_MED"+str_SupportName).c_str());
800 SALOME_MED::FIELD_var myField = SALOME_MED::FIELD::_narrow(myIOR);
801 if (! CORBA::is_nil(myField))
803 string str_FieldName;
805 a<< myField->getOrderNumber();
806 b<< myField->getIterationNumber();
807 CORBA::String_var aName((string("_MEDFIELD_")+ myField->getName() +
808 string("_ORDRE_")+a.str()+
809 string("_ITER_")+b.str() +
811 return aName._retn();
814 //THROW_SALOME_CORBA_EXCEPTION("Unable to save IOR",SALOME::BAD_PARAM);
820 //=============================================================================
822 * CORBA: give a transient reference (when loading an object, opening study)
824 //=============================================================================
826 char* Med_Gen_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject,
827 const char* aLocalPersistentID,
828 CORBA::Boolean isMultiFile,
829 CORBA::Boolean isASCII)
830 throw(SALOME::SALOME_Exception)
832 const char * LOC = "Med_Gen_i::LocalPersistentIDToIOR" ;
834 TCollection_AsciiString aTmpDir((char*)(_saveFileName.c_str()));
836 TCollection_AsciiString aSaveStudyName("");
837 if (isMultiFile) aSaveStudyName = (char*)SALOMEDS_Tool::GetNameFromPath(theSObject->GetStudy()->URL()).c_str();
839 if (strcmp(aLocalPersistentID, "Objet Med + /OBJ_MED/") == 0) return CORBA::string_dup(""); // MED
841 if (strncmp(aLocalPersistentID, "_MEDMESH_",9) == 0) {// MESH
842 MESH * myMesh= new MESH() ;
843 int aMeshNameLen = strlen(aLocalPersistentID) - 12;
844 char* aMeshName = new char[aMeshNameLen];
845 strncpy(aMeshName, &(aLocalPersistentID[9]), aMeshNameLen-1);
846 aMeshName[aMeshNameLen-1] = 0;
847 myMesh->setName(aMeshName);
851 char* aResultPath = HDFascii::ConvertFromASCIIToHDF((aTmpDir + aSaveStudyName + (char*)aLocalPersistentID).ToCString());
852 aFileName = new char[strlen(aResultPath) + 19];
853 sprintf(aFileName, "%shdf_from_ascii.hdf", aResultPath);
855 } else aFileName = CORBA::string_dup((aTmpDir + aSaveStudyName + (char*)aLocalPersistentID).ToCString());
856 MED_MESH_RDONLY_DRIVER myMeshDriver(aFileName,myMesh);
859 myMeshDriver.setMeshName(aMeshName);
862 catch (const exception & ex)
864 MESSAGE("Exception Interceptee : ");
866 THROW_SALOME_CORBA_EXCEPTION("Unable to find this mesh in this file",SALOME::BAD_PARAM);
871 MESSAGE("apres read");
872 myMeshDriver.close();
874 catch (const exception & ex)
876 MESSAGE("Exception Interceptee : ");
878 THROW_SALOME_CORBA_EXCEPTION("Unable to read this mesh in this file",SALOME::BAD_PARAM);
880 MESH_i * meshi = new MESH_i(myMesh);
881 //SALOME_MED::MESH_var mesh = SALOME_MED::MESH::_narrow(meshi->_this());
882 SALOME_MED::MESH_ptr mesh = meshi->_this();
883 SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
885 aSeq[0]=CORBA::string_dup(aLocalPersistentID);
886 if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.ToCString(), aSeq.in(), true);
888 SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames;
889 aFilesToRemove->length(1);
890 aFilesToRemove[0] = CORBA::string_dup(&(aFileName[strlen(SALOMEDS_Tool::GetDirFromPath(aFileName).c_str())]));
891 SALOMEDS_Tool::RemoveTemporaryFiles(SALOMEDS_Tool::GetDirFromPath(aFileName).c_str(), aFilesToRemove, true);
894 return(CORBA::string_dup(_orb->object_to_string(mesh)));
895 } else if (strncmp(aLocalPersistentID, "_MEDFIELD_",14) == 0) { // FIELD
896 return(CORBA::string_dup("")); // not implemented yet
899 return CORBA::string_dup("");
904 //=============================================================================
906 * returns true, if can publish object
908 //=============================================================================
909 bool Med_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) {
910 SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(theIOR);
911 return !(aMesh->_is_nil());
914 //=============================================================================
916 * publish the given object
918 //=============================================================================
919 SALOMEDS::SObject_ptr Med_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
920 SALOMEDS::SObject_ptr theSObject,
921 CORBA::Object_ptr theObject,
922 const char* theName) throw (SALOME::SALOME_Exception)
924 SALOMEDS::SObject_var aResultSO;
926 if(CORBA::is_nil(theObject)) return aResultSO;
927 if(theStudy->_is_nil()) return aResultSO;
929 SALOMEDS::StudyBuilder_var aBuilder = theStudy->NewBuilder();
930 SALOMEDS::GenericAttribute_var anAttr;
931 SALOMEDS::AttributeName_var aName;
932 SALOMEDS::AttributeIOR_var anIOR;
933 SALOMEDS::SComponent_var aFather = theStudy->FindComponent("MED");
935 if (aFather->_is_nil()) {
936 aFather = aBuilder->NewComponent("MED");
937 if (aFather->_is_nil()) return aResultSO;
938 anAttr = aBuilder->FindOrCreateAttribute(aFather, "AttributeName");
939 aName = SALOMEDS::AttributeName::_narrow(anAttr);
940 //NRI aName->SetValue("MED");
942 CORBA::Object_var objVarN = _NS->Resolve("/Kernel/ModulCatalog");
943 SALOME_ModuleCatalog::ModuleCatalog_var Catalogue = SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
944 SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "MED" );
945 if ( !Comp->_is_nil() ) {
946 aName->SetValue( Comp->componentusername() );
948 aBuilder->DefineComponentInstance(aFather, MED_Gen::_this());
951 if (CORBA::is_nil(theSObject)) {
952 SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(theObject);
953 aMesh->addInStudy(theStudy, aMesh);
954 SALOMEDS::SObject_var aResultSO = theStudy->FindObjectIOR(_orb->object_to_string(theObject));
956 if (!theSObject->ReferencedObject(aResultSO))
957 THROW_SALOME_CORBA_EXCEPTION("Publish in study MED object error",SALOME::BAD_PARAM);
959 // aBuilder->Addreference(theObject, aResultSO);
960 return aResultSO._retn();
963 //=============================================================================
965 * returns true, if can copy the object
967 //=============================================================================
968 CORBA::Boolean Med_Gen_i::CanCopy(SALOMEDS::SObject_ptr theObject) {
969 // Try to retrieve known by MED component mesh by given IOR
970 SALOMEDS::GenericAttribute_var anAttr;
971 if (!theObject->FindAttribute(anAttr, "AttributeIOR")) return false;
973 CORBA::Object_var anObj = _orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
974 SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(anObj);
975 // If the object is null one it can't be copied: return false
976 if (aMesh->_is_nil()) return false;
983 //=============================================================================
985 * create copy of the object and put it to the stream
987 //=============================================================================
988 SALOMEDS::TMPFile* Med_Gen_i::CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID) {
989 // Declare a sequence of the byte to store the copied object
990 SALOMEDS::TMPFile_var aStreamFile;
992 // Try to get GEOM_Shape object by given SObject
993 SALOMEDS::GenericAttribute_var anAttr;
994 if (!theObject->FindAttribute(anAttr, "AttributeIOR")) return new SALOMEDS::TMPFile(0);
995 CORBA::String_var anIOR = CORBA::string_dup(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value());
996 CORBA::Object_var anObj = _orb->string_to_object(anIOR);
997 SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(anObj);
998 if (aMesh->_is_nil()) return new SALOMEDS::TMPFile(0);
1000 // Get a temporary directory to store a temporary file
1001 CORBA::String_var aTmpDir = SALOMEDS_Tool::GetTmpDir().c_str();
1002 // Create a list to store names of created files
1003 SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
1005 aSeq[0] = CORBA::string_dup(aMesh->getName());
1006 char* aFullName = new char[strlen(aTmpDir)+strlen(aSeq[0])+1];
1007 strcpy(aFullName, aTmpDir);
1008 strcpy(aFullName+strlen(aTmpDir), aSeq[0]);
1009 long driverId = aMesh->addDriver(SALOME_MED::MED_DRIVER,aFullName , aMesh->getName());
1010 aMesh->write(driverId,"");
1013 aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir, aSeq.in(), false);
1014 SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aSeq.in(), true);
1016 // Assign an ID = 1 the the type SALOME_MED::MESH
1019 return aStreamFile._retn();
1022 //=============================================================================
1024 * returns true, if can copy the object
1026 //=============================================================================
1027 CORBA::Boolean Med_Gen_i::CanPaste(const char* theComponentName, CORBA::Long theObjectID) {
1028 // The MED component can paste only objects copied by MED component
1029 // and with the object type = 1 (mesh)
1030 if (strcmp(theComponentName, ComponentDataType()) != 0 || theObjectID != 1) return false;
1034 //=============================================================================
1036 * returns true, if can copy the object
1038 //=============================================================================
1039 SALOMEDS::SObject_ptr Med_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream,
1040 CORBA::Long theObjectID,
1041 SALOMEDS::SObject_ptr theObject) {
1042 SALOMEDS::SObject_var aResultSO = SALOMEDS::SObject::_duplicate(theObject);
1043 if (theStream.length() == 0) return aResultSO._retn();
1045 SALOMEDS::Study_var aStudy = theObject->GetStudy();
1047 CORBA::String_var aTmpDir = CORBA::string_dup(SALOMEDS_Tool::GetTmpDir().c_str());
1048 SALOMEDS::ListOfFileNames_var aSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir, false);
1049 CORBA::String_var aMeshName = CORBA::string_dup(aSeq[0]);
1050 char* aFullName = new char[strlen(aTmpDir)+strlen(aMeshName)+1];
1051 strcpy(aFullName, aTmpDir);
1052 strcpy(aFullName+strlen(aTmpDir), aMeshName);
1054 MESH * myMesh= new MESH() ;
1055 myMesh->setName((char*)aMeshName);
1056 MED_MESH_RDONLY_DRIVER myMeshDriver(aFullName, myMesh);
1058 myMeshDriver.setMeshName((char*)aMeshName);
1059 myMeshDriver.open();
1060 } catch (const exception & ex) {
1061 MESSAGE("Exception Interceptee : ");
1064 return aResultSO._retn();
1067 myMeshDriver.read();
1069 myMeshDriver.close();
1070 } catch (const exception & ex) {
1071 MESSAGE("Exception Interceptee : ");
1074 return aResultSO._retn();
1076 // set new mesh name, becouse now there are no possibility to operate meshes with the same names
1077 // srand((unsigned int)time(NULL));
1078 int aRND = rand(); //Get a random number to present a name of a copied mesh
1079 char aCopiedMeshName[20];
1080 sprintf(aCopiedMeshName,"MESH_COPY_%d",aRND);
1081 myMesh->setName(aCopiedMeshName);
1082 MESH_i * meshi = new MESH_i(myMesh);
1083 SALOME_MED::MESH_ptr mesh = meshi->_this();
1084 // add the mesh object in study
1085 meshi->addInStudy(aStudy,mesh);
1086 // get the IOR attribute of just added mesh
1087 CORBA::String_var anIORString = _orb->object_to_string(mesh);
1088 aResultSO = aStudy->FindObjectIOR(anIORString);
1090 SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aSeq.in(), true);
1092 return aResultSO._retn();
1100 //=============================================================================
1102 * C factory, accessible with dlsym, after dlopen
1104 //=============================================================================
1108 PortableServer::ObjectId * MEDEngine_factory(
1110 PortableServer::POA_ptr poa,
1111 PortableServer::ObjectId * contId,
1112 const char *instanceName,
1113 const char *interfaceName)
1115 MESSAGE("PortableServer::ObjectId * MedEngine_factory()");
1116 SCRUTE(interfaceName);
1117 Med_Gen_i * myMed_Gen
1118 = new Med_Gen_i(orb, poa, contId, instanceName, interfaceName);
1119 return myMed_Gen->getId() ;