#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; }