diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 2be42d4..42d3f57 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -30,5 +30,5 @@ add_example(text_io_ex OFF) add_example(getoption_ex OFF) add_example(process_ex OFF) add_example(array_ex OFF) -add_example(gmt_ex ON) +add_example(gmt_ex OFF) add_example(gnuplot_ex OFF) \ No newline at end of file diff --git a/example/gmt_ex.cpp b/example/gmt_ex.cpp index 6f2e691..8079e47 100644 --- a/example/gmt_ex.cpp +++ b/example/gmt_ex.cpp @@ -26,7 +26,6 @@ ******************************************************/ #include "../lib/graphic/gmt.h" -#include "../lib/io/netcdf_io.h" int main(int argc, char *argv[]) { @@ -40,7 +39,6 @@ int main(int argc, char *argv[]) */ // example 2 - gctl::array data(51*41); double dist; @@ -53,23 +51,13 @@ int main(int argc, char *argv[]) } } - gctl::save_netcdf_grid("image_plot", data, 41, 51, 0.0, 1.0, 0.0, 1.0, "x", "y", "z"); + gt.begin_session("image_plot", "eps"); + gt.call_module("set", "FONT_ANNOT_PRIMARY=10.5p,Times-Roman,black"); - gt.begin_session("image_plot", "png,eps"); - gt.call_module("set", "FONT_ANNOT_PRIMARY=10.5p,Times-Roman,black \ -MAP_FRAME_PEN=thinnest,black \ -MAP_GRID_PEN_PRIMARY=thinnest,black \ -MAP_TICK_PEN_PRIMARY=thinnest,black \ -MAP_TICK_LENGTH_PRIMARY=1p/0.5p \ -MAP_TITLE_OFFSET=7.5p \ -MAP_GRID_CROSS_SIZE_PRIMARY=2p \ -FONT_LABEL=10.5p,Times-Roman,black \ -MAP_LABEL_OFFSET=5p \ -MAP_ANNOT_OFFSET_PRIMARY=2.5p \ -MAP_FRAME_AXES=WesNZ"); + std::string gname = gt.create_grid(data, 41, 51, 0.0, 1.0, 0.0, 1.0); - gt.call_module("grd2cpt", "image_plot.nc -R0/40/0/50 -Crainbow -Z -D"); - gt.call_module("grdimage", "image_plot.nc -R0/40/0/50 -JX1.5i/1.5i -X0.5i -Y0.5i -Bxag+l\"x (m)\" -Byag+l\"y (m)\""); + gt.call_module("grd2cpt", gname + " -R0/40/0/50 -Crainbow -Z -D"); + gt.call_module("grdimage", gname + " -R0/40/0/50 -JX1.5i/1.5i -X0.5i -Y0.5i -Bxag+l\"x (m)\" -Byag+l\"y (m)\""); gt.call_module("psscale", "-Bxa -By+lm -Dx0.1i/-0.2i+w1.3i/0.05i+h"); gt.end_session(); gt.save_session("image_plot"); diff --git a/lib/graphic/gmt.cpp b/lib/graphic/gmt.cpp index e07a750..8d10983 100644 --- a/lib/graphic/gmt.cpp +++ b/lib/graphic/gmt.cpp @@ -29,34 +29,32 @@ gctl::gmt::gmt() { + seesion_ok_ = false; GMT_API_ = nullptr; - //GRID_ = nullptr; - //std::fill(gmt_gridname_, gmt_gridname_ + sizeof(gmt_gridname_), '\0'); + session_name_ = ""; buffer_.clear(); + tmpfiles_.clear(); } gctl::gmt::~gmt() { - //if (GRID_!= nullptr && GMT_API_!= nullptr) - //{ - // GMT_Close_VirtualFile (GMT_API_, gmt_gridname_); - // GMT_Destroy_Data(GMT_API_, GRID_); - // GRID_ = nullptr; - //} - if (GMT_API_ != nullptr) { GMT_Destroy_Session(GMT_API_); GMT_API_ = nullptr; + seesion_ok_ = false; + session_name_ = ""; } if (!buffer_.empty()) buffer_.clear(); + if (!tmpfiles_.empty()) tmpfiles_.clear(); } void gctl::gmt::begin_session(const std::string& pic_name, const std::string& pic_type, const std::string& name) { if (!buffer_.empty()) buffer_.clear(); + session_name_ = pic_name; GMT_API_ = GMT_Create_Session(name.c_str(), 2U, 0, nullptr); if (GMT_API_ == nullptr) throw std::runtime_error("[gctl::gmt] Fail to begin GMT session."); @@ -69,10 +67,12 @@ void gctl::gmt::begin_session(const std::string& pic_name, cmd = "begin " + cmd; buffer_.push_back(cmd); } + + seesion_ok_ = true; return; } -void gctl::gmt::end_session(bool show) +void gctl::gmt::end_session(bool show, bool clear_tmp) { std::string cmd = ""; if (show) cmd = "show"; @@ -85,18 +85,19 @@ void gctl::gmt::end_session(bool show) buffer_.push_back(cmd); } - //if (GRID_!= nullptr && GMT_API_!= nullptr) - //{ - // GMT_Close_VirtualFile (GMT_API_, gmt_gridname_); - // GMT_Destroy_Data(GMT_API_, GRID_); - // GRID_ = nullptr; - //} + if (clear_tmp) + { + for (auto& file : tmpfiles_) remove(file.c_str()); + } if (GMT_API_ != nullptr) { GMT_Destroy_Session(GMT_API_); GMT_API_ = nullptr; } + + seesion_ok_ = false; + session_name_ = ""; return; } @@ -119,7 +120,7 @@ void gctl::gmt::save_session(const std::string& filename) return; } -void gctl::gmt::call_module(const std::string& module, const std::string& cmd, const std::string& opt) +void gctl::gmt::call_module(const std::string& module, const std::string& cmd) { if (GMT_Call_Module(GMT_API_, module.c_str(), GMT_MODULE_CMD, (char*) cmd.c_str()) != GMT_NOERROR) throw std::runtime_error("[gctl::gmt] Fail to execute GMT command."); @@ -130,46 +131,18 @@ void gctl::gmt::call_module(const std::string& module, const std::string& cmd, c } } -/* -std::string gctl::gmt::create_virtual_grid(const array &data, - double xmin, double xmax, double ymin, double ymax, int xnum, int ynum) +std::string gctl::gmt::create_grid(const array &data, int xnum, int ynum, + double xmin, double dx, double ymin, double dy) { - double wesn[4] = {xmin, xmax, ymin, ymax}; - double inc[2] = {(xmax-xmin)/(xnum-1), (ymax-ymin)/(ynum-1)}; - // create an empty data container of GMT_GRID type - // forcedly convert pointer type (C++ standard) - // you need to destroy the data later - GRID_ = reinterpret_cast( - GMT_Create_Data(GMT_API_, GMT_IS_GRID, GMT_IS_SURFACE, - GMT_CONTAINER_AND_DATA, nullptr, &wesn[0], &inc[0], - GMT_GRID_NODE_REG, -1, nullptr)); + if (seesion_ok_ == false) + throw std::runtime_error("[gctl::gmt] GMT session is not started."); - // manipulate grid data - //double *x_coord = GMT_Get_Coord(GMT_API_, GMT_IS_GRID, GMT_X, GRID_); - //double *y_coord = GMT_Get_Coord(GMT_API_, GMT_IS_GRID, GMT_Y, GRID_); + if (xnum*ynum != data.size()) + throw std::runtime_error("[gctl::gmt] The size of data does not match the grid size."); - int idx; - double minz = 1e+30, maxz = -1e+30; - for (int i = 0; i < GRID_->header->n_rows; i++) - { - for (int j = 0; j < GRID_->header->n_columns; j++) - { - idx = GMT_Get_Index(GMT_API_, GRID_->header, i, j); - GRID_->data[idx] = data[j+(ynum-1-i)*xnum]; + std::string gridname = session_name_ + "_grid_" + std::to_string(tmpfiles_.size() + 1) + ".nc"; + gctl::save_netcdf_grid(gridname, data, xnum, ynum, xmin, dx, ymin, dy); - if (GRID_->data[idx] < minz) minz = GRID_->data[idx]; - if (GRID_->data[idx] > maxz) maxz = GRID_->data[idx]; - } - } - - GRID_->header->z_min = minz; - GRID_->header->z_max = maxz; - - // load the grid to a virtual file for plotting - GMT_Open_VirtualFile(GMT_API_, GMT_IS_GRID, GMT_IS_SURFACE, GMT_IN, GRID_, gmt_gridname_); - - // get string type of grid name - std::string grid_name_str = gmt_gridname_; - return grid_name_str; -} -*/ \ No newline at end of file + tmpfiles_.push_back(gridname); + return gridname; +} \ No newline at end of file diff --git a/lib/graphic/gmt.h b/lib/graphic/gmt.h index df9dade..816d743 100644 --- a/lib/graphic/gmt.h +++ b/lib/graphic/gmt.h @@ -36,6 +36,7 @@ #include "gmt/gmt.h" #include "../utility/stream.h" #include "../core/array.h" +#include "../io/netcdf_io.h" #ifndef GMT_VF_LEN #define GMT_VF_LEN 16 @@ -70,8 +71,9 @@ namespace gctl * @brief Destroy a session object * * @param show Whether to show the result after finish the plotting. + * @param clear_tmp Whether to clear the temporary files. */ - void end_session(bool show = true); + void end_session(bool show = false, bool clear_tmp = true); /** * @brief Save the session to a file. @@ -85,35 +87,33 @@ namespace gctl * * @param module Name of the module. * @param cmd Module command. - * @param opt Extra options. */ - void call_module(const std::string& module, const std::string& cmd, const std::string& opt = ""); + void call_module(const std::string& module, const std::string& cmd); /** - * @brief Create a virtual grid file that could be used for plotting. - * + * @brief Create a temporary grid file that could be used for plotting. + * * @param data Data array. - * @param xmin minimal x coordinate of the data. - * @param xmax maximal x coordinate of the data. - * @param ymin minimal y coordinate of the data. - * @param ymax maximal y coordinate of the data. * @param xnum Number of data points in x direction. * @param ynum Number of data points in y direction. - * + * @param xmin minimal x coordinate of the data. + * @param dx increment of x coordinate of the data. + * @param ymin minimal y coordinate of the data. + * @param dy increment of y coordinate of the data. * @return Name of the virtual grid which could be used for plotting. */ - //std::string create_virtual_grid(const array &data, double xmin, double xmax, - // double ymin, double ymax, int xnum, int ynum); + std::string create_grid(const array &data, int xnum, int ynum, + double xmin, double dx, double ymin, double dy); private: gmt(gmt const&) = delete; void operator=(gmt const&) = delete; + bool seesion_ok_; void* GMT_API_; + std::string session_name_; std::vector buffer_; - - //char gmt_gridname_[GMT_VF_LEN]; - //struct GMT_GRID* GRID_; + std::vector tmpfiles_; }; }; diff --git a/lib/graphic/gnuplot.h b/lib/graphic/gnuplot.h index 0b8cd20..1093df9 100644 --- a/lib/graphic/gnuplot.h +++ b/lib/graphic/gnuplot.h @@ -58,7 +58,7 @@ namespace gctl void to_buffer(); /** - * @brief Send a line to gnuplot and execute it. If send2buffer is called before, then the line will be stored in the buffer. + * @brief Send a line to gnuplot and execute it. If to_buffer is called before, then the line will be stored in the buffer. * * @param cmd command line. * @param next_block If true, an empty line will be added to the buffer after the cmd.