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

568 lines
14 KiB
C++

/********************************************************************
created: 2004/12/28
created: 28:12:2004 17:00
filename: f:\tg_dev\telecdev\twtkernal\jig.cpp
file path: f:\tg_dev\telecdev\twtkernal
file base: jig
file ext: cpp
author: 沈睿
purpose: 多管绘制
*********************************************************************/
#include "stdafx.h"
#include "jig.h"
extern XPoint GetNearPtByLst(XPoint pt, XPointList &lstPtIn);
TMultPipePreview::TMultPipePreview(XPointList &lstPt, double nAng, BOOL bFromVPipe)
{
m_lstOld = lstPt;
m_nAng = nAng;
m_bFromVPipe = bFromVPipe;
}
TMultPipePreview::~TMultPipePreview()
{
}
Adesk::Boolean TMultPipePreview::subWorldDraw(AcGiWorldDraw *pWd)
{
int len = m_lstOld.Length();
m_lstEnd.Reset();
m_lstStart.Reset();
// XPoint ptMid = GetNearPtByLst(m_ptEnd, m_lstOld); cet 2011.5.18 modify
XPoint ptMid = *m_lstOld[0];
ptMid.z = 0;
double nAngleStart = m_nAng;
XPoint ptTmpEnd, ptTmpStart;
double dAng = ads_angle(ptMid, m_ptEnd);
if(m_nAng < 0)
nAngleStart = dAng;
for(int i=0;i<len;i++){
XPoint ptTurn = *m_lstOld[i];
ptTurn.z = 0;
double nAngTmp = dAng;
double n = ads_distance(ptTurn, ptMid); //2管线距离
if(m_bFromVPipe){
XPoint ptTemp, ptTemp2;
ads_polar(ptMid, dAng, 100, ptTemp);
XLine line2(ptMid, ptTemp);
ptTurn.Project(&line2, ptTemp2);
nAngTmp = ads_angle(ptTemp2, ptTurn);
n = ads_distance(ptTemp2, ptTurn);
}
double nAn = ads_angle(ptMid, ptTurn);
if(fabs(nAn - PI*2) < 0.001 || nAn > PI*2)
nAn -= PI*2;
if(nAngleStart < PI/2 || nAngleStart > (PI/2*3 + 0.1) || fabs(nAngleStart - PI/2) < 0.001){
if(!m_bFromVPipe){
if(fabs(nAn) < 0.001)
nAngTmp -= PI/2;
else if(fabs(nAn - PI) < 0.001)
nAngTmp += PI/2;
else if(nAn < PI)
nAngTmp += PI/2;
else
nAngTmp -= PI/2;
}
}
else{
if(!m_bFromVPipe){
if(fabs(nAn) < 0.001)
nAngTmp += PI/2;
else if(fabs(nAn - PI) < 0.001)
nAngTmp -= PI/2;
else if(nAn < PI)
nAngTmp -= PI/2;
else
nAngTmp += PI/2;
}
}
if(nAngTmp > PI*2)
nAngTmp -= PI*2;
ads_polar(m_ptEnd, nAngTmp, n, ptTmpEnd);
ads_polar(ptMid, nAngTmp, n, ptTmpStart);
if(m_bFromVPipe){
ptTmpStart = ptTurn;
ads_polar(m_ptEnd, nAngTmp, n, ptTmpEnd);
}
m_lstEnd.NewAppend(ptTmpEnd);
m_lstStart.NewAppend(ptTmpStart);
AcDbLine line(ptTmpStart, ptTmpEnd);
line.worldDraw(pWd);
}
return Adesk::kTrue;
}
TMultPipeJig::TMultPipeJig(XPointList &lstPt, double nAng, BOOL bFromVPipe)
{
m_pDrawEnt = new TMultPipePreview(lstPt, nAng, bFromVPipe);
m_ptStart = *lstPt[0];
}
TMultPipeJig::~TMultPipeJig()
{
if(m_pDrawEnt)
delete m_pDrawEnt;
}
AcEdJig::DragStatus
TMultPipeJig::GetPoint(XPoint &pt)
{
return acquirePoint(pt, m_ptStart.AsAcGePoint3d());
}
int TMultPipeJig::DoIt(int *keyIndex)
{
int nRet = TSymbEdJig::DoIt(keyIndex);
return nRet;
}
// 更新实体数据
Adesk::Boolean TMultPipeJig::update()
{
Adesk::Boolean bRet=Adesk::kTrue;
// m_ptStart = GetNearPtByLst(m_ptResult, m_pDrawEnt->m_lstOld); cet 2011.5.18 modify
m_ptStart = *m_pDrawEnt->m_lstOld[0];
m_pDrawEnt->m_ptEnd = m_ptResult;
return bRet;
}
AcDbEntity* TMultPipeJig::entity() const
{
return (AcDbEntity *)m_pDrawEnt;
}
//***************************************************************************************************
// 绘制双管
//***************************************************************************************************
TDoublePipeJig::TDoublePipeJig(XPoint pt1, BOOL bIsVPipe, double nWidth)
{
m_ptStart = pt1;
m_ptEnd = pt1;
m_nWidth = nWidth;
m_bIsVPipe = bIsVPipe;
m_pDrawEnt = new TDbDoubleLinePipe;
m_pDrawEnt->SetStartPoint(m_ptStart);
m_pDrawEnt->SetEndPoint(m_ptEnd);
m_pDrawEnt->SetWidth(nWidth);
m_pDrawEnt->SetDnDiameter(nWidth);
}
TDoublePipeJig::~TDoublePipeJig()
{
if(m_pDrawEnt)
delete m_pDrawEnt;
}
AcEdJig::DragStatus
TDoublePipeJig::GetPoint(XPoint &pt)
{
if(m_bIsVPipe)
return acquirePoint(pt);
return acquirePoint(pt, m_ptStart.AsAcGePoint3d());
}
int TDoublePipeJig::DoIt(int *keyIndex)
{
int nRet = TSymbEdJig::DoIt(keyIndex);
return nRet;
}
// 更新实体数据
Adesk::Boolean TDoublePipeJig::update()
{
Adesk::Boolean bRet=Adesk::kTrue;
m_pDrawEnt->SetWidth(m_nWidth);
if(m_bIsVPipe){
XPoint ptEnd = m_ptResult;
m_pDrawEnt->SetStartPoint(m_ptResult);
ptEnd.z += 3000;
m_pDrawEnt->SetEndPoint(ptEnd);
}
else
m_pDrawEnt->SetEndPoint(m_ptResult);
m_pDrawEnt->SetDnDiameter(m_nWidth);
return bRet;
}
AcDbEntity* TDoublePipeJig::entity() const
{
return (AcDbEntity *)m_pDrawEnt;
}
void TDimensionEdJig::FindAndRemoveSeg(XPoint pt)
{
XCurveSegment seg=m_pDrawEnt->GetDimCurve();
XPoint ptOnSeg;
seg.ProjectToMe(pt, ptOnSeg);
double value=seg.StartPoint().Distance2d(ptOnSeg);
long i=-1;
if(value>_distSnap)
{
double curValue=0;
for(i=0;i<m_pDrawEnt->GetSegmentNum();i++)
{
curValue+=m_pDrawEnt->GetSegment(i);
if(fabs(curValue-value)<_distSnap)
break;
}
}
if(i>=m_pDrawEnt->GetSegmentNum())
return;//useful
if(i>=0)
{
double temp=m_pDrawEnt->GetSegment(i);
if(i<(m_pDrawEnt->GetSegmentNum()-1))//是中间段
m_pDrawEnt->SetSegment(i+1,temp+m_pDrawEnt->GetSegment(i+1));//后一段合并之
m_pDrawEnt->RemoveSegment(i);
}
else//第一个标注段的起点(不一定是DimContinue中提示的第一点)特殊处理
{
double temp=m_pDrawEnt->GetSegment(0);
m_pDrawEnt->RemoveSegment(0);
XVector3D vt=seg.EndPoint()-seg.StartPoint();
vt.Scale(temp/vt.Length());
m_pDrawEnt->SetLocation(m_pDrawEnt->GetLocation()+vt);
}
}
//void TDimensionEdJig::Step()
//{
// ptStack.Push(m_ptDim);
//}
//bool TDimensionEdJig::CanUndo()
//{
// return ptStack.GetDepth()>1;
//}
//void TDimensionEdJig::Undo()
//{
// XPoint pt;
// ptStack.GetTopData(pt);
// ptStack.GoBack();
// if(CanUndo())
// m_pDrawEnt->FindAndRemoveSegment(pt);
//}
//XPoint TDimensionEdJig::GetLastPoint()
//{
// XPoint pt;
// ptStack.GetTopData(pt);
// return pt;
//end
void TDimensionEdJig::Swap()
{
if(m_pTemp) {
AcDbDeepCloneFiler filer;
if(m_pTemp->dwgOut(&filer)==Acad::eOk) {
filer.seek(0L,0);
VERIFY(m_pDrawEnt->dwgIn(&filer)==Acad::eOk);
}
ASSERT(m_pTemp && m_pTemp->IsValid());
} else {
m_pTemp = (TDbDimension2 *)m_pDrawEnt->clone();
ASSERT(m_pTemp && m_pTemp->IsValid());
}
}
// 转换成ADS代码
int TDimensionEdJig::GetRetCode(int *kwordId) const
{
int ret = m_nRetCode;
if (ret == AcEdJig::kCancel)
ret = RTCAN;
else if(ret == AcEdJig::kNull)
ret = RTNONE;
else if (ret <= 0)
ret = RTNORM;
else {
if(kwordId) *kwordId = ret;
ret = RTKWORD;
}
return ret;
}
TDimensionEdJig::TDimensionEdJig(TDbDimension2 *pDim, const TCHAR *pszPrompt, const TCHAR *pszKeyword)
:m_pDrawEnt(pDim), m_pszPrompt(pszPrompt), m_pszKeyword(pszKeyword), m_nRetCode(0)
{
m_pTemp=NULL;
m_nFlag=0;
m_ptDim=pDim->GetLocation();
}
TDimensionEdJig::~TDimensionEdJig()
{
if(m_pTemp)
delete m_pTemp;
}
// 开始执行拖动
int TDimensionEdJig::doIt()
{
setDispPrompt(m_pszPrompt);
try {
m_nRetCode = drag();
} catch(...) {
m_nRetCode=AcEdJig::kCancel;
}
return GetRetCode();
}
// 反馈
AcEdJig::DragStatus TDimensionEdJig::sampler()
{
DragStatus stat;
setUserInputControls((UserInputControls)
(AcEdJig::kAccept3dCoordinates|AcEdJig::kNullResponseAccepted));
if (m_pszKeyword) setKeywordList(m_pszKeyword);
XPoint ptTemp;
if(m_nFlag==0) stat=acquirePoint(ptTemp, m_pDrawEnt->GetLocation().AsAcGePoint3d());
else if(m_nFlag==1 || m_nFlag==2) stat = acquirePoint(ptTemp);
// else if(m_nFlag==3) {//modidfied by whl on 03/08/08
// XPoint ptLast=GetLastPoint();
// stat=acquirePoint(ptTemp, ptLast);
// } else if(m_nFlag==4) {
// XPoint ptLast;
// xg_getvar("LASTPOINT", ptLast);
// ptLast = Ucs2Wcs(ptLast);
// stat=acquirePoint(ptTemp, ptLast);
// }
if(stat == AcEdJig::kNormal) {
if (ptTemp.Distance2d(m_ptDim)>_distSnap) {
double nDist=m_ptDim.Distance2d(ptTemp);
m_ptDim=ptTemp;
} else
return AcEdJig::kNoChange;
}
return stat;
}
// 更新实体数据
Adesk::Boolean TDimensionEdJig::update()
{
if(m_nFlag==0) {
m_pDrawEnt->SetRotation(ads_angle(m_ptDim, m_pDrawEnt->GetLocation())+PI);
double nVal=m_ptDim.Distance2d(m_pDrawEnt->GetLocation());
if(m_pDrawEnt->IsValidSegment(nVal))
m_pDrawEnt->SetSegment(0, nVal);
} else if(m_nFlag==1) {
XCurveSegment seg=m_pDrawEnt->GetDimCurve();
XPoint ptOnSeg;
if(seg.ProjectToMe(m_ptDim, ptOnSeg)==RTNORM) {
double nDistMove=m_ptDim.Distance2d(ptOnSeg);
int nSideLoc=seg.OnWhichSide(m_pDrawEnt->GetLocation());
int nSide=seg.OnWhichSide(m_ptDim);
double nDist2Dim=m_pDrawEnt->GetDist2DimLine(FALSE);
if(fabs(nDist2Dim)>1.0E-6) {
double nFactor=nDist2Dim/fabs(nDist2Dim);
if(nSide!=nSideLoc)
nDistMove *= nFactor;
else
nDistMove *= -nFactor;
} else {
if(nSideLoc=OFFSET_LEFT) nDistMove=-nDistMove;
//else nDist2Dim=nDistMove;
}
if(m_pDrawEnt->IsAngular()) { //弧墙有错,不知道原因
nDist2Dim += nDistMove;
double nDistRad= m_pDrawEnt->GetDimRadius();
//seg.GetArc().center.Distance(m_ptDim);
nDistRad -= nDistMove;
if(nDistRad>_distSnap) {
m_pDrawEnt->SetDimRadius(nDistRad);
m_pDrawEnt->SetDist2DimLine(nDist2Dim, FALSE);
}
} else {
nDist2Dim += nDistMove;
m_pDrawEnt->SetDist2DimLine(nDist2Dim, FALSE);
}
}
} else if(m_nFlag==2) { //修改标注位置
AcDbIntArray indices;
indices.append(3);
AcGePoint3dArray ptArray;
m_pDrawEnt->getStretchPoints(ptArray);
ASSERT(ptArray.length()>3);
AcGeVector3d vtOffset=m_ptDim.AsAcGePoint3d()-ptArray[3];
m_pDrawEnt->moveGripPointsAt(indices, vtOffset);
}
// else if(m_nFlag==3) {//modified by whl on 03/08/08
// ASSERT(m_pTemp);
// CopyObject(*m_pDrawEnt, *m_pTemp);
// if(CanUndo()){
// if(!m_pTemp->AddSegment(m_ptDim))
// return Adesk::kFalse;
// }else{
// m_pTemp->SetRotation(ads_angle(m_ptDim, m_pTemp->GetLocation())+PI);
// double nVal=m_ptDim.Distance2d(m_pTemp->GetLocation());
// if(m_pTemp->IsValidSegment(nVal))
// m_pTemp->SetSegment(0, nVal);
// }
// ASSERT(m_pTemp && m_pTemp->IsValid());
// } else if(m_nFlag==4) {
// ASSERT(m_pTemp);
// CopyObject(*m_pDrawEnt, *m_pTemp);
// m_pTemp->AddSegment(m_ptDim);
// }
ASSERT(m_pDrawEnt && m_pDrawEnt->IsValid());
return Adesk::kTrue;
}
AcDbEntity* TDimensionEdJig::entity() const
{
if((m_nFlag==3 || m_nFlag==4) && m_pTemp)
return m_pTemp;
else
return m_pDrawEnt;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
TLeaderEdJig::TLeaderEdJig(TDbSymbMultiLeader *pElev)
{
m_nOperCode=TLeaderEdJig::kNone;
m_pDrawEnt=pElev;
}
XPoint TLeaderEdJig::GetDragPoint() const
{
XPoint ptDrag=m_ptResult;
if(m_nOperCode==TLeaderEdJig::kLeader)
ptDrag=m_pDrawEnt->GetLeaderPoint();
else if(m_nOperCode==TLeaderEdJig::kTextLine)
ptDrag=m_pDrawEnt->GetTextBasePoint();
return ptDrag;
}
XPoint TLeaderEdJig::GetBasePoint() const
{
XPoint ptDrag=m_ptResult;
if(m_nOperCode==TLeaderEdJig::kLeader) {
XPointList pts;
m_pDrawEnt->GetLeaderVertexes(pts);
if(pts.Length())
ptDrag=*pts[0];
} else {
ptDrag=m_pDrawEnt->GetLeaderPoint();
}
return ptDrag;
}
// 开始执行拖动
int TLeaderEdJig::DoIt(int *keyIndex)
{
m_ptResult=GetDragPoint();
XPushVar<int> osmode(_T("OSMODE"), 0);//add by whl
return TSymbEdJig::DoIt(keyIndex);
}
// 反馈
AcEdJig::DragStatus
TLeaderEdJig::GetPoint(XPoint &pt)
{
DragStatus stat;
if(m_nOperCode==kTextLine)
stat=acquirePoint(pt);
else
stat = acquirePoint(pt, GetBasePoint().AsAcGePoint3d());
return stat;
}
// 更新实体数据
Adesk::Boolean TLeaderEdJig::update()
{
Adesk::Boolean bRet=Adesk::kTrue;
if(m_nOperCode==TLeaderEdJig::kLeader) {
XVector3D vtOffset=m_ptResult-GetBasePoint();
vtOffset.Rotate(-Ucs2Wcs(0.0));// zxl 2013.07.23 add
m_pDrawEnt->SetLeaderPoint(m_ptResult);
if(vtOffset.x<0.0)
m_pDrawEnt->SetTextBaseLen(-fabs(m_pDrawEnt->GetTextBaseLen()));
else
m_pDrawEnt->SetTextBaseLen(fabs(m_pDrawEnt->GetTextBaseLen()));
} else if(m_nOperCode==TLeaderEdJig::kVertex) {
} else if(m_nOperCode==TLeaderEdJig::kTextLine) {
XPoint ptLeader=m_pDrawEnt->GetLeaderPoint();
m_pDrawEnt->SetTextBaseLen(m_ptResult.x - ptLeader.x, FALSE);
}
return bRet;
}
AcDbEntity* TLeaderEdJig::entity() const
{
return (AcDbEntity *)m_pDrawEnt;
}
TDrawingIdxEdJig::TDrawingIdxEdJig(TDbSymbDrawingIndex *pIdx)
{
m_pDrawEnt = pIdx;
}
AcEdJig::DragStatus
TDrawingIdxEdJig::GetPoint(XPoint &pt)
{
if(!m_ptRef)
return acquirePoint(pt);
else
return acquirePoint(pt, m_ptRef);
}
// 开始执行拖动
int TDrawingIdxEdJig::DoIt(int *keyIndex)
{
int nRet = TSymbEdJig::DoIt(keyIndex);
return nRet;
}
// 更新实体数据
Adesk::Boolean TDrawingIdxEdJig::update()
{
Adesk::Boolean bRet=Adesk::kTrue;
m_pDrawEnt->SetCenter(m_ptResult);
return bRet;
}
AcDbEntity* TDrawingIdxEdJig::entity() const
{
return (AcDbEntity *)m_pDrawEnt;
}