#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; }