initial upload
This commit is contained in:
145
gm3d/add_interface_block.cpp
Normal file
145
gm3d/add_interface_block.cpp
Normal file
@@ -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;
|
||||
}
|
Reference in New Issue
Block a user