X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FVTKViewer%2FVTKViewer_ExtractUnstructuredGrid.cxx;h=428eaf73f628fce86afadfe782b4b260e6281054;hb=fd22340460025ea5a2b068a75787c8666324238b;hp=bfd35ef60b579904c79cc158adea9e0413494c60;hpb=034a705024b224972c148e1e3834c5ee38df184b;p=modules%2Fgui.git diff --git a/src/VTKViewer/VTKViewer_ExtractUnstructuredGrid.cxx b/src/VTKViewer/VTKViewer_ExtractUnstructuredGrid.cxx old mode 100755 new mode 100644 index bfd35ef60..428eaf73f --- a/src/VTKViewer/VTKViewer_ExtractUnstructuredGrid.cxx +++ b/src/VTKViewer/VTKViewer_ExtractUnstructuredGrid.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -51,36 +51,39 @@ vtkStandardNewMacro(VTKViewer_ExtractUnstructuredGrid); VTKViewer_ExtractUnstructuredGrid::VTKViewer_ExtractUnstructuredGrid(): - myExtractionMode(eCells), myChangeMode(ePassAll) + myExtractionMode(eCells), myChangeMode(ePassAll), myStoreMapping( false ), myPassAll( false ) {} -VTKViewer_ExtractUnstructuredGrid::~VTKViewer_ExtractUnstructuredGrid(){} - +VTKViewer_ExtractUnstructuredGrid::~VTKViewer_ExtractUnstructuredGrid() +{} -void VTKViewer_ExtractUnstructuredGrid::RegisterCell(vtkIdType theCellId){ -// if(0 && MYDEBUG) MESSAGE("RegisterCell - theCellId = "<Modified(); +void VTKViewer_ExtractUnstructuredGrid::SetStoreMapping(int theStoreMapping) +{ + if ( myStoreMapping != ( theStoreMapping != 0 )) + { + myStoreMapping = theStoreMapping != 0; + Modified(); + } } vtkIdType VTKViewer_ExtractUnstructuredGrid::GetInputId(int theOutId) const { - if ( myCellIds.empty() && myCellTypes.empty() ) + if ( myPassAll || ( myCellIds.empty() && myCellTypes.empty() )) return theOutId; if ( theOutId<0 || theOutId >= (int)myOut2InId.size() ) @@ -88,76 +91,252 @@ vtkIdType VTKViewer_ExtractUnstructuredGrid::GetInputId(int theOutId) const return myOut2InId[theOutId]; } -vtkIdType VTKViewer_ExtractUnstructuredGrid::GetOutputId(int theInId) const{ - if(myCellIds.empty() && myCellTypes.empty()) return theInId; - TMapId::const_iterator anIter = myIn2OutId.find(theInId); - if(anIter == myIn2OutId.end()) return -1; - return anIter->second; +void VTKViewer_ExtractUnstructuredGrid::BuildOut2InMap() +{ + if ( myPassAll || !myOut2InId.empty() ) return; + + vtkUnstructuredGrid *anInput = dynamic_cast< vtkUnstructuredGrid*>( this->GetInput() ); + if ( !anInput ) return; + + // use a vector of cellTypes to avoid searching in myCellTypes map + // for a better performance (IPAL53103) + TVectorId cellTypesVec( VTK_NUMBER_OF_CELL_TYPES, -1 ); + for ( TSetId::iterator type = myCellTypes.begin(); type != myCellTypes.end(); ++type ) + { + if ( *type >= (int)cellTypesVec.size() ) cellTypesVec.resize( *type+1, -1 ); + if ( *type > 0 ) + cellTypesVec[ *type ] = *type; + } + + // same code as in RequestData() excluding cells copying + vtkIdType aNbElems = 0; + if ( myExtractionMode == eCells ) + { + aNbElems = anInput->GetNumberOfCells(); + if (( myChangeMode == ePassAll ) || + ( myCellIds.empty() && myCellTypes.empty() && myChangeMode == eRemoving)) + { + myPassAll = true; + } + else + { + if ( !myCellIds.empty() && myCellTypes.empty() ) + { + if ( myChangeMode == eAdding ) + { + myOut2InId.reserve(myCellIds.size()); + + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + if ( myCellIds.find(aCellId) != myCellIds.end() ) + myOut2InId.push_back( aCellId ); + } + else + { + myOut2InId.reserve( std::max( vtkIdType(0), vtkIdType(aNbElems - myCellIds.size()))); + + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + if ( myCellIds.find(aCellId) == myCellIds.end() ) + myOut2InId.push_back( aCellId ); + } + } + else if ( myCellIds.empty() && !myCellTypes.empty() ) + { + myOut2InId.reserve( aNbElems ); + if ( myChangeMode == eAdding ) + { + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + { + vtkIdType aType = anInput->GetCellType(aCellId); + if ( cellTypesVec[ aType ] == aType ) + myOut2InId.push_back( aCellId ); + } + } + else + { + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + { + vtkIdType aType = anInput->GetCellType(aCellId); + if ( cellTypesVec[ aType ] != aType ) + myOut2InId.push_back( aCellId ); + } + } + } + else if ( !myCellIds.empty() && !myCellTypes.empty()) + { + myOut2InId.reserve( aNbElems ); + + if ( myChangeMode == eAdding ) + { + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + { + vtkIdType aType = anInput->GetCellType(aCellId); + if ( cellTypesVec[ aType ] == aType ) + if ( myCellIds.find(aCellId) != myCellIds.end() ) + myOut2InId.push_back( aCellId ); + } + } + else + { + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + { + vtkIdType aType = anInput->GetCellType(aCellId); + if ( cellTypesVec[ aType ] != aType ) + if ( myCellIds.find(aCellId) == myCellIds.end()) + myOut2InId.push_back( aCellId ); + } + } + } + } // not ePassAll + } + else // nodes + { + aNbElems = anInput->GetNumberOfPoints(); + + if (( myChangeMode == ePassAll ) || + ( myCellIds.empty() && myCellTypes.empty() && myChangeMode == eRemoving) || + ( !anInput->GetCellTypesArray() )) + { + myPassAll = true; + } + else if ( !myCellIds.empty() && myCellTypes.empty()) + { + if ( myChangeMode == eAdding ) + { + myOut2InId.reserve( myCellIds.size() ); + + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + if ( myCellIds.find(aCellId) != myCellIds.end()) + myOut2InId.push_back( aCellId ); + } + else + { + myOut2InId.reserve( std::max( vtkIdType(0), vtkIdType(aNbElems - myCellIds.size()))); + + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + if ( myCellIds.find(aCellId) == myCellIds.end()) + myOut2InId.push_back( aCellId ); + } + } + else if ( myCellIds.empty() && !myCellTypes.empty()) + { + myOut2InId.reserve( aNbElems ); + + if ( myChangeMode == eAdding ) + { + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + { + vtkIdType aType = anInput->GetCellType(aCellId); + if ( cellTypesVec[ aType ] == aType ) + myOut2InId.push_back( aCellId ); + } + } + else + { + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + { + vtkIdType aType = anInput->GetCellType(aCellId); + if ( cellTypesVec[ aType ] != aType ) + myOut2InId.push_back( aCellId ); + } + } + } + else if ( !myCellIds.empty() && !myCellTypes.empty() ) + { + if ( myChangeMode == eAdding ) + { + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + { + vtkIdType aType = anInput->GetCellType(aCellId); + if ( cellTypesVec[ aType ] == aType ) + if ( myCellIds.find(aCellId) != myCellIds.end()) + myOut2InId.push_back( aCellId ); + } + } + else + { + for(vtkIdType aCellId = 0, anOutId = 0; aCellId < aNbElems; aCellId++,anOutId++) + { + vtkIdType aType = anInput->GetCellType(aCellId); + if ( cellTypesVec[ aType ] != aType ) + if ( myCellIds.find(aCellId) == myCellIds.end()) + myOut2InId.push_back( aCellId ); + } + } + } + } // nodes + + if ((vtkIdType) myOut2InId.size() == aNbElems ) + { + myPassAll = true; + TVectorId().swap( myOut2InId ); + } + return; } +// vtkIdType VTKViewer_ExtractUnstructuredGrid::GetOutputId(int theInId) const{ +// if(myCellIds.empty() && myCellTypes.empty()) return theInId; +// TMapId::const_iterator anIter = myIn2OutId.find(theInId); +// if(anIter == myIn2OutId.end()) return -1; +// return anIter->second; +// } + inline int InsertCell(vtkUnstructuredGrid *theInput, - vtkCellArray *theConnectivity, - vtkUnsignedCharArray* theCellTypesArray, - vtkIdTypeArray*& theFaces, - vtkIdTypeArray*& theFaceLocations, - vtkIdType theCellId, - vtkIdList *theIdList, - bool theStoreMapping, - vtkIdType theOutId, - VTKViewer_ExtractUnstructuredGrid::TVectorId& theOut2InId, - VTKViewer_ExtractUnstructuredGrid::TMapId& theIn2OutId) + vtkCellArray *theConnectivity, + vtkUnsignedCharArray* theCellTypesArray, + vtkIdTypeArray*& theFaces, + vtkIdTypeArray*& theFaceLocations, + vtkIdType theCellId, + vtkIdList *theIdList, + bool theStoreMapping, + vtkIdType theOutId, + VTKViewer_ExtractUnstructuredGrid::TVectorId& theOut2InId/*, + VTKViewer_ExtractUnstructuredGrid::TMapId& theIn2OutId*/) { - vtkCell *aCell = theInput->GetCell(theCellId); - vtkIdList *aPntIds = aCell->GetPointIds(); - vtkIdType aNbIds = aPntIds->GetNumberOfIds(); - vtkIdType aCellId = -1; - theIdList->SetNumberOfIds(aNbIds); - for(vtkIdType i = 0; i < aNbIds; i++){ - theIdList->SetId(i,aPntIds->GetId(i)); - } + vtkCell *aCell = theInput->GetCell(theCellId); vtkIdType aCellType = aCell->GetCellType(); + vtkIdType aCellId = -1; #if VTK_XVERSION > 50700 if (aCellType != VTK_POLYHEDRON) - { + { #endif - aCellId = theConnectivity->InsertNextCell(theIdList); - if (theFaceLocations) - theFaceLocations->InsertNextValue(-1); + aCellId = theConnectivity->InsertNextCell( aCell->GetPointIds() ); //theIdList); + if (theFaceLocations) + theFaceLocations->InsertNextValue(-1); #if VTK_XVERSION > 50700 - } + } else + { + //MESSAGE("InsertCell type VTK_POLYHEDRON " << theStoreMapping); + if (!theFaces) { - //MESSAGE("InsertCell type VTK_POLYHEDRON " << theStoreMapping); - if (!theFaces) - { - theFaces = vtkIdTypeArray::New(); - theFaces->Allocate(theCellTypesArray->GetSize()); - theFaceLocations = vtkIdTypeArray::New(); - theFaceLocations->Allocate(theCellTypesArray->GetSize()); - // FaceLocations must be padded until the current position - for (vtkIdType i = 0; i <= theCellTypesArray->GetMaxId(); i++) - { - theFaceLocations->InsertNextValue(-1); - } - } - // insert face location - theFaceLocations->InsertNextValue(theFaces->GetMaxId() + 1); - - // insert cell connectivity and faces stream - vtkIdType nfaces; - vtkIdType* face; - vtkIdType realnpts; - theInput->GetFaceStream(theCellId, nfaces, face); - vtkUnstructuredGrid::DecomposeAPolyhedronCell( - nfaces, face, realnpts, theConnectivity, theFaces); + theFaces = vtkIdTypeArray::New(); + theFaces->Allocate(theCellTypesArray->GetSize()); + theFaceLocations = vtkIdTypeArray::New(); + theFaceLocations->Allocate(theCellTypesArray->GetSize()); + // FaceLocations must be padded until the current position + for (vtkIdType i = 0; i <= theCellTypesArray->GetMaxId(); i++) + { + theFaceLocations->InsertNextValue(-1); + } } + // insert face location + theFaceLocations->InsertNextValue(theFaces->GetMaxId() + 1); + + // insert cell connectivity and faces stream + vtkIdType nfaces = 0; + vtkIdType* face = 0; + vtkIdType realnpts; + theInput->GetFaceStream(theCellId, nfaces, face); + vtkUnstructuredGrid::DecomposeAPolyhedronCell( + nfaces, face, realnpts, theConnectivity, theFaces); + } #endif - vtkIdType anID = theCellTypesArray->InsertNextValue(aCellType); + /*vtkIdType anID = */theCellTypesArray->InsertNextValue(aCellType); if(theStoreMapping){ - theOut2InId.push_back(theCellId); - theIn2OutId[theCellId] = theOutId; + theOut2InId.push_back( theCellId ); + //theIn2OutId.insert( theIn2OutId.end(), std::make_pair( theCellId, theOutId )); } return aCellId; } @@ -168,15 +347,15 @@ inline void InsertPointCell(vtkCellArray *theConnectivity, vtkIdList *theIdList, bool theStoreMapping, vtkIdType theOutId, - VTKViewer_ExtractUnstructuredGrid::TVectorId& theOut2InId, - VTKViewer_ExtractUnstructuredGrid::TMapId& theIn2OutId) + VTKViewer_ExtractUnstructuredGrid::TVectorId& theOut2InId/*, + VTKViewer_ExtractUnstructuredGrid::TMapId& theIn2OutId*/) { theIdList->SetId(0,theCellId); theConnectivity->InsertNextCell(theIdList); theCellTypesArray->InsertNextValue(VTK_VERTEX); if(theStoreMapping){ theOut2InId.push_back(theCellId); - theIn2OutId[theCellId] = theOutId; + //theIn2OutId.insert( theIn2OutId.end(), std::make_pair( theCellId, theOutId )); } } @@ -190,15 +369,26 @@ int VTKViewer_ExtractUnstructuredGrid::RequestData(vtkInformation *vtkNotUsed(re vtkInformation *outInfo = outputVector->GetInformationObject(0); // get the input and ouptut - vtkUnstructuredGrid *anInput = vtkUnstructuredGrid::SafeDownCast( - inInfo->Get(vtkDataObject::DATA_OBJECT())); - vtkUnstructuredGrid *anOutput = vtkUnstructuredGrid::SafeDownCast( - outInfo->Get(vtkDataObject::DATA_OBJECT())); + vtkUnstructuredGrid *anInput = + vtkUnstructuredGrid::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); + vtkUnstructuredGrid *anOutput = + vtkUnstructuredGrid::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT())); //vtkUnstructuredGrid *anInput = this->GetInput(); //vtkUnstructuredGrid *anOutput = this->GetOutput(); - - myOut2InId.clear(); myIn2OutId.clear(); + + myPassAll = false; + TVectorId().swap( myOut2InId ); + + // use a vector of cellTypes to avoid searching in myCellTypes map + // for a better performance (IPAL53103) + TVectorId cellTypesVec( VTK_NUMBER_OF_CELL_TYPES, -1 ); + for ( TSetId::iterator type = myCellTypes.begin(); type != myCellTypes.end(); ++type ) + { + if ( *type >= (int)cellTypesVec.size() ) cellTypesVec.resize( *type+1, -1 ); + if ( *type > 0 ) + cellTypesVec[ *type ] = *type; + } /* if(MYDEBUG){ MESSAGE("Execute - anInput->GetNumberOfCells() = "<GetNumberOfCells()); @@ -207,22 +397,25 @@ int VTKViewer_ExtractUnstructuredGrid::RequestData(vtkInformation *vtkNotUsed(re MESSAGE("Execute - myExtractionMode = "<GetNumberOfCells() = "<GetNumberOfCells()); if(myStoreMapping){