// MountRoofDlg.cpp : implementation file // #include "stdafx.h" #include "MountRoofDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNAMIC(CMountRoofDlg, GlwCAcUiDialog) double CMountRoofDlg::m_dElevation=0; double CMountRoofDlg::m_dRoofHeight=_AS_SYS_UNIT(3000); double CMountRoofDlg::m_dMountHeight=_AS_SYS_UNIT(1100); double CMountRoofDlg::m_dSlopeAngle=45; double CMountRoofDlg::m_dEavesLength=_AS_SYS_UNIT(600); int CMountRoofDlg::m_nRoofType=0; double CMountRoofDlg::m_dMountLength=0; CMountRoofDlg::CMountRoofDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CMountRoofDlg::IDD, pParent) { m_pRoof=NULL; } // CMountRoofDlg::~CMountRoofDlg() // { // } void CMountRoofDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); // 建筑专业数据交换 DDX_Text(pDX, IDC_EDIT_ELEV, m_dElevation); DDX_Text(pDX, IDC_EDIT_RHEIGHT, m_dRoofHeight); DDX_Text(pDX, IDC_EDIT_MHEIGHT, m_dMountHeight); DDX_Text(pDX, IDC_EDIT_ANGLE, m_dSlopeAngle); DDX_Text(pDX, IDC_EDIT_LENGTH,m_dEavesLength); DDX_Text(pDX, IDC_EDIT_MLENGTH,m_dMountLength); DDX_Control(pDX,IDC_COMBO_TYPE,m_comboType); } BEGIN_MESSAGE_MAP(CMountRoofDlg, CModelessDialog) ON_EN_KILLFOCUS(IDC_EDIT_ELEV, OnKFEditElevation) ON_EN_KILLFOCUS(IDC_EDIT_RHEIGHT, OnKFEditRHeight) ON_EN_KILLFOCUS(IDC_EDIT_MHEIGHT, OnKFEditMHeight) ON_EN_KILLFOCUS(IDC_EDIT_ANGLE, OnKFEditSlopeAngle) ON_EN_KILLFOCUS(IDC_EDIT_LENGTH,OnKFEditEavesLength) ON_EN_KILLFOCUS(IDC_EDIT_MLENGTH,OnKFEditMountLength) ON_CBN_SELCHANGE(IDC_COMBO_TYPE,OnSelChangeType) ON_WM_CLOSE() END_MESSAGE_MAP() // CMountRoofDlg 消息处理程序 BOOL CMountRoofDlg::OnInitDialog() { BOOL bRet=CModelessDialog::OnInitDialog(); if (m_pRoof==NULL) { GetDlgItem(IDOK)->ShowWindow(SW_HIDE); GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE); CRect rect,rect1; GetWindowRect(rect); GetDlgItem(IDOK)->GetWindowRect(rect1); rect.right = rect1.left+3; MoveWindow(rect); } m_comboType.SetCurSel(m_nRoofType); OnSelChangeType(); UpdateData(FALSE); return bRet; } void CMountRoofDlg::OnKFEditElevation() { CString temp; GetDlgItem(IDC_EDIT_ELEV)->GetWindowText(temp); if (temp==_T("")||fabs(_tstof(temp))<_DIST_SNAP) { m_dElevation=0; UpdateData(FALSE); } else UpdateData(); } void CMountRoofDlg::OnKFEditRHeight() { CString temp; GetDlgItem(IDC_EDIT_RHEIGHT)->GetWindowText(temp); if (temp==_T("")||_tstof(temp)<_DIST_SNAP) UpdateData(FALSE); else UpdateData(); } void CMountRoofDlg::OnKFEditMHeight() { CString temp; GetDlgItem(IDC_EDIT_MHEIGHT)->GetWindowText(temp); if (temp==_T("")||_tstof(temp)<_DIST_SNAP) UpdateData(FALSE); else UpdateData(); } void CMountRoofDlg::OnKFEditSlopeAngle() { CString temp; GetDlgItem(IDC_EDIT_ANGLE)->GetWindowText(temp); if (temp==_T("")||_tstof(temp)<_DIST_SNAP) UpdateData(FALSE); else UpdateData(); } void CMountRoofDlg::OnKFEditEavesLength() { CString temp; GetDlgItem(IDC_EDIT_LENGTH)->GetWindowText(temp); if (temp==_T("")) UpdateData(FALSE); else if (_tstof(temp)<_DIST_SNAP) { GetDlgItem(IDC_EDIT_LENGTH)->SetWindowText(_T("0")); UpdateData(); } else UpdateData(); } void CMountRoofDlg::OnKFEditMountLength() { CString temp; GetDlgItem(IDC_EDIT_MLENGTH)->GetWindowText(temp); if (temp==_T("")||_tstof(temp)<_DIST_SNAP) UpdateData(FALSE); else UpdateData(); } void CMountRoofDlg::OnSelChangeType() { CRect rect,rect1,rect2; GetWindowRect(rect); GetDlgItem(IDC_EDIT_RHEIGHT)->GetWindowRect(rect1); m_nRoofType=m_comboType.GetCurSel(); BOOL bShowLen=TRUE,bShowHeight=TRUE,bEnableAngle=TRUE; if (m_nRoofType==0) //歇山 { bShowLen=FALSE; GetDlgItem(IDC_EDIT_ANGLE)->ShowWindow(SW_SHOW); } else if (m_nRoofType==1) //四坡 { bShowLen=FALSE; bShowHeight=FALSE; GetDlgItem(IDC_EDIT_ANGLE)->ShowWindow(SW_SHOW); } else if (m_nRoofType==2) //人字坡 { bShowHeight=FALSE; bEnableAngle=FALSE; GetDlgItem(IDC_EDIT_ANGLE)->ShowWindow(SW_SHOW); } else //攒尖 { bShowHeight=FALSE; bShowLen=FALSE; bShowLen=FALSE; GetDlgItem(IDC_EDIT_ANGLE)->ShowWindow(SW_HIDE); } if (m_nRoofType==3) { GetDlgItem(IDC_EDIT_ANGLE)->GetWindowRect(rect2); rect.bottom = rect2.top+4; } else { GetDlgItem(IDC_EDIT_ANGLE)->GetWindowRect(rect2); rect.bottom = rect2.bottom+12; } MoveWindow(rect); GetDlgItem(IDC_EDIT_MLENGTH)->ShowWindow(bShowLen?SW_SHOW:SW_HIDE); GetDlgItem(IDC_STATIC_LENGTH)->ShowWindow(bShowLen?SW_SHOW:SW_HIDE); GetDlgItem(IDC_EDIT_MHEIGHT)->ShowWindow(bShowHeight?SW_SHOW:SW_HIDE); GetDlgItem(IDC_STATIC_HEIGHT)->ShowWindow(bShowHeight?SW_SHOW:SW_HIDE); GetDlgItem(IDC_EDIT_ANGLE)->EnableWindow(bEnableAngle); } void CMountRoofDlg::OnOK() { if (m_pRoof) { m_pRoof->upgradeOpen(); m_pRoof->SetElevation(m_dElevation); double dRoofHeight=m_dRoofHeight/*-m_pRoof->GetSlabThick()*/; m_pRoof->SetRoofHeight(dRoofHeight); if (m_nRoofType == 0) //歇山 { m_pRoof->SetMountHeight(m_dMountHeight); m_pRoof->SetSlopeAngle2(PI*m_dSlopeAngle/180.0); } else if (m_nRoofType == 1) //四坡 { m_pRoof->SetMountHeight(0); m_pRoof->SetSlopeAngle2(PI*m_dSlopeAngle/180.0); } else if (m_nRoofType == 2) //人字坡 { m_pRoof->SetMountHeight(0); m_pRoof->SetSlopeAngle2(PI*0.5); m_pRoof->SetMountLen(m_dMountLength); } else //攒尖 { m_pRoof->SetMountHeight(0); m_pRoof->SetSlopeAngle2(atan(dRoofHeight*2/m_pRoof->GetLength())); } m_pRoof->SetEavesLen(m_dEavesLength); if (m_pRoof->IsValid()) { m_pRoof->downgradeOpen(); CModelessDialog::OnOK(); } else { MessageBox(_T("屋顶高和侧坡角不合理,无法生成屋顶!")); } } } void CMountRoofDlg::OnClose() { if (!m_pRoof) acedPostCommand(_T("\33")); else CModelessDialog::OnClose(); } class CMountRoofJig: public AcEdJig { public: CMountRoofJig(TDbMountRoof *pDrawEnt,AcGePoint3d ptBase); ~CMountRoofJig(); virtual DragStatus sampler(); virtual Adesk::Boolean update(); virtual AcDbEntity* entity() const; void SetPrompt(const TCHAR *pTemp); int GetRetCode() const; int doIt(); int m_nRetCode; //返回码 int m_nPromptCounter; const TCHAR *m_pszPrompt; //提示信息 AcGePoint3d m_point; AcGePoint3d m_ptLoc,m_ptRightDown,m_ptRightUp; TDbMountRoof *m_MountRoof; CMountRoofDlg *m_dlg; }; CMountRoofJig::CMountRoofJig(TDbMountRoof *pDrawEnt,AcGePoint3d ptBase) { m_MountRoof = pDrawEnt; m_ptLoc = ptBase; m_nPromptCounter=0; } CMountRoofJig::~CMountRoofJig() { } void CMountRoofJig::SetPrompt(const TCHAR *pTemp) { m_pszPrompt = pTemp; acutPrintf(pTemp); } int CMountRoofJig::GetRetCode() const { int ret = m_nRetCode; if (ret == AcEdJig::kCancel) ret = RTCAN; else if (ret == AcEdJig::kNull) ret = RTNONE; else if (ret == AcEdJig::kNormal) ret = RTNORM; return ret; } int CMountRoofJig::doIt() { setDispPrompt(_T("\n点取主坡墙外皮的右下角点<返回>: ")); m_nRetCode = drag(); int nRet = GetRetCode(); if (nRet!=RTNORM) return nRet; m_nPromptCounter++; // now == 1 setDispPrompt(_T("\n点取主坡墙外皮的右上角点<返回>: ")); m_nRetCode = drag(); nRet = GetRetCode(); return nRet; } Adesk::Boolean CMountRoofJig::update() { m_MountRoof->SetElevation(m_dlg->m_dElevation); m_MountRoof->SetRoofHeight(m_dlg->m_dRoofHeight/*-m_MountRoof->GetSlabThick()*/); m_MountRoof->SetEavesLen(m_dlg->m_dEavesLength); if (m_dlg->m_nRoofType==0) //歇山 { m_MountRoof->SetMountHeight(m_dlg->m_dMountHeight); m_MountRoof->SetSlopeAngle2(PI*m_dlg->m_dSlopeAngle/180.0); } else if (m_dlg->m_nRoofType==1) //四坡 { m_MountRoof->SetMountHeight(0); m_MountRoof->SetSlopeAngle2(PI*m_dlg->m_dSlopeAngle/180.0); } else if (m_dlg->m_nRoofType==2) //人字坡 { m_MountRoof->SetMountHeight(0); m_MountRoof->SetSlopeAngle2(PI*0.5); m_MountRoof->SetMountLen(m_dlg->m_dMountLength); } else //攒尖 { m_MountRoof->SetMountHeight(0); //m_MountRoof->SetSlopeAngle2(PI*m_dlg->m_dSlopeAngle/180.0); } switch (m_nPromptCounter) { case 0: { AcGePoint3d pt1,pt2; pt1=m_ptRightDown; pt2=m_ptLoc; pt1.z=pt2.z=0; XVector3D vtRot=pt1-pt2; vtRot.z=0; double rot=CT_std_angle(ads_angle(XPoint(),vtRot)-ads_angle(XPoint(),XVector3D(1,0,0))); m_MountRoof->SetRotation(rot); double length=pt1.distanceTo(pt2); m_MountRoof->SetLength(length); m_MountRoof->SetWidth(length*0.5); if (m_dlg->m_nRoofType==3&&length>0) { //modify by xlc on 090226 //m_MountRoof->SetSlopeAngle2(atan(m_dlg->m_dRoofHeight*2.0/length)); m_MountRoof->SetSlopeAngle2(atan(m_MountRoof->GetRoofHeight()*2.0/length)); } } break; case 1: { AcGeVector3d offset=m_ptRightUp-m_ptRightDown; XVector3D vtOffset=m_ptRightUp-m_ptRightDown; vtOffset.z = 0; double nVtRot=CT_std_angle(ads_angle(XPoint(), vtOffset)-m_MountRoof->GetRotation()); double nIncLen=ads_distance(XPoint(), vtOffset) * sin(nVtRot); if (nIncLen>_DIST_SNAP) { m_MountRoof->SetWidth(nIncLen); } } break; } return Adesk::kTrue; } AcEdJig::DragStatus CMountRoofJig::sampler() { DragStatus stat; setUserInputControls((UserInputControls) (AcEdJig::kAccept3dCoordinates |AcEdJig::kNullResponseAccepted)); AcGePoint3d m_Temp; if (m_nPromptCounter == 0) { static AcGePoint3d ptTemp; stat = acquirePoint(m_ptRightDown,m_ptLoc); if (ptTemp != m_ptRightDown) ptTemp = m_ptRightDown; else if (stat == AcEdJig::kNormal) return AcEdJig::kNoChange; } else if (m_nPromptCounter == 1) { static AcGePoint3d ptTemp2; stat = acquirePoint(m_ptRightUp,m_ptRightDown); if (ptTemp2 != m_ptRightUp) ptTemp2 = m_ptRightUp; else if (stat == AcEdJig::kNormal) return AcEdJig::kNoChange; } return stat; } AcDbEntity* CMountRoofJig::entity() const { return (AcDbEntity*)m_MountRoof; } //歇山屋顶 void MountRoof() { CMountRoofDlg dlg; CAcModuleResourceOverride vTemp; dlg.Create(CMountRoofDlg::IDD,acedGetAcadFrame()); dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); for (int i=0;;i++) { XPoint ptLoc; if (acedGetPoint(NULL,_T("\n点取主坡墙外皮的左下角点<退出>:"),ptLoc)!=RTNORM) { break; } TDbMountRoof *pRoof=new TDbMountRoof; pRoof->SetShowSide(FALSE); pRoof->SetLocation(Ucs2Wcs(ptLoc)); pRoof->setLayer(InitLayer(LAY_ROOF)); CMountRoofJig jig(pRoof,Ucs2Wcs(ptLoc)); dlg.UpdateData(); jig.m_dlg= &dlg; //add by xlc on 090505 06以下平台资源冲突 CAcModuleResourceOverride resOverride(acedGetAcadResourceInstance()); if (jig.doIt() == RTNORM&&pRoof->IsValid()) { pRoof->AddToMSpace(Adesk::kTrue); } else { if (pRoof != NULL) delete pRoof; } } if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); } // 歇山屋顶 for TSun8 090914 void MountRoof2() { static double dElevation = 24000; static double dEavesLength = 0; static double dRoofHeight = 3000; static double dMountHeight = 1100; static double dMountLength = 0; CMountRoofDlg dlg; CAcModuleResourceOverride vTemp; dlg.Create(CMountRoofDlg::IDD,acedGetAcadFrame()); dlg.m_dEavesLength = _AS_SYS_UNIT(dEavesLength); dlg.m_dElevation = _AS_SYS_UNIT(dElevation); dlg.m_dRoofHeight = _AS_SYS_UNIT(dRoofHeight); dlg.m_dMountHeight = _AS_SYS_UNIT(dMountHeight); dlg.m_dMountLength = _AS_SYS_UNIT(dMountLength); dlg.UpdateData(FALSE); dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); for (int i=0;;i++) { XPoint ptLoc; if (acedGetPoint(NULL,_T("\n点取主坡墙外皮的左下角点<退出>:"),ptLoc)!=RTNORM) { break; } TDbMountRoof *pRoof=new TDbMountRoof; pRoof->SetShowSide(FALSE); pRoof->SetLocation(Ucs2Wcs(ptLoc)); pRoof->setLayer(InitLayer(LAY_ROOF)); CMountRoofJig jig(pRoof,Ucs2Wcs(ptLoc)); jig.m_dlg= &dlg; //add by xlc on 090505 06以下平台资源冲突 CAcModuleResourceOverride resOverride(acedGetAcadResourceInstance()); if (jig.doIt() == RTNORM&&pRoof->IsValid()) { dElevation = _AS_MM(dlg.m_dElevation); dEavesLength = _AS_MM(dlg.m_dEavesLength); dRoofHeight = _AS_MM(dlg.m_dRoofHeight); dMountHeight = _AS_MM(dlg.m_dMountHeight); dMountLength = _AS_MM(dlg.m_dMountLength); pRoof->AddToMSpace(Adesk::kTrue); } else { if (pRoof != NULL) delete pRoof; } } if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); } int EditMountRoof(AcDbObjectId id_MountRoof) { XDbObject obj(id_MountRoof,AcDb::kForWrite); TDbMountRoof *pRoof = NULL; if (!!obj) pRoof = TDbMountRoof::cast(obj.m_pObject); if (!pRoof) return RTERROR; double dEavesLength=pRoof->GetEavesLen(); double dRoofHeight=pRoof->GetRoofHeight(); double dMountHeight=pRoof->GetMountHeight(); double dSlopeAngle=pRoof->GetSlopeAngle2(); double dElevation=pRoof->GetElevation(); CAcModuleResourceOverride vTemp; CMountRoofDlg dlg; dlg.m_pRoof = pRoof; dlg.m_dEavesLength=dEavesLength; dlg.m_dRoofHeight=dRoofHeight/*+pRoof->GetSlabThick()*/; if (fabs(dMountHeight)<_DIST_SNAP) { dlg.m_dMountHeight=dRoofHeight*0.5; } else { dlg.m_dMountHeight=dMountHeight; } CString strAngle; strAngle.Format(_T("%.3f"),dSlopeAngle*180.0/PI); if (fabs(cos(dSlopeAngle))<1E-3) { dlg.m_dSlopeAngle=45; } else { dlg.m_dSlopeAngle=::_tstof(strAngle); } dlg.m_dElevation=dElevation; if (fabs(dRoofHeight-dMountHeight)<_DIST_SNAP ||fabs(cos(dSlopeAngle))<1E-3) { dlg.m_nRoofType=2; } else if (dMountHeight<_DIST_SNAP) { if (fabs(dRoofHeight/tan(dSlopeAngle)-pRoof->GetLength()*0.5)<_DIST_SNAP) { dlg.m_nRoofType=3; } else { dlg.m_nRoofType=1; } } else { dlg.m_nRoofType=0; } if (dlg.DoModal() ==IDOK) { ads_redraw(NULL,NULL); } else { pRoof->upgradeOpen(); pRoof->SetElevation(dElevation); pRoof->SetRoofHeight(dRoofHeight); pRoof->SetMountHeight(dMountHeight); pRoof->SetEavesLen(dEavesLength); pRoof->SetElevation(dElevation); pRoof->SetSlopeAngle2(dSlopeAngle); pRoof->Close(); ads_redraw(NULL,NULL); } return RTNORM; }