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

290 lines
7.5 KiB
C++

#include "stdafx.h"
#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);
//1.两点都在直线上
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());
if (dDist > MIN_DN)//至少 预留与管径一样长的段
{
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 &&
(dPar2 - dEnd) > -1.e-10)//2.ptGe1 在直线上
{
pLine->setEndPoint(ptGe1);
}
else if ( (dPar2 - dSta) > 1.e-10 &&
(dPar2 - dEnd) < 1.e-10 &&
(dPar1 - dSta) < 1.e-10)//3.ptGe2 在直线上
{
pLine->setStartPoint(ptGe2);
bSuccess = TRUE;
}
else //两点都在直线外
{
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;
}