]> Creatis software - cpPlugins.git/blobdiff - lib/cpInstances/DataObjects/BoundingBox.cxx
yet another refactoring
[cpPlugins.git] / lib / cpInstances / DataObjects / BoundingBox.cxx
diff --git a/lib/cpInstances/DataObjects/BoundingBox.cxx b/lib/cpInstances/DataObjects/BoundingBox.cxx
new file mode 100644 (file)
index 0000000..ea05810
--- /dev/null
@@ -0,0 +1,93 @@
+#include <cpInstances/DataObjects/BoundingBox.h>
+#include <limits>
+#include <vtkDataSet.h>
+
+// -------------------------------------------------------------------------
+void cpInstances::DataObjects::BoundingBox::
+SetDataObject( DataObject* o )
+{
+  auto i = o->GetITK< itk::LightObject >( );
+  auto v = o->GetVTK< vtkObjectBase >( );
+  if( v != NULL )      this->SetVTK( v );
+  else if( i != NULL ) this->SetITK( i );
+  this->_UpdateVTK( );
+}
+
+// -------------------------------------------------------------------------
+void cpInstances::DataObjects::BoundingBox::
+Copy( Self* other )
+{
+  this->m_Points[ 0 ] = other->m_Points[ 0 ];
+  this->m_Points[ 1 ] = other->m_Points[ 1 ];
+  this->Modified( );
+}
+
+// -------------------------------------------------------------------------
+void cpInstances::DataObjects::BoundingBox::
+Blend( Self* other )
+{
+  if( this->m_Points[ 0 ].size( ) < other->m_Points[ 0 ].size( ) )
+    this->m_Points[ 0 ].resize(
+      other->m_Points[ 0 ].size( ),
+      std::numeric_limits< double >::max( )
+      );
+  if( this->m_Points[ 1 ].size( ) < other->m_Points[ 1 ].size( ) )
+    this->m_Points[ 1 ].resize(
+      other->m_Points[ 1 ].size( ),
+      -std::numeric_limits< double >::max( )
+      );
+  for( unsigned int d = 0; d < this->m_Points[ 0 ].size( ); ++d )
+    if( other->m_Points[ 0 ][ d ] < this->m_Points[ 0 ][ d ] )
+      this->m_Points[ 0 ][ d ] = other->m_Points[ 0 ][ d ];
+  for( unsigned int d = 0; d < this->m_Points[ 1 ].size( ); ++d )
+    if( other->m_Points[ 1 ][ d ] > this->m_Points[ 1 ][ d ] )
+      this->m_Points[ 1 ][ d ] = other->m_Points[ 1 ][ d ];
+  this->Modified( );
+  this->_UpdateVTK( );
+}
+
+// -------------------------------------------------------------------------
+cpInstances::DataObjects::BoundingBox::
+BoundingBox( )
+  : Superclass( )
+{
+  this->m_Points[ 0 ].push_back( double( 0 ) );
+  this->m_Points[ 1 ].push_back( double( 0 ) );
+  this->m_Outline = vtkSmartPointer< vtkOutlineSource >::New( );
+  this->_UpdateVTK( );
+}
+
+// -------------------------------------------------------------------------
+cpInstances::DataObjects::BoundingBox::
+~BoundingBox( )
+{
+}
+
+// -------------------------------------------------------------------------
+void cpInstances::DataObjects::BoundingBox::
+_UpdateVTK( )
+{
+  auto dobj = this->GetVTK< vtkDataSet >( );
+  if( dobj == NULL )
+    return;
+
+  // Get bounds
+  double bounds[ 6 ];
+  dobj->GetBounds( bounds );
+
+  this->m_Points[ 0 ].clear( );
+  this->m_Points[ 1 ].clear( );
+  this->m_Points[ 0 ].push_back( bounds[ 0 ] );
+  this->m_Points[ 0 ].push_back( bounds[ 2 ] );
+  this->m_Points[ 0 ].push_back( bounds[ 4 ] );
+  this->m_Points[ 1 ].push_back( bounds[ 1 ] );
+  this->m_Points[ 1 ].push_back( bounds[ 3 ] );
+  this->m_Points[ 1 ].push_back( bounds[ 5 ] );
+
+  // Update vtk objects
+  this->m_Outline->SetBounds( bounds );
+  this->m_Outline->Update( );
+  this->m_VTK = this->m_Outline->GetOutput( );
+}
+
+// eof - $RCSfile$