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