Files
envi-code/SourceCode/Code2026/tg_shs/shs_outdoor/TPipeCanalJig.cpp
T
2026-09-28 15:28:50 +08:00

365 lines
7.3 KiB
C++

#include "stdafx.h"
#include "TPipeCanalJig.h"
#include "TVirtualPipeCanal.h"
#include "DbPipeCanal.h"
#include "TwtDef.h"
#include "TAPI.h"
#include <PipeWireMonitor.h>
#include "DrawPipeCanalDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define NUM_PI 180.0
void DrawPipeCanal1()
{
CTemporaryResourceOverride vTemp;
CDrawPipeCanalDlg *pDlg = new CDrawPipeCanalDlg;
if (pDlg != NULL)
{
pDlg->Create(IDD_DRAW_PIPECANAL);
pDlg->ShowWindow(SW_SHOW);
}
AcDbLine *pLine = new AcDbLine;
XPoint ptS,ptE;
acedGetPoint(NULL,_T("\n请选择起点<退出>:"),ptS);
acedGetPoint(NULL,_T("\n请选择终点<退出>:"),ptE);
pLine->setStartPoint(ptS);
pLine->setEndPoint(ptE);
AddToCurrentSpace(pLine,Adesk::kTrue);
if (pDlg != NULL)
{
delete pDlg;
pDlg = NULL;
}
}
//绘制方沟
void DrawPipeCanal()
{
int nKey = 0;
XPoint ptS,ptE;
// double dWidth = 5*DocGetPScale();
// acedGetReal(_T("\n请输入方沟宽度(500mm):"),&dWidth);
// int nStyle = 1;
// acedGetInt(_T("\n请输入方沟样式(1-5):"),&nStyle);
// if (nStyle < 1 || nStyle > 5)
// nStyle = 1;
// 绘制方沟对话框实现 zxl 2012.10.11 modify
double dWidth = 5*DocGetPScale();
int nStyle = 1;
CTemporaryResourceOverride vTemp;
CDrawPipeCanalDlg *pDlg = new CDrawPipeCanalDlg;
if (pDlg != NULL)
{
pDlg->Create(IDD_DRAW_PIPECANAL);
pDlg->ShowWindow(SW_SHOW);
}
int nEs = acedGetPoint(NULL,_T("\n请选择方沟起点<退出>:"),ptS);
// cet 2012.3.26 add
if (nEs != RTNORM)
{
pDlg->DestroyWindow();
delete pDlg;
pDlg = NULL;
SHads_command(RTNONE);
return;
}
if (pDlg != NULL)
{
pDlg->UpdateData(TRUE);
nStyle = pDlg->m_nCanalType;
dWidth = pDlg->m_dCanalWidth;
}
xg_setvar(_T("CMDECHO"), 0); // 关闭回显
static bool bUseDial = false; // 记录刻度盘上次是否使用
TPipeCanalJig jig;
jig.EnableDial(bUseDial); // cet 2012.3.26 add
while (nEs == RTNORM)
{
AcGePoint3d ptGeS = Ucs2Wcs(ptS);
while (TRUE)
{
TDbPipeCanal *pCanal = new TDbPipeCanal;
pCanal->SetDoteLayer(InitLayer(LAY_TWT_DOTE));
pCanal->setLinetype(_T("CONTINUOUS"));
pCanal->SetPipeWeight(g_nPipeWidth[0]);
pCanal->SetModelType(TPipeSys::kModel);
pCanal->SetMaterial(0);
pCanal->SetWidth(dWidth);
pCanal->SetHeight(dWidth);
pCanal->SetSpare(dWidth/2.5);
pCanal->SetCanalType(nStyle);
// cet 2014.4.21 modify
// pCanal->setLayer(InitLayer(LAY_PIPE_RAIN));
pCanal->setLayer(InitLayer(LAY_TWT_BOX_DRAIN));
pCanal->setColor(AcCmColor()); //随层
//cet 2012.3.26 modify 控制刻度盘使用
//jig.setDispPrompt(_T("\n请选择下一点[回退(u)]:"));
//jig.SetKeyword(_T("u "));
jig.setDispPrompt(_T("\n请选择下一点[启用刻度盘(A)/禁用刻度盘(S)/回退(U)]:"));
jig.SetKeyword(_T("A S U"));
jig.SetPipeCanalPtr(pCanal);
jig.SetStartPoint(ptGeS);
jig.GetDlgData(pDlg);
nEs = jig.DoIt(&nKey);
if (pDlg != NULL)
{
pDlg->UpdateData(TRUE);
nStyle = pDlg->m_nCanalType;
dWidth = pDlg->m_dCanalWidth;
}
jig.GetStartPoint(ptGeS);
if (nEs != RTNORM && nEs != RTKWORD)
{
break;
}
bUseDial = jig.IsDrawDial(); // cet 2012.3.26 add
}
AcGeVector3d vtDir;
jig.SetVtBefore(vtDir);
nEs = acedGetPoint(NULL,_T("\n请选择方沟起点<退出>:"),ptS);
if (nEs != RTNORM)
break;
if (pDlg != NULL)
{
pDlg->UpdateData(TRUE);
nStyle = pDlg->m_nCanalType;
dWidth = pDlg->m_dCanalWidth;
}
}
if (pDlg != NULL)
{
pDlg->DestroyWindow();
delete pDlg;
pDlg = NULL;
}
SHads_command(RTNONE);
// acedPostCommand(_T("\33"));
}
TPipeCanalJig::TPipeCanalJig()
{
m_pVirtual = new TVirtualPipeCanal;
m_pCanal = NULL;
m_dAverageAng = PI/12;
m_bUseDial = false; // cet 2012.3.26 add
}
TPipeCanalJig::~TPipeCanalJig()
{
if (m_pVirtual != NULL)
delete m_pVirtual;
}
int TPipeCanalJig::DoIt(int *pKeyIndex)
{
m_ptE = m_ptS;
if (m_pVirtual != NULL)
m_pVirtual->SetCanalPtr(m_pCanal);
int nRet = TSymbEdJig::DoIt(pKeyIndex);
if (nRet == RTNORM)
{
m_vtBefore = m_ptE - m_ptS;
m_vtBefore.normalize();
m_arBeforePt.append(m_ptS);
m_ptS = m_ptE;
SHads_command(RTSTR, _T(".UNDO"), RTSTR, _T("MARK"), NULL);
AddToCurrentSpace(m_pCanal,Adesk::kTrue);
TPipePerDocData *pData = GetCurPipeDocData();
pData->ApplyUpdates();
}
else if (nRet == RTKWORD)
{
// cet 2012.3.26 modify 控制刻度盘的使用
// if (m_arBeforePt.length() > 0)
// {
// m_ptS = m_arBeforePt.last();
// m_arBeforePt.removeLast();
// SHads_command(RTSTR, _T("UNDO"), RTSTR, _T("BACK"), NULL);
// }
if (pKeyIndex != NULL)
{
if (*pKeyIndex == 0) //O
{
m_bUseDial = true;
}
else if (*pKeyIndex == 1) //S
{
m_bUseDial = false;
}
else if (*pKeyIndex == 2) //U
{
if (m_arBeforePt.length() > 0)
{
m_ptS = m_arBeforePt.last();
m_arBeforePt.removeLast();
SHads_command(RTSTR, _T("UNDO"), RTSTR, _T("BACK"), NULL);
}
}
}
}
return nRet;
}
AcEdJig::DragStatus TPipeCanalJig::GetPoint(XPoint &pt)
{
AcEdJig::DragStatus sta = acquirePoint(pt,m_ptS);
// cet 2012.3.26 add 不使用刻度盘
if (!m_bUseDial)
{
m_ptE = pt;
return sta;
}
//得到起点和终点的连线向量
AcGeVector3d vtNorm = AcGeVector3d::kZAxis;
AcGeVector3d vt = pt - m_ptS;
if (vt.isZeroLength())
return kNoChange;
vt = vt.orthoProject(vtNorm);
//得到起始方向向量
AcGeVector3d vtT = AcGeVector3d::kXAxis;
if (!m_vtBefore.isZeroLength())
{
vtT = m_vtBefore;
vtT.normalize();
}
//按固定角度旋转
int nIndex = (int)((vt.angleTo(vtT) + m_dAverageAng/2)/ m_dAverageAng);
CString sText;
sText.Format(_T("%.0f"),vt.angleTo(vtT) * (NUM_PI / PI));
AcGeVector3d vtT2 = vtT;
vtT2.rotateBy(PI/2,vtNorm);
if (vt.angleTo(vtT2) < PI/2)
{
vt = vtT;
vt.rotateBy(m_dAverageAng*nIndex,vtNorm);
}
else
{
vt = vtT;
vt.rotateBy(2*PI - m_dAverageAng*nIndex,vtNorm);
}
if (m_pVirtual != NULL)
m_pVirtual->SetStartVector(vt);
sText.Format(_T("%.0f"),(NUM_PI / PI) * m_dAverageAng * nIndex);
if (m_pVirtual != NULL)
m_pVirtual->SetText(pt,sText);
AcDbLine line(m_ptS,m_ptS + vt);
AcGePoint3d ptOth;
line.getClosestPointTo(pt,ptOth,Adesk::kTrue);
if (sta == kNormal)
{
if (ptOth.distanceTo(m_ptE) > 1e-3)
{
m_ptE = ptOth;
}
else
return kNoChange;
}
return sta;
}
Adesk::Boolean TPipeCanalJig::update()
{
if (m_pVirtual != NULL)
{
m_pDlg->UpdateData(TRUE);
m_pCanal->SetWidth(m_pDlg->m_dCanalWidth);
m_pCanal->SetHeight(m_pDlg->m_dCanalWidth);
m_pCanal->SetSpare(m_pDlg->m_dCanalWidth/2.5);
m_pCanal->SetCanalType(m_pDlg->m_nCanalType);
m_pVirtual->SetCanalStartPt(m_ptS);
m_pVirtual->SetCanalEndPt(m_ptE);
m_pVirtual->SetCenPoint(m_ptS);
m_pVirtual->SetPanState(FALSE);
m_pVirtual->SetAverageAng(m_dAverageAng);
// cet 2012.3.26 add 是否使用刻度盘
m_pVirtual->EnabelDrawWatch(m_bUseDial);
}
return Adesk::kTrue;
}
void TPipeCanalJig::GetDlgData(CDrawPipeCanalDlg *pDlg)
{
m_pDlg = pDlg;
}
AcDbEntity* TPipeCanalJig::entity() const
{
return m_pVirtual;
}
void TPipeCanalJig::SetStartPoint(const AcGePoint3d &pt)
{
m_ptS = pt;
}
void TPipeCanalJig::GetEndPoint(AcGePoint3d &pt)
{
pt = m_ptE;
}
void TPipeCanalJig::SetPipeCanalPtr(TDbPipeCanal *&pCanal)
{
m_pCanal = pCanal;
}
void TPipeCanalJig::GetStartPoint(AcGePoint3d &pt)
{
pt = m_ptS;
}
void TPipeCanalJig::SetVtBefore(const AcGeVector3d &vtBefore)
{
m_vtBefore = vtBefore;
}
void TPipeCanalJig::EnableDial( bool bEnable )
{
m_bUseDial = bEnable;
}
bool TPipeCanalJig::IsDrawDial()
{
return m_bUseDial;
}