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

582 lines
15 KiB
C++

#include "stdafx.h"
#include "StdArx.h"
#include "SZMXDlg.h"
#include "AecDbX3dPart.h"
#ifndef IMG_ROOT
#define IMG_ROOT 7
#endif
#define IMG_ITEM 1
#define IMG_ITEMSEL 2
#define IMG_SUBITEM 0
#define IMG_SUBITEMSEL 0
#ifndef WM_INPLACEKILLFOCUS
#define WM_INPLACEKILLFOCUS (WM_USER+0x1234)
#endif
CString FormatToString(double dVal)
{
CString sTemp;
sTemp.Format(_T("%g"),dVal);
return sTemp;
}
CString FormatToString(int nVal)
{
CString sTemp;
sTemp.Format(_T("%d"),nVal);
return sTemp;
}
IMPLEMENT_DYNAMIC(CSZMXDlg, CDialog)
CSZMXDlg::CSZMXDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSZMXDlg::IDD, pParent)
{
m_hCurItem = NULL;
m_bModify = FALSE;
m_vtZ.set(0,0,0);
memset(&m_wallDataSide,0,sizeof(WallData));
}
CSZMXDlg::~CSZMXDlg()
{
}
void CSZMXDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE1, m_wndModelTree);
DDX_Control(pDX, IDC_LIST1, m_wndProbList);
}
BEGIN_MESSAGE_MAP(CSZMXDlg, CDialog)
ON_BN_CLICKED(IDOK, &CSZMXDlg::OnBnClickedOk)
ON_NOTIFY(NM_CLICK, IDC_TREE1, &CSZMXDlg::OnNMClickTree1)
ON_MESSAGE(WM_INPLACEKILLFOCUS,&CSZMXDlg::OnEditKillFocus)
END_MESSAGE_MAP()
BOOL CSZMXDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap bmp;
if (!bmp.LoadBitmap (IDB_BITMAPPRIV))
{
AfxMessageBox(_T ("Can't load bitmap: %x\n"), IDB_BITMAPPRIV);
ASSERT (FALSE);
return FALSE;
}
BITMAP bmpObj;
bmp.GetBitmap (&bmpObj);
UINT nFlags = ILC_COLOR24 | ILC_MASK;
m_Imagelist.Create (16, bmpObj.bmHeight, nFlags, 0, 0);
m_Imagelist.Add (&bmp, RGB (255, 0, 0));
m_wndModelTree.SetImageList(&m_Imagelist,TVSIL_NORMAL);
m_wndProbList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SINGLEROW);
m_wndProbList.InsertColumn(0,_T("名称"),LVCFMT_LEFT,160,160);
m_wndProbList.InsertColumn(1,_T("属性"),LVCFMT_LEFT,160,160);
m_wndProbList.InsertColumn(2,_T("备份"),LVCFMT_LEFT,0,0);
m_wndProbList.InsertColumn(3,_T("类型"),LVCFMT_LEFT,0,0);
m_wndProbList.InsertColumn(4,_T("KEY"),LVCFMT_LEFT,0,0);
m_wndProbList.InsertColumn(5,_T("单位"),LVCFMT_LEFT,160,160);
m_wndProbList.SetColumnItemData(1,NULL,ET_Edit);
UpdateData(FALSE);
ShowPoolBasinParts();
return TRUE;
}
void CSZMXDlg::OnBnClickedOk()
{
if (m_bModify) //重建
{
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,m_idPoolBasin,AcDb::kForWrite)))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
PoolData data;
pBasin->GetBasinSlabData(data);
AcGePoint3d ptOrg = pBasin->GetBasinOrg();//底板中心
ESection eShap = pBasin->GetBasinShape();
switch(eShap)
{
case eRect:
{
RecreateRectBasin(pBasin);
break;
}
case eCircle:
{
RecreateCircleBasin(pBasin);
break;
}
case eEllispe:
{
RecreateEllispeBasin(pBasin);
break;
}
case eUserDef:
{
//...
break;
}
default:
break;
}
}
pEnt->close();
}
}
OnOK();
}
void CSZMXDlg::RecreateRectBasin(AecDbXSlab* pBasin)
{
PoolData data;
pBasin->GetBasinSlabData(data);
double dEl = data.m_dBomEl;//原真实标高
double dNewEl = m_vtZ.z + dEl;//现在真实标高
double dWallH = data.m_dWallH;
//标高的变化转为墙高
//判断是否有堰墙
if (data.m_dWallH < 1.e-3)//外墙围池,本身无墙
{
//如果标高下降,产生的墙高
if (dNewEl - dEl < 1.e-3)
{
dWallH = dEl - dNewEl;
data.m_dWallThick = m_wallDataSide.dThick;
dWallH -= data.m_dBomThick;
}
else//标高上升,不产生新墙
{
dWallH = data.m_dWallH + dEl - dNewEl;
dWallH -= data.m_dBomThick;
}
if (dWallH < 1.e-3)
dWallH = 0.0;
//变成内部有墙
data.m_dData[0] += 2 * m_wallDataSide.dThick;
data.m_dData[1] += 2 * m_wallDataSide.dThick;
AcGePoint3d ptCenPos = pBasin->GetBasinOrg();
ptCenPos.z = dNewEl;
pBasin->SetRectBasin(data.m_dData[0],data.m_dData[1],data.m_dBomThick,dWallH,data.m_dWallThick,ptCenPos);
}
else//有内部堰墙
{
//新的堰墙高度
dWallH += (dEl - dNewEl);
if (dWallH < 1.e-3)
dWallH = 0.0;
//变成内部有墙
data.m_dData[0] += 2.0 * data.m_dWallThick;
data.m_dData[1] += 2.0 * data.m_dWallThick;
AcGePoint3d ptCenPos = pBasin->GetBasinOrg();
ptCenPos.z = dNewEl;
pBasin->SetRectBasin(data.m_dData[0],data.m_dData[1],data.m_dBomThick,dWallH,data.m_dWallThick,ptCenPos);
}
}
void CSZMXDlg::RecreateCircleBasin(AecDbXSlab* pBasin)
{
}
void CSZMXDlg::RecreateEllispeBasin(AecDbXSlab* pBasin)
{
}
void CSZMXDlg::SetPoolData(const AcDbObjectId& id)
{
m_idPoolBasin = id;
}
void CSZMXDlg::SetWallData(const WallData& wData)
{
memcpy(&m_wallDataSide,&wData,sizeof(WallData));
}
void CSZMXDlg::ShowPoolBasinParts()
{
m_wndModelTree.DeleteAllItems();
m_mapItemToID.RemoveAll();
HTREEITEM hRoot = m_wndModelTree.InsertItem(_T("水池模型"),IMG_ROOT,IMG_ROOT);
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
HTREEITEM hItem = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,m_idPoolBasin,AcDb::kForRead)))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
CString sTemp;
PoolData data;
pBasin->GetBasinSlabData(data);
int nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("内底标高"));
m_wndProbList.SetItemText(nItem,1,FormatToString(data.m_dBomEl + m_vtZ.z));
m_wndProbList.SetItemText(nItem,2,FormatToString(data.m_dBomEl));
m_wndProbList.SetItemText(nItem,3,_T("double"));
m_wndProbList.SetItemText(nItem,4,_T(" "));
m_wndProbList.SetItemText(nItem,5,_T("毫米"));
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("底部壁厚"));
m_wndProbList.SetItemText(nItem,1,FormatToString(data.m_dBomThick));
m_wndProbList.SetItemText(nItem,2,FormatToString(data.m_dBomThick));
m_wndProbList.SetItemText(nItem,3,_T("double"));
m_wndProbList.SetItemText(nItem,4,KEY_THICK);
m_wndProbList.SetItemText(nItem,5,_T("毫米"));
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("材质"));
pBasin->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sTemp);
m_wndProbList.SetItemText(nItem,1,sTemp);
m_wndProbList.SetItemText(nItem,2,sTemp);
m_wndProbList.SetItemText(nItem,3,_T("string"));
m_wndProbList.SetItemText(nItem,4,KEY_MATERIAL);
ESection eShap = pBasin->GetBasinShape();
switch(eShap)
{
case eRect:
{
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("池内长度"));
m_wndProbList.SetItemText(nItem,1,FormatToString(data.m_dData[0]));
m_wndProbList.SetItemText(nItem,2,FormatToString(data.m_dData[0]));
m_wndProbList.SetItemText(nItem,3,_T("double"));
m_wndProbList.SetItemText(nItem,4,KEY_Length);
m_wndProbList.SetItemText(nItem,5,_T("毫米"));
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("池内宽度"));
m_wndProbList.SetItemText(nItem,1,FormatToString(data.m_dData[1]));
m_wndProbList.SetItemText(nItem,2,FormatToString(data.m_dData[1]));
m_wndProbList.SetItemText(nItem,3,_T("double"));
m_wndProbList.SetItemText(nItem,4,KEY_Width);
m_wndProbList.SetItemText(nItem,5,_T("毫米"));
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("是否平底"));
sTemp = data.m_nHorBom ? _T("是") : _T("否");
m_wndProbList.SetItemText(nItem,1,sTemp);
m_wndProbList.SetItemText(nItem,2,sTemp);
m_wndProbList.SetItemText(nItem,3,_T("bool"));
m_wndProbList.SetItemText(nItem,4,KEY_HORBOM);
break;
}
case eCircle:
{
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("半径"));
m_wndProbList.SetItemText(nItem,1,FormatToString(data.m_dData[2]));
m_wndProbList.SetItemText(nItem,2,FormatToString(data.m_dData[2]));
m_wndProbList.SetItemText(nItem,3,_T("double"));
m_wndProbList.SetItemText(nItem,4,KEY_RAD);
m_wndProbList.SetItemText(nItem,5,_T("毫米"));
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("是否平底"));
sTemp = data.m_nHorBom ? _T("是") : _T("否");
m_wndProbList.SetItemText(nItem,1,sTemp);
m_wndProbList.SetItemText(nItem,2,sTemp);
m_wndProbList.SetItemText(nItem,3,_T("bool"));
m_wndProbList.SetItemText(nItem,4,KEY_HORBOM);
break;
}
case eEllispe:
{
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("主半径"));
m_wndProbList.SetItemText(nItem,1,FormatToString(data.m_dData[2]));
m_wndProbList.SetItemText(nItem,2,FormatToString(data.m_dData[2]));
m_wndProbList.SetItemText(nItem,3,_T("double"));
m_wndProbList.SetItemText(nItem,4,KEY_RAD);
m_wndProbList.SetItemText(nItem,5,_T("毫米"));
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("半径曲率"));
m_wndProbList.SetItemText(nItem,1,FormatToString(data.m_dData[3]));
m_wndProbList.SetItemText(nItem,2,FormatToString(data.m_dData[3]));
m_wndProbList.SetItemText(nItem,3,_T("double"));
m_wndProbList.SetItemText(nItem,4,KEY_RRATIO);
m_wndProbList.SetItemText(nItem,5,_T("毫米"));
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("是否平底"));
sTemp = data.m_nHorBom ? _T("是") : _T("否");
m_wndProbList.SetItemText(nItem,1,sTemp);
m_wndProbList.SetItemText(nItem,2,sTemp);
m_wndProbList.SetItemText(nItem,3,_T("bool"));
m_wndProbList.SetItemText(nItem,4,KEY_HORBOM);
break;
}
case eUserDef:
{
break;
}
default:
break;
}
CString sID,sName,sItem;
AecDbX3dPart* pPart = NULL;
int nCount = pBasin->GetX3dPartCount();
for (int i = 0;i < nCount;i++)
{
pPart = pBasin->GetX3dPart(i);
pPart->GetName(sName);
sID = pPart->GetGUID();
hItem = m_wndModelTree.InsertItem(sName,IMG_SUBITEM,IMG_SUBITEM,hRoot);
if (hItem != NULL)
{
sItem.Format(_T("%p"),hItem);
m_mapItemToID.SetAt(sItem,sID);
}
}
m_wndModelTree.SelectItem(hRoot);
m_wndModelTree.Expand(hRoot,TVE_EXPAND);
}
pEnt->close();
}
}
void CSZMXDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point,ptcursor;
::GetCursorPos(&point);
ptcursor = point;
m_wndModelTree.ScreenToClient(&point);
UINT uFlags;
HTREEITEM hItem = m_wndModelTree.HitTest(point, &uFlags), hP(NULL);
if (hItem != NULL && hItem != m_hCurItem)
{
m_hCurItem = hItem;
ShowPartInfo(hItem);
}
*pResult = 0;
}
void CSZMXDlg::ShowPartInfo(HTREEITEM hItem)
{
CString sItem;
sItem.Format(_T("%p"),hItem);
CString sID,sName,sTemp;
if ( m_mapItemToID.Lookup(sItem,sID))
{
m_wndProbList.DeleteAllItems();
double dVal = 0.0;
int nItem = -1;
AecDbX3dPart* pPart = NULL;
AcDbEntity* pEnt = NULL;
Acad::ErrorStatus es;
AcAxDocLock lock;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,m_idPoolBasin,AcDb::kForRead)))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
pPart = pBasin->GetX3dPart(sID);
if (pPart != NULL)
{
pPart->GetName(sName);
if (sName.CompareNoCase(_T("墙体")) == 0)
{
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("墙厚"));
pPart->GetSpecialtyData()->GetAt(KEY_THICK,dVal);
m_wndProbList.SetItemText(nItem,1,FormatToString(dVal));
m_wndProbList.SetItemText(nItem,2,FormatToString(dVal));
m_wndProbList.SetItemText(nItem,3,_T("double"));
m_wndProbList.SetItemText(nItem,4,KEY_THICK);
m_wndProbList.SetItemText(nItem,5,_T("毫米"));
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("墙高"));
pPart->GetSpecialtyData()->GetAt(KEY_HEIGHT,dVal);
m_wndProbList.SetItemText(nItem,1,FormatToString(dVal));
m_wndProbList.SetItemText(nItem,2,FormatToString(dVal));
m_wndProbList.SetItemText(nItem,3,_T("double"));
m_wndProbList.SetItemText(nItem,4,KEY_HEIGHT);
m_wndProbList.SetItemText(nItem,5,_T("毫米"));
nItem = m_wndProbList.InsertItem(m_wndProbList.GetItemCount(),_T("材质"));
pPart->GetSpecialtyData()->GetAt(KEY_MATERIAL,sTemp);
m_wndProbList.SetItemText(nItem,1,sTemp);
m_wndProbList.SetItemText(nItem,2,sTemp);
m_wndProbList.SetItemText(nItem,3,_T("string"));
m_wndProbList.SetItemText(nItem,4,KEY_MATERIAL);
}
}
}
pEnt->close();
}
}
}
LRESULT CSZMXDlg::OnEditKillFocus(WPARAM wp,LPARAM lp)
{
int nCtrlID = (int)wp;
if (nCtrlID == m_wndProbList.GetDlgCtrlID())
{
LV_DISPINFO* pDisp = (LV_DISPINFO*)lp;
CString sVal = pDisp->item.pszText;
int nItem = pDisp->item.iItem;
int nSubItem = pDisp->item.iSubItem;
HTREEITEM hItem = m_wndModelTree.GetSelectedItem();
if (hItem != NULL)
{
CString sItem;
sItem.Format(_T("%p"),hItem);
CString sID,sName,sTemp,sBakVal,sType,sKey;
if ( m_mapItemToID.Lookup(sItem,sID))
{
double dVal = 0.0;
AecDbX3dPart* pPart = NULL;
AcDbEntity* pEnt = NULL;
Acad::ErrorStatus es;
AcAxDocLock lock;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,m_idPoolBasin,AcDb::kForWrite)))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
PoolData data;
pBasin->GetBasinSlabData(data);
ESection eShap = pBasin->GetBasinShape();
pPart = pBasin->GetX3dPart(sID);
if (pPart != NULL)
{
pPart->GetName(sName);
sTemp = m_wndProbList.GetItemText(nItem,0);//NAME
sBakVal = m_wndProbList.GetItemText(nItem,2);//BACK
if (sVal.CompareNoCase(sBakVal) != 0)//变更
{
m_bModify = TRUE;
sType = m_wndProbList.GetItemText(nItem,3);
sKey = m_wndProbList.GetItemText(nItem,4);
sKey.TrimRight();
if (sKey.IsEmpty() && sName.CompareNoCase(_T("池底板")) == 0)//是标高
{
m_vtZ.z += ( _ttof(sVal) - _ttof(sBakVal) );
}
if (sType.CompareNoCase(_T("double")) == 0)
{
if (!sKey.IsEmpty())
{
pPart->GetSpecialtyData()->SetAt(sKey,_ttof(sVal));
}
}
else if (sType.CompareNoCase(_T("string")) == 0)
{
if (!sKey.IsEmpty())
{
pPart->GetSpecialtyData()->SetAt(sKey,sVal);
}
}
/*else if (sType.CompareNoCase(_T("bool")) == 0)
{
}*/
}
}
}
pEnt->close();
}
}
else
{
if ( sName.CompareNoCase(_T("池底板")) == 0 )
{
double dVal = 0.0;
AcDbEntity* pEnt = NULL;
Acad::ErrorStatus es;
AcAxDocLock lock;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,m_idPoolBasin,AcDb::kForWrite)))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
sTemp = m_wndProbList.GetItemText(nItem,0);//NAME
sBakVal = m_wndProbList.GetItemText(nItem,2);//BACK
sType = m_wndProbList.GetItemText(nItem,3);
sKey = m_wndProbList.GetItemText(nItem,4);
sKey.TrimRight();
if (sKey.IsEmpty() )//是标高
{
m_vtZ.z += ( _ttof(sVal) - _ttof(sBakVal) );
m_bModify = TRUE;
}
if (sType.CompareNoCase(_T("double")) == 0)
{
if (!sKey.IsEmpty())
{
pBasin->GetSpecialtyData(AcDb::kForWrite)->SetAt(sKey,_ttof(sVal));
m_bModify = TRUE;
}
}
else if (sType.CompareNoCase(_T("string")) == 0)
{
if (!sKey.IsEmpty())
{
pBasin->GetSpecialtyData(AcDb::kForWrite)->SetAt(sKey,sVal);
m_bModify = TRUE;
}
}
}
pEnt->close();
}
}
}
}
}
return 0L;
}