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

682 lines
15 KiB
C++

#include "stdafx.h"
#include "StdArx.h"
#include "HZQTDlg.h"
#include "JMSJDlg.h"
#include "GLTKDlg.h"
#include "KTSetting.h"
DLLIMPEXP CString IDCreate();
IMPLEMENT_DYNAMIC(CHZQTDlg, CDialog)
int g_nWallNo = 1;
static const Adesk::UInt16 kColorByBlock = 0;
static const Adesk::UInt16 kColorByLayer = 256;
static const LPCTSTR g_pszWallMaterials[] = { _T("钢筋混凝土"), _T("石材"), _T("砖墙"), _T("填充墙"), _T("玻璃幕墙"),_T("轻质隔墙"),NULL };
static const int g_nWallColorIndex[] = { kColorByLayer,252,1,254,4,6,256};
CHZQTDlg::CHZQTDlg(CWnd* pParent/* = NULL*/)
: CDialog(CHZQTDlg::IDD, pParent)
,m_dW(400.0)
,m_dH(3000.0)
,m_dE(0.0)
,m_sMaterial(_T("钢筋混凝土"))
,m_bUserDefSec(FALSE)
,m_nDrawType(0)
,m_nAlign(0)
,m_dOffset(0)
,m_dW2(500.0)
,m_dH2(500.0)
,m_bHasW2(FALSE)
,m_nW2Pos(FALSE)
, m_sNo(_T(""))
, m_bWallMix(FALSE)
, m_bNOSetDefault(TRUE)
, m_sHatch(HATCH_DEFAULT)
, m_bAddHatch(TRUE)
, m_dLW(200)
{
m_pSectionReg = NULL;
m_bExJoin = TRUE;
m_dLW = 0.5 * m_dW;
GET_CACHE(CHZQTDlg
, %f%f%f%f%f%f%d%d%d%d%d%d%s%s%d%f
, &m_dW
, &m_dH
, &m_dE
, &m_dOffset
, &m_dH2
, &m_dW2
, &m_bUserDefSec
, &m_bHasW2
, &m_bExJoin
, &m_nAlign
, &m_nDrawType
, &m_nW2Pos
, &m_sMaterial
, &m_sHatch
, &m_bWallMix
, &m_dLW);
g_nWallNo++;
m_sNo.Format(_T("W-%d"),g_nWallNo);
m_bUserDefSec = FALSE;//不记忆
m_dEOld = 0.0;
m_dLW = 0.5 * m_dW;
if (m_bNOSetDefault)
m_sNo = IDCreate();
m_nWallColor = kColorByLayer;
for (int i = 0; i < 20; i++)
{
if (g_pszWallMaterials[i] == NULL)
break;
if (_tcscmp(g_pszWallMaterials[i], m_sMaterial) == 0)
{
m_nWallColor = g_nWallColorIndex[i];
}
}
}
CHZQTDlg::~CHZQTDlg(void)
{
}
void CHZQTDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_dW);
DDX_Text(pDX, IDC_EDIT12, m_dH);
DDX_Text(pDX, IDC_EDIT2, m_dE);
DDX_Check(pDX, IDC_CHECK1, m_bUserDefSec);
DDX_Check(pDX, IDC_CHECK2, m_bHasW2);
DDX_Check(pDX, IDC_CHECK3, m_bExJoin);
DDX_Radio(pDX, IDC_RADIO1, m_nAlign);
DDX_Radio(pDX, IDC_RADIO4, m_nDrawType);
DDX_Radio(pDX, IDC_RADIO7, m_nW2Pos);
DDX_Text(pDX, IDC_EDIT5, m_dOffset);
DDX_Text(pDX, IDC_EDIT4, m_sRegScr);
DDX_Control(pDX, IDC_RADIO4, m_wndBtLnWall);
DDX_Control(pDX, IDC_RADIO5, m_wndBtCrWall);
DDX_Control(pDX, IDC_RADIO6, m_wndBtRcWall);
DDX_Text(pDX, IDC_EDIT13, m_dW2);
DDX_Text(pDX, IDC_EDIT14, m_dH2);
DDX_CBString(pDX, IDC_COMBO1, m_sMaterial);
DDX_Text(pDX, IDC_EDIT6, m_sNo);
DDX_Check(pDX, IDC_CHECK4, m_bWallMix);
DDX_Check(pDX, IDC_CHECK5, 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);
DDX_Control(pDX, IDC_COMBO1, m_wndComboMaterials);
DDX_Text(pDX, IDC_EDIT3, m_dLW);
}
BEGIN_MESSAGE_MAP(CHZQTDlg, CDialog)
ON_BN_CLICKED(IDOK, &CHZQTDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_CHECK1, &CHZQTDlg::OnBnClickedCheck1)
ON_BN_CLICKED(IDC_CHECK5, &CHZQTDlg::OnBnClickedCheck5)
ON_BN_CLICKED(IDC_BTN_FILL, &CHZQTDlg::OnBnClickedBtnHatch)
ON_BN_CLICKED(IDC_CHECK_HATCH, &CHZQTDlg::OnBnClickedCheckHatch)
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_STATIC_COLOR, OnStaticColor)
ON_CBN_SELENDOK(IDC_COMBO1, &CHZQTDlg::OnCbnSelendokCombo1)
ON_BN_CLICKED(IDC_RADIO1, &CHZQTDlg::OnBnClickedRadio1)
ON_BN_CLICKED(IDC_RADIO2, &CHZQTDlg::OnBnClickedRadio2)
ON_BN_CLICKED(IDC_RADIO3, &CHZQTDlg::OnBnClickedRadio3)
END_MESSAGE_MAP()
BOOL CHZQTDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap bmp32;
if (!bmp32.LoadBitmap(IDB_BITMAP10))
{
AfxMessageBox(_T("Can't load bitmap: %x\n"), IDB_BITMAP10);
ASSERT(FALSE);
return FALSE;
}
BITMAP bmpObj32;
bmp32.GetBitmap(&bmpObj32);
UINT nFlags = ILC_COLOR24 | ILC_MASK;
m_Imagelist32.Create(32, bmpObj32.bmHeight, nFlags, 0, 0);
m_Imagelist32.Add(&bmp32, RGB(255, 0, 0));
/*m_wndBtLnWall.SetButtonStyle(BS_RADIOBUTTON | BS_PUSHBUTTON | BS_OWNERDRAW);
m_wndBtCrWall.SetButtonStyle(BS_RADIOBUTTON | BS_PUSHBUTTON | BS_OWNERDRAW);
m_wndBtRcWall.SetButtonStyle(BS_RADIOBUTTON | BS_PUSHBUTTON | BS_OWNERDRAW);
m_wndBtLnWall.SetIcon(m_Imagelist32.ExtractIcon(0));
m_wndBtRcWall.SetIcon(m_Imagelist32.ExtractIcon(1));
m_wndBtCrWall.SetIcon(m_Imagelist32.ExtractIcon(2));*/
if (m_idWall.isValid())
{
GetDlgItem(IDC_RADIO4)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO4)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_RADIO5)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO5)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_RADIO6)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO6)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_RADIO10)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO10)->ShowWindow(SW_HIDE);
}
if (m_bUserDefSec)//异型截面墙
{
GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT12)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT13)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT14)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO3)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO7)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO8)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO9)->EnableWindow(FALSE);
}
if (m_bNOSetDefault)
{
GetDlgItem(IDC_EDIT6)->EnableWindow(FALSE);
}
m_wndBtHatch.EnableWindow(m_bAddHatch);
GetDlgItem(IDC_EDIT3)->EnableWindow(m_nAlign == 0 ? TRUE : FALSE);
UpdateData(FALSE);
return TRUE;
}
void CHZQTDlg::OnBnClickedOk()
{
UpdateData();
//数据校验
if (m_bUserDefSec)
{
if (m_dH < 1.0 || m_dW < 1.0)
{
AfxMessageBox(_T("墙体厚度和总高尺寸不正确!"));
return;
}
if (m_bHasW2)
{
if (m_dH2 < 1.0 || m_dW2 < 1.0)
{
AfxMessageBox(_T("不等厚墙体尺寸设置不正确!"));
}
}
}
if (m_dLW < -1.e-10)
{
AfxMessageBox(_T("墙体左厚尺寸设置不正确!"));
return;
}
if (m_idWall.isValid())
{
UpdateWallData();
}
SET_CACHE(CHZQTDlg
, %f%f%f%f%f%f%d%d%d%d%d%d%s%s%d%f
, m_dW
, m_dH
, m_dE
, m_dOffset
, m_dH2
, m_dW2
, m_bUserDefSec
, m_bHasW2
, m_bExJoin
, m_nAlign
, m_nDrawType
, m_nW2Pos
, m_sMaterial
, m_sHatch
, m_bWallMix
, m_dLW);
OnOK();
}
extern double GetExtendCurveJoin(AcDbRegion* pRegSect,double& dW);
void CHZQTDlg::OnBnClickedCheck1()
{
UpdateData();
if (m_bUserDefSec)
{
//
CGLTKDlg dlg(CGLTKDlg::eSelect, _T("poolstandard.db"), _T("standard"), CGLTKDlg::drawRegion);
if ( IDOK == dlg.DoModal() )
{
CString sScr;
if (dlg.GetCrossSectionScr(sScr))
{
CString sFullPath = FilePath::GetSysDir();
sFullPath.MakeLower();
sFullPath += _T("\\JMSJ.sat");
CStdioFile file;
if (file.Open(sFullPath,CFile::modeCreate |CFile::modeWrite ))
{
file.WriteString(sScr);
file.Close();
}
AcDbVoidPtrArray arBodyPtrs;
if ( Acad::eOk == AcDbBody::acisIn(sFullPath,arBodyPtrs) )
{
if (arBodyPtrs.length() > 0)
{
AcDbEntity* pEnt = (AcDbEntity*)arBodyPtrs.first();
AcDbRegion* pRegion = AcDbRegion::cast(pEnt);
if (pRegion != NULL)
{
m_pSectionReg = pRegion;
m_sRegScr = sScr;
GetExtendCurveJoin(pRegion,m_dW);;
AcDbExtents ext;
m_pSectionReg->getGeomExtents(ext);
//m_dW = ext.maxPoint().x - ext.minPoint().x;
m_dH = ext.maxPoint().y - ext.minPoint().y;
int nDw = (int)(m_dW * 10.0);
int nDh = (int)(m_dH * 10.0);
m_dW = nDw / 10;
m_dH = nDh / 10;
m_dH2 = 0.0;
m_dW2 = 0.0;
m_nAlign = 0;
}
}
}
UpdateData(FALSE);
}
}
GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT12)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT13)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT14)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO3)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO7)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO8)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO9)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_RADIO1)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO2)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO3)->EnableWindow(TRUE);
}
if (m_pSectionReg == NULL)
{
m_bUserDefSec = FALSE;
}
UpdateData(FALSE);
}
AcDbRegion* CHZQTDlg::GetUserDefSection(CString& sScr) const
{
sScr = m_sRegScr;
return m_pSectionReg;
}
void CHZQTDlg::SetFromWall(AcDbObjectId& id)
{
m_bUserDefSec = FALSE;
m_idWall = id;
AcAxDocLock lock;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
AecDbXWall* pWall = AecDbXWall::cast(pEnt);
if (pWall != NULL)
{
WallData data;
pWall->GetWallData(data);
pWall->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, m_sNo);
pWall->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_SECTION_HATCH, m_sHatch);
pWall->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("COLOR"), m_nWallColor);
pWall->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_L, m_dLW);
if (m_sHatch == HATCH_NO_NEED)
m_bAddHatch = FALSE;
else
m_bAddHatch = TRUE;
m_dW = data.dThick;
m_dH = data.dH;
m_dE = data.dBomEl;
m_sMaterial = data.szMat;
m_dEOld = m_dE;
if ( data.nSecShape == eWw)//不等宽墙体
{
m_nW2Pos = data.nW2Pos;
m_dH2 = data.dH2;
m_dW2 = data.dThick2;
m_bHasW2 = TRUE;
}
else if (data.nSecShape == eUserDef)//自定义
{
m_bUserDefSec = TRUE;
pWall->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_SECTIONSCR,m_sRegScr);
CString sFullPath = FilePath::GetSysDir();
sFullPath.MakeLower();
sFullPath += _T("\\JMSJ.sat");
CStdioFile file;
if (file.Open(sFullPath,CFile::modeCreate |CFile::modeWrite ))
{
file.WriteString(m_sRegScr);
file.Close();
}
AcDbVoidPtrArray arBodyPtrs;
if ( Acad::eOk == AcDbBody::acisIn(sFullPath,arBodyPtrs) )
{
if (arBodyPtrs.length() > 0)
{
AcDbEntity* pEnt = (AcDbEntity*)arBodyPtrs.first();
AcDbRegion* pRegion = AcDbRegion::cast(pEnt);
if (pRegion != NULL)
{
m_pSectionReg = pRegion;
AcDbExtents ext;
m_pSectionReg->getGeomExtents(ext);
m_dW = ext.maxPoint().x - ext.minPoint().x;
m_dH = ext.maxPoint().y - ext.minPoint().y;
int nDw = (int)(m_dW * 10.0);
int nDh = (int)(m_dH * 10.0);
m_dW = nDw / 10;
m_dH = nDh / 10;
m_dH2 = 0.0;
m_dW2 = 0.0;
}
}
}
}
switch(data.kAlign)
{
case kMid:
{
m_nAlign = 0;
break;
}
case kLeft:
{
m_nAlign = 1;
break;
}
case kRight:
{
m_nAlign = 2;
break;
}
default:
break;
}
}
pEnt->close();
}
}
void CHZQTDlg::UpdateWallData()
{
AcAxDocLock lock;
double dThick = -1;
AcDbObjectIdArray arAssocIds;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,m_idWall,AcDb::kForWrite))
{
AecDbXWall* pWall = AecDbXWall::cast(pEnt);
if (pWall != NULL)
{
pWall->GetSpecialtyData()->SetAt(KEY_NO,m_sNo);
pWall->GetSpecialtyData()->SetAt(KEY_SECTION_HATCH, m_sHatch);
pWall->GetSpecialtyData()->SetAt(_T("COLOR"), m_nWallColor);
//之前的数据
WallData data;
pWall->GetWallData(data);
//新的数据
EAlign eAlign = kMid;
if (m_nAlign == 0)
{
eAlign = kMid;
}
else if (m_nAlign == 1)
{
eAlign = kLeft;
}
else
{
eAlign = kRight;
}
//设置墙体数据
if (m_bUserDefSec)
{
////临时异形截面墙体不对齐处理.
eAlign = kMid;
//pWall->SetWallData(m_dW,m_dH,m_dE,eAlign);
pWall->SetWallData(m_dE,eAlign);
pWall->SetSection(m_pSectionReg,AcGePoint3d::kOrigin);
pWall->GetSpecialtyData()->SetAt(KEY_SECTIONSCR,m_sRegScr);
pWall->GetSpecialtyData()->SetAt(KEY_MATERIAL, m_sMaterial);
}
else if(m_bHasW2)
{
WallData data;
pWall->GetWallData(data);
pWall->SetWallData(m_dW,m_dH,m_dW2,m_dH2,m_nW2Pos,m_dE,eAlign);
pWall->AdjustHoleAndPipe(m_dW - data.dThick);
pWall->GetSpecialtyData()->SetAt(KEY_MATERIAL, m_sMaterial);
}
else
{
WallData data;
pWall->GetWallData(data);
pWall->SetWallData(m_dW,m_dH,m_dE,eAlign);
pWall->AdjustHoleAndPipe(m_dW - data.dThick);
pWall->GetSpecialtyData()->SetAt(KEY_MATERIAL, m_sMaterial);
dThick = m_dW;
}
AcGeMatrix3d xformEl;
AcGeVector3d vtMove(0,0,m_dE - m_dEOld);
xformEl.setToTranslation(vtMove);
pWall->TransformDTYGPartEnt(xformEl);
pWall->TransformAssocPartEnt(xformEl);
pWall->GetAssocPartIds(arAssocIds);
}
pEnt->close();
//修改所有门窗厚度
if (dThick > 1.e-6)
{
Acad::ErrorStatus es;
AcDbEntity *pEnt = NULL;
AcDbObjectId id;
for (int i = 0; i < arAssocIds.length(); i++)
{
id = arAssocIds.at(i);
if (Acad::eOk == (es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite)))
{
AecDbXOpening *pOpen = AecDbXOpening::cast(pEnt);
if (pOpen != NULL)
{
OpeningData data;
memset(&data, 0, sizeof(OpeningData));
pOpen->GetOpeningData(data);
data.dThick = dThick;
pOpen->UpdateOpeningData(data);
}
pEnt->close();
}
}
}
}
}
void CHZQTDlg::OnBnClickedCheck5()
{
UpdateData();
if (m_bNOSetDefault)
{
GetDlgItem(IDC_EDIT6)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_EDIT6)->EnableWindow(TRUE);
}
}
extern bool __cdecl acedHatchPalletteDialog(wchar_t const* , bool , wchar_t *&);
void CHZQTDlg::OnBnClickedBtnHatch()
{
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 CHZQTDlg::OnBnClickedCheckHatch()
{
UpdateData();
m_wndBtHatch.EnableWindow(m_bAddHatch);
if (!m_bAddHatch)
m_sHatch = HATCH_NO_NEED;
else
m_sHatch = HATCH_DEFAULT;
UpdateData(FALSE);
}
HBRUSH CHZQTDlg::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_nWallColor == kColorByLayer)
{
//提取墙体图层的颜色
static int nColor = KTSetting::GetLayerColor(_T("LAY_WALL"));
crColor = acedGetRGB(nColor);
}
else
{
crColor = acedGetRGB(m_nWallColor);
}
CRect rc;
pWnd->GetClientRect(rc);
pDC->FillSolidRect(rc, crColor);
}
}
return hbr;
}
void CHZQTDlg::OnStaticColor()
{
acedSetColorDialog(m_nWallColor, Adesk::kFalse, m_nWallColor);
if (m_nWallColor == 0)
m_nWallColor = kColorByLayer;
Invalidate();
}
void CHZQTDlg::OnCbnSelendokCombo1()
{
int iSel = m_wndComboMaterials.GetCurSel();
if (iSel > -1 && iSel < 6)
{
m_nWallColor = g_nWallColorIndex[iSel];
}
Invalidate();
}
void CHZQTDlg::OnBnClickedRadio1()
{
UpdateData();
GetDlgItem(IDC_EDIT3)->EnableWindow(TRUE);
m_dLW = 0.5 * m_dW;
UpdateData(FALSE);
}
void CHZQTDlg::OnBnClickedRadio2()
{
UpdateData();
m_dLW = 0;
UpdateData(FALSE);
GetDlgItem(IDC_EDIT3)->EnableWindow(FALSE);
}
void CHZQTDlg::OnBnClickedRadio3()
{
UpdateData();
m_dLW = 0;
UpdateData(FALSE);
GetDlgItem(IDC_EDIT3)->EnableWindow(FALSE);
}