X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPlugins%2FMEDReader%2FIO%2FvtkExtractGroup.cxx;h=1db4ee4975a34415338d9e917fc951cafa492f14;hb=a833b1388f958c887b2b0886fc40a8be0256e2c8;hp=280e4d8837cca2e87c4eabf075225287b63e5995;hpb=9dbade0021c7a8e21aedcfb28be257886abed924;p=modules%2Fparavis.git diff --git a/src/Plugins/MEDReader/IO/vtkExtractGroup.cxx b/src/Plugins/MEDReader/IO/vtkExtractGroup.cxx index 280e4d88..1db4ee49 100644 --- a/src/Plugins/MEDReader/IO/vtkExtractGroup.cxx +++ b/src/Plugins/MEDReader/IO/vtkExtractGroup.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2010-2014 CEA/DEN, EDF R&D +// Copyright (C) 2010-2015 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 // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -52,14 +52,14 @@ #include "vtkDemandDrivenPipeline.h" #include "vtkDataObjectTreeIterator.h" #include "vtkThreshold.h" +#include "vtkMultiBlockDataGroupFilter.h" +#include "vtkCompositeDataToUnstructuredGridFilter.h" #include #include vtkStandardNewMacro(vtkExtractGroup); -vtkCxxSetObjectMacro(vtkExtractGroup, SIL, vtkMutableDirectedGraph); - /////////////////// class ExtractGroupStatus @@ -111,12 +111,14 @@ class vtkExtractGroup::vtkExtractGroupInternal public: void loadFrom(vtkMutableDirectedGraph *sil); int getNumberOfEntries() const; + const char *getMeshName() const; const char *getKeyOfEntry(int i) const; bool getStatusOfEntryStr(const char *entry) const; void setStatusOfEntryStr(const char *entry, bool status); void printMySelf(std::ostream& os) const; std::set getIdsToKeep() const; int getIdOfFamily(const std::string& famName) const; + static bool IsInformationOK(vtkInformation *info); private: std::map computeFamStrIdMap() const; const ExtractGroupStatus& getEntry(const char *entry) const; @@ -124,6 +126,7 @@ private: private: std::vector _groups; std::vector _fams; + std::string _mesh_name; }; const char ExtractGroupGrp::START[]="GRP_"; @@ -158,6 +161,32 @@ bool ExtractGroupGrp::isSameAs(const ExtractGroupGrp& other) const return false; } +bool vtkExtractGroup::vtkExtractGroupInternal::IsInformationOK(vtkInformation *info) +{ + if(!info->Has(vtkDataObject::SIL())) + return false; + vtkMutableDirectedGraph *sil(vtkMutableDirectedGraph::SafeDownCast(info->Get(vtkDataObject::SIL()))); + if(!sil) + return false; + int idNames(0); + vtkAbstractArray *verticesNames(sil->GetVertexData()->GetAbstractArray("Names",idNames)); + vtkStringArray *verticesNames2(vtkStringArray::SafeDownCast(verticesNames)); + if(!verticesNames2) + return false; + for(int i=0;iGetNumberOfValues();i++) + { + vtkStdString &st(verticesNames2->GetValue(i)); + if(st=="MeshesFamsGrps") + return true; + } + return false; +} + +const char *vtkExtractGroup::vtkExtractGroupInternal::getMeshName() const +{ + return this->_mesh_name.c_str(); +} + void vtkExtractGroup::vtkExtractGroupInternal::loadFrom(vtkMutableDirectedGraph *sil) { std::vector oldGrps(_groups); _groups.clear(); @@ -185,6 +214,7 @@ void vtkExtractGroup::vtkExtractGroupInternal::loadFrom(vtkMutableDirectedGraph { vtkIdType id1(it0->Next()); std::string meshName((const char *)verticesNames2->GetValue(id1)); + this->_mesh_name=meshName; vtkAdjacentVertexIterator *it1(vtkAdjacentVertexIterator::New()); sil->GetAdjacentVertices(id1,it1); vtkIdType idZeGrps(it1->Next());//zeGroups @@ -397,6 +427,7 @@ void vtkExtractGroup::SetInsideOut(int val) int vtkExtractGroup::RequestInformation(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) { + vtkUnstructuredGridAlgorithm::RequestInformation(request,inputVector,outputVector); try { //std::cerr << "########################################## vtkExtractGroup::RequestInformation ##########################################" << std::endl; @@ -406,7 +437,7 @@ int vtkExtractGroup::RequestInformation(vtkInformation *request, vtkInformationV vtkExecutive *exe(GetExecutive()); vtkAlgorithm *alg(this); vtkInformation *infoOnSIL(alg->GetOutputInformation(0)); - while(!infoOnSIL->Has(vtkDataObject::SIL()))// skipping vtkPVPostFilter + while(!vtkExtractGroup::vtkExtractGroupInternal::IsInformationOK(infoOnSIL))// skipping vtkPVPostFilter { if(exe->GetNumberOfInputConnections(0)<1) { @@ -431,15 +462,25 @@ int vtkExtractGroup::RequestInformation(vtkInformation *request, vtkInformationV return 1; } +/*! + * Do not use vtkCxxSetObjectMacro macro because input mdg comes from an already managed in the pipeline just a ref on it. + */ +void vtkExtractGroup::SetSIL(vtkMutableDirectedGraph *mdg) +{ + if(this->SIL==mdg) + return ; + this->SIL=mdg; +} + template -vtkDataSet *FilterFamilies(vtkDataSet *input, const std::set& idsToKeep, bool insideOut, const char *arrNameOfFamilyField, +vtkDataSet *FilterFamilies(vtkSmartPointer& thres, + vtkDataSet *input, const std::set& idsToKeep, bool insideOut, const char *arrNameOfFamilyField, const char *associationForThreshold, bool& catchAll, bool& catchSmth) { static const int VTK_DATA_ARRAY_DELETE=vtkDataArrayTemplate::VTK_DATA_ARRAY_DELETE; static const char ZE_SELECTION_ARR_NAME[]="@@ZeSelection@@"; vtkDataSet *output(input->NewInstance()); output->ShallowCopy(input); - vtkSmartPointer thres(vtkSmartPointer::New()); thres->SetInputData(output); vtkDataSetAttributes *dscIn(input->GetCellData()),*dscIn2(input->GetPointData()); vtkDataSetAttributes *dscOut(output->GetCellData()),*dscOut2(output->GetPointData()); @@ -528,7 +569,8 @@ int vtkExtractGroup::RequestData(vtkInformation *request, vtkInformationVector * std::set idsToKeep(this->Internal->getIdsToKeep()); // first shrink the input bool catchAll,catchSmth; - vtkDataSet *tryOnCell(FilterFamilies(input,idsToKeep,this->InsideOut, + vtkSmartPointer thres1(vtkSmartPointer::New()),thres2(vtkSmartPointer::New()); + vtkDataSet *tryOnCell(FilterFamilies(thres1,input,idsToKeep,this->InsideOut, MEDFileFieldRepresentationLeavesArrays::FAMILY_ID_CELL_NAME,"vtkDataObject::FIELD_ASSOCIATION_CELLS",catchAll,catchSmth)); if(tryOnCell) { @@ -542,13 +584,20 @@ int vtkExtractGroup::RequestData(vtkInformation *request, vtkInformationVector * { if(catchSmth) { - vtkDataSet *tryOnNode(FilterFamilies(tryOnCell,idsToKeep,this->InsideOut, + vtkDataSet *tryOnNode(FilterFamilies(thres2,input,idsToKeep,this->InsideOut, MEDFileFieldRepresentationLeavesArrays::FAMILY_ID_NODE_NAME,"vtkDataObject::FIELD_ASSOCIATION_POINTS",catchAll,catchSmth)); if(tryOnNode && catchSmth) { - output->ShallowCopy(tryOnNode); + vtkSmartPointer mb(vtkSmartPointer::New()); + vtkSmartPointer cd(vtkSmartPointer::New()); + mb->AddInputConnection(thres1->GetOutputPort()); + mb->AddInputConnection(thres2->GetOutputPort()); + cd->SetInputConnection(mb->GetOutputPort()); + cd->SetMergePoints(0); + cd->Update(); + output->ShallowCopy(cd->GetOutput()); tryOnCell->Delete(); - tryOnNode->Delete();// + tryOnNode->Delete(); return 1; } else @@ -562,7 +611,7 @@ int vtkExtractGroup::RequestData(vtkInformation *request, vtkInformationVector * } else { - vtkDataSet *tryOnNode(FilterFamilies(input,idsToKeep,this->InsideOut, + vtkDataSet *tryOnNode(FilterFamilies(thres1,input,idsToKeep,this->InsideOut, MEDFileFieldRepresentationLeavesArrays::FAMILY_ID_NODE_NAME,"vtkDataObject::FIELD_ASSOCIATION_POINTS",catchAll,catchSmth)); if(tryOnNode) { @@ -582,7 +631,7 @@ int vtkExtractGroup::RequestData(vtkInformation *request, vtkInformationVector * } else { - vtkDataSet *tryOnNode(FilterFamilies(tryOnCell,idsToKeep,this->InsideOut, + vtkDataSet *tryOnNode(FilterFamilies(thres1,input,idsToKeep,this->InsideOut, MEDFileFieldRepresentationLeavesArrays::FAMILY_ID_NODE_NAME,"vtkDataObject::FIELD_ASSOCIATION_POINTS",catchAll,catchSmth)); if(tryOnNode) { @@ -644,8 +693,15 @@ int vtkExtractGroup::GetGroupsFlagsArrayStatus(const char *name) void vtkExtractGroup::SetGroupsFlagsStatus(const char *name, int status) { //std::cerr << "vtkExtractGroup::SetFieldsStatus(" << name << "," << status << ")" << std::endl; + if (GetNumberOfGroupsFlagsArrays()<1) + return; this->Internal->setStatusOfEntryStr(name,(bool)status); if(std::string(name)==GetGroupsFlagsArrayName(GetNumberOfGroupsFlagsArrays()-1)) this->Modified(); //this->Internal->printMySelf(std::cerr); } + +const char *vtkExtractGroup::GetMeshName() +{ + return this->Internal->getMeshName(); +}