365 lines
7.3 KiB
C++
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;
|
|
}
|
|
|
|
|