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

1038 lines
24 KiB
C++

#include "StdAfx.h"
#include "aecPipeJig.h"
#include "AecDbEwPipe.h"
#include "AecPipeline.h"
#include "AECStatusRecord.h"
#include "AecAngleWatch.h"
#include "ReducerDlg.h"
#include "ChangElDlg.h"
#include "TJXGDlg.h"
#include "RadioDlg.h"
#include "KTCADSysVar.h"
#include "DJGXDlg.h"
#include "coretools.h"
TDbPipeJig::TDbPipeJig()
{
m_pPipeLine = new TDbPipeLine(this);
m_tStartIntf.vtDir = AcGeVector3d::kIdentity;
m_tStartIntf.ptPos = AcGePoint3d::kOrigin;
m_vtStaDir.set(0.0,0.0,0.0);
InitStatusRecs();
m_nUndoGoupid = 0;
m_sSystem = _T("");
}
TDbPipeJig::~TDbPipeJig(void)
{
if (m_pPipeLine != NULL)
DELETE_PTR(m_pPipeLine);
acutPrintf(_T("\n"));
if (HasWipeClip())
{
acedPostCommand(_T("regen "));
}
}
void TDbPipeJig::SetAdoDb(CUIISQLiteServer* pDb)
{
m_pDb = pDb;
}
CUIISQLiteServer* TDbPipeJig::GetAdoDb()
{
return m_pDb;
}
void TDbPipeJig::SetInitDataMapPartFrom(AecDbObjXDataMap* pXDataMap)
{
if (m_pPipeLine != NULL)
{
m_pPipeLine->SetInitDataMapPartFrom(pXDataMap);
}
}
bool TDbPipeJig::HasWipeClip()
{
if (m_pPipeLine != NULL)
{
m_pPipeLine->HasWipeClip();
}
return false;
}
void TDbPipeJig::SetAngleWath(AcGePoint3d& ptCen,const AcGePoint3d& ptGeTo,const AcGeVector3d& vtDir)
{
((TDbPipeLine *)m_pPipeLine)->SetAngleWath(ptCen,ptGeTo,vtDir);
}
void TDbPipeJig::CalReferencePoint()
{
AcGePoint3d ptWcs;
ads_point ptBase,pt22,pt33;
acedInitGet(RSG_NONULL,_T("R"));
int nRes = acedGetPoint(NULL,_T("\n指定起点或[参考点(R)]<退出>:"),ptBase);
switch(nRes)
{
case RTNORM:
{
acdbUcs2Wcs(ptBase,pt22,false);
ptWcs = asPnt3d(pt22);
ptWcs.z = ((TDbPipeLine*)m_pPipeLine)->GetEndElevation();
m_pCurStaRec->SetAcquirePoint(ptWcs);
//压入本次状态,起点
m_pCurStaRec->SetAcquirePoint(ptWcs);
AECStatusRecord * pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
pRec->SetUndoGroupId(0);
PushBackStatusRec(pRec);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos());
m_pCurStaRec->SetAcquirePoint(ptWcs);
break;
}
case RTKWORD:
{
TCHAR szKey[2];
szKey[0] = '0';
acedGetInput(szKey);
switch(szKey[0])
{
case _T('R'):
case _T('r'):
{
//参考点<退出>:
nRes = acedGetPoint(NULL,_T("\n参考点<退出>:"),ptBase);
if (nRes == RTNORM)
{
//起点<退出>:
nRes = acedGetPoint(ptBase,_T("\n指定起点<退出>:"),pt22);
if (nRes == RTNORM)
{
acdbUcs2Wcs(pt22,pt33,false);
ptWcs = asPnt3d(pt33);
ptWcs.z = ((TDbPipeLine*)m_pPipeLine)->GetEndElevation();
m_pCurStaRec->SetAcquirePoint(ptWcs);
//压入本次状态,起点
m_pCurStaRec->SetAcquirePoint(ptWcs);
AECStatusRecord * pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
pRec->SetUndoGroupId(0);
PushBackStatusRec(pRec);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos());
m_pCurStaRec->SetAcquirePoint(ptWcs);
}
}
break;
}
default:
break;
}
}
default:
{
break;
}
}
}
void TDbPipeJig::SetReferencePoint(const AcGePoint3d& ptRef)
{
AcGePoint3d ptWcs = ptRef;
ptWcs.z = ((TDbPipeLine*)m_pPipeLine)->GetEndElevation();
m_pCurStaRec->SetAcquirePoint(ptWcs);
//压入本次状态,起点
m_pCurStaRec->SetAcquirePoint(ptWcs);
AECStatusRecord * pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
pRec->SetUndoGroupId(0);
PushBackStatusRec(pRec);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos());
m_pCurStaRec->SetAcquirePoint(ptWcs);
}
BOOL TDbPipeJig::DoIt(WPipe::EApp app, const AcGePoint3d& ptRef,BOOL bParamDlg/* = TRUE*/)
{
CAcModuleResourceOverride myResources;
if (bParamDlg)
{
CDJGXDlg drawCnfgDLg;
drawCnfgDLg.SetDbServer(m_pDb);
drawCnfgDLg.EnableLoadLast(TRUE);
drawCnfgDLg.setApp(app);
int nRes = drawCnfgDLg.DoModal();
if (nRes != IDOK)
{
return FALSE;
}
WPipe::PipeParam param;
memset(&param,0,sizeof(WPipe::PipeParam));
param.m_app = app;
drawCnfgDLg.GetPipeParam(&param);
((TDbPipeLine*)m_pPipeLine)->SetPipeParam(&param);
}
SetReferencePoint(ptRef);
return DoDrag();
}
BOOL TDbPipeJig::DoIt(WPipe::EApp app, BOOL bParamDlg,BOOL bCalRefPoint)
{
CAcModuleResourceOverride myResources;
if (bParamDlg)
{
CDJGXDlg drawCnfgDLg;
drawCnfgDLg.SetDbServer(m_pDb);
drawCnfgDLg.EnableLoadLast(TRUE);
drawCnfgDLg.setApp(app);
int nRes = drawCnfgDLg.DoModal();
if (nRes != IDOK)
{
return FALSE;
}
WPipe::PipeParam param;
memset(&param,0,sizeof(WPipe::PipeParam));
param.m_app = app;
drawCnfgDLg.GetPipeParam(&param);
((TDbPipeLine*)m_pPipeLine)->SetPipeParam(&param);
}
//参考
if (bCalRefPoint)
{
CalReferencePoint();
}
return DoDrag();
}
BOOL TDbPipeJig::DoDrag()
{
AcEdJig::DragStatus eStat;
int nPlanPos = 0;
while(TRUE)
{
CString sPrompt = m_pCurStaRec->Prompt();
SetDispPromptWithEleTip(sPrompt);
setDispPrompt(sPrompt);
if (((TDbPipeLine*)m_pPipeLine)->PipeFinished())
{
break;
}
eStat = drag();
nPlanPos = m_pCurStaRec->GetPlanPosition();
switch(eStat)
{
case AcEdJig::kNormal:
{
if (nPlanPos == 1) //Create Pipe
{
AfterDrag();
}
break;
}
case AcEdJig::kCancel:
case AcEdJig::kNull:// 退出
{
acutPrintf(_T("\n"));
return FALSE;
}
case AcEdJig::kKW1://R 变径
{
//至少创建了一个管段
if (((TDbPipeLine*)m_pPipeLine)->GetLastInterface() == NULL)
{
acutPrintf(_T("\n之前没有创建管段,无法变径!"));
continue;
}
AcGeVector3d vtDir;
AecInterface* pIntf = ((TDbPipeLine*)m_pPipeLine)->GetLastInterface();
if (pIntf == NULL)
vtDir = AcGeVector3d::kXAxis;
else
vtDir = pIntf->vtDir;
CReducerDlg redDLg;
WPipe::PipeParam param;
memset(&param,0,sizeof(WPipe::PipeParam));
memcpy(&param,((TDbPipeLine*)m_pPipeLine)->GetPipeParam(),sizeof(WPipe::PipeParam));
param.m_vtECCen.set(0.0,0.0,0.0);
if (CoreTools::IsMetersUnit())
{
param.m_dD *= 1000;
param.m_dDN *= 1000;
param.m_dOD *= 1000;
}
redDLg.Set(m_pDb,&param,vtDir);
int nRes = redDLg.DoModal();
if (nRes == IDOK)
{
if (CoreTools::IsMetersUnit())
{
param.m_dD *= 0.001;
param.m_dDN *= 0.001;
param.m_dOD *= 0.001;
param.m_dInterfaceL3 *= 0.001;
}
//设置回退记录
SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("BE"),RTNONE);
SetUndoGroupBegin();
if ( ( (TDbPipeLine *)m_pPipeLine)->AddReducer(m_pCurStaRec,&param) )
{
AECStatusRecord* pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
PushBackStatusRec(pRec);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
}
SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("E"),RTNONE);
SetUndoGroupEnd();
}
break;
}
case AcEdJig::kKW2://E 标高
{
CChangElDlg chelDlg;
//至少创建了一个管段
AecInterface* pLastInf = ((TDbPipeLine*)m_pPipeLine)->GetLastInterface();
if (pLastInf == NULL)
{
//可以改为仅仅改标高对话框,当没有状态记录时
//acutPrintf(_T("\n之前没有创建管段,无法变标高!"));
//当前位置选择到实体的话,更新标高
double dEl = ((TDbPipeLine*)m_pPipeLine)->GetPipeParam()->m_dEl;
AECStatusRecord* pRec = GetTailStatusRec();
dEl = PickWPipehereEl(pRec->GetAcquirePoint());
((TDbPipeLine*)m_pPipeLine)->GetPipeParam()->m_dEl = dEl;
//弹出标高对话框,创建立管,如果选择位置有三通,则三通连接
chelDlg.SetCurParam(m_pDb,((TDbPipeLine*)m_pPipeLine)->GetPipeParam());
int nRes = chelDlg.DoModal();
if (nRes == IDOK)
{
//设置回退记录
SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("BE"),RTNONE);
SetUndoGroupBegin();
//原位置 的改标高
m_pCurStaRec->SetAcquirePoint(pRec->GetAcquirePoint());
if ( ( (TDbPipeLine *)m_pPipeLine)->ChangeEl2(m_pCurStaRec,pRec,chelDlg.m_dNewEl,
chelDlg.m_bCheckRec,chelDlg.m_dRedElPos,&chelDlg.m_pipeParamRec ) )
{
AECStatusRecord* pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
PushBackStatusRec(pRec);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
}
SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("E"),RTNONE);
SetUndoGroupEnd();
}
continue;
}
/*else
{
if ( pLastInf->vtDir.isParallelTo(AcGeVector3d::kZAxis) )
{
acutPrintf(_T("\n上段已经是立管,本次添加立管失败!"));
continue;
}
}*/
//标高的变化
chelDlg.SetCurParam(m_pDb,((TDbPipeLine*)m_pPipeLine)->GetPipeParam());
if (pLastInf != NULL)
{
if ( pLastInf->vtDir.isParallelTo(AcGeVector3d::kZAxis) )
{
chelDlg.m_dCurEl = pLastInf->ptPos.z;
}
}
int nRes = chelDlg.DoModal();
if (nRes == IDOK)
{
//设置回退记录
SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("BE"),RTNONE);
SetUndoGroupBegin();
if ( ( (TDbPipeLine *)m_pPipeLine)->ChangeEl(m_pCurStaRec,chelDlg.m_dNewEl,chelDlg.m_bCheckRec,chelDlg.m_dRedElPos,&chelDlg.m_pipeParamRec ) )
{
AECStatusRecord* pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
PushBackStatusRec(pRec);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
}
SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("E"),RTNONE);
SetUndoGroupEnd();
}
break;
}
case AcEdJig::kKW3://U 回退 X 斜管
{
//至少创建了一个管段
AECStatusRecord* pLast = GetTailStatusRec();
if ( pLast == NULL)
{
acutPrintf(_T("\n之前没有拾取位置点!请先拾取第一点!"));
continue;
}
//添加斜管
CTJXGDlg dlg;
dlg.m_dLastEl = ((TDbPipeLine*)m_pPipeLine)->GetPipeParam()->m_dEl;
int nRes = dlg.DoModal();
if (nRes == IDOK)
{
if ( fabs(dlg.m_dNewEl - dlg.m_dLastEl) < 1.e-6 && dlg.m_bElType == 0)//同标高
{
continue;
}
//设置回退记录
SHacedCommand(RTSTR, _T("_undo"), RTSTR, _T("BE"), RTNONE);
SetUndoGroupBegin();
AcGePoint3d ptLast = pLast->GetAcquirePoint();
//选择下一点
ads_point pt,pt2,pt3;
acdbWcs2Ucs(asDblArray(ptLast),pt,false);
nRes = acedGetPoint(pt,_T("\n指定下一点(或直接输入管线真实长度):"),pt2);
if (nRes == RTNORM)
{
AcGePoint3d ptThis;
acdbUcs2Wcs(pt2,pt3,false);
ptThis = asPnt3d(pt3);
// 如果userstring不为空,说明用户输入的是管线长度
// 重新计算pt2
TCHAR userstring[511] = {};
acedGetInput(userstring);
CString sInput(userstring);
if (!sInput.IsEmpty())
{
AcGePoint2d ptX1(ptLast.x,ptLast.y);
AcGePoint2d ptX2(ptThis.x,ptThis.y);
double dL(ptX1.distanceTo(ptX2));
double dAngle(.0);
if (dlg.m_bElType) // 坡度
dAngle = atan(dlg.m_dPD * .01);
else
dAngle = asin(abs(dlg.m_dLastEl - dlg.m_dNewEl) / dL);
AcGeVector3d vt(ptThis - ptLast);
vt.normalize();
ptThis = ptLast + vt * (dL * cos(dAngle));
}
if (dlg.m_bElType)//坡度
{
AcGePoint2d ptX1(ptLast.x,ptLast.y);
AcGePoint2d ptX2(ptThis.x,ptThis.y);
double dLX = ptX1.distanceTo(ptX2);
dlg.m_dNewEl = ptLast.z + dlg.m_dPD * dLX * 0.01;//新的标高增量
}
ptThis.z = dlg.m_dNewEl;
if (((TDbPipeLine *)m_pPipeLine)->ChangeEl3(m_pCurStaRec,ptThis))
{
AECStatusRecord* pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
pRec->SetAcquirePoint(ptThis);
PushBackStatusRec(pRec);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
}
}
SHacedCommand(RTSTR, _T("_undo"), RTSTR, _T("E"), RTNONE);
SetUndoGroupEnd();
}
break;
}
case AcEdJig::kKW4://O 曲率
{
//弹出界面修改当前曲率半径
CRadioDlg rDlg;
rDlg.SetDbServer(m_pDb);
rDlg.SetShowParam(m_pPipeLine->GetPipeParam());
rDlg.DoModal();
break;
}
case AcEdJig::kKW5://U 回退
{
if (m_lstStaPtrsBack.GetCount() > 1)
{
SHacedCommand(RTSTR,_T("u"),RTNONE);
PopUpStatusRec();
}
else
{
continue;
}
break;
}
case AcEdJig::kKW6://表盘精度
{
double nSp = 10;
TCHAR szPrompt[65];
_stprintf(szPrompt, _T("\n请输入角度表盘刻度精度(0-30]度:<%.1f>"), ((TDbPipeLine *)m_pPipeLine)->GetAngWatchSp());
int nRes = acedGetReal(szPrompt,&nSp);
if (nRes == RTNORM)
{
if (nSp > 0 && nSp < 31)
{
((TDbPipeLine *)m_pPipeLine)->SetAngWatchSp(nSp);
}
}
break;
}
default:
break;
}
//获取下个状态,plane判断是?
if (m_pCurStaRec->GetPlanPosition() == 0 )
{
AECStatusRecord * pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
pRec->SetUndoGroupId(0);
PushBackStatusRec(pRec);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos());
}
}
return TRUE;
}
BOOL TDbPipeJig::AfterDrag()
{
//设置回退记录
SHacedCommand(RTSTR, _T("_undo"), RTSTR, _T("BE"), RTNONE);
SetUndoGroupBegin();
if (((TDbPipeLine *)m_pPipeLine)->AddPipeNode(m_pCurStaRec, WPipe::eToCreate))
{
AECStatusRecord *pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
PushBackStatusRec(pRec);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
if (m_pCurStaRec->IsCommand2Stop())
{
return TRUE;
}
}
else
{
((TDbPipeLine *)m_pPipeLine)->PipeFinished();
return FALSE;
}
m_vtStaDir.set(0, 0, 0);//reset
SHacedCommand(RTSTR, _T("_undo"), RTSTR, _T("E"), RTNONE);
SetUndoGroupEnd();
return TRUE;
}
BOOL TDbPipeJig::DoItOnPath(WPipe::EApp app, const AcGePoint3dArray &arPts, WPipe::PipeParam* pParam)
{
WPipe::PipeParam param;
memset(&param, 0, sizeof(WPipe::PipeParam));
if (pParam == NULL)
{
CAcModuleResourceOverride myResources;
CDJGXDlg drawCnfgDLg;
drawCnfgDLg.SetDbServer(m_pDb);
drawCnfgDLg.EnableLoadLast(TRUE);
drawCnfgDLg.setApp(app);
int nRes = drawCnfgDLg.DoModal();
if (nRes != IDOK)
{
return FALSE;
}
param.m_app = app;
drawCnfgDLg.GetPipeParam(&param);
}
else
{
memcpy(&param, pParam, sizeof(WPipe::PipeParam));
}
((TDbPipeLine *)m_pPipeLine)->SetPipeParam(&param);
//关闭提示
KTCADSysVar<int> var1(_T("CMDECHO"), 0);
int nPlanPos = 0;
AcGePoint3d ptGe;
for (int i = 0; i < arPts.length(); i++)
{
ptGe = arPts.at(i);
m_pCurStaRec->SetAcquirePoint(ptGe);
nPlanPos = m_pCurStaRec->GetPlanPosition();
if (nPlanPos == 1) //Create Pipe
{
AfterDrag();
}
//获取下个状态,plane判断是?
if (m_pCurStaRec->GetPlanPosition() == 0)
{
AECStatusRecord *pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
pRec->SetUndoGroupId(0);
PushBackStatusRec(pRec);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos());
}
}
return TRUE;
}
static double FormatZero(double dVal)
{
if ( fabs(dVal) < 1.e-6 )
return 0.0;
int nVal = (int)(dVal * 1000.0);
return nVal / 1000.0;
}
BOOL TDbPipeJig::DoIt(AecInterface* pIntf,WPipe::PipeParam* pParam)
{
if (pIntf == NULL) return FALSE;
if (pParam == NULL) //用户确定壁厚和外径 etc.
{
CAcModuleResourceOverride myResources;
CDJGXDlg drawCnfgDLg;
drawCnfgDLg.SetDbServer(m_pDb);
double dSize(pIntf->dSize1),dSize1(pIntf->dSize2);
//pIntf->GetSize(dSize,dSize1);
drawCnfgDLg.SetOnlyByDN( (int)dSize );
drawCnfgDLg.SetEleReadOnly(TRUE,FormatZero(pIntf->ptPos.z));//圆整
drawCnfgDLg.m_sCurrSys = m_sSystem;
drawCnfgDLg.m_nConnectType = pIntf->nConnectType;
int nRes = drawCnfgDLg.DoModal();
if (nRes == IDOK)
{
WPipe::PipeParam param;
memset(&param,0,sizeof(WPipe::PipeParam));
drawCnfgDLg.GetPipeParam(&param);
param.m_dEl = pIntf->ptPos.z;//标高确定不变
//param.m_app = pParam->m_app;
param.m_app = WPipe::eButtweld;
((TDbPipeLine*)m_pPipeLine)->SetPipeParam(&param);
}
else
{
return FALSE;
}
}
else
{
//
((TDbPipeLine*)m_pPipeLine)->SetPipeParam(pParam);
}
//压入本次接口
if ( /*pParam != NULL &&*/ pIntf->idOwner.isValid())
{
((TDbPipeLine*)m_pPipeLine)->PushInterface(*pIntf,TRUE);
}
//压入本次状态,起点
m_pCurStaRec->SetAcquirePoint(pIntf->ptPos);
AECStatusRecord * pRec = new AECStatusRecord;
pRec->CopyFrom(m_pCurStaRec);
pRec->SetUndoGroupId(0);
PushBackStatusRec(pRec);
//((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
((TDbPipeLine *)m_pPipeLine)->SetAngleWath(pIntf->ptPos,pRec->GetAcquirePoint(),pIntf->vtDir);
m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos());
//开始JIG
WPipe::EApp app(WPipe::eButtweld);
if (pParam)
app = pParam->m_app;
return DoIt(app, FALSE,FALSE);
}
BOOL TDbPipeJig::DoItSpec(WPipe::EApp app, BOOL bParamDlg,BOOL bCalRefPoint)
{
CAcModuleResourceOverride myResources;
if (bParamDlg)
{
CDJGXDlg drawCnfgDLg;
drawCnfgDLg.SetDbServer(m_pDb);
drawCnfgDLg.EnableLoadLast(TRUE);
drawCnfgDLg.setApp(app);
int nRes = drawCnfgDLg.DoModal();
if (nRes != IDOK)
{
return FALSE;
}
WPipe::PipeParam param;
memset(&param,0,sizeof(WPipe::PipeParam));
param.m_app = app;
drawCnfgDLg.GetPipeParam(&param);
((TDbPipeLine*)m_pPipeLine)->SetPipeParam(&param);
}
//参考
if (bCalRefPoint)
{
CalReferencePoint();
}
return DoDrag();
}
BOOL TDbPipeJig::DoItNotPipe(WPipe::EApp app, BOOL bParamDlg)
{
return FALSE;
}
AcEdJig::DragStatus TDbPipeJig::sampler()
{
setUserInputControls( ( UserInputControls)
( AcEdJig::kAccept3dCoordinates |
AcEdJig::kNullResponseAccepted ) );
CString sKeywordsList;
sKeywordsList = m_pCurStaRec->KeywordList();
if (!sKeywordsList.IsEmpty())
{
setKeywordList(sKeywordsList);
}
AcEdJig::DragStatus eStat;
AcGePoint3d ptGe,ptGeBase,ptGe2,ptBk;
ptGeBase = AcGePoint3d::kOrigin;
AECStatusRecord::EAcquire eAcquire = m_pCurStaRec->GetStatusType();
switch(eAcquire)
{
case AECStatusRecord::kPoint:
{
m_pPipeLine->SwitchAutoSnapOrF8();
//开始状态
int nPos = m_pCurStaRec->GetPlanPosition();
if (nPos == 0)
{
eStat = acquirePoint(ptGe);
//动态获取的点的标高始终和上次一致
ptGe.z = ((TDbPipeLine*)m_pPipeLine)->GetEndElevation();
}
else
{
//管线的末端点
GetLastStatusAquire(ptGeBase);
eStat = acquirePoint(ptGe,ptGeBase);
ptGe.z = ((TDbPipeLine*)m_pPipeLine)->GetEndElevation();
double dDist = ptGeBase.distanceTo(ptGe);
if (!m_vtStaDir.isZeroLength())
{
m_vtStaDir.normalize();
ptGe = ptGeBase + dDist * m_vtStaDir;
}
}
if (eStat == AcEdJig::kNormal)
{
if (m_pCurStaRec->IsValSeted())
{
ptGe2 = m_pCurStaRec->GetAcquirePoint();
double dDis = ptGe2.distanceTo(ptGe);
if (dDis < 1.e-6)
{
//鼠标原地不动
return AcEdJig::kNoChange;
}
}
ptGe2 = m_pCurStaRec->GetAcquirePoint();
m_pCurStaRec->SetAcquirePoint(ptGe);
((TDbPipeLine *)m_pPipeLine)->AngWatchTo(ptGe);
ptBk = ptGe;
if (m_pCurStaRec->GetPlanPosition() > 0 && m_lstStaPtrsBack.GetCount() > 0)
{
((TDbPipeLine *)m_pPipeLine)->AddPipeNode(m_pCurStaRec,WPipe::eToPreView);
//if (AecAngleWatch::m_bFallInSnap )
//{
ptGe = m_pCurStaRec->GetAcquirePoint();
if (ptGe.distanceTo(ptGe2) < 1.e-6)
{
return AcEdJig::kNoChange;
}
//}
m_pCurStaRec->SetAcquirePoint(ptBk);
return AcEdJig::kNormal;
}
}
break;
}
default:
break;
}
return eStat;
}
AcDbEntity* TDbPipeJig::entity() const
{
return m_pPipeLine;
}
Adesk::Boolean TDbPipeJig::update()
{
return Adesk::kTrue;
}
void TDbPipeJig::InitStatusRecs()
{
//1.起端为管子的状态
AECStatusRecord* pRec1 = NULL;
pRec1 = new AECStatusRecord;
m_arStaPtrs.Add(pRec1);
pRec1->SetPrompt(_T("\n指定起点<退出>:"));
pRec1->SetStatusType(AECStatusRecord::kPoint);
pRec1->SetPlanPosition(0);
AECStatusRecord* pRec2 = NULL;
pRec2 = new AECStatusRecord;
m_arStaPtrs.Add(pRec2);
pRec2->SetPrompt(_T("\n指定下一点或 [变径(R)/立管(E)/斜管(X)/曲率(O)/回退(U)/表盘(B)<退出>:"));
pRec2->SetStatusType(AECStatusRecord::kPoint);
pRec2->SetKeywordList(_T("R E X O U B"));
pRec1->SetNextStatus(pRec2);
pRec2->SetPlanPosition(1);
pRec2->SetNextStatus(pRec2,1);
m_pCurStaRec = pRec1;
}
void TDbPipeJig::FreeStatusRecs()
{
AECStatusRecord* pRecord = NULL;
int nSize = m_arStaPtrs.GetSize();
for(int i = 0;i < nSize;i++)
{
pRecord = (AECStatusRecord*)m_arStaPtrs.GetAt(i);
if (pRecord != NULL) DELETE_PTR(pRecord);
}
m_arStaPtrs.RemoveAll();
for(POSITION ps = m_lstStaPtrsBack.GetHeadPosition();ps != NULL;)
{
pRecord = (AECStatusRecord*)m_lstStaPtrsBack.GetNext(ps);
if (pRecord != NULL) DELETE_PTR(pRecord);
}
m_lstStaPtrsBack.RemoveAll();
}
BOOL TDbPipeJig::GetLastStatusAquire(AcGePoint3d& ptGe)
{
int nSize = m_lstStaPtrsBack.GetCount();
if (nSize > 0)
{
AECStatusRecord* pRec = (AECStatusRecord*)m_lstStaPtrsBack.GetTail();
if (pRec != NULL)
ptGe = pRec->GetAcquirePoint();
return TRUE;
}
return FALSE;
}
AECStatusRecord* TDbPipeJig::GetTailStatusRec()
{
int nSize = m_lstStaPtrsBack.GetCount();
if (nSize > 0)
{
return (AECStatusRecord*)m_lstStaPtrsBack.GetTail();
}
return NULL;
}
void TDbPipeJig::PushBackStatusRec(AECStatusRecord* pRec)
{
pRec->SetUndoGroupId(m_nUndoGoupid);
m_lstStaPtrsBack.AddTail(pRec);
}
void TDbPipeJig::SetUndoGroupBegin()
{
m_nUndoGoupid += 1;
}
void TDbPipeJig::SetUndoGroupEnd()
{
((TDbPipeLine *)m_pPipeLine)->PushPipeParam();
}
int TDbPipeJig::GetUndoGroupID()
{
return m_nUndoGoupid;
}
void TDbPipeJig::PopUpStatusRec()
{
//按 id 回退一次,调整当前状态
if (m_lstStaPtrsBack.GetCount() > 0)
{
AECStatusRecord* pLast = (AECStatusRecord*)m_lstStaPtrsBack.GetTail();
int nID = pLast->GetUndoGroupId();
while(m_lstStaPtrsBack.GetCount() > 0)
{
m_lstStaPtrsBack.RemoveTail();
DELETE_PTR(pLast);
pLast = NULL;
if (m_lstStaPtrsBack.GetCount() == 0)
{
break;
}
pLast = (AECStatusRecord*)m_lstStaPtrsBack.GetTail();
if (nID != pLast->GetUndoGroupId())
{
break;
}
}
//pipeline 回退一次,调整接口记录
((TDbPipeLine *)m_pPipeLine)->PopUpInterface(nID);
((TDbPipeLine *)m_pPipeLine)->MoveAngWatchPosition();
}
}
void TDbPipeJig::SetDispPromptWithEleTip(CString& sPrompt)
{
CString sEl;
if (m_pCurStaRec != NULL)
{
sEl.Format(_T("(当前标高:%g)"),m_pCurStaRec->GetAcquirePoint().z);
int nIndex = sPrompt.ReverseFind(_T(':'));
if (nIndex != -1)
{
sPrompt.Insert(nIndex,sEl);
}
}
}
double TDbPipeJig::PickWPipehereEl(const AcGePoint3d& ptGe)
{
double dEl = ptGe.z;
ads_point pt[5];
double dSize = CoreTools::PixelToWcs(5);//5
AcGePoint3d ptGeX[5];
ptGeX[0] = ptGe;
ptGeX[0] -= dSize * AcGeVector3d::kYAxis;
ptGeX[0] -= dSize * AcGeVector3d::kXAxis;
ptGeX[1] = ptGeX[0] + 2 * dSize * AcGeVector3d::kYAxis;
ptGeX[2] = ptGeX[1] + 2 * dSize * AcGeVector3d::kXAxis;
ptGeX[3] = ptGeX[0] + 2 * dSize * AcGeVector3d::kXAxis;
ptGeX[4] = ptGeX[0];
for (int i = 0;i < 5;i++)
{
acdbWcs2Ucs(asDblArray(ptGeX[i]),pt[i],false);
}
TCHAR szBuf[64];
memset(szBuf,0,sizeof(szBuf));
_tcscpy(szBuf, _T("AEC_EWPIPE"));
struct resbuf rb;
rb.restype = 0;
rb.resval.rstring = szBuf;
rb.rbnext = NULL;
struct resbuf* pointlist;
pointlist = acutBuildList(RTPOINT, pt[0], RTPOINT, pt[1],
RTPOINT, pt[2], RTPOINT, pt[3], 0);
ads_name ss,ent;
acedSSGet(_T("CP"),pointlist,NULL,&rb,ss);
acutRelRb(pointlist);
Adesk::Int32 lLen = 0;
acedSSLength(ss,&lLen);
AcDbObjectId id;
AcGePoint3d ptOn;
if (lLen > 0)
{
acedSSName(ss,0,ent);
acdbGetObjectId(id,ent);
AcDbEntity* pEnt = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead) )
{
AecDbEwPipe* pWPipe = AecDbEwPipe::cast(pEnt);
if (pWPipe != NULL)
{
dEl = pWPipe->EndPoint().z;
}
pEnt->close();
}
}
acedSSFree(ss);
return dEl;
}