34 #ifndef CARTODATA_IO_VOLUMEFORMATWRITER_D_H 
   35 #define CARTODATA_IO_VOLUMEFORMATWRITER_D_H 
   55 #define localMsg( message ) cartoCondMsg( 4, message, "VOLUMEFORMATWRITER" )
 
   94     localMsg( 
"writing: " + dsi->url() );
 
   96     localMsg( 
"checking for memory mapping..." );
 
  101     localMsg( 
"reading resolution level..." );
 
  103     if( options->hasProperty( 
"resolution_level" ) ) {
 
  104       options->getProperty( 
"resolution_level", level );
 
  108           level += dsi->header()->getProperty( 
"resolutions_dimension" )
 
  117     localMsg( 
"checking for partial writing..." );
 
  118     bool partial = 
false;
 
  119     if( options->hasProperty( 
"partial_writing" ) )
 
  123       localMsg( 
" -> partial writing enabled." );
 
  126     size_t dim, ndim = obj.
getSize().size();
 
  127     std::vector<int> position( ndim, 0 );
 
  128     std::vector<int> view( ndim, 0 );
 
  129     std::vector<int> size( ndim, 1 );
 
  132     localMsg( 
"checking if object is a view..." );
 
  138     localMsg( std::string(
"object ") + ( parent1 ? 
"is" : 
"isn't" ) + 
" a view and " 
  143       localMsg( std::string(
"parent1 exists and ")
 
  149       localMsg( std::string(
"parent2 exists and ")
 
  159     localMsg( 
"reading full volume size and view position..." );
 
  164     } 
else if( parent2 ) {
 
  169       if( position.size() < rndim )
 
  170         position.resize( rndim, 0 );
 
  171       for( i=0; i<rndim; ++i )
 
  180       localMsg( 
" -> from self (no partial writing)" )
 
  182       position = std::vector<int>( ndim, 0 );
 
  185     localMsg( 
" -> Full volume size : ( " 
  202     localMsg( 
"checking for borders..." );
 
  203     bool withborders = 
false;
 
  206     localMsg( std::string(
" -> ") + ( withborders ? 
"with borders" : 
"without borders" ) );
 
  207     withborders = withborders; 
 
  214       options->setProperty( 
"unallocated", 
true );
 
  218       dsi->header()->copyProperties(
 
  221     dsi->header()->setProperty( 
"volume_dimension", size );
 
  222     dsi->header()->setProperty( 
"sizeX", size[ 0 ] );
 
  223     dsi->header()->setProperty( 
"sizeY", size[ 1 ] );
 
  224     dsi->header()->setProperty( 
"sizeZ", size[ 2 ] );
 
  225     dsi->header()->setProperty( 
"sizeT", size[ 3 ] );
 
  226     if( !dsi->header()->hasProperty( 
"voxel_size" ) )
 
  228       std::vector<float> voxel_size( 4, 1. );
 
  229       dsi->header()->setProperty( 
"voxel_size", voxel_size );
 
  236         position[0] = (int) rint( options->getProperty( 
"ox" )->getScalar() );
 
  240         position[1] = (int) rint( options->getProperty( 
"oy" )->getScalar() );
 
  244         position[2] = (int) rint( options->getProperty( 
"oz" )->getScalar() );
 
  249         position[3] = (int) rint( options->getProperty( 
"ot" )->getScalar() );
 
  254       for( dim=0; dim<carto::Volume<T>::DIM_MAX; ++dim )
 
  258           std::stringstream skey;
 
  259           skey << 
"ox" << dim+1;
 
  260           std::string key = skey.str();
 
  261           value = (int) rint( options->getProperty( key )->getScalar() );
 
  262           options->removeProperty( key );
 
  263           while( position.size() <= dim )
 
  264             position.push_back( 0 );
 
  265           position[ dim ] = value;
 
  274     std::vector<long> strides( ndim );
 
  275     for( dim=0; dim<ndim; ++dim )
 
  277       std::vector<int> pos( ndim, 0 );
 
  279       strides[dim] = &obj( pos ) - &obj(0,0,0,0);
 
  282     this->filterProperties(dsi->header(), options);
 
  285     *dsi = _imw->writeHeader( *dsi, (T*) &obj(0,0,0,0), position, view,
 
  293       std::vector<int> file_sz( ndim, 1 );
 
  294       if( !dsi->header()->getProperty( 
"volume_dimension", file_sz ) )
 
  296         dsi->header()->getProperty( 
"sizeX", file_sz[0] );
 
  297         dsi->header()->getProperty( 
"sizeY", file_sz[1] );
 
  298         dsi->header()->getProperty( 
"sizeZ", file_sz[2] );
 
  299         dsi->header()->getProperty( 
"sizeT", file_sz[3] );
 
  301       for( dim=0; dim<ndim; ++dim  )
 
  303         if( file_sz.size() <= dim )
 
  304           file_sz.push_back( 1 );
 
  305           if( position[dim] + view[dim] > file_sz[dim] )
 
  307           localMsg( 
"view is larger than the volume." );
 
  317       data = 
reinterpret_cast<const T*
>( &obj(0,0,0,0) );
 
  319     _imw->write( data, *dsi, position, view, strides, options );
 
  349   template <
typename T>
 
  359   template <
typename T>
 
  364   template <
typename T>
 
  375   template <
typename T>
 
  382     return vfw.
write( *obj, dsi, options );
 
  385   template <
typename T>
 
Object reference(Object &value)
std::vector< int > getSize() const
get the 4 dimensions in a vector
Convenient handle for a Volume - this is normally the entry point for all volumes handling.
const AllocatorContext & allocatorContext() const
returns volume's AllocatorContext
const Position & posInRefVolume() const
Get position in parent volume.
rc_ptr< Volume< T > > refVolume() const
Get parent volume.
MappingMode allocatorType() const
static void filter(carto::Object header, carto::Object options=carto::none())
std::string toString(const T &object)