示例#1
0
   // ----------------------------------------------------------------------
   void
   ConstantElevationTask::
   run( shawn::SimulationController& sc )
      throw( std::runtime_error )
   {
      double val = sc.environment().required_double_param("height");
      std::string n = sc.environment().optional_string_param("name","");

      elevation_keeper_w(sc).add( new ConstantElevation(val,n) );
   }
   // ----------------------------------------------------------------------
   void
   XYZFileElevationTask::
   run( shawn::SimulationController& sc )
      throw( std::runtime_error )
   {
      std::string fn       = sc.environment().required_string_param("file");
      std::string outn     = sc.environment().required_string_param("name");
      std::string xyplacen = sc.environment().optional_string_param("xy_placement",KEY_SCALE);
      std::string zplacen  = sc.environment().optional_string_param("z_placement",KEY_SCALE);
      bool xyplace_box;
      bool zplace_box;

      if( xyplacen == KEY_BOX )      xyplace_box = true;
      else if( xyplacen==KEY_SCALE ) xyplace_box = false;
      else throw runtime_error(string("$xy_placement must be ")+KEY_SCALE+string(" or ")+KEY_BOX);

      if( zplacen == KEY_BOX )      zplace_box = true;
      else if( zplacen==KEY_SCALE ) zplace_box = false;
      else throw runtime_error(string("$z_placement must be ")+KEY_SCALE+string(" or ")+KEY_BOX);

      XYZFile* data = new XYZFile;
      Vec base_point;
      Vec scale_vec;
      XYZFileElevation* elev;
      try {
         data->read(fn);

         if( (data->x_dimension()<2) || (data->y_dimension()<2) )
            {
               ostringstream oss;
               oss << "XYZ data must have at least 2x2 grid points, but "
                   << fn << " just contains "
                   << data->x_dimension() << "x" << data->y_dimension();
               throw runtime_error(oss.str());
            }

         if( xyplace_box ) xy_place_box(sc,*data,base_point,scale_vec);
         else xy_place_scale(sc,*data,base_point,scale_vec);

         if( zplace_box ) z_place_box(sc,*data,base_point,scale_vec);
         else z_place_scale(sc,*data,base_point,scale_vec);

         elev = new XYZFileElevation(data,
                                     base_point,
                                     scale_vec.x(),scale_vec.y(),scale_vec.z(),
                                     outn);
      }
      catch( runtime_error& )
	  {
         delete data;
         throw;
      }

      elevation_keeper_w(sc).add( elev );
   }