示例#1
0
Geostat_grid* Csv_grid_infilter::read( std::ifstream& infile ) {

  int nx = dialog_->nx();
  int ny = dialog_->ny();
  int nz = dialog_->nz();
  float x_size = dialog_->x_size();
  float y_size = dialog_->y_size();
  float z_size = dialog_->z_size();
  float Ox = dialog_->Ox();
  float Oy = dialog_->Oy();
  float Oz = dialog_->Oz();

  bool use_no_data_value = dialog_->use_no_data_value();
  float no_data_value = GsTLGridProperty::no_data_value;
  QString no_data_value_str = QString().arg(no_data_value);
  if( dialog_->use_no_data_value() ) {
    no_data_value = dialog_->no_data_value();
    no_data_value_str = QString::number(no_data_value);

  }

  QByteArray tmp = dialog_->name().simplified().toLatin1();
  std::string name( tmp.constData() );

  // ask manager to get a new grid and initialize it
  SmartPtr<Named_interface> ni =
    Root::instance()->interface( gridModels_manager + "/" + name );

  if( ni.raw_ptr() != 0 ) {
    GsTLcerr << "object " << name << " already exists\n" << gstlIO::end;
    return 0;
  }

  appli_message( "creating new grid '" << name << "'" 
		             << " of dimensions: " << nx << "x" << ny << "x" << nz);

  ni = Root::instance()->new_interface( "cgrid", 
                                        gridModels_manager + "/" + name );
  Cartesian_grid* grid = dynamic_cast<Cartesian_grid*>( ni.raw_ptr() );
  appli_assert( grid != 0 );

  grid->set_dimensions( nx, ny, nz,
			x_size, y_size, z_size);
  grid->origin( GsTLPoint( Ox,Oy,Oz) );
  appli_message( "grid resized to " << nx << "x" << ny << "x" << nz
		<< "  total=: " << grid->size() );

  std::string buffer;
  
  //-------------------------
  //   now, read the file

  std::getline( infile, buffer, '\n');
  QStringList property_names = QString(buffer.c_str()).split(",");

//Read one column at a time
  std::streampos start_data = infile.tellg();
  for(unsigned int j = 0; j< property_names.size(); j++) {
    infile.clear();
    infile.seekg( start_data );
    // Check if property j is categorical
    bool is_categ = false;
    for(unsigned int i=0; i<30 ; i++ ) {
      bool ok;
      if( std::getline(infile, buffer) ) break;
      QString qstr(buffer.c_str());
      QStringList values_str = qstr.split(",");
      values_str[j].toFloat(&ok);
      if(!ok)  {
        is_categ = true;
        break;
      }
    }
    infile.clear();
    infile.seekg( start_data );

    if(is_categ) {
      GsTLGridCategoricalProperty* prop = 
        grid->add_categorical_property(property_names[j].toStdString());
      
      ni = Root::instance()->new_interface( categoricalDefinition_manager, name+"-"+property_names[j].toStdString());
      CategoricalPropertyDefinitionName* cat_def = 
            dynamic_cast<CategoricalPropertyDefinitionName*>(ni.raw_ptr());

      while( std::getline(infile, buffer) ) {
        QString qstr(buffer.c_str());
        QStringList values_qstr = qstr.split(",");
        cat_def->add_category(values_qstr[j].toStdString());
      }
      prop->set_category_definition(cat_def->name());
      infile.clear();
      infile.seekg( start_data );

      int node_id=0;
      while( std::getline(infile, buffer) ) {
        QString qstr(buffer.c_str());
        QStringList values_qstr = qstr.split(",");
        QString val = values_qstr[j];
        if(use_no_data_value && val == no_data_value_str)  {
          prop->set_value( GsTLGridProperty::no_data_value, node_id );
        }
        else {
          prop->set_value( val.toStdString(), node_id );
        }
        node_id++;
      }
    }
    else {
      GsTLGridProperty* prop = 
        grid->add_property(property_names[j].toStdString());
      int node_id=0;
      while( std::getline(infile, buffer) ) {
        QString qstr(buffer.c_str());
        QStringList values_qstr = qstr.split(",");
        if(!values_qstr[j].isEmpty()) {
          bool ok;
          float val = values_qstr[j].toFloat(&ok);
          if(ok  && val != no_data_value) prop->set_value(val,node_id);
        }
        node_id++;
      }
    }

  }
  return grid;
}