447 lines
11 KiB
C++
447 lines
11 KiB
C++
// LabelSetDlg.cpp: implementation of the CLabelSetDlg class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "LabelSetDlg.h"
|
|
|
|
|
|
|
|
// 门窗数据
|
|
// 标签, 大类型, 默认“用途”, 默认“编号”;
|
|
// 针对配置文件可能会被删除,或者错误的修改,此处保留默认数据,当配置文件不可用时,从此处获得数据,一保证程序的运行、
|
|
static CString s_sDoorDatas[] =
|
|
{
|
|
_T("Door"), _T("门"), _T("普通门"), _T("FM"),
|
|
_T("DoorWin"), _T("门连窗"), _T("门连窗"), _T("MLC"),
|
|
_T("TwoDoor"), _T("子母门"), _T("子母门"), _T("ZM"),
|
|
_T("GroupOpening"), _T("组合门窗"), _T("组合门窗"), _T("ZM"),
|
|
_T("Window"), _T("窗"), _T("普通窗"), _T("C"),
|
|
_T("ArcWin"), _T("弧窗"), _T("弧窗"), _T("HC"),
|
|
_T("BayWin"), _T("凸窗"), _T("凸窗"), _T("TC"),
|
|
_T("CornerWin"), _T("转角窗"), _T("转角窗"), _T("ZJC"),
|
|
_T("BandWin"), _T("带形窗"), _T("带形窗"), _T("DC"),
|
|
_T("Dormer"), _T("老虎窗"), _T("老虎窗"), _T("LHC"),
|
|
_T("Hole"), _T("洞口"), _T("洞口"), _T("DK")
|
|
};
|
|
|
|
// 门窗类型列表框的索引类型
|
|
static bool s_bDoorGirdStyle[] =
|
|
{
|
|
1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0
|
|
};
|
|
|
|
enum {
|
|
eDoor = 0,
|
|
eDoorWin,
|
|
eTwoDoor,
|
|
eGroupOpening,
|
|
eWindow,
|
|
eArcWin,
|
|
eBayWin,
|
|
eCornerWin,
|
|
eBandWin,
|
|
eDormer,
|
|
eHole,
|
|
eDoorTypeNum,
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// TLabelEditGrid类
|
|
//////////////////////////////////////////////////////////////////////
|
|
TLabelEditGrid::TLabelEditGrid()
|
|
{
|
|
SetRowPosFix(FALSE);
|
|
SetColFixLength();
|
|
SetColPosFix();
|
|
SetStyle(WDG_SINGLE_SEL_ROW);
|
|
|
|
AppendCol(_T("类型"), 100);
|
|
AppendCol(_T("编号"), 0);
|
|
GetCol(1).SetReadOnly(false); // 编号列,总是可编辑
|
|
|
|
m_eFlag = eUnKnow;
|
|
}
|
|
|
|
TLabelEditGrid::~TLabelEditGrid()
|
|
{
|
|
|
|
}
|
|
|
|
// 初始化
|
|
void TLabelEditGrid::Init(const ArLabelPair &arLabelData)
|
|
{
|
|
if (arLabelData.GetSize() == 0)
|
|
return;
|
|
|
|
SetRowNum(arLabelData.GetSize());
|
|
|
|
int nRow = 0;
|
|
for (int i = 0; i < (int)arLabelData.GetSize(); i++, nRow++)
|
|
{
|
|
ASSERT(!arLabelData[i].sPurpose.IsEmpty());
|
|
GetCell(nRow, 0).SetText((LPCTSTR)(arLabelData[i].sPurpose));
|
|
GetCell(nRow, 1).SetText((LPCTSTR)(arLabelData[i].sSerialNum));
|
|
}
|
|
}
|
|
|
|
void TLabelEditGrid::SetStyleFromDoor(bool bCommon)
|
|
{
|
|
if (bCommon)
|
|
{
|
|
SetNoDefaultMenu(false); // 有右键菜单
|
|
GetCol(0).SetReadOnly(false);
|
|
SetNoAppendButton(false);
|
|
}
|
|
else
|
|
{
|
|
SetNoDefaultMenu(true); // 有右键菜单
|
|
GetCol(0).SetReadOnly(true);
|
|
SetNoAppendButton(true);
|
|
}
|
|
}
|
|
|
|
void TLabelEditGrid::GetDatas(ArLabelPair &arLabelPair)
|
|
{
|
|
arLabelPair.RemoveAll();
|
|
|
|
for (int i = 0; i < (int)GetRowNum(); i++)
|
|
{
|
|
if (!GetCell(i, 0).GetText().IsEmpty())
|
|
{
|
|
arLabelPair.Add(SOpeningLabelPair((LPCTSTR)GetCell(i, 0).GetText(), (LPCTSTR)GetCell(i, 1).GetText()));
|
|
}
|
|
}
|
|
}
|
|
|
|
bool TLabelEditGrid::OnModified(WDGridCell&cell, CString &text)
|
|
{ // 修改的时候
|
|
long row = cell.GetRowIndex();
|
|
long col = cell.GetColIndex();
|
|
|
|
// 如果只有一个类型是空,不能把这个类型给删除了。
|
|
text.TrimLeft();
|
|
if ((col == 0) && text.IsEmpty())
|
|
{
|
|
int nRelType = 0;
|
|
for (int i = 0; i < (int)GetRowNum(); i++)
|
|
{
|
|
CString sCell = GetCell(i, 0).GetText();
|
|
if (!sCell.IsEmpty())
|
|
nRelType++;
|
|
}
|
|
|
|
if (nRelType == 1)
|
|
{
|
|
MessageBox(_T("请至少保留一种门窗类型"), _T("AutoCAD"), MB_ICONWARNING|MB_OK);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
// 需要删除掉这一行
|
|
m_eFlag = eModify;
|
|
m_nNullRow = row;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void TLabelEditGrid::OnDataChanged()
|
|
{
|
|
if (m_eFlag == eModify)
|
|
{
|
|
if (m_nNullRow >= 0 && m_nNullRow < GetRowNum())
|
|
this->DelRow(m_nNullRow); // 在modify中直接做出修改,会引起崩溃
|
|
m_eFlag = eUnKnow;
|
|
}
|
|
}
|
|
|
|
bool TLabelEditGrid::OnBeforeDeleteRow()//返回值代表是否确定
|
|
{
|
|
int i;
|
|
CArray<int, int&> aryRelRow;
|
|
for (i = 0; i < (int)GetRowNum(); i++)
|
|
{
|
|
CString sCell = GetCell(i, 0).GetText();
|
|
if (!sCell.IsEmpty())
|
|
aryRelRow.Add(i);
|
|
}
|
|
|
|
long row;
|
|
for (i=(int)GetRowSelNum()-1;i>=0;i--)
|
|
{
|
|
row=GetSelRow(i).GetIndex();
|
|
|
|
if (!GetCell(row, 0).GetText().IsEmpty())
|
|
{
|
|
for (int j = aryRelRow.GetSize() - 1; j > -1 ; j--)
|
|
{
|
|
if (aryRelRow[j] == row)
|
|
aryRelRow.RemoveAt(j);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (aryRelRow.GetSize() == 0)
|
|
MessageBox(_T("请至少保留一种门窗类型"), _T("AutoCAD"), MB_ICONWARNING|MB_OK);
|
|
|
|
return aryRelRow.GetSize() != 0;
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// CLabelSetDlg类
|
|
//////////////////////////////////////////////////////////////////////
|
|
int CLabelSetDlg::m_nSelRec = 0;
|
|
CLabelSetDlg::CLabelSetDlg(CWnd* pParent /*=NULL*/)
|
|
: CModelessDialog(CLabelSetDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CTchInitSet2Dlg)
|
|
//}}AFX_DATA_INIT
|
|
m_nSel = -1;
|
|
|
|
m_bChkRound = TRUE;//add by lgy 20120424 四舍五入
|
|
m_nWinWidthLocal = 1;//add by lgy 20120424 窗宽计算位置
|
|
}
|
|
|
|
CLabelSetDlg::~CLabelSetDlg()
|
|
{
|
|
|
|
}
|
|
|
|
void CLabelSetDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CModelessDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CLabelSetDlg)
|
|
DDX_Check(pDX, IDC_CHK_HYPHEN, m_nHyphen);
|
|
DDX_Radio(pDX, IDC_RAD_SIZE, m_nSerialRule);
|
|
DDX_Control(pDX, IDC_CMB_TYPE, m_cmbDoorType);
|
|
|
|
DDX_Check(pDX, IDC_CHK_ROUND, m_bChkRound);//add by lgy 20120424 四舍五入
|
|
DDX_CBIndex(pDX, IDC_CMB_WINWIDTHLOCAL, m_nWinWidthLocal);//ADD BY LGY 20120424 窗宽计算位置
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CLabelSetDlg, CModelessDialog)
|
|
//{{AFX_MSG_MAP(CLabelSetDlg)
|
|
ON_BN_CLICKED(IDOK, OnOK)
|
|
ON_BN_CLICKED(IDC_RAD_SIZE, OnClickRadSize)
|
|
ON_BN_CLICKED(IDC_RAD_NUM, OnClickRadNum)
|
|
ON_BN_CLICKED(IDC_CHK_HYPHEN, OnClickChkHyphen)
|
|
ON_CBN_SELCHANGE(IDC_CMB_TYPE, OnDoorTypeSelChange)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
BOOL CLabelSetDlg::OnInitDialog()
|
|
{
|
|
CModelessDialog::OnInitDialog();
|
|
|
|
m_gridLabel.Create(this, IDC_GRID_DATA);
|
|
|
|
TOpeningLabelData tOpeningData;
|
|
tOpeningData.Read(m_dataTable);
|
|
if (!tOpeningData.m_csPrompt.IsEmpty())
|
|
{
|
|
this->MessageBox(tOpeningData.m_csPrompt, _T("AuctCAD"), MB_ICONWARNING|MB_OK);
|
|
}
|
|
|
|
//add by lgy 20120511 初始化四舍五入,墙宽计算位置
|
|
m_nWinWidthLocal = m_dataTable.GetCalWidthRule();
|
|
m_bChkRound = m_dataTable.GetRoundRule();
|
|
|
|
// 门窗类型组合框初始化
|
|
for (int i = 0; i < eDoorTypeNum; i++)
|
|
{
|
|
m_cmbDoorType.AddString(s_sDoorDatas[i*4+1]);
|
|
}
|
|
m_nSel = -1;
|
|
m_cmbDoorType.SetCurSel(m_nSelRec);
|
|
OnDoorTypeSelChange();
|
|
|
|
if (m_dataTable.GetSerialRule() == TLabelSetDataTable::eAccordNum)
|
|
m_nSerialRule = 1;
|
|
else if (m_dataTable.GetSerialRule() == TLabelSetDataTable::eAccordSize)
|
|
m_nSerialRule = 0;
|
|
else
|
|
m_nSerialRule = 0;
|
|
|
|
m_nHyphen = m_dataTable.GetHyphenRule() ? 1 : 0;
|
|
GetDlgItem(IDC_STATIC_DOOR_TYPE)->EnableWindow(TRUE);
|
|
AddTip(IDC_RAD_SIZE, _T("以门窗洞口尺寸做为门窗编号,如M1521。"));
|
|
AddTip(IDC_RAD_NUM, _T("以按一定规律排列的阿拉伯数字做为门窗编号,如M1、M2。"));
|
|
AddTip(IDC_STATIC_DOOR_TYPE, _T("门、窗和弧窗类别下,右击行首单元格可添加或删除门窗类型。"));
|
|
//add by lgy 20120424 四舍五入添加说明
|
|
AddTip(IDC_CHK_ROUND, _T("按尺寸编号时,控制门窗宽高数值的后两位是直接舍去还是四舍五入"));
|
|
|
|
if (m_nSerialRule == 1) //add by lgy 020424 如果选择按尺寸,则四舍五入选择框亮显,门窗计算位置亮显
|
|
{
|
|
SetRoundGray(FALSE);
|
|
SetWinWidthGray(FALSE);
|
|
}
|
|
else
|
|
{
|
|
SetRoundGray(TRUE);
|
|
CString strWinType; //门窗类型
|
|
m_cmbDoorType.GetWindowText(strWinType);
|
|
if (strWinType == _T("转角窗"))
|
|
{
|
|
SetWinWidthGray(TRUE);
|
|
}
|
|
else
|
|
{
|
|
SetWinWidthGray(FALSE);
|
|
}
|
|
}
|
|
UpdateData(FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CLabelSetDlg::OnOK()
|
|
{
|
|
ConDataTable();
|
|
m_nSelRec = m_nSel;
|
|
TOpeningLabelData tLabelOperator;
|
|
tLabelOperator.Write(m_dataTable);
|
|
|
|
CModelessDialog::OnOK();
|
|
}
|
|
|
|
void CLabelSetDlg::OnClickRadSize()
|
|
{
|
|
//add by lgy 20120424 如果选择按顺序,四舍五入选择框需要亮显,窗宽计算位置亮显
|
|
SetRoundGray(TRUE);
|
|
CString sType;
|
|
m_cmbDoorType.GetLBText(m_nSel, sType);
|
|
if (sType == _T("转角窗"))
|
|
{
|
|
SetWinWidthGray(TRUE);
|
|
}
|
|
UpdateData(TRUE);
|
|
}
|
|
|
|
void CLabelSetDlg::OnClickRadNum()
|
|
{
|
|
//add by lgy 20120424 如果选择按顺序,四舍五入选择框需要灰显,窗宽计算位置灰显
|
|
SetRoundGray(FALSE);
|
|
SetWinWidthGray(FALSE);
|
|
|
|
UpdateData(TRUE);
|
|
}
|
|
|
|
void CLabelSetDlg::OnClickChkHyphen()
|
|
{
|
|
UpdateData(TRUE);
|
|
}
|
|
|
|
// 设置grid的可编辑属性
|
|
void CLabelSetDlg::OnDoorTypeSelChange()
|
|
{
|
|
CString sLabel, sType;
|
|
int nIndex = 0;
|
|
ArLabelPair arlabelpair;
|
|
|
|
// 保存之前的grid中的数据。
|
|
if (m_nSel != -1)
|
|
{
|
|
m_cmbDoorType.GetLBText(m_nSel, sType);
|
|
sLabel = TOpeningLabelData::TypeToLabel(sType);
|
|
|
|
arlabelpair.RemoveAll();
|
|
m_gridLabel.GetDatas(arlabelpair);
|
|
|
|
m_dataTable.CoverLabelData(sLabel, arlabelpair);
|
|
}
|
|
|
|
// 取得现在的label中的数据,并且修改grid的可编辑属性
|
|
m_nSel = m_cmbDoorType.GetCurSel();
|
|
m_cmbDoorType.GetLBText(m_nSel, sType);
|
|
|
|
sLabel = TOpeningLabelData::TypeToLabel(sType);
|
|
nIndex = TOpeningLabelData::GetLabelIndex(sLabel);
|
|
|
|
m_gridLabel.SetStyleFromDoor(s_bDoorGirdStyle[nIndex]);
|
|
|
|
// 设置当前grid的数据。
|
|
arlabelpair.RemoveAll();
|
|
m_dataTable.GetLabelData(sLabel, arlabelpair);
|
|
m_gridLabel.Clear();
|
|
m_gridLabel.Init(arlabelpair);
|
|
m_gridLabel.RedrawWindow();
|
|
|
|
//add by lgy 20120424 是否将窗宽计算位置置灰
|
|
if (sType == _T("转角窗") && m_nSerialRule == 0)
|
|
{
|
|
SetWinWidthGray(TRUE);
|
|
}
|
|
else
|
|
{
|
|
SetWinWidthGray(FALSE); //使窗宽位置置灰
|
|
}
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
|
|
void CLabelSetDlg::ConDataTable()
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
int nSel = m_cmbDoorType.GetCurSel();
|
|
CString sLabel, sType ;
|
|
m_cmbDoorType.GetLBText(nSel, sType);
|
|
sLabel = TOpeningLabelData::TypeToLabel(sType);
|
|
|
|
ArLabelPair arLabelPair;
|
|
m_gridLabel.GetDatas(arLabelPair);
|
|
m_dataTable.CoverLabelData(sLabel, arLabelPair);
|
|
|
|
m_dataTable.SetHyphenRuleDirect(m_nHyphen == 0 ? FALSE : TRUE);
|
|
m_dataTable.SetSerialRuleDirect(m_nSerialRule == 0 ? TLabelSetDataTable::eAccordSize : TLabelSetDataTable::eAccordNum);
|
|
|
|
//add by lgy 20120511 保存窗宽计算位置和四舍五入
|
|
m_dataTable.SetRoundRuleDirect(m_bChkRound);
|
|
if (m_nWinWidthLocal == TLabelSetDataTable::eWallInboard)
|
|
{
|
|
m_dataTable.SetCalWidthDirect(TLabelSetDataTable::eWallInboard);
|
|
}
|
|
else if (m_nWinWidthLocal == TLabelSetDataTable::eWallOutboard)
|
|
{
|
|
m_dataTable.SetCalWidthDirect(TLabelSetDataTable::eWallOutboard);
|
|
}
|
|
else
|
|
{
|
|
m_dataTable.SetCalWidthDirect(TLabelSetDataTable::eWallMiddle);
|
|
}
|
|
}
|
|
|
|
void CLabelSetDlg::SetRoundGray(BOOL bSet)
|
|
{
|
|
GetDlgItem(IDC_CHK_ROUND)->EnableWindow(bSet);
|
|
}
|
|
|
|
void CLabelSetDlg::SetWinWidthGray(BOOL bSet)
|
|
{
|
|
GetDlgItem(IDC_STATIC_WINWIDTHLOCAL)->EnableWindow(bSet);
|
|
GetDlgItem(IDC_CMB_WINWIDTHLOCAL)->EnableWindow(bSet);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// 命令函数: 编号设置
|
|
//////////////////////////////////////////////////////////////////////
|
|
void SetWinLabel()
|
|
{
|
|
CAcModuleResourceOverride vTmp;
|
|
CLabelSetDlg dlg(acedGetAcadFrame());
|
|
|
|
dlg.DoModal();
|
|
|
|
if (IsWindow(dlg.m_hWnd))
|
|
{
|
|
dlg.DestroyWindow();
|
|
}
|
|
}
|