1058 lines
26 KiB
C++
1058 lines
26 KiB
C++
// WallDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include "WallDlg.h"
|
|
// NO MSG is required
|
|
#include "TgAs.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
int OsGetPointWall(double *ptFrom, const TCHAR *prompt, XPoint &pt, const TCHAR *kword=NULL, int *kwordId=NULL, BOOL *bDiscontinue=NULL);
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CWallDlg dialog
|
|
|
|
//---add by fxj-----
|
|
BOOL CWallDlg::m_bgroupStatus = FALSE;
|
|
|
|
IMPLEMENT_DYNAMIC(CWallDlg,CObjPreviewDlg)
|
|
|
|
CWallDlg::CWallDlg(const TDbWall &wall, CWnd* pParent /*=NULL*/)
|
|
: CObjPreviewDlg(IDD,pParent)
|
|
{
|
|
m_nUse = 0;
|
|
m_pWall = (TDbWall*)wall.clone();
|
|
Obj2Dlg(m_pWall);
|
|
}
|
|
|
|
CWallDlg::~CWallDlg()
|
|
{
|
|
if (!m_pWall)
|
|
delete m_pWall;
|
|
}
|
|
|
|
void CWallDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CObjPreviewDlg::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CWallDlg)
|
|
// DDX_Text(pDX, IDC_BASE_ELEVATION, m_csElevation);
|
|
|
|
// ----------Modified by fxj 080528-------------
|
|
DDX_Control(pDX, IDC_LIST_DATA, m_listCtrl);
|
|
DDX_Check(pDX, IDC_CHECK_LEFT, m_bLeftInsulate);
|
|
DDX_Check(pDX, IDC_CHECK_RIGHT, m_bRightInsulate);
|
|
|
|
// sg add 100511,增加墙端头保温
|
|
DDX_Check(pDX, IDC_CHECK_STEM, m_bStemInsulate);
|
|
|
|
// modified by fxj 090504
|
|
if (pDX->m_bSaveAndValidate)
|
|
{
|
|
CString sLeftWidth, sRightWidth, sInsulateThick, sInsulateThick2;
|
|
DDX_Text(pDX, IDC_LEFT_WIDTH, sLeftWidth);
|
|
DDX_Text(pDX, IDC_RIGHT_WIDTH, sRightWidth);
|
|
DDX_Text(pDX, IDC_INSULATE_THICK, sInsulateThick);
|
|
DDX_Text(pDX, IDC_INSULATE_THICK2, sInsulateThick2);
|
|
|
|
m_nLeftWidth=_tstof(sLeftWidth);
|
|
m_nRightWidth=_tstof(sRightWidth);
|
|
m_dInsulateThick=_tstof(sInsulateThick);
|
|
m_dInsulateThick2=_tstof(sInsulateThick2);
|
|
}
|
|
else
|
|
{
|
|
CString sLeftWidth, sRightWidth, sInsulateThick, sInsulateThick2;
|
|
sLeftWidth.Format(_T("%lg"), m_nLeftWidth);
|
|
sRightWidth.Format(_T("%lg"), m_nRightWidth);
|
|
sInsulateThick.Format(_T("%lg"), m_dInsulateThick);
|
|
sInsulateThick2.Format(_T("%lg"), m_dInsulateThick2);
|
|
|
|
DDX_Text(pDX, IDC_LEFT_WIDTH, sLeftWidth);
|
|
DDX_Text(pDX, IDC_RIGHT_WIDTH, sRightWidth);
|
|
DDX_Text(pDX, IDC_INSULATE_THICK, sInsulateThick);
|
|
DDX_Text(pDX, IDC_INSULATE_THICK2, sInsulateThick2);
|
|
}
|
|
|
|
DDX_Control(pDX,IDC_GROUP3,m_group);
|
|
DDX_GroupStatus(pDX,IDC_GROUP3,m_bgroupStatus);
|
|
DDX_Control(pDX, IDC_HEIGHT, m_comHeight);
|
|
DDX_CBString(pDX, IDC_HEIGHT, m_csWallHeight);
|
|
DDX_CBString(pDX, IDC_ELEV, m_csWallElev);
|
|
|
|
if (pDX->m_bSaveAndValidate && _tstof(m_csWallHeight)<-_DIST_SNAP)
|
|
pDX->Fail();
|
|
|
|
// add by xly on 110304 墙体对象编辑时更新墙体数据
|
|
if (!pDX->m_bSaveAndValidate)
|
|
{
|
|
m_comHeight.SetWindowText(m_csWallHeight);
|
|
}
|
|
|
|
DDX_Text(pDX, IDC_WALL_RADIUS, m_csRadius);
|
|
DDX_CBIndex(pDX, IDC_MATERIAL, m_nStyle);
|
|
DDX_CBIndex(pDX, IDC_COMBO_USE, m_nUse);
|
|
|
|
// [2010-3-25 wubo] C004-08 当墙体用途设为虚墙时,除用途外,所有控件都变灰。
|
|
bool bEnable = m_nUse != 3;
|
|
GetDlgItem(IDC_HEIGHT)->EnableWindow(bEnable); // 墙高
|
|
GetDlgItem(IDC_ELEV)->EnableWindow(bEnable); // 底高
|
|
GetDlgItem(IDC_LEFT_WIDTH)->EnableWindow(bEnable); // 左宽
|
|
GetDlgItem(IDC_RIGHT_WIDTH)->EnableWindow(bEnable); // 右宽
|
|
GetDlgItem(IDC_LIST_DATA)->EnableWindow(bEnable); // 宽度列表
|
|
GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(bEnable); // 【左】按钮
|
|
GetDlgItem(IDC_BUTTON_MID)->EnableWindow(bEnable); // 【右】按钮
|
|
GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(bEnable); // 【中】按钮
|
|
GetDlgItem(IDC_BUTTON_CHANGE)->EnableWindow(bEnable); // 【交换】按钮
|
|
GetDlgItem(IDC_CHECK_LEFT)->EnableWindow(bEnable); // 左侧保温
|
|
GetDlgItem(IDC_CHECK_RIGHT)->EnableWindow(bEnable); // 右侧保温
|
|
GetDlgItem(IDC_CHECK_PARTEDIT)->EnableWindow(bEnable); // 【选侧墙段】按钮
|
|
|
|
// sg add 100906,只有墙体某侧有保温时,“墙端保温”才可编辑
|
|
bEnable = (m_nUse!=3) && (m_bLeftInsulate || m_bRightInsulate);
|
|
GetDlgItem(IDC_CHECK_STEM)->EnableWindow(bEnable); // 端头保温
|
|
|
|
// sg add 100511,当墙体用途为矮墙时,“材料”一项变灰
|
|
bEnable = m_nUse!=3 && m_nUse!=4;
|
|
GetDlgItem(IDC_MATERIAL)->EnableWindow(bEnable); // 材料
|
|
|
|
// sg add 100511,根据是否设置保温,控制保温层厚是否可以编辑
|
|
bEnable = m_nUse!=3 && m_bLeftInsulate;
|
|
GetDlgItem(IDC_INSULATE_THICK)->EnableWindow(bEnable); // 保温层厚1
|
|
bEnable = m_nUse!=3 && m_bRightInsulate;
|
|
GetDlgItem(IDC_INSULATE_THICK2)->EnableWindow(bEnable); // 保温层厚2
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CWallDlg, CObjPreviewDlg)
|
|
//{{AFX_MSG_MAP(CWallDlg)
|
|
ON_WM_CTLCOLOR()
|
|
|
|
//-------------delete by fxj 080528--------
|
|
// ON_BN_CLICKED(IDC_CHECK_PARTEDIT, OnBnClickedCheckPartedit)
|
|
// ON_BN_CLICKED(IDC_BUTTON_SELECT, OnBnClickedButtonSelect)
|
|
|
|
// -------------add by fxj 080528----------------
|
|
ON_CBN_SELCHANGE(IDC_MATERIAL, OnSelchangeMaterial)
|
|
ON_LBN_SELCHANGE(IDC_LIST_DATA, OnSelchangeListData)
|
|
ON_BN_CLICKED(IDC_BUTTON_LEFT, OnButtonLeft)
|
|
ON_BN_CLICKED(IDC_BUTTON_MID, OnButtonMid)
|
|
ON_BN_CLICKED(IDC_BUTTON_RIGHT, OnButtonRight)
|
|
ON_BN_CLICKED(IDC_BUTTON_CHANGE, OnButtonChange)
|
|
ON_BN_CLICKED(IDC_CHECK_LEFT, OnCheckLeftIns)
|
|
ON_BN_CLICKED(IDC_CHECK_RIGHT,OnCheckRightIns)
|
|
ON_EN_CHANGE(IDC_INSULATE_THICK,OnChangeInsThick)
|
|
ON_EN_CHANGE(IDC_WALL_RADIUS,OnChangeRadius)
|
|
ON_EN_CHANGE(IDC_LEFT_WIDTH,OnChangeLeftWidth)
|
|
ON_EN_CHANGE(IDC_RIGHT_WIDTH,OnChangeRightWidth)
|
|
ON_EN_KILLFOCUS(IDC_INSULATE_THICK,OnKFInsThick)
|
|
ON_EN_KILLFOCUS(IDC_LEFT_WIDTH,OnKFLeftWidth)
|
|
ON_EN_KILLFOCUS(IDC_RIGHT_WIDTH,OnKFRightWidth)
|
|
ON_EN_KILLFOCUS(IDC_WALL_RADIUS,OnKFRadius)
|
|
|
|
// sg add 100511,增加墙端头保温
|
|
ON_BN_CLICKED(IDC_CHECK_STEM, OnCheckStemIns)
|
|
|
|
//}}AFX_MSG_MAP
|
|
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
|
|
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
|
|
// [2010-3-25 wubo] C004-08 当墙体用途设为虚墙时,除用途外,所有控件都变灰。
|
|
ON_CBN_SELCHANGE(IDC_COMBO_USE, OnCbnSelchangeComboUse)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CWallDlg message handlers
|
|
BOOL CWallDlg::OnInitDialog()
|
|
{
|
|
CObjPreviewDlg::OnInitDialog();
|
|
|
|
// sg add 100714,增加左侧保温、右侧保温对应的控件显示名称,区分内墙、外墙显示不同
|
|
GetDlgItem(IDC_CHECK_LEFT)->SetWindowText(m_csLeftCheckName);
|
|
GetDlgItem(IDC_CHECK_RIGHT)->SetWindowText(m_csRightCheckName);
|
|
|
|
if (_tstof(m_csRadius)<_DIST_SNAP)
|
|
{
|
|
GetDlgItem(IDC_WALL_RADIUS)->EnableWindow(FALSE);
|
|
}
|
|
// m_selectButton.EnableWindow(m_bpartEdit);// Add By LCF 2004/07/01
|
|
|
|
//---------add by fxj 080528----------
|
|
m_wndToolTip.Create(this);
|
|
m_wndToolTip.Activate(true);
|
|
m_wndToolTip.SetDelayTime(TTDT_INITIAL, 500);
|
|
|
|
CWnd *pWnd = GetDlgItem(IDC_LIST_DATA);
|
|
m_wndToolTip.AddTool(pWnd, _T("按Delete键删除墙厚数据"));
|
|
|
|
CComboBox *pBox = (CComboBox*)GetDlgItem(IDC_MATERIAL);
|
|
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_nStyle);
|
|
|
|
CComboBox *pBox1 = (CComboBox*)GetDlgItem(IDC_COMBO_USE);
|
|
pBox1->ResetContent();
|
|
pBox1->AddString(_T("外墙"));
|
|
pBox1->AddString(_T("内墙"));
|
|
pBox1->AddString(_T("分户墙"));
|
|
pBox1->AddString(_T("虚墙"));
|
|
pBox1->AddString(_T("矮墙"));
|
|
pBox1->AddString(_T("卫生隔断"));
|
|
pBox1->SetCurSel(m_nUse);
|
|
|
|
OnSelchangeMaterial();
|
|
UpdateData(FALSE);
|
|
UpdateImage();
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CWallDlg::OnChangeLeftWidth()
|
|
{
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnChangeRightWidth()
|
|
{
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnChangeInsThick()
|
|
{
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnChangeRadius()
|
|
{
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnKFInsThick()
|
|
{
|
|
if (GetDlgItem(IDCANCEL)!=GetFocus())
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnKFLeftWidth()
|
|
{
|
|
if (GetDlgItem(IDCANCEL)!=GetFocus())
|
|
UpdateImage();
|
|
}
|
|
void CWallDlg::OnKFRightWidth()
|
|
{
|
|
if (GetDlgItem(IDCANCEL)!=GetFocus())
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnKFRadius()
|
|
{
|
|
if (GetDlgItem(IDCANCEL)!=GetFocus())
|
|
UpdateImage();
|
|
}
|
|
|
|
AcDbEntity *CWallDlg::NewObject()
|
|
{
|
|
TDbWall* pWall=TDbWall::cast(m_pWall->clone());
|
|
|
|
AcDbObjectId idSurf=pWall->GetLayerSurf2d();
|
|
if (!idSurf.isValid())
|
|
pWall->SetLayerSurf2d(InitLayer(LAY_SURFACE));
|
|
|
|
return pWall;
|
|
}
|
|
|
|
|
|
void CWallDlg::Dlg2Obj(AcDbEntity *pObj)
|
|
{
|
|
TDbWall *pWall = TDbWall::cast(pObj);
|
|
ASSERT(pObj);
|
|
|
|
if (pWall->Is(CURVE_ARC)) // 改变半径
|
|
{
|
|
double nChordLen = pWall->XLine::GetLength();
|
|
if (nChordLen<2.0*_tstof(m_csRadius)-1.0E-6)
|
|
{
|
|
BOOL bOverPi = (pWall->GetBulge()>PI);
|
|
double nAng = 2.0*asin(nChordLen/2.0/_tstof(m_csRadius));
|
|
if (!bOverPi)
|
|
pWall->SetBulge(nAng);
|
|
else
|
|
pWall->SetBulge(2*PI-nAng);
|
|
}
|
|
}
|
|
|
|
pWall->ChangeElevation(_tstof(m_csWallElev), FALSE);
|
|
|
|
// modified by fxj 090309
|
|
double fHeight = 0;
|
|
if (m_csWallHeight==_T("当前层高"))
|
|
fHeight = DocGetLHeight();
|
|
else
|
|
fHeight = _tstof(m_csWallHeight);
|
|
pWall->SetHeight(fHeight); // _tstof(m_csWallHeight));
|
|
|
|
// ---------modified by fxj 080528------
|
|
pWall->SetWidth(0, m_nLeftWidth);
|
|
pWall->SetWidth(1, m_nRightWidth);
|
|
|
|
pWall->SetInsulateOnSide(OFFSET_LEFT, m_bLeftInsulate);
|
|
pWall->SetInsulateOnSide(OFFSET_RIGHT, m_bRightInsulate);
|
|
|
|
pWall->SetInsulateThick(m_dInsulateThick, OFFSET_LEFT);
|
|
// sg add 100511,设置两侧保温层厚
|
|
pWall->SetInsulateThick(m_dInsulateThick2, OFFSET_RIGHT);
|
|
|
|
// sg add 100511,设置是否设置墙端头保温
|
|
pWall->SetInsulateEnd(m_bStemInsulate);
|
|
|
|
TWallData::TWallStyle st = TWallData::kBrick; // 砖墙
|
|
CString sT20Mat = WALLMATE_Brick;
|
|
switch(m_nStyle)
|
|
{
|
|
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;
|
|
}
|
|
|
|
pWall->SetStyle(st);
|
|
pWall->SetT20WallMat(sT20Mat);
|
|
|
|
TWallData::UsageFlag us = TWallData::kNormal;
|
|
TDbWall::Catalog nCatalog = TDbWall::kInternal;
|
|
switch(m_nUse)
|
|
{
|
|
case 0:
|
|
us=TWallData::kNormal;
|
|
nCatalog = TDbWall::kExternal;
|
|
break;
|
|
case 1:
|
|
us=TWallData::kNormal;
|
|
nCatalog = TDbWall::kInternal;
|
|
|
|
break;
|
|
case 2:
|
|
us=TWallData::kNormal;
|
|
nCatalog = TDbWall::kDispartOwner;
|
|
break;
|
|
case 3:
|
|
us=TWallData::kVirtual;
|
|
nCatalog = TDbWall::kVirtDispart;
|
|
break;
|
|
case 4:
|
|
us=TWallData::kParapet;
|
|
break;
|
|
case 5:
|
|
us=TWallData::kApartment;
|
|
nCatalog = TDbWall::kToiletSlab;
|
|
break;
|
|
}
|
|
pWall->SetUsageFlag(us);
|
|
pWall->SetCatalog(nCatalog);
|
|
}
|
|
|
|
void CWallDlg::Obj2Dlg(const AcDbEntity *pObj)
|
|
{
|
|
TDbWall *pWall = TDbWall::cast(pObj);
|
|
ASSERT(pObj);
|
|
|
|
// sg modify 100906,暂时恢复左、右侧保温的控件名称
|
|
// sg modify 100714,左侧、右侧保温层的控件名称,根据内外墙变化
|
|
/*
|
|
if (pWall->IsExternal()) // 如果是外墙,显示外侧、内侧
|
|
{
|
|
if (pWall->IsExternal(OFFSET_RIGHT))
|
|
{
|
|
m_csLeftCheckName = _T("内侧保温");
|
|
m_csRightCheckName = _T("外侧保温");
|
|
}
|
|
else
|
|
{
|
|
m_csLeftCheckName = _T("外侧保温");
|
|
m_csRightCheckName = _T("内侧保温");
|
|
}
|
|
}
|
|
else // 如果是内墙,显示左侧、右侧
|
|
{
|
|
m_csLeftCheckName = _T("左侧保温");
|
|
m_csRightCheckName = _T("右侧保温");
|
|
}
|
|
*/
|
|
m_csLeftCheckName = _T("左侧保温");
|
|
m_csRightCheckName = _T("右侧保温");
|
|
|
|
m_csWallElev = _T("");
|
|
m_nLeftWidth = 0;
|
|
m_nRightWidth = 0;
|
|
m_csWallHeight = _T("");
|
|
m_csRadius = _T("");
|
|
m_nStyle = 0;
|
|
m_bpartEdit = false;
|
|
|
|
m_bLeftInsulate = FALSE;
|
|
m_bRightInsulate = FALSE;
|
|
m_bStemInsulate = FALSE;
|
|
m_dInsulateThick = 0.0;
|
|
m_dInsulateThick2 = 0.0;
|
|
|
|
m_pWall = pWall;
|
|
m_csWallElev = (const TCHAR *)Dist2Str(pWall->GetElevation());
|
|
m_nLeftWidth = pWall->GetWidth(0);
|
|
|
|
switch (pWall->GetStyle())
|
|
{
|
|
case TWallData::kConcrete:
|
|
{
|
|
m_nStyle = 0;
|
|
if (pWall->GetT20WallMat() == WALLMATE_Concrete1)
|
|
{
|
|
m_nStyle +=1;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case TWallData::kBrick:
|
|
{
|
|
m_nStyle = 2;
|
|
if (pWall->GetT20WallMat() == WALLMATE_Brick1)
|
|
{
|
|
m_nStyle += 1;
|
|
}
|
|
break;
|
|
}
|
|
case TWallData::kRocket:
|
|
{
|
|
m_nStyle = 4;
|
|
if (pWall->GetT20WallMat() == WALLMATE_Rocket1)
|
|
{
|
|
m_nStyle += 1;
|
|
}
|
|
break;
|
|
}
|
|
case TWallData::kFill:
|
|
{
|
|
m_nStyle = 6;
|
|
break;
|
|
}
|
|
case TWallData::kFill1:
|
|
{
|
|
m_nStyle = 7;
|
|
break;
|
|
}
|
|
case TWallData::kFill2:
|
|
{
|
|
m_nStyle = 8;
|
|
break;
|
|
}
|
|
case TWallData::kDivider:
|
|
{
|
|
m_nStyle = 9;
|
|
break;
|
|
}
|
|
case TWallData::kCurtain:
|
|
{
|
|
m_nStyle = 10;
|
|
break;
|
|
}
|
|
}
|
|
|
|
m_nRightWidth = pWall->GetWidth(1);
|
|
m_csWallHeight = (const TCHAR *)Dist2Str(pWall->GetHeight());
|
|
|
|
if (pWall->Is(CURVE_ARC))
|
|
m_csRadius = (const TCHAR *)Dist2Str(pWall->GetArc().GetRadius());
|
|
|
|
// 设置对话框里的用途选项
|
|
m_nUse = 0;
|
|
switch (pWall->GetUsageFlag())
|
|
{
|
|
case TWallData::kNormal:
|
|
{
|
|
if (pWall->GetCatalog() == TDbWall::kDispartOwner)
|
|
{
|
|
m_nUse = 2;
|
|
}
|
|
else if (pWall->GetCatalog() == TDbWall::kExternal)
|
|
{
|
|
m_nUse = 0;
|
|
}
|
|
else
|
|
{
|
|
m_nUse = 1;
|
|
}
|
|
break;
|
|
}
|
|
case TWallData::kVirtual: m_nUse = 3; break;
|
|
case TWallData::kParapet: m_nUse = 4; break;
|
|
case TWallData::kApartment: m_nUse = 5; break;
|
|
}
|
|
m_bLeftInsulate = pWall->IsInsulateOnSide(0);
|
|
m_bRightInsulate = pWall->IsInsulateOnSide(1);
|
|
m_dInsulateThick = pWall->GetInsulateThick(0);
|
|
// sg add 100511,获取两侧保温层厚
|
|
m_dInsulateThick2 = pWall->GetInsulateThick(1);
|
|
|
|
// sg add 100511,获取是否设置墙端头保温
|
|
m_bStemInsulate = pWall->HasInsulateEnd();
|
|
}
|
|
|
|
|
|
HBRUSH CWallDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
|
|
{
|
|
HBRUSH hbr = CObjPreviewDlg::OnCtlColor(pDC, pWnd, nCtlColor);
|
|
|
|
int nID=pWnd->GetDlgCtrlID();
|
|
if (nID==IDC_LEFT_TEXT)
|
|
pDC->SetTextColor(acdbGetRGB(3));
|
|
else if (nID==IDC_RIGHT_TEXT)
|
|
pDC->SetTextColor(acdbGetRGB(6));
|
|
|
|
return hbr;
|
|
}
|
|
|
|
void CWallDlg::OnSelchangeListData()
|
|
{
|
|
UpdateData(TRUE);
|
|
int sel = m_listCtrl.GetCurSel();
|
|
|
|
if (sel==-1)
|
|
return;
|
|
m_nLeftWidth = m_lstMat[sel]->LeftWidth;
|
|
m_nRightWidth = m_lstMat[sel]->RightWidth;
|
|
UpdateData(FALSE);
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnButtonLeft()
|
|
{
|
|
UpdateData(TRUE);
|
|
double nTmp = m_nLeftWidth + m_nRightWidth;
|
|
m_nLeftWidth = nTmp;
|
|
m_nRightWidth = 0;
|
|
UpdateData(FALSE);
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnButtonMid()
|
|
{
|
|
UpdateData(TRUE);
|
|
double nTmp = m_nLeftWidth + m_nRightWidth;
|
|
m_nLeftWidth = nTmp/2;
|
|
m_nRightWidth = nTmp/2;
|
|
UpdateData(FALSE);
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnButtonRight()
|
|
{
|
|
UpdateData(TRUE);
|
|
double nTmp = m_nLeftWidth + m_nRightWidth;
|
|
m_nLeftWidth = 0;
|
|
m_nRightWidth = nTmp;
|
|
UpdateData(FALSE);
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnButtonChange()
|
|
{
|
|
UpdateData(TRUE);
|
|
double nTmp = m_nLeftWidth;
|
|
m_nLeftWidth = m_nRightWidth;
|
|
m_nRightWidth = nTmp;
|
|
UpdateData(FALSE);
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnSetFocusInsThick()
|
|
{
|
|
UpdateData(TRUE);
|
|
}
|
|
|
|
void CWallDlg::OnCheckLeftIns()
|
|
{
|
|
UpdateData(TRUE);
|
|
UpdateImage();
|
|
}
|
|
|
|
void CWallDlg::OnCheckRightIns()
|
|
{
|
|
UpdateData(TRUE);
|
|
UpdateImage();
|
|
}
|
|
|
|
// sg add 100511,增加墙端头保温
|
|
void CWallDlg::OnCheckStemIns()
|
|
{
|
|
UpdateImage();
|
|
}
|
|
|
|
// 取左宽度
|
|
double CWallDlg::GetLeftWidth()
|
|
{
|
|
UpdateData(TRUE);
|
|
return m_nLeftWidth;
|
|
}
|
|
|
|
// 取右宽度
|
|
double CWallDlg::GetRightWidth()
|
|
{
|
|
UpdateData(TRUE);
|
|
return m_nRightWidth;
|
|
}
|
|
|
|
double CWallDlg::GetHeight()
|
|
{
|
|
UpdateData(TRUE);
|
|
if (m_csWallHeight==_T("当前层高"))
|
|
return DocGetLHeight();
|
|
else
|
|
return _tstof(m_csWallHeight);
|
|
}
|
|
|
|
double CWallDlg::GetElev()
|
|
{
|
|
UpdateData(TRUE);
|
|
return _tstof(m_csWallElev);
|
|
}
|
|
|
|
extern int CompareDouble(const selMaterial *s1,const selMaterial *s2);
|
|
// 选择了另外一种材料
|
|
void CWallDlg::OnSelchangeMaterial()
|
|
{
|
|
UpdateData(TRUE);
|
|
m_lstMat.Reset();
|
|
CString csStyle;
|
|
// g_nSelStyle = m_material.GetCurSel();
|
|
// CWnd *pWnd = GetDlgItem(IDC_MATERIAL);
|
|
// pWnd->GetWindowText(csStyle);
|
|
// if (csStyle.Find(_T("填充墙"))!=-1)
|
|
// csStyle=_T("填充墙");
|
|
|
|
//wlw t20一致 下面的材质要和DataStore.dbf文件一致 14.08.25
|
|
switch(m_nStyle)
|
|
{
|
|
case 0:
|
|
case 1:
|
|
csStyle = _T("钢筋混凝土");
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
csStyle = _T("砖墙");
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
csStyle = _T("砖墙");
|
|
break;
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
csStyle = _T("填充墙");
|
|
break;
|
|
case 9:
|
|
csStyle = _T("轻质隔墙");
|
|
break;
|
|
case 10:
|
|
csStyle = _T("玻璃幕墙");
|
|
break;
|
|
}
|
|
|
|
CodeBase db;
|
|
XString fullFile;
|
|
if (!FindFile(_T("DataStore.dbf"), fullFile)) {
|
|
MessageBox(_T("对不起,没有发现DataStore.dbf文件!"));
|
|
return;
|
|
}
|
|
int Number;
|
|
CString csType;
|
|
double nLeft, nRight;
|
|
XDbfTable *pTable = db.Open(fullFile);
|
|
if (!pTable)
|
|
{
|
|
return;
|
|
}
|
|
pTable->MoveFirst();
|
|
while(!pTable->IsEOF()) {
|
|
GET_FIELD(pTable, _T("TypeNumber"), Number);
|
|
GET_FIELD(pTable, _T("TypeName"), csType);
|
|
GET_FIELD(pTable, _T("TypeValue"), nLeft);
|
|
GET_FIELD(pTable, _T("REMARK"), nRight);
|
|
if (csType.Find(csStyle) > -1 && Number == 11){
|
|
selMaterial *pNew = new selMaterial();
|
|
pNew->LeftWidth = nLeft;
|
|
pNew->RightWidth = nRight;
|
|
m_lstMat.Append(pNew);
|
|
/* if (csType.Find(_T("*")) > -1){
|
|
m_nLeftWidth = nLeft;
|
|
m_nRightWidth = nRight;
|
|
}*/
|
|
}
|
|
pTable->MoveNext();
|
|
}
|
|
int len = m_lstMat.Length();
|
|
m_lstMat.QuickSort(CompareDouble);
|
|
m_listCtrl.ResetContent();
|
|
for(int i=0;i<len;i++){
|
|
CString csRight, csLeft;
|
|
XString xsTmp;
|
|
csLeft.Format(_T("%.0f"), m_lstMat[i]->LeftWidth);
|
|
csRight.Format(_T("%.0f"), m_lstMat[i]->RightWidth);
|
|
int n = csLeft.GetLength();
|
|
xsTmp << (const TCHAR*)csLeft;
|
|
for(int j=0;j<12-n;j++){
|
|
xsTmp << _T(" ");
|
|
}
|
|
xsTmp << (const TCHAR*)csRight;
|
|
m_listCtrl.AddString((const TCHAR*)xsTmp);
|
|
}
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
BOOL CWallDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
|
|
|
|
// if there is a top level routing frame then let it handle the message
|
|
if (GetRoutingFrame() != NULL) return FALSE;
|
|
|
|
// to be thorough we will need to handle UNICODE versions of the message also !!
|
|
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
|
|
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
|
|
//TCHAR szFullText[512];
|
|
CString strTipText;
|
|
// Zyu modify on 100723,消除64位编译警告
|
|
//UINT nID = pNMHDR->idFrom;
|
|
UINT_PTR nID = pNMHDR->idFrom;
|
|
|
|
if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
|
|
pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
|
|
{
|
|
// idFrom is actually the HWND of the tool
|
|
nID = ::GetDlgCtrlID((HWND)nID);
|
|
|
|
|
|
if (nID!=IDC_LIST_DATA)
|
|
return FALSE;
|
|
}
|
|
|
|
if (nID != 0) // will be zero on a separator
|
|
{
|
|
{
|
|
CAcModuleResourceOverride vTmp;
|
|
// Zyu modify on 100723,消除64位编译警告
|
|
//strTipText.LoadString(nID); //=szFullText;
|
|
strTipText.LoadString((UINT)nID); //=szFullText;
|
|
}
|
|
|
|
#ifndef _UNICODE
|
|
if (pNMHDR->code == TTN_NEEDTEXTA)
|
|
{
|
|
lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
|
|
}
|
|
else
|
|
{
|
|
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
|
|
}
|
|
#else
|
|
if (pNMHDR->code == TTN_NEEDTEXTA)
|
|
{
|
|
_wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
|
|
}
|
|
else
|
|
{
|
|
lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
|
|
}
|
|
#endif
|
|
|
|
*pResult = 0;
|
|
|
|
// bring the tooltip window above other popup windows
|
|
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE|
|
|
SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); return TRUE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//----------delete by fxj-----------
|
|
// Add By LCF 2004/07/01
|
|
/*void CWallDlg::OnBnClickedCheckPartedit()
|
|
{
|
|
CDataExchange dx(this, true);
|
|
DDX_Check(&dx, IDC_CHECK_PARTEDIT, m_bpartEdit);
|
|
m_selectButton.EnableWindow(m_bpartEdit);
|
|
}
|
|
|
|
// Add By LCF 2004/07/01
|
|
void CWallDlg::OnBnClickedButtonSelect()
|
|
{
|
|
BeginEditorCommand();
|
|
|
|
XPoint ptStart, ptEnd;
|
|
|
|
int nOldOsnap = g_nOsnapType;
|
|
DocSetWallOsnapType(0);
|
|
int nOsMode=0;
|
|
xg_getvar(_T("OSMODE"), &nOsMode);
|
|
nOsMode=0x0001|0x0002|0x0008|0x0020|0x0200;
|
|
XPushVar<int> osmode(_T("OSMODE"), nOsMode);
|
|
|
|
|
|
// 临时显示基线
|
|
AcDbCurve *pCurve = m_pWall->AsAcDbCurve();
|
|
pCurve->setColorIndex(46);
|
|
AcDbObjectId idCur;
|
|
idCur = AddToModelSpace(pCurve, Adesk::kTrue);
|
|
|
|
// 显示分段线
|
|
XScreenDc dc(1);
|
|
XCurveSegment lCurve, rCurve;
|
|
m_pWall->GetSideCurve(lCurve, rCurve);
|
|
|
|
// 门窗
|
|
DList<TOpeningData> lstOpenings;
|
|
m_pWall->GetOpenings(lstOpenings, 1);
|
|
|
|
double nElev = m_pWall->GetElevation();
|
|
double dLeftWidth = fabs(m_pWall->GetWidth(0));
|
|
double dRightWidth = fabs(m_pWall->GetWidth(1));
|
|
double dOsnapWidth =dLeftWidth+dRightWidth;
|
|
XPoint ptProject;
|
|
// 选择起点
|
|
while(1)
|
|
{
|
|
if (acedGetPoint(NULL, _T("\n选择起点<退出>: "), ptStart) != RTNORM)
|
|
{
|
|
acdbOpenObject(pCurve, idCur, AcDb::kForWrite);
|
|
pCurve->erase(Adesk::kTrue);
|
|
pCurve->close();
|
|
|
|
DocSetWallOsnapType(nOldOsnap);
|
|
CompleteEditorCommand();
|
|
return;
|
|
}
|
|
ptStart = Ucs2Wcs(ptStart);
|
|
ptStart.z = nElev;
|
|
if (m_pWall->ProjectToMe(ptStart, ptProject) != RTNORM)
|
|
{
|
|
acutPrintf(_T("\n选择点投影超出基线范围,请重新选择起点!"));
|
|
continue;
|
|
}
|
|
|
|
// 判断点是否在基线延长线上
|
|
int ret = ptProject & (*m_pWall);
|
|
if (ret != 1 && ret != 2 && ret != 3)
|
|
{
|
|
acutPrintf(_T("\n选择点投影超出基线范围,请重新选择起点!"));
|
|
continue;
|
|
}
|
|
|
|
// 判断点是否在基线附近
|
|
if (ptStart.Distance2d(ptProject) > dOsnapWidth)
|
|
{
|
|
acutPrintf(_T("\n选择点距离基线太远,请重新选择起点!"));
|
|
continue;
|
|
}
|
|
|
|
// 判断点是否在门窗处
|
|
int len = lstOpenings.Length();
|
|
if (len == 0) break; // 无门窗
|
|
for(long i=0; i<len; i++)
|
|
{
|
|
XPoly2D poly;
|
|
XCurveSegment seg;
|
|
lstOpenings[i]->GetOutlinePoly(nElev, poly);
|
|
poly.Nth(1, seg);
|
|
XPoint temPt;
|
|
seg.ProjectToMe(ptProject, temPt);
|
|
int iOpen = temPt & seg;
|
|
if (iOpen == 3)
|
|
{
|
|
acutPrintf(_T("\n选择点不能投影在门窗处,请重新选择起点!"));
|
|
break;
|
|
}
|
|
}
|
|
if (i == len) break; // 选择点未落在门窗上
|
|
}
|
|
ptStart = ptProject;
|
|
XPoint ptStartTemp = Wcs2Ucs(ptStart);
|
|
acutPrintf(_T("(%s,%s)"), Dist2Str(ptStartTemp.x), Dist2Str(ptStartTemp.y));
|
|
XPoint ptLStart, ptLEnd;
|
|
lCurve.ProjectToMe(ptStart, ptLStart);
|
|
rCurve.ProjectToMe(ptStart, ptLEnd);
|
|
//ptLStart = Wcs2Ucs(ptLStart);
|
|
//ptLEnd = Wcs2Ucs(ptLEnd);
|
|
AcDbLine *plineL = new AcDbLine(ptLStart, ptLEnd);
|
|
plineL->setColorIndex(1);
|
|
AcDbObjectId idL;
|
|
idL = AddToModelSpace(plineL, Adesk::kTrue);
|
|
|
|
// 选择终点
|
|
while(1)
|
|
{
|
|
if (acedGetPoint(Wcs2Ucs(ptStart), _T("\n选择终点<退出>: "), ptEnd) != RTNORM)
|
|
{
|
|
acdbOpenObject(pCurve, idCur, AcDb::kForWrite);
|
|
pCurve->erase(Adesk::kTrue);
|
|
pCurve->close();
|
|
acdbOpenObject(plineL, idL, AcDb::kForWrite);
|
|
plineL->erase(Adesk::kTrue);
|
|
plineL->close();
|
|
|
|
DocSetWallOsnapType(nOldOsnap);
|
|
|
|
CompleteEditorCommand();
|
|
return;
|
|
}
|
|
ptEnd = Ucs2Wcs(ptEnd);
|
|
ptEnd.z = nElev;
|
|
if (m_pWall->ProjectToMe(ptEnd, ptProject) != RTNORM)
|
|
{
|
|
acutPrintf(_T("\n选择点投影超出基线范围,请重新选择终点!"));
|
|
continue;
|
|
}
|
|
|
|
// 判断与开始点距离
|
|
if (ptStart.Distance2d(ptProject) < 1.0E-6)
|
|
{
|
|
acutPrintf(_T("\n选择点与起点距离太小,请重新选择终点!"));
|
|
continue;
|
|
}
|
|
|
|
// 判断点是否在基线延长线上
|
|
int ret = ptProject & (*m_pWall);
|
|
if (ret != 1 && ret != 2 && ret != 3)
|
|
{
|
|
acutPrintf(_T("\n选择点投影超出基线范围,请重新选择终点!"));
|
|
continue;
|
|
}
|
|
|
|
// 判断点是否在基线附近
|
|
if (ptEnd.Distance2d(ptProject) > dOsnapWidth)
|
|
{
|
|
acutPrintf(_T("\n选择点距离基线太远,请重新选择终点!"));
|
|
continue;
|
|
}
|
|
|
|
// 判断点是否在门窗处
|
|
int len = lstOpenings.Length();
|
|
if (len == 0) break; // 无门窗
|
|
for(long i=0; i<lstOpenings.Length(); i++)
|
|
{
|
|
XPoly2D poly;
|
|
XCurveSegment seg;
|
|
lstOpenings[i]->GetOutlinePoly(nElev, poly);
|
|
poly.Nth(1, seg);
|
|
XPoint temPt;
|
|
seg.ProjectToMe(ptProject, temPt);
|
|
int iOpen = temPt & seg;
|
|
if (iOpen == 3)
|
|
{
|
|
acutPrintf(_T("\n选择点不能投影在门窗处,请重新选择终点!"));
|
|
break;
|
|
}
|
|
}
|
|
if (i == len) break; // 选择点未落在门窗上
|
|
}
|
|
ptEnd = ptProject;
|
|
XPoint ptEndTemp = Wcs2Ucs(ptEnd);
|
|
acutPrintf(_T("(%s,%s)\n"), Dist2Str(ptEndTemp.x), Dist2Str(ptEndTemp.y));
|
|
XPoint ptRStart, ptREnd;
|
|
lCurve.ProjectToMe(ptEnd, ptRStart);
|
|
rCurve.ProjectToMe(ptEnd, ptREnd);
|
|
//ptRStart = Wcs2Ucs(ptRStart);
|
|
//ptREnd = Wcs2Ucs(ptREnd);
|
|
AcDbLine *plineR = new AcDbLine(ptRStart, ptREnd);
|
|
plineR->setColorIndex(1);
|
|
AcDbObjectId idR;
|
|
idR = AddToModelSpace(plineR, Adesk::kTrue);
|
|
acedCommand(RTSTR, _T(""), RTSTR, _T(""), RTNONE);
|
|
|
|
// 调整打断点顺序与墙体一致
|
|
XPoint startPoint = m_pWall->startPoint;
|
|
double disStart = ptStart.Distance(startPoint);
|
|
double disEnd = ptEnd.Distance(startPoint);
|
|
if (disStart < disEnd)
|
|
{
|
|
m_ptStartBreak = ptStart;
|
|
m_ptEndBreak = ptEnd;
|
|
}
|
|
else
|
|
{
|
|
m_ptStartBreak = ptEnd;
|
|
m_ptEndBreak = ptStart;
|
|
}
|
|
acdbOpenObject(pCurve, idCur, AcDb::kForWrite);
|
|
pCurve->erase(Adesk::kTrue);
|
|
pCurve->close();
|
|
acdbOpenObject(plineL, idL, AcDb::kForWrite);
|
|
plineL->erase(Adesk::kTrue);
|
|
plineL->close();
|
|
acdbOpenObject(plineR, idR, AcDb::kForWrite);
|
|
plineR->erase(Adesk::kTrue);
|
|
plineR->close();
|
|
|
|
DocSetWallOsnapType(nOldOsnap);
|
|
CompleteEditorCommand();
|
|
}*/
|
|
|
|
// [2010-3-25 wubo] C004-08 当墙体用途设为虚墙时,除用途外,所有控件都变灰。
|
|
void CWallDlg::OnCbnSelchangeComboUse()
|
|
{
|
|
UpdateData(TRUE);
|
|
}
|