440 lines
10 KiB
C++
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;
|
|
}
|
|
} |