#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; } }