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

270 lines
8.6 KiB
C++

#include "stdafx.h"
//#include "arxtools.h"
//#include "DcStream.h"
#include "EdJigEx.h"
#include "tapi.h"
#include "teldef.h"
class TPolyEdJig2 : public TSymbEdJig {
public:
enum TPolyOper {kNone=0, kLinePoint=1, kArcPoint=2, kArcMidPoint=3, kArcRadius=4};
protected:
TPolyOper m_nOperCode;
// I/O
AcDbPolyline *m_pDrawEnt;
public:
TPolyEdJig2(AcDbPolyline *);
virtual int DoIt(int *pKeyIndex=NULL);
DragStatus GetPoint(XPoint &pt);
protected:
virtual Adesk::Boolean update();
virtual AcDbEntity* entity() const;
public:
void SetOperCode(TPolyEdJig2::TPolyOper opCode) {
m_nOperCode=opCode;
}
TPolyOper GetOperCode() {
return m_nOperCode;
}
};
TPolyEdJig2::TPolyEdJig2(AcDbPolyline *pElev)
{
m_pDrawEnt=pElev;
}
AcEdJig::DragStatus
TPolyEdJig2::GetPoint(XPoint &pt)
{
AcGePoint3d ptBase;
m_pDrawEnt->getPointAt(m_pDrawEnt->numVerts()-1, ptBase);
//if(m_nOperCode!=kArcMidPoint m_nOperCode!=kArcRadius)
// return acquirePoint(pt);
return acquirePoint(pt, ptBase);
}
// 开始执行拖动
int TPolyEdJig2::DoIt(int *keyIndex)
{
XPoly2D poly2d;
PolyConvert(*m_pDrawEnt, poly2d);
if(m_nOperCode==kLinePoint || m_nOperCode==kArcPoint) {
m_ptResult=*poly2d.Tail();
} else if(m_nOperCode==kArcMidPoint) { // MidPoint
XCurveSegment cv;
poly2d.Nth(poly2d.TotalSegments()-1, cv);
m_ptResult=cv.MidPoint();
}
int nRet = TSymbEdJig::DoIt(keyIndex);
return nRet;
}
// 更新实体数据
double g_dWireRadius(0);
Adesk::Boolean TPolyEdJig2::update()
{
Adesk::Boolean bRet=Adesk::kTrue;
XPoly2D poly2d;
PolyConvert(*m_pDrawEnt, poly2d);
if(m_nOperCode==kLinePoint || m_nOperCode==kArcPoint) {
//*poly2d.Tail()=m_ptResult;
} else if(m_nOperCode==kArcMidPoint) {
XDirectionCurve cv;
poly2d.Nth(poly2d.TotalSegments()-1, cv);
XCurveSegment seg;
seg = XArc(cv.StartPoint(), m_ptResult, cv.EndPoint());
if(!!seg) {
if(seg.StartPoint().Distance(cv.StartPoint())>_distSnap)
seg.SetBulge(-seg.GetBulge());// 2011-8-9 bsl TELEC8.2之后反向绘制弧线变成直线:seg.SetBulge(seg.GetBulge()-seg.GetBulge());
// *poly2d.bulges[poly2d.Length()-2]=seg.GetBulge();
poly2d.SetBulge(poly2d.Length()-2, seg.GetBulge());
}
} else if(m_nOperCode==kArcRadius) {
XPoint ptBase, ptPrev;
int numVert=m_pDrawEnt->numVerts();
m_pDrawEnt->getPointAt(numVert-1, (AcGePoint3d &)ptBase);
m_pDrawEnt->getPointAt(numVert-2, (AcGePoint3d &)ptPrev);
double nChordLen=ptBase.Distance2d(ptPrev);
// double nRadius=ptBase.Distance2d(m_ptResult); //axc alter 2013-12-31
// if(nChordLen<2.0*nRadius+1.0E-6) {
if(nChordLen<2.0*g_dWireRadius+1.0E-6) {
//double bulge=2.0*asin(nChordLen/2.0/nRadius);
double bulge=2.0*asin(nChordLen/2.0/g_dWireRadius);
if(XLine(ptPrev, ptBase).OnWhichSide(m_ptResult)==OFFSET_LEFT)
bulge = -bulge;
//*poly2d.bulges[poly2d.Length()-2]=bulge;
poly2d.SetBulge(poly2d.Length()-2, bulge);
}
}
PolyConvert(poly2d, *m_pDrawEnt);
return bRet;
}
AcDbEntity* TPolyEdJig2::entity() const
{
return (AcDbEntity *)m_pDrawEnt;
}
int DragInputPoly2d(XPoint ptStart, XPoly2D &poly2dRet)
{
AcDbPolyline pline;
pline.addVertexAt(0, ptStart);
TPolyEdJig2 jig(&pline);
jig.SetPrompt(_T("\n直段下一点 [弧段(A)/回退(U)} <结束>: "));
jig.SetOperCode(TPolyEdJig2::kLinePoint);
jig.SetKeyword(_T("A U"));
while(1) {
int nKeyIndex=0;
int nRetCode=jig.DoIt(&nKeyIndex);
if(nRetCode==RTNORM) {
pline.addVertexAt(pline.numVerts(), (AcGePoint2d &)jig.GetPickPoint());
if(jig.GetOperCode()==TPolyEdJig2::kArcPoint) {
TPolyEdJig2 jig1(&pline);
jig1.SetOperCode(TPolyEdJig2::kArcMidPoint);
jig1.SetPrompt(_T("\n点取弧上一点 [输入半径(R)]:"));
jig1.SetKeyword(_T("R"));
int nKeyIdx;
int nRetCode1=jig1.DoIt(&nKeyIdx);
if(nRetCode1==RTKWORD) {
TPolyEdJig2 jig2(&pline);
jig2.SetOperCode(TPolyEdJig2::kArcRadius);
//jig2.SetPrompt(_T("\n输入半径(光标位置确定弧的方向):"));
//axc add 2013-12-31解決弧形导线输入半径无法设置问题
CString sPrompt;
AcGePoint2d ptS,ptE;
pline.getPointAt(pline.numVerts()-2,ptS);
pline.getPointAt(pline.numVerts()-1,ptE);
double dLen = fabs(ptS.distanceTo(ptE));
sPrompt.Format(_T("\n输入半径<%.2f>:"),dLen/2);
do
{
int ret2 = ads_getdist(NULL, sPrompt, &g_dWireRadius);
if (RTNORM != ret2)
return -1;
if (dLen > 2*g_dWireRadius)
ads_prompt(_T("\n输入的半径小于弧形两点距离的一半无法构成导线!\n"));
else
break;
} while (TRUE);
//end
jig2.DoIt();
}
} else { //直段
jig.SetPrompt(_T("\n直段下一点 [弧段(A)/回退(U)] <结束>: "));
jig.SetOperCode(TPolyEdJig2::kLinePoint);
jig.SetKeyword(_T("A U"));
}
} else if(nRetCode==RTKWORD) {
if(jig.GetOperCode()==TPolyEdJig2::kLinePoint) {
if(nKeyIndex==0) {
jig.SetOperCode(TPolyEdJig2::kArcPoint);
jig.SetPrompt(_T("\n弧段下一点 [直段(L)/回退(U)] <结束>: "));
jig.SetKeyword(_T("L U"));
} else if(nKeyIndex==1) {
int numVert=pline.numVerts();
if(numVert>1) {
pline.removeVertexAt(numVert-1);
pline.setBulgeAt(numVert-2, 0.0);
}
}
} else if(jig.GetOperCode()==TPolyEdJig2::kArcPoint) {
if(nKeyIndex==0) {
jig.SetOperCode(TPolyEdJig2::kLinePoint);
jig.SetPrompt(_T("\n直段下一点 [弧段(A)/回退(U)] <结束>: "));
jig.SetKeyword(_T("A U"));
} else if(nKeyIndex==1) {
int numVert=pline.numVerts();
if(numVert>1) {
pline.removeVertexAt(numVert-1);
pline.setBulgeAt(numVert-2, 0.0);
}
}
}
} else if(nRetCode==RTNONE) {
break;
} else if(nRetCode==RTCAN) {
return RTERROR;
}
}
int numVert=pline.numVerts();
if(numVert<2)
return RTERROR;
PolyConvert(pline, poly2dRet);
return RTNORM;
}
// 输入多段线
int GetOpenPoly2D(const TCHAR *pMsg, XPoly2D &poly2d)
{
XString szPrompt;
if(pMsg)
szPrompt << pMsg;
else szPrompt << _T("\n曲线起点");
szPrompt << _T("或 [点取图中曲线(P)/点取参考点(R)]<退出>:");
XPoint ptStart;
int nCode;
INITGET_BEG(0, _T("P R"));
nCode=ads_getpoint(NULL, szPrompt, ptStart);
INITGET_END();
if(nCode==RTKWORD) {
XString sKeyword;
VERIFY(ads_getinput(sKeyword)==RTNORM);
if(sKeyword[0]==_T('R')) {
XPoint ptRef;
if(ads_getpoint(NULL, _T("\n输入参考点<退出>:"), ptRef)!=RTNORM)
return RTERROR;
if(ads_getpoint(ptRef, _T("\n曲线起点<退出>:"), ptStart)!=RTNORM)
return RTERROR;
ptStart=Ucs2Wcs(ptStart);
nCode=DragInputPoly2d(ptStart, poly2d);
} else {
RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE,LINE,ARC"), NULL);
Entity ent;
LAB_RESELECT:
if((nCode=ent.FilterSelect(_T("\n选择一曲线(LINE/ARC/PLINE):"), mask))!=RTNORM)
return RTERROR;
if(ent.Is(_T("LINE")) || ent.Is(_T("ARC"))) {
XCurveSegment cv(ent);
poly2d.Reset();
cv.AsPoly2D(poly2d);
} else {
XPoly2D poly(ent);
if(!!poly) {
poly2d=poly;
} else {
adsout << _T("\n无效的选择!");
goto LAB_RESELECT;
}
}
}
} else if(nCode==RTNORM) {
ptStart=Ucs2Wcs(ptStart);
nCode=DragInputPoly2d(ptStart, poly2d);
} else { //
return nCode;
}
return nCode;
}
void TestPolyInput()
{
XPoly2D poly2d;
if(GetOpenPoly2D(NULL, poly2d)==RTNORM) {
XScreenDc dc(1);
dc << poly2d;
}
}