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

586 lines
12 KiB
C++

#include "StdAfx.h"
#include "WallPartDlg.h"
BOOL CWallPartDlg::m_bChkLeft = 1;
BOOL CWallPartDlg::m_bChkRight = 1;
BOOL CWallPartDlg::m_bChkHeight = 1;
BOOL CWallPartDlg::m_bChkElev = 0;
BOOL CWallPartDlg::m_bChkMaterial = 1;
BOOL CWallPartDlg::m_bChkUsing = 0;
BOOL CWallPartDlg::m_bChkLeftKeep = 0;
BOOL CWallPartDlg::m_bChkRightKeep = 0;
BOOL CWallPartDlg::m_bgroupStatus = FALSE;
BOOL CWallPartDlg::m_bChkTwoSide = 0;
CString CWallPartDlg::m_strHeight = _T("当前层高");
CString CWallPartDlg::m_strElev = _T("0");
int CWallPartDlg::m_iMaterial = 2;
int CWallPartDlg::m_iUsing = 1;
int CWallPartDlg::m_iLeftKeep = 80;
int CWallPartDlg::m_iRigntKeep = 80;
int CWallPartDlg::m_iLeft = 120;
int CWallPartDlg::m_iRight = 120;
IMPLEMENT_DYNAMIC(CWallPartDlg, WGroupDlg)
CWallPartDlg::CWallPartDlg(CWnd* pParent)
: WGroupDlg(CWallPartDlg::IDD, pParent)
{
}
CWallPartDlg::~CWallPartDlg()
{
}
BEGIN_MESSAGE_MAP(CWallPartDlg, WGroupDlg)
ON_BN_CLICKED(IDC_CHK_LEFTWIDTH, OnBlkLeftWidth)
ON_BN_CLICKED(IDC_CHK_RIGHTWIDTH, OnBlkRightWidth)
ON_BN_CLICKED(IDC_CHK_USING, OnBlkUsing)
ON_BN_CLICKED(IDC_CHK_MATERIAL, OnBlkMaterial)
ON_BN_CLICKED(IDC_CHK_ELEV, OnBlkElevation)
ON_BN_CLICKED(IDC_CHK_HEIGHT, OnBlkHeight)
ON_BN_CLICKED(IDC_CHK_LEFTKEEP, OnBlkLeftKeep)
ON_BN_CLICKED(IDC_CHK_RIGHTKEEP, OnBlkRightKeep)
ON_WM_CTLCOLOR()
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_LEFTWIDTH, OnDeltaposSpinLeftwidth)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_RIGHTWIDTH, OnDeltaposSpinRightwidth)
END_MESSAGE_MAP()
BOOL CWallPartDlg::OnInitDialog()
{
WGroupDlg::OnInitDialog();
m_spinLeft.SetBuddy(&m_edtLeft);
m_spinRight.SetBuddy(&m_edtRight);
m_spinLeft.SetRange(0, UD_MAXVAL);
m_spinRight.SetRange(0, UD_MAXVAL);
CComboBox *pBox = (CComboBox*)GetDlgItem(IDC_CMB_PARTMATERIAL);
pBox->ResetContent();
pBox->AddString(WALLMATE_Concrete);
pBox->AddString(WALLMATE_Concrete1);
pBox->AddString(WALLMATE_Brick);
pBox->AddString(WALLMATE_Brick1);
pBox->AddString(WALLMATE_Rocket);
pBox->AddString(WALLMATE_Rocket1);
pBox->AddString(WALLMATE_Fill);
pBox->AddString(WALLMATE_Fill1);
pBox->AddString(WALLMATE_Fill2);
pBox->AddString(WALLMATE_Divider);
pBox->AddString(WALLMATE_Curtain);
pBox->SetCurSel(m_iMaterial);
GetDlgItem(IDC_CHK_WALLTOP)->EnableWindow(FALSE);
OnBlkLeftWidth();
OnBlkRightWidth();
OnBlkHeight();
OnBlkElevation();
OnBlkMaterial();
OnBlkUsing();
OnBlkLeftKeep();
OnBlkRightKeep();
CComboBox *pBox1 = (CComboBox*)GetDlgItem(IDC_CMB_USING);
pBox1->ResetContent();
pBox1->AddString(_T("外墙"));
pBox1->AddString(_T("内墙"));
pBox1->AddString(_T("分户墙"));
pBox1->AddString(_T("虚墙"));
pBox1->AddString(_T("矮墙"));
pBox1->AddString(_T("卫生隔断"));
pBox1->SetCurSel(m_iUsing);
return TRUE;
}
void CWallPartDlg::DoDataExchange(CDataExchange* pDX)
{
WGroupDlg::DoDataExchange(pDX);
DDX_Check(pDX, IDC_CHK_LEFTWIDTH, m_bChkLeft);
DDX_Check(pDX, IDC_CHK_RIGHTWIDTH, m_bChkRight);
DDX_Check(pDX, IDC_CHK_HEIGHT, m_bChkHeight);
DDX_Check(pDX, IDC_CHK_MATERIAL, m_bChkMaterial);
DDX_Check(pDX, IDC_CHK_ELEV, m_bChkElev);
DDX_Check(pDX, IDC_CHK_USING, m_bChkUsing);
DDX_Check(pDX, IDC_CHK_LEFTKEEP, m_bChkLeftKeep);
DDX_Check(pDX, IDC_CHK_RIGHTKEEP, m_bChkRightKeep);
DDX_Check(pDX, IDC_CHK_WALLTOP, m_bChkTwoSide);
DDX_Text(pDX, IDC_EDT_LEFTWIDTH, m_iLeft);
DDX_Text(pDX, IDC_EDT_RIGHTWIDTH, m_iRight);
DDX_Text(pDX, IDC_CMB_PARTHEIGHT, m_strHeight);
DDX_Text(pDX, IDC_CMB_PARTELEV, m_strElev);
DDX_Text(pDX, IDC_CMB_PARTHEIGHT, m_strHeight);
DDX_CBIndex(pDX, IDC_CMB_USING, m_iUsing);
DDX_CBIndex(pDX, IDC_CMB_PARTMATERIAL, m_iMaterial);
DDX_Text(pDX, IDC_EDT_LEFTKEEP, m_iLeftKeep);
DDX_Text(pDX, IDC_EDT_RIGHTKEEP, m_iRigntKeep);
DDX_Control(pDX, IDC_SPIN_LEFTWIDTH, m_spinLeft);
DDX_Control(pDX, IDC_SPIN_RIGHTWIDTH, m_spinRight);
DDX_Control(pDX, IDC_EDT_LEFTWIDTH, m_edtLeft);
DDX_Control(pDX, IDC_EDT_RIGHTWIDTH, m_edtRight);
DDV_MinMaxInt(pDX, m_iLeft, 0, INT_MAX);
DDV_MinMaxInt(pDX, m_iRight, 0, INT_MAX);
DDX_Control(pDX, IDC_STATIC_GROUP, m_group);
DDX_GroupStatus(pDX,IDC_STATIC_GROUP,m_bgroupStatus);
}
void CWallPartDlg::OnBlkLeftWidth()
{
UpdateData(TRUE);
if (!m_bChkLeft)
{
GetDlgItem(IDC_EDT_LEFTWIDTH)->EnableWindow(FALSE);
GetDlgItem(IDC_SPIN_LEFTWIDTH)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_EDT_LEFTWIDTH)->EnableWindow(TRUE);
GetDlgItem(IDC_SPIN_LEFTWIDTH)->EnableWindow(TRUE);
}
}
void CWallPartDlg::OnBlkRightWidth()
{
UpdateData(TRUE);
if (!m_bChkRight)
{
GetDlgItem(IDC_EDT_RIGHTWIDTH)->EnableWindow(FALSE);
GetDlgItem(IDC_SPIN_RIGHTWIDTH)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_EDT_RIGHTWIDTH)->EnableWindow(TRUE);
GetDlgItem(IDC_SPIN_RIGHTWIDTH)->EnableWindow(TRUE);
}
}
void CWallPartDlg::OnBlkHeight()
{
UpdateData(TRUE);
if (!m_bChkHeight)
{
GetDlgItem(IDC_CMB_PARTHEIGHT)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_CMB_PARTHEIGHT)->EnableWindow(TRUE);
}
}
void CWallPartDlg::OnBlkElevation()
{
UpdateData(TRUE);
if (!m_bChkElev)
{
GetDlgItem(IDC_CMB_PARTELEV)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_CMB_PARTELEV)->EnableWindow(TRUE);
}
}
void CWallPartDlg::OnBlkMaterial()
{
UpdateData(TRUE);
if (!m_bChkMaterial)
{
GetDlgItem(IDC_CMB_PARTMATERIAL)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_CMB_PARTMATERIAL)->EnableWindow(TRUE);
}
}
void CWallPartDlg::OnBlkUsing()
{
UpdateData(TRUE);
if (!m_bChkUsing)
{
GetDlgItem(IDC_CMB_USING)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_CMB_USING)->EnableWindow(TRUE);
}
}
void CWallPartDlg::OnBlkLeftKeep()
{
UpdateData(TRUE);
if (m_bChkRightKeep || m_bChkLeftKeep)
{
GetDlgItem(IDC_CHK_WALLTOP)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_CHK_WALLTOP)->EnableWindow(FALSE);
}
if (!m_bChkLeftKeep)
{
GetDlgItem(IDC_EDT_LEFTKEEP)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_EDT_LEFTKEEP)->EnableWindow(TRUE);
}
}
void CWallPartDlg::OnBlkRightKeep()
{
UpdateData(TRUE);
if (m_bChkRightKeep || m_bChkLeftKeep)
{
GetDlgItem(IDC_CHK_WALLTOP)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_CHK_WALLTOP)->EnableWindow(FALSE);
}
if (!m_bChkRightKeep)
{
GetDlgItem(IDC_EDT_RIGHTKEEP)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_EDT_RIGHTKEEP)->EnableWindow(TRUE);
}
}
HBRUSH CWallPartDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = WGroupDlg::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd->GetDlgCtrlID() == IDC_STATIC_PARTLEFTWIDTH)
{
pDC->SetTextColor(RGB(0,255,0)); //设置字体颜色
pDC->SetBkMode(TRANSPARENT); //设置背景透明
}
else if (pWnd->GetDlgCtrlID() == IDC_STATIC_PARTRIGHTWIDTH)
{
pDC->SetTextColor(RGB(255, 0, 255)); //设置字体颜色
pDC->SetBkMode(TRANSPARENT); //设置背景透明
}
return hbr;
}
void CWallPartDlg::OnDeltaposSpinLeftwidth(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
UpdateData(TRUE);
if (pNMUpDown->iDelta == 1)
{
m_iLeft += 10;
}
else if (pNMUpDown->iDelta == -1)
{
m_iLeft -= 10;
}
UpdateData(FALSE);
*pResult = 0;
}
void CWallPartDlg::OnDeltaposSpinRightwidth(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
UpdateData(TRUE);
if (pNMUpDown->iDelta == 1)
{
m_iRight += 10;
}
else if (pNMUpDown->iDelta == -1)
{
m_iRight -= 10;
}
UpdateData(FALSE);
*pResult = 0;
}
double CWallPartDlg::GetLeftWidth()
{
UpdateData(TRUE);
if (!m_bChkLeft)
{
return m_pWall->GetWidth(0);
}
return m_iLeft;
}
double CWallPartDlg::GetRightWidth()
{
UpdateData(TRUE);
if (!m_bChkRight)
{
return m_pWall->GetWidth(1);
}
return m_iRight;
}
double CWallPartDlg::GetHeight()
{
UpdateData(TRUE);
if (!m_bChkHeight)
{
return m_pWall->GetHeight();
}
if (m_strHeight == _T("当前层高"))
{
return DocGetLHeight();
}
return _tstof(m_strHeight);
}
double CWallPartDlg::GetElevation()
{
UpdateData(TRUE);
if (!m_bChkElev)
{
//m_pWall->GetElevation();
return m_pWall->GetElevation();
}
return _tstof(m_strElev);
}
TWallData::TWallStyle CWallPartDlg::GetMaterialStyle(CString &sT20Mat)
{
UpdateData(TRUE);
TWallData::TWallStyle st = TWallData::kBrick; // 砖墙
st = TWallData::kBrick;
if (!m_bChkMaterial)
{
st = m_pWall->GetStyle();
return st;
}
switch(m_iMaterial)
{
case 0:
sT20Mat = WALLMATE_Concrete;
st = TWallData::kConcrete;
break;
case 1:
sT20Mat = WALLMATE_Concrete1;
st = TWallData::kConcrete;
break;
case 2:
sT20Mat = WALLMATE_Brick;
st = TWallData::kBrick;
break;
case 3:
sT20Mat = WALLMATE_Brick1;
st = TWallData::kBrick;
break;
case 4:
sT20Mat = WALLMATE_Rocket;
st = TWallData::kRocket;
break;
case 5:
sT20Mat = WALLMATE_Rocket1;
st = TWallData::kRocket;
break;
case 6:
sT20Mat = WALLMATE_Fill;
st = TWallData::kFill;
break;
case 7:
sT20Mat = WALLMATE_Fill1;
st = TWallData::kFill1;
break;
case 8:
sT20Mat = WALLMATE_Fill2;
st = TWallData::kFill2;
break;
case 9:
sT20Mat = WALLMATE_Divider;
st = TWallData::kDivider;
break;
case 10:
sT20Mat = WALLMATE_Curtain;
st = TWallData::kCurtain;
break; }
return st;
}
TWallData::UsageFlag CWallPartDlg::GetUsage()
{
UpdateData(TRUE);
TWallData::UsageFlag us=TWallData::kNormal;
if (!m_bChkUsing)
{
us = m_pWall->GetUsageFlag();
return us;
}
switch(m_iUsing)
{
case 0:
{
us=TWallData::kNormal;
break;
}
case 1:
{
us=TWallData::kApartment;
break;
}
case 2:
{
us=TWallData::kVirtual;
break;
}
case 3:
{
us=TWallData::kParapet;
break;
}
}
return us;
}
int CWallPartDlg::GetLeftKeep()
{
UpdateData(TRUE);
return m_iLeftKeep;
}
int CWallPartDlg::GetRightKeep()
{
UpdateData(TRUE);
return m_iRigntKeep;
}
BOOL CWallPartDlg::GetIsLeft()
{
UpdateData(TRUE);
return m_bChkLeftKeep;
}
BOOL CWallPartDlg::GetIsRight()
{
UpdateData(TRUE);
return m_bChkRightKeep;
}
BOOL CWallPartDlg::GetIsTwoSide()
{
UpdateData(TRUE);
return m_bChkTwoSide;
}
void CWallPartDlg::SetWallPoint(TDbWall *pWall)
{
m_pWall = pWall;
}
AcDbObjectId Curtain2Wall(Entity entWall, CString csLayer = _T(""));
AcDbObjectId Curtain2Wall(Entity entWall, CString csLayer)
{
XDbObject obj(entWall, AcDb::kForWrite);
if (!obj)
{
return AcDbObjectId::kNull;
}
TDbCurtainWall *pWall = TDbCurtainWall::cast(obj.m_pObject);
if (pWall == NULL)
{
return AcDbObjectId::kNull;
}
AcDbObjectId idSurf = pWall->GetLayerSurf2d();
if (!idSurf.isValid())
pWall->SetLayerSurf2d(InitLayer(LAY_SURFACE));
AcDbCurve *pCv = pWall->GetAcDbCurve(0);
if (pCv == NULL)
{
return AcDbObjectId::kNull;
}
TDbWall *pCWall = (TDbWall*)TDbWall::desc()->create();
if (pCWall == NULL)
{
return AcDbObjectId::kNull;
}
pCWall->SetFromCurve((*pCv));
pCWall->copyFrom(pWall);
DList<AcDbSoftPointerId> listBindWinid, idlist;
for (int i=0; i<pWall->GetOpeningIdList().Length(); i++)
{
AcDbEntity *pEnt = NULL;
AcDbSoftPointerId id = pWall->GetOpeningIdList()[i];
Acad::ErrorStatus es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead);
if (pEnt == NULL)
continue;
if (pEnt->isKindOf(TDbBandWin::desc())) // 判断是否是带形窗
{
TDbBandWin *pBandWin = TDbBandWin::cast(pEnt);
if (pBandWin != NULL)
{
long nNum = pBandWin->GetWallNum();
for (int j=0; j<nNum; j++)
{
AcDbObjectId idTem = pBandWin->GetWallId(j);
if (idTem == pWall->objectId())
{
pWall->RemoveReferenceOpening(id);
i--;
}
}
}
listBindWinid.Append(&id);
}
pEnt->close();
}
pWall->MoveOpeningTo(*pCWall);
pWall->MovePatchTo(*pCWall);
pCWall->ChangeElevation(pWall->GetElevation(), FALSE);
pCWall->SetHeight(pWall->GetHeight());
pCWall->SetWidth(0, pWall->GetWidth(0));
pCWall->SetWidth(1, pWall->GetWidth(1));
pCWall->SetStyle(TWallData::kBrick);
pCWall->SetUsageFlag(pWall->GetUsageFlag());
AcDbObjectId idNew = pCWall->AddToMSpace(Adesk::kTrue),
idOld = pWall->objectId();
for (i=0; i<listBindWinid.Length(); i++)
{
AcDbEntity *pEnt = NULL;
AcDbSoftPointerId id = *listBindWinid[i];
Acad::ErrorStatus es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite);
if (pEnt == NULL)
continue;
TDbBandWin *pBandWin = TDbBandWin::cast(pEnt);
if (pBandWin != NULL)
{
long nNum = pBandWin->GetWallNum();
for (int j=0; j<nNum; j++)
{
AcDbObjectId idTem = pBandWin->GetWallId(j);
if (idTem == idOld)
{
pBandWin->SetWallId(j, idNew);
}
}
}
pEnt->close();
}
return idNew;
}