#include "stdafx.h" #include "StdArx.h" #include "HZQTDlg.h" #include "JMSJDlg.h" #include "GLTKDlg.h" #include "KTSetting.h" DLLIMPEXP CString IDCreate(); IMPLEMENT_DYNAMIC(CHZQTDlg, CDialog) int g_nWallNo = 1; static const Adesk::UInt16 kColorByBlock = 0; static const Adesk::UInt16 kColorByLayer = 256; static const LPCTSTR g_pszWallMaterials[] = { _T("钢筋混凝土"), _T("石材"), _T("砖墙"), _T("填充墙"), _T("玻璃幕墙"),_T("轻质隔墙"),NULL }; static const int g_nWallColorIndex[] = { kColorByLayer,252,1,254,4,6,256}; CHZQTDlg::CHZQTDlg(CWnd* pParent/* = NULL*/) : CDialog(CHZQTDlg::IDD, pParent) ,m_dW(400.0) ,m_dH(3000.0) ,m_dE(0.0) ,m_sMaterial(_T("钢筋混凝土")) ,m_bUserDefSec(FALSE) ,m_nDrawType(0) ,m_nAlign(0) ,m_dOffset(0) ,m_dW2(500.0) ,m_dH2(500.0) ,m_bHasW2(FALSE) ,m_nW2Pos(FALSE) , m_sNo(_T("")) , m_bWallMix(FALSE) , m_bNOSetDefault(TRUE) , m_sHatch(HATCH_DEFAULT) , m_bAddHatch(TRUE) , m_dLW(200) { m_pSectionReg = NULL; m_bExJoin = TRUE; m_dLW = 0.5 * m_dW; GET_CACHE(CHZQTDlg , %f%f%f%f%f%f%d%d%d%d%d%d%s%s%d%f , &m_dW , &m_dH , &m_dE , &m_dOffset , &m_dH2 , &m_dW2 , &m_bUserDefSec , &m_bHasW2 , &m_bExJoin , &m_nAlign , &m_nDrawType , &m_nW2Pos , &m_sMaterial , &m_sHatch , &m_bWallMix , &m_dLW); g_nWallNo++; m_sNo.Format(_T("W-%d"),g_nWallNo); m_bUserDefSec = FALSE;//不记忆 m_dEOld = 0.0; m_dLW = 0.5 * m_dW; if (m_bNOSetDefault) m_sNo = IDCreate(); m_nWallColor = kColorByLayer; for (int i = 0; i < 20; i++) { if (g_pszWallMaterials[i] == NULL) break; if (_tcscmp(g_pszWallMaterials[i], m_sMaterial) == 0) { m_nWallColor = g_nWallColorIndex[i]; } } } CHZQTDlg::~CHZQTDlg(void) { } void CHZQTDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_dW); DDX_Text(pDX, IDC_EDIT12, m_dH); DDX_Text(pDX, IDC_EDIT2, m_dE); DDX_Check(pDX, IDC_CHECK1, m_bUserDefSec); DDX_Check(pDX, IDC_CHECK2, m_bHasW2); DDX_Check(pDX, IDC_CHECK3, m_bExJoin); DDX_Radio(pDX, IDC_RADIO1, m_nAlign); DDX_Radio(pDX, IDC_RADIO4, m_nDrawType); DDX_Radio(pDX, IDC_RADIO7, m_nW2Pos); DDX_Text(pDX, IDC_EDIT5, m_dOffset); DDX_Text(pDX, IDC_EDIT4, m_sRegScr); DDX_Control(pDX, IDC_RADIO4, m_wndBtLnWall); DDX_Control(pDX, IDC_RADIO5, m_wndBtCrWall); DDX_Control(pDX, IDC_RADIO6, m_wndBtRcWall); DDX_Text(pDX, IDC_EDIT13, m_dW2); DDX_Text(pDX, IDC_EDIT14, m_dH2); DDX_CBString(pDX, IDC_COMBO1, m_sMaterial); DDX_Text(pDX, IDC_EDIT6, m_sNo); DDX_Check(pDX, IDC_CHECK4, m_bWallMix); DDX_Check(pDX, IDC_CHECK5, m_bNOSetDefault); DDX_Control(pDX, IDC_BTN_FILL, m_wndBtHatch); DDX_Check(pDX, IDC_CHECK_HATCH, m_bAddHatch); DDX_Text(pDX, IDC_BTN_FILL, m_sHatch); DDX_Control(pDX, IDC_COMBO1, m_wndComboMaterials); DDX_Text(pDX, IDC_EDIT3, m_dLW); } BEGIN_MESSAGE_MAP(CHZQTDlg, CDialog) ON_BN_CLICKED(IDOK, &CHZQTDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_CHECK1, &CHZQTDlg::OnBnClickedCheck1) ON_BN_CLICKED(IDC_CHECK5, &CHZQTDlg::OnBnClickedCheck5) ON_BN_CLICKED(IDC_BTN_FILL, &CHZQTDlg::OnBnClickedBtnHatch) ON_BN_CLICKED(IDC_CHECK_HATCH, &CHZQTDlg::OnBnClickedCheckHatch) ON_WM_CTLCOLOR() ON_BN_CLICKED(IDC_STATIC_COLOR, OnStaticColor) ON_CBN_SELENDOK(IDC_COMBO1, &CHZQTDlg::OnCbnSelendokCombo1) ON_BN_CLICKED(IDC_RADIO1, &CHZQTDlg::OnBnClickedRadio1) ON_BN_CLICKED(IDC_RADIO2, &CHZQTDlg::OnBnClickedRadio2) ON_BN_CLICKED(IDC_RADIO3, &CHZQTDlg::OnBnClickedRadio3) END_MESSAGE_MAP() BOOL CHZQTDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap bmp32; if (!bmp32.LoadBitmap(IDB_BITMAP10)) { AfxMessageBox(_T("Can't load bitmap: %x\n"), IDB_BITMAP10); ASSERT(FALSE); return FALSE; } BITMAP bmpObj32; bmp32.GetBitmap(&bmpObj32); UINT nFlags = ILC_COLOR24 | ILC_MASK; m_Imagelist32.Create(32, bmpObj32.bmHeight, nFlags, 0, 0); m_Imagelist32.Add(&bmp32, RGB(255, 0, 0)); /*m_wndBtLnWall.SetButtonStyle(BS_RADIOBUTTON | BS_PUSHBUTTON | BS_OWNERDRAW); m_wndBtCrWall.SetButtonStyle(BS_RADIOBUTTON | BS_PUSHBUTTON | BS_OWNERDRAW); m_wndBtRcWall.SetButtonStyle(BS_RADIOBUTTON | BS_PUSHBUTTON | BS_OWNERDRAW); m_wndBtLnWall.SetIcon(m_Imagelist32.ExtractIcon(0)); m_wndBtRcWall.SetIcon(m_Imagelist32.ExtractIcon(1)); m_wndBtCrWall.SetIcon(m_Imagelist32.ExtractIcon(2));*/ if (m_idWall.isValid()) { GetDlgItem(IDC_RADIO4)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO4)->ShowWindow(SW_HIDE); GetDlgItem(IDC_RADIO5)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO5)->ShowWindow(SW_HIDE); GetDlgItem(IDC_RADIO6)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO6)->ShowWindow(SW_HIDE); GetDlgItem(IDC_RADIO10)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO10)->ShowWindow(SW_HIDE); } if (m_bUserDefSec)//异型截面墙 { GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT12)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT13)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT14)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO3)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO7)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO8)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO9)->EnableWindow(FALSE); } if (m_bNOSetDefault) { GetDlgItem(IDC_EDIT6)->EnableWindow(FALSE); } m_wndBtHatch.EnableWindow(m_bAddHatch); GetDlgItem(IDC_EDIT3)->EnableWindow(m_nAlign == 0 ? TRUE : FALSE); UpdateData(FALSE); return TRUE; } void CHZQTDlg::OnBnClickedOk() { UpdateData(); //数据校验 if (m_bUserDefSec) { if (m_dH < 1.0 || m_dW < 1.0) { AfxMessageBox(_T("墙体厚度和总高尺寸不正确!")); return; } if (m_bHasW2) { if (m_dH2 < 1.0 || m_dW2 < 1.0) { AfxMessageBox(_T("不等厚墙体尺寸设置不正确!")); } } } if (m_dLW < -1.e-10) { AfxMessageBox(_T("墙体左厚尺寸设置不正确!")); return; } if (m_idWall.isValid()) { UpdateWallData(); } SET_CACHE(CHZQTDlg , %f%f%f%f%f%f%d%d%d%d%d%d%s%s%d%f , m_dW , m_dH , m_dE , m_dOffset , m_dH2 , m_dW2 , m_bUserDefSec , m_bHasW2 , m_bExJoin , m_nAlign , m_nDrawType , m_nW2Pos , m_sMaterial , m_sHatch , m_bWallMix , m_dLW); OnOK(); } extern double GetExtendCurveJoin(AcDbRegion* pRegSect,double& dW); void CHZQTDlg::OnBnClickedCheck1() { UpdateData(); if (m_bUserDefSec) { // CGLTKDlg dlg(CGLTKDlg::eSelect, _T("poolstandard.db"), _T("standard"), CGLTKDlg::drawRegion); if ( IDOK == dlg.DoModal() ) { CString sScr; if (dlg.GetCrossSectionScr(sScr)) { CString sFullPath = FilePath::GetSysDir(); sFullPath.MakeLower(); sFullPath += _T("\\JMSJ.sat"); CStdioFile file; if (file.Open(sFullPath,CFile::modeCreate |CFile::modeWrite )) { file.WriteString(sScr); file.Close(); } AcDbVoidPtrArray arBodyPtrs; if ( Acad::eOk == AcDbBody::acisIn(sFullPath,arBodyPtrs) ) { if (arBodyPtrs.length() > 0) { AcDbEntity* pEnt = (AcDbEntity*)arBodyPtrs.first(); AcDbRegion* pRegion = AcDbRegion::cast(pEnt); if (pRegion != NULL) { m_pSectionReg = pRegion; m_sRegScr = sScr; GetExtendCurveJoin(pRegion,m_dW);; AcDbExtents ext; m_pSectionReg->getGeomExtents(ext); //m_dW = ext.maxPoint().x - ext.minPoint().x; m_dH = ext.maxPoint().y - ext.minPoint().y; int nDw = (int)(m_dW * 10.0); int nDh = (int)(m_dH * 10.0); m_dW = nDw / 10; m_dH = nDh / 10; m_dH2 = 0.0; m_dW2 = 0.0; m_nAlign = 0; } } } UpdateData(FALSE); } } GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT12)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT13)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT14)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO3)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO7)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO8)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO9)->EnableWindow(FALSE); } else { GetDlgItem(IDC_RADIO1)->EnableWindow(TRUE); GetDlgItem(IDC_RADIO2)->EnableWindow(TRUE); GetDlgItem(IDC_RADIO3)->EnableWindow(TRUE); } if (m_pSectionReg == NULL) { m_bUserDefSec = FALSE; } UpdateData(FALSE); } AcDbRegion* CHZQTDlg::GetUserDefSection(CString& sScr) const { sScr = m_sRegScr; return m_pSectionReg; } void CHZQTDlg::SetFromWall(AcDbObjectId& id) { m_bUserDefSec = FALSE; m_idWall = id; AcAxDocLock lock; AcDbEntity* pEnt = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead)) { AecDbXWall* pWall = AecDbXWall::cast(pEnt); if (pWall != NULL) { WallData data; pWall->GetWallData(data); pWall->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, m_sNo); pWall->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_SECTION_HATCH, m_sHatch); pWall->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("COLOR"), m_nWallColor); pWall->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_L, m_dLW); if (m_sHatch == HATCH_NO_NEED) m_bAddHatch = FALSE; else m_bAddHatch = TRUE; m_dW = data.dThick; m_dH = data.dH; m_dE = data.dBomEl; m_sMaterial = data.szMat; m_dEOld = m_dE; if ( data.nSecShape == eWw)//不等宽墙体 { m_nW2Pos = data.nW2Pos; m_dH2 = data.dH2; m_dW2 = data.dThick2; m_bHasW2 = TRUE; } else if (data.nSecShape == eUserDef)//自定义 { m_bUserDefSec = TRUE; pWall->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_SECTIONSCR,m_sRegScr); CString sFullPath = FilePath::GetSysDir(); sFullPath.MakeLower(); sFullPath += _T("\\JMSJ.sat"); CStdioFile file; if (file.Open(sFullPath,CFile::modeCreate |CFile::modeWrite )) { file.WriteString(m_sRegScr); file.Close(); } AcDbVoidPtrArray arBodyPtrs; if ( Acad::eOk == AcDbBody::acisIn(sFullPath,arBodyPtrs) ) { if (arBodyPtrs.length() > 0) { AcDbEntity* pEnt = (AcDbEntity*)arBodyPtrs.first(); AcDbRegion* pRegion = AcDbRegion::cast(pEnt); if (pRegion != NULL) { m_pSectionReg = pRegion; AcDbExtents ext; m_pSectionReg->getGeomExtents(ext); m_dW = ext.maxPoint().x - ext.minPoint().x; m_dH = ext.maxPoint().y - ext.minPoint().y; int nDw = (int)(m_dW * 10.0); int nDh = (int)(m_dH * 10.0); m_dW = nDw / 10; m_dH = nDh / 10; m_dH2 = 0.0; m_dW2 = 0.0; } } } } switch(data.kAlign) { case kMid: { m_nAlign = 0; break; } case kLeft: { m_nAlign = 1; break; } case kRight: { m_nAlign = 2; break; } default: break; } } pEnt->close(); } } void CHZQTDlg::UpdateWallData() { AcAxDocLock lock; double dThick = -1; AcDbObjectIdArray arAssocIds; AcDbEntity* pEnt = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,m_idWall,AcDb::kForWrite)) { AecDbXWall* pWall = AecDbXWall::cast(pEnt); if (pWall != NULL) { pWall->GetSpecialtyData()->SetAt(KEY_NO,m_sNo); pWall->GetSpecialtyData()->SetAt(KEY_SECTION_HATCH, m_sHatch); pWall->GetSpecialtyData()->SetAt(_T("COLOR"), m_nWallColor); //之前的数据 WallData data; pWall->GetWallData(data); //新的数据 EAlign eAlign = kMid; if (m_nAlign == 0) { eAlign = kMid; } else if (m_nAlign == 1) { eAlign = kLeft; } else { eAlign = kRight; } //设置墙体数据 if (m_bUserDefSec) { ////临时异形截面墙体不对齐处理. eAlign = kMid; //pWall->SetWallData(m_dW,m_dH,m_dE,eAlign); pWall->SetWallData(m_dE,eAlign); pWall->SetSection(m_pSectionReg,AcGePoint3d::kOrigin); pWall->GetSpecialtyData()->SetAt(KEY_SECTIONSCR,m_sRegScr); pWall->GetSpecialtyData()->SetAt(KEY_MATERIAL, m_sMaterial); } else if(m_bHasW2) { WallData data; pWall->GetWallData(data); pWall->SetWallData(m_dW,m_dH,m_dW2,m_dH2,m_nW2Pos,m_dE,eAlign); pWall->AdjustHoleAndPipe(m_dW - data.dThick); pWall->GetSpecialtyData()->SetAt(KEY_MATERIAL, m_sMaterial); } else { WallData data; pWall->GetWallData(data); pWall->SetWallData(m_dW,m_dH,m_dE,eAlign); pWall->AdjustHoleAndPipe(m_dW - data.dThick); pWall->GetSpecialtyData()->SetAt(KEY_MATERIAL, m_sMaterial); dThick = m_dW; } AcGeMatrix3d xformEl; AcGeVector3d vtMove(0,0,m_dE - m_dEOld); xformEl.setToTranslation(vtMove); pWall->TransformDTYGPartEnt(xformEl); pWall->TransformAssocPartEnt(xformEl); pWall->GetAssocPartIds(arAssocIds); } pEnt->close(); //修改所有门窗厚度 if (dThick > 1.e-6) { Acad::ErrorStatus es; AcDbEntity *pEnt = NULL; AcDbObjectId id; for (int i = 0; i < arAssocIds.length(); i++) { id = arAssocIds.at(i); if (Acad::eOk == (es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite))) { AecDbXOpening *pOpen = AecDbXOpening::cast(pEnt); if (pOpen != NULL) { OpeningData data; memset(&data, 0, sizeof(OpeningData)); pOpen->GetOpeningData(data); data.dThick = dThick; pOpen->UpdateOpeningData(data); } pEnt->close(); } } } } } void CHZQTDlg::OnBnClickedCheck5() { UpdateData(); if (m_bNOSetDefault) { GetDlgItem(IDC_EDIT6)->EnableWindow(FALSE); } else { GetDlgItem(IDC_EDIT6)->EnableWindow(TRUE); } } extern bool __cdecl acedHatchPalletteDialog(wchar_t const* , bool , wchar_t *&); void CHZQTDlg::OnBnClickedBtnHatch() { UpdateData(); TCHAR *psz = new TCHAR[1024]; ::memset(psz, 0, sizeof(TCHAR) * 1024); CString sHatch(m_sMaterial); if (!m_sHatch.IsEmpty()) sHatch = m_sHatch; if (acedHatchPalletteDialog(sHatch, false, psz)) { m_sHatch = psz; m_wndBtHatch.SetWindowText(m_sHatch); } delete[] psz; } void CHZQTDlg::OnBnClickedCheckHatch() { UpdateData(); m_wndBtHatch.EnableWindow(m_bAddHatch); if (!m_bAddHatch) m_sHatch = HATCH_NO_NEED; else m_sHatch = HATCH_DEFAULT; UpdateData(FALSE); } HBRUSH CHZQTDlg::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (nCtlColor == CTLCOLOR_STATIC) { if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_COLOR) { COLORREF crColor = RGB(255, 255, 255); if (m_nWallColor == kColorByLayer) { //提取墙体图层的颜色 static int nColor = KTSetting::GetLayerColor(_T("LAY_WALL")); crColor = acedGetRGB(nColor); } else { crColor = acedGetRGB(m_nWallColor); } CRect rc; pWnd->GetClientRect(rc); pDC->FillSolidRect(rc, crColor); } } return hbr; } void CHZQTDlg::OnStaticColor() { acedSetColorDialog(m_nWallColor, Adesk::kFalse, m_nWallColor); if (m_nWallColor == 0) m_nWallColor = kColorByLayer; Invalidate(); } void CHZQTDlg::OnCbnSelendokCombo1() { int iSel = m_wndComboMaterials.GetCurSel(); if (iSel > -1 && iSel < 6) { m_nWallColor = g_nWallColorIndex[iSel]; } Invalidate(); } void CHZQTDlg::OnBnClickedRadio1() { UpdateData(); GetDlgItem(IDC_EDIT3)->EnableWindow(TRUE); m_dLW = 0.5 * m_dW; UpdateData(FALSE); } void CHZQTDlg::OnBnClickedRadio2() { UpdateData(); m_dLW = 0; UpdateData(FALSE); GetDlgItem(IDC_EDIT3)->EnableWindow(FALSE); } void CHZQTDlg::OnBnClickedRadio3() { UpdateData(); m_dLW = 0; UpdateData(FALSE); GetDlgItem(IDC_EDIT3)->EnableWindow(FALSE); }