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

561 lines
14 KiB
C++

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