diff --git a/.gitignore b/.gitignore index 259148f..a49a0a6 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ *.exe *.out *.app + +build/ +.DS_Store \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d3a04c3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.15.2) +project(GM3D) +add_subdirectory(src) \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..d76e473 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,10 @@ +aux_source_directory(. SRC_DIR) + +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) + +add_executable(gm3d ${SRC_DIR}) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11 -O2") + +set(CMAKE_INSTALL_PREFIX /usr/local) +install(TARGETS gm3d RUNTIME DESTINATION sbin) \ No newline at end of file diff --git a/src/add_interface_block.cpp b/src/add_interface_block.cpp new file mode 100644 index 0000000..51f3550 --- /dev/null +++ b/src/add_interface_block.cpp @@ -0,0 +1,145 @@ +#include "gm3d.h" +//我们读入一个界面数据 插值计算每个块体中心位置的值 然后按情况赋值 +int GM3D::AddInterfaceBlock(modelist para_list){ + int m, n, xnum, ynum; + double xs,xe,xmin,xmax,dx; + double ys,ye,ymin,ymax,dy; + bool model_added = false; + + string temp_str; + stringstream temp_ss; + + cpoint temp_topo; + cpointArray face_topo; + + ifstream infile; + char filename[1024]; + if (1 == sscanf(para_list.mod_para,"%s",filename)){ + if (open_infile(infile,filename)) return -1; + + while (getline(infile,temp_str)){ + //#range必须出现在数据之前 + if (*(temp_str.begin()) == '#'){ + if (6 == sscanf(temp_str.c_str(),"# range=%lf/%lf/%lf/%lf/%lf/%lf",&xs,&dx,&xe,&ys,&dy,&ye)){ + xmin = MIN(xs,xe); xmax = MAX(xs,xe); + ymin = MIN(ys,ye); ymax = MAX(ys,ye); + dx = fabs(dx); dy = fabs(dy); + xnum = round((xmax - xmin)/dx) + 1; + ynum = round((ymax - ymin)/dy) + 1; + } + else continue; + } + else{ + temp_ss = str2ss(temp_str); + temp_ss >> temp_topo.x >> temp_topo.y >> temp_topo.z; + face_topo.push_back(temp_topo); + } + } + infile.close(); + + if (!strcmp(para_list.val_type,"replace/top")){ + for (int i = 0; i < model_num_; i++){ + m = floor((model_cube_[i].cen.x - xmin)/dx); + n = floor((model_cube_[i].cen.y - ymin)/dy); + + temp_topo.z = grid_interpolate(xmin+dx*m,ymin+dy*n,dx,dy,model_cube_[i].cen.x,model_cube_[i].cen.y, + face_topo[xnum*n+m].z,face_topo[xnum*n+m+1].z,face_topo[xnum*(n+1)+m].z,face_topo[xnum*(n+1)+m+1].z); + + if (model_cube_[i].cen.z >= temp_topo.z){ + model_block_val_[i] = para_list.mod_value; + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"replace/bot")){ + for (int i = 0; i < model_num_; i++){ + m = floor((model_cube_[i].cen.x - xmin)/dx); + n = floor((model_cube_[i].cen.y - ymin)/dy); + + temp_topo.z = grid_interpolate(xmin+dx*m,ymin+dy*n,dx,dy,model_cube_[i].cen.x,model_cube_[i].cen.y, + face_topo[xnum*n+m].z,face_topo[xnum*n+m+1].z,face_topo[xnum*(n+1)+m].z,face_topo[xnum*(n+1)+m+1].z); + + if (model_cube_[i].cen.z <= temp_topo.z){ + model_block_val_[i] = para_list.mod_value; + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"add/top")){ + for (int i = 0; i < model_num_; i++){ + m = floor((model_cube_[i].cen.x - xmin)/dx); + n = floor((model_cube_[i].cen.y - ymin)/dy); + + temp_topo.z = grid_interpolate(xmin+dx*m,ymin+dy*n,dx,dy,model_cube_[i].cen.x,model_cube_[i].cen.y, + face_topo[xnum*n+m].z,face_topo[xnum*n+m+1].z,face_topo[xnum*(n+1)+m].z,face_topo[xnum*(n+1)+m+1].z); + + if (model_cube_[i].cen.z >= temp_topo.z){ + if (model_block_val_[i] == BDL_MAX) + model_block_val_[i] = para_list.mod_value; //注意重复赋值的块体会覆盖 + else + model_block_val_[i] += para_list.mod_value; + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"add/bot")){ + for (int i = 0; i < model_num_; i++){ + m = floor((model_cube_[i].cen.x - xmin)/dx); + n = floor((model_cube_[i].cen.y - ymin)/dy); + + temp_topo.z = grid_interpolate(xmin+dx*m,ymin+dy*n,dx,dy,model_cube_[i].cen.x,model_cube_[i].cen.y, + face_topo[xnum*n+m].z,face_topo[xnum*n+m+1].z,face_topo[xnum*(n+1)+m].z,face_topo[xnum*(n+1)+m+1].z); + + if (model_cube_[i].cen.z <= temp_topo.z){ + if (model_block_val_[i] == BDL_MAX) + model_block_val_[i] = para_list.mod_value; //注意重复赋值的块体会覆盖 + else + model_block_val_[i] += para_list.mod_value; + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"erase/top")){ + for (int i = 0; i < model_num_; i++){ + m = floor((model_cube_[i].cen.x - xmin)/dx); + n = floor((model_cube_[i].cen.y - ymin)/dy); + + temp_topo.z = grid_interpolate(xmin+dx*m,ymin+dy*n,dx,dy,model_cube_[i].cen.x,model_cube_[i].cen.y, + face_topo[xnum*n+m].z,face_topo[xnum*n+m+1].z,face_topo[xnum*(n+1)+m].z,face_topo[xnum*(n+1)+m+1].z); + + if (model_cube_[i].cen.z >= temp_topo.z){ + model_block_val_[i] = BDL_MAX; + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"erase/bot")){ + for (int i = 0; i < model_num_; i++){ + m = floor((model_cube_[i].cen.x - xmin)/dx); + n = floor((model_cube_[i].cen.y - ymin)/dy); + + temp_topo.z = grid_interpolate(xmin+dx*m,ymin+dy*n,dx,dy,model_cube_[i].cen.x,model_cube_[i].cen.y, + face_topo[xnum*n+m].z,face_topo[xnum*n+m+1].z,face_topo[xnum*(n+1)+m].z,face_topo[xnum*(n+1)+m+1].z); + + if (model_cube_[i].cen.z <= temp_topo.z){ + model_block_val_[i] = BDL_MAX; + model_added = true; + } + } + } + else{ + cerr << BOLDRED << "error ==> " << RESET << "wrong value type: " << para_list.val_type << " of the model type: " << para_list.mod_type << endl; + return -1; + } + } + else{ + cerr << BOLDRED << "error ==> " << RESET << "fail to add blocks with the parameter: " << para_list.mod_para << endl; + return -1; + } + + if (!model_added){ + cerr << BOLDYELLOW << "warning ==> " << RESET << "no block changed with the parameter: " << para_list.mod_para << endl; + return -1; + } + return 0; +} \ No newline at end of file diff --git a/src/add_models.cpp b/src/add_models.cpp new file mode 100644 index 0000000..e594adf --- /dev/null +++ b/src/add_models.cpp @@ -0,0 +1,45 @@ +#include "gm3d.h" + +int GM3D::AddModels(char* filename){ + string temp_str; + stringstream temp_ss; + modelist temp_list; + + ifstream infile; + if (open_infile(infile,filename)) return -1; + while(getline(infile,temp_str)){ + if (*(temp_str.begin()) == '#') continue; + else{ + //按每行5个数据解析 初始化为含观测值与不确定度的观测点 + if (4 == sscanf(temp_str.c_str(),"%s %s %lf %s", + temp_list.mod_type,temp_list.val_type,&temp_list.mod_value,temp_list.mod_para)){ + model_list_.push_back(temp_list); + } + else{ + cerr << BOLDYELLOW << "ignored ==> " << RESET << "wrong input: " << temp_str << endl; + continue; + } + } + } + infile.close(); + + for (int i = 0; i < model_list_.size(); i++){ + if (!strcmp(model_list_[i].mod_type,"regular_block")){ + AddRegularBlock(model_list_[i]); + } + else if (!strcmp(model_list_[i].mod_type,"tilted_block")){ + AddTiltedBlock(model_list_[i]); + } + else if (!strcmp(model_list_[i].mod_type,"sphere")){ + AddSphereBlock(model_list_[i]); + } + else if (!strcmp(model_list_[i].mod_type,"interface")){ + AddInterfaceBlock(model_list_[i]); + } + else{ + cerr << BOLDYELLOW << "ignored ==> " << RESET << "unknown model type: " << model_list_[i].mod_type << endl; + continue; + } + } + return 0; +} \ No newline at end of file diff --git a/src/add_regular_block.cpp b/src/add_regular_block.cpp new file mode 100644 index 0000000..4834976 --- /dev/null +++ b/src/add_regular_block.cpp @@ -0,0 +1,62 @@ +#include "gm3d.h" + +int GM3D::AddRegularBlock(modelist para_list){ + double xs,xe,xmin,xmax; + double ys,ye,ymin,ymax; + double zs,ze,zmin,zmax; + bool model_added = false; + + if (6 == sscanf(para_list.mod_para,"%lf/%lf/%lf/%lf/%lf/%lf",&xs,&xe,&ys,&ye,&zs,&ze)){ + xmin = MIN(xs,xe); xmax = MAX(xs,xe); + ymin = MIN(ys,ye); ymax = MAX(ys,ye); + zmin = MIN(zs,ze); zmax = MAX(zs,ze); + + if (!strcmp(para_list.val_type,"replace")){ + for (int i = 0; i < model_num_; i++){ + if (model_cube_[i].cen.x >= xmin && model_cube_[i].cen.x <= xmax && + model_cube_[i].cen.y >= ymin && model_cube_[i].cen.y <= ymax && + model_cube_[i].cen.z >= zmin && model_cube_[i].cen.z <= zmax){ + model_block_val_[i] = para_list.mod_value; //注意重复赋值的块体会覆盖 + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"add")){ + for (int i = 0; i < model_num_; i++){ + if (model_cube_[i].cen.x >= xmin && model_cube_[i].cen.x <= xmax && + model_cube_[i].cen.y >= ymin && model_cube_[i].cen.y <= ymax && + model_cube_[i].cen.z >= zmin && model_cube_[i].cen.z <= zmax){ + if (model_block_val_[i] == BDL_MAX) + model_block_val_[i] = para_list.mod_value; //注意重复赋值的块体会覆盖 + else + model_block_val_[i] += para_list.mod_value; + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"erase")){ + for (int i = 0; i < model_num_; i++){ + if (model_cube_[i].cen.x >= xmin && model_cube_[i].cen.x <= xmax && + model_cube_[i].cen.y >= ymin && model_cube_[i].cen.y <= ymax && + model_cube_[i].cen.z >= zmin && model_cube_[i].cen.z <= zmax){ + model_block_val_[i] = BDL_MAX; //注意重复赋值的块体会覆盖 + model_added = true; + } + } + } + else{ + cerr << BOLDRED << "error ==> " << RESET << "wrong value type: " << para_list.val_type << " of the model type: " << para_list.mod_type << endl; + return -1; + } + } + else{ + cerr << BOLDRED << "error ==> " << RESET << "fail to add blocks with the parameter: " << para_list.mod_para << endl; + return -1; + } + + if (!model_added){ + cerr << BOLDYELLOW << "warning ==> " << RESET << "no block changed with the parameter: " << para_list.mod_para << endl; + return -1; + } + return 0; +} \ No newline at end of file diff --git a/src/add_sphere_block.cpp b/src/add_sphere_block.cpp new file mode 100644 index 0000000..9bba9bf --- /dev/null +++ b/src/add_sphere_block.cpp @@ -0,0 +1,82 @@ +#include "gm3d.h" + +int GM3D::AddSphereBlock(modelist para_list){ + double xc,yc,zc,rad_x,rad_y,rad_z; + double dist,rad_limit; + double rel_x,rel_y,rel_z,theta,phi; + bool model_added = false; + + if (6 == sscanf(para_list.mod_para,"%lf/%lf/%lf/%lf/%lf/%lf",&xc,&yc,&zc,&rad_x,&rad_y,&rad_z)){ + if (!strcmp(para_list.val_type,"replace")){ + for (int i = 0; i < model_num_; i++){ + rel_x = model_cube_[i].cen.x - xc; + rel_y = model_cube_[i].cen.y - yc; + rel_z = model_cube_[i].cen.z - zc; + dist = sqrt(rel_x*rel_x + rel_y*rel_y + rel_z*rel_z); + + theta = acos(rel_z/dist); + phi = atan2(rel_y,rel_x); + + rad_limit = rad_x*rad_y*rad_z/sqrt(pow(rad_y*rad_z*sin(theta)*cos(phi),2) + pow(rad_x*rad_z*sin(theta)*sin(phi),2) + pow(rad_x*rad_y*cos(theta),2)); + + if (dist <= rad_limit){ + model_block_val_[i] = para_list.mod_value; //注意重复赋值的块体会覆盖 + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"add")){ + for (int i = 0; i < model_num_; i++){ + rel_x = model_cube_[i].cen.x - xc; + rel_y = model_cube_[i].cen.y - yc; + rel_z = model_cube_[i].cen.z - zc; + dist = sqrt(rel_x*rel_x + rel_y*rel_y + rel_z*rel_z); + + theta = acos(rel_z/dist); + phi = atan2(rel_y,rel_x); + + rad_limit = rad_x*rad_y*rad_z/sqrt(pow(rad_y*rad_z*sin(theta)*cos(phi),2) + pow(rad_x*rad_z*sin(theta)*sin(phi),2) + pow(rad_x*rad_y*cos(theta),2)); + + if (dist <= rad_limit){ + if (model_block_val_[i] == BDL_MAX) + model_block_val_[i] = para_list.mod_value; //注意重复赋值的块体会覆盖 + else + model_block_val_[i] += para_list.mod_value; + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"erase")){ + for (int i = 0; i < model_num_; i++){ + rel_x = model_cube_[i].cen.x - xc; + rel_y = model_cube_[i].cen.y - yc; + rel_z = model_cube_[i].cen.z - zc; + dist = sqrt(rel_x*rel_x + rel_y*rel_y + rel_z*rel_z); + + theta = acos(rel_z/dist); + phi = atan2(rel_y,rel_x); + + rad_limit = rad_x*rad_y*rad_z/sqrt(pow(rad_y*rad_z*sin(theta)*cos(phi),2) + pow(rad_x*rad_z*sin(theta)*sin(phi),2) + pow(rad_x*rad_y*cos(theta),2)); + + if (dist <= rad_limit){ + model_block_val_[i] = BDL_MAX; //注意重复赋值的块体会覆盖 + model_added = true; + } + } + } + else{ + cerr << BOLDRED << "error ==> " << RESET << "wrong value type: " << para_list.val_type << " of the model type: " << para_list.mod_type << endl; + return -1; + } + } + else{ + cerr << BOLDRED << "error ==> " << RESET << "fail to add blocks with the parameter: " << para_list.mod_para << endl; + return -1; + } + + if (!model_added){ + cerr << BOLDYELLOW << "warning ==> " << RESET << "no block changed with the parameter: " << para_list.mod_para << endl; + return -1; + } + return 0; +} \ No newline at end of file diff --git a/src/add_tilted_block.cpp b/src/add_tilted_block.cpp new file mode 100644 index 0000000..904548c --- /dev/null +++ b/src/add_tilted_block.cpp @@ -0,0 +1,86 @@ +#include "gm3d.h" + +int GM3D::AddTiltedBlock(modelist para_list){ + double xs_1,xe_1,xmin_1,xmax_1; + double xs_2,xe_2,xmin_2,xmax_2; + double ys_1,ye_1,ymin_1,ymax_1; + double ys_2,ye_2,ymin_2,ymax_2; + double layer_xmin,layer_xmax,layer_ymin,layer_ymax; + double zs,ze,zmin,zmax; + bool model_added = false; + + if (10 == sscanf(para_list.mod_para,"%lf/%lf/%lf/%lf/%lf/%lf/%lf/%lf/%lf/%lf", + &xs_1,&xe_1,&ys_1,&ye_1,&zs,&xs_2,&xe_2,&ys_2,&ye_2,&ze)){ + xmin_1 = MIN(xs_1,xe_1); xmax_1 = MAX(xs_1,xe_1); + ymin_1 = MIN(ys_1,ye_1); ymax_1 = MAX(ys_1,ye_1); + xmin_2 = MIN(xs_2,xe_2); xmax_2 = MAX(xs_2,xe_2); + ymin_2 = MIN(ys_2,ye_2); ymax_2 = MAX(ys_2,ye_2); + zmin = MIN(zs,ze); zmax = MAX(zs,ze); + + if (!strcmp(para_list.val_type,"replace")){ + for (int i = 0; i < model_num_; i++){ + //计算当前层的x与y范围 + layer_xmin = (model_cube_[i].cen.z - zmin)*(xmin_2 - xmin_1)/(zmax - zmin) + xmin_1; + layer_xmax = (model_cube_[i].cen.z - zmin)*(xmax_2 - xmax_1)/(zmax - zmin) + xmax_1; + layer_ymin = (model_cube_[i].cen.z - zmin)*(ymin_2 - ymin_1)/(zmax - zmin) + ymin_1; + layer_ymax = (model_cube_[i].cen.z - zmin)*(ymax_2 - ymax_1)/(zmax - zmin) + ymax_1; + + if (model_cube_[i].cen.x >= layer_xmin && model_cube_[i].cen.x <= layer_xmax && + model_cube_[i].cen.y >= layer_ymin && model_cube_[i].cen.y <= layer_ymax && + model_cube_[i].cen.z >= zmin && model_cube_[i].cen.z <= zmax){ + model_block_val_[i] = para_list.mod_value; //注意重复赋值的块体会覆盖 + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"add")){ + for (int i = 0; i < model_num_; i++){ + //计算当前层的x与y范围 + layer_xmin = (model_cube_[i].cen.z - zmin)*(xmin_2 - xmin_1)/(zmax - zmin) + xmin_1; + layer_xmax = (model_cube_[i].cen.z - zmin)*(xmax_2 - xmax_1)/(zmax - zmin) + xmax_1; + layer_ymin = (model_cube_[i].cen.z - zmin)*(ymin_2 - ymin_1)/(zmax - zmin) + ymin_1; + layer_ymax = (model_cube_[i].cen.z - zmin)*(ymax_2 - ymax_1)/(zmax - zmin) + ymax_1; + + if (model_cube_[i].cen.x >= layer_xmin && model_cube_[i].cen.x <= layer_xmax && + model_cube_[i].cen.y >= layer_ymin && model_cube_[i].cen.y <= layer_ymax && + model_cube_[i].cen.z >= zmin && model_cube_[i].cen.z <= zmax){ + if (model_block_val_[i] == BDL_MAX) + model_block_val_[i] = para_list.mod_value; //注意重复赋值的块体会覆盖 + else + model_block_val_[i] += para_list.mod_value; + model_added = true; + } + } + } + else if (!strcmp(para_list.val_type,"erase")){ + for (int i = 0; i < model_num_; i++){ + //计算当前层的x与y范围 + layer_xmin = (model_cube_[i].cen.z - zmin)*(xmin_2 - xmin_1)/(zmax - zmin) + xmin_1; + layer_xmax = (model_cube_[i].cen.z - zmin)*(xmax_2 - xmax_1)/(zmax - zmin) + xmax_1; + layer_ymin = (model_cube_[i].cen.z - zmin)*(ymin_2 - ymin_1)/(zmax - zmin) + ymin_1; + layer_ymax = (model_cube_[i].cen.z - zmin)*(ymax_2 - ymax_1)/(zmax - zmin) + ymax_1; + + if (model_cube_[i].cen.x >= layer_xmin && model_cube_[i].cen.x <= layer_xmax && + model_cube_[i].cen.y >= layer_ymin && model_cube_[i].cen.y <= layer_ymax && + model_cube_[i].cen.z >= zmin && model_cube_[i].cen.z <= zmax){ + model_block_val_[i] = BDL_MAX; //注意重复赋值的块体会覆盖 + model_added = true; + } + } + } + else{ + cerr << BOLDRED << "error ==> " << RESET << "wrong value type: " << para_list.val_type << " of the model type: " << para_list.mod_type << endl; + return -1; + } + } + else{ + cerr << BOLDRED << "error ==> " << RESET << "fail to add blocks with the parameter: " << para_list.mod_para << endl; + return -1; + } + + if (!model_added){ + cerr << BOLDYELLOW << "warning ==> " << RESET << "no block changed with the parameter: " << para_list.mod_para << endl; + return -1; + } + return 0; +} \ No newline at end of file diff --git a/src/build_regular_grid.cpp b/src/build_regular_grid.cpp new file mode 100644 index 0000000..6d131ee --- /dev/null +++ b/src/build_regular_grid.cpp @@ -0,0 +1,70 @@ +#include "gm3d.h" + +int GM3D::BuildRegularGrid(char* space_para){ + cpoint temp_cp; + cube temp_cu; + string temp_id_str; + double x,xs,dx,xe,xmin,xmax; + double y,ys,dy,ye,ymin,ymax; + double z,zs,dz,ze,zmin,zmax; + double sign[8][3] = {{-0.5,-0.5,-0.5},{0.5,-0.5,-0.5},{0.5,0.5,-0.5},{-0.5,0.5,-0.5}, + {-0.5,-0.5,0.5},{0.5,-0.5,0.5},{0.5,0.5,0.5},{-0.5,0.5,0.5}}; + + _str2pointMap map_str_point; + _str2pointMap::iterator imsp; + + if (9 == sscanf(space_para,"%lf/%lf/%lf/%lf/%lf/%lf/%lf/%lf/%lf", + &xs,&dx,&xe,&ys,&dy,&ye,&zs,&dz,&ze)){ + xmin = MIN(xs,xe); xmax = MAX(xs,xe); + ymin = MIN(ys,ye); ymax = MAX(ys,ye); + zmin = MIN(zs,ze); zmax = MAX(zs,ze); + + temp_cu.dx = fabs(dx); temp_cu.dy = fabs(dy); temp_cu.dz = fabs(dz); + y = ys; + while(y >= ymin && y <= ymax){ + x = xs; + while(x >= xmin && x <= xmax){ + z = zs; + while(z >= zmin && z <= zmax){ + //添加denMod + temp_cu.cen.id = model_cube_.size(); + temp_cu.cen.x = x; temp_cu.cen.y = y; temp_cu.cen.z = z; + //添加mshVert + for (int i = 0; i < 8; i++){ + temp_cp.id = model_vert_.size(); //添加msh的顶点索引为mshVert的大小 + temp_cp.x = temp_cu.cen.x - sign[i][0]*temp_cu.dx; //左下底角 + temp_cp.y = temp_cu.cen.y - sign[i][1]*temp_cu.dy; + temp_cp.z = temp_cu.cen.z - sign[i][2]*temp_cu.dz; + temp_id_str = cpoint_id(temp_cp); + imsp = map_str_point.find(temp_id_str); + //利用map_vert查到当前顶点是否存在,这里需要注意,如果顶点已经存在则只需要将顶点索引置为已存在顶点的索引,不增加顶点计数 + if(imsp!=map_str_point.end()){ + temp_cu.ids[i] = imsp->second.id; + } + //若为新的顶点则将其增加到两个映射和一个链表中 + else{ + temp_cu.ids[i] = temp_cp.id;//新的顶点索引等于顶点集的数量 + model_vert_.push_back(temp_cp);//将新产生的顶点保存到顶点链表中 + map_str_point[temp_id_str] = temp_cp;//将新产生的顶点保存到顶点位置映射中 + } + } + model_cube_.push_back(temp_cu); + z += dz; + } + x += dx; + } + y += dy; + } + } + + if (model_cube_.empty()){ + cerr << BOLDRED << "error ==> " << RESET << "fail to initial model space with the parameter: " << space_para << endl; + return -1; + } + else{ + vert_num_ = model_vert_.size(); + model_num_ = model_cube_.size(); + model_block_val_.resize(model_num_,BDL_MAX); //初始化模型块体值为BDL_MAX + } + return 0; +} \ No newline at end of file diff --git a/src/disp_help.cpp b/src/disp_help.cpp new file mode 100644 index 0000000..fa34431 --- /dev/null +++ b/src/disp_help.cpp @@ -0,0 +1,329 @@ +#include "disp_help.h" + +void DispHelp::addHeadInfo(string s1,string s2,string s3,string s4) +{ + ex_name = s1; version = s2; descript = s3; author = s4; + return; +} + +void DispHelp::addUsage(string usg) +{ + usages.push_back(usg); + return; +} + +void DispHelp::addOption(string msg,string sflag,string lflag) +{ + option tmp_option; + tmp_option.message = msg; tmp_option.flag_s = sflag; tmp_option.flag_l = lflag; + options.push_back(tmp_option); + return; +} + +void DispHelp::addOptionSec(string msg,int index) +{ + if (index < 0) + { + options.back().sec_message.push_back(msg); + } + else options[index].sec_message.push_back(msg); + return; +} + +void DispHelp::addExample(string ex) +{ + examples.push_back(ex); + return; +} + +void DispHelp::changeLayerOut(int left,int right) +{ + front_space = left; back_space = right; + return; +} + +void DispHelp::show() +{ + int line_length; + string segment,full_message; + stringstream ss_message; + //获取终端窗口的行列数 + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + //显示头信息 + full_message = ex_name + " " + version + " - " + descript; + ss_message.clear(); ss_message.str(full_message); + + line_length = front_space + back_space; + while(ss_message >> segment) + { + if ((line_length+segment.length()+1) <= w.ws_col) + { + if (line_length == (front_space + back_space)) + { + for (int i = 0; i < front_space; i++) clog << " "; + clog << segment << " "; + line_length += (segment.length()+1); + } + else + { + clog << segment << " "; + line_length += (segment.length()+1); + } + } + else + { + clog << endl; + for (int i = 0; i < front_space+4; i++) clog << " "; + clog << segment << " "; + line_length = (segment.length()+9+front_space+back_space); + } + } + clog << endl; + + ss_message.clear(); ss_message.str(author); + line_length = front_space + back_space;; + while(ss_message >> segment) + { + if ((line_length+segment.length()+1) <= w.ws_col) + { + if (line_length == (front_space + back_space)) + { + for (int i = 0; i < front_space; i++) clog << " "; + clog << "Author: " << segment << " "; + line_length += (segment.length()+9); + } + else + { + clog << segment << " "; + line_length += (segment.length()+1); + } + } + else + { + clog << endl; + for (int i = 0; i < front_space+4; i++) clog << " "; + clog << segment << " "; + line_length = (segment.length()+9+front_space+back_space); + } + } + clog << endl; + + if (!usages.empty()) + { + for (int i = 0; i < front_space; i++) clog << " "; + clog << "Usage:" << endl; + for (int i = 0; i < usages.size(); i++) + { + ss_message.clear(); ss_message.str(usages[i]); + + line_length = front_space + back_space + 4; + while(ss_message >> segment) + { + if ((line_length+segment.length()+1) <= w.ws_col) + { + if (line_length == (front_space+back_space+4)) + { + for (int i = 0; i < front_space+4; i++) clog << " "; + clog << segment << " "; + line_length += (segment.length()+1); + } + else + { + clog << segment << " "; + line_length += (segment.length()+1); + } + } + else + { + clog << endl; + for (int i = 0; i < front_space+9; i++) clog << " "; + clog << segment << " "; + line_length = (segment.length()+10+front_space+back_space); + } + } + clog << endl; + } + } + + if (!options.empty()) + { + for (int i = 0; i < front_space; i++) clog << " "; + clog << "Options:" << endl; + for (int i = 0; i < options.size(); i++) + { + if (options[i].flag_l == "") + { + full_message = options[i].flag_s+" : "+options[i].message; + ss_message.clear(); ss_message.str(full_message); + + line_length = front_space + back_space + 4; + while(ss_message >> segment) + { + if ((line_length+segment.length()+1) <= w.ws_col) + { + if (line_length == (front_space+back_space+4)) + { + for (int i = 0; i < front_space+4; i++) clog << " "; + clog << segment << " "; + line_length += (segment.length()+1); + } + else + { + clog << segment << " "; + line_length += (segment.length()+1); + } + } + else + { + clog << endl; + for (int i = 0; i < front_space+9; i++) clog << " "; + clog << segment << " "; + line_length = (segment.length()+10+front_space+back_space); + } + } + clog << endl; + + if (!options[i].sec_message.empty()) + { + for (int j = 0; j < options[i].sec_message.size(); j++) + { + ss_message.clear(); ss_message.str(options[i].sec_message[j]); + + line_length = front_space + back_space + 9; + while(ss_message >> segment) + { + if ((line_length+segment.length()+1) <= w.ws_col) + { + if (line_length == (front_space+back_space+9)) + { + for (int i = 0; i < front_space+9; i++) clog << " "; + clog << segment << " "; + line_length += (segment.length()+1); + } + else + { + clog << segment << " "; + line_length += (segment.length()+1); + } + } + else + { + clog << endl; + for (int i = 0; i < front_space+13; i++) clog << " "; + clog << segment << " "; + line_length = (segment.length()+14+front_space+back_space); + } + } + clog << endl; + } + } + } + else + { + full_message = options[i].flag_s+" | "+options[i].flag_l+" : "+options[i].message; + ss_message.clear(); ss_message.str(full_message); + + line_length = front_space + back_space + 4; + while(ss_message >> segment) + { + if ((line_length+segment.length()+1) <= w.ws_col) + { + if (line_length == (front_space+back_space+4)) + { + for (int i = 0; i < front_space+4; i++) clog << " "; + clog << segment << " "; + line_length += (segment.length()+1); + } + else + { + clog << segment << " "; + line_length += (segment.length()+1); + } + } + else + { + clog << endl; + for (int i = 0; i < front_space+9; i++) clog << " "; + clog << segment << " "; + line_length = (segment.length()+10+front_space+back_space); + } + } + clog << endl; + + if (!options[i].sec_message.empty()) + { + for (int j = 0; j < options[i].sec_message.size(); j++) + { + ss_message.clear(); ss_message.str(options[i].sec_message[j]); + + line_length = front_space + back_space + 9; + while(ss_message >> segment) + { + if ((line_length+segment.length()+1) <= w.ws_col) + { + if (line_length == (front_space+back_space+9)) + { + for (int i = 0; i < front_space+9; i++) clog << " "; + clog << segment << " "; + line_length += (segment.length()+1); + } + else + { + clog << segment << " "; + line_length += (segment.length()+1); + } + } + else + { + clog << endl; + for (int i = 0; i < front_space+13; i++) clog << " "; + clog << segment << " "; + line_length = (segment.length()+14+front_space+back_space); + } + } + clog << endl; + } + } + } + } + } + + if (!examples.empty()) + { + for (int i = 0; i < front_space; i++) clog << " "; + clog << "Examples:" << endl; + for (int i = 0; i < examples.size(); i++) + { + ss_message.clear(); ss_message.str(examples[i]); + + line_length = front_space + back_space + 4; + while(ss_message >> segment) + { + if ((line_length+segment.length()+1) <= w.ws_col) + { + if (line_length == (front_space+back_space+4)) + { + for (int i = 0; i < front_space+4; i++) clog << " "; + clog << segment << " "; + line_length += (segment.length()+1); + } + else + { + clog << segment << " "; + line_length += (segment.length()+1); + } + } + else + { + clog << endl; + for (int i = 0; i < front_space+9; i++) clog << " "; + clog << segment << " "; + line_length = (segment.length()+10+front_space+back_space); + } + } + clog << endl; + } + } + return; +} \ No newline at end of file diff --git a/src/disp_help.h b/src/disp_help.h new file mode 100644 index 0000000..afa6ca3 --- /dev/null +++ b/src/disp_help.h @@ -0,0 +1,56 @@ +#ifndef _DISPHELP_H +#define _DISPHELP_H +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "vector" + +using namespace std; + +typedef vector strArray; + +struct option +{ + string flag_s,flag_l; + string message; + strArray sec_message; + option() + { + flag_s = flag_l = message = ""; + } +}; +typedef vector