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

481 lines
12 KiB
C++

#include"stdafx.h"
#include"stdarx.h"
#include"distdrag.h"
void dist_pl_addpoint(AcDbObjectId PlineId,AcGePoint3d pt,double dBulge=0.0,double dStartWidth=0.0,double dEndWidth=0.0)
{
AcDbPolyline *pLine=NULL;
if(acdbOpenObject(pLine,PlineId,AcDb::kForWrite)==Acad::eOk)
{
pLine->setWidthsAt(pLine->numVerts()-1,dStartWidth,dEndWidth);
pLine->addVertexAt(pLine->numVerts(),AcGePoint2d(pt.x,pt.y),0.0,dEndWidth,dEndWidth);
pLine->close();
pLine=NULL;
}
}
BOOL dist_pl_dellastpt(AcDbObjectId PlineId,AcGePoint3d &ptLast,AcGeVector3d &vt,BOOL &bArc)
{
AcDbPolyline *pLine=NULL;
BOOL bRet=FALSE;
double dBulge=0.0;
bArc=FALSE;
if(acdbOpenObject(pLine,PlineId,AcDb::kForWrite)==Acad::eOk)
{
if(pLine->numVerts()>=2)
{
pLine->removeVertexAt(pLine->numVerts()-1);
pLine->getPointAt(pLine->numVerts()-1,ptLast);
pLine->getFirstDeriv(ptLast,vt);
pLine->getBulgeAt(pLine->numVerts()-2,dBulge);
if(fabs(dBulge)<0.001)
bArc=FALSE;
else
bArc=TRUE;
bRet=TRUE;
}
pLine->close();
pLine=NULL;
}
return bRet;
}
void dist_pl_close(AcDbObjectId PlineId)
{
AcDbPolyline *pLine=NULL;
if(acdbOpenObject(pLine,PlineId,AcDb::kForWrite)==Acad::eOk)
{
pLine->setClosed(Adesk::kTrue);
pLine->close();
pLine=NULL;
}
}
AsdkCadPolylineJig::AsdkCadPolylineJig()
{
m_pLine=NULL;
}
AsdkCadPolylineJig::~AsdkCadPolylineJig()
{
if(m_pLine)
{
// acutPrintf(_T("delete"));
delete m_pLine;
m_pLine=NULL;
}
}
double AsdkCadPolylineJig::m_dStartWidth=0.0;
double AsdkCadPolylineJig::m_dEndWidth=0.0;
void AsdkCadPolylineJig::AddPoint(AcGePoint3d ptAdd)
{
m_pLine->setPointAt(m_pLine->numVerts()-1,AcGePoint2d(ptAdd.x,ptAdd.y));
m_pLine->getFirstDeriv(ptAdd,m_vt);
if(m_objId==NULL)
{
AcDbPolyline *pLine=(AcDbPolyline*)m_pLine->clone();
BaseFuncs::AddEntToDb(pLine,m_objId);
}
else
{
dist_pl_addpoint(m_objId,ptAdd,0.0,m_dStartWidth,m_dEndWidth);
//m_pLine->setPointAt(m_pLine->numVerts()-1,AcGePoint2d(m_ptEnd.x,m_ptEnd.y));
}
AcDbPolyline *pLine=NULL;
if(acdbOpenObject(pLine,m_objId,AcDb::kForWrite)==Acad::eOk)
{
pLine->setBulgeAt(pLine->numVerts()-2,m_dBulge);
// pLine->getFirstDeriv(m_ptEnd,m_vt);
pLine->close();
pLine=NULL;
}
m_ptStart=ptAdd;
m_pLine->setPointAt(0,AcGePoint2d(ptAdd.x,ptAdd.y));
m_pLine->setPointAt(1,AcGePoint2d(ptAdd.x,ptAdd.y));
// m_pLine->addVertexAt(m_pLine->numVerts(),AcGePoint2d(m_ptEnd.x,m_ptEnd.y),m_dStartWidth,m_dEndWidth);
m_dStartWidth=m_dEndWidth;
}
static BOOL m_bSnap=FALSE;
void AsdkCadPolylineJig::doIt()
{
m_bMidPt=FALSE;
m_dBulge=0.0;
if(acedGetPoint(NULL,_T("\n指定起点:"),asDblArray(m_ptStart))!=RTNORM)
return;
m_pLine=new AcDbPolyline;
m_pLine->addVertexAt(0,AcGePoint2d(m_ptStart.x,m_ptStart.y),0,m_dStartWidth,m_dEndWidth);
m_pLine->addVertexAt(1,AcGePoint2d(m_ptStart.x,m_ptStart.y),0,m_dStartWidth,m_dEndWidth);
m_bArc=FALSE;
while(1)
{
if(!m_bArc)
{
if(m_objId==NULL)
setDispPrompt(_T("\n指定下一个点或 [圆弧(A)/半宽(H)/长度(L)/放弃(U)/宽度(W)/正交(O)]:"));
else
setDispPrompt(_T("\n指定下一个点或 [圆弧(A)/闭合(C)/半宽(H)/长度(L)/放弃(U)/宽度(W)/正交(O)]:"));
}
else
setDispPrompt(_T("\n[角度(A)/圆心(CE)/闭合(CL)/方向(D)/半宽(H)/直线(L)/半径(R)/第二个点(S)/放弃(U)/宽度(W)]:"));
AcEdJig::DragStatus stat=drag();
if(!m_bArc)
{
if(stat==AcEdJig::kNormal) //插入
{
// acutPrintf("\nvvvvv");
AddPoint(m_ptEnd);
}
else if(stat==AcEdJig::kKW1) //圆弧
{
m_bArc=TRUE;
AcDbPolyline *pLine=NULL;
AcGePoint3d ptEnd;
if(acdbOpenObject(pLine,m_objId,AcDb::kForRead)==Acad::eOk)
{
pLine->getEndPoint(ptEnd);
// pLine->getFirstDeriv(ptEnd,m_vt);
pLine->close();
pLine=NULL;
}
continue;
}
else if(stat==AcEdJig::kKW2) //半宽
{
CString strFormat;
m_dStartWidth/=2.0;
m_dEndWidth/=2.0;
strFormat.Format(_T("\n输入起点半宽<%0.4f>:"),m_dStartWidth);
acedGetReal(strFormat,&m_dStartWidth);
strFormat.Format(_T("\n输入终点半宽<%0.4f>:"),m_dEndWidth);
acedGetReal(strFormat,&m_dEndWidth);
m_dStartWidth*=2.0;
m_dEndWidth*=2.0;
}
else if(stat==AcEdJig::kKW3) //L 长度
{
double dDist=0.0;
AcDbPolyline *pLine=NULL;
AcGePoint3d ptEnd;
if(acdbOpenObject(pLine,m_objId,AcDb::kForRead)==Acad::eOk)
{
pLine->getEndPoint(ptEnd);
pLine->close();
pLine=NULL;
}
if(acedGetDist(asDblArray(ptEnd),_T("\n指定长度:"),&dDist)!=RTNORM)
continue;
AcGeVector3d vt=m_vt;
vt=vt.normal();
AcGePoint3d ptAdd=ptEnd+vt*dDist;
AddPoint(ptAdd);
// dist_pl_dellastpt(m_objId,m_ptStart);
// m_pLine->setPointAt(0,AcGePoint2d(m_ptStart.x,m_ptStart.y));
}
else if(stat==AcEdJig::kKW4) //回退
{
dist_pl_dellastpt(m_objId,m_ptStart,m_vt,m_bArc);
m_pLine->setPointAt(0,AcGePoint2d(m_ptStart.x,m_ptStart.y));
}
else if(stat==AcEdJig::kKW5) //宽度
{
CString strFormat;
strFormat.Format(_T("\n输入起点线宽<%0.4f>:"),m_dStartWidth);
acedGetReal(strFormat,&m_dStartWidth);
strFormat.Format(_T("\n输入终点线宽<%0.4f>:"),m_dEndWidth);
acedGetReal(strFormat,&m_dEndWidth);
}
else if(stat==AcEdJig::kKW6) //正交
{
m_bSnap=!m_bSnap;
if(m_bSnap)
acutPrintf(_T("\n<正交 开>"));
else
acutPrintf(_T("\n<正交 关>"));
}
else if(stat==AcEdJig::kKW7) //闭合
{
ClosePolyline();
return;
}
else if(stat==AcEdJig::kCancel)
{
BaseFuncs::DeleteEnt(m_objId);
m_objId=NULL;
return;
}
else
{
return;
}
}
else
{
if(stat==AcEdJig::kNormal) //插入
{
m_bMidPt=FALSE;
AddPoint(m_ptEnd);
}
else if(stat==AcEdJig::kKW3) //闭合
{
//dist_pl_close(m_objId);
ClosePolyline();
return;
}
else if(stat==AcEdJig::kKW4) //方向
{
AcGePoint3d ptDir;
if(acedGetPoint(asDblArray(m_ptStart),_T("\n指定方向:"),asDblArray(ptDir))==RTNORM)
{
m_vt=ptDir-m_ptStart;
}
// return;
}
else if(stat==AcEdJig::kKW5) //半宽
{
CString strFormat;
m_dStartWidth/=2.0;
m_dEndWidth/=2.0;
strFormat.Format(_T("\n输入起点半宽<%0.4f>:"),m_dStartWidth);
acedGetReal(strFormat,&m_dStartWidth);
strFormat.Format(_T("\n输入终点半宽<%0.4f>:"),m_dEndWidth);
acedGetReal(strFormat,&m_dEndWidth);
m_dStartWidth*=2.0;
m_dEndWidth*=2.0;
}
else if(stat==AcEdJig::kKW6) //直线
{
m_pLine->setBulgeAt(0,0);
m_bArc=FALSE;
m_dBulge=0.0;
}
else if(stat==AcEdJig::kKW8) //中间点圆弧
{
m_bMidPt=TRUE;
if(acedGetPoint(NULL,_T("\n指定圆弧上的第二个点:"),asDblArray(m_ptMid))!=RTNORM)
{
m_bMidPt=FALSE;
continue;
}
}
else if(stat==AcEdJig::kKW9) //放弃
{
dist_pl_dellastpt(m_objId,m_ptStart,m_vt,m_bArc);
m_pLine->setPointAt(0,AcGePoint2d(m_ptStart.x,m_ptStart.y));
}
else if(stat==AcEdJig::kKW9+1) //宽度
{
CString strFormat;
strFormat.Format(_T("\n输入起点线宽<%0.4f>:"),m_dStartWidth);
acedGetReal(strFormat,&m_dStartWidth);
strFormat.Format(_T("\n输入终点线宽<%0.4f>:"),m_dEndWidth);
acedGetReal(strFormat,&m_dEndWidth);
}
else if(stat==AcEdJig::kCancel)
{
BaseFuncs::DeleteEnt(m_objId);
m_objId=NULL;
return;
}
else
{
return;
}
}
}
}
void AsdkCadPolylineJig::ClosePolyline()
{
AcDbPolyline *pLine=NULL;
if(acdbOpenObject(pLine,m_objId,AcDb::kForWrite)==Acad::eOk)
{
if(m_bArc)
{
pLine->getPointAt(0,m_ptStart);
pLine->getPointAt(pLine->numVerts()-1,m_ptEnd);
pLine->getFirstDeriv(m_ptEnd,m_vt);
GetArcBulge(m_ptEnd,m_ptStart,m_dBulge);
pLine->setBulgeAt(pLine->numVerts()-1,m_dBulge);
}
pLine->setWidthsAt(pLine->numVerts()-1,m_dStartWidth,m_dEndWidth);
pLine->setClosed(Adesk::kTrue);
pLine->close();
pLine=NULL;
}
}
AcDbEntity* AsdkCadPolylineJig::entity() const
{
return m_pLine;
}
BOOL GetPointofVector(AcDbObjectId PlineId,AcGePoint3d ptAt,AcGePoint3d &ptVT,AcGePoint3d &ptVF)
{
int nNumvert=3;
AcGePoint3d ptLast;
AcGeVector3d vt;
AcGeVector3d vF;
AcDbPolyline *pLine=NULL;
if(acdbOpenObject(pLine,PlineId,AcDb::kForRead)!=Acad::eOk)
return FALSE;
if((nNumvert=pLine->numVerts())<2)
{
ptVT=ptVF=ptAt;
pLine->close();
pLine=NULL;
return FALSE;
}
pLine->getPointAt(nNumvert-1,ptLast);
Acad::ErrorStatus es=pLine->getFirstDeriv(ptLast,vt);
pLine->close();
pLine=NULL;
vF=vt;
vF=vF.rotateBy(PI/2.0,AcGeVector3d::kZAxis);
if(!BaseFuncs::GetJd(ptLast,ptLast+vt,vF,ptAt,ptVF))
{
return FALSE;
}
if(!BaseFuncs::GetJd(ptLast,ptLast+vF,vt,ptAt,ptVT))
{
return FALSE;
}
return TRUE;
}
AcEdJig::DragStatus
AsdkCadPolylineJig::sampler()
{
// set the special cursor type. If no cursor type is
// specified then acquireXXX method selects one for you.
//
if(!m_bArc)
{
if(m_objId==NULL)
setKeywordList(_T("A H L U W O")); //设置关键字
else
setKeywordList(_T("A H L U W O C")); //设置关键字
}
else
setKeywordList(_T("A CE CL D H L R S U W")); //设置关键字
setSpecialCursorType(AcEdJig::kCrosshair);
// kNullResponseAccepted
setUserInputControls((UserInputControls)
( AcEdJig::kNullResponseAccepted|AcEdJig::kAccept3dCoordinates ));
/* setUserInputControls((UserInputControls)(AcEdJig::kAccept3dCoordinates
|AcEdJig::kNoNegativeResponseAccepted
|AcEdJig::kNoZeroResponseAccepted
|AcEdJig::kAcceptOtherInputString)); */
AcGePoint3d center;
DragStatus stat = acquirePoint(center,m_ptStart); //m_ptStart
if(stat==AcEdJig::kNormal&&m_ptEnd.distanceTo(center)<0.02)
return AcEdJig::kNoChange;
if(m_bSnap&&!m_bArc)
{
AcGePoint3d ptVT;
AcGePoint3d ptVF;
if(GetPointofVector(m_objId,center,ptVT,ptVF))
{
if(ptVT.distanceTo(m_ptStart)>ptVF.distanceTo(m_ptStart))
m_ptEnd=ptVT;
else
m_ptEnd=ptVF;
}
else
m_ptEnd=center;
}
else
m_ptEnd=center;
return stat ;
}
void AsdkCadPolylineJig::GetArcBulge(AcGePoint3d ptStart,AcGePoint3d ptEnd,double &dBulge)
{
dBulge=0.0;
double dAngle=AcGeVector2d(m_vt.x,m_vt.y).angle();
AcGeVector3d vF=m_vt;
vF=vF.rotateBy(PI/2.0,AcGeVector3d::kZAxis);
vF=vF.normal();
AcGePoint3d ptCenter=ptStart+(ptEnd-ptStart)/2.0;
AcGeVector3d vt1=ptEnd-ptStart;
AcGeVector3d vF1=vt1;
vF1=vF1.rotateBy(PI/2.0,AcGeVector3d::kZAxis);
double dAngle1=AcGeVector2d(vt1.x,vt1.y).angle();
double dDeltaAngle=fabs(dAngle-dAngle1);
if(fabs(dDeltaAngle)<0.001||fabs(dDeltaAngle-PI)<0.001)
m_pLine->setPointAt(1,AcGePoint2d(ptEnd.x,ptEnd.y));
else
{
//全圆心
AcDbLine *pLine1=new AcDbLine(ptStart,ptStart+vF);
AcDbLine *pLine2=new AcDbLine(ptCenter,ptCenter+vF1);
AcGePoint3dArray ptJds;
pLine1->intersectWith(pLine2,AcDb::kExtendBoth,ptJds);
delete pLine1;
delete pLine2;
if(ptJds.logicalLength()==1)
{
double dRadius=ptStart.distanceTo(ptJds[0]);
AcGeVector3d vt=ptCenter-ptJds[0];
vt=vt.normal();
AcGePoint3d ptNext=ptJds[0]+vt*dRadius;
BaseFuncs::GetBulge(ptStart,ptNext,ptEnd,dBulge);
dAngle=m_vt.angleTo(vt1,AcGeVector3d::kZAxis);
// acutPrintf(_T("\n%0.2f,%0.2f dbulge=%0.2f"),ptJds[0].x,ptJds[0].y,m_dBulge);
if(dAngle<PI)
{
if(dBulge<0.0)
{
ptNext=ptJds[0]-vt*dRadius;
BaseFuncs::GetBulge(ptStart,ptNext,ptEnd,dBulge);
}
}
else
{
if(dBulge>0.0)
{
ptNext=ptJds[0]-vt*dRadius;
BaseFuncs::GetBulge(ptStart,ptNext,ptEnd,dBulge);
}
}
}
}
}
Adesk::Boolean
AsdkCadPolylineJig::update()
{
m_dBulge=0.0;
if(!m_bArc)
{
m_pLine->setPointAt(1,AcGePoint2d(m_ptEnd.x,m_ptEnd.y));
m_pLine->setBulgeAt(0,0);
}
else
{
if(!m_bMidPt)
GetArcBulge(m_ptStart,m_ptEnd,m_dBulge);
else
BaseFuncs::GetBulge(m_ptStart,m_ptMid,m_ptEnd,m_dBulge);
m_pLine->setPointAt(1,AcGePoint2d(m_ptEnd.x,m_ptEnd.y));
m_pLine->setBulgeAt(0,m_dBulge);
}
m_pLine->setWidthsAt(0,m_dStartWidth,m_dEndWidth);
m_pLine->setWidthsAt(1,m_dEndWidth,m_dEndWidth);
return Adesk::kTrue;
}