// BuildOutLineDlg.cpp : 实现文件 // #include "stdafx.h" #include "BuildOutLineDlg.h" //int CBuildOutLineDlg::m_iLineTypeSel = 0; //int CBuildOutLineDlg::m_iLineWidthSel = 0; //CString CBuildOutLineDlg::m_strEditLineWidth_mm = _T("300"); //CString CBuildOutLineDlg::m_strEditLineWidth_M = _T("0.3"); double CBuildOutLineDlg::m_dEditLineWidth = 300;//mm单位下 CString CBuildOutLineDlg::m_strLayer = LAY_BUILD_OUTLINE; CString CBuildOutLineDlg::m_strLineType = _T("BYLAYER"); int CBuildOutLineDlg::s_nMode = 0; bool CBuildOutLineDlg::m_bFirst = true; BOOL CBuildOutLineDlg::m_bBalconyOutLine = FALSE; BOOL CBuildOutLineDlg::m_bFlagOutAndIn = FALSE; IMPLEMENT_DYNAMIC(CBuildOutLineDlg, CModelessDialog) CBuildOutLineDlg::CBuildOutLineDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CBuildOutLineDlg::IDD, pParent), m_bPickMode(FALSE), m_strEditLineWidth(_T("")) { } CBuildOutLineDlg::~CBuildOutLineDlg() { } void CBuildOutLineDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_CMB_BUILD_LAYER, m_cmbLayers); DDX_Control(pDX, IDC_CMB_BUILD_LINE_TYPE, m_cmbLineType); DDX_Control(pDX, IDC_CMB_BUILD_LINE_WIDTH, m_cmbLineWidth); DDX_Check(pDX, IDC_CHECK_BALCONY_OUTLINE, m_bBalconyOutLine); DDX_Check(pDX, IDC_CHECK_OUTANDIN, m_bFlagOutAndIn); DDX_CBString(pDX, IDC_CMB_BUILD_LINE_WIDTH, m_strEditLineWidth); if (!pDX->m_bSaveAndValidate) { m_toolbar.CheckButton(IDC_BTN_SEARCHTGOBJ, s_nMode==0); m_toolbar.CheckButton(IDC_BTN_ANYDRAW, s_nMode==1); } } BEGIN_MESSAGE_MAP(CBuildOutLineDlg, CModelessDialog) ON_CBN_SELCHANGE(IDC_CMB_BUILD_LAYER, &CBuildOutLineDlg::OnCbnSelchangeCmbBuildLayer) ON_CBN_SELCHANGE(IDC_CMB_BUILD_LINE_TYPE, &CBuildOutLineDlg::OnCbnSelchangeCmbBuildLineType) ON_CBN_SELCHANGE(IDC_CMB_BUILD_LINE_WIDTH, &CBuildOutLineDlg::OnCbnSelchangeCmbBuildLineWidth) ON_CBN_EDITCHANGE(IDC_CMB_BUILD_LINE_WIDTH, &CBuildOutLineDlg::OnCbnEditchangeCmbBuildLineWidth) ON_BN_CLICKED(IDC_BTN_SEARCHTGOBJ, &CBuildOutLineDlg::OnBnClickedBtnSearchTGObj) ON_BN_CLICKED(IDC_BTN_ANYDRAW, &CBuildOutLineDlg::OnBnClickedBtnAnyDraw) ON_BN_CLICKED(IDC_BTN_PICKDATA, &CBuildOutLineDlg::OnBnClickedBtnPickData) ON_BN_CLICKED(IDC_CHECK_BALCONY_OUTLINE, &CBuildOutLineDlg::OnBnClickedCheckBalconyOutline) ON_BN_CLICKED(IDC_CHECK_OUTANDIN, &CBuildOutLineDlg::OnBnClickedCheckOutandin) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText) ON_WM_CLOSE() ON_CBN_KILLFOCUS(IDC_CMB_BUILD_LINE_WIDTH, &CBuildOutLineDlg::OnCbnKillfocusCmbBuildLineWidth) END_MESSAGE_MAP() BOOL CBuildOutLineDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); CAcModuleResourceOverride vTmp; m_toolbar.Create( WS_VISIBLE | WS_CHILD |CCS_BOTTOM | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT | CCS_ADJUSTABLE ,CRect(0,0,0,0), this, IDB_BTM_BUILDOUTLINE_BTNS); m_toolbar.AddBitmap(4, IDB_BTM_BUILDOUTLINE_BTNS); m_toolbar.SetBitmapSize(CSize(19,19)); TBBUTTON *pIndex, *pRTF_Button = new TBBUTTON[4]; pIndex = pRTF_Button; memset(&pRTF_Button[0] ,NULL, sizeof(TBBUTTON)); pRTF_Button[0].iBitmap = 0; pRTF_Button[0].idCommand = IDC_BTN_SEARCHTGOBJ; pRTF_Button[0].fsStyle = TBSTYLE_CHECKGROUP; pRTF_Button[0].fsState = TBSTATE_ENABLED; memset(&pRTF_Button[1] ,NULL, sizeof(TBBUTTON)); pRTF_Button[1].iBitmap = 1; pRTF_Button[1].idCommand = IDC_BTN_ANYDRAW; pRTF_Button[1].fsStyle = TBSTYLE_CHECKGROUP; pRTF_Button[1].fsState = TBSTATE_ENABLED; memset(&pRTF_Button[2] ,NULL, sizeof(TBBUTTON)); pRTF_Button[2].iBitmap = 0; pRTF_Button[2].idCommand = 0; pRTF_Button[2].fsStyle = TBSTYLE_SEP |TBSTYLE_CHECKGROUP; memset(&pRTF_Button[3] ,NULL, sizeof(TBBUTTON)); pRTF_Button[3].iBitmap = 2; pRTF_Button[3].idCommand = IDC_BTN_PICKDATA; pRTF_Button[3].fsStyle = TBSTYLE_CHECKGROUP; pRTF_Button[3].fsState = TBSTATE_ENABLED; CSize size(19, 19); m_toolbar.SetButtonSize(size); m_toolbar.AddButtons(4, pRTF_Button); //m_toolbar.SetStyle(TBSTYLE_FLAT); delete[] pRTF_Button; //m_toolbar.AutoSize(); BOOL bIsMetre = DocGetMeterUnitDraw(); if (bIsMetre) this->SetWindowText(_T("建筑轮廓(单位:M)")); else this->SetWindowText(_T("建筑轮廓(单位:mm)")); if (s_nMode == 0) { GetDlgItem(IDC_CHECK_BALCONY_OUTLINE)->EnableWindow(TRUE); GetDlgItem(IDC_CHECK_OUTANDIN)->EnableWindow(TRUE); } else { GetDlgItem(IDC_CHECK_BALCONY_OUTLINE)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK_OUTANDIN)->EnableWindow(FALSE); } InitCmbLayers(); InitLineType(); InitLineWidth(); m_bFirst = false; UpdateData(FALSE); return TRUE; } // 工具栏提示 BOOL CBuildOutLineDlg::OnToolTipText( UINT, NMHDR * pNMHDR, LRESULT * pResult ) { ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); if (GetRoutingFrame() != NULL) return FALSE; TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; CString strTipText; UINT nID = (UINT)pNMHDR->idFrom; if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND)) { return FALSE; } if (nID != 0) { { CAcModuleResourceOverride vTmp; strTipText.LoadString(nID); } #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; ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE| SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); return TRUE; } return TRUE; } BOOL CBuildOutLineDlg::InitCmbLayers() { InitLayer(LAY_BUILD_OUTLINE); AcDbLayerTable *pLayerTable = NULL;//表 Acad::ErrorStatus err = acdbCurDwg()->getSymbolTable(pLayerTable, AcDb::kForRead); if (err != Acad::eOk) { return FALSE; } AcDbLayerTableIterator *pItor = NULL; pLayerTable->newIterator(pItor);//迭代器 pLayerTable->close(); if (!pItor) { return FALSE; } Acad::ErrorStatus bOk; AcDbLayerTableRecord *pLayerRecord = NULL;//图层记录 CString sName(_T("")); TCHAR *pStr = NULL; int iNum = 0; for (pItor->start();!pItor->done(); pItor->step()) { bOk = pItor->getRecord(pLayerRecord, AcDb::kForRead); if (bOk == Acad::eOk) { pStr = NULL; pLayerRecord->getName(pStr); sName = pStr; acutDelString(pStr); if (sName.Find(_T('|')) >= 0) { pLayerRecord->close(); continue; } pLayerRecord->close(); m_cmbLayers.AddString(sName); ++iNum; } } delete pItor; int iLayerSel = m_cmbLayers.FindStringExact(0, m_strLayer); if (iLayerSel < 0) { //m_strLayer = _T("SITE-BOTL"); m_strLayer = LAY_BUILD_OUTLINE; iLayerSel = m_cmbLayers.FindStringExact(0, m_strLayer); } if (iLayerSel >= 0 && iLayerSel < m_cmbLayers.GetCount()) m_cmbLayers.SetCurSel(iLayerSel); else m_cmbLayers.SetCurSel(0); return TRUE; } BOOL CBuildOutLineDlg::InitLineType() { m_cmbLineType.ResetContent(); AcDbLinetypeTable *pTbl = NULL; AcDbLinetypeTableRecord *pRec = NULL; AcDbLinetypeTableIterator *pIter = NULL; acdbCurDwg()->getSymbolTable(pTbl, AcDb::kForRead); if (!pTbl) return FALSE; pTbl->newIterator(pIter); pTbl->close(); if (!pIter) return FALSE; TCHAR *pStr = NULL; AcDbObjectId id = AcDbObjectId::kNull; CString str(_T("")); int iNum = 0; for (pIter->start(); !pIter->done(); pIter->step()) { pIter->getRecordId(id); pIter->getRecord(pRec, AcDb::kForRead); if (!pRec) continue; pRec->getName(pStr); str = pStr; if (!str.CompareNoCase(_T("BYLAYER")) || !str.CompareNoCase(_T("BYBLOCK"))) str.MakeUpper(); m_cmbLineType.AddString(str); ++iNum; pRec->close(); acutDelString(pStr); } delete pIter; int iLineTypeSel = m_cmbLineType.FindStringExact(0, m_strLineType); if (iLineTypeSel >=0 ) { if (iLineTypeSel >= 0 && iLineTypeSel < m_cmbLineType.GetCount()) m_cmbLineType.SetCurSel(iLineTypeSel); } else { m_strLineType = _T("BYLAYER"); iLineTypeSel = m_cmbLineType.FindStringExact(0, m_strLineType); if (iLineTypeSel >=0 ) { if (iLineTypeSel >= 0 && iLineTypeSel < m_cmbLineType.GetCount()) m_cmbLineType.SetCurSel(iLineTypeSel); } else m_cmbLineType.SetCurSel(0); } return TRUE; } //初始化线宽 BOOL CBuildOutLineDlg::InitLineWidth() { m_cmbLineWidth.ResetContent(); double dMultiple = 50; double dInitNum = 100; if (DocGetMeterUnitDraw()) { dMultiple = 0.05; dInitNum = 0.1; } CString strTemp(_T("")); for (int i = 0; i < 11; ++i) { if (DocGetMeterUnitDraw()) strTemp.Format(_T("%g"), dInitNum + i * dMultiple); else strTemp.Format(_T("%g"), dInitNum + i * dMultiple); m_cmbLineWidth.AddString(strTemp); } //记录上次值 double dCurWidth = m_dEditLineWidth; if (DocGetMeterUnitDraw()) dCurWidth = m_dEditLineWidth / 1000.0; m_strEditLineWidth.Format(_T("%g"), dCurWidth); int iLineWidthSel = 0; if (!m_strEditLineWidth.IsEmpty())//初始化 { if (m_strEditLineWidth == _T("0")) { int iPos = m_cmbLineWidth.AddString(m_strEditLineWidth); iLineWidthSel = iPos; } else { int iDefaultSel = m_cmbLineWidth.FindStringExact(0, m_strEditLineWidth);//modify tyj 20160929:变量用错,m_cmbLayers替换为m_cmbLineWidth(Bug :19672) if (iDefaultSel< 0 ) { int iPos = m_cmbLineWidth.AddString(m_strEditLineWidth); iLineWidthSel = iPos; } } } if (iLineWidthSel >= 0 && iLineWidthSel < m_cmbLineWidth.GetCount()) m_cmbLineWidth.SetCurSel(iLineWidthSel); else m_cmbLineWidth.SetCurSel(0); return TRUE; } void CBuildOutLineDlg::OnClose() { m_bUseEsc = true; if (m_bModeless) { acedPostCommand(_T("\33\33")); } else { CModelessDialog::OnClose(); } } void CBuildOutLineDlg::OnDestroy() { CModelessDialog::OnDestroy(); } void CBuildOutLineDlg::OnCbnSelchangeCmbBuildLayer() { int iLayerSel = m_cmbLayers.GetCurSel(); m_cmbLayers.GetLBText(iLayerSel, m_strLayer); } void CBuildOutLineDlg::OnCbnSelchangeCmbBuildLineType() { int iLineTypeSel = m_cmbLineType.GetCurSel(); m_cmbLineType.GetLBText(iLineTypeSel, m_strLineType); } void CBuildOutLineDlg::OnCbnSelchangeCmbBuildLineWidth() { int iLineWidthSel = m_cmbLineWidth.GetCurSel(); m_cmbLineWidth.GetLBText(iLineWidthSel, m_strEditLineWidth); if (DocGetMeterUnitDraw()) m_dEditLineWidth = _wtof(m_strEditLineWidth) * 1000; else m_dEditLineWidth = _wtof(m_strEditLineWidth); } //判断输入的值是否符合条件 void CBuildOutLineDlg::OnCbnEditchangeCmbBuildLineWidth() { CString strContent(_T("")); GetDlgItem(IDC_CMB_BUILD_LINE_WIDTH)->GetWindowText(strContent); if (strContent.GetLength() > 0) { for (int i = 0; i < strContent.GetLength(); ++i) { if (strContent.GetAt(i) == '.') continue; if ((strContent.GetAt(i) < '0' || strContent.GetAt(i) > '9')) { AfxMessageBox(_T("请输入≥0的数值!")); UpdateData(FALSE); return; } } } UpdateData(TRUE); } //线宽 void CBuildOutLineDlg::OnCbnKillfocusCmbBuildLineWidth() { int nPos = m_cmbLineWidth.FindStringExact(0, m_strEditLineWidth); if (!m_strEditLineWidth.IsEmpty() && nPos < 0) { int iDefaultSel = m_cmbLineWidth.AddString(m_strEditLineWidth); if (iDefaultSel >= 0) { m_cmbLineWidth.SetCurSel(iDefaultSel); } } if (DocGetMeterUnitDraw()) m_dEditLineWidth = _wtof(m_strEditLineWidth) * 1000; else m_dEditLineWidth = _wtof(m_strEditLineWidth); UpdateData(FALSE); GetDlgItem(IDC_CMB_BUILD_LAYER)->SetFocus(); } void CBuildOutLineDlg::OnBnClickedCheckBalconyOutline() { UpdateData(TRUE); } void CBuildOutLineDlg::OnBnClickedCheckOutandin() { UpdateData(TRUE); } //搜索上华的墙、柱等其他实体自动生成 void CBuildOutLineDlg::OnBnClickedBtnSearchTGObj() { m_bPickMode = FALSE; s_nMode = 0; GetDlgItem(IDC_CHECK_BALCONY_OUTLINE)->EnableWindow(TRUE); GetDlgItem(IDC_CHECK_OUTANDIN)->EnableWindow(TRUE); m_bUseEsc = false; acedPostCommand(_T("\33")); } //任意绘制 void CBuildOutLineDlg::OnBnClickedBtnAnyDraw() { m_bPickMode = FALSE; s_nMode = 1; GetDlgItem(IDC_CHECK_BALCONY_OUTLINE)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK_OUTANDIN)->EnableWindow(FALSE); m_bUseEsc = false; acedPostCommand(_T("\33")); } //拾取参数 void CBuildOutLineDlg::OnBnClickedBtnPickData() { m_bPickMode = TRUE; GetDlgItem(IDC_CHECK_BALCONY_OUTLINE)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK_OUTANDIN)->EnableWindow(FALSE); m_bUseEsc = false; acedPostCommand(_T("\33")); } CString CBuildOutLineDlg::GetLayerName() { return m_strLayer; } CString CBuildOutLineDlg::GetLineType() { return m_strLineType; } double CBuildOutLineDlg::GetLineWidth() { if (DocGetMeterUnitDraw()) return m_dEditLineWidth / 1000.0; else return m_dEditLineWidth; } //是否绘制阳台线 int CBuildOutLineDlg::IsDrawBalcony() { return m_bBalconyOutLine; } //是否标注三角 int CBuildOutLineDlg::IsFlagTri() { return m_bFlagOutAndIn; } int CBuildOutLineDlg::GetDrawType() { if (m_bPickMode) return kPickData; if (s_nMode == 0) return kSearchAuto; if (s_nMode == 1) return kAnyDraw; return kSearchAuto; } void CBuildOutLineDlg::SetLayerName(CString sLayer) { int iDefaultSel = m_cmbLayers.FindStringExact(0, sLayer); if (iDefaultSel < 0 ) { iDefaultSel = m_cmbLayers.AddString(sLayer); } m_strLayer = sLayer; m_cmbLayers.SetCurSel(iDefaultSel); UpdateData(FALSE); } void CBuildOutLineDlg::SetLineType(CString sLineType) { int iDefaultSel = m_cmbLineType.FindStringExact(0, sLineType); if (iDefaultSel < 0 ) { iDefaultSel = m_cmbLineType.AddString(sLineType); } m_strLineType = sLineType; m_cmbLineType.SetCurSel(iDefaultSel); UpdateData(FALSE); } //设置线宽 void CBuildOutLineDlg::SetLineWidth(double dLineWidth) { CString strLineWidth(_T("")); strLineWidth.Format(_T("%g"), dLineWidth); int iDefaultSel = m_cmbLineWidth.FindStringExact(0, strLineWidth); int iLineWidthSel = 0; if (iDefaultSel >= 0 ) { iLineWidthSel = iDefaultSel; } else { iDefaultSel = m_cmbLineWidth.AddString(strLineWidth); if (iDefaultSel >=0 ) iLineWidthSel = iDefaultSel; } m_cmbLineWidth.SetCurSel(iLineWidthSel); CString sLineWidthSel(_T("")); m_cmbLineWidth.GetLBText(iLineWidthSel, sLineWidthSel); if (DocGetMeterUnitDraw()) m_dEditLineWidth = dLineWidth * 1000; else m_dEditLineWidth = dLineWidth; m_strEditLineWidth = sLineWidthSel; UpdateData(FALSE); }