Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/WallDlg.cpp
T
2026-09-28 15:28:50 +08:00

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