From 4dc7e5ebc285bbd5900a5ccbe04727c1135dcea3 Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Wed, 1 Jan 2025 22:43:59 +0800 Subject: [PATCH] update --- example/text_io_ex.cpp | 11 +++-- lib/io/dsv_io.cpp | 104 +++++++++++++++++++++++++++++++++++++++-- lib/io/dsv_io.h | 69 ++++++++++++++++++++++++++- 3 files changed, 173 insertions(+), 11 deletions(-) diff --git a/example/text_io_ex.cpp b/example/text_io_ex.cpp index d32cbba..81ce3ea 100644 --- a/example/text_io_ex.cpp +++ b/example/text_io_ex.cpp @@ -53,9 +53,7 @@ int main(int argc, char const *argv[]) try geodsv_io tc; tc.load_text("tmp/topo", ".txt", ColumnHead); - tc.cell(std::string("x (m)"), 0, 1); - tc.cell(std::string("y (m)"), 0, 2); - tc.cell(std::string("elevation (m)"), 0, 3); + tc.set_column_names({"x (m)", "y (m)", "elev (m)"}); array topo; tc.get_column_point3dc(topo, 1, 2, 3); @@ -69,12 +67,15 @@ int main(int argc, char const *argv[]) try //tc.column_output("C3", Disable); array elev; - tc.get_column(elev, "elevation (m)"); + tc.get_column(elev, "elev (m)"); elev.for_each([](double &d, size_t i){d += 100.0;}); - tc.add_column(-1, "elev_plus"); + tc.add_column(2, "elev_plus"); tc.fill_column(elev, "elev_plus"); + tc.add_row(3); + tc.fill_row(array{4.4, 3.3, 2.2, 1.1}, 3); + _1s_vector s = tc.get_tags(); s.push_back("Elev = 1000"); tc.set_tags(s); diff --git a/lib/io/dsv_io.cpp b/lib/io/dsv_io.cpp index 04e1a81..23ac94e 100644 --- a/lib/io/dsv_io.cpp +++ b/lib/io/dsv_io.cpp @@ -79,7 +79,7 @@ void gctl::dsv_io::get_row_names(std::vector &names) names.resize(row_num_); for (size_t i = 1; i < row_num_; i++) { - names[i] = table_[i][0].str_; + names[i - 1] = table_[i][0].str_; } return; } @@ -89,7 +89,7 @@ void gctl::dsv_io::get_column_names(std::vector &names) names.resize(col_num_); for (size_t i = 1; i < col_num_; i++) { - names[i] = table_[0][i].str_; + names[i - 1] = table_[0][i].str_; } return; } @@ -98,7 +98,7 @@ void gctl::dsv_io::set_row_names(const std::vector &names) { for (size_t i = 1; i <= std::min(row_num_, (int) names.size()); i++) { - table_[i][0].str_ = names[i]; + table_[i][0].str_ = names[i - 1]; } table_[0][0].str_ = "row_name"; @@ -109,7 +109,7 @@ void gctl::dsv_io::set_column_names(const std::vector &names) { for (size_t i = 1; i <= std::min(col_num_, (int) names.size()); i++) { - table_[0][i].str_ = names[i]; + table_[0][i].str_ = names[i - 1]; } return; } @@ -501,6 +501,42 @@ void gctl::dsv_io::add_column(std::string id_name, std::string name) return; } +void gctl::dsv_io::add_row(std::string name) +{ + std::vector empty_line; + table_.push_back(empty_line); + table_.back().resize(col_num_ + 1); + table_.back().front().str_ = name; + row_num_++; + return; +} + +void gctl::dsv_io::add_row(int idx, std::string name) +{ + std::vector empty_line; + if (idx <= 0) + { + table_.push_back(empty_line); + table_.back().resize(col_num_ + 1); + table_.back().front().str_ = name; + row_num_++; + } + else + { + table_.insert(table_.begin() + idx, empty_line); + table_[idx].resize(col_num_ + 1); + table_[idx].front().str_ = name; + row_num_++; + } + return; +} + +void gctl::dsv_io::add_row(std::string id_name, std::string name) +{ + add_row(name_index(id_name), name); + return; +} + gctl::geodsv_io::geodsv_io(){} gctl::geodsv_io::~geodsv_io(){} @@ -585,6 +621,42 @@ void gctl::geodsv_io::fill_column_point3dc(const array &data, std::str return; } +void gctl::geodsv_io::fill_column_point3ds(const array &data, int rid, int pid, int tid, int p) +{ + if (rid > col_num_ || pid > col_num_ || tid > col_num_ || rid == pid || pid == tid || tid == rid + || rid <= 0 || pid <= 0 || tid <= 0) + { + throw std::runtime_error("[gctl::geodsv_io] Invalid column index."); + } + + std::stringstream ss; + std::string s; + for (size_t i = 1; i < std::min(row_num_, (int) data.size()); i++) + { + ss.clear(); + ss << data[i - 1].rad; + ss >> s; + table_[i][rid].str_ = s; + + ss.clear(); + ss << data[i - 1].lon; + ss >> s; + table_[i][pid].str_ = s; + + ss.clear(); + ss << data[i - 1].lat; + ss >> s; + table_[i][tid].str_ = s; + } + return; +} + +void gctl::geodsv_io::fill_column_point3ds(const array &data, std::string rname, std::string pname, std::string tname, int p) +{ + fill_column_point3ds(data, name_index(rname, false), name_index(pname, false), name_index(tname, false), p); + return; +} + void gctl::geodsv_io::get_column_point2dc(array &data, int xid, int yid) { if (xid > col_num_ || yid > col_num_ || xid == yid || xid <= 0 || yid <= 0) @@ -629,4 +701,28 @@ void gctl::geodsv_io::get_column_point3dc(array &data, std::string xna { get_column_point3dc(data, name_index(xname, false), name_index(yname, false), name_index(zname, false)); return; +} + +void gctl::geodsv_io::get_column_point3ds(array &data, int rid, int pid, int tid) +{ + if (rid > col_num_ || pid > col_num_ || tid > col_num_ || rid == pid || pid == tid || tid == rid + || rid <= 0 || pid <= 0 || tid <= 0) + { + throw std::runtime_error("[gctl::geodsv_io] Invalid column index."); + } + + data.resize(row_num_); + for (size_t i = 1; i <= row_num_; i++) + { + data[i - 1].rad = table_[i][rid].value(); + data[i - 1].lon = table_[i][pid].value(); + data[i - 1].lat = table_[i][tid].value(); + } + return; +} + +void gctl::geodsv_io::get_column_point3ds(array &data, std::string rname, std::string pname, std::string tname) +{ + get_column_point3ds(data, name_index(rname, false), name_index(pname, false), name_index(tname, false)); + return; } \ No newline at end of file diff --git a/lib/io/dsv_io.h b/lib/io/dsv_io.h index 0aefa4d..7c1c13e 100644 --- a/lib/io/dsv_io.h +++ b/lib/io/dsv_io.h @@ -353,7 +353,7 @@ namespace gctl void add_column(std::string name = ""); /** - * @brief 在索引为idx的列后添加一个空白列 + * @brief 在索引为idx的列插入一个空白列 * * @param idx 列索引 小于等于0时将在表尾添加一列 * @param name 设置列名称 @@ -361,13 +361,36 @@ namespace gctl void add_column(int idx, std::string name = ""); /** - * @brief 在名称为id_name的列后添加一个空白列 + * @brief 在名称为id_name的列插入一个空白列 * * @param id_name 索引列名称 * @param name 设置列名称 */ void add_column(std::string id_name, std::string name = ""); + /** + * @brief 在表格末尾添加一个空白行 + * + * @param name 设置行名称 + */ + void add_row(std::string name = ""); + + /** + * @brief 在索引为idx的列插入一个空白行 + * + * @param idx 行索引 小于等于0时将在表尾添加一行 + * @param name 设置行名称 + */ + void add_row(int idx, std::string name = ""); + + /** + * @brief 在名称为id_name的列插入一个空白行 + * + * @param id_name 索引行名称 + * @param name 设置行名称 + */ + void add_row(std::string id_name, std::string name = ""); + /** * @brief 填充表格 * @@ -669,6 +692,28 @@ namespace gctl */ void fill_column_point3dc(const array &data, std::string xname, std::string yname, std::string zname, int p = 6); + /** + * @brief 填充三维坐标列 + * + * @param rid rad坐标列索引 从1开始 + * @param pid phi坐标(经度)列索引 从1开始 + * @param tid theta坐标(纬度)列索引 从1开始 + * @param data 返回的三维坐标数据 + * @param p 填入的浮点数据有效位数(精度) + */ + void fill_column_point3ds(const array &data, int rid, int pid, int tid, int p = 6); + + /** + * @brief 填充三维坐标列 + * + * @param rname rad坐标列名称 从1开始 + * @param pname phi坐标(经度)列名称 从1开始 + * @param tname theta坐标(纬度)列名称 从1开始 + * @param data 返回的三维坐标数据 + * @param p 填入的浮点数据有效位数(精度) + */ + void fill_column_point3ds(const array &data, std::string rname, std::string pname, std::string tname, int p = 6); + /** * @brief 读取二维坐标列 * @@ -706,6 +751,26 @@ namespace gctl * @param data 返回的三维坐标数据 */ void get_column_point3dc(array &data, std::string xname, std::string yname, std::string zname); + + /** + * @brief 读取三维坐标列 + * + * @param rid rad坐标列索引 从1开始 + * @param pid phi坐标(经度)列索引 从1开始 + * @param tid theta坐标(纬度)列索引 从1开始 + * @param data 返回的三维坐标数据 + */ + void get_column_point3ds(array &data, int rid, int pid, int tid); + + /** + * @brief 读取三维坐标列 + * + * @param rname rad坐标列名称 从1开始 + * @param pname phi坐标(经度)列名称 从1开始 + * @param tname theta坐标(纬度)列名称 从1开始 + * @param data 返回的三维坐标数据 + */ + void get_column_point3ds(array &data, std::string rname, std::string pname, std::string tname); }; }