3144 lines
83 KiB
C++
3144 lines
83 KiB
C++
#include "stdafx.h"
|
|
#include "AecDbECableLine.h"
|
|
#include "AecDbECableTray.h"
|
|
#include "AecDbEcFitting.h"
|
|
#include "AecAngleWatch.h"
|
|
#include "AecDbECableJig.h"
|
|
#include "AECStatusRecord.h"
|
|
#include "KTSetting.h"
|
|
#include "CoreTools.h"
|
|
#include "AecDbEwEquipment.h"
|
|
#include "CablelineTools.h"
|
|
#include "AecDbX3dPartEntity.h"
|
|
#include "CWTXXDlg.h"
|
|
|
|
CMapStringToString *g_pMapData = NULL;
|
|
extern AcGePoint3d MidPoint(const AcGePoint3d& pt1,const AcGePoint3d& pt2);
|
|
|
|
double AsDNUnit(double dVal)
|
|
{
|
|
struct resbuf rb;
|
|
acedGetVar(_T("INSUNITS"), &rb);
|
|
if (rb.resval.rint == AcDb::kUnitsMeters)
|
|
{
|
|
dVal *= 0.001;
|
|
}
|
|
return dVal;
|
|
}
|
|
|
|
double GetElbowL(AecHvac::DuctParam* pParam)
|
|
{
|
|
double dL = 0.0;
|
|
if (pParam->eType == eCircle)
|
|
dL = pParam->dSize[0];
|
|
|
|
double dD = __max(pParam->dSize[3], pParam->dSize[0]);
|
|
|
|
double dRatio = pParam->m_dRatio;
|
|
double dLx = (int)(dRatio * dD / 3.0 + 0.5);//默认50
|
|
if (dLx > AsDNUnit(50.0))
|
|
dLx = AsDNUnit(50.0);
|
|
dL = dRatio * dD + dLx;
|
|
return dL;
|
|
}
|
|
|
|
double GetElbowLx(AecHvac::DuctParam* pParam)
|
|
{
|
|
double dD = __max(pParam->dSize[3], pParam->dSize[0]);
|
|
|
|
double dRatio = pParam->m_dRatio;
|
|
double dLx = (int)(dRatio * dD / 3.0 + 0.5);//默认50
|
|
if (dLx > AsDNUnit(50.0))
|
|
dLx = AsDNUnit(50.0);
|
|
|
|
if (pParam->eType == eCircle)
|
|
dLx = AsDNUnit(50.0);
|
|
|
|
return dLx;
|
|
}
|
|
|
|
static AcDbObjectId GetConnectObject(const AecInterface &intf, const CArray<AecInterface> &arr)
|
|
{
|
|
for (int i = 0; i < arr.GetSize(); ++i)
|
|
{
|
|
const AecInterface &ff(arr[i]);
|
|
if (intf.ptPos == ff.ptPos && intf.idOwner != ff.idOwner) return ff.idOwner;
|
|
}
|
|
return AcDbObjectId::kNull;
|
|
}
|
|
|
|
typedef struct PointParam
|
|
{
|
|
AcGePoint3d ptOn;
|
|
double dParam;
|
|
}POINTPARAM;
|
|
|
|
static bool ComparePtparam(PointParam ptParam1,PointParam ptParam2)
|
|
{
|
|
if (ptParam1.dParam - ptParam2.dParam < 1.e-10)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void SortPoints(AcGePoint3dArray& points,AcDbCurve* pLine)
|
|
{
|
|
PointParam ptParam;
|
|
std::vector<PointParam> points2;
|
|
|
|
for (int i = 0;i < points.length();i++)
|
|
{
|
|
ptParam.ptOn = points.at(i);
|
|
pLine->getParamAtPoint(points.at(i),ptParam.dParam);
|
|
points2.push_back(ptParam);
|
|
}
|
|
std::sort(points2.begin(),points2.end(),ComparePtparam);
|
|
|
|
points.setLogicalLength(0);
|
|
std::vector<PointParam>::iterator it;
|
|
for (it = points2.begin(); it < points2.end(); it++)
|
|
{
|
|
points.append((*it).ptOn);
|
|
}
|
|
}
|
|
|
|
AecDbECableLine::AecDbECableLine()
|
|
{
|
|
m_pAngleWatch = NULL;
|
|
m_pPipeJig = NULL;
|
|
m_pPipeParam = NULL;
|
|
m_pCurPipeLine[0] = NULL;
|
|
m_pCurPipeLine[1] = NULL;
|
|
m_bStopCommand = FALSE;
|
|
m_idStartDragFrom = AcDbObjectId::kNull;
|
|
m_bHasFit = true;
|
|
memset(&m_lHolder, 0, sizeof(XHolder));
|
|
memset(&m_rHolder, 0, sizeof(XHolder));
|
|
m_bHasHolder = FALSE;
|
|
}
|
|
|
|
AecDbECableLine::AecDbECableLine(AecDbECableJig* pJig)
|
|
{
|
|
m_pAngleWatch = new AecAngleWatch;
|
|
m_pPipeJig = pJig;
|
|
m_pPipeParam = NULL;
|
|
m_pCurPipeLine[0] = NULL;
|
|
m_pCurPipeLine[1] = NULL;
|
|
m_bStopCommand = FALSE;
|
|
m_idStartDragFrom = AcDbObjectId::kNull;
|
|
m_bHasFit = true;
|
|
memset(&m_lHolder, 0, sizeof(XHolder));
|
|
memset(&m_rHolder, 0, sizeof(XHolder));
|
|
m_bHasHolder = FALSE;
|
|
}
|
|
|
|
AecDbECableLine::~AecDbECableLine(void)
|
|
{
|
|
if ( m_pAngleWatch != NULL)
|
|
DELETE_PTR(m_pAngleWatch);
|
|
|
|
if (m_pPipeParam)
|
|
delete m_pPipeParam;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbECableLine::Draw2d(AcGiDraw &mode) const
|
|
{
|
|
if (m_pCurPipeLine[0] != NULL )
|
|
{
|
|
((AecDbECableLine*)(m_pCurPipeLine[0]))->Draw2d(mode);
|
|
}
|
|
if (m_pAngleWatch != NULL && m_pCurPipeLine[0] != NULL)
|
|
{
|
|
m_pAngleWatch->Draw2d(mode);
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
void AecDbECableLine::SetPipeParam(AecHvac::DuctParam* pPipePar)
|
|
{
|
|
if (m_pPipeParam == NULL)
|
|
m_pPipeParam = new AecHvac::DuctParam;
|
|
|
|
memcpy(m_pPipeParam,pPipePar,sizeof(AecHvac::DuctParam));
|
|
}
|
|
|
|
AecHvac::DuctParam* AecDbECableLine::GetPipeParam()
|
|
{
|
|
return m_pPipeParam;
|
|
}
|
|
|
|
void AecDbECableLine::SetXHolder(const XHolder &lHolder, const XHolder &rHolder)
|
|
{
|
|
memcpy(&m_lHolder, &lHolder, sizeof(XHolder));
|
|
memcpy(&m_rHolder, &rHolder, sizeof(XHolder));
|
|
m_bHasHolder = TRUE;
|
|
}
|
|
|
|
AecInterface* AecDbECableLine::GetLastInterface()
|
|
{
|
|
int nLen = m_arHistoryIntfs.GetSize();
|
|
if (nLen > 0)
|
|
{
|
|
AecInterface& intf = m_arHistoryIntfs[nLen - 1];
|
|
return &intf;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
double AecDbECableLine::GetEndElevation() const
|
|
{
|
|
return m_pPipeParam->m_dEl;
|
|
}
|
|
|
|
void AecDbECableLine::SetElbowAndPipe(bool bHasFit)
|
|
{
|
|
m_bHasFit = bHasFit;
|
|
}
|
|
|
|
BOOL AecDbECableLine::AddPipeNode(AECStatusRecord* pRec ,WPipe::PipeDraw ePipe )
|
|
{
|
|
switch(ePipe)
|
|
{
|
|
case WPipe::eToPreView:
|
|
{
|
|
//预览
|
|
if (m_pCurPipeLine[0] == NULL)
|
|
m_pCurPipeLine[0] = new AecDbECableTray;
|
|
|
|
AecDbECableTray* pWpipe = (AecDbECableTray*)m_pCurPipeLine[0];
|
|
AecDbObjXDataMap* pXDataMap = pWpipe->GetSpecialtyData();
|
|
|
|
pWpipe->SetDuctParam(m_pPipeParam);
|
|
pWpipe->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pWpipe->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
|
|
AcGePoint3d ptGe,ptGe1,ptGe2;
|
|
ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint();
|
|
ptGe1 = pRec->GetAcquirePoint();
|
|
|
|
//第一次对齐即可
|
|
BOOL bAdjust3d = FALSE;
|
|
AcGeVector3d vtAg(0,0,0);
|
|
if (m_arHistoryIntfs.GetSize() == 0)
|
|
{
|
|
bAdjust3d = TRUE;
|
|
vtAg = ptGe1 - ptGe;
|
|
vtAg.normalize();
|
|
|
|
switch(m_pPipeParam->m_nAlign)
|
|
{
|
|
case 0://底部左
|
|
{
|
|
vtAg.rotateBy(-PI / 2.0,AcGeVector3d::kZAxis);
|
|
vtAg *= 0.5 * m_pPipeParam->dSize[0];
|
|
break;
|
|
}
|
|
case 1://底部中
|
|
{
|
|
vtAg.set(0,0,0);
|
|
break;
|
|
}
|
|
case 2://底部右
|
|
{
|
|
vtAg.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
vtAg *= 0.5 * m_pPipeParam->dSize[0];
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
ptGe += vtAg;
|
|
ptGe1 += vtAg;
|
|
}
|
|
|
|
pWpipe->SetStartPoint( ptGe );
|
|
pWpipe->SetEndPoint( ptGe1 );
|
|
|
|
if (bAdjust3d)
|
|
{
|
|
ptGe1 -= vtAg;
|
|
}
|
|
|
|
//水平桥架
|
|
AcGeVector3d vtDir = AcGeVector3d::kXAxis;
|
|
vtDir = m_pAngleWatch->m_vtDir;
|
|
|
|
AcGeVector3d vtWDir = vtDir;
|
|
vtWDir.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
|
|
AcGeVector3d vtNorm = vtDir.crossProduct(vtWDir);
|
|
pWpipe->GetSpecialtyData()->SetAt(KEY_NORMAL,vtNorm);
|
|
|
|
m_pAngleWatch->m_bFallInSnap = FALSE;
|
|
m_pAngleWatch->snapWatch(ptGe,ptGe1,vtDir);
|
|
pRec->SetAcquirePoint(ptGe1);
|
|
m_pAngleWatch->m_bFallInSnap = TRUE;
|
|
|
|
break;
|
|
}
|
|
case WPipe::eToCreate:
|
|
{
|
|
AcGePoint3d ptGe,ptGe1;
|
|
ptGe1 = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint();
|
|
ptGe = pRec->GetAcquirePoint();
|
|
|
|
//判断方向是否一致
|
|
int nLen = m_arHistoryIntfs.GetSize();
|
|
if (nLen == 0)
|
|
{
|
|
//第一次创建
|
|
CreateWPipe(pRec,TRUE); //考虑首尾三通
|
|
}
|
|
else
|
|
{
|
|
AecInterface tInf = m_arHistoryIntfs[nLen - 1];
|
|
AcGeVector3d vtDir1 = tInf.vtDir;
|
|
|
|
AcGeVector3d vtDir2 = ptGe - ptGe1;
|
|
if (vtDir2.isParallelTo(vtDir1)) //平行,和上次同向,连续画
|
|
{
|
|
if ( !ExtendLastWPipe(pRec) )
|
|
{
|
|
CreateWPipe(pRec,FALSE);
|
|
}
|
|
}
|
|
else //添加弯头过渡
|
|
{
|
|
if (m_bHasFit)
|
|
{
|
|
EFittingType type(eElbow);
|
|
CreateElbowAndPipe(pRec, type);
|
|
m_pPipeParam->m_dEl = pRec->GetAcquirePoint().z;//4-24
|
|
}
|
|
else
|
|
{
|
|
CreateWPipe(pRec, FALSE);
|
|
}
|
|
}
|
|
}
|
|
|
|
AcGeVector3d vtDir = AcGeVector3d::kXAxis;
|
|
vtDir = m_pAngleWatch->m_vtDir;
|
|
ptGe1.z = m_pPipeParam->m_dEl;
|
|
ptGe.z = m_pPipeParam->m_dEl;
|
|
|
|
m_pAngleWatch->m_bFallInSnap = FALSE;
|
|
m_pAngleWatch->snapWatch(ptGe1,ptGe,vtDir);
|
|
m_pAngleWatch->m_bFallInSnap = TRUE;
|
|
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::AddReducer(AECStatusRecord* pCurStaRec,AecHvac::DuctParam* pParam)
|
|
{
|
|
AecDbEcFitting* pFit = new AecDbEcFitting;
|
|
AecDbObjXDataMap* pXDataMap = pFit->GetSpecialtyData();
|
|
|
|
AcGeVector3d vtDir = AcGeVector3d::kXAxis;
|
|
AecInterface* pIntf = GetLastInterface();
|
|
if (pIntf != NULL)
|
|
{
|
|
vtDir = pIntf->vtDir;
|
|
}
|
|
|
|
vtDir.normalize();
|
|
AcGePoint3d ptSta = pIntf->ptPos;
|
|
AcGePoint3d ptEnd = ptSta + vtDir * pParam->m_dL;
|
|
|
|
AcGeVector3d vtNorm = pParam->m_vtNrom;
|
|
|
|
pParam->dSize[3] = m_pPipeParam->dSize[0];
|
|
|
|
//电缆沟设置分支
|
|
pParam->dSize[12] = pParam->dSize[4];
|
|
pParam->dSize[13] = pParam->dSize[5];
|
|
pParam->dSize[14] = pParam->dSize[6];
|
|
pParam->dSize[15] = pParam->dSize[7];
|
|
pParam->dSize[16] = pParam->dSize[8];
|
|
pParam->dSize[17] = pParam->dSize[9];
|
|
pParam->dSize[18] = pParam->dSize[10];
|
|
|
|
pFit->SetDuctParam(*pParam);
|
|
|
|
if (pParam->m_app == WPipe::eTrench && m_bHasHolder)
|
|
{
|
|
pFit->SetXHolder(kLeft, m_lHolder);
|
|
pFit->SetXHolder(kRight, m_rHolder);
|
|
}
|
|
|
|
pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eReduce);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtDir);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtDir);
|
|
|
|
AcGePoint3d ptMid = MidPoint(ptSta,ptEnd);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, pParam->m_dRatio);
|
|
pFit->GetSpecialtyData()->SetAt(PIPE_THICK, pParam->dSize[2]);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_LX, 0.0);//没有直边长度
|
|
|
|
//是否偏移
|
|
pFit->GetSpecialtyData()->SetAt(KEY_ECCEN,pParam->m_nEcCen);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_NORMAL,vtNorm);
|
|
|
|
if (pParam->m_nEcCen != 0)
|
|
{
|
|
AecInterface inf1;
|
|
pFit->GetInterface(1,inf1);
|
|
ptEnd = inf1.ptPos;
|
|
}
|
|
|
|
if (pParam->m_app == WPipe::eTrench && m_bHasHolder)
|
|
{
|
|
pFit->SetXHolder(kLeft, m_lHolder);
|
|
pFit->SetXHolder(kRight, m_rHolder);
|
|
}
|
|
|
|
//设置图层
|
|
|
|
AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN,m_pPipeParam->szSys,4,_T("center2"),NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT,m_pPipeParam->szSys,nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG,m_pPipeParam->szSys,7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"),NULL);
|
|
|
|
pFit->setLayer(idOutLay);
|
|
pFit->SetDoubleLayer(idOutLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
|
|
AcDbObjectId id = CoreTools::AddToModelSpace(pFit);
|
|
|
|
AddUserData(id,pXDataMap,5);
|
|
|
|
AecInterface intf;
|
|
intf.ptPos = ptEnd;
|
|
intf.vtDir = vtDir;
|
|
intf.idOwner = id;
|
|
PushInterface(intf);
|
|
|
|
//覆盖当前的param
|
|
PushPipeParam();
|
|
|
|
memcpy(m_pPipeParam,pParam,sizeof(AecHvac::DuctParam));//回退
|
|
|
|
//创建余下管子,并插入虚拟状态记录
|
|
AECStatusRecord* pRecMid = new AECStatusRecord;
|
|
pRecMid->CopyFrom(pCurStaRec);
|
|
pRecMid->SetAcquirePoint(ptEnd);
|
|
m_pPipeJig->PushBackStatusRec(pRecMid);
|
|
pCurStaRec->SetAcquirePoint(ptEnd);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
AcDbObjectId AecDbECableLine::CreateElbow(AcGeVector3d vtMaj
|
|
,AcGePoint3d ptMid
|
|
,AcGeVector3d vtMin
|
|
,AecHvac::DuctParam* pparam
|
|
,BOOL bInsertBeforLast/* = FALSE*/)
|
|
{
|
|
AecDbEcFitting* pFit = new AecDbEcFitting;
|
|
AecDbObjXDataMap* pXDataMap = pFit->GetSpecialtyData();
|
|
|
|
//图层
|
|
//设置图层
|
|
AecHvac::DuctParam *pParam = pparam;
|
|
AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
|
|
pFit->setLayer(idOutLay);
|
|
pFit->SetDoubleLayer(idOutLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
|
|
pFit->SetDuctParam(*pparam);
|
|
|
|
double dLx = GetElbowLx(pparam);
|
|
double dL = GetElbowL(pparam);
|
|
double dRatio = pparam->m_dRatio;
|
|
|
|
bool bIsLastInfParamFit = false;
|
|
if (m_pPipeParam != NULL)
|
|
{
|
|
if (fabs(m_pPipeParam->dSize[0] - pparam->dSize[0]) < 1.e-6 && //D W
|
|
fabs(m_pPipeParam->dSize[1] - pparam->dSize[1]) < 1.e-6 && //H
|
|
fabs(m_pPipeParam->dSize[2] - pparam->dSize[2]) < 1.e-6) //t
|
|
{
|
|
bIsLastInfParamFit = true;
|
|
}
|
|
}
|
|
|
|
if (!bIsLastInfParamFit)//不一致
|
|
{
|
|
//m_pPipeParam param2
|
|
AecHvac::DuctParam *pLParam = pparam;//param1
|
|
if (!m_lstLastPipeParam.IsEmpty())
|
|
pLParam = (AecHvac::DuctParam *)m_lstLastPipeParam.GetTail();
|
|
|
|
//电缆沟设置分支
|
|
//产生非等径弯头!
|
|
AecHvac::DuctParam param;
|
|
memcpy(¶m, pparam, sizeof(AecHvac::DuctParam));
|
|
|
|
//分支 但是高度必须相等!
|
|
param.dSize[3] = pLParam->dSize[0];
|
|
|
|
//高度必须相等!
|
|
if (fabs(param.dSize[1] - pLParam->dSize[1]) < 1.e-6)
|
|
{
|
|
//电缆沟
|
|
param.dSize[12] = pLParam->dSize[4];
|
|
param.dSize[13] = pLParam->dSize[5];
|
|
param.dSize[14] = pLParam->dSize[6];
|
|
param.dSize[15] = pLParam->dSize[7];
|
|
param.dSize[16] = pLParam->dSize[8];
|
|
param.dSize[17] = pLParam->dSize[9];
|
|
param.dSize[18] = pLParam->dSize[10];
|
|
|
|
pFit->SetDuctParam(param);
|
|
|
|
dLx = GetElbowLx(¶m);
|
|
dL = GetElbowL(¶m);
|
|
|
|
AcGeVector3d vtTmp = vtMaj;
|
|
vtMaj = vtMin;
|
|
vtMin = vtTmp;
|
|
}
|
|
}
|
|
|
|
//弹出界面,选择弯头样式
|
|
int nElbowStyle = 0;
|
|
if (vtMaj.isParallelTo(AcGeVector3d::kZAxis) ||
|
|
vtMin.isParallelTo(AcGeVector3d::kZAxis))
|
|
{
|
|
CAcModuleResourceOverride myResources;
|
|
CWTXXDlg dlg;
|
|
dlg.SetMajDir(vtMaj);
|
|
dlg.SetMinDir(vtMin);
|
|
if (IDOK == dlg.DoModal())
|
|
{
|
|
nElbowStyle = dlg.GetElbowStyle();
|
|
}
|
|
}
|
|
|
|
if (pParam->m_app == WPipe::eTrench && m_bHasHolder)
|
|
{
|
|
pFit->SetXHolder(kLeft, m_lHolder);
|
|
pFit->SetXHolder(kRight, m_rHolder);
|
|
}
|
|
|
|
pFit->GetSpecialtyData()->SetAt(KEY_ELBOWSTYLE, nElbowStyle);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eElbow);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_Type,(int)AecHvac::eIncline);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin);
|
|
|
|
AcGeVector3d vtNorm = vtMin.crossProduct(vtMaj);
|
|
double dAngle = vtMin.angleTo(vtMaj,vtNorm);
|
|
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, dRatio);
|
|
pFit->GetSpecialtyData()->SetAt(PIPE_ELBOWANG,dAngle);
|
|
pFit->GetSpecialtyData()->SetAt(PIPE_THICK, pparam->dSize[2]);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度
|
|
|
|
AecInterface intf0,intf1;
|
|
pFit->GetInterface(0,intf0);
|
|
pFit->GetInterface(1,intf1);
|
|
|
|
m_intf0 = intf0;
|
|
m_intf1 = intf1;
|
|
|
|
//添加本次到数据库
|
|
AcDbObjectId id = CoreTools::AddToModelSpace(pFit);
|
|
m_intf0.idOwner = id;
|
|
m_intf1.idOwner = id;
|
|
|
|
AddUserData(id,pXDataMap,1);
|
|
|
|
//记录接口到历史记录
|
|
intf1.idOwner = id;
|
|
if (m_pPipeJig != NULL) intf1.nType = m_pPipeJig->GetUndoGroupID();
|
|
|
|
if (bInsertBeforLast)
|
|
{
|
|
if (m_arHistoryIntfs.GetSize() > 0)
|
|
{
|
|
AecInterface inf = m_arHistoryIntfs[m_arHistoryIntfs.GetSize() - 1];
|
|
m_arHistoryIntfs.RemoveAt(m_arHistoryIntfs.GetSize() - 1);
|
|
PushInterface(intf0);
|
|
PushInterface(inf);
|
|
}
|
|
else
|
|
{
|
|
PushInterface(intf0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PushInterface(intf0);
|
|
}
|
|
|
|
AddUserData(id,pXDataMap,1);
|
|
|
|
return id;
|
|
}
|
|
|
|
BOOL AecDbECableLine::ChangeEl(AECStatusRecord* pRec,double dNewEl,BOOL bCheckRec,double dRedElPos,AecHvac::DuctParam* pParamred)
|
|
{
|
|
//dNewEl 为底部高,调整到中心标高
|
|
dNewEl += m_pPipeParam->dSize[1] * 0.5;
|
|
|
|
AcGeVector3d vtMaj,vtMin;
|
|
if (GetLastInterface() != NULL)
|
|
{
|
|
vtMaj = GetLastInterface()->vtDir;
|
|
vtMaj.normalize();
|
|
vtMin = AcGeVector3d::kZAxis;
|
|
|
|
if (dNewEl - m_pPipeParam->m_dEl < 1.e-6)
|
|
{
|
|
vtMin = -AcGeVector3d::kZAxis;
|
|
}
|
|
|
|
AcGePoint3d ptMid,ptSta,ptEnd,ptGeT,ptLast;
|
|
|
|
double dRatio = m_pPipeParam->m_dRatio;
|
|
double dLx = GetElbowLx(m_pPipeParam);
|
|
double dL = GetElbowL(m_pPipeParam);
|
|
|
|
//如果上段不是管子
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,GetLastInterface()->idOwner,AcDb::kForWrite))
|
|
{
|
|
AecDbECableTray* pPipe = AecDbECableTray::cast(pEnt);
|
|
if (pPipe == NULL)//不是管子
|
|
{
|
|
ptMid = GetLastInterface()->ptPos;
|
|
ptSta = ptMid;
|
|
ptMid += vtMaj * dL;
|
|
ptLast = ptMid;
|
|
ptEnd = ptMid;
|
|
ptEnd.z = dNewEl;
|
|
|
|
//创建立管...
|
|
if (vtMaj.isParallelTo(AcGeVector3d::kZAxis))
|
|
{
|
|
double dAng = 0;//需要计算
|
|
CreatePipe(ptSta, ptEnd, m_pPipeParam, dAng);
|
|
pRec->SetAcquirePoint(ptEnd);
|
|
}
|
|
}
|
|
else//改短上次管子
|
|
{
|
|
ptLast = GetLastInterface()->ptPos;
|
|
if (ptLast.distanceTo(pPipe->EndPoint()) < 1.e-6)
|
|
{
|
|
ptEnd = pPipe->EndPoint();
|
|
ptMid = ptEnd;
|
|
ptEnd -= vtMaj * dL;
|
|
|
|
ptGeT = pPipe->EndPoint();
|
|
pPipe->SetEndPoint(ptEnd);
|
|
ptLast = ptEnd;
|
|
}
|
|
else
|
|
{
|
|
vtMaj = pPipe->StartPoint() - pPipe->EndPoint();
|
|
vtMaj.normalize();
|
|
|
|
ptSta = pPipe->StartPoint();
|
|
ptMid = ptSta;
|
|
ptSta -= vtMaj * dL;
|
|
|
|
ptGeT = pPipe->StartPoint();
|
|
pPipe->SetStartPoint(ptSta);
|
|
ptLast = ptSta;
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
|
|
//压入当前param
|
|
PushPipeParam();
|
|
|
|
//1. 如果方向不同创建弯头
|
|
if (!vtMaj.isParallelTo(vtMin))
|
|
{
|
|
//底部弯头
|
|
AecHvac::DuctParam param;
|
|
memcpy(¶m,m_pPipeParam,sizeof(AecHvac::DuctParam));
|
|
|
|
vtMaj.negate();
|
|
CreateElbow(vtMaj,ptMid,vtMin,¶m);
|
|
|
|
if (m_intf0.vtDir.isParallelTo(vtMin) )
|
|
{
|
|
ptSta = m_intf0.ptPos;
|
|
}
|
|
else
|
|
{
|
|
ptSta = m_intf1.ptPos;
|
|
}
|
|
|
|
//顶部弯头
|
|
ptMid.z = dNewEl;
|
|
vtMin = vtMaj;
|
|
vtMin.negate();
|
|
vtMaj = -AcGeVector3d::kZAxis;
|
|
if (dNewEl < m_pPipeParam->m_dEl)
|
|
vtMaj.negate();
|
|
|
|
//顶部不需要创建 2023-11-22
|
|
//CreateElbow(vtMaj,ptMid,vtMin,¶m);
|
|
|
|
if (m_intf0.vtDir.isParallelTo(vtMaj))
|
|
{
|
|
ptEnd = m_intf0.ptPos;
|
|
ptLast = m_intf1.ptPos;
|
|
}
|
|
else
|
|
{
|
|
ptEnd = m_intf1.ptPos;
|
|
ptLast = m_intf0.ptPos;
|
|
}
|
|
|
|
AcGeVector3d vtDirXY = vtMaj.isParallelTo(AcGeVector3d::kZAxis) ? vtMin : vtMaj;
|
|
double dAng = AcGeVector3d::kXAxis.angleTo(vtDirXY,AcGeVector3d::kZAxis);
|
|
|
|
if (vtMaj.isParallelTo(AcGeVector3d::kZAxis) ||
|
|
vtMin.isParallelTo(AcGeVector3d::kZAxis))
|
|
dAng += PI / 2.0;
|
|
|
|
//2. 创建立管
|
|
AecHvac::DuctParam paramT;
|
|
memcpy(¶mT,m_pPipeParam,sizeof(AecHvac::DuctParam));
|
|
paramT.m_vtNrom = vtMin;
|
|
paramT.m_bCover = TRUE;
|
|
|
|
ptEnd.z = dNewEl;
|
|
CreatePipe(ptSta,ptEnd,¶mT,dAng);
|
|
|
|
m_pPipeParam->m_dEl = dNewEl;
|
|
|
|
//重新调整历史记录
|
|
// //CreatePipe 已经加入最后管嘴 2023-11-22 去掉
|
|
//AecInterface inf = m_intf0;
|
|
//inf.vtDir = vtMin;
|
|
//inf.ptPos = ptLast;
|
|
//PushInterface(inf);
|
|
//pRec->SetAcquirePoint(ptLast);
|
|
|
|
//调整本次状态点
|
|
pRec->SetAcquirePoint(ptEnd);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::ChangeEl2(AECStatusRecord* pRec,AECStatusRecord* pRecLast,double dNewEl,
|
|
BOOL bCheckRec,double dRedElPos,AecHvac::DuctParam* pParamred)
|
|
{
|
|
//dNewEl 为底部高,调整到中心标高
|
|
dNewEl += m_pPipeParam->dSize[1] * 0.5;
|
|
|
|
ads_point pt[5];
|
|
AcGePoint3d ptGe = pRecLast->GetAcquirePoint();
|
|
double dSize = PixelToWcs(5);//5
|
|
|
|
AcGePoint3d ptGeX[5];
|
|
ptGeX[0] = ptGe;
|
|
ptGeX[0] -= dSize * AcGeVector3d::kYAxis;
|
|
ptGeX[0] -= dSize * AcGeVector3d::kXAxis;
|
|
|
|
ptGeX[1] = ptGeX[0] + 2 * dSize * AcGeVector3d::kYAxis;
|
|
ptGeX[2] = ptGeX[1] + 2 * dSize * AcGeVector3d::kXAxis;
|
|
ptGeX[3] = ptGeX[0] + 2 * dSize * AcGeVector3d::kXAxis;
|
|
ptGeX[4] = ptGeX[0];
|
|
|
|
for (int i = 0;i < 5;i++)
|
|
{
|
|
acdbWcs2Ucs(asDblArray(ptGeX[i]),pt[i],false);
|
|
}
|
|
|
|
TCHAR szBuf[64];
|
|
memset(szBuf,0,sizeof(szBuf));
|
|
_tcscpy(szBuf, _T("AEC_DBCABTRY"));
|
|
|
|
struct resbuf rb;
|
|
rb.restype = 0;
|
|
rb.resval.rstring = szBuf;
|
|
rb.rbnext = NULL;
|
|
|
|
struct resbuf* pointlist;
|
|
pointlist = acutBuildList(RTPOINT, pt[0], RTPOINT, pt[1],
|
|
RTPOINT, pt[2], RTPOINT, pt[3], 0);
|
|
|
|
ads_name ss,ent;
|
|
acedSSGet(_T("CP"),pointlist,NULL,&rb,ss);
|
|
acutRelRb(pointlist);
|
|
|
|
Adesk::Int32 lLen = 0;
|
|
acedSSLength(ss,&lLen);
|
|
|
|
AecHvac::DuctParam wparamMain;
|
|
memcpy(&wparamMain,m_pPipeParam,sizeof(AecHvac::DuctParam));
|
|
|
|
AcDbObjectId id;
|
|
AcGePoint3d ptOn;
|
|
if (lLen > 0)
|
|
{
|
|
acedSSName(ss,0,ent);
|
|
|
|
acdbGetObjectId(id,ent);
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead) )
|
|
{
|
|
AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt);
|
|
if (pWPipe != NULL)
|
|
{
|
|
pWPipe->GetDuctParam(wparamMain);
|
|
|
|
AcGePoint3d ptOn1 = pRec->GetAcquirePoint();
|
|
AcDbLine ln(pWPipe->StartPoint(),pWPipe->EndPoint());
|
|
ln.getClosestPointTo(ptOn1,ptOn);
|
|
pRec->SetAcquirePoint(ptOn);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acedSSFree(ss);
|
|
|
|
bool bCreateTee = false;
|
|
if ( ( wparamMain.dSize[0] - m_pPipeParam->dSize[0] ) > -1.e-6) //可能的创建三通,否则只创建立管
|
|
{
|
|
bCreateTee = true;
|
|
}
|
|
|
|
//创建立管
|
|
AcGePoint3d ptSta,ptEnd;
|
|
ptSta = pRec->GetAcquirePoint();
|
|
|
|
if (bCreateTee)
|
|
{
|
|
if ( fabs(wparamMain.dSize[1] - m_pPipeParam->dSize[1]) < 1.e-6)
|
|
{
|
|
AcGeVector3d vtMin = AcGeVector3d::kZAxis;
|
|
if (dNewEl - ptSta.z < 1.e-6)
|
|
{
|
|
vtMin = -AcGeVector3d::kZAxis;
|
|
}
|
|
AcGePoint3d ptMid = pRec->GetAcquirePoint();
|
|
|
|
double dL = 0.0,dB = 0.0;
|
|
double dLx = GetElbowLx(m_pPipeParam);
|
|
dL = GetElbowL(m_pPipeParam);
|
|
dB = dL;
|
|
|
|
//创建三通
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) )
|
|
{
|
|
AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt);
|
|
if (pWPipe != NULL)
|
|
{
|
|
//对方断为两个管子
|
|
SplitWPipe(ptMid,dL,pWPipe);
|
|
|
|
AddTee(pWPipe,dL,ptMid,dB,vtMin);
|
|
ptSta += vtMin * dB;
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
acutPrintf(_T("\n选择的两桥架高度不同,不能创建三通!"));
|
|
}
|
|
}
|
|
|
|
//3.创建立管
|
|
ptEnd = ptSta;
|
|
{
|
|
ptEnd.z = dNewEl;
|
|
|
|
//立管必须带盖子
|
|
AecHvac::DuctParam param;
|
|
memcpy(¶m,m_pPipeParam,sizeof(AecHvac::DuctParam));
|
|
param.m_bCover = TRUE;
|
|
|
|
CreatePipe(ptSta,ptEnd,¶m);
|
|
|
|
m_pPipeParam->m_dEl = dNewEl;
|
|
|
|
//调整本次状态点
|
|
pRec->SetAcquirePoint(ptEnd);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::ChangeEl3(AECStatusRecord* pRec,AcGePoint3d& ptThis)
|
|
{
|
|
double dNewEl = ptThis.z;
|
|
|
|
//dNewEl 为底部高,调整到中心标高
|
|
dNewEl += m_pPipeParam->dSize[1] * 0.5;
|
|
|
|
AcGeVector3d vtMaj,vtMin;
|
|
if (GetLastInterface() != NULL)
|
|
{
|
|
vtMaj = GetLastInterface()->vtDir;
|
|
vtMaj.normalize();
|
|
vtMin = ptThis - GetLastInterface()->ptPos;
|
|
|
|
vtMaj.normalize();
|
|
vtMin.normalize();
|
|
|
|
double dX = GetElbowL(m_pPipeParam);
|
|
|
|
AcGePoint3d ptMid,ptSta,ptEnd,ptGeT,ptLast;
|
|
|
|
//如果上段不是管子
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,GetLastInterface()->idOwner,AcDb::kForWrite))
|
|
{
|
|
AecDbECableTray* pPipe = AecDbECableTray::cast(pEnt);
|
|
if (pPipe == NULL)//不是管子
|
|
{
|
|
ptMid = GetLastInterface()->ptPos;
|
|
ptMid += vtMaj * dX;
|
|
}
|
|
else//改短上次管子
|
|
{
|
|
ptLast = GetLastInterface()->ptPos;
|
|
|
|
if (ptLast.distanceTo(pPipe->EndPoint()) < 1.e-6)
|
|
{
|
|
ptEnd = pPipe->EndPoint();
|
|
ptMid = ptEnd;
|
|
ptEnd -= vtMaj * dX;
|
|
|
|
ptGeT = pPipe->EndPoint();
|
|
pPipe->SetEndPoint(ptEnd);
|
|
}
|
|
else
|
|
{
|
|
vtMaj = pPipe->StartPoint() - pPipe->EndPoint();
|
|
vtMaj.normalize();
|
|
|
|
ptSta = pPipe->StartPoint();
|
|
ptMid = ptSta;
|
|
ptSta -= vtMaj * dX;
|
|
|
|
ptGeT = pPipe->StartPoint();
|
|
pPipe->SetStartPoint(ptSta);
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
|
|
//压入当前param
|
|
PushPipeParam();
|
|
|
|
//1. 如果方向不同创建弯头->乙字弯结构
|
|
if (!vtMaj.isParallelTo(vtMin))
|
|
{
|
|
vtMaj.negate();
|
|
|
|
AecHvac::DuctParam param;
|
|
memcpy(¶m,m_pPipeParam,sizeof(AecHvac::DuctParam));
|
|
|
|
double dTmp = param.dSize[0];
|
|
param.dSize[0] = param.dSize[1];
|
|
param.dSize[0] = dTmp;
|
|
|
|
CreateElbow(vtMaj,ptMid,vtMin,¶m);
|
|
|
|
AcGeVector3d vtPipe = vtMaj;
|
|
if (m_intf0.vtDir.isParallelTo(vtMin) )
|
|
{
|
|
ptSta = m_intf0.ptPos;
|
|
vtPipe = m_intf0.vtDir;
|
|
}
|
|
else
|
|
{
|
|
ptSta = m_intf1.ptPos;
|
|
vtPipe = m_intf1.vtDir;
|
|
}
|
|
|
|
//2. 创建斜管
|
|
vtPipe.normalize();
|
|
ptEnd = ptThis;
|
|
ptEnd -= vtPipe * dX;
|
|
CreatePipe(ptSta,ptEnd,m_pPipeParam);
|
|
|
|
//在创建弯头
|
|
vtMin = vtMaj;
|
|
vtMin.negate();
|
|
|
|
ptMid = ptThis;
|
|
|
|
vtMaj = vtPipe;
|
|
vtMaj.negate();
|
|
|
|
CreateElbow(vtMaj,ptMid,vtMin,¶m);
|
|
|
|
if (m_intf0.vtDir.isParallelTo(vtMin) )
|
|
{
|
|
ptEnd = m_intf0.ptPos;
|
|
PushInterface(m_intf0);
|
|
}
|
|
else
|
|
{
|
|
ptEnd = m_intf1.ptPos;
|
|
PushInterface(m_intf1);
|
|
}
|
|
}
|
|
|
|
m_pPipeParam->m_dEl = dNewEl;
|
|
|
|
//调整本次状态点
|
|
pRec->SetAcquirePoint(ptEnd);
|
|
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void AecDbECableLine::SetAngleWath(AcGePoint3d& ptCen,const AcGePoint3d& ptGeTo,const AcGeVector3d& vtDir/* = AcGeVector3d::kXAxis*/)
|
|
{
|
|
if (m_pAngleWatch != NULL)
|
|
{
|
|
m_pAngleWatch->SetAngleWath(ptCen,ptGeTo,vtDir);
|
|
}
|
|
}
|
|
|
|
void AecDbECableLine::SwitchAutoSnapOrF8()
|
|
{
|
|
if (m_pAngleWatch != NULL)
|
|
{
|
|
m_pAngleWatch->SwitchAutoSnapOrF8();
|
|
}
|
|
}
|
|
|
|
void AecDbECableLine::MoveAngWatchPosition()
|
|
{
|
|
//导航表盘
|
|
if (m_pPipeJig->GetTailStatusRec() != NULL &&
|
|
m_pPipeJig->GetTailStatusRec()->GetStatusType() >= AECStatusRecord::kAngle &&
|
|
m_pPipeJig->GetTailStatusRec()->GetStatusType() <= AECStatusRecord::kPoint)
|
|
{
|
|
AcGePoint3d ptGe,ptGe1;
|
|
ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint();
|
|
ptGe1 = m_pPipeJig->m_pCurStaRec->GetAcquirePoint();
|
|
|
|
AcGeVector3d vtDir;
|
|
vtDir = m_pAngleWatch->m_vtDir;
|
|
AecInterface* pLast = GetLastInterface();
|
|
if (pLast != NULL)
|
|
{
|
|
vtDir = pLast->vtDir;
|
|
}
|
|
m_pAngleWatch->SetAngleWath(ptGe,ptGe1,vtDir);
|
|
}
|
|
}
|
|
|
|
void AecDbECableLine::AngWatchTo(const AcGePoint3d& ptGeTo)
|
|
{
|
|
if (m_pAngleWatch != NULL)
|
|
{
|
|
m_pAngleWatch->m_ptGeTo = ptGeTo;
|
|
}
|
|
}
|
|
|
|
//画管线停止
|
|
BOOL AecDbECableLine::PipeFinished()
|
|
{
|
|
return m_bStopCommand;
|
|
}
|
|
|
|
void AecDbECableLine::PopUpInterface(int nGroupID)
|
|
{
|
|
while(m_arHistoryIntfs.GetSize() > 0)
|
|
{
|
|
if (m_arHistoryIntfs[m_arHistoryIntfs.GetSize() - 1].nType == nGroupID)
|
|
{
|
|
m_arHistoryIntfs.RemoveAt(m_arHistoryIntfs.GetSize() - 1);
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//回退上次参数
|
|
while (m_lstLastPipeParam.GetCount() > 0)
|
|
{
|
|
//回上次管道参数
|
|
AecHvac::DuctParam* pLast = (AecHvac::DuctParam*)m_lstLastPipeParam.GetTail();
|
|
if (pLast->m_nGroupID == nGroupID)
|
|
{
|
|
m_lstLastPipeParam.RemoveTail();
|
|
DELETE_PTR(pLast);
|
|
}
|
|
else
|
|
{
|
|
memcpy(m_pPipeParam,pLast,sizeof(AecHvac::DuctParam));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void AecDbECableLine::PushPipeParam()
|
|
{
|
|
AecHvac::DuctParam* pParam = new AecHvac::DuctParam;
|
|
memcpy(pParam,m_pPipeParam,sizeof(AecHvac::DuctParam));
|
|
pParam->m_nGroupID = m_pPipeJig->GetUndoGroupID();
|
|
m_lstLastPipeParam.AddTail(pParam);
|
|
}
|
|
|
|
void AecDbECableLine::PushInterface(AecInterface& intf,BOOL bStartDragFromIt/* = FALSE*/)
|
|
{
|
|
m_arHistoryIntfs.Add(intf);
|
|
if (bStartDragFromIt)//拖出的源对象
|
|
{
|
|
m_idStartDragFrom = intf.idOwner;
|
|
}
|
|
}
|
|
|
|
BOOL AecDbECableLine::CreateWPipe(AECStatusRecord* pRec,BOOL bMaybeAddTee/* = FALSE*/)
|
|
{
|
|
AcGePoint3d ptGe,ptGe1;
|
|
|
|
AecDbECableTray* pWpipe = new AecDbECableTray;
|
|
AecDbObjXDataMap* pXDataMap = pWpipe->GetSpecialtyData();
|
|
|
|
pWpipe->SetDuctParam(m_pPipeParam);
|
|
pWpipe->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pWpipe->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
|
|
//设置图层
|
|
AecHvac::DuctParam *pParam = m_pPipeParam;
|
|
AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
|
|
pXDataMap->SetAt(PIPE_CENTLAY,idCenLay);
|
|
pXDataMap->SetAt(PIPE_OUTDLAY,idOutLay);
|
|
pXDataMap->SetAt(PIPE_SINGLAY,idSingle);
|
|
|
|
pWpipe->SetDoubleLayer(idOutLay);
|
|
pWpipe->SetSingleLayer(idSingle);
|
|
pWpipe->SetCenterLayer(idCenLay);
|
|
pWpipe->setLayer(idOutLay);
|
|
|
|
ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint();
|
|
ptGe1 = pRec->GetAcquirePoint();
|
|
|
|
#//ifndef _DEBUG_WAS_DEFINED
|
|
// acutPrintf(_T("\n%.3f-%.3f"), ptGe.x, ptGe.y);
|
|
// acutPrintf(_T("\n%.3f-%.3f"), ptGe1.x, ptGe1.y);
|
|
//#endif
|
|
|
|
//第一次对齐即可
|
|
AcGeVector3d vtAg(0,0,0);
|
|
if (m_arHistoryIntfs.GetSize() == 0)
|
|
{
|
|
vtAg = ptGe1 - ptGe;
|
|
vtAg.normalize();
|
|
|
|
switch(m_pPipeParam->m_nAlign)
|
|
{
|
|
case 0://底部左
|
|
{
|
|
vtAg.rotateBy(-PI / 2.0,AcGeVector3d::kZAxis);
|
|
vtAg *= 0.5 * m_pPipeParam->dSize[0];
|
|
break;
|
|
}
|
|
case 1://底部中
|
|
{
|
|
vtAg.set(0,0,0);
|
|
break;
|
|
}
|
|
case 2://底部右
|
|
{
|
|
vtAg.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
vtAg *= 0.5 * m_pPipeParam->dSize[0];
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
ptGe += vtAg;
|
|
m_pPipeJig->GetTailStatusRec()->SetAcquirePoint(ptGe);
|
|
}
|
|
|
|
pWpipe->SetStartPoint( ptGe );
|
|
pWpipe->SetEndPoint( ptGe1 );
|
|
AcGeVector3d vtDir = ptGe1 - ptGe;
|
|
vtDir.normalize();
|
|
|
|
//法向量,水平桥架
|
|
AcGeVector3d vtWDir = vtDir;
|
|
vtWDir.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
|
|
AcGeVector3d vtNorm = vtDir.crossProduct(vtWDir);
|
|
pWpipe->GetSpecialtyData()->SetAt(KEY_NORMAL,vtNorm);
|
|
m_pPipeParam->m_vtNrom = vtNorm;
|
|
|
|
if (pParam->m_app == WPipe::eTrench && m_bHasHolder)
|
|
{
|
|
pWpipe->SetXHolder(kLeft, m_lHolder);
|
|
pWpipe->SetXHolder(kRight, m_rHolder);
|
|
}
|
|
|
|
//pWpipe->ReCreateByXDataMap();
|
|
AcDbObjectId id = CoreTools::AddToModelSpace(pWpipe);
|
|
|
|
AddUserData(id,pXDataMap,0);
|
|
|
|
//记录接口到历史记录
|
|
AecInterface intf;
|
|
intf.ptPos = ptGe1;
|
|
intf.vtDir = vtDir;
|
|
intf.idOwner = id;
|
|
PushInterface(intf);
|
|
|
|
if (bMaybeAddTee) //开始端或末端考虑添加三通的可能性
|
|
{
|
|
//1. 可能的与其他管子在开始端合成三通
|
|
MaybeAddTeeConnectToThis(ptGe,vtDir,id,0);
|
|
|
|
//2. 可能的与其他管子在末端合成三通,从而结束命令
|
|
if ( MaybeAddTeeConnectToThis(ptGe1,vtDir,id,1) )
|
|
{
|
|
//结束命令
|
|
m_bStopCommand = TRUE;
|
|
}
|
|
|
|
//1.可能与其他的管子在中间端合成四通的可能性
|
|
MaybeAddCrossConnectToThis(ptGe,ptGe1,id);
|
|
}
|
|
else //末端或中间部分添加三通或四通的可能性
|
|
{
|
|
//1.可能与其他的管子在中间端合成四通的可能性
|
|
MaybeAddCrossConnectToThis(ptGe,ptGe1,id);
|
|
|
|
//2. 可能的与其他管子在末端合成三通,从而结束命令
|
|
if ( MaybeAddTeeConnectToThis(ptGe1,vtDir,id,1) )
|
|
{
|
|
//结束命令
|
|
m_bStopCommand = TRUE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::CreatePipe(AcGePoint3d ptSta,AcGePoint3d ptEnd,AecHvac::DuctParam* pPipeParam,double dSectRot/* = 0.0*/)
|
|
{
|
|
AecDbECableTray* pWpipe = new AecDbECableTray;
|
|
AecDbObjXDataMap* pXDataMap = pWpipe->GetSpecialtyData();
|
|
|
|
//设置图层
|
|
AecHvac::DuctParam *pParam = pPipeParam;
|
|
AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
|
|
pXDataMap->SetAt(PIPE_CENTLAY,idCenLay);
|
|
pXDataMap->SetAt(PIPE_OUTDLAY,idOutLay);
|
|
pXDataMap->SetAt(PIPE_SINGLAY,idSingle);
|
|
|
|
pWpipe->SetDoubleLayer(idOutLay);
|
|
pWpipe->SetSingleLayer(idSingle);
|
|
pWpipe->SetCenterLayer(idCenLay);
|
|
pWpipe->setLayer(idOutLay);
|
|
|
|
// 增加参数 [10/24/2016 Rex]
|
|
if(g_pMapData != NULL)
|
|
{
|
|
CMapStringToString mapData;
|
|
CString sKey,sVal;
|
|
for (POSITION ps = g_pMapData->GetStartPosition();ps != NULL;)
|
|
{
|
|
g_pMapData->GetNextAssoc(ps,sKey,sVal);
|
|
pXDataMap->SetAt(sKey,sVal);
|
|
}
|
|
}
|
|
|
|
if (fabs(dSectRot) > 1.e-6)
|
|
pWpipe->SetSectionRotation(dSectRot);
|
|
|
|
pWpipe->SetDuctParam(pPipeParam);
|
|
pWpipe->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pWpipe->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
|
|
pWpipe->SetStartPoint( ptSta );
|
|
pWpipe->SetEndPoint( ptEnd );
|
|
pXDataMap->SetAt(KEY_NORMAL,pPipeParam->m_vtNrom);
|
|
|
|
if ( fabs(ptSta.z - ptEnd.z) > 1.e-6)
|
|
{
|
|
pWpipe->GetSpecialtyData()->SetAt(KEY_DRAWGRAD,TRUE);
|
|
}
|
|
|
|
if (pParam->m_app == WPipe::eTrench && m_bHasHolder)
|
|
{
|
|
pWpipe->SetXHolder(kLeft, m_lHolder);
|
|
pWpipe->SetXHolder(kRight, m_rHolder);
|
|
}
|
|
|
|
AcDbObjectId id = CoreTools::AddToModelSpace(pWpipe);
|
|
|
|
AddUserData(id,pXDataMap,0);
|
|
|
|
AcGeVector3d vtDir = ptEnd - ptSta;
|
|
|
|
//记录接口到历史记录
|
|
AecInterface intf;
|
|
intf.ptPos = ptEnd;
|
|
intf.vtDir = vtDir;
|
|
intf.idOwner = id;
|
|
PushInterface(intf);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::ExtendLastWPipe(AECStatusRecord* pRec)
|
|
{
|
|
int nLen = m_arHistoryIntfs.GetSize();
|
|
if (nLen == 0)
|
|
return FALSE;
|
|
|
|
AecInterface& intf = m_arHistoryIntfs[nLen - 1];
|
|
AcDbObjectId id = intf.idOwner;
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
|
|
{
|
|
AecDbECableTray* pDbWpipe = AecDbECableTray::cast(pEnt);
|
|
if (pDbWpipe != NULL)
|
|
{
|
|
AcGePoint3d ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint();
|
|
AcGePoint3d ptGe1 = pRec->GetAcquirePoint();
|
|
AcGeVector3d vtThis = ptGe1 - ptGe;
|
|
AcGePoint3d ptGeT;
|
|
int nPos = 0;
|
|
AcGeVector3d vt = pDbWpipe->EndPoint() - pDbWpipe->StartPoint();
|
|
if (vtThis.isCodirectionalTo(vt))
|
|
{
|
|
ptGeT = pDbWpipe->EndPoint();
|
|
pDbWpipe->SetEndPoint(pRec->GetAcquirePoint());
|
|
nPos = 1;
|
|
}
|
|
else
|
|
{
|
|
ptGeT = pDbWpipe->StartPoint();
|
|
pDbWpipe->SetStartPoint(pRec->GetAcquirePoint());
|
|
}
|
|
//pDbWpipe->UpdateInterfaceRec(ptGeT,pRec->GetAcquirePoint());
|
|
|
|
//先关闭
|
|
pEnt->close();
|
|
|
|
//1.可能与其他的管子在中间端合成四通的可能性
|
|
MaybeAddCrossConnectToThis(ptGe,ptGe1,id);
|
|
|
|
//2. 可能的与其他管子在末端合成三通,从而结束命令
|
|
AcGeVector3d vtDir = ptGe1 - ptGe;
|
|
if ( MaybeAddTeeConnectToThis(ptGe1,vtDir,id,nPos) )
|
|
{
|
|
//结束命令
|
|
m_bStopCommand = TRUE;
|
|
}
|
|
intf.ptPos = pRec->GetAcquirePoint();
|
|
PushInterface(intf,FALSE);
|
|
return TRUE;
|
|
}
|
|
|
|
AecDbEcFitting* pDbFit = AecDbEcFitting::cast(pEnt);
|
|
if (pDbFit != NULL) //上次是管件,本次创建管子
|
|
{
|
|
AecDbObjXDataMap* pXDataMap = pDbFit->GetSpecialtyData();
|
|
|
|
int nVal = 0;
|
|
pXDataMap->GetAt(KEY_RUNTIME,nVal);
|
|
EFittingType eKind = (EFittingType)nVal;
|
|
|
|
//可能的改上次弯头为三通,当方向不一致
|
|
if (nVal == eElbow)
|
|
{
|
|
AcGeVector3d vtIntf = intf.vtDir;
|
|
AcGePoint3d ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint();
|
|
AcGePoint3d ptGe1 = pRec->GetAcquirePoint();
|
|
AcGeVector3d vtThis = ptGe1 - ptGe;
|
|
|
|
if (vtThis.isParallelTo(vtIntf))
|
|
{
|
|
if (!vtThis.isCodirectionalTo(vtIntf)) // 反向,改弯头为三通
|
|
{
|
|
//判断弯头是否是90度弯头
|
|
double dAng = 0.0;
|
|
pXDataMap->GetAt(PIPE_ELBOWANG,dAng);
|
|
|
|
if ( fabs( dAng - 90.0 ) < 1.e-6) //是90 度
|
|
{
|
|
AecHvac::DuctParam data;
|
|
memset(&data,0,sizeof(AecHvac::DuctParam));
|
|
pDbFit->GetDuctParam(data);
|
|
|
|
//获取另一方向
|
|
double dDn = data.dSize[0];
|
|
AcGeVector3d vt1,vt2;
|
|
pXDataMap->GetAt(KEY_MAJBR,vt1);
|
|
pXDataMap->GetAt(KEY_MINBR,vt2);
|
|
|
|
AcGeVector3d vtMin;
|
|
if (vt1.isParallelTo(vtIntf)) // 本位置
|
|
{
|
|
vtMin = vt2;
|
|
}
|
|
else
|
|
{
|
|
vtMin = vt1;
|
|
vtMin.negate();
|
|
}
|
|
|
|
AcGePoint3d ptGeM;
|
|
pXDataMap->GetAt(KEY_MID,ptGeM);
|
|
ChangeElbowToTree(pDbFit,vtThis,ptGeM,vtMin,dDn,pRec);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(nVal == eTee)
|
|
{
|
|
AcGeVector3d vtIntf = intf.vtDir;
|
|
|
|
AcGePoint3d ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint();
|
|
AcGePoint3d ptGe1 = pRec->GetAcquirePoint();
|
|
AcGeVector3d vtThis = ptGe1 - ptGe;
|
|
|
|
AecInterface inf2,inf0;
|
|
pDbFit->GetInterface(2,inf2);
|
|
pDbFit->GetInterface(0,inf0);
|
|
AcGeVector3d vtInf2 = inf2.vtDir;
|
|
AcGeVector3d vtInf0 = inf0.vtDir;
|
|
|
|
if (vtInf0.isPerpendicularTo(vtInf2)) //正十字三通
|
|
{
|
|
//如果是支管拉,才可能创建四通;
|
|
if (vtThis.isParallelTo(vtIntf) && vtIntf.isParallelTo(vtInf2) )
|
|
{
|
|
if (!vtThis.isCodirectionalTo(vtIntf)) // 反向,改三通为四通
|
|
{
|
|
//直接改三通为四通
|
|
ChangeTeeToCross(pDbFit,vtInf0,vtInf2,pRec);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
pEnt->close();
|
|
return CreateWPipe(pRec);
|
|
}
|
|
|
|
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
|
|
if (pWEqu != NULL)
|
|
{
|
|
pEnt->close();
|
|
return CreateWPipe(pRec);
|
|
}
|
|
pEnt->close();
|
|
intf.ptPos = pRec->GetAcquirePoint();
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::IsLastParamAndInfFit()
|
|
{
|
|
int nLen = m_arHistoryIntfs.GetSize();
|
|
if (nLen == 0)
|
|
return FALSE;
|
|
|
|
if (m_lstLastPipeParam.IsEmpty())
|
|
return FALSE;
|
|
|
|
AecHvac::DuctParam *pLParam = m_pPipeParam;
|
|
|
|
AecInterface intf = m_arHistoryIntfs[nLen - 1];
|
|
AcDbObjectId id = intf.idOwner;
|
|
|
|
AecHvac::DuctParam param;
|
|
memset(¶m, 0, sizeof(AecHvac::DuctParam));
|
|
|
|
AcDbEntity *pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
|
|
{
|
|
AecDbEcFitting *pFitLast = AecDbEcFitting::cast(pEnt);
|
|
if (pFitLast != NULL)
|
|
{
|
|
pFitLast->GetDuctParam(param);
|
|
}
|
|
|
|
AecDbECableTray *pWPipe = AecDbECableTray::cast(pEnt);
|
|
if (pWPipe != NULL)
|
|
{
|
|
pWPipe->GetDuctParam(param);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
|
|
if ( fabs(pLParam->dSize[0] - param.dSize[0]) < 1.e-6 && //D W
|
|
fabs(pLParam->dSize[1] - param.dSize[1]) < 1.e-6 && //H
|
|
fabs(pLParam->dSize[2] - param.dSize[2]) < 1.e-6) //t
|
|
{
|
|
return TRUE;//相等
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::CreateElbowAndPipe(AECStatusRecord* pRec, const EFittingType &type/* = eElbow*/)
|
|
{
|
|
int nLen = m_arHistoryIntfs.GetSize();
|
|
if (nLen == 0)
|
|
return FALSE;
|
|
|
|
AecInterface intf;
|
|
intf = m_arHistoryIntfs[nLen - 1];
|
|
AcDbObjectId id = intf.idOwner;
|
|
|
|
AcGePoint3d ptCur = pRec->GetAcquirePoint();
|
|
AcGePoint3d ptGeM = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint();
|
|
|
|
AcGeVector3d vtMaj,vtMin,vtPipe;
|
|
vtMaj = intf.vtDir;
|
|
vtMaj.normalize();
|
|
vtMaj.negate();
|
|
vtMin = ptCur - ptGeM;
|
|
vtMin.normalize();
|
|
|
|
AcGeVector3d vtNom = vtMin.crossProduct(vtMaj);
|
|
|
|
//弹出界面,选择弯头样式
|
|
int nElbowStyle = 0;
|
|
//影响绘制效率
|
|
/*if (vtMin.isParallelTo(AcGeVector3d::kZAxis) ||
|
|
vtMaj.isParallelTo(AcGeVector3d::kZAxis ) )
|
|
{
|
|
CAcModuleResourceOverride myResources;
|
|
CWTXXDlg dlg;
|
|
dlg.SetMajDir(vtMaj);
|
|
dlg.SetMinDir(vtMin);
|
|
if (IDOK == dlg.DoModal())
|
|
{
|
|
nElbowStyle = dlg.GetElbowStyle();
|
|
}
|
|
}*/
|
|
|
|
//设置图层
|
|
AecHvac::DuctParam *pParam = m_pPipeParam;
|
|
AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, pParam->szSys, 4, _T("center2"), NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, pParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, pParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
|
|
AecDbEcFitting* pFit = new AecDbEcFitting;
|
|
AecDbObjXDataMap* pXDataMap = pFit->GetSpecialtyData();
|
|
|
|
pFit->setLayer(idOutLay);
|
|
pFit->SetDoubleLayer(idOutLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
|
|
BOOL bIsLastInfParamFit = FALSE;
|
|
if (nLen > 0 && !m_lstLastPipeParam.IsEmpty())
|
|
{
|
|
//并且和上次参数一致
|
|
bIsLastInfParamFit = IsLastParamAndInfFit();
|
|
}
|
|
|
|
//末端接口
|
|
pFit->SetDuctParam(*m_pPipeParam);
|
|
double dLx = GetElbowLx(m_pPipeParam);
|
|
double dL = GetElbowL(m_pPipeParam);
|
|
|
|
if (!bIsLastInfParamFit)//不一致
|
|
{
|
|
AecHvac::DuctParam *pLParam = m_pPipeParam;
|
|
if (!m_lstLastPipeParam.IsEmpty())
|
|
pLParam = (AecHvac::DuctParam *)m_lstLastPipeParam.GetTail();
|
|
|
|
//电缆沟设置分支
|
|
//产生非等径弯头!
|
|
AecHvac::DuctParam param;
|
|
memcpy(¶m, m_pPipeParam, sizeof(AecHvac::DuctParam));
|
|
|
|
//分支 但是高度必须相等!
|
|
param.dSize[3] = pLParam->dSize[0];
|
|
|
|
//高度必须相等!
|
|
if (fabs(param.dSize[1] - pLParam->dSize[1]) < 1.e-6)
|
|
{
|
|
//电缆沟
|
|
param.dSize[12] = pLParam->dSize[4];
|
|
param.dSize[13] = pLParam->dSize[5];
|
|
param.dSize[14] = pLParam->dSize[6];
|
|
param.dSize[15] = pLParam->dSize[7];
|
|
param.dSize[16] = pLParam->dSize[8];
|
|
param.dSize[17] = pLParam->dSize[9];
|
|
param.dSize[18] = pLParam->dSize[10];
|
|
|
|
pFit->SetDuctParam(param);
|
|
|
|
dLx = GetElbowLx(¶m);
|
|
dL = GetElbowL(¶m);
|
|
}
|
|
}
|
|
|
|
pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eElbow);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_Type,(int)AecHvac::eIncline);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_ELBOWSTYLE, nElbowStyle);
|
|
|
|
double dAngle = vtMin.angleTo(vtMaj,vtNom);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MID, ptGeM);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio);
|
|
pFit->GetSpecialtyData()->SetAt(PIPE_ELBOWANG,dAngle);
|
|
pFit->GetSpecialtyData()->SetAt(PIPE_THICK, m_pPipeParam->dSize[2]);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度
|
|
|
|
//改变上次intf 的末端点
|
|
AecInterface intf0,intf1;
|
|
pFit->GetInterface(0,intf0);
|
|
pFit->GetInterface(1,intf1);
|
|
AcGeVector3d vtMove = vtMaj;
|
|
vtMove.normalize();
|
|
AcGePoint3d ptGeT;
|
|
|
|
//判断id 是管件
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
AecDbEcFitting* pFitLast = AecDbEcFitting::cast(pEnt);
|
|
if (pFitLast != NULL)
|
|
{
|
|
double dMove = 0.0;
|
|
if (intf.vtDir.isParallelTo(intf0.vtDir))
|
|
{
|
|
dMove = intf.ptPos.distanceTo(intf0.ptPos);
|
|
vtMove = intf.vtDir;
|
|
vtMove.normalize();
|
|
vtMove *= dMove;
|
|
ptGeM += vtMove;
|
|
}
|
|
else
|
|
{
|
|
dMove = intf.ptPos.distanceTo(intf1.ptPos);
|
|
vtMove = intf.vtDir;
|
|
vtMove.normalize();
|
|
vtMove *= dMove;
|
|
ptGeM += vtMove;
|
|
}
|
|
|
|
AcGeMatrix3d xformMove;
|
|
xformMove.setToTranslation(vtMove);
|
|
pFit->transformBy(xformMove);
|
|
|
|
pFit->GetInterface(0,intf0);
|
|
pFit->GetInterface(1,intf1);
|
|
vtMove = vtMaj;
|
|
vtMove.normalize();
|
|
}
|
|
pEnt->close();
|
|
}
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
|
|
{
|
|
// 如果上次是管子,则改变上次管子的终点
|
|
AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt);
|
|
if (pWPipe != NULL)
|
|
{
|
|
AcGeVector3d vtPipe = pWPipe->EndPoint() - pWPipe->StartPoint();
|
|
if (intf0.vtDir.isParallelTo(vtPipe))
|
|
{
|
|
//距离那个点近, 则修改哪个点
|
|
double dDis1 = ptGeM.distanceTo(pWPipe->StartPoint());
|
|
double dDis2 = ptGeM.distanceTo(pWPipe->EndPoint());
|
|
if (dDis1 < dDis2)
|
|
{
|
|
ptGeT = pWPipe->StartPoint();
|
|
pWPipe->SetStartPoint(intf0.ptPos);
|
|
}
|
|
else
|
|
{
|
|
ptGeT = pWPipe->EndPoint();
|
|
pWPipe->SetEndPoint(intf0.ptPos);
|
|
}
|
|
}
|
|
|
|
if (intf1.vtDir.isParallelTo(vtPipe))
|
|
{
|
|
//距离那个点近, 则修改哪个点
|
|
double dDis1 = ptGeM.distanceTo(pWPipe->StartPoint());
|
|
double dDis2 = ptGeM.distanceTo(pWPipe->EndPoint());
|
|
if (dDis1 < dDis2)
|
|
{
|
|
ptGeT = pWPipe->StartPoint();
|
|
pWPipe->SetStartPoint(intf1.ptPos);
|
|
}
|
|
else
|
|
{
|
|
ptGeT = pWPipe->EndPoint();
|
|
pWPipe->SetEndPoint(intf1.ptPos);
|
|
}
|
|
}
|
|
|
|
//如果上次是立管子,本次水平
|
|
vtPipe = pWPipe->GetTailDir();
|
|
if (vtPipe.isParallelTo(AcGeVector3d::kZAxis))
|
|
{
|
|
AcGeLine3d ln3d(AcGePoint3d::kOrigin,vtMin);
|
|
if (ln3d.isParallelTo(AcGePlane::kXYPlane))
|
|
{
|
|
//
|
|
double dAng = AcGeVector3d::kXAxis.angleTo(vtMin,AcGeVector3d::kZAxis);
|
|
pWPipe->SetSectionRotation(PI / 2.0 + dAng);
|
|
}
|
|
}
|
|
}
|
|
|
|
AecDbEcFitting* pDbFit = AecDbEcFitting::cast(pEnt);
|
|
AecDbEwEquipment* pDbWEqu = AecDbEwEquipment::cast(pEnt);
|
|
if (pDbFit != NULL || pDbWEqu != NULL) //如果是管件或设备元件,则加入的弯头需要调整M点,因为上次对象不可更改接口点
|
|
{
|
|
AcGeVector3d vtPipe = intf.vtDir;
|
|
if (intf0.vtDir.isParallelTo(vtPipe))
|
|
{
|
|
vtMove = intf.ptPos - intf0.ptPos;
|
|
}
|
|
if (intf1.vtDir.isParallelTo(vtPipe))
|
|
{
|
|
vtMove = intf.ptPos - intf1.ptPos;
|
|
}
|
|
|
|
ptGeM += vtMove;
|
|
pXDataMap->SetAt(KEY_MID,ptGeM);
|
|
|
|
pFit->GetInterface(0,intf0);
|
|
pFit->GetInterface(1,intf1);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
|
|
if (pParam->m_app == WPipe::eTrench && m_bHasHolder)
|
|
{
|
|
pFit->SetXHolder(kLeft, m_lHolder);
|
|
pFit->SetXHolder(kRight, m_rHolder);
|
|
}
|
|
|
|
//添加本次到数据库
|
|
id = CoreTools::AddToModelSpace(pFit);
|
|
|
|
AddUserData(id,pXDataMap,1);
|
|
|
|
//创建余下的管子
|
|
AcGePoint3d ptSta,ptEnd;
|
|
if (intf0.vtDir.isParallelTo(vtMin))
|
|
{
|
|
ptSta = intf1.ptPos;
|
|
ptEnd = intf0.ptPos;
|
|
}
|
|
if (intf1.vtDir.isParallelTo(vtMin))
|
|
{
|
|
ptSta = intf0.ptPos;
|
|
ptEnd = intf1.ptPos;
|
|
}
|
|
|
|
//记录弯头末接口到历史记录
|
|
intf.ptPos = ptEnd;
|
|
intf.vtDir = vtMin;
|
|
intf.idOwner = id;
|
|
PushInterface(intf);
|
|
|
|
ptGeT = pRec->GetAcquirePoint();
|
|
ptGeT += vtMove;
|
|
pRec->SetAcquirePoint(ptGeT);
|
|
|
|
//校正
|
|
AcGePoint3d ptTemp;
|
|
AcDbLine ln;
|
|
ln.setStartPoint(ptEnd);
|
|
ptTemp = ptEnd + 1000.0 * vtMin;
|
|
ln.setEndPoint(ptTemp);
|
|
ln.getClosestPointTo(ptGeT,ptGeT,Adesk::kTrue);
|
|
pRec->SetAcquirePoint(ptGeT);
|
|
|
|
//创建余下管子,并插入虚拟状态记录
|
|
AECStatusRecord* pRecMid = new AECStatusRecord;
|
|
pRecMid->CopyFrom(pRec);
|
|
pRecMid->SetAcquirePoint(ptEnd);
|
|
m_pPipeJig->PushBackStatusRec(pRecMid);
|
|
|
|
CreateWPipe(pRec);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::MaybeAddTeeConnectToThis(AcGePoint3d& ptGe,AcGeVector3d& vtDir,AcDbObjectId id,int nPos)
|
|
{
|
|
AcDbObjectId idLay1,idLay2;
|
|
AcDbEntity* pEnt1 = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt1,id,AcDb::kForRead))
|
|
{
|
|
idLay1 = pEnt1->layerId();
|
|
pEnt1->close();
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//以ptGe的,以管子公称直径为搜索
|
|
ads_point pt[5];
|
|
vtDir.normalize();
|
|
AcGeVector3d vtV = vtDir;
|
|
vtV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
|
|
AcGePoint3d ptGeT = ptGe;
|
|
ptGeT = ptGe + m_pPipeParam->dSize[0] * 0.5 * vtDir;
|
|
ptGeT += m_pPipeParam->dSize[0] * 0.5 * vtV;
|
|
|
|
AcGePoint3d ptGeX[5];
|
|
ptGeX[0] = ptGeT;
|
|
ptGeX[1] = ptGeX[0] - m_pPipeParam->dSize[0] * vtDir;
|
|
ptGeX[2] = ptGeX[1] - m_pPipeParam->dSize[0] * vtV;
|
|
ptGeX[3] = ptGeX[0] - m_pPipeParam->dSize[0] * vtV;
|
|
ptGeX[4] = ptGeX[0];
|
|
for (int i = 0;i < 5;i++)
|
|
{
|
|
acdbWcs2Ucs(asDblArray(ptGeX[i]),pt[i],false);
|
|
}
|
|
|
|
TCHAR szBuf[64];
|
|
memset(szBuf,0,sizeof(szBuf));
|
|
_tcscpy(szBuf, _T("AEC_DBCABTRY"));
|
|
|
|
struct resbuf rb;
|
|
rb.restype = 0;
|
|
rb.resval.rstring = szBuf;
|
|
rb.rbnext = NULL;
|
|
|
|
struct resbuf* pointlist;
|
|
pointlist = acutBuildList(RTPOINT, pt[0], RTPOINT, pt[1],
|
|
RTPOINT, pt[2], RTPOINT, pt[3], 0);
|
|
|
|
ads_name ss,ent;
|
|
acedSSGet(_T("CP"),pointlist,NULL,&rb,ss);
|
|
acutRelRb(pointlist);
|
|
|
|
Adesk::Int32 lLen = 0;
|
|
acedSSLength(ss,&lLen);
|
|
|
|
double dTemp = 0.0;
|
|
CString sSQL,sTemp;
|
|
AcDbObjectId idT;
|
|
AcDbEntity* pEnt = NULL;
|
|
AcGeVector3d vtPipe;
|
|
AcGePoint3d ptMid,ptTemp1,ptTemp2;
|
|
|
|
BOOL bModified = FALSE;
|
|
for (long i = 0;i < lLen;i++)
|
|
{
|
|
acedSSName(ss,i,ent);
|
|
acdbGetObjectId(idT,ent);
|
|
if (idT == id) continue;
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idT,AcDb::kForWrite))
|
|
{
|
|
AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt);
|
|
if (pWPipe != NULL)
|
|
{
|
|
//判断是否同系统
|
|
idLay2 = pWPipe->layerId();
|
|
if (idLay1 != idLay2)
|
|
{
|
|
pEnt->close();
|
|
continue;
|
|
}
|
|
|
|
AecHvac::DuctParam data;
|
|
pWPipe->GetDuctParam(data);
|
|
if (data.m_app != m_pPipeParam->m_app)
|
|
{
|
|
pEnt->close();
|
|
continue;
|
|
}
|
|
|
|
vtPipe = pWPipe->EndPoint() - pWPipe->StartPoint();
|
|
vtPipe.normalize();
|
|
if (!vtPipe.isParallelTo(vtDir))
|
|
{
|
|
//且两管子中心线能相交
|
|
AcGeLine3d ln1(pWPipe->EndPoint(),vtPipe);
|
|
AcGeLine3d ln2(ptGe,vtDir);
|
|
|
|
double dDn = m_pPipeParam->dSize[0];
|
|
pWPipe->GetSpecialtyData()->GetAt(KEY_SIZE1,dDn);
|
|
|
|
if (ln1.intersectWith(ln2,ptMid))
|
|
{
|
|
double dL = GetElbowL(m_pPipeParam);
|
|
double dS = dL;
|
|
|
|
//也可能加弯头,ptMid的两头有一在管子外
|
|
ptTemp1 = ptMid + vtPipe * dL;
|
|
ptTemp2 = ptMid - vtPipe * dL;
|
|
|
|
AcGeLineSeg3d lineGe(pWPipe->StartPoint(),pWPipe->EndPoint());
|
|
BOOL bAddTee = TRUE;
|
|
if ( !lineGe.isOn(ptTemp1) || !lineGe.isOn(ptTemp2) )
|
|
{
|
|
if ( fabs(dDn - m_pPipeParam->dSize[0]) < 1.e-6) //==DN
|
|
{
|
|
pEnt->close();
|
|
bAddTee = FALSE;
|
|
if ( AddElbow(idT,ptMid,id))
|
|
{
|
|
bModified = TRUE;
|
|
}
|
|
return bModified;
|
|
}
|
|
else// 只能加三通
|
|
{
|
|
bAddTee = TRUE;
|
|
}
|
|
}
|
|
|
|
if (bAddTee)
|
|
{
|
|
AecHvac::DuctParam paramMj;
|
|
pWPipe->GetDuctParam(paramMj);
|
|
dL = GetElbowL(¶mMj);
|
|
dS = dL;
|
|
|
|
//对方断为两个管子
|
|
SplitWPipe(ptMid,dL,pWPipe);
|
|
|
|
if (nPos == 1)
|
|
vtDir.negate();
|
|
|
|
//改变this管子的位置
|
|
ptGe = ptMid + dS * vtDir;
|
|
ModifyWPipe(ptGe,id,nPos);
|
|
|
|
//添加三通,继承pWPipe属性
|
|
AddTee(pWPipe,dL,ptMid,dS,vtDir);
|
|
}
|
|
bModified = TRUE;
|
|
|
|
acedSSFree(ss);
|
|
pEnt->close();
|
|
return bModified;
|
|
}
|
|
}
|
|
else //平行,是否可以融合
|
|
{
|
|
//规格相同, 且不是从夹点拖出的命令
|
|
if (m_idStartDragFrom != id)
|
|
{
|
|
double dDn = 0.0;
|
|
pWPipe->GetSpecialtyData()->GetAt(KEY_SIZE1,dDn);
|
|
|
|
if (fabs(dDn - m_pPipeParam->dSize[0]) < 1.e-3)//公称相同
|
|
{
|
|
if ( fabs(pWPipe->EndPoint().z - m_pPipeParam->m_dEl) < 1.e-3)//等标高
|
|
{
|
|
AcGePoint3d ptEnd = pWPipe->EndPoint();
|
|
AcGePoint3d ptSta = pWPipe->StartPoint();
|
|
if (!vtPipe.isCodirectionalTo(vtDir))
|
|
{
|
|
AcGePoint3d ptTemp = ptSta;
|
|
ptSta = ptEnd;
|
|
ptEnd = ptTemp;
|
|
}
|
|
|
|
//删除原来的管子
|
|
pEnt->erase();
|
|
|
|
//改变this管子的位置
|
|
ModifyWPipe( nPos == 0 ? ptSta : ptEnd,id,nPos);
|
|
|
|
bModified = TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acedSSFree(ss);
|
|
return bModified;
|
|
}
|
|
|
|
typedef struct Point_ID
|
|
{
|
|
AcDbObjectId id;
|
|
AcGePoint3d ptInt;
|
|
AcDbCurve* pCurve;
|
|
}POINT_ID;
|
|
|
|
static bool ComparePointID(Point_ID& pt1,Point_ID& pt2)
|
|
{
|
|
double dP1 = 0.0,dP2 = 0.0;
|
|
pt1.pCurve->getParamAtPoint(pt1.ptInt,dP1);
|
|
pt1.pCurve->getParamAtPoint(pt2.ptInt,dP2);
|
|
|
|
if (dP1 - dP2 < 1.e-6)
|
|
{
|
|
return true;//up sort
|
|
}
|
|
return false;//down sort
|
|
}
|
|
|
|
BOOL AecDbECableLine::MaybeAddCrossConnectToThis(AcGePoint3d ptFr,AcGePoint3d ptTo,AcDbObjectId id)
|
|
{
|
|
AcDbObjectId idLay1,idLay2;
|
|
AcDbEntity* pEnt1 = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt1,id,AcDb::kForRead))
|
|
{
|
|
idLay1 = pEnt1->layerId();
|
|
pEnt1->close();
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//等标高的情况下
|
|
if (fabs(ptFr.z - ptTo.z) > 1.0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//id 的范围内选择实体,只考虑XY 面,其他三维单加四通
|
|
AcGePoint3d ptGe[4];
|
|
AcGeVector3d vtDir = ptTo - ptFr;
|
|
AcGeVector3d vtV = vtDir;
|
|
vtV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
vtV.normalize();
|
|
vtDir.normalize();
|
|
|
|
//四通的主支 DN 相同
|
|
double dM = 0.0,dB = 0.0;
|
|
double dL = GetElbowL(m_pPipeParam);
|
|
|
|
dM = dL;
|
|
dB = dL;
|
|
|
|
//选择范围缩小, 至少长度超过四通的长度
|
|
ptFr += m_pPipeParam->dSize[0] * 2.0 * vtDir;
|
|
ptTo -= m_pPipeParam->dSize[0] * 2.0 * vtDir;
|
|
|
|
ptGe[0] = ptFr;
|
|
ptGe[0] += vtV * m_pPipeParam->dSize[0] * 0.8;
|
|
ptGe[1] = ptTo;
|
|
ptGe[1] += vtV * m_pPipeParam->dSize[0] * 0.8;
|
|
ptGe[2] = ptGe[1] - vtV * 1.6 * m_pPipeParam->dSize[0];
|
|
ptGe[3] = ptGe[0] - vtV * 1.6 * m_pPipeParam->dSize[0];
|
|
|
|
ads_point pt[4];
|
|
for (int i = 0;i < 4;i++)
|
|
{
|
|
acdbWcs2Ucs(asDblArray(ptGe[i]),pt[i],false);
|
|
}
|
|
|
|
TCHAR szBuf[64];
|
|
memset(szBuf,0,sizeof(szBuf));
|
|
_tcscpy(szBuf, _T("AEC_DBCABTRY"));
|
|
|
|
struct resbuf rb;
|
|
rb.restype = 0;
|
|
rb.resval.rstring = szBuf;
|
|
rb.rbnext = NULL;
|
|
|
|
struct resbuf* pointlist = NULL;
|
|
pointlist = acutBuildList(RTPOINT, pt[0], RTPOINT, pt[1],
|
|
RTPOINT, pt[2], RTPOINT, pt[3], 0);
|
|
|
|
ads_name ss,ent;
|
|
acedSSGet(_T("CP"),pointlist,NULL,&rb,ss);
|
|
acutRelRb(pointlist);
|
|
|
|
Adesk::Int32 lLen = 0;
|
|
acedSSLength(ss,&lLen);
|
|
|
|
AcDbObjectId idT;
|
|
AcDbEntity* pEnt = NULL;
|
|
AcGeVector3d vtDir2;
|
|
|
|
AcDbLine line;
|
|
line.setStartPoint(ptFr);
|
|
line.setEndPoint(ptTo);
|
|
|
|
AcGeLineSeg3d line1;
|
|
line1.set(ptFr,ptTo);
|
|
|
|
AcGeLineSeg3d line2;
|
|
double dDN = 0.0;
|
|
std::vector<Point_ID> vtPtids;
|
|
|
|
for ( i = 0;i < lLen;i++)
|
|
{
|
|
acedSSName(ss,i,ent);
|
|
acdbGetObjectId(idT,ent);
|
|
if (idT == id) continue;
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idT,AcDb::kForRead))
|
|
{
|
|
idLay2 = pEnt->layerId();
|
|
if (idLay1 != idLay2)
|
|
{
|
|
pEnt->close();
|
|
continue;
|
|
}
|
|
|
|
AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt);
|
|
if (pWPipe != NULL)
|
|
{
|
|
AecHvac::DuctParam data;
|
|
memset(&data,0,sizeof(AecHvac::DuctParam));
|
|
pWPipe->GetDuctParam(data);
|
|
|
|
if (data.m_app != m_pPipeParam->m_app)
|
|
{
|
|
pEnt->close();
|
|
continue;
|
|
}
|
|
|
|
//判断标高是否一致,方向是否垂直,且 公称直径一致??
|
|
if ( fabs(pWPipe->EndPoint().z - ptTo.z) < 1.e-6
|
|
/*&& fabs(m_pPipeParam->dSize[0] - data.dSize[0]) < 1.e-6*/)
|
|
{
|
|
vtDir2 = pWPipe->EndPoint() - pWPipe->StartPoint();
|
|
if (vtDir2.isPerpendicularTo(vtDir))
|
|
{
|
|
line2.set(pWPipe->StartPoint(),pWPipe->EndPoint());
|
|
Point_ID ptid;
|
|
ptid.id = idT;
|
|
ptid.pCurve = &line;
|
|
|
|
if ( line1.intersectWith(line2,ptid.ptInt))
|
|
{
|
|
vtPtids.push_back(ptid);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
//排序
|
|
if (!vtPtids.empty())
|
|
{
|
|
std::sort(vtPtids.begin(),vtPtids.end(),ComparePointID);
|
|
|
|
typedef std::vector<Point_ID>::iterator PIDIT;
|
|
for (PIDIT it = vtPtids.begin();it != vtPtids.end();it++)
|
|
{
|
|
AddCross( (*it).id,(*it).ptInt,id);
|
|
}
|
|
}
|
|
acedSSFree(ss);
|
|
return FALSE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::SplitWPipe(AcGePoint3d& ptMid,double dL,AecDbECableTray* pWPipe,BOOL bEraseWhiletooShort/* = TRUE*/)
|
|
{
|
|
AcGePoint3d ptSta = pWPipe->StartPoint();
|
|
AcGePoint3d ptEnd = pWPipe->EndPoint();
|
|
AcGeVector3d vtDir = ptEnd - ptSta;
|
|
vtDir.normalize();
|
|
|
|
AecDbObjXDataMap* pXDataMapt = pWPipe->GetSpecialtyData();
|
|
|
|
AcGePoint3d ptTemp = ptMid - dL * vtDir;
|
|
AcGeVector3d vtDir1 = ptTemp - ptSta;
|
|
if (vtDir.isCodirectionalTo(vtDir1)) //同向,说明放得下L的 Tee
|
|
{
|
|
AecHvac::DuctParam data;
|
|
pWPipe->GetDuctParam(data);
|
|
|
|
//新建管子
|
|
//放得下L的 Tee 的情况,新建vtDir 方向的end端
|
|
AecDbECableTray* pWPipe1 = new AecDbECableTray;
|
|
AecDbObjXDataMap* pXDataMap = pWPipe1->GetSpecialtyData();
|
|
|
|
XHolder lH, rH;
|
|
memset(&lH, 0, sizeof(XHolder));
|
|
memset(&rH, 0, sizeof(XHolder));
|
|
|
|
if (data.m_app == WPipe::eTrench)
|
|
{
|
|
pWPipe->GetXHolder(kLeft, lH);
|
|
pWPipe->GetXHolder(kRight, rH);
|
|
}
|
|
|
|
//设置图层
|
|
AecHvac::DuctParam *pParam = &data;
|
|
AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, pParam->szSys, 4, _T("center2"), NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, pParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, pParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
|
|
pXDataMap->SetAt(PIPE_CENTLAY,idCenLay);
|
|
pXDataMap->SetAt(PIPE_OUTDLAY,idOutLay);
|
|
pXDataMap->SetAt(PIPE_SINGLAY,idSingle);
|
|
|
|
pWPipe1->SetDoubleLayer(idOutLay);
|
|
pWPipe1->SetSingleLayer(idSingle);
|
|
pWPipe1->SetCenterLayer(idCenLay);
|
|
pWPipe1->setLayer(idOutLay);
|
|
|
|
pWPipe1->SetDuctParam(&data);
|
|
|
|
pWPipe1->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pWPipe1->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
|
|
ptTemp = ptMid - dL * vtDir;
|
|
pWPipe1->SetStartPoint(ptSta);
|
|
pWPipe1->SetEndPoint(ptTemp);
|
|
pWPipe1->setLayer(pWPipe->layerId());
|
|
|
|
//套管,洞口
|
|
//移除内部关联的套管,如果位置在其中
|
|
RemoveHolePipe(pWPipe1);
|
|
|
|
if (pParam->m_app == WPipe::eTrench)
|
|
{
|
|
pWPipe1->SetXHolder(kLeft, lH);
|
|
pWPipe1->SetXHolder(kRight, rH);
|
|
}
|
|
|
|
AcDbObjectId id = CoreTools::AddToModelSpace(pWPipe1);
|
|
AddUserData(id,pXDataMap,0);
|
|
|
|
//改变现有的管子的起点
|
|
ptTemp = ptMid + dL * vtDir;
|
|
pWPipe->SetStartPoint(ptTemp);
|
|
|
|
//套管,洞口
|
|
//移除内部关联的套管,如果位置在其中
|
|
RemoveHolePipe(pWPipe);
|
|
|
|
return TRUE;
|
|
}
|
|
else //放不下,直接更改 start 或 end 腾出L位置
|
|
{
|
|
double dDis1 = ptMid.distanceTo(ptSta);
|
|
double dDis2 = ptMid.distanceTo(ptEnd);
|
|
|
|
if (dDis1 < dDis2 )//靠近sta
|
|
{
|
|
ptTemp = ptMid + dL * vtDir;
|
|
vtDir1 = ptEnd - ptTemp;
|
|
if (vtDir1.isCodirectionalTo(vtDir))
|
|
{
|
|
pWPipe->SetStartPoint(ptTemp);
|
|
return TRUE;
|
|
}
|
|
}
|
|
else//靠近 end
|
|
{
|
|
ptTemp = ptMid - dL * vtDir;
|
|
vtDir1 = ptTemp - ptSta;
|
|
if (vtDir1.isCodirectionalTo(vtDir))
|
|
{
|
|
pWPipe->SetEndPoint(ptTemp);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
//套管,洞口
|
|
//移除内部关联的套管,如果位置在其中
|
|
RemoveHolePipe(pWPipe);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void AecDbECableLine::RemoveHolePipe(AecDbECableTray* pWPipe)
|
|
{
|
|
AcGePoint3d ptS = pWPipe->StartPoint();
|
|
AcGePoint3d ptE = pWPipe->EndPoint();
|
|
AcGePoint3d ptOn;
|
|
AcGeVector3d vt1,vt2;
|
|
|
|
AecDbObjXDataMap* pXDatMap = pWPipe->GetSpecialtyData();
|
|
if (pXDatMap == NULL)
|
|
return;
|
|
|
|
//关联的洞口和套管联动
|
|
AecDbObjXDataMap::It it = pXDatMap->Begin();
|
|
AecDbObjXDataMap::It end = pXDatMap->End();
|
|
|
|
CString sKey;
|
|
AecXData cVal;
|
|
memset(&cVal,0,sizeof(AecXData));
|
|
|
|
CStringArray arKeysRemove;
|
|
AcDbObjectId idSrc,idCloned;
|
|
for (; it != end;)
|
|
{
|
|
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
|
|
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
|
|
{
|
|
AcDbHandle handle(cVal.pszVal);
|
|
|
|
AcDbObjectId idHole;
|
|
acdbCurDwg()->getAcDbObjectId(idHole,false,handle);
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idHole,AcDb::kForRead))
|
|
{
|
|
AecDbX3dPartEntity* pX3dPartEnt = AecDbX3dPartEntity::cast(pEnt);
|
|
if (pX3dPartEnt != NULL)
|
|
{
|
|
ptOn = pX3dPartEnt->GetOrgPoint(true);
|
|
|
|
vt1 = ptOn - ptS;
|
|
vt2 = ptOn - ptE;
|
|
|
|
//TEST
|
|
//AcDbCircle* pCir = new AcDbCircle;
|
|
//pCir->setCenter(ptOn);
|
|
//pCir->setRadius(100.0);
|
|
//CoreTools::AddToModelSpace(pCir);
|
|
|
|
if (vt1.dotProduct(vt2) > 1.e-10)//同向
|
|
{
|
|
}
|
|
else
|
|
{
|
|
arKeysRemove.Add(sKey);
|
|
}
|
|
}
|
|
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i = 0;i < arKeysRemove.GetSize();i++)
|
|
{
|
|
pXDatMap->RemoveAt(arKeysRemove.GetAt(i));
|
|
//acutPrintf(_T("\nRemove key %s"),arKeysRemove.GetAt(i));
|
|
}
|
|
}
|
|
|
|
|
|
BOOL AecDbECableLine::ModifyWPipe(AcGePoint3d& ptGe,AcDbObjectId id,int nPos)
|
|
{
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
|
|
{
|
|
AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt);
|
|
if (pWPipe != NULL)
|
|
{
|
|
if (nPos == 0)
|
|
{
|
|
AcGePoint3d ptGeT;
|
|
ptGeT = pWPipe->StartPoint();
|
|
pWPipe->SetStartPoint(ptGe);
|
|
}
|
|
|
|
if (nPos == 1)
|
|
{
|
|
AcGePoint3d ptGeT;
|
|
ptGeT = pWPipe->EndPoint();
|
|
pWPipe->SetEndPoint(ptGe);
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::AddTee(AecDbECableTray* pWPipe,double dL,const AcGePoint3d& ptMid,double dB, const AcGeVector3d& vtMin)
|
|
{
|
|
AecDbEcFitting* pFit = new AecDbEcFitting;
|
|
AecDbObjXDataMap* pXDataMap = pFit->GetSpecialtyData();
|
|
|
|
AcGeVector3d vtMaj = pWPipe->EndPoint() - pWPipe->StartPoint();
|
|
vtMaj.normalize();
|
|
|
|
double dRatio = m_pPipeParam->m_dRatio;
|
|
|
|
AecHvac::DuctParam paramMaj;
|
|
pWPipe->GetDuctParam(paramMaj);//取主宽
|
|
double dLx = GetElbowLx(¶mMaj);
|
|
|
|
paramMaj.dSize[3] = m_pPipeParam->dSize[0];//
|
|
|
|
//电缆沟设置分支
|
|
paramMaj.dSize[12] = m_pPipeParam->dSize[4];
|
|
paramMaj.dSize[13] = m_pPipeParam->dSize[5];
|
|
paramMaj.dSize[14] = m_pPipeParam->dSize[6];
|
|
paramMaj.dSize[15] = m_pPipeParam->dSize[7];
|
|
paramMaj.dSize[16] = m_pPipeParam->dSize[8];
|
|
paramMaj.dSize[17] = m_pPipeParam->dSize[9];
|
|
paramMaj.dSize[18] = m_pPipeParam->dSize[10];
|
|
|
|
pFit->SetDuctParam(paramMaj);
|
|
|
|
if (paramMaj.m_app == WPipe::eTrench)
|
|
{
|
|
XHolder lH, rH;
|
|
memset(&lH, 0, sizeof(XHolder));
|
|
memset(&rH, 0, sizeof(XHolder));
|
|
|
|
bool bLeft = pWPipe->GetXHolder(kLeft, lH);
|
|
bool bRight = pWPipe->GetXHolder(kRight, rH);
|
|
|
|
if (bLeft)
|
|
pFit->SetXHolder(kLeft, m_lHolder);
|
|
|
|
if (bRight)
|
|
pFit->SetXHolder(kRight, m_rHolder);
|
|
}
|
|
|
|
pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eTee);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度
|
|
pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio);
|
|
pFit->GetSpecialtyData()->SetAt(HTEE_Type,(int)AecHvac::eIncline2Branch);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin);
|
|
|
|
//设置图层
|
|
AecHvac::DuctParam *pParam = m_pPipeParam;
|
|
AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
|
|
pFit->setLayer(idOutLay);
|
|
pFit->SetDoubleLayer(idOutLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
|
|
AcDbObjectId id = CoreTools::AddToModelSpace(pFit);
|
|
AddUserData(id,pXDataMap,2);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::AddTee3(const AcGePoint3d &ptMid, double dL, const AcGeVector3d& vtMaj,const AcGeVector3d &vtMin, AecUserInterface &uinf)
|
|
{
|
|
AecDbEcFitting *pFit = new AecDbEcFitting;
|
|
AecDbObjXDataMap *pXDataMap = pFit->GetSpecialtyData();
|
|
|
|
double dLx = GetElbowLx(m_pPipeParam);
|
|
pFit->SetDuctParam(*m_pPipeParam);
|
|
|
|
pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE, 2);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW, 0);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME, (int)eTee);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度
|
|
pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio);
|
|
pFit->GetSpecialtyData()->SetAt(HTEE_Type, (int)AecHvac::eIncline2Branch);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin);
|
|
|
|
int nTeeStyle = 3;
|
|
pFit->GetSpecialtyData()->SetAt(KEY_TEESTYLE, nTeeStyle);
|
|
|
|
pFit->AddUserInterface(uinf);
|
|
|
|
//设置图层
|
|
AecHvac::DuctParam *pParam = m_pPipeParam;
|
|
AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
|
|
pFit->setLayer(idOutLay);
|
|
pFit->SetDoubleLayer(idOutLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
|
|
AcDbObjectId id = CoreTools::AddToModelSpace(pFit);
|
|
AddUserData(id, pXDataMap, 2);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::AddTee5(const AcGePoint3d &ptMid, double dL, const AcGeVector3d &vtMaj, const AcGeVector3d &vtMin, AecUserInterface &uinf)
|
|
{
|
|
AecDbEcFitting *pFit = new AecDbEcFitting;
|
|
AecDbObjXDataMap *pXDataMap = pFit->GetSpecialtyData();
|
|
|
|
double dLx = GetElbowLx(m_pPipeParam);
|
|
pFit->SetDuctParam(*m_pPipeParam);
|
|
|
|
pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE, 2);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW, 0);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME, (int)eTee);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度
|
|
pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio);
|
|
pFit->GetSpecialtyData()->SetAt(HTEE_Type, (int)AecHvac::eIncline2Branch);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin);
|
|
|
|
int nTeeStyle = 5;
|
|
pFit->GetSpecialtyData()->SetAt(KEY_TEESTYLE, nTeeStyle);
|
|
|
|
pFit->AddUserInterface(uinf);
|
|
|
|
|
|
//设置图层
|
|
AecHvac::DuctParam *pParam = m_pPipeParam;
|
|
AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
|
|
pFit->setLayer(idOutLay);
|
|
pFit->SetDoubleLayer(idOutLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
|
|
AcDbObjectId id = CoreTools::AddToModelSpace(pFit);
|
|
AddUserData(id, pXDataMap, 2);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::AddCross(AcDbObjectId id1,AcGePoint3d& ptInt,AcDbObjectId idThis)
|
|
{
|
|
AecHvac::DuctParam paramMaj,paramMin;
|
|
AecHvac::DuctParam param1,param2;
|
|
|
|
AecDbECableTray* pWPipe = NULL;
|
|
double dL = 0.0,dB = 0.0;
|
|
AcGeVector3d vtMaj,vtMin;
|
|
|
|
double dRatio = m_pPipeParam->m_dRatio;
|
|
|
|
double dLx = GetElbowLx(m_pPipeParam);
|
|
dL = GetElbowL(m_pPipeParam);
|
|
dB = dL;
|
|
|
|
XHolder lH, rH;
|
|
memset(&lH, 0, sizeof(XHolder));
|
|
memset(&rH, 0, sizeof(XHolder));
|
|
|
|
AcDbEntity* pEnt1 = NULL;
|
|
AcDbEntity* pEnt2 = NULL;
|
|
|
|
//确定maj
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt1,id1,AcDb::kForRead))
|
|
{
|
|
pWPipe = AecDbECableTray::cast(pEnt1);
|
|
if (pWPipe != NULL)
|
|
{
|
|
pWPipe->GetDuctParam(param1);//取主宽
|
|
|
|
if (param1.m_app == WPipe::eTrench)
|
|
{
|
|
pWPipe->GetXHolder(kLeft, lH);
|
|
pWPipe->GetXHolder(kRight, rH);
|
|
}
|
|
}
|
|
pEnt1->close();
|
|
}
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt2,idThis,AcDb::kForRead))
|
|
{
|
|
pWPipe = AecDbECableTray::cast(pEnt2);
|
|
if (pWPipe != NULL)
|
|
{
|
|
pWPipe->GetDuctParam(param2);//取主宽
|
|
}
|
|
pEnt2->close();
|
|
}
|
|
|
|
bool b2isMaj = false;
|
|
if (param1.dSize[0] > param2.dSize[0])
|
|
{
|
|
memcpy(¶mMaj,¶m1,sizeof(AecHvac::DuctParam));
|
|
memcpy(¶mMin,¶m2,sizeof(AecHvac::DuctParam));
|
|
}
|
|
else
|
|
{
|
|
memcpy(¶mMaj,¶m2,sizeof(AecHvac::DuctParam));
|
|
memcpy(¶mMin,¶m1,sizeof(AecHvac::DuctParam));
|
|
b2isMaj = true;
|
|
}
|
|
|
|
dLx = GetElbowLx(¶mMaj);
|
|
dL = GetElbowL(¶mMaj);
|
|
dB = dL;
|
|
|
|
if ( fabs(param1.dSize[1] - param2.dSize[1]) > 1.e-1)
|
|
{
|
|
acutPrintf(_T("\n选择的两桥架高度不同,不能创建四通!"));
|
|
return FALSE;
|
|
}
|
|
|
|
AcDbObjectId idLay;
|
|
// id1 管分割为两部分
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt1,id1,AcDb::kForWrite))
|
|
{
|
|
pWPipe = AecDbECableTray::cast(pEnt1);
|
|
if (pWPipe != NULL)
|
|
{
|
|
vtMaj = pWPipe->EndPoint() - pWPipe->StartPoint();
|
|
vtMaj.normalize();
|
|
|
|
AcGeLineSeg3d ln(pWPipe->StartPoint(),pWPipe->EndPoint());
|
|
if (ln.isOn(ptInt)) //落在管子上,两管线相交
|
|
{
|
|
SplitWPipe(ptInt,dL,pWPipe,TRUE);
|
|
}
|
|
else //不落在管子上,两管线延长相交, 外部加四通命令调用
|
|
{
|
|
vtMaj.normalize();
|
|
double dDis1 = ptInt.distanceTo(pWPipe->StartPoint());
|
|
double dDis2 = ptInt.distanceTo(pWPipe->EndPoint());
|
|
|
|
if (dDis1 < dDis2)//距离sta近
|
|
{
|
|
pWPipe->SetStartPoint(ptInt + vtMaj * dL);
|
|
}
|
|
else
|
|
{
|
|
pWPipe->SetEndPoint(ptInt - vtMaj * dL);
|
|
}
|
|
}
|
|
}
|
|
pEnt1->close();
|
|
}
|
|
|
|
//idThis 管分割为两部分
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt2,idThis,AcDb::kForWrite))
|
|
{
|
|
idLay = pEnt2->layerId();
|
|
pWPipe = AecDbECableTray::cast(pEnt2);
|
|
if (pWPipe != NULL)
|
|
{
|
|
vtMin = pWPipe->EndPoint() - pWPipe->StartPoint();
|
|
vtMin.normalize();
|
|
|
|
AcGeLineSeg3d ln(pWPipe->StartPoint(),pWPipe->EndPoint());
|
|
if (ln.isOn(ptInt)) //落在管子上,两管线相交
|
|
{
|
|
if ( !SplitWPipe(ptInt,dB,pWPipe,FALSE) )
|
|
{
|
|
//太短,放不下四通
|
|
pEnt2->close();
|
|
return FALSE;
|
|
}
|
|
}
|
|
else //不落在管子上,两管线延长相交, 外部加四通命令调用
|
|
{
|
|
vtMin.normalize();
|
|
double dDis1 = ptInt.distanceTo(pWPipe->StartPoint());
|
|
double dDis2 = ptInt.distanceTo(pWPipe->EndPoint());
|
|
|
|
if (dDis1 < dDis2)//距离sta近
|
|
{
|
|
pWPipe->SetStartPoint(ptInt + vtMin * dL);
|
|
}
|
|
else
|
|
{
|
|
pWPipe->SetEndPoint(ptInt - vtMin * dL);
|
|
}
|
|
}
|
|
}
|
|
pEnt2->close();
|
|
}
|
|
|
|
//加入四通
|
|
AcGeVector3d vtNro = vtMin.crossProduct(vtMaj);
|
|
AecDbEcFitting* pFit = new AecDbEcFitting;
|
|
AecDbObjXDataMap* pXDataMap = pFit->GetSpecialtyData();
|
|
|
|
//设置图层
|
|
int nColor = KTSetting::GetLayerColor(LAY_CABTRY_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx(LAY_CABTRY_CEN,m_pPipeParam->szSys,4,_T("center2"),NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((m_pPipeParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT,m_pPipeParam->szSys,nColor, (m_pPipeParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"),NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((m_pPipeParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG,m_pPipeParam->szSys,7, (m_pPipeParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"),NULL);
|
|
|
|
pFit->setLayer(idOutLay);
|
|
pFit->SetDoubleLayer(idOutLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
pFit->SetCenterLayer(idCenLay);
|
|
|
|
paramMaj.dSize[3] = paramMin.dSize[0];//
|
|
|
|
//电缆沟设置分支
|
|
paramMaj.dSize[12] = m_pPipeParam->dSize[4];
|
|
paramMaj.dSize[13] = m_pPipeParam->dSize[5];
|
|
paramMaj.dSize[14] = m_pPipeParam->dSize[6];
|
|
paramMaj.dSize[15] = m_pPipeParam->dSize[7];
|
|
paramMaj.dSize[16] = m_pPipeParam->dSize[8];
|
|
paramMaj.dSize[17] = m_pPipeParam->dSize[9];
|
|
paramMaj.dSize[18] = m_pPipeParam->dSize[10];
|
|
|
|
pFit->SetDuctParam(paramMaj);
|
|
|
|
if (paramMaj.m_app == WPipe::eTrench)
|
|
{
|
|
pFit->SetXHolder(kLeft,lH);
|
|
pFit->SetXHolder(kRight, rH);
|
|
}
|
|
|
|
pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eCross);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MID, ptInt);
|
|
pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度
|
|
pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio);
|
|
pFit->GetSpecialtyData()->SetAt(HTEE_Type,(int)AecHvac::eInterCross);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, b2isMaj ? vtMin : vtMaj);
|
|
pFit->GetSpecialtyData()->SetAt(KEY_MINBR, b2isMaj ? vtMaj : vtMin);
|
|
|
|
AcDbObjectId id = CoreTools::AddToModelSpace(pFit);
|
|
AddUserData(id,pXDataMap,2);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::AddElbow(AcDbObjectId id1,AcGePoint3d& ptGe,AcDbObjectId idThis)
|
|
{
|
|
AecDbECableTray* pWPipe1 = NULL;
|
|
AecDbECableTray* pWPipe2 = NULL;
|
|
AcDbEntity* pEnt1 = NULL;
|
|
AcDbEntity* pEnt2 = NULL;
|
|
BOOL bSuccess = FALSE;
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt1,id1,AcDb::kForWrite))
|
|
{
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt2,idThis,AcDb::kForWrite))
|
|
{
|
|
pWPipe1 = AecDbECableTray::cast(pEnt1);
|
|
pWPipe2 = AecDbECableTray::cast(pEnt2);
|
|
|
|
if (pWPipe1 != NULL && pWPipe2 != NULL)
|
|
{
|
|
AcGeLine3d ln1(pWPipe1->StartPoint(),pWPipe1->EndPoint());
|
|
AcGeLine3d ln2(pWPipe2->StartPoint(),pWPipe2->EndPoint());
|
|
|
|
AcGePoint3d ptMid = ptGe;
|
|
ln1.intersectWith(ln2,ptMid);
|
|
|
|
ptGe = ptMid;//??
|
|
AecHvac::DuctParam param1,param2;
|
|
|
|
pWPipe1->GetDuctParam(param1);
|
|
pWPipe2->GetDuctParam(param2);
|
|
|
|
int npos1 = 1,npos2 = 1;
|
|
AcGeVector3d vtMaj,vtMin;
|
|
double dDis1 = ptMid.distanceTo(pWPipe1->EndPoint());
|
|
double dDis2 = ptMid.distanceTo(pWPipe1->StartPoint());
|
|
vtMaj = pWPipe1->EndPoint() - pWPipe1->StartPoint();//默认靠近 end
|
|
if (dDis1 > dDis2)
|
|
{
|
|
vtMaj = pWPipe1->StartPoint() - pWPipe1->EndPoint();//靠近 sta
|
|
npos1 = 0;
|
|
}
|
|
vtMaj.normalize();
|
|
vtMaj.negate();
|
|
|
|
dDis1 = ptMid.distanceTo(pWPipe2->EndPoint());
|
|
dDis2 = ptMid.distanceTo(pWPipe2->StartPoint());
|
|
|
|
vtMin = pWPipe2->EndPoint() - pWPipe2->StartPoint();//默认靠近 end
|
|
if (dDis1 > dDis2)
|
|
{
|
|
vtMin = pWPipe2->StartPoint() - pWPipe2->EndPoint();//靠近 sta
|
|
npos2 = 0;
|
|
}
|
|
vtMin.normalize();
|
|
vtMin.negate();
|
|
|
|
//if ( fabs(param1.dSize[0] - param2.dSize[0]) < 1.e-6)
|
|
{
|
|
//创建弯头,是插入到当前管子的接口记录的前面
|
|
AcDbObjectId id = CreateElbow(vtMaj,ptMid,vtMin,¶m1,TRUE);
|
|
|
|
//获取万头接口,改变边的管子
|
|
AcDbEntity* pEnt3 = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt3,id,AcDb::kForRead))
|
|
{
|
|
AecDbEcFitting* pFit = AecDbEcFitting::cast(pEnt3);
|
|
if (pFit != NULL)
|
|
{
|
|
AecInterface inf1,inf2;
|
|
pFit->GetInterface(0,inf1);
|
|
pFit->GetInterface(1,inf2);
|
|
|
|
AcGeVector3d vtPipe = pWPipe1->EndPoint() - pWPipe1->StartPoint();
|
|
if (vtPipe.isParallelTo(inf1.vtDir))
|
|
{
|
|
if (npos1 == 0)//改sta
|
|
pWPipe1->SetStartPoint(inf1.ptPos);
|
|
else
|
|
pWPipe1->SetEndPoint(inf1.ptPos);
|
|
|
|
if (npos2 == 0)
|
|
pWPipe2->SetStartPoint(inf2.ptPos);
|
|
else
|
|
pWPipe2->SetEndPoint(inf2.ptPos);
|
|
}
|
|
else
|
|
{
|
|
if (npos1 == 0)//改sta
|
|
pWPipe1->SetStartPoint(inf2.ptPos);
|
|
else
|
|
pWPipe1->SetEndPoint(inf2.ptPos);
|
|
|
|
if (npos2 == 0)
|
|
pWPipe2->SetStartPoint(inf1.ptPos);
|
|
else
|
|
pWPipe2->SetEndPoint(inf1.ptPos);
|
|
}
|
|
}
|
|
pEnt3->close();
|
|
}
|
|
}
|
|
bSuccess = TRUE;
|
|
}
|
|
pEnt2->close();
|
|
}
|
|
pEnt1->close();
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
BOOL AecDbECableLine::ChangeElbowToTree(AecDbEcFitting* pDbFit,AcGeVector3d vtMaj,AcGePoint3d ptGeM,AcGeVector3d vtMin,double dDn,AECStatusRecord* pCurRec)
|
|
{
|
|
//查询 Tee 数据
|
|
AecHvac::DuctParam param;
|
|
memset(¶m,0,sizeof(AecHvac::DuctParam));
|
|
pDbFit->GetDuctParam(param);
|
|
|
|
double dL = 0.0,dS = 0.0;
|
|
dL = GetElbowL(¶m);
|
|
dS = dL;
|
|
double dLx = GetElbowLx(¶m);
|
|
|
|
AecInterface intf1,intf2;
|
|
pDbFit->GetInterface(0,intf1);
|
|
pDbFit->GetInterface(1,intf2);
|
|
|
|
vtMaj.normalize();
|
|
vtMin.normalize();
|
|
|
|
//创建三通
|
|
AecDbEcFitting* pFitting = new AecDbEcFitting;
|
|
AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData();
|
|
|
|
pFitting->SetDuctParam(param);
|
|
|
|
if (param.m_app == WPipe::eTrench)
|
|
{
|
|
XHolder lHolder, rHolder;
|
|
memset(&lHolder, 0, sizeof(XHolder));
|
|
memset(&rHolder, 0, sizeof(XHolder));
|
|
|
|
bool bLeft = pDbFit->GetXHolder(kLeft, lHolder);
|
|
bool bRight = pDbFit->GetXHolder(kRight, rHolder);
|
|
|
|
if (bLeft)
|
|
pFitting->SetXHolder(kLeft, m_lHolder);
|
|
|
|
if (bRight)
|
|
pFitting->SetXHolder(kRight, m_rHolder);
|
|
}
|
|
|
|
pFitting->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pFitting->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
pFitting->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eTee);
|
|
pFitting->GetSpecialtyData()->SetAt(KEY_MID, ptGeM);
|
|
pFitting->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度
|
|
pFitting->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio);
|
|
pFitting->GetSpecialtyData()->SetAt(HTEE_Type,(int)AecHvac::eIncline2Branch);
|
|
pFitting->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj);
|
|
pFitting->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin);
|
|
|
|
AcGeVector3d vtNro = vtMin.crossProduct(vtMaj);
|
|
pXDataMap->SetAt(KEY_NORMAL,vtNro);
|
|
|
|
//设置图层
|
|
AecHvac::DuctParam *pParam = ¶m;
|
|
AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT);
|
|
AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL);
|
|
AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL);
|
|
|
|
pFitting->setLayer(idOutLay);
|
|
pFitting->SetDoubleLayer(idOutLay);
|
|
pFitting->SetCenterLayer(idCenLay);
|
|
pFitting->SetCenterLayer(idCenLay);
|
|
|
|
//可能的几种修改,更改弯头两头的管子的位置
|
|
AcGePoint3d ptGe;
|
|
if (intf1.vtDir.isParallelTo(vtMin))
|
|
{
|
|
ptGe = ptGeM + dS * vtMin;
|
|
ModifyPipeOfElbow(GetConnectObject(intf1, m_arHistoryIntfs),intf1.ptPos,ptGe);
|
|
}
|
|
|
|
if (intf2.vtDir.isParallelTo(vtMin))
|
|
{
|
|
ptGe = ptGeM + dS * vtMin;
|
|
ModifyPipeOfElbow(GetConnectObject(intf2, m_arHistoryIntfs),intf2.ptPos,ptGe);
|
|
}
|
|
|
|
if (intf1.vtDir.isParallelTo(vtMaj))
|
|
{
|
|
ptGe = ptGeM - dL * vtMaj;
|
|
ModifyPipeOfElbow(GetConnectObject(intf1, m_arHistoryIntfs),intf1.ptPos,ptGe);
|
|
}
|
|
|
|
if (intf2.vtDir.isParallelTo(vtMaj))
|
|
{
|
|
ptGe = ptGeM - dL * vtMaj;//反向
|
|
ModifyPipeOfElbow(GetConnectObject(intf2, m_arHistoryIntfs),intf2.ptPos,ptGe);
|
|
}
|
|
|
|
//替换pdbfit
|
|
pDbFit->erase();
|
|
|
|
AcDbObjectId id = CoreTools::AddToModelSpace(pFitting);
|
|
AddUserData(id,pXDataMap,2);
|
|
|
|
//
|
|
AECStatusRecord* pRecMid = new AECStatusRecord;
|
|
pRecMid->CopyFrom(pCurRec);
|
|
ptGe = ptGeM + vtMaj * dL;
|
|
pRecMid->SetAcquirePoint(ptGe);
|
|
m_pPipeJig->PushBackStatusRec(pRecMid);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AecDbECableLine::ChangeTeeToCross(AecDbEcFitting* pDbFit,AcGeVector3d& vtMaj,AcGeVector3d& vtMin,AECStatusRecord* pCurRec)
|
|
{
|
|
AecHvac::DuctParam param;
|
|
memset(¶m,0,sizeof(AecHvac::DuctParam));
|
|
pDbFit->GetDuctParam(param);
|
|
|
|
double dL = 0.0,dB = 0.0;
|
|
dL = GetElbowL(¶m);
|
|
dB = dL;
|
|
double dLx = GetElbowLx(¶m);
|
|
|
|
AecDbObjXDataMap* pXDataMap = pDbFit->GetSpecialtyData();
|
|
|
|
pXDataMap->SetAt(KEY_RUNTIME, eCross);
|
|
pXDataMap->SetAt(KEY_MAJBR,vtMaj);
|
|
pXDataMap->SetAt(KEY_MINBR,vtMin);//
|
|
|
|
AcGeVector3d vtNro = vtMaj.crossProduct(vtMin);//
|
|
pXDataMap->SetAt(KEY_NORMAL,vtNro);
|
|
|
|
pXDataMap->SetAt(KEY_L,dL);
|
|
pXDataMap->SetAt(KEY_T,dB);
|
|
|
|
AcGePoint3d ptMid;
|
|
pXDataMap->GetAt(KEY_MID,ptMid);
|
|
|
|
pDbFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2);
|
|
pDbFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0);
|
|
pDbFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eCross);
|
|
pDbFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid);
|
|
pDbFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度
|
|
pDbFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio);
|
|
pDbFit->GetSpecialtyData()->SetAt(HTEE_Type,(int)AecHvac::eInterCross);
|
|
pDbFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj);
|
|
pDbFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin);
|
|
|
|
vtMin.normalize();
|
|
AcGePoint3d ptGe = ptMid - vtMin * dB;
|
|
|
|
AECStatusRecord* pRecMid = new AECStatusRecord;
|
|
pRecMid->CopyFrom(pCurRec);
|
|
pRecMid->SetAcquirePoint(ptGe);
|
|
m_pPipeJig->PushBackStatusRec(pRecMid);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void AecDbECableLine::ModifyPipeOfElbow(AcDbObjectId id,AcGePoint3d ptOld,AcGePoint3d ptNew)
|
|
{
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
|
|
{
|
|
AecDbECableTray* pPipe = AecDbECableTray::cast(pEnt);
|
|
if (pPipe != NULL)
|
|
{
|
|
AcGePoint3d ptGeT;
|
|
AcGeVector3d vtPipe = pPipe->EndPoint() - pPipe->StartPoint();
|
|
|
|
if ( pPipe->EndPoint().distanceTo(ptOld) < 1.e-6)
|
|
{
|
|
ptGeT = pPipe->EndPoint();
|
|
pPipe->SetEndPoint(ptNew);
|
|
}
|
|
|
|
if (pPipe->StartPoint().distanceTo(ptOld) < 1.e-6)
|
|
{
|
|
ptGeT = pPipe->StartPoint();
|
|
pPipe->SetStartPoint(ptNew);
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
double AecDbECableLine::PixelToWcs(int nPixel)
|
|
{
|
|
ads_point ptScreenSize;
|
|
double nViewSize;
|
|
struct resbuf rb1,rb2;
|
|
acedGetVar(_T("ScreenSize"), &rb1);
|
|
acedGetVar(_T("ViewSize"), &rb2);
|
|
nViewSize = rb2.resval.rreal;
|
|
ads_point_set(rb1.resval.rpoint,ptScreenSize);
|
|
|
|
if (ptScreenSize[1] < 1.0E-6 || nViewSize < 1.0E-6)
|
|
return 0.0;
|
|
|
|
double hight = (nViewSize / ptScreenSize[Y]) * nPixel;
|
|
return hight;
|
|
}
|
|
|
|
void AecDbECableLine::AddUserData(AcDbObjectId id,AecDbObjXDataMap* pXDataMap,int nType)
|
|
{
|
|
// 增加参数 [10/24/2016 Rex]
|
|
if(g_pMapData != NULL && !id.isNull())
|
|
{
|
|
AecDbObjXDataMap* pXTempDataMap = new AecDbObjXDataMap();
|
|
CMapStringToString mapData;
|
|
|
|
if(pXTempDataMap->Read(id,_T("BIMEQUIP"),TRUE))
|
|
{
|
|
//用户数据USER0~999
|
|
CString sKey,sVal;
|
|
for (int i = 0;i < MAX_BIM_DATA_LEN;i++)
|
|
{
|
|
sKey.Format(_T("user%d"),i) ;
|
|
if (pXDataMap->GetAt(sKey,sVal))
|
|
{
|
|
mapData.SetAt(sKey,sVal);
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
mapData.RemoveAll();
|
|
CString sKey;
|
|
CString sVal;
|
|
for (POSITION ps = g_pMapData->GetStartPosition();ps != NULL;)
|
|
{
|
|
g_pMapData->GetNextAssoc(ps,sKey,sVal);
|
|
mapData.SetAt(sKey,sVal);
|
|
}
|
|
for (int i = 0;i < MAX_BIM_DATA_LEN;i++)
|
|
{
|
|
sKey.Format(_T("user%d"),i) ;
|
|
pXTempDataMap->RemoveAt(sKey);
|
|
}
|
|
for (POSITION ps = mapData.GetStartPosition();ps != NULL;)
|
|
{
|
|
mapData.GetNextAssoc(ps,sKey,sVal);
|
|
|
|
if(sVal.Find(_T("物料描述")) != -1)
|
|
{
|
|
//nType == 0 Pipe,1 Elbow,2 Tee,3 Cross,4 Flange
|
|
CString szTempKey = _T("");
|
|
switch (nType)
|
|
{
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
{
|
|
if(nType == 1)
|
|
szTempKey = _T("弯头");
|
|
else if(nType == 2)
|
|
szTempKey = _T("三通");
|
|
else if(nType == 3)
|
|
szTempKey = _T("四通");
|
|
else if(nType == 4)
|
|
szTempKey = _T("法兰");
|
|
else if(nType == 5)
|
|
szTempKey = _T("变径");
|
|
else
|
|
szTempKey = _T("");
|
|
CString szTemp;
|
|
szTemp = sVal;
|
|
int nIndex = szTemp.Find(_T("("));
|
|
if(nIndex >= 0)
|
|
{
|
|
szTemp = szTemp.Mid(nIndex);
|
|
szTempKey = _T("物料描述:") + szTempKey;
|
|
szTemp = szTempKey + szTemp;
|
|
sVal = szTemp;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
pXTempDataMap->SetAt(sKey,sVal);
|
|
}
|
|
//pXTempDataMap->SetAt(_T("user0"),_T("test:test"));
|
|
if(pXTempDataMap->Write(id,_T("BIMEQUIP"),TRUE))
|
|
{
|
|
DELETE_PTR(pXTempDataMap);
|
|
pXTempDataMap = NULL;
|
|
}
|
|
}
|
|
} |