342 lines
7.2 KiB
C++
342 lines
7.2 KiB
C++
#include "stdafx.h"
|
|
#include "TDFDDlg.h"
|
|
#include "axlock.h"
|
|
|
|
IMPLEMENT_DYNAMIC(CTDFDDlg, CDialog)
|
|
|
|
CTDFDDlg::CTDFDDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CTDFDDlg::IDD, pParent)
|
|
, m_dTLen(10)
|
|
, m_sStackPre(_T("K0+"))
|
|
, m_dStepL(10)
|
|
{
|
|
}
|
|
|
|
CTDFDDlg::~CTDFDDlg()
|
|
{
|
|
}
|
|
|
|
void CTDFDDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
DDX_Control(pDX, IDC_LISTSEGS, m_wndSegList);
|
|
DDX_Text(pDX, IDC_EDITTLEN, m_dTLen);
|
|
DDX_Text(pDX, IDC_EDIT1, m_sStackPre);
|
|
DDX_Text(pDX, IDC_EDIT2, m_dStepL);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CTDFDDlg, CDialog)
|
|
ON_BN_CLICKED(IDOK, &CTDFDDlg::OnBnClickedOk)
|
|
ON_BN_CLICKED(IDC_BTNEW, &CTDFDDlg::OnBnClickedBtnew)
|
|
ON_BN_CLICKED(IDC_BTREMOVE, &CTDFDDlg::OnBnClickedBtremove)
|
|
ON_BN_CLICKED(IDC_BTNEW3, &CTDFDDlg::OnBnClickedBtnew3)
|
|
ON_BN_CLICKED(IDC_BTNEW2, &CTDFDDlg::OnBnClickedBtnew2)
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL CTDFDDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
m_ImageList.Create(IDB_BITMAP4,16,1,RGB(0, 255, 255));
|
|
m_wndSegList.SetImageList(&m_ImageList,LVSIL_SMALL);
|
|
m_wndSegList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
|
|
|
|
m_wndSegList.InsertColumn(0,_T("桩号"),LVCFMT_LEFT,160,160);
|
|
m_wndSegList.InsertColumn(1,_T("水平长度(米)"),LVCFMT_LEFT,120,120);
|
|
m_wndSegList.InsertColumn(2,_T("坡度n%"),LVCFMT_LEFT,100,100);
|
|
|
|
m_wndSegList.SetColumnItemData(0,NULL,ET_Edit);
|
|
m_wndSegList.SetColumnItemData(1,NULL,ET_Edit);
|
|
m_wndSegList.SetColumnItemData(2,NULL,ET_Edit);
|
|
|
|
m_dTLen = m_seg.dDistLen;
|
|
UpdateData(FALSE);
|
|
|
|
OnBnClickedBtnew();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CTDFDDlg::OnBnClickedBtnew()
|
|
{
|
|
UpdateData();
|
|
double dLen = m_dTLen;
|
|
int nCount = m_wndSegList.GetItemCount();
|
|
CString sLen;
|
|
|
|
if (nCount > 0)
|
|
{
|
|
nCount += 1;
|
|
dLen = m_dTLen / nCount;
|
|
|
|
sLen.Format(_T("%g"),dLen);
|
|
for (int i = 0;i < m_wndSegList.GetItemCount();i++)
|
|
{
|
|
m_wndSegList.SetItemText(i,1,sLen);
|
|
m_arSegs.at(i).dDistLen = dLen;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sLen.Format(_T("%g"),m_dTLen);
|
|
}
|
|
|
|
EWSegment seg;
|
|
memset(&seg,0,sizeof(EWSegment));
|
|
seg.dDistLen = dLen;
|
|
seg.dGradient = m_seg.dGradient;
|
|
m_arSegs.append(seg);
|
|
|
|
CString sStack = seg.szStake;
|
|
|
|
int nItem = m_wndSegList.InsertItem(m_wndSegList.GetItemCount(),sStack,4);
|
|
m_wndSegList.SetItemText(nItem,1,sLen);
|
|
|
|
sLen.Format(_T("%g"),m_seg.dGradient);
|
|
m_wndSegList.SetItemText(nItem,2,sLen);
|
|
|
|
//分配桩号 K0+距离
|
|
CString sLenN;
|
|
sLenN.Format(_T("%d"),(int)(m_dTLen + 0.5));
|
|
int nAn = sLenN.GetLength();
|
|
int nBn = 0;
|
|
|
|
dLen = 0.0;
|
|
for (int k = 0;k < m_wndSegList.GetItemCount();k++)
|
|
{
|
|
sLen = m_wndSegList.GetItemText(k,1);
|
|
dLen += _ttof(sLen);
|
|
|
|
sLen.Format(_T("%d"),(int)(dLen + 0.5) );
|
|
nBn = sLen.GetLength();
|
|
for (int nn = 0;nn < nAn - nBn;nn++)
|
|
{
|
|
sLen.Insert(0,_T('0'));
|
|
}
|
|
|
|
sStack.Format(_T("%s%s"),m_sStackPre,sLen );
|
|
m_wndSegList.SetItemText(k,0,sStack);
|
|
}
|
|
}
|
|
|
|
void CTDFDDlg::OnBnClickedBtremove()
|
|
{
|
|
POSITION ps = m_wndSegList.GetFirstSelectedItemPosition();
|
|
if (ps != NULL)
|
|
{
|
|
int nItem = m_wndSegList.GetNextSelectedItem(ps);
|
|
if (nItem != -1)
|
|
{
|
|
m_wndSegList.DeleteItem(nItem);
|
|
m_arSegs.removeAt(nItem);
|
|
}
|
|
|
|
int nCount = m_wndSegList.GetItemCount();
|
|
if (nCount > 0)
|
|
{
|
|
CString sLen;
|
|
double dLen = m_dTLen / nCount;
|
|
sLen.Format(_T("%g"),dLen);
|
|
|
|
for (int i = 0;i < m_wndSegList.GetItemCount();i++)
|
|
{
|
|
m_wndSegList.SetItemText(i,1,sLen);
|
|
m_arSegs.at(i).dDistLen = dLen;
|
|
}
|
|
|
|
UpdateData();
|
|
|
|
//分配桩号 K0+距离
|
|
CString sStack,sLenN;
|
|
sLenN.Format(_T("%d"),(int)(m_dTLen + 0.5));
|
|
int nAn = sLenN.GetLength();
|
|
int nBn = 0;
|
|
|
|
dLen = 0.0;
|
|
for (int k = 0;k < m_wndSegList.GetItemCount();k++)
|
|
{
|
|
sLen = m_wndSegList.GetItemText(k,1);
|
|
dLen += _ttof(sLen);
|
|
|
|
sLen.Format(_T("%d"),(int)(dLen + 0.5) );
|
|
nBn = sLen.GetLength();
|
|
for (int nn = 0;nn < nAn - nBn;nn++)
|
|
{
|
|
sLen.Insert(0,_T('0'));
|
|
}
|
|
|
|
sStack.Format(_T("%s%s"),m_sStackPre,sLen );
|
|
m_wndSegList.SetItemText(k,0,sStack);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CTDFDDlg::OnBnClickedOk()
|
|
{
|
|
//更新梯度和长度
|
|
int nCount = m_wndSegList.GetItemCount();
|
|
if (nCount > 1)
|
|
{
|
|
double dTLen = 0.0;
|
|
CString sLen,sGr,sNo;
|
|
|
|
for (int i = 0;i < m_wndSegList.GetItemCount();i++)
|
|
{
|
|
sNo = m_wndSegList.GetItemText(i,0);
|
|
sLen = m_wndSegList.GetItemText(i,1);
|
|
sGr = m_wndSegList.GetItemText(i,2);
|
|
|
|
dTLen += _ttof(sLen);
|
|
_tcscpy(m_arSegs.at(i).szStake,(LPCTSTR)sNo);
|
|
m_arSegs.at(i).dDistLen = _ttof(sLen);
|
|
m_arSegs.at(i).dGradient = _ttof(sGr);
|
|
}
|
|
|
|
if ( fabs(dTLen - m_dTLen) > 1.e-2)
|
|
{
|
|
AfxMessageBox(_T("分段总长度之和与原始总长度不一致!请检查分段长度!"));
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AfxMessageBox(_T("至少多与一个梯度分段!"));
|
|
return;
|
|
}
|
|
OnOK();
|
|
}
|
|
|
|
int CTDFDDlg::GetSegments(AcArray<EWSegment>& arSegs)
|
|
{
|
|
arSegs.append(m_arSegs);
|
|
return m_arSegs.length();
|
|
}
|
|
|
|
void CTDFDDlg::OnBnClickedBtnew3()
|
|
{
|
|
int nItem = -1;
|
|
POSITION ps = m_wndSegList.GetFirstSelectedItemPosition();
|
|
if (ps != NULL)
|
|
{
|
|
nItem = m_wndSegList.GetNextSelectedItem(ps);
|
|
}
|
|
if (nItem == -1)
|
|
{
|
|
AfxMessageBox(_T("请选择分段记录替换桩号!"));
|
|
return;
|
|
}
|
|
|
|
EnableWindow(FALSE);
|
|
CWnd* pFrame = acedGetAcadFrame();
|
|
pFrame->EnableWindow(TRUE);
|
|
ShowWindow(SW_HIDE);
|
|
pFrame->SetFocus();
|
|
|
|
ads_point pt;
|
|
ads_name ent;
|
|
|
|
int nRes = acedEntSel(_T("\n请选桩号文字:"),ent,pt);
|
|
if (nRes == RTNORM)
|
|
{
|
|
AcAxDocLock lock;
|
|
AcDbObjectId id;
|
|
acdbGetObjectId(id,ent);
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
AcDbText* pText = AcDbText::cast(pEnt);
|
|
if (pText != NULL)
|
|
{
|
|
CString sText = pText->textStringConst();
|
|
m_wndSegList.SetItemText(nItem,0,sText);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
pFrame->EnableWindow(FALSE);
|
|
ShowWindow(SW_SHOW);
|
|
EnableWindow(TRUE);
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CTDFDDlg::OnBnClickedBtnew2()
|
|
{
|
|
UpdateData();
|
|
|
|
if (m_dTLen < 1.0)
|
|
{
|
|
AfxMessageBox(_T("分段长度至少1米以上,请重新输入等分长度!"));
|
|
return;
|
|
}
|
|
|
|
m_wndSegList.DeleteAllItems();
|
|
|
|
double dLen = m_dTLen;
|
|
|
|
int nCount = (int)(m_dTLen / m_dStepL );
|
|
CString sLen;
|
|
|
|
if (nCount > 0)
|
|
{
|
|
dLen = m_dStepL;
|
|
|
|
EWSegment seg;
|
|
sLen.Format(_T("%g"),dLen);
|
|
|
|
CString sStack;
|
|
int nItem = -1;
|
|
for (int i = 0;i < nCount;i++)
|
|
{
|
|
memset(&seg,0,sizeof(EWSegment));
|
|
seg.dDistLen = m_dStepL;
|
|
seg.dGradient = m_seg.dGradient;
|
|
m_arSegs.append(seg);
|
|
|
|
sStack = seg.szStake;
|
|
nItem = m_wndSegList.InsertItem(m_wndSegList.GetItemCount(),sStack,4);
|
|
m_wndSegList.SetItemText(nItem,1,sLen);
|
|
}
|
|
|
|
//余下
|
|
double dLast = m_dTLen - nCount * m_dStepL;
|
|
if (dLast > 1.e-3)
|
|
{
|
|
memset(&seg,0,sizeof(EWSegment));
|
|
seg.dDistLen = dLast;
|
|
seg.dGradient = m_seg.dGradient;
|
|
m_arSegs.append(seg);
|
|
|
|
sLen.Format(_T("%g"),dLast);
|
|
sStack = seg.szStake;
|
|
nItem = m_wndSegList.InsertItem(m_wndSegList.GetItemCount(),sStack,4);
|
|
m_wndSegList.SetItemText(nItem,1,sLen);
|
|
}
|
|
|
|
//分配桩号 K0+距离
|
|
CString sLenN;
|
|
sLenN.Format(_T("%d"),(int)(m_dTLen + 0.5));
|
|
int nAn = sLenN.GetLength();
|
|
int nBn = 0;
|
|
|
|
dLen = 0.0;
|
|
for (int k = 0;k < m_wndSegList.GetItemCount();k++)
|
|
{
|
|
sLen = m_wndSegList.GetItemText(k,1);
|
|
dLen += _ttof(sLen);
|
|
|
|
sLen.Format(_T("%d"),(int)(dLen + 0.5) );
|
|
nBn = sLen.GetLength();
|
|
for (int nn = 0;nn < nAn - nBn;nn++)
|
|
{
|
|
sLen.Insert(0,_T('0'));
|
|
}
|
|
|
|
sStack.Format(_T("%s%s"),m_sStackPre,sLen );
|
|
m_wndSegList.SetItemText(k,0,sStack);
|
|
}
|
|
}
|
|
}
|