Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

591 lines
14 KiB
C++

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