#include "stdafx.h" #include "StdArx.h" #include "FZLBDlg.h" #include "CoreTools.h" //填充面板对话框: extern bool acedHatchPalletteDialog(const TCHAR* Pattern, bool bAllowCustom, TCHAR*& result); DLLIMPEXP CString IDCreate(); IMPLEMENT_DYNAMIC(CFZLBDlg, CDialog) int g_nSlabNo = 1; CFZLBDlg::CFZLBDlg(CWnd* pParent /*=NULL*/) : CDialog(CFZLBDlg::IDD, pParent) , m_dT(360.0) , m_dBomEl(0.0) , m_sMaterial(_T("钢筋混凝土")) , m_sPurpose(_T("工业楼板")) , m_dWallThick(400.0) , m_bOffsetHalfWall(FALSE) , m_sNo(_T("B-01")) , m_sPatternName(_T("")) , m_dAngle(0.0) , m_sScale(_T("50.0")) , m_bNOSetDefault(TRUE) , m_sHatch(HATCH_DEFAULT) , m_bAddHatch(TRUE) { g_nSlabNo++; m_sNo.Format(_T("B-%d"),g_nSlabNo); if (m_bNOSetDefault) m_sNo = IDCreate(); GET_CACHE(CFZLBDlg , %f%f%f%s%s%s%d%s , &m_dT , &m_dBomEl , &m_dWallThick , &m_sMaterial , &m_sPurpose , &m_sNo , &m_bOffsetHalfWall , &m_sHatch ); } CFZLBDlg::~CFZLBDlg() { } void CFZLBDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_dT); DDX_Text(pDX, IDC_EDIT3, m_dBomEl); DDX_Text(pDX, IDC_EDIT4, m_dWallThick); DDX_Text(pDX, IDC_EDIT2, m_sMaterial); DDX_Text(pDX, IDC_EDIT12, m_sPurpose); DDX_Text(pDX, IDC_EDIT6, m_sNo); DDX_Check(pDX, IDC_CHECK1, m_bOffsetHalfWall); DDX_Text(pDX, IDC_EDIT5, m_sPatternName); DDX_CBString(pDX, IDC_COMBO3, m_sScale); DDX_Text(pDX, IDC_EDIT18, m_dAngle); DDX_Check(pDX, IDC_CHECK6, 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); } BEGIN_MESSAGE_MAP(CFZLBDlg, CDialog) ON_BN_CLICKED(IDOK, &CFZLBDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON3, &CFZLBDlg::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON1, &CFZLBDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_CHECK6, &CFZLBDlg::OnBnClickedCheck6) ON_BN_CLICKED(IDC_BTN_FILL, &CFZLBDlg::OnBnClickedBtnFill) ON_BN_CLICKED(IDC_CHECK_HATCH, &CFZLBDlg::OnBnClickedCheckHatch) END_MESSAGE_MAP() BOOL CFZLBDlg::OnInitDialog() { CDialog::OnInitDialog(); if (m_bNOSetDefault) { GetDlgItem(IDC_EDIT6)->EnableWindow(FALSE); } if (m_idSlab.isValid()) { GetDlgItem(IDC_CHECK1)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT4)->EnableWindow(FALSE); } m_wndBtHatch.EnableWindow(m_bAddHatch); UpdateData(FALSE); return TRUE; } void CFZLBDlg::OnBnClickedOk() { if (!UpdateData(TRUE)) return; SET_CACHE(CFZLBDlg , %f%f%f%s%s%s%d%s , m_dT , m_dBomEl , m_dWallThick , m_sMaterial , m_sPurpose , m_sNo , m_bOffsetHalfWall , m_sHatch); //界面为顶部标高,内部调整为板底标高 m_dBomEl -= m_dT; // 保护一下楼板类型 if (m_sPurpose.IsEmpty() || m_sPurpose.Find(_T("楼板")) == -1) m_sPurpose += _T("楼板"); UpdateSlabData(); OnOK(); } void CFZLBDlg::OnBnClickedButton3() { UpdateData(); LPCTSTR pszPattern = _T("ANSI32"); #ifdef ZWCAD TCHAR* pszReslt = new TCHAR; #else TCHAR* pszReslt = NULL; #endif if ( acedHatchPalletteDialog(pszPattern,true,pszReslt) ) { m_sPatternName = pszReslt; UpdateData(FALSE); } DELETE_PTR(pszReslt); } void CFZLBDlg::OnBnClickedButton1() { } void CFZLBDlg::OnBnClickedCheck6() { UpdateData(); if (m_bNOSetDefault) { GetDlgItem(IDC_EDIT6)->EnableWindow(FALSE); } else { GetDlgItem(IDC_EDIT6)->EnableWindow(TRUE); } } void CFZLBDlg::SetFromId(AcDbObjectId& id) { m_idSlab = id; AcDbEntity* pEnt = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { AecDbXSlab* pSlab = AecDbXSlab::cast(pEnt); if (pSlab != NULL) { AcGePoint3d ptCenPos; pSlab->GetSpecialtyData()->GetAt(KEY_ORGPT,ptCenPos); m_dBomEl = ptCenPos.z; pSlab->GetSpecialtyData()->GetAt(KEY_BOMTHICK,m_dT); //界面为顶部标高,调整为顶部标高 m_dBomEl += m_dT; pSlab->GetSpecialtyData()->GetAt(KEY_NO,m_sNo); pSlab->GetSpecialtyData()->GetAt(KEY_MATERIAL,m_sMaterial); pSlab->GetSpecialtyData()->GetAt(KEY_PURPOSE,m_sPurpose); pSlab->GetSpecialtyData()->GetAt(KEY_PATTERN,m_sPatternName); pSlab->GetSpecialtyData()->GetAt(KEY_PATTERNANG,m_dAngle); pSlab->GetSpecialtyData()->GetAt(KEY_SECTION_HATCH, m_sHatch); if (m_sHatch == HATCH_NO_NEED) m_bAddHatch = FALSE; else m_bAddHatch = TRUE; double dScale = 1.0; pSlab->GetSpecialtyData()->GetAt(KEY_PATTERNSCA,dScale); m_sScale.Format(_T("%.1f"),dScale); pSlab->GetAt(_T("_SLAB_HALF_WALL_"), m_bOffsetHalfWall); if (m_bOffsetHalfWall) pSlab->GetAt(_T("_HALF_WALL_THICK_"), m_dWallThick); } pEnt->close(); } } void CFZLBDlg::UpdateSlabData() { AcDbEntity* pEnt = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,m_idSlab,AcDb::kForWrite)) { AecDbXSlab* pSlab = AecDbXSlab::cast(pEnt); if (pSlab != NULL) { AcGePoint3d ptCenPos; pSlab->GetSpecialtyData()->GetAt(KEY_ORGPT,ptCenPos); CString sPl; pSlab->GetSpecialtyData()->GetAt(KEY_POINTS,sPl); AcDbPolyline* pPl = CoreTools::StringToPolyline(sPl); if (pPl != NULL) { pPl->setElevation(m_dBomEl); CoreTools::PolylineToString(pPl,sPl); delete pPl; } //仅仅改变厚度和标高,Region不变 //ptCenPos.z = 0.0; //pSlab->SetRegionSlab(sPl,m_dT,m_dBomEl,ptCenPos); AcDbLine* pLn = AcDbLine::cast(pSlab->GetBaseCurve()); if (pLn != NULL) { AcGePoint3d ptSta = pLn->startPoint(); AcGePoint3d ptEnd = pLn->endPoint(); ptSta.z = m_dBomEl; ptEnd.z = ptSta.z + m_dT; pLn->setStartPoint(ptSta); pLn->setEndPoint(ptEnd); pSlab->SetBaseCurve(pLn); delete pLn; } AcGePoint3d pt = ptCenPos; pt.z = m_dBomEl; pSlab->GetSpecialtyData()->SetAt(KEY_ORGPT,pt,TRUE); pSlab->GetSpecialtyData()->SetAt(KEY_POINTS,sPl); pSlab->GetSpecialtyData()->SetAt(KEY_BOMTHICK,m_dT); // 以后的楼板都用此标记来判断 pSlab->SetAt(AecDbXSlab::KEY_LB_Flag, TRUE); pSlab->GetSpecialtyData()->SetAt(KEY_NO,m_sNo); pSlab->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pSlab->GetSpecialtyData()->SetAt(KEY_MATERIAL,m_sMaterial); pSlab->GetSpecialtyData()->SetAt(KEY_PURPOSE,m_sPurpose); pSlab->SetHatch(m_sPatternName,m_dAngle,_ttof(m_sScale)); pSlab->GetSpecialtyData()->SetAt(KEY_SECTION_HATCH, m_sHatch); if (m_bOffsetHalfWall) { pSlab->SetAt(_T("_SLAB_HALF_WALL_"), TRUE); pSlab->SetAt(_T("_HALF_WALL_THICK_"), m_dWallThick); } else { pSlab->SetAt(_T("_SLAB_HALF_WALL_"), FALSE); } } pEnt->close(); } } void CFZLBDlg::OnBnClickedBtnFill() { 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 CFZLBDlg::OnBnClickedCheckHatch() { UpdateData(); m_wndBtHatch.EnableWindow(m_bAddHatch); if (!m_bAddHatch) m_sHatch = HATCH_NO_NEED; else m_sHatch = HATCH_DEFAULT; UpdateData(FALSE); }