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

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