2611 lines
62 KiB
C++
2611 lines
62 KiB
C++
#include "stdafx.h"
|
|
#include "StdArx.h"
|
|
#include "AecDbEwFitting.h"
|
|
#include "AecDbEwEquipment.h"
|
|
#include "AecPipeLineModify.h"
|
|
#include "AecPipeLine.h"
|
|
#include "AecPipeSupport.h"
|
|
#include "EquipManaDlg.h"
|
|
#include "EquipmentLibraryDlg.h"
|
|
#include "PipelineTools.h"
|
|
|
|
#ifndef DXF_PIPE_ONLY
|
|
#define DXF_PIPE_ONLY _T("AEC_EWPIPE")
|
|
#endif
|
|
|
|
#ifndef VALVE_FOLDER
|
|
#define VALVE_FOLDER _T("阀")
|
|
#endif
|
|
|
|
extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt, AcDbDatabase* pDb/* = NULL*/, bool bClose/* = true*/);
|
|
|
|
AecPipeLineModify::AecPipeLineModify(void)
|
|
{
|
|
m_pADOServer = NULL;
|
|
m_bTeeStop = FALSE;
|
|
m_bUpdateMat = FALSE;
|
|
m_bCrossStop = FALSE;
|
|
memset(&m_paramOld,0,sizeof(WPipe::PipeParam));
|
|
}
|
|
|
|
AecPipeLineModify::~AecPipeLineModify(void)
|
|
{
|
|
|
|
}
|
|
|
|
void AecPipeLineModify::SetADOServer(CUIISQLiteServer* pADOServer)
|
|
{
|
|
m_pADOServer = pADOServer;
|
|
}
|
|
|
|
void AecPipeLineModify::SetPipeParamOld(const WPipe::PipeParam* pPipeParam)
|
|
{
|
|
if (pPipeParam != NULL)
|
|
{
|
|
memcpy(&m_paramOld,pPipeParam,sizeof(WPipe::PipeParam));
|
|
}
|
|
}
|
|
|
|
void AecPipeLineModify::SetPipeNetIds(AcDbObjectIdArray& arNetIds)
|
|
{
|
|
m_arNetIds.append(arNetIds);
|
|
}
|
|
|
|
CPoint AecPipeLineModify::PickAssocEqu(AcArray<AecInterface>& arInfs,AcDbObjectIdArray& arEquIds,AcArray<AcDbObjectIdInf>& arAssEquIds)
|
|
{
|
|
AcDbObjectId id;
|
|
AcDbEntity* pEnt = NULL;
|
|
AcDbObjectIdInf idInf;
|
|
idInf.pNext = NULL;
|
|
CPoint ptIndex(-1,-1);
|
|
|
|
int nFindEqu = -1;
|
|
for (int j = 0;j < arEquIds.length();j++)
|
|
{
|
|
id = arEquIds.at(j);
|
|
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
AecDbEwEquipment* pEqu = AecDbEwEquipment::cast(pEnt);
|
|
if (pEqu != NULL)
|
|
{
|
|
AecMInterfaces* pMInfNew = static_cast<AecMInterfaces*>(pEqu);
|
|
|
|
for (int i = 0;i < arInfs.length();i++)
|
|
{
|
|
AecInterface& inf = arInfs.at(i);
|
|
|
|
AecInterface infHit;
|
|
if (pMInfNew->GetInterface(inf.ptPos,infHit))
|
|
{
|
|
if (pMInfNew->GetInterfaceCount() == 2)//只能支持两个接口的阀门
|
|
{
|
|
AecInterface inf0,inf1;
|
|
pMInfNew->GetInterface(0,inf0);
|
|
pMInfNew->GetInterface(1,inf1);
|
|
|
|
if (inf0.ptPos.distanceTo(infHit.ptPos) < 1.e-2)
|
|
{
|
|
idInf.id = id;
|
|
idInf.infFr = inf1;
|
|
nFindEqu = 0;
|
|
ptIndex.x = 0;
|
|
ptIndex.y = i;
|
|
}
|
|
else
|
|
{
|
|
idInf.id = id;
|
|
idInf.infFr = inf0;
|
|
nFindEqu = 1;
|
|
|
|
ptIndex.x = 1;
|
|
ptIndex.y = i;
|
|
}
|
|
|
|
arAssEquIds.append(idInf);
|
|
arEquIds.removeAt(j);
|
|
j -= 1;
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
if (nFindEqu != -1) break;
|
|
}
|
|
return ptIndex;
|
|
}
|
|
|
|
CPoint AecPipeLineModify::PickAssocFlange(AcArray<AecInterface>& arInfs,AcDbObjectIdArray& arFitIds,int iPos,AcArray<AcDbObjectIdInf>& arAssFlgs)
|
|
{
|
|
AcDbObjectId id;
|
|
AcDbEntity* pEnt = NULL;
|
|
AcDbObjectIdInf idInf;
|
|
idInf.pNext = NULL;
|
|
|
|
CPoint ptIndex(-1,-1);
|
|
int nFindFlange = -1;
|
|
for (int j = 0;j < arFitIds.length();j++)
|
|
{
|
|
if (j == iPos)
|
|
continue;
|
|
|
|
id = arFitIds.at(j);
|
|
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
AecDbEwFitting* pFit = AecDbEwFitting::cast(pEnt);
|
|
if (pFit != NULL)
|
|
{
|
|
int nType = 0;
|
|
pFit->GetSpecialtyData()->GetAt(KEY_RUNTIME,nType);
|
|
EFittingType eType = (EFittingType)nType;
|
|
|
|
if (eType == eFlange)
|
|
{
|
|
AecMInterfaces* pMInfNew = static_cast<AecMInterfaces*>(pFit);
|
|
|
|
for (int i = 0;i < arInfs.length();i++)
|
|
{
|
|
AecInterface& inf = arInfs.at(i);
|
|
|
|
AecInterface infHit;
|
|
if (pMInfNew->GetInterface(inf.ptPos,infHit))
|
|
{
|
|
AecInterface inf0,inf1;
|
|
pMInfNew->GetInterface(0,inf0);
|
|
pMInfNew->GetInterface(1,inf1);
|
|
|
|
if (inf0.ptPos.distanceTo(infHit.ptPos) < 1.e-2)
|
|
{
|
|
idInf.id = id;
|
|
idInf.infFr = inf1;
|
|
nFindFlange = 0;
|
|
ptIndex.x = 0;
|
|
ptIndex.y = i;
|
|
}
|
|
else
|
|
{
|
|
idInf.id = id;
|
|
idInf.infFr = inf0;
|
|
nFindFlange = 1;
|
|
|
|
ptIndex.x = 1;
|
|
ptIndex.y = i;
|
|
}
|
|
arAssFlgs.append(idInf);
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
if (nFindFlange != -1) break;
|
|
}
|
|
return ptIndex;
|
|
}
|
|
|
|
bool AecPipeLineModify::ModifyPipeLineParamSys(AcDbObjectIdArray& arIds, WPipe::PipeParam ¶mNew)
|
|
{
|
|
/*
|
|
* 不建议修改管线的材质,金属管,塑料管,衬塑管,水泥管等... 的管件的尺寸不一样
|
|
* 画法不一样,导致管子需要重新切割长度.
|
|
* 同样的金属材质的管线 由于国标 A B S 系列不同,管件的尺寸也不同,
|
|
* 画法不一样,导致管子需要重新切割长度. !!!!!!!!!!!!!!!!!!!
|
|
*/
|
|
|
|
AcDbObjectId id1;
|
|
AcDbEntity *pEnt = NULL;
|
|
|
|
for (int i = 0; i < arIds.length(); i++)
|
|
{
|
|
id1 = arIds.at(i);
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id1, AcDb::kForWrite))
|
|
{
|
|
AecDbEwFitting *pFit = AecDbEwFitting::cast(pEnt);
|
|
if (pFit != NULL)
|
|
{
|
|
pFit->SetAt(PIPE_SYS, paramNew.szSys);
|
|
}
|
|
|
|
AecDbEwPipe *pPipe = AecDbEwPipe::cast(pEnt);
|
|
if (pPipe != NULL)
|
|
{
|
|
pPipe->SetAt(PIPE_SYS, paramNew.szSys);
|
|
}
|
|
|
|
AecDbEwEquipment *pEqu = AecDbEwEquipment::cast(pEnt);
|
|
if (pEqu != NULL)
|
|
{
|
|
pEqu->SetAt(PIPE_SYS, paramNew.szSys);
|
|
}
|
|
|
|
pEnt->close();
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool AecPipeLineModify::ModifyPipeLineParam(AcDbObjectIdArray& arPipeIds,AcDbObjectIdArray& arFitIds,AcDbObjectIdArray& arEquIds,WPipe::PipeParam& paramNew,BOOL bUpdateMat)
|
|
{
|
|
if (m_pADOServer == NULL)
|
|
return false;
|
|
|
|
m_bUpdateMat = bUpdateMat;
|
|
if (m_bUpdateMat)
|
|
{
|
|
ModifyPipeLineParamSys(arPipeIds, paramNew);
|
|
ModifyPipeLineParamSys(arFitIds, paramNew);
|
|
ModifyPipeLineParamSys(arEquIds, paramNew);
|
|
}
|
|
|
|
//1.先优先统一改管子的尺寸
|
|
ModifyPipeOnParam(arPipeIds,paramNew);
|
|
m_arPipeIds.append(arPipeIds);
|
|
|
|
AcDbObjectIdArray arFlangIds;
|
|
AcArray<AcDbObjectIdInf> arAssFlgs,arAssEquIds;
|
|
|
|
//2.先修改定位管件,定位管件的位置为绝对位置
|
|
//弯头,三通,四通,Wye,Lateral
|
|
//修改后导致接口位置改变,影响连接件
|
|
AcDbEntity* pEnt = NULL;
|
|
AcDbObjectId id1;
|
|
for (int i = 0;i < arFitIds.length();i++)
|
|
{
|
|
id1 = arFitIds.at(i);
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id1,AcDb::kForRead))
|
|
{
|
|
AecDbEwFitting* pFit = AecDbEwFitting::cast(pEnt);
|
|
if (pFit != NULL)
|
|
{
|
|
int nType = 0;
|
|
pFit->GetSpecialtyData()->GetAt(KEY_RUNTIME,nType);
|
|
EFittingType eType = (EFittingType)nType;
|
|
|
|
AcArray<AecInterface> arInfs;
|
|
pFit->GetInterface(arInfs);
|
|
|
|
switch(eType)
|
|
{
|
|
case eElbow:
|
|
case eTee:
|
|
case eWye:
|
|
case eLateral:
|
|
case eCross:
|
|
case eReduce:
|
|
{
|
|
//按阀门接口找出接口接的阀门
|
|
CPoint ptnPos1 = PickAssocEqu(arInfs,arEquIds,arAssEquIds);
|
|
|
|
//按照接口找出接口的法兰
|
|
CPoint ptnPos2 = PickAssocFlange(arInfs,arFitIds,i,arAssFlgs);
|
|
|
|
//改完Fit后,按接口对应改对接的管子或管件
|
|
if ( ModifyFitting(pFit,paramNew) )
|
|
{
|
|
AecMInterfaces* pMInfNew = static_cast<AecMInterfaces*>(pFit);
|
|
AecInterface infNew;
|
|
if (ptnPos1.x != -1)
|
|
{
|
|
pMInfNew->GetInterface(ptnPos1.y,infNew);
|
|
if (!arAssEquIds.isEmpty())
|
|
{
|
|
arAssEquIds.first().vtMove = infNew.ptPos - arInfs.at(ptnPos1.y).ptPos;
|
|
}
|
|
}
|
|
|
|
if (ptnPos2.x != -1)
|
|
{
|
|
pMInfNew->GetInterface(ptnPos2.y,infNew);
|
|
if (!arAssFlgs.isEmpty())
|
|
{
|
|
arAssFlgs.first().vtMove = infNew.ptPos - arInfs.at(ptnPos2.y).ptPos;
|
|
}
|
|
}
|
|
|
|
//按照接口路线修改
|
|
//一直到管子停止;
|
|
m_arNetIds.remove(id1);//修改一个移除当前Fit
|
|
pFit->LockInf(-1);
|
|
|
|
if ( !ModifyByInfAssoc(arInfs,pMInfNew,paramNew) )
|
|
{
|
|
pEnt->close();
|
|
return false;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case eWcap:
|
|
{
|
|
if ( ModifyFitting(pFit,paramNew) )
|
|
{
|
|
}
|
|
pFit->LockInf(-1);
|
|
break;
|
|
}
|
|
case eFlxJoin:
|
|
{
|
|
if (ModifyFitting(pFit, paramNew))
|
|
{
|
|
}
|
|
pFit->LockInf(-1);
|
|
break;
|
|
}
|
|
case eFlange:
|
|
{
|
|
arFlangIds.append(id1);
|
|
break;
|
|
}
|
|
case eThrough://直通 PVC
|
|
case eUJoin://活接 PVC
|
|
case eRJoin://缩接 PVC 伸缩节
|
|
case eOJoin://外螺纹接头
|
|
case eIJoin://内螺纹接头
|
|
{
|
|
if (ModifyFitting(pFit, paramNew))
|
|
{
|
|
}
|
|
pFit->LockInf(-1);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
if ( fabs(m_paramOld.m_dDN - paramNew.m_dDN) > 1.0 ||
|
|
fabs(m_paramOld.m_dRRatio - paramNew.m_dRRatio) > 0.3)
|
|
{
|
|
//从某一个设备开始 建立方向串 法兰管线
|
|
if (!arAssEquIds.isEmpty())
|
|
{
|
|
MakeEquListStartByEqu(arAssEquIds,arEquIds);
|
|
}
|
|
|
|
//从某一个法兰开始 建立方向串 法兰管线
|
|
if (!arAssFlgs.isEmpty())
|
|
{
|
|
MakeEquListStartByFlang(arAssFlgs,arEquIds,arFlangIds);
|
|
}
|
|
|
|
//4.arEquIds 余下孤立的阀门建立方向串
|
|
AcArray<AcDbObjectIdInf> arIdInf;
|
|
MakeEquListTheRest(arEquIds,arFlangIds,arIdInf);
|
|
|
|
arIdInf.append(arAssEquIds);
|
|
arIdInf.append(arAssFlgs);
|
|
|
|
AcGePoint3d ptE;
|
|
AcDbObjectIdInf* pNext = NULL;
|
|
|
|
//测试
|
|
#ifdef _DEBUG
|
|
for (int k = 0;k < arIdInf.length();k++)
|
|
{
|
|
AcDbObjectIdInf& idInf = arIdInf.at(k);
|
|
pNext = &idInf;
|
|
int nColor = 1;
|
|
|
|
while(pNext != NULL)
|
|
{
|
|
AcDbCircle* pCir = new AcDbCircle;
|
|
pCir->setCenter(pNext->infFr.ptPos);
|
|
pCir->setRadius(10.0);
|
|
pCir->setColorIndex(nColor);
|
|
AddToModelSpace(pCir,NULL,true);
|
|
|
|
AcDbLine* pLn = new AcDbLine;
|
|
pLn->setStartPoint(pNext->infFr.ptPos);
|
|
|
|
pNext->infFr.vtDir.normalize();
|
|
ptE = pNext->infFr.ptPos + 5.0 * pNext->infFr.vtDir;
|
|
pLn->setEndPoint(ptE);
|
|
pLn->setColorIndex(nColor);
|
|
AddToModelSpace(pLn,NULL,true);
|
|
|
|
nColor++;
|
|
pNext = pNext->pNext;
|
|
}
|
|
}
|
|
#endif
|
|
//修改方向串中的阀门 [已经排序]
|
|
ModifyEquAlongList(arIdInf,paramNew);
|
|
|
|
//Free
|
|
AcDbObjectIdInf *pLast = NULL;
|
|
for (int k = 0;k < arIdInf.length();k++)
|
|
{
|
|
AcDbObjectIdInf& idInf = arIdInf.at(k);
|
|
pNext = idInf.pNext;
|
|
int nColor = 1;
|
|
|
|
while(pNext != NULL)
|
|
{
|
|
pLast = pNext;
|
|
pNext = pNext->pNext;
|
|
delete pLast;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void AecPipeLineModify::ModifyPipeOnNewInf(AecInterface& infOld,AecInterface& infTo)
|
|
{
|
|
AcGePoint3d ptS,ptE;
|
|
bool bSet = false;
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
for (int i = 0;i < m_arPipeIds.length();i++)
|
|
{
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,m_arPipeIds.at(i),AcDb::kForRead))
|
|
{
|
|
AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt);
|
|
if (pPipe != NULL)
|
|
{
|
|
ptS = pPipe->StartPoint();
|
|
ptE = pPipe->EndPoint();
|
|
|
|
if (ptS.distanceTo(infOld.ptPos) < 1.e-2)
|
|
{
|
|
pPipe->upgradeOpen();
|
|
pPipe->SetStartPoint(infTo.ptPos);
|
|
pPipe->downgradeOpen();
|
|
bSet = true;
|
|
}
|
|
|
|
if (ptE.distanceTo(infOld.ptPos) < 1.e-2)
|
|
{
|
|
pPipe->upgradeOpen();
|
|
pPipe->SetEndPoint(infTo.ptPos);
|
|
pPipe->downgradeOpen();
|
|
bSet = true;
|
|
}
|
|
}
|
|
pEnt->close();
|
|
|
|
if (bSet)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void AecPipeLineModify::ModifyEquAlongList(AecInterface& infOld,AecInterface& infNewTo,AcDbObjectIdInf* pNext,const WPipe::PipeParam& paramNew)
|
|
{
|
|
AcDbEntity* pEnt = NULL;
|
|
AcDbObjectIdInf* pLast = pNext;
|
|
|
|
AecInterface infFr,infTo;
|
|
AcGePoint3d ptS;
|
|
AcGeVector3d vtDir,vtTmp;
|
|
Acad::ErrorStatus es;
|
|
|
|
while(pNext != NULL)
|
|
{
|
|
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,pNext->id,AcDb::kForWrite)))
|
|
{
|
|
AecDbEwEquipment* pEqu = AecDbEwEquipment::cast(pEnt);
|
|
if (pEqu != NULL)
|
|
{
|
|
AecDbEwEquipment* pNewEqu = CreateNewValve(pEqu,paramNew);
|
|
if (pNewEqu != NULL)
|
|
{
|
|
pNewEqu->GetInsert(ptS,vtDir);
|
|
|
|
//新阀门的接口位置必须和原有的对应
|
|
AcArray<AecInterface> arNewInfs;
|
|
|
|
AecInterface infNew0,infNew1;
|
|
pNewEqu->GetInterface(0,infNew0);
|
|
pNewEqu->GetInterface(1,infNew1);
|
|
|
|
if (infNew0.vtDir.isCodirectionalTo(infNewTo.vtDir))//和上次同向
|
|
{
|
|
//1为连接位置
|
|
pEqu->GetInterface(0,infOld);
|
|
|
|
vtTmp = infNewTo.ptPos - infNew1.ptPos;
|
|
ptS += vtTmp;
|
|
|
|
pNewEqu->SetInsert(ptS);
|
|
|
|
pNewEqu->GetInterface(0,infNewTo);//新的旧接口
|
|
|
|
infTo = infNewTo;
|
|
}
|
|
else if(infNew1.vtDir.isCodirectionalTo(infNewTo.vtDir))//和上次同向
|
|
{
|
|
//0为连接位置
|
|
pEqu->GetInterface(1,infOld);
|
|
|
|
vtTmp = infNewTo.ptPos - infNew0.ptPos;
|
|
ptS += vtTmp;
|
|
|
|
pNewEqu->SetInsert(ptS);
|
|
|
|
pNewEqu->GetInterface(1,infNewTo);//新的旧接口
|
|
|
|
infTo = infNewTo;
|
|
}
|
|
|
|
//替换
|
|
pEqu->copyFrom(pNewEqu);
|
|
delete pNewEqu;
|
|
}
|
|
}
|
|
|
|
AecDbEwFitting* pFit = AecDbEwFitting::cast(pEnt);
|
|
if (pFit != NULL)
|
|
{
|
|
AecDbEwFitting* pFlang = CreateNewFlang(pFit,paramNew);
|
|
if (pFlang != NULL)
|
|
{
|
|
int nType = 0;
|
|
pFit->GetSpecialtyData()->GetAt(KEY_RUNTIME,nType);
|
|
EFittingType eType = (EFittingType)nType;
|
|
|
|
if (eType == eFlange)//是法兰
|
|
{
|
|
AecDbEwFitting* pFlang = CreateNewFlang(pFit,paramNew);
|
|
if (pFlang != NULL)
|
|
{
|
|
AecInterface infNew0,infNew1,infNew;
|
|
pFlang->GetInterface(0,infNew0);
|
|
pFlang->GetInterface(1,infNew1);
|
|
|
|
pFlang->GetSpecialtyData()->GetAt(KEY_START,ptS);
|
|
|
|
if (infNew0.vtDir.isCodirectionalTo(infNewTo.vtDir))
|
|
{
|
|
//1 为连接位置
|
|
pFit->GetInterface(0,infOld);//旧的连接下一个位置
|
|
|
|
vtTmp = infNewTo.ptPos - infNew1.ptPos;
|
|
ptS += vtTmp;
|
|
|
|
pFlang->GetSpecialtyData()->SetAt(KEY_START,ptS);
|
|
|
|
pFlang->GetInterface(0,infNewTo);//新的旧接口
|
|
infTo = infNewTo;
|
|
}
|
|
else if(infNew1.vtDir.isCodirectionalTo(infNewTo.vtDir))//和上次同向
|
|
{
|
|
//0 为连接位置
|
|
pFit->GetInterface(1,infOld);
|
|
|
|
vtTmp = infNewTo.ptPos - infNew0.ptPos;
|
|
ptS += vtTmp;
|
|
|
|
pFlang->GetSpecialtyData()->SetAt(KEY_START,ptS);
|
|
|
|
pFlang->GetInterface(1,infNewTo);//新的旧接口
|
|
infTo = infNewTo;
|
|
}
|
|
|
|
//替换
|
|
pFit->copyFrom(pFlang);
|
|
delete pFlang;
|
|
|
|
m_arNetIds.remove(pNext->id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
|
|
pLast = pNext;
|
|
pNext = pNext->pNext;
|
|
}
|
|
|
|
|
|
//可能更改两侧的管子
|
|
if (pLast != NULL)
|
|
{
|
|
ModifyPipeOnNewInf(infOld,infTo);
|
|
}
|
|
}
|
|
|
|
//沿着list修改阀门
|
|
void AecPipeLineModify::ModifyEquAlongList(AcArray<AcDbObjectIdInf>& arAssEquIds,const WPipe::PipeParam& paramNew)
|
|
{
|
|
//链的开头记录要整体移动
|
|
AcDbEntity* pEnt = NULL;
|
|
AcGeMatrix3d xMove;
|
|
AcGeVector3d vtDir,vtTmp;
|
|
AcGePoint3d ptS;
|
|
AecInterface infPipe,infTo,infPipeOther,infPipeOtherTo;
|
|
Acad::ErrorStatus es;
|
|
|
|
for (int i = 0;i < arAssEquIds.length();i++)
|
|
{
|
|
AcDbObjectIdInf& idInf = arAssEquIds.at(i);
|
|
xMove.setToTranslation(idInf.vtMove);
|
|
|
|
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,idInf.id,AcDb::kForWrite)))
|
|
{
|
|
AecDbEwEquipment* pEqu = AecDbEwEquipment::cast(pEnt);
|
|
if (pEqu != NULL)
|
|
{
|
|
AecDbEwEquipment* pNewEqu = CreateNewValve(pEqu,paramNew);
|
|
if (pNewEqu != NULL)
|
|
{
|
|
pNewEqu->GetInsert(ptS,vtDir);
|
|
ptS += idInf.vtMove;
|
|
|
|
//新阀门的接口位置必须和原有的对应
|
|
AecInterface infNew0,infNew1;
|
|
pNewEqu->GetInterface(0,infNew0);
|
|
pNewEqu->GetInterface(1,infNew1);
|
|
|
|
//idInf.infFr为链表开头的设备接口
|
|
int nOldTo = -1,nOldOther = -1;
|
|
if (infNew0.vtDir.isCodirectionalTo(idInf.infFr.vtDir))
|
|
{
|
|
vtTmp = infNew0.ptPos - idInf.infFr.ptPos;
|
|
ptS += vtTmp;
|
|
pNewEqu->SetInsert(ptS);
|
|
pNewEqu->GetInterface(0,infTo);
|
|
nOldTo = 0;
|
|
nOldOther = 1;
|
|
}
|
|
else if(infNew1.vtDir.isCodirectionalTo(idInf.infFr.vtDir))
|
|
{
|
|
vtTmp = infNew1.ptPos - idInf.infFr.ptPos;
|
|
ptS += vtTmp;
|
|
pNewEqu->SetInsert(ptS);
|
|
pNewEqu->GetInterface(1,infTo);
|
|
nOldTo = 1;
|
|
nOldOther = 0;
|
|
}
|
|
|
|
pEqu->GetInterface(nOldTo,infPipe);
|
|
pEqu->GetInterface(nOldOther,infPipeOther);
|
|
|
|
ModifyEquAlongList(idInf.infFr,infTo,idInf.pNext,paramNew);
|
|
|
|
//然后替换当前pEqu;
|
|
pEqu->copyFrom(pNewEqu);
|
|
|
|
pEqu->GetInterface(nOldTo,infTo);
|
|
pEqu->GetInterface(nOldOther,infPipeOtherTo);
|
|
|
|
//可能更改两侧的管子,法兰管的情况下
|
|
ModifyPipeOnNewInf(infPipe,infTo);
|
|
|
|
ModifyPipeOnNewInf(infPipeOther,infPipeOtherTo);
|
|
|
|
delete pNewEqu;
|
|
}
|
|
}
|
|
|
|
AecDbEwFitting* pFit = AecDbEwFitting::cast(pEnt);
|
|
if (pFit != NULL)
|
|
{
|
|
int nType = 0;
|
|
pFit->GetSpecialtyData()->GetAt(KEY_RUNTIME,nType);
|
|
EFittingType eType = (EFittingType)nType;
|
|
|
|
if (eType == eFlange)//是法兰
|
|
{
|
|
AecDbEwFitting* pFlang = CreateNewFlang(pFit,paramNew);
|
|
if (pFlang != NULL)
|
|
{
|
|
AecInterface infNew0,infNew1,infNew;
|
|
pFlang->GetInterface(0,infNew0);
|
|
pFlang->GetInterface(1,infNew1);
|
|
|
|
//idInf.infFr为链表开头的Fit接口
|
|
int nOldTo = -1,nOldOther = -1;
|
|
if (infNew0.vtDir.isCodirectionalTo(idInf.infFr.vtDir))
|
|
{
|
|
infNew = infNew0;
|
|
nOldTo = 0;
|
|
nOldOther = 1;
|
|
}
|
|
else
|
|
{
|
|
infNew = infNew1;
|
|
nOldTo = 1;
|
|
nOldOther = 0;
|
|
}
|
|
|
|
pFit->GetInterface(nOldTo,infPipe);
|
|
pFit->GetInterface(nOldOther,infPipeOther);
|
|
|
|
pFlang->GetSpecialtyData()->GetAt(KEY_START,ptS);
|
|
|
|
//移动插入点
|
|
vtDir = infNew.ptPos - idInf.infFr.ptPos;
|
|
ptS += vtDir;
|
|
ptS += idInf.vtMove;
|
|
|
|
pFlang->GetSpecialtyData()->SetAt(KEY_START,ptS);
|
|
|
|
pFlang->GetInterface(nOldTo,infTo);
|
|
pFlang->GetInterface(nOldOther,infPipeOtherTo);
|
|
|
|
ModifyEquAlongList(idInf.infFr,infTo,idInf.pNext,paramNew);
|
|
|
|
//修改完法兰及连续
|
|
pFit->upgradeOpen();
|
|
pFit->copyFrom(pFlang);
|
|
pFit->downgradeOpen();
|
|
|
|
//可能更改两侧的管子
|
|
ModifyPipeOnNewInf(infPipeOther,infPipeOtherTo);
|
|
|
|
delete pFlang;
|
|
m_arNetIds.remove(idInf.id);
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
|
|
//弯头等fit直接接设备,法兰管线才有
|
|
void AecPipeLineModify::MakeEquListStartByEqu(AcArray<AcDbObjectIdInf>& arAssEquIds,AcDbObjectIdArray& arEquIds)
|
|
{
|
|
AcDbEntity* pEnt = NULL;
|
|
|
|
for (int i = 0;i < arAssEquIds.length();i++)
|
|
{
|
|
AcDbObjectIdInf& idInf = arAssEquIds.at(i);
|
|
AcDbObjectIdInf* pLast = &idInf;
|
|
|
|
for (int j = 0;j < arEquIds.length();j++)
|
|
{
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,arEquIds.at(j),AcDb::kForRead))
|
|
{
|
|
AecDbEwEquipment* pEqu = AecDbEwEquipment::cast(pEnt);
|
|
if (pEqu != NULL)
|
|
{
|
|
AecMInterfaces* pMInfNew = static_cast<AecMInterfaces*>(pEqu);
|
|
|
|
AecInterface infHit;
|
|
if (pMInfNew->GetInterface(idInf.infFr.ptPos,infHit))
|
|
{
|
|
if (pMInfNew->GetInterfaceCount() == 2)//只能支持两个接口的阀门
|
|
{
|
|
AecInterface inf0,inf1;
|
|
pMInfNew->GetInterface(0,inf0);
|
|
pMInfNew->GetInterface(1,inf1);
|
|
|
|
AcDbObjectIdInf* pIdInfThis = new AcDbObjectIdInf;
|
|
pIdInfThis->pNext = NULL;
|
|
pIdInfThis->vtMove.set(0,0,0);
|
|
|
|
if (inf0.ptPos.distanceTo(infHit.ptPos) < 1.e-2)
|
|
{
|
|
pIdInfThis->id = arEquIds.at(j);
|
|
pIdInfThis->infFr = inf1;
|
|
}
|
|
else
|
|
{
|
|
pIdInfThis->id = arEquIds.at(j);
|
|
pIdInfThis->infFr = inf0;
|
|
}
|
|
|
|
pLast->pNext = pIdInfThis;
|
|
pLast = pIdInfThis;
|
|
|
|
arEquIds.removeAt(j);
|
|
j -= 1;
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//法兰开始的焊接阀门-法兰-阀门... 阀门含有法兰
|
|
void AecPipeLineModify::MakeEquListStartByFlang(AcArray<AcDbObjectIdInf>& arAssFlgs,AcDbObjectIdArray& arEquIds,AcDbObjectIdArray& arFlangIds)
|
|
{
|
|
AcDbEntity* pEnt = NULL;
|
|
|
|
for (int i = 0;i < arAssFlgs.length();i++)
|
|
{
|
|
AcDbObjectIdInf* pLast = &arAssFlgs[i];
|
|
|
|
//先设备
|
|
bool bFindEqu = false;
|
|
bool bFindFit = false;
|
|
while(true)
|
|
{
|
|
|
|
bFindEqu = false;
|
|
for (int j = 0;j < arEquIds.length();j++)
|
|
{
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,arEquIds.at(j),AcDb::kForRead))
|
|
{
|
|
AecDbEwEquipment* pEqu = AecDbEwEquipment::cast(pEnt);
|
|
if (pEqu != NULL)
|
|
{
|
|
AecMInterfaces* pMInfNew = static_cast<AecMInterfaces*>(pEqu);
|
|
|
|
AecInterface infHit;
|
|
if (pMInfNew->GetInterface(pLast->infFr.ptPos,infHit))
|
|
{
|
|
if (pMInfNew->GetInterfaceCount() == 2)//只能支持两个接口的阀门
|
|
{
|
|
AecInterface inf0,inf1;
|
|
pMInfNew->GetInterface(0,inf0);
|
|
pMInfNew->GetInterface(1,inf1);
|
|
|
|
AcDbObjectIdInf* pIdInfThis = new AcDbObjectIdInf;
|
|
pIdInfThis->pNext = NULL;
|
|
pIdInfThis->vtMove.set(0,0,0);
|
|
|
|
if (inf0.ptPos.distanceTo(infHit.ptPos) < 1.e-2)
|
|
{
|
|
pIdInfThis->id = arEquIds.at(j);
|
|
pIdInfThis->infFr = inf1;
|
|
}
|
|
else
|
|
{
|
|
pIdInfThis->id = arEquIds.at(j);
|
|
pIdInfThis->infFr = inf0;
|
|
}
|
|
|
|
pLast->pNext = pIdInfThis;
|
|
pLast = pIdInfThis;
|
|
|
|
arEquIds.removeAt(j);
|
|
j -= 1;
|
|
bFindEqu = true;
|
|
pEnt->close();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
//然后再法兰
|
|
bFindFit = false;
|
|
for (int n = 0;n < arFlangIds.length();n++)
|
|
{
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,arFlangIds.at(n),AcDb::kForRead))
|
|
{
|
|
AecDbEwFitting* pFit = AecDbEwFitting::cast(pEnt);
|
|
if (pFit != NULL)
|
|
{
|
|
AecMInterfaces* pMInfNew = static_cast<AecMInterfaces*>(pFit);
|
|
|
|
AecInterface infHit;
|
|
if (pMInfNew->GetInterface(pLast->infFr.ptPos,infHit))
|
|
{
|
|
if (pMInfNew->GetInterfaceCount() == 2)//只能支持两个接口的阀门
|
|
{
|
|
AecInterface inf0,inf1;
|
|
pMInfNew->GetInterface(0,inf0);
|
|
pMInfNew->GetInterface(1,inf1);
|
|
|
|
AcDbObjectIdInf* pIdInfThis = new AcDbObjectIdInf;
|
|
pIdInfThis->pNext = NULL;
|
|
pIdInfThis->vtMove.set(0,0,0);
|
|
|
|
if (inf0.ptPos.distanceTo(infHit.ptPos) < 1.e-2)
|
|
{
|
|
pIdInfThis->id = arFlangIds.at(n);
|
|
pIdInfThis->infFr = inf1;
|
|
}
|
|
else
|
|
{
|
|
pIdInfThis->id = arFlangIds.at(n);
|
|
pIdInfThis->infFr = inf0;
|
|
}
|
|
|
|
pLast->pNext = pIdInfThis;
|
|
pLast = pIdInfThis;
|
|
|
|
arFlangIds.removeAt(n);
|
|
n -= 1;
|
|
bFindFit = true;
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
if (!bFindEqu && !bFindFit)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
AcDbObjectIdInf* ReverIdInf(AcDbObjectIdInf& idInf0)
|
|
{
|
|
AcArray<AcDbObjectIdInf*> arInfPtrs;
|
|
|
|
AcDbObjectIdInf* pNext = idInf0.pNext;
|
|
while(pNext != NULL)
|
|
{
|
|
arInfPtrs.append(pNext);
|
|
pNext = pNext->pNext;
|
|
}
|
|
arInfPtrs.reverse();
|
|
|
|
AcDbObjectIdInf* pLast = NULL,*pHead = NULL;
|
|
|
|
for (int i = 0;i < arInfPtrs.length();i++)
|
|
{
|
|
pNext = arInfPtrs.at(i);
|
|
|
|
if (pLast != NULL)
|
|
{
|
|
pLast->pNext = pNext;
|
|
pLast = pNext;
|
|
}
|
|
else
|
|
{
|
|
pLast = pNext;
|
|
pHead = pLast;
|
|
pLast->pNext = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
AcDbObjectIdInf* pLastBk = pLast;
|
|
if (pLast != NULL)
|
|
{
|
|
pLast->pNext = NULL;
|
|
|
|
pNext = new AcDbObjectIdInf;
|
|
pNext->id = idInf0.id;
|
|
pNext->infFr = idInf0.infFr;
|
|
pNext->vtMove = idInf0.vtMove;
|
|
pNext->pNext = NULL;
|
|
pLast->pNext = pNext;
|
|
pLast = pNext;
|
|
}
|
|
|
|
//Head由 idInf0代替
|
|
if (pHead != NULL)
|
|
{
|
|
idInf0.id = pHead->id;
|
|
idInf0.infFr = pHead->infFr;
|
|
idInf0.pNext = pHead->pNext;
|
|
delete pHead;
|
|
}
|
|
|
|
//TAIL
|
|
return pLast;
|
|
}
|
|
|
|
void ReverIdInfInf(AcDbObjectIdInf* pNext)
|
|
{
|
|
AecInterface inf0,inf1;
|
|
AcDbEntity* pEnt = NULL;
|
|
while(pNext != NULL)
|
|
{
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,pNext->id,AcDb::kForRead))
|
|
{
|
|
AecDbEwEquipment* pEqu = AecDbEwEquipment::cast(pEnt);
|
|
if (pEqu != NULL)
|
|
{
|
|
AecMInterfaces* pMInfNew = static_cast<AecMInterfaces*>(pEqu);
|
|
if (pMInfNew->GetInterfaceCount() == 2)
|
|
{
|
|
pMInfNew->GetInterface(0,inf0);
|
|
pMInfNew->GetInterface(1,inf1);
|
|
|
|
if (inf0.vtDir.isCodirectionalTo(pNext->infFr.vtDir))
|
|
{
|
|
pNext->infFr = inf1;
|
|
}
|
|
else if (inf1.vtDir.isCodirectionalTo(pNext->infFr.vtDir))
|
|
{
|
|
pNext->infFr = inf0;
|
|
}
|
|
}
|
|
}
|
|
|
|
AecDbEwFitting* pFit = AecDbEwFitting::cast(pEnt);
|
|
if (pFit != NULL)
|
|
{
|
|
AecMInterfaces* pMInfNew = static_cast<AecMInterfaces*>(pFit);
|
|
if (pMInfNew->GetInterfaceCount() == 2)
|
|
{
|
|
pMInfNew->GetInterface(0,inf0);
|
|
pMInfNew->GetInterface(1,inf1);
|
|
|
|
if (inf0.vtDir.isCodirectionalTo(pNext->infFr.vtDir))
|
|
{
|
|
pNext->infFr = inf1;
|
|
}
|
|
else if (inf1.vtDir.isCodirectionalTo(pNext->infFr.vtDir))
|
|
{
|
|
pNext->infFr = inf0;
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
pNext = pNext->pNext;
|
|
}
|
|
}
|
|
|
|
void AecPipeLineModify::MakeEquListTheRest(AcDbObjectIdArray& arEquIds,AcDbObjectIdArray& arFlangIds,AcArray<AcDbObjectIdInf>& arIdInf)
|
|
{
|
|
//先设备
|
|
AcDbEntity* pEnt = NULL;
|
|
AcDbObjectId id;
|
|
|
|
while( !arEquIds.isEmpty())
|
|
{
|
|
id = arEquIds.first();
|
|
arEquIds.removeFirst();
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
AecDbEwEquipment* pEqu = AecDbEwEquipment::cast(pEnt);
|
|
if (pEqu != NULL)
|
|
{
|
|
AecMInterfaces* pMInfNew = static_cast<AecMInterfaces*>(pEqu);
|
|
if (pMInfNew->GetInterfaceCount() == 2)
|
|
{
|
|
AecInterface inf0,inf1;
|
|
pMInfNew->GetInterface(0,inf0);
|
|
pMInfNew->GetInterface(1,inf1);
|
|
|
|
AcDbObjectIdInf idInf0;
|
|
idInf0.pNext = NULL;
|
|
idInf0.id = id;
|
|
idInf0.infFr = inf0;
|
|
idInf0.vtMove.set(0,0,0);
|
|
|
|
//向左
|
|
AcArray<AcDbObjectIdInf> arIdInf0;
|
|
arIdInf0.append(idInf0);
|
|
MakeEquListStartByFlang(arIdInf0,arEquIds,arFlangIds);
|
|
|
|
//向右
|
|
AcDbObjectIdInf idInf1;
|
|
idInf1.pNext = NULL;
|
|
idInf1.id = id;
|
|
idInf1.infFr = inf1;
|
|
idInf0.vtMove.set(0,0,0);
|
|
|
|
AcArray<AcDbObjectIdInf> arIdInf1;
|
|
arIdInf1.append(idInf1);
|
|
MakeEquListStartByFlang(arIdInf1,arEquIds,arFlangIds);
|
|
|
|
//左右合成生成一条链
|
|
AcDbObjectIdInf* pTail = ReverIdInf(arIdInf0.first());
|
|
if (pTail != NULL)
|
|
{
|
|
//arIdInf0取右侧接口
|
|
AcDbObjectIdInf* pNext = &arIdInf0.first();
|
|
ReverIdInfInf(pNext);
|
|
|
|
pTail->pNext = arIdInf1.first().pNext;
|
|
|
|
//添加一条链
|
|
arIdInf.append(arIdInf0.first());
|
|
}
|
|
else
|
|
{
|
|
//...
|
|
//添加一条链
|
|
arIdInf.append(arIdInf1.first());
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
|
|
bool AecPipeLineModify::ModifyFitting(AecDbEwFitting* pFitting,const WPipe::PipeParam& paramNew)
|
|
{
|
|
bool bSuccesed = false;
|
|
WPipe::PipeParam* pParam = (WPipe::PipeParam*)¶mNew;
|
|
|
|
AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData();
|
|
|
|
if (m_bUpdateMat)
|
|
{
|
|
pXDataMap->SetAt(PIPE_MATERIAL,pParam->szMertial);
|
|
pXDataMap->SetAt(PIPE_MATERIALFT,pParam->szMertialFit);
|
|
pXDataMap->SetAt(PIPE_SYS, pParam->szSys);
|
|
pXDataMap->SetAt(PIPE_COLOR, pParam->m_nPipeColor);
|
|
|
|
//设置图层
|
|
TDbPipeLine::SetFittingLayer(pFitting, pParam->szSys);
|
|
}
|
|
|
|
//标准和外径系列
|
|
pXDataMap->SetAt(PIPE_ODSN, pParam->szODSn);
|
|
pXDataMap->SetAt(PIPE_SHTNO,pParam->szStdNo);
|
|
|
|
CString sODNo = pParam->szODSn;
|
|
bool bIsPvc = TDbPipeLine::IsPlasticsMat(pParam, sODNo);
|
|
|
|
int nType = 0,nLocked = -1;
|
|
pXDataMap->GetAt(KEY_RUNTIME,nType);
|
|
EFittingType eType = (EFittingType)nType;
|
|
|
|
//如果DN不变,仅仅改外径和壁厚
|
|
double dDNOld = 0.0;
|
|
pXDataMap->GetAt(PIPE_DN,dDNOld);
|
|
|
|
if ( fabs(dDNOld - pParam->m_dDN) < 1.e-2 )
|
|
{
|
|
pXDataMap->SetAt(PIPE_OD,pParam->m_dOD);
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
|
|
//如果曲率半径改变
|
|
double dOldRatio = 2.0;
|
|
pXDataMap->GetAt(PIPE_RATIO,dOldRatio);
|
|
if ( fabs(dOldRatio - pParam->m_dRRatio) > 1.e-2)
|
|
{
|
|
if (eType != eElbow)//不是弯头
|
|
{
|
|
pXDataMap->SetAt(PIPE_RATIO,pParam->m_dRRatio);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
//进行到弯头修改
|
|
}
|
|
}
|
|
else//曲率半径不变
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
int nConnectType = 0;
|
|
pXDataMap->GetAt(PIPE_CONNECT,nConnectType);
|
|
|
|
double dPre = 1.6;
|
|
pXDataMap->GetAt(PIPE_PRESSURE, dPre);
|
|
|
|
CString sProject;
|
|
pXDataMap->GetAt(DOC_PROJECT, sProject);
|
|
|
|
CString sLevel;
|
|
pXDataMap->GetAt(PIPE_LEVEL, sLevel);
|
|
|
|
CString sKey;
|
|
|
|
//弯头,三通,四通,变径
|
|
switch( eType )
|
|
{
|
|
case eElbow:
|
|
{
|
|
if (nConnectType > 0)
|
|
{
|
|
double dFD = 0.0,dFL = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eElbow,pParam->m_nConnectType,pParam->m_dDN,dFD,dFL, sODNo, sProject, sLevel);
|
|
|
|
pParam->m_dInterfaceD = dFD;
|
|
pParam->m_dInterfaceL = dFL;
|
|
|
|
if (pParam->m_nConnectType == 3)
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject,sLevel,sODNo);
|
|
pParam->m_dWh = dWh;
|
|
pParam->m_dWn = dN;
|
|
}
|
|
}
|
|
|
|
TDbPipeLine pLn(NULL);
|
|
pLn.SetPipeParam(pParam);
|
|
pLn.SetInitDataMapPartFrom(pXDataMap);
|
|
pLn.FillConfigXDataMap(pXDataMap,pParam);
|
|
|
|
pXDataMap->SetAt(PIPE_WH,pParam->m_dWh);
|
|
pXDataMap->SetAt(PIPE_WN,pParam->m_dWn);
|
|
pXDataMap->SetAt(PIPE_RATIO,pParam->m_dRRatio);
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
|
|
//结构长度
|
|
double dL = 0.0;
|
|
if (!bIsPvc)
|
|
{
|
|
pXDataMap->SetAt(KEY_RadRatio, pParam->m_nRadioOn);
|
|
TDbPipeSupport::QueryElbowL(m_pADOServer, pParam->m_dDN, dL, pParam->m_dRRatio, pParam->m_nConnectType, pParam->szLevel, pParam->szODSn, pXDataMap);
|
|
pXDataMap->SetAt(KEY_Length, dL);
|
|
}
|
|
else
|
|
{
|
|
TDbPipeSupport::QueryPVCElbow(m_pADOServer, pParam->m_dDN, pXDataMap, sODNo);
|
|
}
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
bSuccesed = true;
|
|
break;
|
|
}
|
|
case eTee:
|
|
{
|
|
if (m_bTeeStop) //三通分支管径不改尺寸; 主接口可修改.分支锁定
|
|
{
|
|
TeeStop:
|
|
double dTDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_TDN,dTDN);
|
|
|
|
double dDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_DN,dDN);
|
|
|
|
nLocked = -1;
|
|
for(int k = 0;k < 3;k++)
|
|
{
|
|
sKey.Format(_T("LK_%d"),k);
|
|
if ( pXDataMap->GetAt(sKey,nLocked) )
|
|
{
|
|
if (nLocked > -1)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (nLocked == 2)//分支锁定,改主管
|
|
{
|
|
if ( ( dTDN - pParam->m_dDN ) > 1.e-2)
|
|
{
|
|
acutPrintf(_T("\n三通分支管径大于主管径!修改管径失败!"));
|
|
return false;
|
|
}
|
|
|
|
//主接口可修改.分支锁定
|
|
//原来的主接口
|
|
AecInterface inf2;
|
|
pFitting->GetInterface(2,inf2);
|
|
|
|
if (nConnectType > 0)
|
|
{
|
|
double dFD = 0.0,dFL = 0.0;
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eTee,nConnectType,pParam->m_dDN,dFD,dFL, sODNo,sProject,sLevel);
|
|
|
|
pXDataMap->SetAt(PIPE_INTERFACED,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL,dFL);
|
|
|
|
if ( nConnectType == 3)
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
pXDataMap->SetAt(PIPE_WH,dThk);
|
|
pXDataMap->SetAt(PIPE_WN,dN);
|
|
}
|
|
}
|
|
|
|
double dL = 0.0,dS = 0.0;
|
|
if ( TDbPipeSupport::QueryTeeData(m_pADOServer,pParam->m_dDN,dTDN,dL,dS, sODNo, sProject, sLevel) )
|
|
{
|
|
double dInterfaceL = 0.0;
|
|
pXDataMap->GetAt(PIPE_INTERFACEL,dInterfaceL);
|
|
if (dInterfaceL > 1.e-3)//法兰管
|
|
{
|
|
dL += dInterfaceL;
|
|
dS += dInterfaceL;
|
|
}
|
|
|
|
if ( nConnectType == 3)//法兰连接
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
dL -= dInterfaceL;
|
|
dS -= dInterfaceL;
|
|
|
|
//颈法兰焊接方式
|
|
if (sODNo.CompareNoCase( _T("S")) != 0 &&
|
|
sODNo.CompareNoCase(_T("GSF")) != 0)
|
|
{
|
|
dL += dThk;
|
|
dS += dThk;
|
|
}
|
|
}
|
|
}
|
|
|
|
pXDataMap->SetAt(PIPE_DN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_OD,pParam->m_dOD);
|
|
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
|
|
pXDataMap->SetAt(KEY_L,dL * 2);
|
|
pXDataMap->SetAt(KEY_T,dS);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
//记录更改调整,后面调整管线或阀门
|
|
AecInterface inf22;
|
|
pFitting->GetInterface(2,inf22);
|
|
|
|
AecInterfaceFrTo infFrTo;
|
|
infFrTo.infFr = inf2;
|
|
infFrTo.infTo = inf22;
|
|
m_arFrTo.append(infFrTo);
|
|
}
|
|
else //主管锁定,改分支
|
|
{
|
|
if ( ( pParam->m_dDN - dDN) > 1.e-2)
|
|
{
|
|
acutPrintf(_T("\n三通分支管径大于主管径!修改管径失败!"));
|
|
return false;
|
|
}
|
|
|
|
if (nConnectType > 0)
|
|
{
|
|
double dFD = 0.0,dFL = 0.0;
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eTee,nConnectType,pParam->m_dDN,dFD,dFL, sODNo, sProject, sLevel);
|
|
|
|
pXDataMap->SetAt(PIPE_INTERFACED2,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL2,dFL);
|
|
|
|
if ( nConnectType == 3)
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
pXDataMap->SetAt(PIPE_WH2,dThk);
|
|
pXDataMap->SetAt(PIPE_WN2,dN);
|
|
}
|
|
}
|
|
|
|
double dL = 0.0,dS = 0.0;
|
|
if ( TDbPipeSupport::QueryTeeData(m_pADOServer,dDN,pParam->m_dDN,dL,dS, sODNo, sProject, sLevel) )
|
|
{
|
|
double dInterfaceL = 0.0;
|
|
pXDataMap->GetAt(PIPE_INTERFACEL,dInterfaceL);
|
|
if (dInterfaceL > 1.e-3)//法兰管
|
|
{
|
|
dL += dInterfaceL;
|
|
dS += dInterfaceL;
|
|
}
|
|
|
|
if ( nConnectType == 3)//法兰连接
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
dL -= dInterfaceL;
|
|
dS -= dInterfaceL;
|
|
|
|
//颈法兰焊接方式
|
|
if (sODNo.CompareNoCase(_T("S")) != 0 &&
|
|
sODNo.CompareNoCase(_T("GSF")) != 0)
|
|
{
|
|
dL += dThk;
|
|
dS += dThk;
|
|
}
|
|
}
|
|
}
|
|
|
|
pXDataMap->SetAt(PIPE_TDN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_TOD,pParam->m_dOD);
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
|
|
pXDataMap->SetAt(KEY_L,dL * 2);
|
|
pXDataMap->SetAt(KEY_T,dS);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
}
|
|
bSuccesed = true;
|
|
}
|
|
else//全改,统一DN
|
|
{
|
|
double dDN = 0.0,dTDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_DN,dDN);
|
|
pXDataMap->GetAt(PIPE_TDN,dTDN);
|
|
|
|
if ( fabs(dTDN - dDN) > 1.e-2)
|
|
{
|
|
goto TeeStop;
|
|
break;
|
|
}
|
|
|
|
if (nConnectType > 0)
|
|
{
|
|
double dFD = 0.0,dFL = 0.0;
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eTee,nConnectType,pParam->m_dDN,dFD,dFL, sODNo, sProject, sLevel);
|
|
|
|
pXDataMap->SetAt(PIPE_INTERFACED2,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL2,dFL);
|
|
pXDataMap->SetAt(PIPE_INTERFACED,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL,dFL);
|
|
|
|
if ( nConnectType == 3)
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
pXDataMap->SetAt(PIPE_WH2,dThk);
|
|
pXDataMap->SetAt(PIPE_WN2,dN);
|
|
pXDataMap->SetAt(PIPE_WH,dThk);
|
|
pXDataMap->SetAt(PIPE_WN,dN);
|
|
}
|
|
}
|
|
|
|
double dL = 0.0,dS = 0.0;
|
|
if ( TDbPipeSupport::QueryTeeData(m_pADOServer,pParam->m_dDN,pParam->m_dDN,dL,dS, sODNo, sProject, sLevel) )
|
|
{
|
|
double dInterfaceL = 0.0;
|
|
pXDataMap->GetAt(PIPE_INTERFACEL,dInterfaceL);
|
|
if (dInterfaceL > 1.e-3)//法兰管
|
|
{
|
|
dL += dInterfaceL;
|
|
dS += dInterfaceL;
|
|
}
|
|
|
|
if ( nConnectType == 3)//法兰连接
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
dL -= dInterfaceL;
|
|
dS -= dInterfaceL;
|
|
|
|
//颈法兰焊接方式
|
|
if (sODNo.CompareNoCase(_T("S")) != 0 &&
|
|
sODNo.CompareNoCase(_T("GSF")) != 0)
|
|
{
|
|
dL += dThk;
|
|
dS += dThk;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
pXDataMap->SetAt(PIPE_DN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_OD,pParam->m_dOD);
|
|
|
|
pXDataMap->SetAt(PIPE_TDN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_TOD,pParam->m_dOD);
|
|
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
|
|
pXDataMap->SetAt(KEY_L,dL * 2);
|
|
pXDataMap->SetAt(KEY_T,dS);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
bSuccesed = true;
|
|
}
|
|
break;
|
|
}
|
|
case eCross:
|
|
{
|
|
if (m_bCrossStop)//四通分支管径不改尺寸
|
|
{
|
|
CrossStop:
|
|
nLocked = -1;
|
|
for(int k = 0;k < 4;k++)
|
|
{
|
|
sKey.Format(_T("LK_%d"),k);
|
|
if ( pXDataMap->GetAt(sKey,nLocked) )
|
|
{
|
|
if (nLocked > -1)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (nLocked > 1)//分支锁定,改主管
|
|
{
|
|
double dTDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_TDN,dTDN);
|
|
|
|
double dDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_DN,dDN);
|
|
|
|
if (nConnectType > 0)
|
|
{
|
|
double dFD = 0.0,dFL = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eCross,pParam->m_nConnectType,pParam->m_dDN,dFD,dFL, sODNo, sProject, sLevel);
|
|
|
|
pXDataMap->SetAt(PIPE_INTERFACED,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL,dFL);
|
|
|
|
if (nConnectType == 3)
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
pXDataMap->SetAt(PIPE_WH,dThk);
|
|
pXDataMap->SetAt(PIPE_WN,dN);
|
|
}
|
|
}
|
|
|
|
double dL = 0.0,dB = 0.0;
|
|
if ( TDbPipeSupport::QueryCrossData(m_pADOServer,pParam->m_dDN,pParam->m_dDN,dL,dB, sODNo, sProject, sLevel) )
|
|
{
|
|
double dInterfaceL = 0.0;
|
|
pXDataMap->GetAt(PIPE_INTERFACEL,dInterfaceL);
|
|
|
|
if (dInterfaceL > 1.e-3)//法兰管
|
|
{
|
|
dL += dInterfaceL;
|
|
dB += dInterfaceL;
|
|
}
|
|
|
|
if ( nConnectType == 3)//法兰连接
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
dL -= dInterfaceL;
|
|
dB -= dInterfaceL;
|
|
|
|
//颈法兰焊接方式
|
|
if (sODNo.CompareNoCase(_T("S")) != 0 &&
|
|
sODNo.CompareNoCase(_T("GSF")) != 0)
|
|
{
|
|
dL += dThk;
|
|
dB += dThk;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
//记录分支前
|
|
AecInterface inf2,inf3;
|
|
pFitting->GetInterface(2,inf2);
|
|
pFitting->GetInterface(3,inf3);
|
|
|
|
pXDataMap->SetAt(PIPE_DN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_OD,pParam->m_dOD);
|
|
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
|
|
pXDataMap->SetAt(KEY_L,dL * 2);
|
|
pXDataMap->SetAt(KEY_T,dB * 2);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
//记录分支后
|
|
AecInterface inf22,inf33;
|
|
pFitting->GetInterface(2,inf22);
|
|
pFitting->GetInterface(3,inf33);
|
|
|
|
AecInterfaceFrTo infFt;
|
|
infFt.infFr = inf2;
|
|
infFt.infTo = inf22;
|
|
m_arFrTo.append(infFt);
|
|
|
|
infFt.infFr = inf3;
|
|
infFt.infTo = inf33;
|
|
m_arFrTo.append(infFt);
|
|
}
|
|
else//主管锁定,改分支
|
|
{
|
|
double dTDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_TDN,dTDN);
|
|
|
|
double dDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_DN,dDN);
|
|
|
|
if (nConnectType > 0)
|
|
{
|
|
double dFD = 0.0,dFL = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eCross,pParam->m_nConnectType,dDN,dFD,dFL, sODNo, sProject, sLevel);
|
|
|
|
pXDataMap->SetAt(PIPE_INTERFACED2,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL2,dFL);
|
|
|
|
if (nConnectType == 3)
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
pXDataMap->SetAt(PIPE_WH2,dThk);
|
|
pXDataMap->SetAt(PIPE_WN2,dN);
|
|
}
|
|
}
|
|
|
|
double dL = 0.0,dB = 0.0;
|
|
if ( TDbPipeSupport::QueryCrossData(m_pADOServer,dDN,pParam->m_dDN,dL,dB, sODNo, sProject, sLevel) )
|
|
{
|
|
double dInterfaceL = 0.0;
|
|
pXDataMap->GetAt(PIPE_INTERFACEL,dInterfaceL);
|
|
|
|
if (dInterfaceL > 1.e-3)//法兰管
|
|
{
|
|
dL += dInterfaceL;
|
|
dB += dInterfaceL;
|
|
}
|
|
|
|
if ( nConnectType == 3)//法兰连接
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
dL -= dInterfaceL;
|
|
dB -= dInterfaceL;
|
|
|
|
//颈法兰焊接方式
|
|
if (sODNo.CompareNoCase(_T("S")) != 0 &&
|
|
sODNo.CompareNoCase(_T("GSF")) != 0)
|
|
{
|
|
dL += dThk;
|
|
dB += dThk;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
//记录主管前
|
|
AecInterface inf0,inf1;
|
|
pFitting->GetInterface(0,inf0);
|
|
pFitting->GetInterface(1,inf1);
|
|
|
|
pXDataMap->SetAt(PIPE_TDN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_TOD,pParam->m_dOD);
|
|
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
|
|
pXDataMap->SetAt(KEY_L,dL * 2);
|
|
pXDataMap->SetAt(KEY_T,dB * 2);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
//记录主管后
|
|
AecInterface inf00,inf11;
|
|
pFitting->GetInterface(0,inf00);
|
|
pFitting->GetInterface(1,inf11);
|
|
|
|
AecInterfaceFrTo infFt;
|
|
infFt.infFr = inf0;
|
|
infFt.infTo = inf00;
|
|
m_arFrTo.append(infFt);
|
|
|
|
infFt.infFr = inf1;
|
|
infFt.infTo = inf11;
|
|
m_arFrTo.append(infFt);
|
|
}
|
|
bSuccesed = true;
|
|
}
|
|
else//全改,统一DN
|
|
{
|
|
double dDN = 0.0,dTDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_DN,dDN);
|
|
pXDataMap->GetAt(PIPE_TDN,dTDN);
|
|
|
|
if ( fabs(dTDN - dDN) > 1.e-2)
|
|
{
|
|
goto CrossStop;
|
|
break;
|
|
}
|
|
|
|
if (nConnectType > 0)
|
|
{
|
|
double dFD = 0.0,dFL = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eCross,pParam->m_nConnectType,pParam->m_dDN,dFD,dFL, sODNo, sProject, sLevel);
|
|
|
|
pXDataMap->SetAt(PIPE_INTERFACED,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL,dFL);
|
|
|
|
pXDataMap->SetAt(PIPE_INTERFACED2,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL2,dFL);
|
|
|
|
if (nConnectType == 3)
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
pXDataMap->SetAt(PIPE_WH,dThk);
|
|
pXDataMap->SetAt(PIPE_WN,dN);
|
|
pXDataMap->SetAt(PIPE_WH2,dThk);
|
|
pXDataMap->SetAt(PIPE_WN2,dN);
|
|
}
|
|
}
|
|
|
|
double dL = 0.0,dB = 0.0;
|
|
if ( TDbPipeSupport::QueryCrossData(m_pADOServer,pParam->m_dDN,pParam->m_dDN,dL,dB, sODNo, sProject, sLevel) )
|
|
{
|
|
double dInterfaceL = 0.0;
|
|
pXDataMap->GetAt(PIPE_INTERFACEL,dInterfaceL);
|
|
|
|
if (dInterfaceL > 1.e-3)//法兰管
|
|
{
|
|
dL += dInterfaceL;
|
|
dB += dInterfaceL;
|
|
}
|
|
|
|
if ( nConnectType == 3)//法兰连接
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
dL -= dInterfaceL;
|
|
dB -= dInterfaceL;
|
|
|
|
//颈法兰焊接方式
|
|
if (sODNo.CompareNoCase(_T("S")) != 0 &&
|
|
sODNo.CompareNoCase(_T("GSF")) != 0)
|
|
{
|
|
dL += dThk;
|
|
dB += dThk;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
pXDataMap->SetAt(PIPE_DN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_OD,pParam->m_dOD);
|
|
|
|
pXDataMap->SetAt(PIPE_TDN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_TOD,pParam->m_dOD);
|
|
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
|
|
pXDataMap->SetAt(KEY_L,dL * 2);
|
|
pXDataMap->SetAt(KEY_T,dB * 2);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
bSuccesed = true;
|
|
}
|
|
break;
|
|
}
|
|
case eWye://对于 Wye 的三个接口尺寸一样
|
|
{
|
|
double dDN = 0.0,dTDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_DN,dDN);
|
|
pXDataMap->GetAt(PIPE_TDN,dTDN);
|
|
|
|
if ( nConnectType > 0)
|
|
{
|
|
double dFD = 0.0,dFL = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eWye, nConnectType,pParam->m_dDN,dFD,dFL, sODNo, sProject, sLevel);
|
|
|
|
pXDataMap->SetAt(PIPE_INTERFACED,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL,dFL);
|
|
|
|
pXDataMap->SetAt(PIPE_INTERFACED2,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL2,dFL);
|
|
|
|
if ( nConnectType == 3)
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
pXDataMap->SetAt(PIPE_WH2,dThk);
|
|
pXDataMap->SetAt(PIPE_WN2,dN);
|
|
pXDataMap->SetAt(PIPE_WH,dThk);
|
|
pXDataMap->SetAt(PIPE_WN,dN);
|
|
}
|
|
}
|
|
|
|
int nType = 0;
|
|
double dM = 0.0, dB = 0.0, dInsL = 0.0, dInfD = 0.0;
|
|
TDbPipeSupport::QueryWYeData(m_pADOServer, (int)(pParam->m_dDN + 0.5), dM, dB, dInsL, dInfD, 0, sProject, sLevel);
|
|
|
|
double dInterfaceL = 0.0;
|
|
pXDataMap->GetAt(PIPE_INTERFACEL,dInterfaceL);
|
|
|
|
if (dInterfaceL > 1.e-3)
|
|
{
|
|
dM += dInterfaceL;
|
|
dB += dInterfaceL;
|
|
}
|
|
|
|
if ( nConnectType == 3)//法兰连接
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer, (int)(pParam->m_dDN + 0.5),1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
//颈法兰焊接方式
|
|
if (sODNo.CompareNoCase(_T("S")) != 0 &&
|
|
sODNo.CompareNoCase(_T("GSF")) != 0)
|
|
{
|
|
dB += (dThk - dWh);
|
|
dM += (dThk - dWh);
|
|
}
|
|
|
|
}
|
|
|
|
pXDataMap->SetAt(PIPE_DN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_OD,pParam->m_dOD);
|
|
|
|
pXDataMap->SetAt(PIPE_TDN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_TOD,pParam->m_dOD);
|
|
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
|
|
pXDataMap->SetAt(PIPE_M,dM);
|
|
pXDataMap->SetAt(PIPE_B,dB);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
bSuccesed = true;
|
|
|
|
break;
|
|
}
|
|
case eLateral: //对于Lateral ,三个接口全改
|
|
{
|
|
if ( nConnectType > 0)
|
|
{
|
|
double dDN = 0.0,dTDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_DN,dDN);
|
|
pXDataMap->GetAt(PIPE_TDN,dTDN);
|
|
|
|
double dFD = 0.0,dFL = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eLateral, nConnectType,pParam->m_dDN,dFD,dFL, sODNo, sProject, sLevel);
|
|
|
|
pXDataMap->SetAt(PIPE_INTERFACED,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL,dFL);
|
|
pXDataMap->SetAt(PIPE_INTERFACED2,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL2,dFL);
|
|
|
|
if ( nConnectType == 3)
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
pXDataMap->SetAt(PIPE_WH2,dThk);
|
|
pXDataMap->SetAt(PIPE_WN2,dN);
|
|
pXDataMap->SetAt(PIPE_WH,dThk);
|
|
pXDataMap->SetAt(PIPE_WN,dN);
|
|
}
|
|
}
|
|
|
|
double dE = 0.0, dM = 0.0, dB = 0.0, dInsL = 0.0, dInfD = 0.0;
|
|
TDbPipeSupport::QueryLateralData(m_pADOServer, (int)(pParam->m_dDN+0.5), dE, dM, dB, dInsL, dInfD, 0, sProject, sLevel);
|
|
|
|
double dInterfaceL = 0.0;
|
|
pXDataMap->GetAt(PIPE_INTERFACEL,dInterfaceL);
|
|
|
|
if ( dInterfaceL > 1.e-3)
|
|
{
|
|
dE += dInterfaceL;
|
|
dM += dInterfaceL;
|
|
dB += dInterfaceL;
|
|
}
|
|
|
|
if ( nConnectType == 3)//法兰连接
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,(int)(pParam->m_dDN+0.5),1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
//颈法兰焊接方式
|
|
if (sODNo.CompareNoCase(_T("S")) != 0 &&
|
|
sODNo.CompareNoCase(_T("GSF")) != 0)
|
|
{
|
|
dE += (dThk - dWh);
|
|
dB += (dThk - dWh);
|
|
dM += (dThk - dWh);
|
|
}
|
|
|
|
}
|
|
|
|
pXDataMap->SetAt(PIPE_DN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_OD,pParam->m_dOD);
|
|
pXDataMap->SetAt(PIPE_TDN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_TOD,pParam->m_dOD);
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
|
|
pXDataMap->SetAt(PIPE_E,dE);
|
|
pXDataMap->SetAt(PIPE_M,dM);
|
|
pXDataMap->SetAt(PIPE_B,dB);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
bSuccesed = true;
|
|
|
|
break;
|
|
}
|
|
case eReduce:
|
|
{
|
|
double dL = 0.0;
|
|
pXDataMap->GetAt(KEY_Length,dL);
|
|
|
|
double dD = 0.0;
|
|
pXDataMap->GetAt(PIPE_D,dD);
|
|
|
|
double dDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_DN,dDN);
|
|
|
|
double dTDN = 0.0;
|
|
pXDataMap->GetAt(PIPE_EDN,dTDN);
|
|
|
|
//判断修改端
|
|
if ( fabs(m_paramOld.m_dDN - dDN) < 1.e-2)//
|
|
{
|
|
if ( fabs( pParam->m_dDN - dDN ) < 1.e-2)
|
|
{
|
|
acutPrintf(_T("\n分支管径等于主管径!修改管径取消!"));
|
|
return false;
|
|
}
|
|
|
|
//改主管,分支不变
|
|
if ( nConnectType > 0)//
|
|
{
|
|
double dFD = 0.0,dFL = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eReduce, nConnectType,pParam->m_dDN,dFD,dFL, sODNo, sProject, sLevel);
|
|
pXDataMap->SetAt(PIPE_INTERFACED2,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL2,dFL);
|
|
}
|
|
|
|
//长度单独设置
|
|
if (!TDbPipeSupport::QueryReduceData(m_pADOServer, nConnectType,(int)pParam->m_dDN, (int)dTDN, dL,pXDataMap,sODNo))
|
|
{
|
|
acutPrintf(_T("\n没有查到%d到%d的变径长度!变径变更失败!"), (int)pParam->m_dDN, (int)dTDN);
|
|
return false;
|
|
}
|
|
|
|
pParam->m_dInterfaceL3 = dL;
|
|
|
|
//记录修改前
|
|
AecInterface inf1;
|
|
pFitting->GetInterface(1,inf1);
|
|
|
|
pXDataMap->SetAt(KEY_Length,dL);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL3,dL);
|
|
pXDataMap->SetAt(PIPE_DN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_OD,pParam->m_dOD);
|
|
pXDataMap->SetAt(PIPE_D,pParam->m_dDN);
|
|
|
|
AcGeVector3d vtDir;
|
|
pXDataMap->GetAt(KEY_MAJBR,vtDir);
|
|
AcGePoint3d ptSta;
|
|
pXDataMap->GetAt(KEY_START,ptSta);
|
|
|
|
vtDir.normalize();
|
|
AcGePoint3d ptEnd = ptSta + pParam->m_dInterfaceL3 * vtDir;
|
|
if ( nConnectType == 3)//法兰连接
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD,dWh,dThk,dN);
|
|
|
|
double dWD2 = 0.0,dWh2 = 0.0,dThk2 = 0.0,dN2 = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,dTDN,1.0,dWD2,dWh2,dThk2,dN2);
|
|
|
|
//颈法兰焊接方式
|
|
if (sODNo.CompareNoCase(_T("S")) != 0 &&
|
|
sODNo.CompareNoCase(_T("GSF")) != 0)
|
|
{
|
|
ptEnd += (dThk2 + dThk) * vtDir;
|
|
}
|
|
|
|
pXDataMap->SetAt(PIPE_WN2,dN);
|
|
pXDataMap->SetAt(PIPE_WH2,dThk);
|
|
}
|
|
|
|
//是否偏移
|
|
double dOffset = (pParam->m_dDN - dTDN) / 2.0;
|
|
|
|
AcGeVector3d vtOffset;
|
|
pXDataMap->GetAt(KEY_OFFSET,vtOffset);
|
|
|
|
vtOffset.normalize();
|
|
vtOffset *= dOffset;
|
|
|
|
ptEnd += vtOffset;
|
|
pXDataMap->SetAt(KEY_END,ptEnd);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
//记录修改后
|
|
AecInterface inf11;
|
|
pFitting->GetInterface(1,inf11);
|
|
|
|
AecInterfaceFrTo infFt;
|
|
infFt.infFr = inf1;
|
|
infFt.infTo = inf11;
|
|
m_arFrTo.append(infFt);
|
|
}
|
|
else//主管不改,改分支
|
|
{
|
|
if ( fabs( pParam->m_dDN - dTDN ) < 1.e-2)
|
|
{
|
|
acutPrintf(_T("\n分支管径等于主管径!修改管径取消!"));
|
|
return false;
|
|
}
|
|
|
|
if ( nConnectType > 0)//
|
|
{
|
|
double dFD = 0.0,dFL = 0.0;
|
|
TDbPipeSupport::QueryInfFDFL(m_pADOServer,eReduce, nConnectType,pParam->m_dDN,dFD,dFL, sProject, sLevel);
|
|
pXDataMap->SetAt(PIPE_INTERFACED,dFD);
|
|
pXDataMap->SetAt(PIPE_INTERFACEL,dFL);
|
|
}
|
|
|
|
//长度单独设置
|
|
if (!TDbPipeSupport::QueryReduceData(m_pADOServer, nConnectType, dDN, (int)pParam->m_dDN, dL, pXDataMap,sODNo))
|
|
{
|
|
acutPrintf(_T("\n没有查到%d到%d的变径长度!变径变更失败!"), (int)pParam->m_dDN, (int)dTDN);
|
|
return false;
|
|
}
|
|
|
|
double dLx = 0, dSx = 0;
|
|
pXDataMap->GetAt(_T("H2"), dLx);
|
|
pXDataMap->GetAt(_T("H1"), dSx);
|
|
pParam->m_dInterfaceL3 = dL;
|
|
|
|
pXDataMap->SetAt(KEY_Length,dL);
|
|
pXDataMap->SetAt(PIPE_EDN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_EOD,pParam->m_dOD);
|
|
|
|
AcGeVector3d vtDir;
|
|
pXDataMap->GetAt(KEY_MAJBR,vtDir);
|
|
|
|
AcGePoint3d ptSta;
|
|
pXDataMap->GetAt(KEY_START,ptSta);
|
|
|
|
vtDir.normalize();
|
|
|
|
AcGePoint3d ptEnd = ptSta + (pParam->m_dInterfaceL3 + dLx + dSx) * vtDir;
|
|
if ( nConnectType == 3)//法兰连接
|
|
{
|
|
//[法兰外径],[法兰厚度],[法兰高度],[法兰颈]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,dDN,1.0,dWD,dWh,dThk,dN, sProject, sLevel,sODNo);
|
|
|
|
double dWD2 = 0.0,dWh2 = 0.0,dThk2 = 0.0,dN2 = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,pParam->m_dDN,1.0,dWD2,dWh2,dThk2,dN2, sProject, sLevel,sODNo);
|
|
|
|
//颈法兰焊接方式
|
|
//ptSta += dWh * vtDir;
|
|
if (sODNo.CompareNoCase(_T("S")) != 0 &&
|
|
sODNo.CompareNoCase(_T("GSF")) != 0)
|
|
{
|
|
ptEnd += (dThk2 + dThk) * vtDir;
|
|
}
|
|
|
|
pXDataMap->SetAt(PIPE_WN,dN2);
|
|
pXDataMap->SetAt(PIPE_WH,dThk2);
|
|
}
|
|
|
|
//是否偏移
|
|
|
|
double dOffset = (dDN - pParam->m_dDN) / 2.0;
|
|
|
|
AcGeVector3d vtOffset;
|
|
pXDataMap->GetAt(KEY_OFFSET,vtOffset);
|
|
|
|
vtOffset.normalize();
|
|
vtOffset *= dOffset;
|
|
|
|
ptEnd += vtOffset;
|
|
pXDataMap->SetAt(KEY_END,ptEnd);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
}
|
|
|
|
bSuccesed = true;
|
|
|
|
break;
|
|
}
|
|
case eWcap:
|
|
{
|
|
//全改
|
|
double dL = 0.0;
|
|
TDbPipeSupport::QueryCapData(m_pADOServer, pParam->m_dDN, dL,sODNo);
|
|
|
|
pXDataMap->SetAt(PIPE_DN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_OD,pParam->m_dOD);
|
|
pXDataMap->SetAt(PIPE_TDN,pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_TOD,pParam->m_dOD);
|
|
pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick);
|
|
pXDataMap->SetAt(KEY_L,dL);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
bSuccesed = true;
|
|
|
|
break;
|
|
}
|
|
case eFlxJoin:
|
|
{
|
|
TDbPipeSupport::QueryFlxJoinData(m_pADOServer, pParam->m_dDN, dPre, pXDataMap);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
bSuccesed = true;
|
|
break;
|
|
}
|
|
case eThrough://直通 PVC
|
|
case eUJoin://活接 PVC
|
|
case eRJoin://缩接 PVC 伸缩节
|
|
case eOJoin://外螺纹接头
|
|
case eIJoin://内螺纹接头
|
|
{
|
|
//全改
|
|
TDbPipeSupport::QueryPVCSpecFit(m_pADOServer, pParam->m_dDN, sODNo, eType, pXDataMap);
|
|
|
|
pXDataMap->SetAt(PIPE_DN, pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_OD, pParam->m_dOD);
|
|
pXDataMap->SetAt(PIPE_TDN, pParam->m_dDN);
|
|
pXDataMap->SetAt(PIPE_TOD, pParam->m_dOD);
|
|
pXDataMap->SetAt(PIPE_THICK, pParam->m_dThick);
|
|
|
|
pFitting->ReCreateDraw2d();
|
|
pFitting->ReCreateDraw3d();
|
|
|
|
bSuccesed = true;
|
|
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return bSuccesed;
|
|
}
|
|
|
|
AecDbEwFitting* AecPipeLineModify::CreateNewFlang(AecDbEwFitting* pFitFr,const WPipe::PipeParam& paramNew)
|
|
{
|
|
AecDbEwFitting* pFlange = new AecDbEwFitting;
|
|
AecDbObjXDataMap* pXDataMapF = pFlange->GetSpecialtyData();
|
|
|
|
pFlange->copyFrom(pFitFr);
|
|
|
|
double dPre = 1.0;
|
|
|
|
WPipe::PipeParam* pParam = (WPipe::PipeParam*)¶mNew;
|
|
CString sODNo = _T("A");
|
|
bool bIsPvc = TDbPipeLine::IsPlasticsMat(pParam, sODNo);
|
|
|
|
CString sPre;
|
|
pFitFr->GetSpecialtyData()->GetAt(PIPE_PRESSURE,sPre);
|
|
dPre = _ttof(sPre);
|
|
|
|
CString sProject;
|
|
pFitFr->GetSpecialtyData()->GetAt(DOC_PROJECT, sProject);
|
|
|
|
CString sLevel;
|
|
pFitFr->GetSpecialtyData()->GetAt(PIPE_LEVEL, sLevel);
|
|
|
|
//[法兰外径],[法兰厚度],[法兰高度]
|
|
double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0;
|
|
TDbPipeSupport::QueryFlangData(m_pADOServer,paramNew.m_dDN,dPre,dWD,dWh,dThk,dN, sProject, sLevel, sODNo);
|
|
|
|
pXDataMapF->SetAt(PIPE_DN,paramNew.m_dDN);
|
|
pXDataMapF->SetAt(PIPE_N,dN);
|
|
pXDataMapF->SetAt(PIPE_OD,paramNew.m_dOD);
|
|
pXDataMapF->SetAt(PIPE_WD,dWD); //发兰盘外径
|
|
pXDataMapF->SetAt(PIPE_WTHICK,dWh); //大盘面厚度
|
|
//pXDataMapF->SetAt(PIPE_THICK,dThk);//总厚
|
|
pXDataMapF->SetAt(PIPE_THICK, dWh); // 管线上的法兰不画法兰颈
|
|
|
|
return pFlange;
|
|
}
|
|
|
|
bool AecPipeLineModify::ModifyByInfAssoc(const AcArray<AecInterface>& arFitEquOldInfs,AecMInterfaces* pFitEquMInfNew,const WPipe::PipeParam& paramNew)
|
|
{
|
|
//从 m_arNetIds 找
|
|
//移除一个,去除一个
|
|
//一直到inf锁定为止
|
|
//arFitEquOldInfs 和 pFitEquMInfNew 一一对应
|
|
|
|
AcArray<AecInterface> arNewInfs;
|
|
pFitEquMInfNew->GetInterface(arNewInfs);
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
AecMInterfaces* pMInfMeetWith = NULL;
|
|
|
|
for (int i = 0;i < m_arNetIds.length();i++)
|
|
{
|
|
pMInfMeetWith = NULL;
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,m_arNetIds.at(i),AcDb::kForRead))
|
|
{
|
|
AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt);
|
|
if (pPipe != NULL)
|
|
{
|
|
pMInfMeetWith = static_cast<AecMInterfaces*>(pPipe);
|
|
}
|
|
|
|
if (pMInfMeetWith != NULL)
|
|
{
|
|
AcGeVector3d vtDir,vtDir2;
|
|
AcGePoint3d ptS,ptE,ptNew;
|
|
AecInterface infOn,infNew;
|
|
|
|
for (int j = 0;j < arFitEquOldInfs.length();j++)
|
|
{
|
|
const AecInterface& inf = arFitEquOldInfs.at(j);
|
|
|
|
if (pMInfMeetWith->GetInterface(inf.ptPos,infOn))
|
|
{
|
|
//碰上此接口
|
|
if (pPipe != NULL)
|
|
{
|
|
pPipe->upgradeOpen();
|
|
|
|
//改管子的长度
|
|
ptS = pPipe->StartPoint();
|
|
ptE = pPipe->EndPoint();
|
|
vtDir = ptE - ptS;
|
|
|
|
if (ptS.distanceTo(infOn.ptPos) < 1.e-2)//误差0.01
|
|
{
|
|
pFitEquMInfNew->GetInterface(j,infNew);
|
|
|
|
vtDir2 = ptE - infNew.ptPos;
|
|
if (!vtDir2.isCodirectionalTo(vtDir))
|
|
{
|
|
pEnt->close();
|
|
acutPrintf(_T("管线尺寸变更幅度过大!产生管线错位!变更失败!"));
|
|
return false;
|
|
}
|
|
|
|
pPipe->SetStartPoint( infNew.ptPos );
|
|
}
|
|
|
|
if (ptE.distanceTo(infOn.ptPos) < 1.e-2)
|
|
{
|
|
pFitEquMInfNew->GetInterface(j,infNew);
|
|
|
|
vtDir2 = infNew.ptPos - ptS;
|
|
if ( !vtDir2.isCodirectionalTo(vtDir) )
|
|
{
|
|
pEnt->close();
|
|
acutPrintf(_T("管线尺寸变更幅度过大!产生管线错位!变更失败!"));
|
|
return false;
|
|
}
|
|
|
|
pPipe->SetEndPoint( infNew.ptPos );
|
|
}
|
|
|
|
pPipe->downgradeOpen();
|
|
}
|
|
|
|
//对fit 无效,导致回溯
|
|
/*AecDbEwFitting* pFit = AecDbEwFitting::cast(pEnt);
|
|
if (pFit != NULL)
|
|
{
|
|
}*/
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
extern AecDbEwEquipment *startForPipeValve(LPCTSTR type
|
|
, LPCTSTR title
|
|
, const double &dn
|
|
, const double &pn
|
|
, bool &bHasFlange
|
|
, const int &idx = 0
|
|
, const AecDbObjXDataMap *pSrcData = NULL);
|
|
|
|
AecDbEwEquipment* AecPipeLineModify::getEquiment( AecDbEwEquipment *pOldEqu
|
|
, const WPipe::PipeParam ¶mNew
|
|
, bool &bHasFangle
|
|
, AecEqui::ValveType val
|
|
, LPCTSTR psz/* = NULL*/
|
|
, LPCTSTR pszFolder/* = NULL*/)
|
|
{
|
|
if (!pOldEqu) return NULL;
|
|
int bParaValve(false);
|
|
pOldEqu->GetAt(_T("_parameter_equ_"), bParaValve);
|
|
|
|
AecDbEwEquipment *pEqu(NULL);
|
|
if (!bParaValve)
|
|
{
|
|
if (!psz || !pszFolder) return NULL;
|
|
|
|
bool b2DFlagCheck(false);
|
|
pEqu = CEquipmentLibraryDlg::selectCustomValve(
|
|
psz
|
|
, paramNew.m_dDN
|
|
, bHasFangle
|
|
, true
|
|
, bHasFangle
|
|
, b2DFlagCheck);
|
|
|
|
if (!pEqu) return NULL;
|
|
pEqu->SetAt(PIPE_VALVE, val);
|
|
pEqu->SetAt(KEY_SUBRUNTIME, eValve);
|
|
pEqu->SetAt(KEY_VLV2D, TRUE);
|
|
pEqu->SetAt(PIPE_LEVEL, paramNew.szLevel);
|
|
}
|
|
else // 参数化
|
|
{
|
|
pEqu = startForPipeValve(psz
|
|
, CString(_T("插入")) + psz
|
|
, paramNew.m_dDN
|
|
, paramNew.m_dPress
|
|
, bHasFangle
|
|
, 0
|
|
, pOldEqu->GetSpecialtyData());
|
|
if (pEqu)
|
|
{
|
|
pEqu->SetAt(PIPE_VALVE, val);
|
|
pEqu->SetAt(KEY_SUBRUNTIME, eValve);
|
|
pEqu->SetAt(KEY_VLV2D, TRUE);
|
|
}
|
|
}
|
|
return pEqu;
|
|
}
|
|
|
|
extern int g_nVlvLen;
|
|
extern AecEqui::VlvType g_vlvType[];
|
|
|
|
typedef AcArray<AcGeMatrix3d> AcGeMatrix3dArray;
|
|
AecDbEwEquipment* AecPipeLineModify::CreateNewValve(AecDbEwEquipment* pEqu,const WPipe::PipeParam& paramNew)
|
|
{
|
|
if (pEqu != NULL)
|
|
{
|
|
AcGePoint3d ptIns;
|
|
AcGeVector3d vtDir;
|
|
AecInterface infOld,infNew,infNew1;
|
|
|
|
pEqu->GetInsert(ptIns,vtDir);
|
|
|
|
pEqu->GetInterface(0,infOld);
|
|
|
|
AcGeMatrix3dArray arMatrix;
|
|
pEqu->GetAllAddTransforms(arMatrix);
|
|
|
|
pEqu->SetDashLayer(PipelineTools::AecInitLayerEx(LAY_FITN_DASH, 8, _T("DASH"), NULL));
|
|
pEqu->SetCenterLayer(PipelineTools::AecInitLayerEx(LAY_FITN_CENTER, 4, _T("Center2"), NULL));
|
|
|
|
CString sName;
|
|
int nVal = 0;
|
|
pEqu->GetSpecialtyData()->GetAt(PIPE_VALVE, nVal);
|
|
|
|
AecEqui::ValveType eVlvType = (AecEqui::ValveType)nVal;
|
|
|
|
for (int i = 0; i < g_nVlvLen; i++)
|
|
{
|
|
if ( (int)g_vlvType[i].eType == nVal)
|
|
{
|
|
sName = g_vlvType[i].szNameCn;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//通过sName,dNewDN查新的阀门
|
|
if (m_pADOServer != NULL)
|
|
{
|
|
int bParaValve(false);
|
|
pEqu->GetAt(_T("_parameter_equ_"), bParaValve);
|
|
bool bHasFangle = false;
|
|
AecDbEwEquipment* pEquNew = getEquiment(pEqu
|
|
, paramNew
|
|
, bHasFangle
|
|
, eVlvType
|
|
, sName
|
|
, VALVE_FOLDER);
|
|
|
|
if (pEquNew != NULL)
|
|
{
|
|
//立管是否转动方向
|
|
pEquNew->SetVert(pEqu->IsVert());
|
|
pEquNew->SetInsert(ptIns,vtDir);
|
|
for (int i = 0;i < arMatrix.length();i++)
|
|
{
|
|
pEquNew->AddTransform(arMatrix.at(i));
|
|
}
|
|
|
|
pEquNew->GetInterface(0,infNew);
|
|
|
|
//接口中心校正,并且必须是第一接口情况
|
|
if (infOld.vtDir.isParallelTo(infNew.vtDir))
|
|
{
|
|
if (!infOld.vtDir.isCodirectionalTo(infNew.vtDir))
|
|
{
|
|
pEquNew->GetInterface(1,infNew);
|
|
}
|
|
}
|
|
|
|
// 此处不需要调整,在外部调用已经调整 2025-4-3
|
|
// AcGeVector3d vt = infOld.ptPos - infNew.ptPos;
|
|
// if (!vt.isZeroLength())
|
|
// {
|
|
// //平移等标高
|
|
// AcGeMatrix3d xform;
|
|
// xform.setToTranslation(vt);
|
|
// pEquNew->AddTransform(vt);
|
|
// }
|
|
|
|
//验证测试
|
|
pEquNew->GetInterface(0,infNew);
|
|
pEquNew->GetInterface(1,infNew1);
|
|
|
|
pEquNew->setLayer(pEqu->layerId());
|
|
pEquNew->setLinetype(pEqu->linetypeId());
|
|
|
|
AcDbObjectId idDsh;
|
|
pEqu->GetDashLayer(idDsh);
|
|
pEquNew->SetDashLayer(idDsh);
|
|
|
|
AcDbObjectId idCen;
|
|
pEqu->GetCenterLayer(idCen);
|
|
pEquNew->SetCenterLayer(idCen);
|
|
|
|
return pEquNew;
|
|
}
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
bool AecPipeLineModify::ModifyPipeOnParam(const AcDbObjectIdArray& arPipeIds,const WPipe::PipeParam& paramNew)
|
|
{
|
|
AcDbEntity* pEnt = NULL;
|
|
for(int i = 0;i < arPipeIds.length();i++)
|
|
{
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,arPipeIds.at(i),AcDb::kForWrite))
|
|
{
|
|
AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt);
|
|
if (pPipe != NULL)
|
|
{
|
|
//公称 外径 壁厚 压了等级,曲率半径
|
|
WPipe::PipeParam* pParam = pPipe->GetPipeParam();
|
|
|
|
//覆盖为新的参数
|
|
pParam->m_dDN = paramNew.m_dDN;
|
|
pParam->m_dOD = paramNew.m_dOD;
|
|
_tcscpy(pParam->szODSn, paramNew.szODSn);
|
|
_tcscpy(pParam->szStdNo, paramNew.szStdNo);
|
|
|
|
switch (pParam->m_eD)
|
|
{
|
|
case WPipe::eOD:
|
|
{
|
|
pParam->m_dD = paramNew.m_dOD;
|
|
break;
|
|
}
|
|
case WPipe::eDN:
|
|
{
|
|
pParam->m_dD = paramNew.m_dDN;
|
|
break;
|
|
}
|
|
case WPipe::eID:
|
|
{
|
|
pParam->m_dD = paramNew.m_dOD - 2.0 * paramNew.m_dThick;
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
pParam->m_dThick = paramNew.m_dThick;
|
|
_tcscpy(pParam->szLevel,paramNew.szLevel);
|
|
pParam->m_dRRatio = paramNew.m_dRRatio;
|
|
|
|
if (_tcslen(paramNew.szMertial) > 0)
|
|
_tcscpy(pParam->szMertial, paramNew.szMertial);
|
|
|
|
if (pParam->m_nConnectType == 3)
|
|
{
|
|
pParam->m_dInterfaceL = paramNew.m_dInterfaceL;
|
|
pParam->m_dInterfaceD = paramNew.m_dInterfaceD;
|
|
}
|
|
|
|
if (m_bUpdateMat)
|
|
{
|
|
_tcscpy(pParam->szMertial,paramNew.szMertial);
|
|
_tcscpy(pParam->szMertialFit,paramNew.szMertialFit);
|
|
_tcscpy(pParam->szSys, paramNew.szSys);
|
|
|
|
pPipe->GetSpecialtyData()->SetAt(PIPE_COLOR, paramNew.m_nPipeColor);
|
|
|
|
//设置图层
|
|
TDbPipeLine::SetPipeLayer(pPipe, paramNew.szSys);
|
|
}
|
|
|
|
pPipe->SetPipeParam(pParam);
|
|
|
|
delete pParam;
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool AecPipeLineModify::AddjustTInfAssoc()
|
|
{
|
|
//主要是管子
|
|
if (!m_arFrTo.isEmpty())
|
|
{
|
|
//选择管线,管件
|
|
struct resbuf* pRb = acutBuildList(RTDXF0, DXF_PIPE_ONLY, 0);
|
|
|
|
ads_name ss,ent;
|
|
acedSSGet(_T("A"),NULL,NULL,pRb,ss);
|
|
|
|
Adesk::Int32 nLen = 0;
|
|
acedSSLength(ss,&nLen);
|
|
|
|
AcGePoint3d ptS,ptE;
|
|
|
|
AcDbObjectId id;
|
|
AcDbEntity* pEnt = NULL;
|
|
|
|
for (int i = 0;i < nLen;i++)
|
|
{
|
|
if (m_arFrTo.isEmpty())
|
|
{
|
|
break;
|
|
}
|
|
|
|
acedSSName(ss,i,ent);
|
|
acdbGetObjectId(id,ent);
|
|
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt);
|
|
if (pPipe != NULL)
|
|
{
|
|
ptS = pPipe->StartPoint();
|
|
ptE = pPipe->EndPoint();
|
|
|
|
for (int k = 0;k < m_arFrTo.length();k++)
|
|
{
|
|
AecInterfaceFrTo& infFrTo = m_arFrTo.at(k);
|
|
if (infFrTo.infFr.ptPos.distanceTo(ptS) < 1.e-3 )
|
|
{
|
|
pPipe->upgradeOpen();
|
|
pPipe->SetStartPoint(infFrTo.infTo.ptPos);
|
|
pPipe->downgradeOpen();
|
|
m_arFrTo.removeAt(k);
|
|
k -= 1;
|
|
break;
|
|
}
|
|
|
|
if (infFrTo.infFr.ptPos.distanceTo(ptE) < 1.e-3)
|
|
{
|
|
pPipe->upgradeOpen();
|
|
pPipe->SetEndPoint(infFrTo.infTo.ptPos);
|
|
pPipe->downgradeOpen();
|
|
m_arFrTo.removeAt(k);
|
|
k -= 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
acedSSFree(ss);
|
|
acutRelRb(pRb);
|
|
}
|
|
return true;
|
|
} |