#include "stdafx.h" #include "StdArx.h" #include "LBXGDlg.h" static const Adesk::UInt16 kColorByLayer = 256; //填充面板对话框: extern bool acedHatchPalletteDialog(const TCHAR* Pattern, bool bAllowCustom, TCHAR*& result); IMPLEMENT_DYNAMIC(CLBXGDlg, CDialog) CLBXGDlg::CLBXGDlg(CWnd* pParent /*=NULL*/) : CDialog(CLBXGDlg::IDD, pParent) , m_dThick(360.0) , m_dTopEl(0.0) , m_sMaterial(_T("钢筋混凝土")) , m_sPurpose(_T("结构底板")) , m_sPatternName(_T("")) , m_dAngle(0.0) , m_sScale(_T("50.0")) , m_sNo(_T("")) { m_nColor = 4; m_dOldTopEl = 0.0; } CLBXGDlg::~CLBXGDlg() { } void CLBXGDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_dThick); DDX_Text(pDX, IDC_EDIT3, m_dTopEl); DDX_Text(pDX, IDC_EDIT2, m_sMaterial); DDX_Text(pDX, IDC_EDIT12, m_sPurpose); DDX_Text(pDX, IDC_EDIT4, m_sPatternName); DDX_Text(pDX, IDC_EDIT5, m_dAngle); DDX_CBString(pDX, IDC_COMBO1, m_sScale); DDX_Text(pDX, IDC_EDIT13, m_sNo); } BEGIN_MESSAGE_MAP(CLBXGDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CLBXGDlg::OnBnClickedButton1) ON_BN_CLICKED(IDOK, &CLBXGDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON3, &CLBXGDlg::OnBnClickedButton3) ON_BN_CLICKED(IDC_STATIC_COLOR, &CLBXGDlg::OnStaticColor) ON_WM_CTLCOLOR() END_MESSAGE_MAP() BOOL CLBXGDlg::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); return TRUE; } void CLBXGDlg::OnStaticColor() { UpdateData(); acedSetColorDialog(m_nColor, Adesk::kFalse, m_nColor); Invalidate(); UpdateData(FALSE); } HBRUSH CLBXGDlg::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_nColor == 256) { crColor = RGB(255, 255, 255); } else { crColor = acedGetRGB(m_nColor); } CRect rc; pWnd->GetClientRect(rc); pDC->FillSolidRect(rc, crColor); } } return hbr; } //扩展属性 void CLBXGDlg::OnBnClickedButton1() { } void CLBXGDlg::SetFromSlab(const AcDbObjectId& id) { m_idSlab = id; AcAxDocLock lock; AcDbEntity* pEnt = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead)) { AecDbXSlab* pSlab = AecDbXSlab::cast(pEnt); if (pSlab != NULL) { m_dThick = pSlab->GetThick(); m_dTopEl = pSlab->GetElBom(); m_dTopEl += m_dThick; m_dOldTopEl = m_dTopEl; pSlab->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_PURPOSE,m_sPurpose); pSlab->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,m_sMaterial); pSlab->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,m_sNo); if ( !pSlab->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("COLOR"),m_nColor) ) { m_nColor = kColorByLayer; } PipeHatch sHatch; if ( pSlab->GetHatch(sHatch) ) { m_sPatternName = sHatch.szPattern; m_dAngle = sHatch.dAngle; m_sScale.Format(_T("%.2f"),sHatch.dScale); } } pEnt->close(); } } void CLBXGDlg::OnBnClickedOk() { UpdateData(); if (m_dThick < 1.e-1) { AfxMessageBox(_T("板的厚度尺寸不正确!请输入合适的尺寸")); return; } UpdateSlabData(); OnOK(); } void CLBXGDlg::UpdateSlabData() { AcAxDocLock lock; AcDbEntity* pEnt = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,m_idSlab,AcDb::kForWrite)) { AecDbXSlab* pSlab = AecDbXSlab::cast(pEnt); if (pSlab != NULL) { pSlab->GetSpecialtyData()->SetAt(KEY_NO,m_sNo); AcDbCurve* pCur = pSlab->GetBaseCurve(); if (pCur != NULL) { AcDbLine* pLn = AcDbLine::cast(pCur);//水池底板 if (pLn != NULL) { AcGePoint3d ptSta = pLn->startPoint(); AcGePoint3d ptEnd = pLn->endPoint(); AcGeVector3d vt = ptEnd - ptSta; vt.normalize(); double dThickOld = ptEnd.distanceTo(ptSta); ptSta.z = m_dTopEl - m_dThick; ptEnd = ptSta + vt * m_dThick; // 保证顶部标高不变.保证水池容积 double dThickAdd = m_dThick - dThickOld; AcGeVector3d vtMove(0,0,-dThickAdd); //ptSta += vtMove; //ptEnd += vtMove; pSlab->SetBaseCurve(ptSta,ptEnd); AcGeVector3d vtAdd = vt; vtAdd.normalize(); vtAdd *= 0.5 * dThickAdd; pSlab->HoleAndPipeExtend(dThickAdd,-vtAdd); } AcDbPolyline* pPl = AcDbPolyline::cast(pCur);//路径盖板 if (pPl != NULL) { double dL = 0.0,dW = m_dThick,dt = 0.0; pSlab->GetSpecialtyData()->GetAt(KEY_SIZE1,dL); pSlab->GetSpecialtyData()->GetAt(PIPE_THICK,dt); AcDbPolyline* pPlN = AcDbPolyline::cast(pSlab->GetNativeCurve()); if (pPlN != NULL) { pPlN->setElevation(m_dTopEl - m_dThick); } pSlab->SetSection(dL,m_dThick,dt); } pSlab->SetHatch(m_sPatternName,m_dAngle,_ttof(m_sScale)); pSlab->setColorIndex(m_nColor); AcGePoint3d ptOrg; if( pSlab->GetSpecialtyData()->GetAt(KEY_ORGPT,ptOrg) ) { ptOrg.z = m_dTopEl - m_dThick; pSlab->GetSpecialtyData()->SetAt(KEY_ORGPT,ptOrg); } pSlab->GetSpecialtyData()->SetAt(KEY_MATERIAL,m_sMaterial); pSlab->GetSpecialtyData()->SetAt(KEY_PURPOSE,m_sPurpose); pSlab->GetSpecialtyData()->SetAt(KEY_NO,m_sNo); int nVt = 0; if ( pSlab->GetSpecialtyData()->HasKey(KEY_BOMTHICK,nVt) ) { pSlab->GetSpecialtyData()->SetAt(KEY_BOMTHICK,m_dThick); } AcGeMatrix3d xformEl; AcGeVector3d vtMove(0,0,m_dTopEl - m_dOldTopEl); xformEl.setToTranslation(vtMove); pSlab->TransformDTYGPartEnt(xformEl); pSlab->TransformAssocPartEnt(xformEl); pSlab->ReCreateDraw3d(); pSlab->ReCreateDraw2d(); } delete pCur; } pEnt->close(); } } void CLBXGDlg::OnBnClickedButton3() { 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); }