2026-10-04 00:04:20 +08:00
|
|
|
#include "stdafx.h"
|
2026-09-28 15:28:50 +08:00
|
|
|
#include "KTPIDPipeOper.h"
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
#undef THIS_FILE
|
|
|
|
|
static char THIS_FILE[]=__FILE__;
|
|
|
|
|
#define new DEBUG_NEW
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#define MIN_DN 5.0
|
|
|
|
|
|
|
|
|
|
KTPIDPipeOper::KTPIDPipeOper()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
KTPIDPipeOper::~KTPIDPipeOper()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL KTPIDPipeOper::XData2PipeParam(PID::PIDPipeParam* pPidparam,AecDbObjXDataMap& objXData)
|
|
|
|
|
{
|
|
|
|
|
if (pPidparam != NULL)
|
|
|
|
|
{
|
|
|
|
|
objXData.GetAt(PID_PIPE_DN,pPidparam->m_dDN);
|
|
|
|
|
objXData.GetAt(PID_PIPE_LINENO,pPidparam->m_pszLineNo, 64);
|
|
|
|
|
|
|
|
|
|
objXData.GetAt(PID_PIPE_INCH,(TCHAR*)pPidparam->m_pszInchDN, 16);
|
|
|
|
|
objXData.GetAt(PID_PIPE_ZONE,(TCHAR*)pPidparam->m_pszZone, 16);
|
|
|
|
|
objXData.GetAt(PID_PIPE_NO,(TCHAR*)pPidparam->m_pszNo, 16);
|
|
|
|
|
objXData.GetAt(PID_PIPE_DESCR,(TCHAR*)pPidparam->m_pszDesc, 255);
|
|
|
|
|
objXData.GetAt(PID_PIPE_MEDIA,(TCHAR*)pPidparam->m_pszMedia, 32);
|
|
|
|
|
objXData.GetAt(PID_PIPE_LEVEL,(TCHAR*)pPidparam->m_pszLevel, 64);
|
|
|
|
|
|
|
|
|
|
objXData.GetAt(PID_PIPE_COLOR,pPidparam->m_nPipeColor);
|
|
|
|
|
|
|
|
|
|
objXData.GetAt(PID_PIPE_INSTAG,(TCHAR*)pPidparam->m_pszInsTag, 16);
|
|
|
|
|
objXData.GetAt(PID_PIPE_INSDIM,(TCHAR*)pPidparam->m_pszInsTagDim, 64);
|
|
|
|
|
|
|
|
|
|
objXData.GetAt(PID_PIPE_TRACE,pPidparam->m_nTraType);
|
|
|
|
|
objXData.GetAt(PID_PIPE_CSPACE,pPidparam->m_dCoverSpace);
|
|
|
|
|
objXData.GetAt(PID_PIPE_HTHICK,pPidparam->m_dHeatThick);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL KTPIDPipeOper::PipeParam2XData(const PID::PIDPipeParam* pPidparam,AecDbObjXDataMap& objXData)
|
|
|
|
|
{
|
|
|
|
|
if (pPidparam != NULL)
|
|
|
|
|
{
|
|
|
|
|
objXData.SetAt(PID_PIPE_DN,pPidparam->m_dDN);
|
|
|
|
|
objXData.SetAt(PID_PIPE_INCH,pPidparam->m_pszInchDN);
|
|
|
|
|
objXData.SetAt(PID_PIPE_LINENO,pPidparam->m_pszLineNo);
|
|
|
|
|
objXData.SetAt(PID_PIPE_ZONE,pPidparam->m_pszZone);
|
|
|
|
|
objXData.SetAt(PID_PIPE_NO,pPidparam->m_pszNo);
|
|
|
|
|
objXData.SetAt(PID_PIPE_DESCR,pPidparam->m_pszDesc);
|
|
|
|
|
objXData.SetAt(PID_PIPE_MEDIA,pPidparam->m_pszMedia);
|
|
|
|
|
objXData.SetAt(PID_PIPE_LEVEL,pPidparam->m_pszLevel);
|
|
|
|
|
objXData.SetAt(PID_PIPE_COLOR,pPidparam->m_nPipeColor);
|
|
|
|
|
objXData.SetAt(PID_PIPE_INSTAG,pPidparam->m_pszInsTag);
|
|
|
|
|
objXData.SetAt(PID_PIPE_INSDIM,pPidparam->m_pszInsTagDim);
|
|
|
|
|
objXData.SetAt(PID_PIPE_TRACE,pPidparam->m_nTraType);
|
|
|
|
|
objXData.SetAt(PID_PIPE_CSPACE,pPidparam->m_dCoverSpace);
|
|
|
|
|
objXData.SetAt(PID_PIPE_HTHICK,pPidparam->m_dHeatThick);
|
|
|
|
|
objXData.SetAt(PID_PIPE_MTOALL, pPidparam->m_pszMtoInfo);
|
|
|
|
|
objXData.SetAt(PID_PIPE_FITTING, 0);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL KTPIDPipeOper::ReadPIDParamFromModel(PID::PIDPipeParam* pPidparam)
|
|
|
|
|
{
|
|
|
|
|
AecDbObjXDataMap objXData;
|
|
|
|
|
if (KTModelLayoutXData::ReadModelXData(KT_PIDPIPEPARAM,objXData))
|
|
|
|
|
{
|
|
|
|
|
KTPIDPipeOper::XData2PipeParam(pPidparam,objXData);
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL KTPIDPipeOper::WritePIDParam2Model(PID::PIDPipeParam* pPidparam)
|
|
|
|
|
{
|
|
|
|
|
AecDbObjXDataMap objXData;
|
|
|
|
|
KTPIDPipeOper::PipeParam2XData(pPidparam,objXData);
|
|
|
|
|
return KTModelLayoutXData::WriteModelXData(KT_PIDPIPEPARAM,objXData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL KTPIDPipeOper::WriteXData(AcDbEntity* pEnt,PID::PIDPipeParam* pPidparam)
|
|
|
|
|
{
|
|
|
|
|
AecDbObjXDataMap objXData;
|
|
|
|
|
if (KTPIDPipeOper::PipeParam2XData(pPidparam,objXData))
|
|
|
|
|
{
|
|
|
|
|
return objXData.Write(pEnt,PIDPIPE_APP);
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL KTPIDPipeOper::WriteXData(AcDbObjectId& id,PID::PIDPipeParam* pPidparam)
|
|
|
|
|
{
|
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
|
|
|
|
|
{
|
|
|
|
|
BOOL bSuccess = WriteXData(pEnt,pPidparam);
|
|
|
|
|
pEnt->close();
|
|
|
|
|
return bSuccess;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL KTPIDPipeOper::ReadXData(AcDbEntity* pEnt,PID::PIDPipeParam* pPidparam)
|
|
|
|
|
{
|
|
|
|
|
AecDbObjXDataMap objXData;
|
|
|
|
|
if (objXData.Read(pEnt,PIDPIPE_APP))
|
|
|
|
|
{
|
|
|
|
|
return KTPIDPipeOper::XData2PipeParam(pPidparam,objXData);
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL KTPIDPipeOper::ReadXData(AcDbObjectId& id,PID::PIDPipeParam* pPidparam)
|
|
|
|
|
{
|
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
|
|
|
|
|
{
|
|
|
|
|
BOOL bSuccess = ReadXData(pEnt,pPidparam);
|
|
|
|
|
pEnt->close();
|
|
|
|
|
return bSuccess;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL KTPIDPipeOper::BreakLine(AcDbObjectId& id,AcGePoint3d& ptGeNearCen,double dHalfWidth)
|
|
|
|
|
{
|
|
|
|
|
BOOL bSuccess = FALSE;
|
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
|
|
|
|
|
{
|
|
|
|
|
bSuccess = BreakLine(pEnt,ptGeNearCen,dHalfWidth);
|
|
|
|
|
pEnt->close();
|
|
|
|
|
return bSuccess;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL KTPIDPipeOper::BreakLine(AcDbEntity* pEnt,AcGePoint3d& ptGeNearCen,double dHalfWidth)
|
|
|
|
|
{
|
|
|
|
|
BOOL bSuccess = FALSE;
|
|
|
|
|
if (pEnt == NULL) return FALSE;
|
|
|
|
|
|
|
|
|
|
AcDbLine* pLine = AcDbLine::cast(pEnt);
|
|
|
|
|
if (pLine != NULL)
|
|
|
|
|
{
|
|
|
|
|
AcDbLine* pLine2 = NULL;
|
|
|
|
|
AcGeVector3d vtLine = pLine->endPoint() - pLine->startPoint();
|
|
|
|
|
AcGePoint3d ptGeOn;
|
|
|
|
|
vtLine.normalize();
|
|
|
|
|
pLine->getClosestPointTo(ptGeNearCen,ptGeOn,Adesk::kTrue);
|
|
|
|
|
|
|
|
|
|
AcGePoint3d ptGe1,ptGe2;
|
|
|
|
|
ptGe1 = ptGeOn - vtLine * dHalfWidth;
|
|
|
|
|
ptGe2 = ptGeOn + vtLine * dHalfWidth;
|
|
|
|
|
|
|
|
|
|
AcGeVector3d vt1,vt2;
|
|
|
|
|
|
|
|
|
|
double dSta = 0.0,dEnd = 0.0,dPar1 = 0.0,dPar2 = 0.0;
|
|
|
|
|
pLine->getStartParam(dSta);
|
|
|
|
|
pLine->getEndParam(dEnd);
|
|
|
|
|
pLine->getParamAtPoint(ptGe1,dPar1);
|
|
|
|
|
pLine->getParamAtPoint(ptGe2,dPar2);
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
//1.两点都在直线上
|
2026-09-28 15:28:50 +08:00
|
|
|
if ( (dPar1 - dSta) > 1.e-10 &&
|
|
|
|
|
(dPar1 - dEnd) < 1.e-10 &&
|
|
|
|
|
(dPar2 - dSta) > 1.e-10 &&
|
|
|
|
|
(dPar2 - dEnd) < 1.e-10)
|
|
|
|
|
{
|
|
|
|
|
double dDist = ptGe2.distanceTo(pLine->endPoint());
|
2026-10-04 00:04:20 +08:00
|
|
|
if (dDist > MIN_DN)//至少 预留与管径一样长的段
|
2026-09-28 15:28:50 +08:00
|
|
|
{
|
|
|
|
|
pLine2 = new AcDbLine;
|
|
|
|
|
pLine2->setStartPoint(ptGe2);
|
|
|
|
|
pLine2->setEndPoint(pLine->endPoint());
|
|
|
|
|
AecDbObjXDataMap xData1;
|
|
|
|
|
if (xData1.Read(pLine,PIDPIPE_APP))
|
|
|
|
|
{
|
|
|
|
|
xData1.Write(pLine2,PIDPIPE_APP);
|
|
|
|
|
}
|
|
|
|
|
pLine2->setLayer(pLine->layer());
|
|
|
|
|
pLine2->setColorIndex(pLine->colorIndex());
|
|
|
|
|
}
|
|
|
|
|
pLine->setEndPoint(ptGe1);
|
|
|
|
|
bSuccess = TRUE;
|
|
|
|
|
}
|
|
|
|
|
else if ( (dPar1 - dSta) > 1.e-10 &&
|
|
|
|
|
(dPar1 - dEnd) < 1.e-10 &&
|
2026-10-04 00:04:20 +08:00
|
|
|
(dPar2 - dEnd) > -1.e-10)//2.ptGe1 在直线上
|
2026-09-28 15:28:50 +08:00
|
|
|
{
|
|
|
|
|
pLine->setEndPoint(ptGe1);
|
|
|
|
|
}
|
|
|
|
|
else if ( (dPar2 - dSta) > 1.e-10 &&
|
|
|
|
|
(dPar2 - dEnd) < 1.e-10 &&
|
2026-10-04 00:04:20 +08:00
|
|
|
(dPar1 - dSta) < 1.e-10)//3.ptGe2 在直线上
|
2026-09-28 15:28:50 +08:00
|
|
|
{
|
|
|
|
|
pLine->setStartPoint(ptGe2);
|
|
|
|
|
bSuccess = TRUE;
|
|
|
|
|
}
|
2026-10-04 00:04:20 +08:00
|
|
|
else //两点都在直线外
|
2026-09-28 15:28:50 +08:00
|
|
|
{
|
|
|
|
|
pLine->erase();
|
|
|
|
|
bSuccess = TRUE;
|
|
|
|
|
}
|
|
|
|
|
if (pLine2 != NULL)
|
|
|
|
|
{
|
|
|
|
|
CKTCadUtility::AddToBlockTableRecord(pLine2);
|
|
|
|
|
pLine2->close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AcDbPolyline* pPl2 = NULL;
|
|
|
|
|
AcDbPolyline* pPl = AcDbPolyline::cast(pEnt);;
|
|
|
|
|
if (pPl != NULL)
|
|
|
|
|
{
|
|
|
|
|
AcGePlane plane(AcGePoint3d::kOrigin+pPl->normal()*pPl->elevation(), pPl->normal());
|
|
|
|
|
|
|
|
|
|
AcGePoint3d ptGeOn,ptGe1,ptGe2,ptGe;
|
|
|
|
|
pPl->getClosestPointTo(ptGeNearCen,ptGeOn,Adesk::kTrue);
|
|
|
|
|
|
|
|
|
|
double dDist = 0.0;
|
|
|
|
|
if (Acad::eOk == pPl->getDistAtPoint(ptGeOn,dDist))
|
|
|
|
|
{
|
|
|
|
|
double dDist1 = dDist - fabs(dHalfWidth);
|
|
|
|
|
double dDist2 = dDist + fabs(dHalfWidth);
|
|
|
|
|
double dDistT = 0.0;
|
|
|
|
|
double dStaW = 0.0,dEndW = 0.0;
|
|
|
|
|
|
|
|
|
|
if (Acad::eOk == pPl->getPointAtDist(dDist1,ptGe1) &&
|
|
|
|
|
Acad::eOk == pPl->getPointAtDist(dDist2,ptGe2))
|
|
|
|
|
{
|
|
|
|
|
int nLeft = -1;
|
|
|
|
|
int nNunVers = pPl->numVerts();
|
|
|
|
|
for (int i = 0;i < nNunVers;i++)
|
|
|
|
|
{
|
|
|
|
|
pPl->getPointAt(i,ptGe);
|
|
|
|
|
pPl->getDistAtPoint(ptGe,dDistT);
|
|
|
|
|
|
|
|
|
|
if (dDistT - dDist1 < 1.e-10)
|
|
|
|
|
{
|
|
|
|
|
pPl->getWidthsAt(i,dStaW,dEndW);
|
|
|
|
|
if (pPl2 == NULL) pPl2 = new AcDbPolyline;
|
|
|
|
|
pPl2->addVertexAt(i,ptGe.convert2d(plane),0.0,dStaW,dEndW);
|
|
|
|
|
nLeft = i;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
nLeft = i - 1;
|
|
|
|
|
if (pPl2 == NULL) pPl2 = new AcDbPolyline;
|
|
|
|
|
pPl2->addVertexAt(i,ptGe1.convert2d(plane),0.0,dStaW,dEndW);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (nLeft != -1)
|
|
|
|
|
{
|
|
|
|
|
while(nLeft > -1)
|
|
|
|
|
{
|
|
|
|
|
pPl->removeVertexAt(0);
|
|
|
|
|
nLeft -= 1;
|
|
|
|
|
}
|
|
|
|
|
pPl->addVertexAt(0,ptGe2.convert2d(plane));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pPl2 != NULL)
|
|
|
|
|
{
|
|
|
|
|
pPl2->setLayer(pPl->layer());
|
|
|
|
|
AecDbObjXDataMap xData1;
|
|
|
|
|
if (xData1.Read(pPl,PIDPIPE_APP))
|
|
|
|
|
{
|
|
|
|
|
xData1.Write(pPl2,PIDPIPE_APP);
|
|
|
|
|
}
|
|
|
|
|
CKTCadUtility::AddToBlockTableRecord(pPl2);
|
|
|
|
|
pPl2->close();
|
|
|
|
|
bSuccess = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return bSuccess;
|
|
|
|
|
}
|