X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPlugins%2FMEDReader%2FIO%2FvtkMEDReader.cxx;h=92ecc7d4ce7f8366d216db49fca3e474ddd5cfd6;hb=f671e69102c5ae8e2194509a6b719fae0b06d26c;hp=d2eb1025ce8e0fa407b773a4859c9e873e5edd38;hpb=478db82c701923587ad06be02e4f575d3e021174;p=modules%2Fparavis.git diff --git a/src/Plugins/MEDReader/IO/vtkMEDReader.cxx b/src/Plugins/MEDReader/IO/vtkMEDReader.cxx index d2eb1025..92ecc7d4 100644 --- a/src/Plugins/MEDReader/IO/vtkMEDReader.cxx +++ b/src/Plugins/MEDReader/IO/vtkMEDReader.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2015 CEA/DEN, EDF R&D +// Copyright (C) 2010-2016 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -44,6 +44,8 @@ #include "vtkCellArray.h" #include "vtkDoubleArray.h" #include "vtkObjectFactory.h" +#include "vtkInformationDataObjectMetaDataKey.h" + #ifdef MEDREADER_USE_MPI #include "vtkMultiProcessController.h" #endif @@ -58,7 +60,7 @@ /*! * This class stores properties in loading state mode (pvsm) when the MED file has not been read yet. - * The file is not read beacause FileName has not been informed yet ! So this class stores properties of vtkMEDReader instance that + * The file is not read beacause FileName has not been informed yet ! So this class stores properties of vtkMEDReader instance that * owns it and wait the vtkMEDReader::SetFileName to apply properties afterwards. */ class PropertyKeeper @@ -154,15 +156,16 @@ public: vtkMEDReaderInternal(vtkMEDReader *master):TK(0),IsMEDOrSauv(true),IsStdOrMode(false),GenerateVect(false),SIL(0),LastLev0(-1),FirstCall0(2),PK(master),MyMTime(0) { } - + bool PluginStart0() { + return false; // TODO Useless and buggy if(FirstCall0==0) return false; FirstCall0--; return true; } - + ~vtkMEDReaderInternal() { if(this->SIL) @@ -188,12 +191,31 @@ public: int MyMTime; std::set _wonderful_set;// this set is used by SetFieldsStatus method to detect the fact that SetFieldsStatus has been called for all items ! Great Items are not sorted ! Why ? std::map _wonderful_ref;// this map stores the state before a SetFieldsStatus status. + private: unsigned char FirstCall0; }; vtkStandardNewMacro(vtkMEDReader); +// vtkInformationKeyMacro(vtkMEDReader, META_DATA, DataObjectMetaData); // Here we need to customize vtkMEDReader::META_DATA method +// start of overload of vtkInformationKeyMacro +static vtkInformationDataObjectMetaDataKey *vtkMEDReader_META_DATA=new vtkInformationDataObjectMetaDataKey("META_DATA","vtkMEDReader"); + +vtkInformationDataObjectMetaDataKey *vtkMEDReader::META_DATA() +{ + static const char ZE_KEY[]="vtkMEDReader::META_DATA"; + vtkInformationDataObjectMetaDataKey *ret(vtkMEDReader_META_DATA); + MEDCoupling::GlobalDict *gd(MEDCoupling::GlobalDict::GetInstance()); + if(!gd->hasKey(ZE_KEY)) + {// here META_DATA is put on global var to be exchanged with other filters without dependancy of MEDReader. Please do not change ZE_KEY ! + std::ostringstream oss; oss << ret; + gd->setKeyValue(ZE_KEY,oss.str()); + } + return ret; +} +// end of overload of vtkInformationKeyMacro + vtkMEDReader::vtkMEDReader():Internal(new vtkMEDReaderInternal(this)) { this->SetNumberOfInputPorts(0); @@ -203,13 +225,11 @@ vtkMEDReader::vtkMEDReader():Internal(new vtkMEDReaderInternal(this)) vtkMEDReader::~vtkMEDReader() { delete this->Internal; + this->Internal = 0; } -void vtkMEDReader::Reload(int a) +void vtkMEDReader::Reload() { - if(a==0) - return; - std::cerr << "vtkMEDReader::Reload" << a << std::endl; std::string fName((const char *)this->GetFileName()); delete this->Internal; this->Internal=new vtkMEDReaderInternal(this); @@ -218,11 +238,16 @@ void vtkMEDReader::Reload(int a) int vtkMEDReader::GetServerModifTime() { + if( !this->Internal ) + return -1; return this->Internal->MyMTime; } void vtkMEDReader::GenerateVectors(int val) { + if ( !this->Internal ) + return; + if(this->Internal->FileName.empty()) {//pvsm mode this->Internal->PK.pushGenerateVectorsValue(val); @@ -239,6 +264,9 @@ void vtkMEDReader::GenerateVectors(int val) void vtkMEDReader::ChangeMode(int newMode) { + if ( !this->Internal ) + return; + if(this->Internal->FileName.empty()) {//pvsm mode this->Internal->PK.pushChangeModeValue(newMode); @@ -246,7 +274,6 @@ void vtkMEDReader::ChangeMode(int newMode) } //not pvsm mode (general case) this->Internal->IsStdOrMode=newMode!=0; - //std::cerr << "vtkMEDReader::ChangeMode : " << this->Internal->IsStdOrMode << std::endl; this->Modified(); } @@ -257,6 +284,8 @@ const char *vtkMEDReader::GetSeparator() void vtkMEDReader::SetFileName(const char *fname) { + if(!this->Internal) + return; try { this->Internal->FileName=fname; @@ -302,20 +331,27 @@ void vtkMEDReader::SetFileName(const char *fname) char *vtkMEDReader::GetFileName() { + if (!this->Internal) + return 0; return const_cast(this->Internal->FileName.c_str()); } int vtkMEDReader::RequestInformation(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) { - //std::cerr << "########################################## RequestInformation ##########################################" << std::endl; +// std::cout << "########################################## vtkMEDReader::RequestInformation ##########################################" << std::endl; if(!this->Internal) return 0; try { +// request->Print(cout); vtkInformation *outInfo(outputVector->GetInformationObject(0)); outInfo->Set(vtkDataObject::DATA_TYPE_NAME(),"vtkMultiBlockDataSet"); - this->UpdateSIL(outInfo); - // + this->UpdateSIL(request, outInfo); + + // Set the meta data graph as a meta data key in the information + // That's all that is needed to transfer it along the pipeline + outInfo->Set(vtkMEDReader::META_DATA(),this->Internal->SIL); + bool dummy(false); this->PublishTimeStepsIfNeeded(outInfo,dummy); } @@ -335,22 +371,23 @@ int vtkMEDReader::RequestInformation(vtkInformation *request, vtkInformationVect int vtkMEDReader::RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) { - //std::cerr << "########################################## RequestData ##########################################"; +// std::cout << "########################################## vtkMEDReader::RequestData ##########################################" << std::endl; if(!this->Internal) return 0; try { +// request->Print(cout); vtkInformation *outInfo(outputVector->GetInformationObject(0)); vtkMultiBlockDataSet *output(vtkMultiBlockDataSet::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT()))); bool isUpdated(false); double reqTS(0.); if(outInfo->Has(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEP())) reqTS=outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEP()); - //std::cerr << reqTS << std::endl; this->FillMultiBlockDataSetInstance(output,reqTS); output->GetInformation()->Set(vtkDataObject::DATA_TIME_STEP(),reqTS); - this->UpdateSIL(outInfo); - //this->UpdateProgress((float) progress/((float) maxprogress-1)); + + // Is it really needed ? TODO + this->UpdateSIL(request, outInfo); } catch(INTERP_KERNEL::Exception& e) { @@ -362,6 +399,9 @@ int vtkMEDReader::RequestData(vtkInformation *request, vtkInformationVector **in void vtkMEDReader::SetFieldsStatus(const char* name, int status) { + if( !this->Internal ) + return; + //this->Internal->_wonderful_set.insert(name); if(this->Internal->FileName.empty()) {//pvsm mode @@ -403,17 +443,20 @@ int vtkMEDReader::GetNumberOfFieldsTreeArrays() if(!this->Internal) return 0; return this->Internal->Tree.getNumberOfLeavesArrays(); - //std::cerr << "vtkMEDReader::GetNumberOfFieldsTreeArrays called ! " << ret << std::endl; } const char *vtkMEDReader::GetFieldsTreeArrayName(int index) { + if(!this->Internal) + return 0; return this->Internal->Tree.getNameOfC(index); - //std::cerr << "vtkMEDReader::GetFieldsTreeArrayName(" << index << ") called ! " << ret << std::endl; } int vtkMEDReader::GetFieldsTreeArrayStatus(const char *name) { + if(!this->Internal) + return -1; + int zeId(this->Internal->Tree.getIdHavingZeName(name)); int ret(this->Internal->Tree.getStatusOf(zeId)); return ret; @@ -421,6 +464,9 @@ int vtkMEDReader::GetFieldsTreeArrayStatus(const char *name) void vtkMEDReader::SetTimesFlagsStatus(const char *name, int status) { + if (!this->Internal) + return; + if(this->Internal->FileName.empty()) {//pvsm mode this->Internal->PK.pushTimesFlagsStatusEntry(name,status); @@ -452,29 +498,26 @@ const char *vtkMEDReader::GetTimesFlagsArrayName(int index) int vtkMEDReader::GetTimesFlagsArrayStatus(const char *name) { + if(!this->Internal) + return -1; int pos(0); std::istringstream iss(name); iss >> pos; return (int)this->Internal->TK.getTimesFlagArray()[pos].first; } -void vtkMEDReader::UpdateSIL(vtkInformation *info) +void vtkMEDReader::UpdateSIL(vtkInformation* request, vtkInformation *info) { if(!this->Internal) - return ; - vtkMutableDirectedGraph *sil(vtkMutableDirectedGraph::New()); - std::string meshName(this->BuildSIL(sil)); - if(meshName!=this->Internal->DftMeshName) + return; + std::string meshName(this->Internal->Tree.getActiveMeshName()); + if(!this->Internal->SIL || meshName!=this->Internal->DftMeshName) { + vtkMutableDirectedGraph *sil(vtkMutableDirectedGraph::New()); + this->BuildSIL(sil); if(this->Internal->SIL) this->Internal->SIL->Delete(); this->Internal->SIL=sil; this->Internal->DftMeshName=meshName; - info->Set(vtkDataObject::SIL(),this->Internal->SIL); - //request->AppendUnique(vtkExecutive::KEYS_TO_COPY(),vtkDataObject::SIL()); - } - else - { - sil->Delete(); } } @@ -483,6 +526,8 @@ void vtkMEDReader::UpdateSIL(vtkInformation *info) */ std::string vtkMEDReader::BuildSIL(vtkMutableDirectedGraph* sil) { + if (!this->Internal) + return std::string(); sil->Initialize(); vtkSmartPointer childEdge(vtkSmartPointer::New()); childEdge->InsertNextValue(0); @@ -519,6 +564,9 @@ std::string vtkMEDReader::BuildSIL(vtkMutableDirectedGraph* sil) double vtkMEDReader::PublishTimeStepsIfNeeded(vtkInformation *outInfo, bool& isUpdated) { + if(!this->Internal) + return 0.0; + int lev0(-1); std::vector tsteps; if(!this->Internal->IsStdOrMode) @@ -541,6 +589,8 @@ double vtkMEDReader::PublishTimeStepsIfNeeded(vtkInformation *outInfo, bool& isU void vtkMEDReader::FillMultiBlockDataSetInstance(vtkMultiBlockDataSet *output, double reqTS) { + if( !this->Internal ) + return; std::string meshName; vtkDataSet *ret(this->Internal->Tree.buildVTKInstance(this->Internal->IsStdOrMode,reqTS,meshName,this->Internal->TK)); if(this->Internal->GenerateVect)