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

440 lines
10 KiB
C++

#include "StdAfx.h"
#include "CloudLineDlg.h"
BOOL CCloudLineDlg::m_bCommon = TRUE;
int CCloudLineDlg::m_iMaxValue = 15;
int CCloudLineDlg::m_iMinValue = 5;
CString CCloudLineDlg::m_strEdition = _T("1");
CString CCloudLineDlg::m_strHeight = _T("5.0");
BOOL CCloudLineDlg::m_bEdit = FALSE;
int CCloudLineDlg::m_iDrawLineStyle = 2;
CString CCloudLineDlg::m_strType = GetTextStyleName(TS_SECTION);
IMPLEMENT_DYNAMIC(CCloudLineDlg, CModelessDialog)
CCloudLineDlg::CCloudLineDlg(CWnd* pParent) : CModelessDialog(CCloudLineDlg::IDD, pParent)
{
m_bStyeChange = false; //为了控制是否切换云线的绘制方式
}
CCloudLineDlg::~CCloudLineDlg()
{
}
void CCloudLineDlg::DoDataExchange(CDataExchange* pDX)
{
CModelessDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_CMB_MAXARC, m_iMaxValue);
DDX_Text(pDX, IDC_CMB_MINARC, m_iMinValue);
DDX_Radio(pDX, IDC_RAD_COMMON, m_bCommon);
DDX_Check(pDX, IDC_CHK_EDITION, m_bEdit);
DDX_CBString(pDX, IDC_CMB_EDITHEIGHT, m_strHeight);
//DDX_CBString(pDX, IDC_CMB_EDITSTYLE, m_strType);
if(pDX->m_bSaveAndValidate)
{
DDX_CBString(pDX, IDC_CMB_EDITSTYLE, m_strType);
}
else
{
GetDlgItem(IDC_CMB_EDITSTYLE)->SetWindowText(m_strType);
}
DDX_CBString(pDX, IDC_CMB_EDITON, m_strEdition);
DDX_Control(pDX, IDC_CMB_EDITSTYLE, m_cmbDrawStyle);
}
BOOL CCloudLineDlg::OnInitDialog()
{
CModelessDialog::OnInitDialog();
createToolBar(); //创建工具条
InitTextType();
OnClickEdition();
//add by lgy 20120522 设置按钮状态
CheckTypeButton();
UpdateData(FALSE);
return TRUE;
}
BEGIN_MESSAGE_MAP(CCloudLineDlg, CModelessDialog)
ON_BN_CLICKED(IDC_CHK_EDITION, OnClickEdition)
ON_BN_CLICKED(ID_BTN_EDITIONA, OnClickEditionA)
ON_BN_CLICKED(ID_BTN_EDITIONB, OnClickEditionB)
ON_BN_CLICKED(ID_BTN_EDITIONC, OnClickEditionC)
ON_BN_CLICKED(ID_BTN_EDITIOND, OnClickEditionD)
ON_BN_CLICKED(IDC_BTN_EDITHEIGHT, OnClickBtnTextHeight)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
END_MESSAGE_MAP()
void CCloudLineDlg::OnClickEdition()
{
UpdateData(TRUE);
if (m_bEdit) //是否编辑版次文字
{
GetDlgItem(IDC_CMB_EDITON)->EnableWindow(TRUE);
GetDlgItem(IDC_CMB_EDITHEIGHT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_EDITHEIGHT)->EnableWindow(TRUE);
GetDlgItem(IDC_CMB_EDITSTYLE)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_CMB_EDITON)->EnableWindow(FALSE);
GetDlgItem(IDC_CMB_EDITHEIGHT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_EDITHEIGHT)->EnableWindow(FALSE);
GetDlgItem(IDC_CMB_EDITSTYLE)->EnableWindow(FALSE);
}
UpdateData(FALSE);
}
void CCloudLineDlg::createToolBar()//创建工具条
{
UINT buttonID[]={ID_BTN_EDITIONA, ID_BTN_EDITIONB, ID_BTN_EDITIONC, ID_BTN_EDITIOND};
CAcModuleResourceOverride vTmp;
m_toolbar.Create( WS_VISIBLE | WS_CHILD | CCS_BOTTOM | TBSTYLE_TOOLTIPS
| CCS_ADJUSTABLE ,CRect(0,0,0,0),this, IDR_CLOUDLINE);
TBBUTTON *pIndex, *pRTF_Button = new TBBUTTON[20];
pIndex = pRTF_Button;
for(long lIndex = 0; lIndex < 4; lIndex++) //创建四个BUTTON
{
memset(pIndex ,NULL, sizeof(TBBUTTON));
pIndex->iBitmap = lIndex;
pIndex->idCommand = buttonID[lIndex];
pIndex->fsStyle = TBSTYLE_CHECKGROUP;
pIndex->fsState = TBSTATE_ENABLED;
pIndex++;
}
CSize size(16, 15);
m_toolbar.SetButtonSize(size);
m_toolbar.AddButtons(4, pRTF_Button);
// sg delete 120613,解决64位下的崩溃问题
// delete pIndex;
delete[] pRTF_Button;
m_toolbar.SetBitmapSize(size);
m_toolbar.ModifyStyle(0,TBSTYLE_FLAT);
m_toolbar.AddBitmap(4, IDR_CLOUDLINE);
}
BOOL CCloudLineDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)//工具条的button功能说明
{
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;
}
void CCloudLineDlg::OnClickEditionA()
{
UpdateData(TRUE);
m_iDrawLineStyle = 1; //绘制类型为矩形云线
m_bStyeChange = true;
//add by lgy 20120522 设置按钮状态
CheckTypeButton();
UpdateData(FALSE);
acedPostCommand(_T("\33"));//发送一个esc
}
void CCloudLineDlg::OnClickEditionB()
{
UpdateData(TRUE);
m_iDrawLineStyle = 0; //绘制类型为圆形云线
m_bStyeChange = true;
//add by lgy 20120522 设置按钮状态
CheckTypeButton();
UpdateData(FALSE);
acedPostCommand(_T("\33"));
}
void CCloudLineDlg::OnClickEditionC()
{
UpdateData(TRUE);
m_iDrawLineStyle = 2; //任意绘制
m_bStyeChange = true;
//add by lgy 20120522 设置按钮状态
CheckTypeButton();
UpdateData(FALSE);
acedPostCommand(_T("\33"));
}
void CCloudLineDlg::OnClickEditionD()
{
UpdateData(TRUE);
m_iDrawLineStyle = 3; //选择对象生成
m_bStyeChange = true;
//add by lgy 20120522 设置按钮状态
CheckTypeButton();
UpdateData(FALSE);
acedPostCommand(_T("\33"));
}
void CCloudLineDlg::OnClickBtnTextHeight()//字高
{
UpdateData(TRUE);
XPushAutoHide noAutoHide(this);
double dHeight = _tstof(m_strHeight);
dHeight = dHeight*DocGetPScale();
BeginEditorCommand();
if(GetDist(_T("\n字高"), dHeight, RSG_NOZERO|RSG_NONEG) == RTNORM)
{
dHeight /= DocGetPScale(); //将得到的字高长度除以当前图纸比例显示到对话框中
CString str;
str.Format(_T("%.1f"), dHeight);
m_strHeight = str;
}
CompleteEditorCommand();
UpdateData(FALSE);
}
BOOL CCloudLineDlg::DestroyWindow()
{
UpdateData(TRUE);
// sg delete 120613,无法理解下面4句话是什么意思
//m_iMinValue;
//m_iMaxValue;
//m_strEdition;
//m_strType;
return CModelessDialog::DestroyWindow();
}
void CCloudLineDlg::InitTextType()
{
XSymbolList lstStyle(_T("STYLE"));
for (int m =0; m < lstStyle.Length(); m++) //初始化文字样式
{
m_cmbDrawStyle.AddString(lstStyle[m]);
}
// sg modify 120706,增加一个判断,如果当前记忆的样式没有的话,那么使用上华固定的文字样式
//m_cmbDrawStyle.SetCurSel(m_cmbDrawStyle.FindStringExact(0, m_strType));
int nRet = m_cmbDrawStyle.FindStringExact(0, m_strType);
if (nRet < 0)
{
nRet = m_cmbDrawStyle.FindStringExact(0, _T("_TCH_LABEL"));
}
m_cmbDrawStyle.SetCurSel(nRet);
}
void CCloudLineDlg::CheckTypeButton()
{
m_toolbar.CheckButton(ID_BTN_EDITIONA, m_iDrawLineStyle == 1);
m_toolbar.CheckButton(ID_BTN_EDITIONB, m_iDrawLineStyle == 0);
m_toolbar.CheckButton(ID_BTN_EDITIONC, m_iDrawLineStyle == 2);
m_toolbar.CheckButton(ID_BTN_EDITIOND, m_iDrawLineStyle == 3);
}
bool CCloudLineDlg::GetIsChangeType()
{
return m_bStyeChange;
}
void CCloudLineDlg::SetIsChangeType(bool bIs)
{
m_bStyeChange = bIs;
}
BOOL CCloudLineDlg::GetIsDrawing()
{
UpdateData(TRUE);
return m_bCommon;
}
int CCloudLineDlg::GetDrawLineStyle()
{
UpdateData(TRUE);
return m_iDrawLineStyle;
}
BOOL CCloudLineDlg::GetIsEdition()
{
UpdateData(TRUE);
return m_bEdit;
}
double CCloudLineDlg::GetMaxValue(BOOL bAsPaperUnit)
{
UpdateData(TRUE);
double dMax = m_iMaxValue;
if (bAsPaperUnit)
dMax *= DocGetPScale();
return dMax;
}
double CCloudLineDlg::GetMinValue(BOOL bAsPaperUnit)
{
UpdateData(TRUE);
double dMin = m_iMinValue;
if (bAsPaperUnit)
dMin *= DocGetPScale();
return dMin;
}
double CCloudLineDlg::GetEndWidth()
{
UpdateData(TRUE);
double dEndWidth = 0,
dMax = m_iMaxValue;
if (m_bCommon)
dEndWidth = dMax/10;
return dEndWidth;
}
void CCloudLineDlg::GetTextParam(BOOL &bHasText, CString &csText, double &dHeight, AcDbObjectId &idTextStyle)
{
UpdateData(TRUE);
bHasText = m_bEdit;
csText = m_strEdition;
dHeight = _tstof(m_strHeight);
idTextStyle = InitTextStyle(m_strType);
}
void CCloudLineDlg::GetCloudLinePoly(const XCurveSegment &cvSegment, XPoly2D &polyModi)
{
UpdateData(TRUE);
double dMax = m_iMaxValue * DocGetPScale(),
dMin = m_iMinValue * DocGetPScale();
double dLengh(0.0),
nLast = polyModi.GetLength() - 1; // 当前的最后一个
while (dLengh < cvSegment.GetLength())
{
TADSGePointDir2d pt;
cvSegment.Polar(dLengh, pt);
polyModi.AppendNode(pt.AsAcGePoint3d());
double dTotalLen = (rand()%10)/10.000;
dTotalLen = dTotalLen*dMax;
if (dTotalLen < dMin)
{
dTotalLen += dMin;
}
dLengh = dLengh + dTotalLen;
}
}
void CCloudLineDlg::GetCloudLinePoly(const XPoly2D &polyOld, XPoly2D &polyModi)
{
XCurveSegment cvSegment,
cvPrevSegment;
XPoint ptPrevEnd;
BOOL bReverseArc(FALSE),
bReversePrevArc(FALSE);
int nSeg = polyOld.TotalSegments();
for (int i = 0; i < nSeg; i++)
{
polyOld.Nth(i, cvSegment);
if (cvSegment.Is(CURVE_ARC)) // 弧
{
int nPrev = i - 1;
nPrev = DePeriod(nSeg, nPrev);
polyOld.Nth(nPrev, cvPrevSegment);
if (bReversePrevArc) // 前一段的情况
ptPrevEnd = cvPrevSegment.StartPoint();
else
ptPrevEnd = cvPrevSegment.EndPoint();
XArc arc = cvSegment.GetArc();
XPoint ptStart;
arc.GetStartPoint(ptStart);
bReverseArc = ptPrevEnd!=ptStart;
}
double dMax = m_iMaxValue * DocGetPScale(),
dMin = m_iMinValue * DocGetPScale();
double dLengh(0.0);
int nLast = polyModi.Length(); // 当前的最后一个
while (dLengh < cvSegment.GetLength())
{
TADSGePointDir2d pt;
cvSegment.Polar(dLengh, pt);
if (bReverseArc)
polyModi.InsertNodeAt(nLast, pt.AsAcGePoint3d());
else
polyModi.AppendNode(pt.AsAcGePoint3d());
double dTotalLen = (rand()%10)/10.000;
dTotalLen = dTotalLen*dMax;
if (dTotalLen < dMin)
{
dTotalLen += dMin;
}
dLengh = dLengh + dTotalLen;
}
bReversePrevArc = bReverseArc;
bReverseArc = FALSE;
}
}