X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_ExtractGeometry.cxx;h=d966097193c7b73f5f2a8e69c3b2bbf45cef1363;hp=002ab02f3c6726820bb27ac190bebfab16c2c974;hb=59627b07d70f4caa4c768be6805334d2610fa54c;hpb=bd8f1aee7c78f7d2eb82bd4fec5e08c9e3d280ce diff --git a/src/OBJECT/SMESH_ExtractGeometry.cxx b/src/OBJECT/SMESH_ExtractGeometry.cxx index 002ab02f3..d96609719 100644 --- a/src/OBJECT/SMESH_ExtractGeometry.cxx +++ b/src/OBJECT/SMESH_ExtractGeometry.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 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 @@ -6,7 +6,7 @@ // 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 @@ -55,35 +55,36 @@ SMESH_ExtractGeometry::SMESH_ExtractGeometry() {} -SMESH_ExtractGeometry::~SMESH_ExtractGeometry(){} - +SMESH_ExtractGeometry::~SMESH_ExtractGeometry() +{} -vtkIdType SMESH_ExtractGeometry::GetElemObjId(int theVtkID){ - if( theVtkID < 0 || theVtkID >= myElemVTK2ObjIds.size()) return -1; +vtkIdType SMESH_ExtractGeometry::GetElemObjId(int theVtkID) +{ + if( theVtkID < 0 || theVtkID >= (int)myElemVTK2ObjIds.size()) return -1; return myElemVTK2ObjIds[theVtkID]; } -vtkIdType SMESH_ExtractGeometry::GetNodeObjId(int theVtkID){ - if ( theVtkID < 0 || theVtkID >= myNodeVTK2ObjIds.size()) return -1; +vtkIdType SMESH_ExtractGeometry::GetNodeObjId(int theVtkID) +{ + if ( theVtkID < 0 || theVtkID >= (int)myNodeVTK2ObjIds.size()) return -1; return myNodeVTK2ObjIds[theVtkID]; } -int SMESH_ExtractGeometry::RequestData( - vtkInformation *vtkNotUsed(request), - vtkInformationVector **inputVector, - vtkInformationVector *outputVector) +int SMESH_ExtractGeometry::RequestData(vtkInformation *vtkNotUsed(request), + vtkInformationVector **inputVector, + vtkInformationVector *outputVector) { // get the info objects vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); vtkInformation *outInfo = outputVector->GetInformationObject(0); // get the input and ouptut - vtkDataSet *input = vtkDataSet::SafeDownCast( - inInfo->Get(vtkDataObject::DATA_OBJECT())); - vtkUnstructuredGrid *output = vtkUnstructuredGrid::SafeDownCast( - outInfo->Get(vtkDataObject::DATA_OBJECT())); + vtkDataSet *input = + vtkDataSet::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); + vtkUnstructuredGrid *output = + vtkUnstructuredGrid::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT())); vtkIdType ptId, numPts, numCells, i, cellId, newCellId, newId, *pointMap; vtkIdList *cellPts; @@ -100,35 +101,35 @@ int SMESH_ExtractGeometry::RequestData( int npts; numCells = input->GetNumberOfCells(); numPts = input->GetNumberOfPoints(); - + vtkDebugMacro(<< "Extracting geometry"); if ( ! this->ImplicitFunction ) - { + { vtkErrorMacro(<<"No implicit function specified"); return 0; - } + } newCellPts = vtkIdList::New(); newCellPts->Allocate(VTK_CELL_SIZE); if ( this->ExtractInside ) - { + { multiplier = 1.0; - } - else - { + } + else + { multiplier = -1.0; - } + } // Loop over all points determining whether they are inside the // implicit function. Copy the points and point data if they are. // pointMap = new vtkIdType[numPts]; // maps old point ids into new for (i=0; i < numPts; i++) - { + { pointMap[i] = -1; - } + } output->Allocate(numCells/4); //allocate storage for geometry/topology newPts = vtkPoints::New(); @@ -136,7 +137,7 @@ int SMESH_ExtractGeometry::RequestData( outputPD->CopyAllocate(pd); outputCD->CopyAllocate(cd); vtkFloatArray *newScalars = NULL; - + if(myStoreMapping){ myElemVTK2ObjIds.clear(); myElemVTK2ObjIds.reserve(numCells); @@ -145,110 +146,110 @@ int SMESH_ExtractGeometry::RequestData( } if ( ! this->ExtractBoundaryCells ) - { + { for ( ptId=0; ptId < numPts; ptId++ ) - { + { x = input->GetPoint(ptId); if ( (this->ImplicitFunction->FunctionValue(x)*multiplier) < 0.0 ) - { + { newId = newPts->InsertNextPoint(x); pointMap[ptId] = newId; myNodeVTK2ObjIds.push_back(ptId); outputPD->CopyData(pd,ptId,newId); - } } } + } else - { + { // To extract boundary cells, we have to create supplemental information if ( this->ExtractBoundaryCells ) - { + { double val; newScalars = vtkFloatArray::New(); newScalars->SetNumberOfValues(numPts); for (ptId=0; ptId < numPts; ptId++ ) - { + { x = input->GetPoint(ptId); val = this->ImplicitFunction->FunctionValue(x) * multiplier; newScalars->SetValue(ptId, val); if ( val < 0.0 ) - { + { newId = newPts->InsertNextPoint(x); pointMap[ptId] = newId; myNodeVTK2ObjIds.push_back(ptId); outputPD->CopyData(pd,ptId,newId); - } } } } + } // Now loop over all cells to see whether they are inside implicit // function (or on boundary if ExtractBoundaryCells is on). // for (cellId=0; cellId < numCells; cellId++) - { + { cell = input->GetCell(cellId); cellPts = cell->GetPointIds(); numCellPts = cell->GetNumberOfPoints(); newCellPts->Reset(); if ( ! this->ExtractBoundaryCells ) //requires less work - { + { for ( npts=0, i=0; i < numCellPts; i++, npts++) - { + { ptId = cellPts->GetId(i); if ( pointMap[ptId] < 0 ) - { + { break; //this cell won't be inserted - } + } else - { + { newCellPts->InsertId(i,pointMap[ptId]); - } } - } //if don't want to extract boundary cells - + } + } //if don't want to extract boundary cells + else //want boundary cells - { + { for ( npts=0, i=0; i < numCellPts; i++ ) - { + { ptId = cellPts->GetId(i); if ( newScalars->GetValue(ptId) <= 0.0 ) - { + { npts++; - } } + } if ( npts > 0 ) - { + { for ( i=0; i < numCellPts; i++ ) - { + { ptId = cellPts->GetId(i); if ( pointMap[ptId] < 0 ) - { + { x = input->GetPoint(ptId); newId = newPts->InsertNextPoint(x); pointMap[ptId] = newId; myNodeVTK2ObjIds.push_back(ptId); outputPD->CopyData(pd,ptId,newId); - } - newCellPts->InsertId(i,pointMap[ptId]); } - }//a boundary or interior cell - }//if mapping boundary cells - - if ( npts >= numCellPts || (this->ExtractBoundaryCells && npts > 0) ) - { - if(cell->GetCellType() == VTK_POLYHEDRON) { - newCellPts->Reset(); - vtkUnstructuredGrid::SafeDownCast(input)->GetFaceStream( cellId ,newCellPts ); - vtkUnstructuredGrid::ConvertFaceStreamPointIds(newCellPts, pointMap); + newCellPts->InsertId(i,pointMap[ptId]); } - newCellId = output->InsertNextCell(cell->GetCellType(),newCellPts); - myElemVTK2ObjIds.push_back(cellId); - outputCD->CopyData(cd,cellId,newCellId); + }//a boundary or interior cell + }//if mapping boundary cells + + if ( npts >= numCellPts || (this->ExtractBoundaryCells && npts > 0) ) + { + if(cell->GetCellType() == VTK_POLYHEDRON) { + newCellPts->Reset(); + vtkUnstructuredGrid::SafeDownCast(input)->GetFaceStream( cellId ,newCellPts ); + vtkUnstructuredGrid::ConvertFaceStreamPointIds(newCellPts, pointMap); } - }//for all cells + newCellId = output->InsertNextCell(cell->GetCellType(),newCellPts); + myElemVTK2ObjIds.push_back(cellId); + outputCD->CopyData(cd,cellId,newCellId); + } + }//for all cells // Update ourselves and release memory // @@ -256,11 +257,11 @@ int SMESH_ExtractGeometry::RequestData( newCellPts->Delete(); output->SetPoints(newPts); newPts->Delete(); - + if ( this->ExtractBoundaryCells ) - { + { newScalars->Delete(); - } + } output->Squeeze(); return 1;