📄 dlgfgw.cpp
字号:
//删除当前列表框中的记录数据
void CDLGFGW::OnDelitem()
{
int PreSelIndex;
int n=0;
n=m_pelist.GetItemCount();
if(n==0)
{ SaveData();
return;
}
else if(m_pelist.GetSelectedCount()==0 && m_countlist.GetSelectedCount()==0) //两个列表框中均无被选择的列表项
{
MessageBox("请再两个列表中的任何一个选择要删除的记录","警告");
return;
}
else if(m_countlist.GetSelectedCount()!=0)
PreSelIndex=m_pelist.GetSelectionMark();
else if(m_pelist.GetSelectedCount()!=0)
PreSelIndex=m_countlist.GetSelectionMark();
m_pelist.DeleteItem(PreSelIndex);
m_countlist.DeleteItem(PreSelIndex);
OnRecount();
}
//重新计算原始数据列表框中的所有条目并把结果写入结果框中
void CDLGFGW::OnRecount()
{
DOUBLE resultwf=0;
DOUBLE resulttf=0;
DOUBLE result=0;
CString str="0";
BG prebg;
ClearSum();
m_countlist.DeleteAllItems();
int n=m_pelist.GetItemCount();
if(n==0)
{m_sumwf=0; m_sumtf=0;}
for(int i=0;i<n;i++)
{
str=m_pelist.GetItemText(i,0);
m_countlist.InsertItem(i,str); //方格号
prebg.b=atof(m_pelist.GetItemText(i,1));
prebg.h=atof(m_pelist.GetItemText(i,2));
prebg.bg0=atof(m_pelist.GetItemText(i,3));
prebg.lefttop=atof(m_pelist.GetItemText(i,4));
prebg.righttop=atof(m_pelist.GetItemText(i,5));
prebg.rightbuttom=atof(m_pelist.GetItemText(i,6));
prebg.leftbuttom=atof(m_pelist.GetItemText(i,7));
INT styleid=GetCountStyle(prebg);
if(m_countstyle==0) //四棱柱体积法
{
resultwf=CountValue(prebg);
resulttf=CountValueTF(prebg);
}
else
{
result=CountValueAVE(prebg);
if(result>=0) {resultwf=result; resulttf=0;}
else {resultwf=0;resulttf=result; }
}
if(styleid==0) str="四挖";
else if(styleid==1) str="三挖一填";
else if(styleid==2) str="两挖两填(边)";
else if(styleid==3) str="两挖两填(角)";
else if(styleid==4) str="三填一挖";
else if(styleid==5) str="四填";
else if(styleid==-1) str="未知";
m_countlist.SetItem(i,1,LVIF_TEXT,str,0,0,0,0); //计算方法
if(resultwf>0 && resulttf==0)
{
str="挖方";
sumwf=sumwf+resultwf;
m_sumwf=sumwf;
}
else if(resulttf<0 && resultwf==0)
{
str="填方";
sumtf=sumtf+resulttf;
m_sumtf=sumtf;
}
else if(resulttf<0 && resultwf>=0)
{
str="挖填方";
sumtf=sumtf+resulttf;
sumwf=sumwf+resultwf;
m_sumtf=sumtf;
m_sumwf=sumwf;
}
else str="无挖填";
m_countlist.SetItem(i,2,LVIF_TEXT,str,0,0,0,0); //挖填方
str.Format("%6.2f",resultwf);
m_countlist.SetItem(i,3,LVIF_TEXT,str,0,0,0,0); //挖方量
str.Format("%6.2f",resulttf);
m_countlist.SetItem(i,4,LVIF_TEXT,str,0,0,0,0); //填方量
str="已再计算";
m_countlist.SetItem(i,5,LVIF_TEXT,str,0,0,0,0); //备注
}//end for
m_sumitems=m_pelist.GetItemCount();
CDLGFGW::UpdateData(FALSE);
}
//从文件中导入已保存的数据内容并写入列表框中
void CDLGFGW::ImporData()
{
int n=0;
CString str="";
ifstream readdata;
FGWDATA gcitems;
char ch[60]="";
//m_pelist.DeleteAllItems();
try
{
readdata.open("fgwdata",ios::in);
if(!readdata)
MessageBox("打开文件fgwdata用于读取方格网原始数据值时出错","错误",MB_OK);
else
{
while(!readdata.eof())
{
readdata>>gcitems.ID;
readdata>>gcitems.fgw.b>>gcitems.fgw.h>>gcitems.fgw.bg0>>gcitems.fgw.lefttop>>gcitems.fgw.righttop>>gcitems.fgw.rightbuttom>>gcitems.fgw.leftbuttom;
readdata>>ch;
gcitems.strdemo=ch;
if(gcitems.strdemo=="") break;
n=m_pelist.GetItemCount();
str.Format("%4d",gcitems.ID);
m_pelist.InsertItem(n,str); //方格号
str.Format("%6.3f",gcitems.fgw.b);
m_pelist.SetItem(n,1,LVIF_TEXT,str,0,0,0,0); //方格长
str.Format("%6.3f",gcitems.fgw.h);
m_pelist.SetItem(n,2,LVIF_TEXT,str,0,0,0,0); //方格宽
str.Format("%6.3f",gcitems.fgw.bg0);
m_pelist.SetItem(n,3,LVIF_TEXT,str,0,0,0,0); //平基标高
str.Format("%6.3f",gcitems.fgw.lefttop);
m_pelist.SetItem(n,4,LVIF_TEXT,str,0,0,0,0); //方格左上角标高
str.Format("%6.3f",gcitems.fgw.righttop);
m_pelist.SetItem(n,5,LVIF_TEXT,str,0,0,0,0); //方格右上角标高
str.Format("%6.3f",gcitems.fgw.rightbuttom);
m_pelist.SetItem(n,6,LVIF_TEXT,str,0,0,0,0); //方格右下角标高
str.Format("%6.3f",gcitems.fgw.leftbuttom);
m_pelist.SetItem(n,7,LVIF_TEXT,str,0,0,0,0); //方格左下角标高
if(gcitems.strdemo=="") gcitems.strdemo="备注";
m_pelist.SetItem(n,8,LVIF_TEXT,gcitems.strdemo,0,0,0,0); //方格左上角标高
}
readdata.close();
}
}
catch(...)
{
MessageBox("打开文件fgwdata用于读取方格网原始数据值时出错","错误",MB_OK);
}
}
//重新计算原始数据表中的数据并写入结果列表框中
void CDLGFGW::CountList()
{
}
//将当前的原始数据列表框中的内容保存到列表框中
void CDLGFGW::SaveData()
{
ofstream writedata;
FGWDATA gcitems;
//退出时保存各值
CString Prev=_T("");
int n=m_pelist.GetItemCount();
///if(n==0)
//if(n==0) return;
try
{
writedata.open("fgwdata",ios::out);
if(!writedata)
MessageBox("打开文件fgwdata用于保存新设置的参数值时出错","错误",MB_OK);
else
{
for( int i=0;i<n;i++)
{ gcitems.ID=atoi(m_pelist.GetItemText(i,0));
gcitems.fgw.b=atof(m_pelist.GetItemText(i,1));
gcitems.fgw.h=atof(m_pelist.GetItemText(i,2));
gcitems.fgw.bg0= atof(m_pelist.GetItemText(i,3));
gcitems.fgw.lefttop=atof(m_pelist.GetItemText(i,4));
gcitems.fgw.righttop= atof(m_pelist.GetItemText(i,5));
gcitems.fgw.rightbuttom= atof(m_pelist.GetItemText(i,6));
gcitems.fgw.leftbuttom=atof(m_pelist.GetItemText(i,7));
gcitems.strdemo=m_pelist.GetItemText(i,8);
if(gcitems.strdemo=="") gcitems.strdemo="备注";
writedata<<gcitems.ID<<"\n";
writedata<<gcitems.fgw.b<<" "<<gcitems.fgw.h<<" ";
writedata<<gcitems.fgw.bg0<<" "<<gcitems.fgw.lefttop<<" ";
writedata<<gcitems.fgw.righttop<<" "<<gcitems.fgw.rightbuttom<<" ";
writedata<<gcitems.fgw.leftbuttom<<"\n";
writedata<<gcitems.strdemo;
if(i<n-1)
writedata<<"\n";
}//end for
}
writedata.close();
}
catch(...)
{
MessageBox("打开文件fgwdata用于保存新设置的参数值时出错","错误",MB_OK);
}
}
//计算当前方格方量值(仅挖方),返回负为填方,返回正为挖方参数为方格有关参数结构体
DOUBLE CDLGFGW::CountValue(BG Prebg)
{
DOUBLE V=0;
CString str="";
int style=0;
DOUBLE id1=Prebg.lefttop-Prebg.bg0 ;
DOUBLE id2=Prebg.righttop-Prebg.bg0 ;
DOUBLE id3=Prebg.rightbuttom-Prebg.bg0;
DOUBLE id4=Prebg.leftbuttom-Prebg.bg0 ;
if(fabs(id1)+fabs(id2)+fabs(id3)+fabs(id4)<0.0001) return 0;
if(m_countstyle==0) //四棱柱体积法
{
style=GetCountStyle(Prebg);
switch(style)
{
case 0: //四挖
V=((Prebg.lefttop+Prebg.righttop+Prebg.rightbuttom+Prebg.leftbuttom)/4-Prebg.bg0)*Prebg.b*Prebg.h;
break;
case 1: //三挖一填
{
if(id1<0) V=(Prebg.b*Prebg.h/4)*(id2+id3+id4)*(id2+id3+id4)/(fabs(id1)+id2+id3+id4);
else if(id2<0) V=(Prebg.b*Prebg.h/4)*(id1+id3+id4)*(id1+id3+id4)/(id1+fabs(id2)+id3+id4);
else if(id3<0) V=(Prebg.b*Prebg.h/4)*(id1+id2+id4)*(id1+id2+id4)/(id1+id2+fabs(id3)+id4);
else if(id4<0) V=(Prebg.b*Prebg.h/4)*(id1+id2+id3)*(id1+id2+id3)/(id1+id2+id3+fabs(id4));
V=fabs(V);
break;
}
case 2: //两挖两填(边)
if(id1<0 && id2<0) V=(Prebg.b*Prebg.h/4)*(id3+id4)*(id3+id4)/(fabs(id1+id2)+id3+id4);
else if(id1<0 && id3<0) V=(Prebg.b*Prebg.h/4)*(id2+id4)*(id2+id4)/(fabs(id1)+id2+fabs(id3)+id4);
else if(id1<0 && id4<0) V=(Prebg.b*Prebg.h/4)*(id2+id3)*(id2+id3)/(fabs(id1)+id2+id3+fabs(id4));
else if(id2<0 && id3<0) V=(Prebg.b*Prebg.h/4)*(id1+id4)*(id1+id4)/(id1+fabs(id2)+fabs(id3)+id4);
else if(id2<0 && id4<0) V=(Prebg.b*Prebg.h/4)*(id1+id3)*(id1+id3)/(id1+fabs(id2)+id3+fabs(id4));
else if(id3<0 && id4<0) V=(Prebg.b*Prebg.h/4)*(id1+id2)*(id1+id2)/(id1+id2+fabs(id3)+fabs(id4));
V=fabs(V);
break;
case 3: //两挖两填(角)
if(id1<0 && id2<0) V=(Prebg.b*Prebg.h/4)*(id3+id4)*(id3+id4)/(fabs(id1+id2)+id3+id4);
else if(id1<0 && id3<0) V=(Prebg.b*Prebg.h/4)*(id2+id4)*(id2+id4)/(fabs(id1)+id2+fabs(id3)+id4);
else if(id1<0 && id4<0) V=(Prebg.b*Prebg.h/4)*(id2+id3)*(id2+id3)/(fabs(id1)+id2+id3+fabs(id4));
else if(id2<0 && id3<0) V=(Prebg.b*Prebg.h/4)*(id1+id4)*(id1+id4)/(id1+fabs(id2)+fabs(id3)+id4);
else if(id2<0 && id4<0) V=(Prebg.b*Prebg.h/4)*(id1+id3)*(id1+id3)/(id1+fabs(id2)+id3+fabs(id4));
else if(id3<0 && id4<0) V=(Prebg.b*Prebg.h/4)*(id1+id2)*(id1+id2)/(id1+id2+fabs(id3)+fabs(id4));
V=fabs(V);
break;
case 4: //三填一挖
if(id1>0) V=(Prebg.b*Prebg.h/4)*(id1)*(id1)/(id1+fabs(id2+id3+id4));
else if(id2>0) V=(Prebg.b*Prebg.h/4)*(id2)*(id2)/(fabs(id1+id3+id4)+id2);
else if(id3>0) V=(Prebg.b*Prebg.h/4)*(id3)*(id3)/(fabs(id1+id2+id4)+id3);
else if(id4>0) V=(Prebg.b*Prebg.h/4)*(id4)*(id4)/(fabs(id1+id2+id3)+id4);
V=fabs(V);
break;
case 5: //四填
V=0;
break;
case 6: //未知计算方法
V=((Prebg.lefttop+Prebg.righttop+Prebg.rightbuttom+Prebg.leftbuttom)/4-Prebg.bg0)*Prebg.b*Prebg.h;
V=fabs(V);
break;
default:
break;
}//end switch
}//end if(countstyle==0)
str.Format("%9.3f",V);
V=atof(str);
return V;
}
//使累加方量回原0
void CDLGFGW::ClearSum()
{
m_sumwf=0;
m_sumtf=0;
sumtf=0;
sumwf=0;
}
//得到当前方格的计算方法:
//返回值:0:四挖,1:三挖一填;2:两挖两填(边);3:两挖两填(对角);4:三填一挖;5:四挖
INT CDLGFGW::GetCountStyle(BG PreBg)
{
DOUBLE id1=PreBg.lefttop-PreBg.bg0 ;
DOUBLE id2=PreBg.righttop-PreBg.bg0 ;
DOUBLE id3=PreBg.rightbuttom-PreBg.bg0;
DOUBLE id4=PreBg.leftbuttom-PreBg.bg0 ;
if(id1>=0 && id2>=0 && id3>=0 && id4>=0 ) return 0;
else if((id1>=0 && id2>=0 && id3>=0 && id4<0)||
(id1>=0 && id2>=0 && id3<0 && id4>=0)||
(id1>=0 && id2<0 && id3>=0 && id4>=0)||
(id1<0 && id2>=0 && id3>=0 && id4>=0))
return 1;
else if((id1>=0 && id2>=0 && id3<0 && id4<0)||
(id2>=0 && id3>=0 && id1<0 && id4<0)||
(id3>=0 && id4>=0 && id1<0 && id2<0)||
(id1>=0 && id4>=0 && id2<0 && id3<0))
return 2;
else if((id1>=0 && id2<0 && id3>=0 && id4<0)||
(id1<0 && id2>=0 && id3<0 && id4>=0))
return 3;
else if((id1<0 && id2<0 && id3<0 && id4>=0)||
(id1<0 && id2<0 && id3>=0 && id4<0)||
(id1<0 && id2>=0 && id3<0 && id4<0)||
(id1>=0 && id2<0 && id3<0 && id4<0))
return 4;
else if(id1<0 && id2<0 && id3<0 && id4<0 ) return 5;
else
{
MessageBox("没有判断出当前方格的计算方法","提示");
return 6;
}
}
//退出时提示是否保存当前值
void CDLGFGW::OnOK()
{
ofstream writedata;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -