Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

1410 lines
33 KiB
C++

#include "stdafx.h"
#include "FGBZDlg.h"
#include "DuctlineTools.h"
#include "uihistory.h"
#ifndef ID_USER_MENU
#define ID_USER_MENU 10000
#endif
extern double MayAsMUnit(double dVal);
double AsMMUnit(double dVal)
{
struct resbuf rb;
acedGetVar(_T("INSUNITS"), &rb);
if (rb.resval.rint == AcDb::kUnitsMeters)
{
dVal *= 1000;
}
return dVal;
}
IMPLEMENT_DYNAMIC(CFGBZDlg, CDialog)
CFGBZDlg::CFGBZDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFGBZDlg::IDD, pParent)
, m_dTopEl(0.0)
, m_sProvider(_T("宁波伊斯特通风工程有限公司"))
, m_sDuctUse(_T("送风"))
, m_sMat(_T("镀锌钢板"))
, m_nSecType(0)
, m_dt(5.0)
, m_dRatio(1.0)
, m_nAlign(1)//中
, m_sNo(_T("FG-001"))
, m_dCenEl(0)
{
m_pDbServer = NULL;
m_csFlux = _T("");
m_csHeight = _T("300");
m_csWidth = _T("630");
m_eOffsetFirst = AecHvac::eObliqueLink; // 乙字弯优先类型
m_eOffsetSec = AecHvac::eArcuateLink; // 乙字弯其次类型
m_csOffCalType = _T("曲率");
m_dOffsetAngle = 90.0; // 乙字弯角度
m_dOffsetRatio = 1.0; // 乙字弯曲率倍数
m_eElbowTypeR = AecHvac::eAllArcuate; // 矩形弯头默认类型
m_eElbowTypeC = AecHvac::eAllArcuate; // 圆形弯头默认类型
m_dElbowRatio = 1.0; // 弯头曲率
m_nElbowXiaMi = 3;
m_dDencity = 1.2; // 密度
m_eTeeTypeR = AecHvac::eArcuateBranch; // 矩形三通默认类型
m_eTeeTypeC = AecHvac::eArcuateBranch; // 圆形三通默认类型
m_dTeeRatio = 1.0; // 三通曲率
m_dTeeAngle = 90.0; // 三通角度
m_eCrossTypeR = AecHvac::eArcuateCross; // 矩形四通默认类型
m_eCrossTypeC = AecHvac::eArcuateCross; // 圆形四通默认类型
m_dCrossRatio = 1.0; // 四通曲率
m_dCrossAngle = 90.0; // 四通角度
m_csReduceCalType = _T("自动计算"); // 变径长度计算方法
m_dReduceLength = 1000.0; // 变径长度
m_dReduceAnlge = 30.0; // 变径角度
m_eFlangeType = AecHvac::eHanJieLine; // 焊接法兰
m_dPlusEdge = 50.0;
m_dV = 0.0;
m_dPy = 0.0;
m_dR = 0.0;
m_dElOld = 0;
//
m_bEnableAlign = TRUE;
m_bEleReadOnly = FALSE;
m_bLoadLast = FALSE;
m_bLock = false;
GET_CACHE(CFGBZDlg
, %s%s%d%s%s%s%f%f%d%f%s%s
, &m_sDuctUse
, &m_sMat
, &m_nSecType
, &m_csFlux
, &m_csWidth
, &m_csHeight
, &m_dt
, &m_dRatio
, &m_nAlign
, &m_dTopEl
, &m_sNo
, &m_sProvider);
}
CFGBZDlg::~CFGBZDlg()
{
}
void CFGBZDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDT_SECTWIDTH, m_csWidth);
DDX_Text(pDX, IDC_EDT_SECTHEIGHT, m_csHeight);
DDX_Text(pDX, IDC_EDIT2, m_dTopEl);
DDX_Text(pDX, IDC_EDIT1, m_sProvider);
DDX_CBString(pDX, IDC_CMB_PIPETYPE, m_sDuctUse);
DDX_CBString(pDX, IDC_CMB_PIPEMATERIAL, m_sMat);
DDX_CBIndex(pDX, IDC_CMB_SECT, m_nSecType);
DDX_Text(pDX, IDC_EDT_SECTWIDTH2, m_dt);
DDX_Text(pDX, IDC_EDIT5, m_dRatio);
DDX_Text(pDX, IDC_EDT_FLUX, m_csFlux);
DDX_Text(pDX, IDC_EDIT3, m_sNo);
DDX_Control(pDX, IDC_BTN_FLUX, m_wndBtnSTFlux);
DDX_Control(pDX, IDC_BTN_POP_DN_MENU, m_wndBtnPopDnMenu);
DDX_Control(pDX, IDC_LST_HEIGHT, m_wndLstHeight);
DDX_Control(pDX, IDC_LST_WIDTH, m_wndLstWidth);
DDX_Control(pDX, IDC_CMB_SECT, m_wndCmbSect);
DDX_Control(pDX, IDC_CMB_PIPETYPE, m_wndCmbPipeType);
DDX_Control(pDX, IDC_CMB_PIPEMATERIAL, m_wndCmbPipeMaterial);
DDX_CBIndex(pDX, IDC_COMBO1, m_nAlign);
DDX_Control(pDX, IDC_COMBO1, m_wndAlignCombo);
DDX_Control(pDX, IDC_EDIT2, m_wndEditEl);
DDX_Text(pDX, IDC_EDIT4, m_dCenEl);
}
BEGIN_MESSAGE_MAP(CFGBZDlg, CDialog)
ON_BN_CLICKED(IDOK, &CFGBZDlg::OnBnClickedOk)
ON_COMMAND(IDM_KG_H, OnKgH)
ON_COMMAND(IDM_KG_S, OnKgS)
ON_COMMAND(IDM_L_H, OnLH)
ON_COMMAND(IDM_L_S, OnLS)
ON_COMMAND(IDM_COBE_S, OnCobeS)
ON_COMMAND(IDM_COBE_H, OnCobeH)
ON_BN_CLICKED(IDC_BTN_POP_DN_MENU, &CFGBZDlg::OnBnClickedBtnPopDnMenu)
ON_BN_CLICKED(IDC_BUT_CHANGE, &CFGBZDlg::OnBnClickedButChange)
ON_EN_CHANGE(IDC_EDT_SECTWIDTH, OnChangeEdtSectWidth)
ON_EN_CHANGE(IDC_EDT_SECTHEIGHT, OnChangeEdtSectHeight)
ON_NOTIFY(NM_CLICK, IDC_LST_HEIGHT, OnClickLstHeight)
ON_NOTIFY(NM_CLICK, IDC_LST_WIDTH, OnClickLstWidth)
ON_CBN_SELCHANGE(IDC_CMB_SECT, &CFGBZDlg::OnSelchangeCmbSect)
ON_EN_CHANGE(IDC_EDIT2, &CFGBZDlg::OnEnChangeEdit2)
ON_BN_CLICKED(IDC_BUTTON1, &CFGBZDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
BOOL CFGBZDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_pDbServer = new CUIISQLiteServer;
if ( !DuctlineTools::getSqliteDB(_T("HvacConfig.db"), *m_pDbServer))
{
AfxMessageBox(_T("未找到数据库文件HvacConfig.db,请重新安装!"));
delete m_pDbServer;
return FALSE;
}
// 风量
m_wndBtnSTFlux.SetMenu(IDM_FLUX_DUCT, m_hWnd);
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(m^3/h):"));
m_eFluxType = eCobeH;
m_csFlux = _T("1000.0");
m_dFlux = 1000.0;
// 截面宽、高
//m_csHeight = _T("300");
//m_csWidth = _T("630");
CString csSQL;
csSQL.Format(_T("SELECT DISTINCT [KEY], [VALUE] FROM %s"), _T("OtherConfig"));
m_pDbServer->GetSelData(csSQL, m_mapCfg);
m_wndBtnPopDnMenu.SetIcon(IDI_LAST_ROW);
m_wndBtnPopDnMenu.SetFlat(FALSE);
m_wndAlignCombo.EnableWindow(m_bEnableAlign);
m_wndEditEl.SetReadOnly(m_bEleReadOnly);
if (m_bLock)//锁定标高
{
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
}
UpdateData(FALSE);
OnSelchangeCmbSect();
// 设置截面尺寸列表状态
OnChangeEdtSectWidth();
if (m_nSecType == 0)//矩形
{
OnChangeEdtSectHeight();
}
CheckSysParameter();
if (m_nSecType == 0)//矩形
{
m_dCenEl = m_dTopEl - 0.5 * _ttof(m_csHeight);
}
else
{
m_dCenEl = m_dTopEl - 0.5 * _ttof(m_csWidth);
}
UpdateData(FALSE);
return TRUE;
}
void CFGBZDlg::OnBnClickedOk()
{
UpdateData(TRUE);
SET_CACHE(CFGBZDlg
, %s%s%d%s%s%s%f%f%d%f%s%s
, m_sDuctUse
, m_sMat
, m_nSecType
, m_csFlux
, m_csWidth
, m_csHeight
, m_dt
, m_dRatio
, m_nAlign
, m_dTopEl
, m_sNo
, m_sProvider);
OnOK();
}
void CFGBZDlg::EnableLoadLast(BOOL bLoadLast)
{
m_bLoadLast = bLoadLast;
}
void CFGBZDlg::SetEleReadOnly(BOOL bEleReadOnly,double dEl)
{
m_bEleReadOnly = bEleReadOnly;
m_dTopEl = dEl;
}
void CFGBZDlg::GetPipeParam(AecHvac::DuctParam* pParam)
{
/*
typedef struct DuctParam
{
ESection eType; //截面类型
double dSize[9];//尺寸 宽度,高度,厚度
int m_nAlign;//对其方式
double m_dEl; //标高
double m_dRatio;//曲率半径
int m_bCover; //盖板 桥架用
int m_bSpart; //隔板 桥架用
TCHAR szNo[33]; //编号
TCHAR szMat[33];//材质
TCHAR szFat[33];//厂家
TCHAR szType[33]//类型
TCHAR szExt[33];//其他
}DUCTPARAM;
*/
if (pParam != NULL)
{
memset(pParam,0,sizeof(AecHvac::DuctParam));
pParam->eType = (ESection)(m_nSecType+1);
pParam->dSize[0] = MayAsMUnit(_ttof(m_csWidth));
pParam->dSize[1] = MayAsMUnit(_ttof(m_csHeight));
pParam->dSize[2] = MayAsMUnit(m_dt);
pParam->m_nAlign = m_nAlign;
if (m_bLock)
{
pParam->m_dEl = m_dElOld;
}
else
{
//存为中心标高
if (pParam->eType == eCircle)
pParam->m_dEl = m_dTopEl - 0.5 * pParam->dSize[0];
else
pParam->m_dEl = m_dTopEl - 0.5 * pParam->dSize[1];
}
pParam->m_dRatio = m_dRatio;
pParam->m_bCover = 1;
pParam->m_bSpart = 0;
pParam->m_bCenDraw = 1;//绘制中心线
pParam->m_dFullPer = 0;
pParam->m_dPlusEdge = MayAsMUnit(m_dPlusEdge);
pParam->iALUnit = (int)m_eFluxType;
pParam->dAirload = m_dFlux;
pParam->m_dV = m_dV;
// 比摩阻
pParam->m_dR = m_dR;
// 沿层阻力
pParam->m_dPy = m_dPy;
_tcscpy(pParam->szNo,m_sNo);
_tcscpy(pParam->szMat,m_sMat);
_tcscpy(pParam->szFat,m_sProvider);
_tcscpy(pParam->szType,m_sDuctUse);//
_tcscpy(pParam->szSys,m_sDuctUse);
_tcscpy(pParam->szRem,_T(""));
}
}
void CFGBZDlg::SetShowParam(const AecHvac::DuctParam& param)
{
double dSize[9];
memcpy(dSize,param.dSize,sizeof(double)*9);
for(int i = 0;i < 9;i++)
{
dSize[i] = AsMMUnit(param.dSize[i]);
}
m_nSecType = param.eType - 1;
m_csWidth.Format(_T("%d"),(int)(dSize[0] + 0.5) );
m_csHeight.Format(_T("%d"),(int)(dSize[1] + 0.5) );
m_dt = param.dSize[2];
m_nAlign = param.m_nAlign;
if (m_nSecType == 0)//矩形
{
m_dTopEl = param.m_dEl + 0.5 * dSize[1];
m_dCenEl = m_dTopEl - 0.5 * _ttof(m_csHeight);
}
else
{
m_dTopEl = param.m_dEl + 0.5 * dSize[0];
m_dCenEl = m_dTopEl - 0.5 * _ttof(m_csWidth);
}
m_dElOld = param.m_dEl;
m_dRatio = param.m_dRatio;
m_dPlusEdge = param.m_dPlusEdge;
m_sNo = param.szNo;
m_sMat = param.szMat;
m_sProvider = param.szFat;
m_sDuctUse = param.szType;
}
int CFGBZDlg::GetDataRange(CArray<SPipeColor, SPipeColor>& arPipeColor)
{
int iColor = 0;
BOOL bIsV = TRUE; // 流速
iColor == 0 ? bIsV = TRUE : bIsV = FALSE;
CString csSQL, csValue;
csSQL.Format(_T("SELECT DISTINCT [MINVALUE], [MAXVALUE], [COLOR] FROM %s WHERE [ISVELOCITY] = %d ORDER BY [MINVALUE]"), _T("RangeValue"), bIsV);
CUIIValueTable table;
int iCount = m_pDbServer->GetSelData(csSQL, table);
if (iCount > 0)
{
int i = 0;
for (i = 0; i < iCount; i++)
{
CUIIValueRecord arRecord;
table.GetValueRecord(i, arRecord); // 得到一行记录
CString scValue;
SPipeColor sData;
if (arRecord.GetValue(0, csValue))
sData.m_dMinVal = _tstof(csValue);
if (arRecord.GetValue(1, csValue))
sData.m_dMaxVal = _tstof(csValue);
if (arRecord.GetValue(2, csValue))
sData.m_iColorIdx = _ttoi(csValue);
arPipeColor.InsertAt(i, sData);
}
}
return iColor;
}
BOOL CFGBZDlg::GetMediumInfo(CString& csPressure, CString& csMedium, CString& csTemperature,
CString& csHumidity, CString& csDensity, CString& csStickiness)
{
BOOL bRet = TRUE;
bRet &= m_mapCfg.Lookup(_T("csPressure"), csPressure);
bRet &= m_mapCfg.Lookup(_T("csMedium"), csMedium);
bRet &= m_mapCfg.Lookup(_T("csTemperature"), csTemperature);
bRet &= m_mapCfg.Lookup(_T("csHumidity"), csHumidity);
bRet &= m_mapCfg.Lookup(_T("csDensity"), csDensity);
bRet &= m_mapCfg.Lookup(_T("csStickiness"), csStickiness);
return bRet;
}
void CFGBZDlg::CheckSysParameter(BOOL bInit)
{
// 寻找所有不同的宽高,并排序
CArray<SDuctSectSpec, SDuctSectSpec> arMatSpec;
m_arSizeRect.RemoveAll();
GetDuctSectSpecArray(arMatSpec, 0);
double dHeight = 0.0, dWidth = 0.0;
for (int i = 0; i < arMatSpec.GetSize(); i++)
{
dHeight = fabs(arMatSpec.GetAt(i).m_dHeight);
dWidth = fabs(arMatSpec.GetAt(i).m_dWidth);
for (int j = 0; j < m_arSizeRect.GetSize(); j++)
{
if (fabs(dHeight - m_arSizeRect.GetAt(j)) < 1.0)
{
break;
}
else if (dHeight < m_arSizeRect.GetAt(j))
{
m_arSizeRect.InsertAt(j, dHeight);
break;
}
}
if (j == m_arSizeRect.GetSize())
m_arSizeRect.Add(dHeight);
for (j = 0; j < m_arSizeRect.GetSize(); j++)
{
if (fabs(dWidth - m_arSizeRect.GetAt(j)) < 1.0)
{
break;
}
else if (dWidth < m_arSizeRect.GetAt(j))
{
m_arSizeRect.InsertAt(j, dWidth);
break;
}
}
if (j == m_arSizeRect.GetSize())
m_arSizeRect.Add(dWidth);
}
// 寻找所有不同的直径,并排序
arMatSpec.RemoveAll();
m_arSizeCir.RemoveAll();
GetDuctSectSpecArray(arMatSpec, 1);
for (i = 0; i < arMatSpec.GetSize(); i++)
{
dHeight = fabs(arMatSpec.GetAt(i).m_dHeight);
for (int j = 0; j < m_arSizeCir.GetSize(); j++)
{
if (fabs(dHeight - m_arSizeCir.GetAt(j)) < 1.0)
{
break;
}
else if ((dHeight - m_arSizeCir.GetAt(j)) < 1.0)
{
m_arSizeCir.InsertAt(j, dHeight);
break;
}
}
if (j == m_arSizeCir.GetSize())
m_arSizeCir.Add(dHeight);
}
CString csPre, csMed, csTem, csHumi, csDensity, csMoveVis;
GetMediumInfo(csPre, csMed, csTem, csHumi, csDensity, csMoveVis);
m_cHydraulic.SetDensity(_tstof(csDensity)); // 密度
m_cHydraulic.SetMoveVis(_tstof(csMoveVis) * 1.e-6); // 运动黏度
m_dDencity = _tstof(csDensity);
// 流速,R
m_nOption = GetDataRange(m_arPipeColor);
SetSectWidthList();
SetSectHeightList();
ReCalWidthVR();
ReCalHeightVR();
}
// 设置截面宽信息
void CFGBZDlg::SetSectWidthList()
{
CString sInfo;
if (0 == m_nOption)
sInfo = _T("V");
else
sInfo = _T("R");
// 填充截面宽列表信息
CStringArray arHeadWidth;
CByteArray arColsWidth;
arHeadWidth.Add(_T("宽(W)"));
arColsWidth.Add(58);
arHeadWidth.Add(sInfo);
arColsWidth.Add(42);
// 删除列表框中现有有列、数据
m_wndLstWidth.DeleteColumn(0);
m_wndLstWidth.DeleteColumn(0);
m_wndLstWidth.DeleteAllItems();
m_wndLstWidth.InitCtrl(&arHeadWidth, &arColsWidth);
// 初始化截面宽
CStringArray arItem;
CString csSize;
for (int i = 0; i < m_arSizeRect.GetSize(); i++)
{
arItem.RemoveAll();
csSize.Format(_T("%.0f"), m_arSizeRect.GetAt(i));
arItem.Add(csSize);
arItem.Add(_T("0.0"));
m_wndLstWidth.AddItem(&arItem);
}
}
// 设置截面高信息
void CFGBZDlg::SetSectHeightList()
{
CString sInfo;
if (0 == m_nOption)
sInfo = _T("V");
else
sInfo = _T("R");
// 填充截面高列表信息
CStringArray arHeadHeight;
CByteArray arColsHeight;
arHeadHeight.Add(_T("高(H)"));
arColsHeight.Add(58);
arHeadHeight.Add(sInfo);
arColsHeight.Add(42);
// 删除列表框中现有有列、数据
m_wndLstHeight.DeleteColumn(0);
m_wndLstHeight.DeleteColumn(0);
m_wndLstHeight.DeleteAllItems();
m_wndLstHeight.InitCtrl(&arHeadHeight, &arColsHeight);
// 初始化截面高数据
CStringArray arItem;
CString csSize;
for (int i = 0; i < m_arSizeRect.GetSize(); i++)
{
arItem.RemoveAll();
csSize.Format(_T("%.0f"), m_arSizeRect.GetAt(i));
arItem.Add(csSize);
arItem.Add(_T("0.0"));
m_wndLstHeight.AddItem(&arItem);
}
}
double CFGBZDlg::ChangeFluxTo(double dFluxOld, EFluxDesc eType, double dDencity)
{
if (dDencity < 1.0e-3)
return 0.0;
switch(eType)
{
case eKgH: // kg/h
return dFluxOld * dDencity;
case eKgS: // kg/s
return dFluxOld * dDencity / 3600.0;
case eCobeH: // m^3/h
return dFluxOld;
case eCobeS: // m^3/s
return dFluxOld / 3600.0;
case eLH: // L/h
return dFluxOld * 1000.0;
case eLS: // L/s
return dFluxOld / 3.6;
default:
break;
}
return 0.0;
}
// 根据当前输入的风量,换算成以(m^3/h)为单位
double CFGBZDlg::ChangeFluxBy(double dFluxOld, EFluxDesc eType, double dDencity)
{
if (dDencity < 1.0e-3)
return 0.0;
switch(eType)
{
case eKgH: // kg/h
return dFluxOld / dDencity;
case eKgS: // kg/s
return dFluxOld / dDencity * 3600.0;
case eCobeH: // m^3/h
return dFluxOld;
case eCobeS: // m^3/s
return dFluxOld * 3600.0;
case eLH: // L/h
return dFluxOld / 1000.0;
case eLS: // L/s
return dFluxOld * 3.6;
default:
break;
}
return 0.0;
}
// 要求arSize从小到大排列
double CFGBZDlg::GetNormalSize( const double &dSize, CArray<double, double>& arSize, BOOL bLittleHigh )
{
double dRetSize(0.0);
for (int i = 0; i < (int)arSize.GetSize(); i++)
{
if (arSize.GetAt(i) - dSize >= 0)
{
if (bLittleHigh)
dRetSize = arSize.GetAt(i);
else
{
if (i - 1 >= 0)
dRetSize = arSize.GetAt(i - 1);
else
dRetSize = arSize.GetAt(i);
}
break;
}
}
return dRetSize;
}
int CFGBZDlg::FindInsertIndex(double &dDifferArea, double &dBestArea, CArray<SDuctSectSpec, SDuctSectSpec>& arRmdSize)
{
int nInsertIndex(0);
int nCount = (int)arRmdSize.GetSize();
double dDiffer(0.0);
double dWidth(0.0), dHeight(0.0);
int i;
for (i = 0; i < nCount; i++)
{
dWidth = arRmdSize[i].m_dWidth;
dHeight = arRmdSize[i].m_dHeight;
dDiffer = fabs(dWidth * dHeight - dBestArea);
// 要插入的面积,小于数组元素的面积时,才此位置插入
if (dDifferArea < dDiffer)
{
nInsertIndex = i;
break;
}
}
// 没找到,插入的面积最大,放在最后,返回-1
if (i >= nCount)
return -1;
return nInsertIndex;
}
int CFGBZDlg::GetDuctSectSpecArray(CArray<SDuctSectSpec, SDuctSectSpec>& arMatSpec, const int iSect)
{
if (NULL == m_pDbServer)
return 0;
int iCount = 0;
arMatSpec.RemoveAll();
CString csSQL;
csSQL.Format(_T("SELECT DISTINCT [HEIGHT], [WIDTH] FROM %s WHERE [ISCIRCLE] = %d ORDER BY [HEIGHT]"), _T("DuctMaterial"), iSect);
CUIIValueTable table;
iCount = m_pDbServer->GetSelData(csSQL, table);
if (iCount > 0)
{
int i = 0;
for (i = 0; i < iCount; i++)
{
CUIIValueRecord record;
CString csValue;
SDuctSectSpec sData;
table.GetValueRecord(i, record);
if (record.GetValue(0, csValue))
sData.m_dHeight = _tstof(csValue);
if (record.GetValue(1, csValue))
sData.m_dWidth = _tstof(csValue);
arMatSpec.InsertAt(i, sData);
}
}
return iCount;
}
void CFGBZDlg::CalSizeByFlux()
{
m_dFlux = ChangeFluxBy(_tstof(m_csFlux), m_eFluxType, m_dDencity);
// 从数据库读入风管推荐风速(m/s)
CString sData(_T(""));
sData.Format(_T("SELECT [VALUE] FROM %s WHERE [KEY] = '%s'"), _T("OtherConfig"), _T("RecommendWindSpeed"));
if (m_pDbServer->GetSelData(sData, m_sRmdVg) <= 0)
m_sRmdVg = _T("8");
double dVg = _tstof(m_sRmdVg);
// 计算推荐管径dBestDn
double dBestDn(0.0);
dBestDn = sqrt( 4 * m_dFlux / (3600 * PI * dVg)) * 1000;
// 先计算圆形的推荐尺寸
int nMenuIndex(1);
double dlittleLow(0.0), dlittleHigh(0.0);
dlittleLow = GetNormalSize(dBestDn, m_arSizeCir, FALSE);
dlittleHigh = GetNormalSize(dBestDn, m_arSizeCir, TRUE);
if (dlittleHigh > 0.0)
{
if (dlittleLow != dlittleHigh)
{
sData.Format(_T("%.0f"), dlittleLow);
m_SizeMenu.AppendMenu(MF_STRING, ID_USER_MENU + nMenuIndex++, sData);
}
sData.Format(_T("%.0f"), dlittleHigh);
m_SizeMenu.AppendMenu(MF_STRING, ID_USER_MENU + nMenuIndex++, sData);
m_SizeMenu.AppendMenu(MF_SEPARATOR);
}
double dBestArea = m_dFlux / (3600 * dVg);
dBestArea *= 1000 * 1000;
// 读取矩形截面全部尺寸列表
CArray<SDuctSectSpec, SDuctSectSpec> arMatSpec;
arMatSpec.RemoveAll();
GetDuctSectSpecArray(arMatSpec, 0);
// 遍历尺寸列表,按与最佳面积的绝对差值排序
CArray<SDuctSectSpec, SDuctSectSpec> arRmdSize;
int i;
int nInsertIndex(0);
double dWidth(0.0), dHeight(0.0);
double dWidthTmp(0.0), dHeightTmp(0.0);
double dDiffer(0.0);
for (i = 0; i < (int)arMatSpec.GetSize(); i++)
{
dWidthTmp = arMatSpec[i].m_dWidth;
dHeightTmp = arMatSpec[i].m_dHeight;
// 尺寸要求: 宽大于高,宽高比不超过4:1
if (dWidthTmp < dHeightTmp || dWidthTmp > dHeightTmp * 4)
continue;
// 与最佳面积的绝对差值
dDiffer = fabs(dWidthTmp * dHeightTmp - dBestArea);
nInsertIndex = FindInsertIndex(dDiffer, dBestArea, arRmdSize);
if (nInsertIndex == -1)
arRmdSize.Add(arMatSpec[i]);
else
arRmdSize.InsertAt(nInsertIndex, arMatSpec[i]);
}
// 只要前四个差距最小的尺寸
for (i = 0; i < (int)arRmdSize.GetSize(); i++)
{
if ( i < 4 )
{
sData.Format(_T("%.0f*%.0f"), arRmdSize[i].m_dWidth, arRmdSize[i].m_dHeight);
m_SizeMenu.AppendMenu(MF_STRING, ID_USER_MENU + nMenuIndex++, sData);
}
else
break;
}
// 选中上一次选择的尺寸
CString csMenuText(_T(""));
for (i = 0; i < (int)m_SizeMenu.GetMenuItemCount(); i++)
{
m_SizeMenu.GetMenuString(ID_USER_MENU + i, csMenuText, MF_BYCOMMAND);
if (m_sRmdSize == csMenuText)
{
m_SizeMenu.CheckMenuItem(ID_USER_MENU + i, MF_CHECKED);
break;
}
}
}
void CFGBZDlg::SetFluxType( EFluxDesc eFluxDesc )
{
m_eFluxType = eFluxDesc;
switch(m_eFluxType)
{
case eKgH:
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(Kg/h):"));
break;
case eKgS:
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(Kg/s):"));
break;
case eCobeH:
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(m^3/h):"));
break;
case eCobeS:
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(m^3/s):"));
break;
case eLH:
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(L/h):"));
break;
default:
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(L/s):"));
break;
}
m_csFlux.Format(_T("%.3f"), ChangeFluxTo(m_dFlux, m_eFluxType, m_dDencity));
UpdateData(FALSE);
}
// 选择的单位是kg/h
void CFGBZDlg::OnKgH()
{
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(Kg/h):"));
m_eFluxType = eKgH;
m_csFlux.Format(_T("%.3f"), ChangeFluxTo(m_dFlux, m_eFluxType, m_dDencity));
UpdateData(FALSE);
}
// 选择的单位是kg/s
void CFGBZDlg::OnKgS()
{
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(Kg/s):"));
m_eFluxType = eKgS;
m_csFlux.Format(_T("%.3f"), ChangeFluxTo(m_dFlux, m_eFluxType, m_dDencity));
UpdateData(FALSE);
}
// 选择的单位是L/h
void CFGBZDlg::OnLH()
{
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(L/h):"));
m_eFluxType = eLH;
m_csFlux.Format(_T("%.3f"), ChangeFluxTo(m_dFlux, m_eFluxType, m_dDencity));
UpdateData(FALSE);
}
// 选择单位是L/s
void CFGBZDlg::OnLS()
{
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(L/s):"));
m_eFluxType = eLS;
m_csFlux.Format(_T("%.3f"), ChangeFluxTo(m_dFlux, m_eFluxType, m_dDencity));
UpdateData(FALSE);
}
// 选择单位是m^3/s
void CFGBZDlg::OnCobeS()
{
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(m^3/s):"));
m_eFluxType = eCobeS;
m_csFlux.Format(_T("%.3f"), ChangeFluxTo(m_dFlux, m_eFluxType, m_dDencity));
UpdateData(FALSE);
}
// 选择单位是m^3/h
void CFGBZDlg::OnCobeH()
{
GetDlgItem(IDC_BTN_FLUX)->SetWindowText(_T("▼风量(m^3/h):"));
m_eFluxType = eCobeH;
m_csFlux.Format(_T("%.3f"), ChangeFluxTo(m_dFlux, m_eFluxType, m_dDencity));
UpdateData(FALSE);
}
void CFGBZDlg::OnBnClickedBtnPopDnMenu()
{
CRect rc;
CWnd *pBtnWnd = GetDlgItem(IDC_BTN_POP_DN_MENU);
if (NULL == pBtnWnd)
return;
pBtnWnd->GetWindowRect(rc);
m_SizeMenu.DestroyMenu();
m_SizeMenu.CreatePopupMenu();
CalSizeByFlux();
m_SizeMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_VERTICAL,
rc.left, rc.bottom, this, &rc);
}
int CFGBZDlg::GetVRDataRangeFromMDB(CArray<SPipeColor, SPipeColor>& arDataRange, BOOL bVData)
{
int iRet = 0;
CString csSQL;
if (m_pDbServer != NULL)
{
csSQL.Format(_T("SELECT DISTINCT [MINVALUE], [MAXVALUE], [COLOR] FROM %s WHERE [ISVELOCITY] = %d ORDER BY [MINVALUE]"), _T("RangeValue"), bVData);
CUIIValueTable table;
iRet = m_pDbServer->GetSelData(csSQL, table);
if (iRet > 0)
{
int i = 0;
for (i = 0; i < iRet; i++)
{
CUIIValueRecord arRecord;
table.GetValueRecord(i, arRecord); // 得到一行记录
CString csValue;
SPipeColor sData;
if (arRecord.GetValue(0, csValue))
sData.m_dMinVal = _tstof(csValue);
if (arRecord.GetValue(1, csValue))
sData.m_dMaxVal = _tstof(csValue);
if (arRecord.GetValue(2, csValue))
sData.m_iColorIdx = _ttoi(csValue);
arDataRange.InsertAt(i, sData);
}
}
}
return iRet;
}
BOOL CFGBZDlg::UpdataVRDataRangeArray()
{
BOOL bRet = TRUE;
m_arVRange.RemoveAll();
bRet &= GetVRDataRangeFromMDB(m_arVRange);
m_arRRange.RemoveAll();
bRet &= GetVRDataRangeFromMDB(m_arRRange, FALSE);
return bRet;
}
void CFGBZDlg::ReCalHeightVR()
{
UpdateData(TRUE);
if (m_nSecType == 0)//矩形
{
m_cHydraulic.SetShape(FALSE);
}
else
{
return;
}
m_cHydraulic.SetFlux(m_dFlux); // 流量
m_cHydraulic.SetWidth(_tstof(m_csWidth));// 宽
int nLen = m_wndLstHeight.GetItemCount();
double dHeight = 0.0, dData = 0.0;
CString csVR;
CStringArray arItem;
for (int i = 0; i < nLen; i++)
{
dHeight = _tstof(m_wndLstHeight.GetItemText(i, 0));
m_cHydraulic.SetHeight(dHeight);
m_cHydraulic.CalFricLoss();
if (0 == m_nOption) // 显示风速
dData = m_cHydraulic.GetVel();
else // 显示R
dData = m_cHydraulic.GetR();
csVR.Format(_T("%.2f"), dData);
m_wndLstHeight.SetItemText(i, 1, csVR);
}
// 重新显示当前流速和R
m_cHydraulic.SetHeight(_tstof(m_csHeight));
m_cHydraulic.CalFricLoss();
csVR.Format(_T("V(m/s) = %.2f"), m_cHydraulic.GetVel());
GetDlgItem(IDC_STC_V)->SetWindowText(csVR);
m_dV = m_cHydraulic.GetVel();
csVR.Format(_T("R(Pa/m) = %.2f"), m_cHydraulic.GetR());
GetDlgItem(IDC_STC_R)->SetWindowText(csVR);
m_dR = m_cHydraulic.GetR();
csVR.Format(_T("Py(Pa) = %.2f"), m_cHydraulic.GetFricLoss());
GetDlgItem(IDC_STC_P)->SetWindowText(csVR);
m_dPy = m_cHydraulic.GetFricLoss();
UpdataVRDataRangeArray();
}
void CFGBZDlg::ReCalWidthVR()
{
UpdateData(TRUE);
if (m_nSecType == 0)//矩形
{
m_cHydraulic.SetShape(FALSE);
}
else
{
m_cHydraulic.SetShape(TRUE);
}
m_cHydraulic.SetFlux(m_dFlux); // 流量
m_cHydraulic.SetHeight(_tstof(m_csHeight)); // 高
int nLen = m_wndLstWidth.GetItemCount();
double dWidth = 0.0, dData = 0.0;
CString csVR;
CStringArray arItem;
for (int i = 0; i < nLen; i++)
{
dWidth = _tstof(m_wndLstWidth.GetItemText(i, 0));
if (m_nSecType == 0)//矩形
{
m_cHydraulic.SetWidth(dWidth);
}
else
{
m_cHydraulic.SetDia(dWidth);
}
m_cHydraulic.CalFricLoss();
if (0 == m_nOption) // 显示风速
dData = m_cHydraulic.GetVel();
else // 显示R
dData = m_cHydraulic.GetR();
csVR.Format(_T("%.2f"), dData);
m_wndLstWidth.SetItemText(i, 1, csVR);
}
// 重新显示当前流速和R
if (m_nSecType == 0)//矩形
{
m_cHydraulic.SetWidth(_tstof(m_csWidth));
}
else
{
m_cHydraulic.SetDia(_tstof(m_csWidth));
}
m_cHydraulic.CalFricLoss();
csVR.Format(_T("V(m/s) = %.2f"), m_cHydraulic.GetVel());
GetDlgItem(IDC_STC_V)->SetWindowText(csVR);
m_dV = m_cHydraulic.GetVel();
UpdataVRDataRangeArray();
csVR.Format(_T("R(Pa/m) = %.2f"), m_cHydraulic.GetR());
GetDlgItem(IDC_STC_R)->SetWindowText(csVR);
m_dR = m_cHydraulic.GetR();
csVR.Format(_T("Py(Pa) = %.2f"), m_cHydraulic.GetFricLoss());
GetDlgItem(IDC_STC_P)->SetWindowText(csVR);
m_dPy = m_cHydraulic.GetFricLoss();
}
// 改变截面宽
void CFGBZDlg::OnChangeEdtSectWidth()
{
// 调整R值
ReCalHeightVR();
if (m_nSecType == 0) //矩形
{
// 取消原有的选中状态
int iSelected = m_wndLstWidth.GetNextItem(-1, LVNI_SELECTED);
if (iSelected > -1 && iSelected < m_arSizeRect.GetSize())
{
m_wndLstWidth.SetItemState(iSelected, 0, LVIS_SELECTED|LVS_EX_FULLROWSELECT);
}
// 显示对应的尺寸
double dData = _tstof(m_csWidth);
for (int i = 0; i < m_arSizeRect.GetSize(); i++)
{
if (m_arSizeRect.GetAt(i) - dData >= 0.0 || i == m_arSizeRect.GetSize() - 1)
{
m_wndLstWidth.EnsureVisible(0, TRUE);
if (i + 1 > m_arSizeRect.GetSize() - 1)
{
m_wndLstWidth.EnsureVisible((int)m_arSizeRect.GetSize() - 1, TRUE);
}
else
{
m_wndLstWidth.EnsureVisible(i + 1, TRUE);
}
// 设置选中状态
if (fabs(dData - m_arSizeRect.GetAt(i)) < 1)
{
m_wndLstWidth.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED|LVS_EX_FULLROWSELECT);
}
break;
}
}
}
else
{
// 取消原有的选中状态
int iSelected = m_wndLstWidth.GetNextItem(-1, LVNI_SELECTED);
if (iSelected > -1 && iSelected < m_arSizeCir.GetSize())
{
m_wndLstWidth.SetItemState(iSelected, 0, LVIS_SELECTED|LVS_EX_FULLROWSELECT);
}
// 显示对应的尺寸
double dData = _tstof(m_csWidth);
for (int i = 0; i < m_arSizeCir.GetSize(); i++)
{
if ( m_arSizeCir.GetAt(i) - dData >= 0.0 || i == m_arSizeCir.GetSize() - 1)
{
m_wndLstWidth.EnsureVisible(0, TRUE);
if (i + 1 > m_arSizeCir.GetSize() - 1)
{
m_wndLstWidth.EnsureVisible((int)m_arSizeCir.GetSize() - 1, TRUE);
}
else
{
m_wndLstWidth.EnsureVisible(i + 1, TRUE);
}
// 设置选中状态
if (fabs(dData - m_arSizeCir.GetAt(i)) < 1)
{
m_wndLstWidth.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED|LVS_EX_FULLROWSELECT);
}
break;
}
}
}
}
void CFGBZDlg::OnChangeEdtSectHeight()
{
ReCalWidthVR();
// 取消原有的选中状态
int iSelected = m_wndLstHeight.GetNextItem(-1, LVNI_SELECTED);
if (iSelected > -1 && iSelected < m_arSizeRect.GetSize())
{
m_wndLstHeight.SetItemState(iSelected, 0, LVIS_SELECTED|LVS_EX_FULLROWSELECT);
}
// 显示对应的尺寸
double dData = _tstof(m_csHeight);
for (int i = 0; i < m_arSizeRect.GetSize(); i++)
{
if (m_arSizeRect.GetAt(i) - dData >= 0.0 || i == m_arSizeRect.GetSize() - 1)
{
// 将选中尺寸显示在中央
m_wndLstHeight.EnsureVisible(0, TRUE);
if (i + 1 > m_arSizeRect.GetSize() - 1)
{
m_wndLstHeight.EnsureVisible((int)m_arSizeRect.GetSize() - 1, TRUE);
}
else
{
m_wndLstHeight.EnsureVisible(i + 1, TRUE);
}
// 设置选中状态
if (fabs(dData - m_arSizeRect.GetAt(i)) < 1)
{
m_wndLstHeight.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED|LVS_EX_FULLROWSELECT);
}
break;
}
}
}
// 单击截面(高),列表框
void CFGBZDlg::OnClickLstHeight(NMHDR* pNMHDR, LRESULT* pResult)
{
// 当前选择项的的索引
int iCurSelect = 0;
POSITION pos = m_wndLstHeight.GetFirstSelectedItemPosition();
iCurSelect = m_wndLstHeight.GetNextSelectedItem(pos);
// 获得高
CString sHeight;
sHeight = m_wndLstHeight.GetItemText(iCurSelect, 0);
GetDlgItem(IDC_EDT_SECTHEIGHT)->SetWindowText(sHeight);
ReCalWidthVR();
*pResult = 0;
}
// 单击截面宽列表框
void CFGBZDlg::OnClickLstWidth(NMHDR* pNMHDR, LRESULT* pResult)
{
// 当前选择项的的索引
int iCurSelect = 0;
POSITION pos = m_wndLstWidth.GetFirstSelectedItemPosition();
iCurSelect = m_wndLstWidth.GetNextSelectedItem(pos);
CString sWidth;
sWidth = m_wndLstWidth.GetItemText(iCurSelect, 0);
GetDlgItem(IDC_EDT_SECTWIDTH)->SetWindowText(sWidth);
if (m_nSecType == 0)//矩形
{
ReCalHeightVR();
}
else if (m_nSecType == 1)//圆形
{
ReCalWidthVR();
}
*pResult = 0;
}
void CFGBZDlg::OnBnClickedButChange()
{
UpdateData(TRUE);
CString cs = m_csWidth;
m_csWidth = m_csHeight;
m_csHeight = cs;
UpdateData(FALSE);
ReCalWidthVR();
ReCalHeightVR();
OnChangeEdtSectWidth();
OnChangeEdtSectHeight();
}
BOOL CFGBZDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (m_SizeMenu.GetMenuItemCount() > 0)
{
UINT menuID = LOWORD(wParam);
if (menuID > ID_USER_MENU && menuID < ID_USER_MENU + m_SizeMenu.GetMenuItemCount())
{
CString csCommand(_T(""));
m_SizeMenu.GetMenuString(menuID, csCommand, MF_BYCOMMAND);
if (!csCommand.IsEmpty())
{
// 清除原有标记
CString csMenuText(_T(""));
for ( UINT i = 1; i < m_SizeMenu.GetMenuItemCount(); i++)
{
m_SizeMenu.CheckMenuItem(ID_USER_MENU + i, MF_UNCHECKED);
}
// 给选中的尺寸加个标记,并记录当前尺寸
m_SizeMenu.CheckMenuItem(menuID, MF_CHECKED);
csCommand.TrimLeft();
csCommand.TrimRight();
m_sRmdSize = csCommand;
// 解析菜单命令,找到选中的尺寸
int nPos = csCommand.Find(_T("*"));
// 圆形尺寸
if (-1 == nPos)
{
m_wndCmbSect.SelectString(-1, _T("圆形"));
m_csWidth = csCommand;
UpdateData(FALSE);
OnSelchangeCmbSect();
}
// 矩形尺寸
else
{
m_wndCmbSect.SelectString(-1, _T("矩形"));
m_csWidth = csCommand.Left(nPos);
m_csHeight = csCommand.Right(csCommand.GetLength() - nPos -1);
UpdateData(FALSE);
OnSelchangeCmbSect();
}
}
}
}
return CDialog::OnCommand(wParam, lParam);;
}
// 设置截直径信息,(截面类型为圆形)
void CFGBZDlg::SetSectDia()
{
CString sInfo;
if (0 == m_nOption)
sInfo = _T("V");
else
sInfo = _T("R");
// 填充截面宽列表信息
CStringArray arHeadWidth;
CByteArray arColsWidth;
arHeadWidth.Add(_T("宽(W)"));
arColsWidth.Add(58);
arHeadWidth.Add(sInfo);
arColsWidth.Add(42);
// 删除列表框中现有有列、数据
m_wndLstWidth.DeleteColumn(0);
m_wndLstWidth.DeleteColumn(0);
m_wndLstWidth.DeleteAllItems();
m_wndLstWidth.InitCtrl(&arHeadWidth, &arColsWidth);
// 初始化截面宽
CStringArray arItem;
CString csSize;
for (int i = 0; i < m_arSizeCir.GetSize(); i++)
{
arItem.RemoveAll();
csSize.Format(_T("%.0f"), m_arSizeCir.GetAt(i));
arItem.Add(csSize);
arItem.Add(_T("0.0"));
m_wndLstWidth.AddItem(&arItem);
}
}
void CFGBZDlg::OnSelchangeCmbSect()
{
UpdateData();
TCHAR szBuf[MAX_PATH];
HDITEM hItem;
hItem.mask = HDI_TEXT;
hItem.pszText = szBuf;
hItem.cchTextMax = MAX_PATH;
// 截面类型为矩形
if (m_nSecType == 0)//矩形
{
GetDlgItem(IDC_EDT_SECTHEIGHT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LST_HEIGHT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUT_CHANGE)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC_WIDTH)->SetWindowText(_T("宽度(毫米)"));
m_wndLstWidth.GetHeaderCtrl()->GetItem(0,&hItem);
_tcscpy(szBuf,_T("宽(W)"));
m_wndLstWidth.GetHeaderCtrl()->SetItem(0,&hItem);
SetSectWidthList();
SetSectHeightList();
}
else if (m_nSecType == 1)//圆形
{
GetDlgItem(IDC_EDT_SECTHEIGHT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LST_HEIGHT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUT_CHANGE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_WIDTH)->SetWindowText(_T("直径(毫米)"));
m_wndLstWidth.GetHeaderCtrl()->GetItem(0,&hItem);
_tcscpy(szBuf,_T("直径(W)"));
m_wndLstWidth.GetHeaderCtrl()->SetItem(0,&hItem);
SetSectDia();
}
else // 其他形状
{
}
ReCalWidthVR();
ReCalHeightVR();
OnChangeEdtSectWidth();
if (m_nSecType == 0)//矩形
{
OnChangeEdtSectHeight();
}
}
void CFGBZDlg::OnEnChangeEdit2()
{
UpdateData();
if (m_nSecType == 0)//矩形
{
m_dCenEl = m_dTopEl - 0.5 * _ttof(m_csHeight);
}
else
{
m_dCenEl = m_dTopEl - 0.5 * _ttof(m_csWidth);
}
UpdateData(FALSE);
}
//系统管理
void CFGBZDlg::OnBnClickedButton1()
{
CStringArray arSyses;
if (!DuctlineTools::setLayerSys(m_pDbServer, arSyses))
{
return;
}
m_wndCmbPipeType.ResetContent();
for (int i = 0; i < arSyses.GetSize(); i++)
{
m_wndCmbPipeType.AddString(arSyses.GetAt(i));
}
if (arSyses.GetSize() > 0)
{
m_wndCmbPipeType.SetCurSel(0);
m_wndCmbPipeType.GetLBText(0, m_sDuctUse);
}
}