863 lines
21 KiB
C++
863 lines
21 KiB
C++
#include "stdafx.h"
|
||
#include "AcDbObjectPtr.h"
|
||
#include "globalFunc.h"
|
||
#include "StakeDlg.h"
|
||
#include "DbStake.h"
|
||
#include "RBGroups.h"
|
||
#include "TBlockEdJig.h"
|
||
#include "DbEquipment.h"
|
||
#include "XText.h"
|
||
#include <vector>
|
||
#include <map>
|
||
#include "PickEntSet.h"
|
||
|
||
#ifdef _DEBUG
|
||
#define new DEBUG_NEW
|
||
#undef THIS_FILE
|
||
static char THIS_FILE[] = __FILE__;
|
||
#endif
|
||
|
||
extern AcDbObjectId InitLayer(const TCHAR *szLayer, BOOL bApplyChange = TRUE);
|
||
extern AcDbObjectId InitTextStyle(TTextStyle ts, AcDbDatabase *pDb = NULL);
|
||
extern AcDbObjectId InitTextStyle(const TCHAR *pszStyle, AcDbDatabase *pDb = NULL);
|
||
|
||
static CString s_sBetweenDis = _T("");
|
||
static BOOL s_bImprove = TRUE;
|
||
static BOOL s_bRightDirection = TRUE;
|
||
|
||
#define LAY_STAKE _T("TWT_STAKE")
|
||
#define STAKE_FILE _T("stake.his")
|
||
//沿线布置桩
|
||
void InsStakeAlongLine()
|
||
{
|
||
|
||
CTemporaryResourceOverride vTemp;
|
||
CStakeDlg dlg;
|
||
dlg.Create(IDD_STAKE,acedGetAcadFrame());
|
||
dlg.SetWindowText(_T("沿线布桩"));
|
||
//初始化图层
|
||
InitLayer(LAY_STAKE);
|
||
|
||
RBList rbMask = ads_buildlist( -4, _T("<or"),
|
||
-4, _T("<and"), RTDXF0, _T("LINE"), -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("LWPOLYLINE"), -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("ARC"), -4, _T("and>"),
|
||
-4, _T("or>"), NULL);
|
||
|
||
RBList rbMaskEquip(RTDXF0, _T("AEC_ZT_STAKE"), NULL);
|
||
dlg.ShowWindow(SW_SHOW);
|
||
|
||
//用户不退出则一直布置
|
||
XPoint ptBefore,ptNext;
|
||
XPoint ptPick;
|
||
Entity ent;
|
||
double dBeforeNum = 0.0; //前一点的桩号
|
||
double dStakeBetween = 0.0;
|
||
while(1)
|
||
{
|
||
if (fabs(ptNext.x) < 0.001)
|
||
{
|
||
BOOL bStake = FALSE;//判断是否选择了桩
|
||
|
||
int ret = GlobalFunc::SelectEntity1(0.3, _T("\n请拾取布置桩的第一点<退出>"), ent, ptPick, rbMask);
|
||
if(ret != RTNORM)
|
||
break;
|
||
|
||
ptPick = GlobalFunc::Ucs2Wcs(ptPick);
|
||
ptBefore = ptPick;
|
||
//判断是否点在桩上
|
||
Entity entStake;
|
||
PickSet ssSel(SS_FREE);
|
||
XPoint ptUsc = GlobalFunc::Wcs2Ucs(ptPick);
|
||
GlobalFunc::GetPointPickSet(ptPick,ssSel,rbMaskEquip,(int)GlobalFunc::DocGetPScale());
|
||
|
||
long index = 0;
|
||
int len = ssSel.Length();
|
||
for (index = 0; index < len; index++)
|
||
{
|
||
entStake = ssSel[index];
|
||
if (entStake.Is(_T("AEC_ZT_STAKE")))
|
||
{
|
||
bStake = TRUE;
|
||
OPENOBJ_BEGIN(entStake, AcDb::kForRead, CDbStake, pEquip);
|
||
if(pEquip)
|
||
{
|
||
ptBefore = pEquip->GetLocation();
|
||
}
|
||
OPENOBJ_END();
|
||
break;
|
||
}
|
||
}
|
||
|
||
//得到当前桩的值
|
||
if (bStake)
|
||
{
|
||
CString sTextValue;
|
||
OPENOBJ_BEGIN(entStake, AcDb::kForRead, CDbStake, pEquip);
|
||
if (pEquip != NULL)
|
||
{
|
||
sTextValue.Format(_T("%.2f"),pEquip->GetStakeValue());
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
if (_tstof(sTextValue) > 0.01)
|
||
{
|
||
dlg.m_sStartDis = sTextValue;
|
||
dlg.UpdateData(FALSE);
|
||
}
|
||
}
|
||
|
||
if (!GlobalFunc::DocGetMeterUnitDraw())
|
||
dBeforeNum = _tstof(dlg.m_sStartDis)*1000;
|
||
else
|
||
dBeforeNum = _tstof(dlg.m_sStartDis);
|
||
|
||
dlg.UpdateData(TRUE);
|
||
|
||
s_bRightDirection = TRUE;
|
||
if (!bStake) //选中桩了就不需要再重复插入桩
|
||
dlg.InsStakeOnPoint(ent,ptBefore,dBeforeNum,ptPick, dlg.m_sLineDis,dlg.m_sLineLen,dlg.m_sStakePrefix,dlg.m_sStartDis,dlg.m_nLablePlace);
|
||
}
|
||
|
||
Entity entNext; //下一个实体
|
||
RBList rbMask(RTDXF0, _T("LINE,LWPOLYLINE,ARC"), NULL);
|
||
int ret = GlobalFunc::SelectEntity1(0.3, _T("\n请拾取布置桩的下一点<退出>"), entNext, ptNext, rbMask);
|
||
if(ret != RTNORM)
|
||
break;
|
||
|
||
dlg.UpdateData(TRUE);
|
||
ptNext = GlobalFunc::Ucs2Wcs(ptNext);
|
||
if (!GlobalFunc::DocGetMeterUnitDraw())
|
||
dStakeBetween = _tstof(dlg.m_sStakeBetween)*1000;
|
||
else
|
||
dStakeBetween = _tstof(dlg.m_sStakeBetween);
|
||
|
||
if (!dlg.InsStakeByLine(ent,entNext,dBeforeNum,ptBefore,ptNext,dlg.m_sLineDis,dlg.m_sLineLen,dlg.m_sStakePrefix,dlg.m_sStartDis,dlg.m_nLablePlace,dStakeBetween))
|
||
break;
|
||
}
|
||
dlg.DestroyWindow();
|
||
}
|
||
|
||
//任意布置桩
|
||
void InsStakeRandom()
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
CStakeDlg dlg;
|
||
dlg.Create(IDD_STAKE,acedGetAcadFrame());
|
||
dlg.SetWindowText(_T("任意布桩"));
|
||
//初始化图层
|
||
InitLayer(LAY_STAKE);
|
||
|
||
RBList rbMaskStake(RTDXF0, _T("AEC_ZT_STAKE"), NULL);
|
||
|
||
RBList rbMask = ads_buildlist( -4, _T("<or"),
|
||
-4, _T("<and"), RTDXF0, _T("LINE"), -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("LWPOLYLINE"), -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("ARC"), -4, _T("and>"),
|
||
-4, _T("or>"), NULL);
|
||
|
||
dlg.ShowWindow(SW_SHOW);
|
||
dlg.GetDlgItem(IDC_EDITSTAKEBETWEEN)->EnableWindow(FALSE);
|
||
//用户不退出则一直布置
|
||
XPoint ptBefore,ptNext;
|
||
XPoint ptPick;
|
||
Entity ent,ent2,entStake;
|
||
double dBeforeNum = 0.0; //前一点的桩号
|
||
double dStakeBetween = 0.0;
|
||
BOOL bFirst = TRUE;
|
||
while(1)
|
||
{
|
||
if (bFirst)
|
||
{
|
||
XPoint ptT;
|
||
int ret = GlobalFunc::SelectEntity1( _T("\n请拾取前一个桩<退出>"), entStake,ptT, rbMaskStake);
|
||
if(ret != RTNORM)
|
||
break;
|
||
|
||
//判断是否点在桩上
|
||
|
||
|
||
//通过桩的位置得到另外的实体
|
||
CString sTextValue;
|
||
OPENOBJ_BEGIN(entStake, AcDb::kForRead, CDbStake, pEquip);
|
||
if (pEquip != NULL)
|
||
{
|
||
ptBefore = pEquip->GetLocation();
|
||
sTextValue.Format(_T("%.2f"),pEquip->GetStakeValue());
|
||
}
|
||
else
|
||
continue;
|
||
OPENOBJ_END();
|
||
|
||
|
||
if (_tstof(sTextValue) > 0.01)
|
||
{
|
||
dlg.m_sStartDis = sTextValue;
|
||
dlg.UpdateData(FALSE);
|
||
}
|
||
|
||
if (!GlobalFunc::DocGetMeterUnitDraw())
|
||
dBeforeNum = _tstof(dlg.m_sStartDis)*1000;
|
||
else
|
||
dBeforeNum = _tstof(dlg.m_sStartDis);
|
||
|
||
dlg.UpdateData(TRUE);
|
||
|
||
ptBefore = GlobalFunc::Ucs2Wcs(ptBefore);
|
||
PickSet ssAll(SS_FREE);
|
||
GlobalFunc::GetPointPickSet(ptBefore,ssAll,rbMask,(int)GlobalFunc::DocGetPScale());
|
||
if (ssAll.Length() < 1)
|
||
return;
|
||
|
||
long lIndex = 0;
|
||
ent = ssAll[lIndex];
|
||
|
||
bFirst = FALSE;
|
||
}
|
||
|
||
int ret = GlobalFunc::SelectEntity1(0.3, _T("\n请选择需要布置桩的位置<退出>"), ent2, ptPick, rbMask);
|
||
if(ret != RTNORM)
|
||
break;
|
||
|
||
ptPick = GlobalFunc::Ucs2Wcs(ptPick);
|
||
PickSet ss(SS_FREE);
|
||
//得到实体上所有的桩
|
||
dlg.GetCurvePickSet(ent2,ss,rbMaskStake);
|
||
|
||
Entity entTempStake;
|
||
XPoint ptLocation,ptNearMin,ptNearMax;
|
||
long lIndex = 0;
|
||
CString sXData;
|
||
int nLen = ss.Length();
|
||
if (nLen > 1)
|
||
{
|
||
dlg.GetNewPtAddDis(ent2,ss,ptBefore,ptPick,dBeforeNum);
|
||
}
|
||
else if (nLen == 1)
|
||
{
|
||
TCHAR szValue[100] = {0};
|
||
acedGetString(0,_T("\n请判断桩号增加还是递减(Y增加,N递减)"),szValue);
|
||
|
||
if(_tcsicmp(szValue, _T("N")) == 0 || _tcsicmp(szValue, _T("n")) == 0)
|
||
{
|
||
s_bImprove = FALSE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CString sStakeNum;
|
||
TCHAR szValue[100] = {0};
|
||
acedGetString(1,_T("\n请输入桩号(m):"),szValue);
|
||
sStakeNum = szValue;
|
||
ptBefore = ptPick;
|
||
if (!GlobalFunc::DocGetMeterUnitDraw())
|
||
dBeforeNum = _tstof(sStakeNum) * 1000;
|
||
else
|
||
dBeforeNum = _tstof(sStakeNum);
|
||
}
|
||
//插入桩
|
||
dlg.UpdateData();
|
||
dlg.InsStakeOnPoint(ent2,ptBefore,dBeforeNum,ptPick, dlg.m_sLineDis,dlg.m_sLineLen,dlg.m_sStakePrefix,dlg.m_sStartDis,dlg.m_nLablePlace);
|
||
ptBefore = ptPick;
|
||
}
|
||
|
||
dlg.DestroyWindow();
|
||
}
|
||
|
||
//选择点布置
|
||
void CStakeDlg::InsStakeOnPoint(Entity ent,XPoint ptBefore,double &dBeforeNum,XPoint ptPick,
|
||
CString &sLineDis,CString &sLineLen,CString &sStakePrefix,
|
||
CString &sStartDis,int nLablePlace)
|
||
{
|
||
XCurveSegment seg;
|
||
if (ent.Is(_T("LINE")) || ent.Is(_T("ARC")))
|
||
{
|
||
seg = XCurveSegment(ent);
|
||
}
|
||
else if(ent.Is(_T("LWPOLYLINE")))
|
||
{
|
||
double dAngle;
|
||
seg = GlobalFunc::GetSegByPt(XPoly2D(ent), ptPick, dAngle);
|
||
}
|
||
|
||
AcGePoint3d ptStart,ptEnd,ptTextPosition;
|
||
AcGeVector3d vecTemp1,vecTemp2,vecTemp3; //左侧,右侧,中间标注方向的三个向量
|
||
double dTextRotate = 0.0;
|
||
CString sText;
|
||
g_Option::instance().g_nInsBlkRotate = GlobalFunc::GetInsRotate(ptPick, seg);
|
||
|
||
AcGeVector3d vecTempDir,vecTmpY(0,1,0);
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbCurve, pCurveTemp);
|
||
if(pCurveTemp)
|
||
{
|
||
pCurveTemp->getFirstDeriv(ptPick,vecTempDir);
|
||
vecTempDir = vecTempDir.perpVector();
|
||
vecTempDir.normalize();
|
||
|
||
m_vtFirst = vecTempDir;
|
||
if (!s_bRightDirection)
|
||
vecTempDir.negate();
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
//计算文字
|
||
double dBeforeDis,dPickDis;
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbCurve, pCurve);
|
||
if (pCurve != NULL)
|
||
{
|
||
pCurve->getDistAtPoint((AcGePoint3d)ptBefore,dBeforeDis);
|
||
pCurve->getDistAtPoint((AcGePoint3d)ptPick,dPickDis);
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
if (s_bImprove)
|
||
dBeforeNum = dBeforeNum + fabs(dPickDis-dBeforeDis);
|
||
else
|
||
dBeforeNum = dBeforeNum - fabs(dPickDis-dBeforeDis);
|
||
s_bImprove = TRUE;
|
||
double dTextValue = 0.0;
|
||
if (!GlobalFunc::DocGetMeterUnitDraw())
|
||
dTextValue = dBeforeNum/1000;
|
||
else
|
||
dTextValue = dBeforeNum;
|
||
|
||
double dTextN = dTextValue/1000;
|
||
CString sTextN;
|
||
sTextN.Format(_T("%.2f"),dTextN);
|
||
//文字是1000的多少倍
|
||
int nTextN = _ttoi(sTextN);
|
||
|
||
//除以1000后的余数
|
||
double dTextResidue = fabs(dTextValue-1000*nTextN);
|
||
sTextN.Format(_T("%.0f"),dTextResidue);
|
||
int nLen = sTextN.GetLength();
|
||
sTextN.Format(_T("%.2f"),dTextResidue);
|
||
//判断有没有小数
|
||
double dEndResidue = _tstof(sTextN.Right(2));
|
||
dEndResidue /= 100;
|
||
if (dEndResidue < 0.01)
|
||
{
|
||
if (nLen == 1)
|
||
sText.Format(_T("%s%d+00%.0f"),sStakePrefix,nTextN,dTextResidue);
|
||
else if (nLen == 2)
|
||
sText.Format(_T("%s%d+0%.0f"),sStakePrefix,nTextN,dTextResidue);
|
||
else
|
||
sText.Format(_T("%s%d+%.0f"),sStakePrefix,nTextN,dTextResidue);
|
||
}
|
||
else
|
||
{
|
||
if (nLen == 1)
|
||
sText.Format(_T("%s%d+00%.2f"),sStakePrefix,nTextN,dTextResidue);
|
||
else if (nLen == 2)
|
||
sText.Format(_T("%s%d+0%.2f"),sStakePrefix,nTextN,dTextResidue);
|
||
else
|
||
sText.Format(_T("%s%d+%.2f"),sStakePrefix,nTextN,dTextResidue);
|
||
}
|
||
|
||
CDbStake *pStake = new CDbStake;
|
||
pStake->SetPositon(ptPick);
|
||
pStake->SetStakeDir(vecTempDir);
|
||
pStake->SetStakeLablePlace(nLablePlace);
|
||
int nType = m_comboStakeStyle.GetCurSel();
|
||
if (nType == -1)
|
||
nType = 0;
|
||
pStake->SetStakeType(nType);
|
||
pStake->SetTextDecimal(_ttoi(m_sDecimalNum));
|
||
|
||
if (m_nTextAngType == 0)
|
||
pStake->SetTextAng(0.0);
|
||
else if (m_nTextAngType == 1)
|
||
pStake->SetTextAng(PI/2);
|
||
else
|
||
pStake->SetTextAng(PI);
|
||
|
||
pStake->SetText(sStakePrefix,dTextValue);
|
||
pStake->SetTextHeight(_tstof(m_sTextHeight));
|
||
pStake->SetDerviDis(_tstof(sLineDis)*GlobalFunc::DocGetPScale());
|
||
pStake->SetDerviLineLen(_tstof(sLineLen)*GlobalFunc::DocGetPScale());
|
||
pStake->SetTextLayerId(InitLayer(LAY_STAKE));
|
||
pStake->SetTextStyleId(InitTextStyle(g_Option::instance().g_csTwtDimStyle));
|
||
pStake->setLayer(LAY_STAKE);
|
||
|
||
|
||
AcDbObjectId idStake = GlobalFunc::AddToCurrentSpace(pStake,Adesk::kTrue);
|
||
}
|
||
|
||
//沿线布置
|
||
BOOL CStakeDlg::InsStakeByLine(Entity &ent,Entity ent2, double &dBeforeNum, XPoint &ptBefore,XPoint &ptEnd,CString &sLineDis,CString &sLineLen,CString &sStakePrefix,CString &sStartDis,int nLablePlace,double dStakeBetween)
|
||
{
|
||
AcGeVector3d vtDeriv1,vtDeriv2;
|
||
AcDbPolyline *pCurve = NULL;
|
||
OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDbCurve,pTempCurve);
|
||
if (pTempCurve != NULL)
|
||
{
|
||
AcGePoint3d ptTempEnd,ptTempStart;
|
||
pTempCurve->getEndPoint(ptTempEnd);
|
||
pTempCurve->getStartPoint(ptTempStart);
|
||
pTempCurve->getFirstDeriv(ptBefore,vtDeriv1);
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
pCurve = GlobalFunc::GetNextPloyLine(ent,ent2,ptBefore,ptEnd);
|
||
if (pCurve == NULL)
|
||
return TRUE;
|
||
|
||
double dBeforeDis = 0.0, dPickDis = 0.0,dNextDis = 0.0;
|
||
pCurve->getDistAtPoint((AcGePoint3d)ptBefore,dBeforeDis);
|
||
pCurve->getDistAtPoint((AcGePoint3d)ptEnd,dPickDis);
|
||
pCurve->getFirstDeriv(ptBefore,vtDeriv2);
|
||
if (vtDeriv1.angleTo(vtDeriv2) > 1e-3)
|
||
s_bRightDirection = FALSE;
|
||
//判断选取的方向和选取线的方向是否一致
|
||
|
||
if (dBeforeDis >= dPickDis)
|
||
{
|
||
double dT = dBeforeDis;
|
||
dBeforeDis = dPickDis;
|
||
dPickDis = dT;
|
||
XPoly2D poly;
|
||
GlobalFunc::PolyConvert(*pCurve, poly);
|
||
poly.Reverse();
|
||
GlobalFunc::PolyConvert(poly,*pCurve);
|
||
|
||
s_bRightDirection = FALSE;
|
||
}
|
||
|
||
AcDbObjectId idPoly = GlobalFunc::AddToCurrentSpace(pCurve,Adesk::kTrue);
|
||
ads_name nameCurve;
|
||
acdbGetAdsName(nameCurve,idPoly);
|
||
Entity entPoly(nameCurve);
|
||
|
||
if (pCurve != NULL)
|
||
{
|
||
/*
|
||
double dBeforeDis = 0.0, dPickDis = 0.0,dNextDis = 0.0;
|
||
|
||
es = pCurve->getDistAtPoint((AcGePoint3d)ptBefore,dBeforeDis);
|
||
es = pCurve->getDistAtPoint((AcGePoint3d)ptEnd,dPickDis);
|
||
//判断选取的方向和选取线的方向是否一致
|
||
|
||
if (dBeforeDis >= dPickDis)
|
||
{
|
||
// entPoly.Erase();
|
||
// return FALSE;
|
||
double dT = dBeforeDis;
|
||
dBeforeDis = dPickDis;
|
||
dPickDis = dT;
|
||
}
|
||
*/
|
||
AcGePoint3d ptNext;
|
||
if (pCurve->getPointAtDist(dStakeBetween+dBeforeDis,ptNext) != Acad::eOk)
|
||
{
|
||
AfxMessageBox(_T("桩间距太大!"));
|
||
{
|
||
entPoly.Erase();
|
||
return TRUE;
|
||
}
|
||
|
||
}
|
||
if (pCurve->getDistAtPoint((AcGePoint3d)ptNext,dNextDis) != Acad::eOk)
|
||
{
|
||
entPoly.Erase();
|
||
return TRUE;
|
||
}
|
||
|
||
//循环布置下一点
|
||
while (dNextDis < dPickDis)
|
||
{
|
||
InsStakeOnPoint(entPoly,ptBefore,dBeforeNum,ptNext,sLineDis,sLineLen,sStakePrefix,sStartDis,nLablePlace);
|
||
dBeforeDis += dStakeBetween;
|
||
|
||
ptBefore = ptNext;
|
||
|
||
if (pCurve->getPointAtDist(dStakeBetween+dBeforeDis,ptNext) != Acad::eOk)
|
||
break;
|
||
if (pCurve->getDistAtPoint((AcGePoint3d)ptNext,dNextDis) != Acad::eOk)
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
entPoly.Erase();
|
||
return FALSE;
|
||
}
|
||
|
||
ent = ent2;
|
||
entPoly.Erase();
|
||
return TRUE;
|
||
}
|
||
|
||
//得到新的前一点和距离
|
||
void CStakeDlg::GetNewPtAddDis(Entity ent,PickSet &ss,XPoint &ptBefore,XPoint ptPick, double &dBeforeNum)
|
||
{
|
||
Entity entTempStake;
|
||
XPoint ptLocation,ptNearMin,ptNearMax;
|
||
long lIndex = 0;
|
||
CString sXData;
|
||
int nLen = ss.Length();
|
||
//找到最近和最远两个桩
|
||
double dMin = 0.0,dMax = 0.0;
|
||
for (lIndex = 0; lIndex < nLen; ++lIndex)
|
||
{
|
||
entTempStake = ss[lIndex];
|
||
OPENOBJ_BEGIN(entTempStake, AcDb::kForRead, CDbStake, pEquip);
|
||
if (pEquip != NULL)
|
||
{
|
||
ptLocation = pEquip->GetLocation();
|
||
sXData.Format(_T("%.2f"),pEquip->GetStakeValue());
|
||
|
||
if (lIndex == 0)
|
||
{
|
||
dMin = _tstof(sXData);
|
||
dMax = _tstof(sXData);
|
||
|
||
ptNearMin = ptLocation;
|
||
ptNearMax = ptLocation;
|
||
}
|
||
else
|
||
{
|
||
if (dMin > _tstof(sXData))
|
||
{
|
||
dMin = _tstof(sXData);
|
||
ptNearMin = ptLocation;
|
||
}
|
||
|
||
if (dMax < _tstof(sXData))
|
||
{
|
||
dMax = _tstof(sXData);
|
||
ptNearMax = ptLocation;
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
//判断应该是加上距离还是减去距离
|
||
double dMid = 0.0,dNearMin = 0.0,dNearMax = 0.0;
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbCurve, pCurve);
|
||
if (pCurve != NULL)
|
||
{
|
||
pCurve->getParamAtPoint(ptPick,dMid);
|
||
pCurve->getParamAtPoint(ptNearMin,dNearMin);
|
||
pCurve->getParamAtPoint(ptNearMax,dNearMax);
|
||
|
||
ptBefore = ptNearMin;
|
||
|
||
if (!GlobalFunc::DocGetMeterUnitDraw())
|
||
dBeforeNum = dMin * 1000;
|
||
else
|
||
dBeforeNum = dMin;
|
||
if ((dNearMin - dMid)*(dNearMax - dMid) > 0)
|
||
{
|
||
if (fabs(dNearMin - dMid) < fabs(dNearMax - dMid))
|
||
{
|
||
s_bImprove = FALSE;
|
||
}
|
||
}
|
||
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
//得到实体上的选择集
|
||
void CStakeDlg::GetCurvePickSet(Entity ent,PickSet &ss,RBList &rbMask)
|
||
{
|
||
if(ent.Is(_T("LINE")))
|
||
{
|
||
XLine line(ent);
|
||
line.TransUCS(RBGroups(0),RBGroups(1)); // 把 UCS 转为 WCS
|
||
RBList rbPoint = ads_buildlist(RT3DPOINT, &line.StartPoint(), RT3DPOINT,
|
||
&line.EndPoint(), NULL);
|
||
GlobalFunc::AssureInCurrentView(line.StartPoint(), line.EndPoint());
|
||
ss.Get(_T("F"), rbPoint, NULL, rbMask);
|
||
}
|
||
else if(ent.Is(_T("ARC")))
|
||
{
|
||
XArc arc(ent);
|
||
XCurveSegment seg;
|
||
seg = arc;
|
||
XPoly2D xPline;
|
||
seg.AsPoly2D(xPline);
|
||
XPoint pt1, pt2;
|
||
pt1 = *xPline[0];
|
||
xPline.Length();
|
||
pt2 = *xPline[xPline.Length()-1];
|
||
// xPline.TransUCS(RBGroups(0),RBGroups(1)); // 把 UCS 转为 WCS
|
||
RBList rbPoint = xPline.Polygon();
|
||
GlobalFunc::AssureInCurrentView(pt1, pt2);
|
||
ss.Get(_T("F"), rbPoint, NULL, rbMask);
|
||
}
|
||
else
|
||
{
|
||
XPoly2D xPline(ent);
|
||
XPoint pt1, pt2;
|
||
pt1 = *xPline[0];
|
||
xPline.Length();
|
||
pt2 = *xPline[xPline.Length()-1];
|
||
// xPline.TransUCS(RBGroups(0),RBGroups(1)); // 把 UCS 转为 WCS
|
||
RBList rbPoint = xPline.Polygon();
|
||
GlobalFunc::AssureInCurrentView(pt1, pt2);
|
||
ss.Get(_T("F"), rbPoint, NULL, rbMask);
|
||
}
|
||
}
|
||
|
||
CStakeDlg::CStakeDlg(CWnd* pParent /*=NULL*/)
|
||
: CDialog(CStakeDlg::IDD, pParent)
|
||
{
|
||
//{{AFX_DATA_INIT(CStakeDlg)
|
||
m_sStartDis = _T("0");
|
||
m_sLineDis = _T("0");
|
||
m_sLineLen = _T("5");
|
||
m_nLablePlace = 0;
|
||
m_sStakeBetween = _T("20");
|
||
m_sStakePrefix = _T("K");
|
||
m_sTextHeight = _T("3");
|
||
m_sDecimalNum = _T("0");
|
||
m_nTextAngType = 0;
|
||
//}}AFX_DATA_INIT
|
||
}
|
||
|
||
|
||
void CStakeDlg::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CDialog::DoDataExchange(pDX);
|
||
//{{AFX_DATA_MAP(CStakeDlg)
|
||
DDX_Control(pDX, IDC_COMBOSTAKESTYLE, m_comboStakeStyle);
|
||
DDX_Text(pDX, IDC_EDITSTARTDIS, m_sStartDis);
|
||
DDX_Text(pDX, IDC_EDITLINEDIS, m_sLineDis);
|
||
DDX_Text(pDX, IDC_EDITLINELEN, m_sLineLen);
|
||
DDX_CBIndex(pDX, IDC_COMBOPOSITION, m_nLablePlace);
|
||
DDX_Text(pDX, IDC_EDITSTAKEBETWEEN, m_sStakeBetween);
|
||
DDX_CBString(pDX, IDC_CMBSTAKEPREFIX, m_sStakePrefix);
|
||
DDX_CBString(pDX, IDC_CMBTEXTHEIGHT, m_sTextHeight);
|
||
DDX_CBString(pDX, IDC_CMB_DECIMAL_NUM, m_sDecimalNum);
|
||
DDX_CBIndex(pDX, IDC_CMBTEXTANG, m_nTextAngType);
|
||
//}}AFX_DATA_MAP
|
||
}
|
||
|
||
|
||
BEGIN_MESSAGE_MAP(CStakeDlg, CDialog)
|
||
//{{AFX_MSG_MAP(CStakeDlg)
|
||
ON_WM_CLOSE()
|
||
ON_EN_CHANGE(IDC_EDITSTAKEBETWEEN, OnChangeEditstakebetween)
|
||
ON_EN_CHANGE(IDC_EDITSTARTDIS, OnChangeEditstartdis)
|
||
ON_CBN_EDITCHANGE(IDC_CMBSTAKEPREFIX, OnEditchangeCmbstakeprefix)
|
||
ON_CBN_EDITCHANGE(IDC_COMBOPOSITION, OnEditchangeComboposition)
|
||
ON_WM_DESTROY()
|
||
ON_EN_KILLFOCUS(IDC_EDITSTAKEBETWEEN, OnKillfocusEditstakebetween)
|
||
//}}AFX_MSG_MAP
|
||
ON_MESSAGE(WM_ACAD_KEEPFOCUS, onAcadKeepFocus)
|
||
END_MESSAGE_MAP()
|
||
|
||
|
||
LONG_PTR CStakeDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR)
|
||
{
|
||
CPoint pt;
|
||
GetCursorPos(&pt);
|
||
|
||
CRect rc;
|
||
GetWindowRect(&rc);
|
||
return (rc.PtInRect(pt) ? TRUE : FALSE);
|
||
}
|
||
|
||
BOOL CStakeDlg::OnInitDialog()
|
||
{
|
||
CDialog::OnInitDialog();
|
||
|
||
m_comboStakeStyle.SetCurSel(0);
|
||
if (_tstof(s_sBetweenDis) > 0.01)
|
||
m_sStakeBetween = s_sBetweenDis;
|
||
|
||
TCHAR strTmpPath[100] = _T("");
|
||
GetTempPath(100, strTmpPath);
|
||
_tcscat(strTmpPath, STAKE_FILE);
|
||
GetFileFrom(strTmpPath);
|
||
|
||
UpdateData(FALSE);
|
||
return TRUE;
|
||
}
|
||
|
||
void CStakeDlg::OnClose()
|
||
{
|
||
TCHAR strTmpPath[256] = _T("");
|
||
GetTempPath(255, strTmpPath);
|
||
_tcscat(strTmpPath, STAKE_FILE);
|
||
|
||
SaveFileTo(strTmpPath);
|
||
|
||
CDialog::OnClose();
|
||
acedPostCommand(_T("\33\33"));
|
||
}
|
||
|
||
void CStakeDlg::OnChangeEditstakebetween()
|
||
{
|
||
UpdateData(TRUE);
|
||
s_sBetweenDis = m_sStakeBetween;
|
||
}
|
||
|
||
void CStakeDlg::OnChangeEditstartdis()
|
||
{
|
||
UpdateData(TRUE);
|
||
}
|
||
|
||
void CStakeDlg::OnEditchangeCmbstakeprefix()
|
||
{
|
||
UpdateData(TRUE);
|
||
}
|
||
|
||
void CStakeDlg::OnEditchangeComboposition()
|
||
{
|
||
UpdateData(TRUE);
|
||
}
|
||
|
||
void CStakeDlg::SaveFileTo(LPCTSTR lpFilePath)
|
||
{
|
||
if (lpFilePath == NULL)
|
||
return;
|
||
|
||
FILE *fp = fopen(_AS(lpFilePath), "w");
|
||
if(!fp)
|
||
return;
|
||
|
||
CString csTmp1, csTmp2,csTmp3, csTmp4,csTmp5, csTmp6,csTmp7, csTmp8,csTmp9,csTmp10,csTmp11;
|
||
csTmp1 = m_sStartDis;
|
||
csTmp2.Format(_T("%d"),m_nLablePlace);
|
||
csTmp3 = m_sTextHeight;
|
||
csTmp4.Format(_T("%d"),m_comboStakeStyle.GetCurSel());
|
||
csTmp5 = m_sLineDis;
|
||
csTmp6 = m_sLineLen;
|
||
csTmp7 = m_sStakePrefix;
|
||
csTmp8 = m_sStakeBetween;
|
||
csTmp9 = m_sDecimalNum;
|
||
csTmp10.Format(_T("%d"),m_nTextAngType);
|
||
csTmp11 = csTmp1 + _T("-") + csTmp2 + _T("-") + csTmp3 + _T("-") + csTmp4 + _T("-") + csTmp5 + _T("-") + csTmp6 + _T("-") + csTmp7 + _T("-") + csTmp8 + _T("-") + csTmp9 + _T("-") + csTmp10 + _T("-");
|
||
fputs(_AS(csTmp11), fp);
|
||
|
||
fclose(fp);
|
||
}
|
||
|
||
void CStakeDlg::GetFileFrom(LPCTSTR lpFilePath)
|
||
{
|
||
if (lpFilePath == NULL)
|
||
return;
|
||
|
||
XStringList lstHis;
|
||
FILE *fp=fopen(_AS(lpFilePath), "r");
|
||
if(!fp)
|
||
return;
|
||
|
||
CString csTmp;
|
||
while(!feof(fp))
|
||
{
|
||
char sBuf[256]="";
|
||
fgets(sBuf, 255, fp);
|
||
csTmp = sBuf;
|
||
csTmp.TrimRight();
|
||
if(csTmp != _T(""))
|
||
lstHis.Append(tstrnew(csTmp));
|
||
}
|
||
fclose(fp);
|
||
|
||
|
||
int len = lstHis.Length();
|
||
if(len < 1)
|
||
return;
|
||
|
||
int idx = -1,iCharLen = 0;
|
||
CString sTempName;
|
||
int nCharLen = (int)_tcslen(_T("-"));;
|
||
for(int i=0;i<len;i++)
|
||
{
|
||
csTmp = lstHis[i];
|
||
idx = csTmp.Find(_T("-"));
|
||
sTempName = csTmp.Left(idx);
|
||
m_sStartDis = sTempName;
|
||
|
||
csTmp = csTmp.Mid(idx + nCharLen);
|
||
idx = csTmp.Find(_T("-"));
|
||
m_nLablePlace = _ttoi(csTmp.Left(idx));
|
||
|
||
csTmp = csTmp.Mid(idx + nCharLen);
|
||
idx = csTmp.Find(_T("-"));
|
||
if (idx != -1)
|
||
{
|
||
m_sTextHeight = csTmp.Left(idx);
|
||
}
|
||
|
||
csTmp = csTmp.Mid(idx + nCharLen);
|
||
idx = csTmp.Find(_T("-"));
|
||
if (idx != -1)
|
||
{
|
||
sTempName = csTmp.Left(idx);
|
||
m_comboStakeStyle.SetCurSel(_ttoi(sTempName));
|
||
}
|
||
|
||
csTmp = csTmp.Mid(idx + nCharLen);
|
||
idx = csTmp.Find(_T("-"));
|
||
if (idx != -1)
|
||
{
|
||
m_sLineDis = csTmp.Left(idx);
|
||
}
|
||
|
||
csTmp = csTmp.Mid(idx + nCharLen);
|
||
idx = csTmp.Find(_T("-"));
|
||
if (idx != -1)
|
||
{
|
||
m_sLineLen = csTmp.Left(idx);
|
||
}
|
||
|
||
csTmp = csTmp.Mid(idx + nCharLen);
|
||
idx = csTmp.Find(_T("-"));
|
||
if (idx != -1)
|
||
{
|
||
m_sStakePrefix = csTmp.Left(idx);
|
||
}
|
||
|
||
csTmp = csTmp.Mid(idx + nCharLen);
|
||
idx = csTmp.Find(_T("-"));
|
||
if (idx != -1)
|
||
{
|
||
m_sStakeBetween = csTmp.Left(idx);
|
||
}
|
||
|
||
csTmp = csTmp.Mid(idx + nCharLen);
|
||
idx = csTmp.Find(_T("-"));
|
||
if (idx != -1)
|
||
{
|
||
m_sDecimalNum = csTmp.Left(idx);
|
||
}
|
||
|
||
csTmp = csTmp.Mid(idx + nCharLen);
|
||
idx = csTmp.Find(_T("-"));
|
||
if (idx != -1)
|
||
{
|
||
m_nTextAngType = _ttoi(csTmp.Left(idx));
|
||
}
|
||
}
|
||
}
|
||
|
||
void CStakeDlg::OnDestroy()
|
||
{
|
||
TCHAR strTmpPath[256] = _T("");
|
||
GetTempPath(255, strTmpPath);
|
||
_tcscat(strTmpPath, STAKE_FILE);
|
||
|
||
UpdateData();
|
||
SaveFileTo(strTmpPath);
|
||
|
||
CDialog::OnDestroy();
|
||
}
|
||
|
||
// cet 2010.8.31 add 限制桩间距值的大小
|
||
void CStakeDlg::OnKillfocusEditstakebetween()
|
||
{
|
||
UpdateData(TRUE);
|
||
double dVal = _tstof(m_sStakeBetween);
|
||
if (dVal < 1e-9)
|
||
{
|
||
AfxMessageBox(_T("桩间距应大于0m!"));
|
||
m_sStakeBetween = _T("20");
|
||
UpdateData(FALSE);
|
||
}
|
||
|
||
}
|