]> Creatis software - cpPlugins.git/blobdiff - lib/cpExtensions/Visualization/ImageOutlineSource.cxx
yet another refactoring
[cpPlugins.git] / lib / cpExtensions / Visualization / ImageOutlineSource.cxx
diff --git a/lib/cpExtensions/Visualization/ImageOutlineSource.cxx b/lib/cpExtensions/Visualization/ImageOutlineSource.cxx
new file mode 100644 (file)
index 0000000..8fa8131
--- /dev/null
@@ -0,0 +1,156 @@
+#include <cpExtensions/Visualization/ImageOutlineSource.h>
+#include <vtkInformation.h>
+#include <vtkInformationVector.h>
+
+// -------------------------------------------------------------------------
+cpExtensions::Visualization::ImageOutlineSource::
+Self* cpExtensions::Visualization::ImageOutlineSource::
+New( )
+{
+  return( new Self( ) );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::Visualization::ImageOutlineSource::
+SetBounds( int orientation, double step, double* bounds )
+{
+  // Update geometry
+  int o = orientation % 3;
+  if( o == 0 )
+  {
+    this->m_Bounds[ 0 ][ 0 ] = step;
+    this->m_Bounds[ 0 ][ 1 ] = bounds[ 2 ];
+    this->m_Bounds[ 0 ][ 2 ] = bounds[ 4 ];
+
+    this->m_Bounds[ 1 ][ 0 ] = step;
+    this->m_Bounds[ 1 ][ 1 ] = bounds[ 2 ];
+    this->m_Bounds[ 1 ][ 2 ] = bounds[ 5 ];
+
+    this->m_Bounds[ 2 ][ 0 ] = step;
+    this->m_Bounds[ 2 ][ 1 ] = bounds[ 3 ];
+    this->m_Bounds[ 2 ][ 2 ] = bounds[ 5 ];
+
+    this->m_Bounds[ 3 ][ 0 ] = step;
+    this->m_Bounds[ 3 ][ 1 ] = bounds[ 3 ];
+    this->m_Bounds[ 3 ][ 2 ] = bounds[ 4 ];
+  }
+  else if( o == 1 )
+  {
+    this->m_Bounds[ 0 ][ 0 ] = bounds[ 0 ];
+    this->m_Bounds[ 0 ][ 1 ] = step;
+    this->m_Bounds[ 0 ][ 2 ] = bounds[ 4 ];
+
+    this->m_Bounds[ 1 ][ 0 ] = bounds[ 1 ];
+    this->m_Bounds[ 1 ][ 1 ] = step;
+    this->m_Bounds[ 1 ][ 2 ] = bounds[ 4 ];
+
+    this->m_Bounds[ 2 ][ 0 ] = bounds[ 1 ];
+    this->m_Bounds[ 2 ][ 1 ] = step;
+    this->m_Bounds[ 2 ][ 2 ] = bounds[ 5 ];
+
+    this->m_Bounds[ 3 ][ 0 ] = bounds[ 0 ];
+    this->m_Bounds[ 3 ][ 1 ] = step;
+    this->m_Bounds[ 3 ][ 2 ] = bounds[ 5 ];
+  }
+  else if( o == 2 )
+  {
+    this->m_Bounds[ 0 ][ 0 ] = bounds[ 0 ];
+    this->m_Bounds[ 0 ][ 1 ] = bounds[ 2 ];
+    this->m_Bounds[ 0 ][ 2 ] = step;
+
+    this->m_Bounds[ 1 ][ 0 ] = bounds[ 1 ];
+    this->m_Bounds[ 1 ][ 1 ] = bounds[ 2 ];
+    this->m_Bounds[ 1 ][ 2 ] = step;
+
+    this->m_Bounds[ 2 ][ 0 ] = bounds[ 1 ];
+    this->m_Bounds[ 2 ][ 1 ] = bounds[ 3 ];
+    this->m_Bounds[ 2 ][ 2 ] = step;
+
+    this->m_Bounds[ 3 ][ 0 ] = bounds[ 0 ];
+    this->m_Bounds[ 3 ][ 1 ] = bounds[ 3 ];
+    this->m_Bounds[ 3 ][ 2 ] = step;
+
+  } // fi
+  this->Modified( );
+}
+
+// -------------------------------------------------------------------------
+cpExtensions::Visualization::ImageOutlineSource::
+ImageOutlineSource( )
+  : Superclass( )
+{
+  this->SetNumberOfInputPorts( 0 );
+  for( unsigned int j = 0; j < 4; ++j )
+    for( unsigned int i = 0; i < 3; ++i )
+      this->m_Bounds[ j ][ i ] = double( 0 );
+}
+
+// -------------------------------------------------------------------------
+cpExtensions::Visualization::ImageOutlineSource::
+~ImageOutlineSource( )
+{
+}
+
+// -------------------------------------------------------------------------
+int cpExtensions::Visualization::ImageOutlineSource::
+RequestData(
+  vtkInformation* request,
+  vtkInformationVector** inputVector,
+  vtkInformationVector* outputVector
+  )
+{
+  // Get output object
+  vtkInformation* outInfo = outputVector->GetInformationObject( 0 );
+  vtkPolyData* output =
+    vtkPolyData::SafeDownCast(
+      outInfo->Get( vtkDataObject::DATA_OBJECT( ) )
+      );
+
+  // Create points
+  vtkPoints* points = vtkPoints::New( );
+  points->SetDataType( VTK_FLOAT );
+  points->Allocate( 4 );
+
+  // Create lines
+  vtkCellArray* verts = vtkCellArray::New( );
+  vtkCellArray* lines = vtkCellArray::New( );
+  vtkCellArray* faces = vtkCellArray::New( );
+  vtkCellArray* strips = vtkCellArray::New( );
+  lines->Allocate( lines->EstimateSize( 4, 2 ) );
+
+  // Assign points
+  points->InsertPoint( 0, this->m_Bounds[ 0 ] );
+  points->InsertPoint( 1, this->m_Bounds[ 1 ] );
+  points->InsertPoint( 2, this->m_Bounds[ 2 ] );
+  points->InsertPoint( 3, this->m_Bounds[ 3 ] );
+
+  // Assign cells
+  vtkIdType cell_pts[ 4 ][ 2 ] =
+  {
+    { 0, 1 },
+    { 1, 2 },
+    { 2, 3 },
+    { 3, 0 }
+  };
+  lines->InsertNextCell( 2, cell_pts[ 0 ] );
+  lines->InsertNextCell( 2, cell_pts[ 1 ] );
+  lines->InsertNextCell( 2, cell_pts[ 2 ] );
+  lines->InsertNextCell( 2, cell_pts[ 3 ] );
+
+  // Assign to output
+  output->SetPoints( points );
+  output->SetVerts( verts );
+  output->SetLines( lines );
+  output->SetPolys( faces );
+  output->SetStrips( strips );
+
+  // Finish and return
+  points->Delete( );
+  verts->Delete( );
+  lines->Delete( );
+  faces->Delete( );
+  strips->Delete( );
+  return( 1 );
+}
+
+// eof - $RCSfile$