1399 lines
31 KiB
C++
1399 lines
31 KiB
C++
#include "StdAfx.h"
|
|
#include "StdArx.h"
|
|
#include "AecDbPipeHanger.h"
|
|
#include "AecDbEwPipe.h"
|
|
#include "AecDbEwFitting.h"
|
|
#include "AecDbWall.h"
|
|
#include "AecDbColumn.h"
|
|
#include "CoreTools.h"
|
|
#include "AecDbObjXDataMap.h"
|
|
#include "KTCadUtility.h"
|
|
#include "CGZDJDlg.h"
|
|
#include "KTCADSysVar.h"
|
|
#include "AecDbEwPipeDim.h"
|
|
#include "KTSetting.h"
|
|
#include "dbtable.h"
|
|
|
|
|
|
#define DXF_PIPE_ONLY _T("AEC_EWPIPE")
|
|
#define DXF_FITTING_ONLY _T("AEC_DBEWFIT")
|
|
#define DXF_PIPE_FITTING_EQUI _T("AEC_EWPIPE,AEC_DBEWFIT,AEC_DBWEQUIPMENT")
|
|
#define DXF_PIPE_FITTING _T("AEC_EWPIPE,AEC_DBEWFIT")
|
|
#define DXF_WALL_ONLY _T("AEC_DBWALL,AEC_DBCOLMN")
|
|
|
|
BOOL DLLIMPEXP GetDocScale(double &dPScale);
|
|
|
|
typedef struct WallColData
|
|
{
|
|
int nType;
|
|
WallData wDat;
|
|
ColumnParam colDa;
|
|
AcDbCurve * pCol2d;
|
|
|
|
WallColData() { pCol2d = NULL; }
|
|
~WallColData()
|
|
{
|
|
if (pCol2d != NULL)
|
|
delete pCol2d;
|
|
}
|
|
}WALLCOLDATA;
|
|
|
|
static BOOL SelectPipePos(WallColData& wcdat,AcDbCurve *pWallBaseCrv, AcGeVector3d& vtOff, AcGePoint3d& pt3dL1ElDn, int nNo)
|
|
{
|
|
AcDbCurve* pPipeBase = NULL;
|
|
WPipe::PipeParam *pPm1 = NULL;
|
|
ads_name ent;
|
|
ads_point pt;
|
|
CString sTip;
|
|
sTip = (nNo == 0) ? _T("\n请选择与墙平行的最近管线实体:") : _T("\n请选择与墙平行的第二管线实体:");
|
|
|
|
struct resbuf *pRbP = acutBuildList(RTDXF0, DXF_PIPE_ONLY, 0);
|
|
int nRes = CKTCadUtility::SelectEntity(sTip, ent, pRbP, pt);
|
|
if (nRes == RTNORM)
|
|
{
|
|
AcDbObjectId id;
|
|
AcGePoint3d ptOn,ptE,ptClstoPipe,ptOnCol2d;
|
|
acdbGetObjectId(id, ent);
|
|
AcDbEntity *pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
|
|
{
|
|
AecDbEwPipe *pPipe1 = AecDbEwPipe::cast(pEnt);
|
|
if (pPipe1 != NULL)
|
|
{
|
|
pPipe1->GetAt(PIPE_DN, pt3dL1ElDn.z);
|
|
|
|
pPm1 = pPipe1->GetPipeParam();
|
|
|
|
//管子底部标高
|
|
pt3dL1ElDn.y = pPm1->m_dEl - 0.5 * ((pPm1->m_eD == WPipe::eOD) ? pPm1->m_dOD : pPm1->m_dDN);
|
|
|
|
if (pWallBaseCrv != NULL)
|
|
{
|
|
if (wcdat.nType == 0)
|
|
{
|
|
pWallBaseCrv->getClosestPointTo(pPipe1->EndPoint(), ptOn, Adesk::kTrue);
|
|
vtOff = pPipe1->EndPoint() - ptOn;
|
|
|
|
vtOff.z = 0.0;
|
|
pt3dL1ElDn.x = vtOff.length();
|
|
pt3dL1ElDn.x -= 0.5 * wcdat.wDat.dThick;
|
|
}
|
|
else//col
|
|
{
|
|
pWallBaseCrv->getEndPoint(ptE);
|
|
pPipe1->getClosestPointTo(ptE, ptClstoPipe, Adesk::kTrue);
|
|
|
|
pWallBaseCrv->getClosestPointTo(ptClstoPipe, ptOn, Adesk::kTrue);
|
|
|
|
vtOff = ptClstoPipe - ptOn;//
|
|
vtOff.z = 0.0;
|
|
pt3dL1ElDn.x = vtOff.length();
|
|
|
|
if (wcdat.pCol2d != NULL)
|
|
{
|
|
wcdat.pCol2d->getClosestPointTo(ptClstoPipe, ptOnCol2d);
|
|
ptOnCol2d.z = ptClstoPipe.z;
|
|
pt3dL1ElDn.x -= ptOnCol2d.distanceTo(ptOn);
|
|
}
|
|
}
|
|
|
|
pEnt->close();
|
|
acutRelRb(pRbP);
|
|
delete pPm1;
|
|
return TRUE;
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acutRelRb(pRbP);
|
|
delete pPm1;
|
|
return FALSE;
|
|
}
|
|
|
|
static AcDbCurve* SelectPipePos(AcGeVector3d& vtPipe, AcGePoint3d& pt3dL1ElDn)
|
|
{
|
|
CString sTip = _T("\n请选择管线实体:");
|
|
AcDbCurve* pPipeBase = NULL;
|
|
ads_name ent;
|
|
ads_point pt;
|
|
BOOL bSetOK = 0;
|
|
|
|
struct resbuf *pRbP = acutBuildList(RTDXF0, DXF_PIPE_ONLY, 0);
|
|
int nRes = CKTCadUtility::SelectEntity(sTip, ent, pRbP, pt);
|
|
if (nRes == RTNORM)
|
|
{
|
|
AcDbObjectId id;
|
|
acdbGetObjectId(id, ent);
|
|
WPipe::PipeParam *pPm1 = NULL;
|
|
|
|
AcDbEntity *pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
|
|
{
|
|
AecDbEwPipe *pPipe1 = AecDbEwPipe::cast(pEnt);
|
|
if (pPipe1 != NULL)
|
|
{
|
|
pPipeBase = pPipe1->GetBaseCurve();
|
|
pPipe1->GetAt(PIPE_DN, pt3dL1ElDn.z);
|
|
|
|
pPm1 = pPipe1->GetPipeParam();
|
|
pt3dL1ElDn.y = pPm1->m_dEl - 0.5 * ((pPm1->m_eD == WPipe::eOD) ? pPm1->m_dOD : pPm1->m_dDN);
|
|
delete pPm1;
|
|
|
|
vtPipe = pPipe1->EndPoint() - pPipe1->StartPoint();
|
|
vtPipe.normalize();
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
return pPipeBase;
|
|
}
|
|
|
|
static AcDbCurve* SelectElbowPos(AcGeVector3d& vtMaj, AcGeVector3d& vtMin, AcGePoint3d& ptMid,AcGePoint3d& pt3dL1ElDn)
|
|
{
|
|
CString sTip = _T("\n请选择弯头实体:");
|
|
AcDbCurve* pPipeBase = NULL;
|
|
ads_name ent;
|
|
ads_point pt;
|
|
BOOL bSetOK = 0;
|
|
|
|
struct resbuf *pRbP = acutBuildList(RTDXF0, DXF_FITTING_ONLY, 0);
|
|
int nRes = CKTCadUtility::SelectEntity(sTip, ent, pRbP, pt);
|
|
if (nRes == RTNORM)
|
|
{
|
|
AcDbObjectId id;
|
|
acdbGetObjectId(id, ent);
|
|
WPipe::PipeParam *pPm1 = NULL;
|
|
|
|
AcDbEntity *pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
|
|
{
|
|
AecDbEwFitting *pFit = AecDbEwFitting::cast(pEnt);
|
|
if (pFit != NULL)
|
|
{
|
|
if (eElbow == pFit->GetFittingType() ||
|
|
eReduceElbow == pFit->GetFittingType())
|
|
{
|
|
pFit->GetAt(KEY_MAJBR, vtMaj);
|
|
pFit->GetAt(KEY_MINBR, vtMin);
|
|
pFit->GetAt(KEY_MID, ptMid);
|
|
|
|
AcGeTol tol;
|
|
tol.setEqualPoint(1.e-3);
|
|
tol.setEqualVector(1.e-3);
|
|
AcGeVector3d vtNorm = vtMaj.crossProduct(vtMin);
|
|
if (!vtNorm.isParallelTo(AcGeVector3d::kZAxis))
|
|
{
|
|
}
|
|
else
|
|
{
|
|
acedAlert(_T("请选择立放置的弯头!"));
|
|
pEnt->close();
|
|
return NULL;
|
|
}
|
|
|
|
pFit->GetAt(PIPE_DN, pt3dL1ElDn.z);
|
|
|
|
AcDbArc* pArc = pFit->GetElbowArc();
|
|
|
|
pPipeBase = pArc;
|
|
pt3dL1ElDn.x = 0;
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
return pPipeBase;
|
|
}
|
|
|
|
AcDbCurve *SelectWall(WallColData& wcdat)
|
|
{
|
|
memset(&wcdat, 0,sizeof(WallColData));
|
|
AcDbCurve *pBaseCrv = NULL;
|
|
ads_name ent;
|
|
ads_point pt;
|
|
struct resbuf *pRbW = acutBuildList(RTDXF0, DXF_WALL_ONLY, 0);
|
|
int nRes = CKTCadUtility::SelectEntity(_T("\n选择墙体或柱子实体:"), ent, pRbW, pt);
|
|
acutRelRb(pRbW);
|
|
if (nRes == RTNORM)
|
|
{
|
|
AcDbObjectId idW;
|
|
acdbGetObjectId(idW, ent);
|
|
|
|
AcDbEntity *pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, idW, AcDb::kForRead))
|
|
{
|
|
AecDbXWall *pWall = AecDbXWall::cast(pEnt);
|
|
if (pWall != NULL)
|
|
{
|
|
pWall->GetWallData(wcdat.wDat);
|
|
pBaseCrv = pWall->GetBaseCurve();
|
|
wcdat.nType = 0;
|
|
}
|
|
|
|
AecDbColumn* pCol = AecDbColumn::cast(pEnt);
|
|
if (pCol != NULL)
|
|
{
|
|
pCol->GetColumnData(wcdat.colDa);
|
|
pBaseCrv = pCol->GetBaseCurve();
|
|
|
|
wcdat.pCol2d = pCol->GetConvexhull2d();
|
|
wcdat.nType = 1;
|
|
}
|
|
|
|
pEnt->close();
|
|
}
|
|
}
|
|
return pBaseCrv;
|
|
}
|
|
|
|
static int AcedRefGetPoint(const ads_point pt, const ACHAR *prompt,ads_point result)
|
|
{
|
|
acedInitGet(RSG_NONULL, _T("R"));
|
|
int nRes = acedGetPoint(pt, prompt, result);
|
|
if (nRes == RTNORM)
|
|
{
|
|
}
|
|
else if (nRes == RTKWORD)
|
|
{
|
|
TCHAR szKey[2];
|
|
szKey[0] = '0';
|
|
acedGetInput(szKey);
|
|
|
|
if (szKey[0] == _T('R') || szKey[0] == _T('r') )
|
|
{
|
|
//参考点<退出>:
|
|
ads_point ptref;
|
|
nRes = acedGetPoint(pt, _T("\n指定参考点<退出>:"), ptref);
|
|
|
|
if (nRes == RTNORM)
|
|
{
|
|
//继续可能参考,或取点
|
|
return AcedRefGetPoint(ptref, prompt, result);
|
|
}
|
|
}
|
|
}
|
|
return nRes;
|
|
}
|
|
|
|
//室内管道-单管托架
|
|
void PL_DGTJCmd()
|
|
{
|
|
//选择管线
|
|
|
|
AcDbObjectId id;
|
|
double dL1 = 0.0, dBomEl = 0.0;
|
|
AcGeVector3d vtOff, vtOff2;
|
|
|
|
WallColData wcdat;
|
|
AcDbCurve *pBaseCrv = NULL;
|
|
if (NULL == (pBaseCrv = SelectWall(wcdat)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
AcGePoint3d pt3dL1ElDn;
|
|
if (!SelectPipePos(wcdat,pBaseCrv, vtOff, pt3dL1ElDn, 0))
|
|
{
|
|
delete pBaseCrv;
|
|
return;
|
|
}
|
|
|
|
AcGeLine3d ln(AcGePoint3d::kOrigin, vtOff);
|
|
if (!ln.isParallelTo(AcGePlane::kXYPlane))
|
|
{
|
|
delete pBaseCrv;
|
|
acutPrintf(_T("\n选择的管子不是水平管!"));
|
|
return;
|
|
}
|
|
|
|
delete pBaseCrv; pBaseCrv = NULL;
|
|
dL1 = pt3dL1ElDn.x;
|
|
dBomEl = pt3dL1ElDn.y;
|
|
double dDN = pt3dL1ElDn.z;
|
|
|
|
CAcModuleResourceOverride myResources;
|
|
CGZDJDlg dlg;
|
|
dlg.ShowType(0);
|
|
dlg.SetDN(dDN, _T("钢筋混凝土墙、柱预埋件式单管托架图(一)(DN15-150)"));
|
|
|
|
if (IDOK == dlg.DoModal())
|
|
{
|
|
ads_point pt, ptw, pte;
|
|
int nRes = AcedRefGetPoint(NULL, _T("\n墙柱边线上指定插入起点位置或[参考点(R)]:"), pt);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}
|
|
acdbUcs2Wcs(pt, ptw, false);
|
|
ptw[Z] = dBomEl;
|
|
|
|
double dRot = 0.0;
|
|
/*
|
|
nRes = acedGetAngle(pt, _T("\n指定旋转角度:"), &dRot);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}*/
|
|
dRot = AcGeVector3d::kXAxis.angleTo(vtOff,AcGeVector3d::kZAxis);
|
|
|
|
ads_point pt2;
|
|
nRes = AcedRefGetPoint(pt, _T("\n墙柱边线上指定插入终点位置或[参考点(R)]:"), pt2);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}
|
|
acdbUcs2Wcs(pt2, pte, false);
|
|
pte[Z] = dBomEl;
|
|
|
|
AcGeVector3d vtDir = asPnt3d(pte) - asPnt3d(ptw);
|
|
if (!vtDir.isParallelTo(AcGeVector3d::kZAxis))
|
|
vtDir.z = 0.0;
|
|
|
|
CString sSrcFullFile;
|
|
AecDbObjXDataMap mpData;
|
|
|
|
CString sName;
|
|
dlg.GetHolderData(sName, mpData, sSrcFullFile);
|
|
|
|
double dLt = 0.0;
|
|
if (dL1 > 0.0)
|
|
{
|
|
mpData.SetAt(_T("L1"), dL1);
|
|
}
|
|
|
|
double dhf = 1.5;
|
|
mpData.GetAt(_T("hf"), dhf);
|
|
dhf *= 1000.0;//mm
|
|
int nRows = (int)(vtDir.length() / dhf + 0.5) + 1;
|
|
vtDir.normalize();
|
|
|
|
AcGePoint3d ptIns = asPnt3d(ptw);
|
|
ptIns.z = dBomEl;
|
|
|
|
double dt1 = 0, dt2 = 0;
|
|
mpData.GetAt(_T("t1"), dt1);
|
|
mpData.GetAt(_T("t2"), dt2);
|
|
ptIns.z -= dt1; ptIns.z -= dt2;
|
|
|
|
AcDbObjectId idLayer = KTSetting::InitLayer(_T("LAY_SUPPORT"));
|
|
for (int i = 0; i < nRows; i++)
|
|
{
|
|
AecDbPipeHanger *pPHg = new AecDbPipeHanger;
|
|
pPHg->setLayer(idLayer);
|
|
pPHg->AddVar(&mpData);
|
|
pPHg->LoadPmsFile(sSrcFullFile);
|
|
pPHg->Insert(ptIns, dRot);
|
|
|
|
CoreTools::AddToModelSpace(pPHg);
|
|
ptIns += vtDir * dhf;
|
|
}
|
|
}
|
|
}
|
|
|
|
//室内管道-双管托架
|
|
void PL_SGTJCmd()
|
|
{
|
|
//选择管线
|
|
|
|
AcDbObjectId idW, id;
|
|
double dL1 = 0.0, dL3 = 0.0, dBomEl = 0.0;
|
|
AcGeVector3d vtOff, vtOff2;
|
|
|
|
WALLCOLDATA wcdat;
|
|
AcDbCurve *pBaseCrv = NULL;
|
|
if (NULL == (pBaseCrv = SelectWall(wcdat)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
AcGePoint3d pt3dL1ElDn;
|
|
if (!SelectPipePos(wcdat,pBaseCrv, vtOff, pt3dL1ElDn, 0))
|
|
{
|
|
delete pBaseCrv;
|
|
return;
|
|
}
|
|
|
|
AcGeLine3d ln(AcGePoint3d::kOrigin, vtOff);
|
|
if (!ln.isParallelTo(AcGePlane::kXYPlane))
|
|
{
|
|
delete pBaseCrv;
|
|
acutPrintf(_T("\n选择的管子不是水平管!"));
|
|
return;
|
|
}
|
|
|
|
AcGePoint3d pt3dL2ElDn;
|
|
|
|
dL1 = pt3dL1ElDn.x;
|
|
dBomEl = pt3dL1ElDn.y;
|
|
double dDN = pt3dL1ElDn.z;
|
|
double dDN1 = dDN;
|
|
|
|
if (!SelectPipePos(wcdat,pBaseCrv, vtOff, pt3dL2ElDn, 1))
|
|
{
|
|
delete pBaseCrv;
|
|
return;
|
|
}
|
|
delete pBaseCrv;
|
|
pBaseCrv = NULL;
|
|
dL3 = pt3dL2ElDn.x;
|
|
double dDN2 = pt3dL2ElDn.z;
|
|
|
|
CAcModuleResourceOverride myResources;
|
|
CGZDJDlg dlg;
|
|
dlg.ShowType(1);
|
|
dlg.SetDN(__max(dDN1,dDN2), _T("钢筋混凝土墙、柱预埋件式双管托架图(一)(DN15-150)"));
|
|
|
|
if (fabs(dDN2 - dDN1) > 1.0)
|
|
dlg.SetDNMin(__min(dDN1,dDN2));
|
|
|
|
if (IDOK == dlg.DoModal())
|
|
{
|
|
ads_point pt, ptw, pte;
|
|
int nRes = AcedRefGetPoint(NULL, _T("\n墙柱上指定插入起点或[参考点(R)]:"), pt);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}
|
|
acdbUcs2Wcs(pt, ptw, false);
|
|
ptw[Z] = dBomEl;
|
|
|
|
double dRot = 0.0;
|
|
/*
|
|
nRes = acedGetAngle(pt, _T("\n指定旋转角度:"), &dRot);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}*/
|
|
dRot = AcGeVector3d::kXAxis.angleTo(vtOff,AcGeVector3d::kZAxis);
|
|
|
|
ads_point pt2;
|
|
nRes = AcedRefGetPoint(pt, _T("\n墙柱上指定插入终点或[参考点(R)]:"), pt2);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}
|
|
acdbUcs2Wcs(pt2, pte, false);
|
|
pte[Z] = dBomEl;
|
|
|
|
AcGeVector3d vtDir = asPnt3d(pte) - asPnt3d(ptw);
|
|
if (!vtDir.isParallelTo(AcGeVector3d::kZAxis))
|
|
vtDir.z = 0.0;
|
|
|
|
CString sSrcFullFile;
|
|
AecDbObjXDataMap mpData;
|
|
|
|
CString sName;
|
|
dlg.GetHolderData(sName, mpData, sSrcFullFile);
|
|
|
|
double dLt = 0.0;
|
|
dL3 -= dL1;//两管间隙
|
|
|
|
if (dL1 > 0.0)
|
|
{
|
|
mpData.SetAt(_T("L1"), dL1);
|
|
}
|
|
|
|
if (dL3 > 0.0)
|
|
{
|
|
mpData.SetAt(_T("L3"), dL3);
|
|
}
|
|
|
|
double dhf = 1.5;
|
|
mpData.GetAt(_T("hf"), dhf);
|
|
dhf *= 1000.0;//mm
|
|
|
|
int nRows = (int)(vtDir.length() / dhf + 0.5) + 1;
|
|
vtDir.normalize();
|
|
|
|
AcGePoint3d ptIns = asPnt3d(ptw);
|
|
ptIns.z = dBomEl;
|
|
|
|
double dt1 = 0, dt2 = 0;
|
|
mpData.GetAt(_T("t1"), dt1);
|
|
mpData.GetAt(_T("t2"), dt2);
|
|
ptIns.z -= dt1; ptIns.z -= dt2;
|
|
|
|
int nMinDnIndex = -1;
|
|
if (fabs(dDN2 - dDN1) > 1.0)
|
|
{
|
|
nMinDnIndex = (dDN1 > dDN2) ? 1 : 0;
|
|
mpData.SetAt(_T("PCP#"), nMinDnIndex);
|
|
}
|
|
|
|
AcDbObjectId idLayer = KTSetting::InitLayer(_T("LAY_SUPPORT"));
|
|
for (int i = 0; i < nRows; i++)
|
|
{
|
|
AecDbPipeHanger *pPHg = new AecDbPipeHanger;
|
|
pPHg->setLayer(idLayer);
|
|
pPHg->AddVar(&mpData);
|
|
pPHg->LoadPmsFile(sSrcFullFile);
|
|
pPHg->Insert(ptIns, dRot);
|
|
|
|
CoreTools::AddToModelSpace(pPHg);
|
|
ptIns += vtDir * dhf;
|
|
}
|
|
}
|
|
}
|
|
|
|
//管道支架-单管立式托架 图集号03S42
|
|
void PL_LGTJCmd()
|
|
{
|
|
//选择管线
|
|
|
|
AcDbObjectId id;
|
|
double dL1 = 0.0;
|
|
AcGeVector3d vtOff, vtOff2;
|
|
WallColData wcdat;
|
|
|
|
AcDbCurve *pBaseCrv = NULL;
|
|
if (NULL == (pBaseCrv = SelectWall(wcdat)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
AcGeVector3d vtPipe;
|
|
AcGePoint3d pt3dL1ElDn;
|
|
AcDbCurve* pPipeBase = NULL;
|
|
if (NULL == (pPipeBase = SelectPipePos(vtPipe, pt3dL1ElDn)))
|
|
{
|
|
return;
|
|
}
|
|
if (!vtPipe.isParallelTo(AcGeVector3d::kZAxis))
|
|
{
|
|
delete pPipeBase;
|
|
acutPrintf(_T("\n选择的管子不是立管!"));
|
|
return;
|
|
}
|
|
|
|
double dDN = pt3dL1ElDn.z;
|
|
dL1 = pt3dL1ElDn.x;
|
|
|
|
CAcModuleResourceOverride myResources;
|
|
CGZDJDlg dlg;
|
|
dlg.ShowType(2);
|
|
dlg.SetDN(dDN, _T("单管立式支架图(一)(DN15-80)"));
|
|
|
|
if (IDOK == dlg.DoModal())
|
|
{
|
|
ads_point pt, ptw;
|
|
int nRes = AcedRefGetPoint(NULL, _T("\n在管线上指定放置支架位置或[参考点(R)]:"), pt);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}
|
|
acdbUcs2Wcs(pt, ptw, false);
|
|
AcGePoint3d ptWW;
|
|
pPipeBase->getClosestPointTo(asPnt3d(ptw), ptWW);
|
|
|
|
//WALL
|
|
AcGePoint3d ptWall;
|
|
pBaseCrv->getClosestPointTo(ptWW, ptWall);
|
|
AcGeVector3d vtToWall = ptWW - ptWall;
|
|
vtToWall.z = 0.0;//XY
|
|
dL1 = vtToWall.length();
|
|
vtToWall.normalize();
|
|
double dRot = 0.0;
|
|
/*
|
|
nRes = acedGetAngle(pt, _T("\n指定旋转角度:"), &dRot);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}*/
|
|
dRot = AcGeVector3d::kXAxis.angleTo(vtToWall, AcGeVector3d::kZAxis);
|
|
|
|
AcGeVector3d vtDir = vtPipe;
|
|
|
|
CString sSrcFullFile;
|
|
AecDbObjXDataMap mpData;
|
|
|
|
CString sName;
|
|
dlg.GetHolderData(sName, mpData, sSrcFullFile);
|
|
|
|
int nRows = 1;
|
|
vtDir.normalize();
|
|
|
|
AcGePoint3d ptIns = asPnt3d(ptw);
|
|
pBaseCrv->getClosestPointTo(ptIns, ptIns);
|
|
ptIns.z = ptWW.z;
|
|
if (dL1 > 0.0)
|
|
{
|
|
mpData.SetAt(_T("L1"), dL1);
|
|
}
|
|
|
|
AcDbObjectId idLayer = KTSetting::InitLayer(_T("LAY_SUPPORT"));
|
|
AecDbPipeHanger *pPHg = new AecDbPipeHanger;
|
|
pPHg->setLayer(idLayer);
|
|
pPHg->AddVar(&mpData);
|
|
pPHg->LoadPmsFile(sSrcFullFile);
|
|
pPHg->Insert(ptIns, dRot);
|
|
|
|
CoreTools::AddToModelSpace(pPHg);
|
|
|
|
if (pPipeBase != NULL) delete pPipeBase;
|
|
if (pBaseCrv != NULL) delete pBaseCrv;
|
|
}
|
|
}
|
|
|
|
//管道支架-平管支座 图集号03S42
|
|
void PL_PGZZCmd()
|
|
{
|
|
//选择管线
|
|
|
|
AcGeVector3d vtPipe;
|
|
AcGePoint3d pt3dL1ElDn;
|
|
AcDbCurve* pPipeBase = NULL;
|
|
if (NULL == (pPipeBase = SelectPipePos(vtPipe, pt3dL1ElDn)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
AcGeLine3d ln(AcGePoint3d::kOrigin, vtPipe);
|
|
if (!ln.isParallelTo(AcGePlane::kXYPlane))
|
|
{
|
|
delete pPipeBase;
|
|
acutPrintf(_T("\n选择的管子不是水平管!"));
|
|
return;
|
|
}
|
|
|
|
double dBomEl = pt3dL1ElDn.y;
|
|
double dDN = pt3dL1ElDn.z;
|
|
|
|
CAcModuleResourceOverride myResources;
|
|
CGZDJDlg dlg;
|
|
dlg.ShowType(3);
|
|
dlg.SetDN(dDN, _T("水平管支架图(二)(DN50-150)"));
|
|
|
|
if (IDOK == dlg.DoModal())
|
|
{
|
|
ads_point pt, ptw, pte;
|
|
int nRes = AcedRefGetPoint(NULL, _T("\n管线上指定放置支座位置或[参考点(R)]:"), pt);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}
|
|
acdbUcs2Wcs(pt, ptw, false);
|
|
ptw[Z] = dBomEl;
|
|
|
|
double dRot = 0.0;
|
|
/*
|
|
nRes = acedGetAngle(pt, _T("\n指定旋转角度:"), &dRot);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}*/
|
|
dRot = AcGeVector3d::kXAxis.angleTo(vtPipe, AcGeVector3d::kZAxis);
|
|
dRot -= PI / 2.0;
|
|
|
|
ads_point pt2;
|
|
nRes = AcedRefGetPoint(pt, _T("\n管线上指定放置支座结束位置或[参考点(R)]:"), pt2);
|
|
if (nRes != RTNORM)
|
|
{
|
|
return;
|
|
}
|
|
acdbUcs2Wcs(pt2, pte, false);
|
|
pte[Z] = dBomEl;
|
|
|
|
AcGeVector3d vtDir = asPnt3d(pte) - asPnt3d(ptw);
|
|
|
|
CString sSrcFullFile;
|
|
AecDbObjXDataMap mpData;
|
|
|
|
CString sName;
|
|
dlg.GetHolderData(sName, mpData, sSrcFullFile);
|
|
|
|
double dhf = 1.5;
|
|
mpData.GetAt(_T("hf"), dhf);
|
|
dhf *= 1000.0;//mm
|
|
int nRows = (int)(vtDir.length() / dhf + 0.5) + 1;
|
|
vtDir.normalize();
|
|
|
|
//调整方向精度
|
|
if (vtDir.dotProduct(vtPipe) < 0)
|
|
{
|
|
vtDir = vtPipe;
|
|
vtDir.negate();
|
|
vtDir.normalize();
|
|
}
|
|
|
|
AcGePoint3d ptIns = asPnt3d(ptw);
|
|
pPipeBase->getClosestPointTo(ptIns, ptIns);
|
|
ptIns.z = dBomEl;
|
|
|
|
AcDbObjectId idLayer = KTSetting::InitLayer(_T("LAY_SUPPORT"));
|
|
for (int i = 0; i < nRows; i++)
|
|
{
|
|
AecDbPipeHanger *pPHg = new AecDbPipeHanger;
|
|
pPHg->setLayer(idLayer);
|
|
pPHg->AddVar(&mpData);
|
|
pPHg->LoadPmsFile(sSrcFullFile);
|
|
pPHg->Insert(ptIns, dRot);
|
|
|
|
CoreTools::AddToModelSpace(pPHg);
|
|
ptIns += vtDir * dhf;
|
|
}
|
|
|
|
if (pPipeBase != NULL) delete pPipeBase;
|
|
}
|
|
}
|
|
|
|
//管道支架-弯管支座 图集号03S42
|
|
void PL_WGZZCmd()
|
|
{
|
|
//选择管线
|
|
|
|
AcGeVector3d vtPipe;
|
|
AcGePoint3d pt3dL1ElDn, ptMid;
|
|
AcDbCurve* pElbowBase = NULL;
|
|
AcGeVector3d vtMaj, vtMin;
|
|
if (NULL == (pElbowBase = SelectElbowPos(vtMaj, vtMin, ptMid, pt3dL1ElDn)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
AcGeVector3d vtN = vtMaj.crossProduct(vtMin);
|
|
AcGeLine3d ln(AcGePoint3d::kOrigin, vtN);
|
|
if (!ln.isParallelTo(AcGePlane::kXYPlane))
|
|
{
|
|
delete pElbowBase;
|
|
acutPrintf(_T("\n选择的弯头不是立放管!"));
|
|
return;
|
|
}
|
|
|
|
AcGePoint3d ptIns = ptMid;
|
|
double dRot = 0;
|
|
|
|
AcGeLine3d ln1(ptMid, vtMaj);
|
|
AcGeLine3d ln2(ptMid, vtMin);
|
|
|
|
if (ln1.isParallelTo(AcGePlane::kXYPlane))
|
|
{
|
|
dRot = AcGeVector3d::kXAxis.angleTo(vtMaj, AcGeVector3d::kZAxis);
|
|
}
|
|
if (ln2.isParallelTo(AcGePlane::kXYPlane))
|
|
{
|
|
dRot = AcGeVector3d::kXAxis.angleTo(vtMin, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
CAcModuleResourceOverride myResources;
|
|
CGZDJDlg dlg;
|
|
dlg.ShowType(4);
|
|
dlg.SetDN(pt3dL1ElDn.z, _T("弯管支座图(一)(DN100-500)"));
|
|
|
|
if (IDOK == dlg.DoModal())
|
|
{
|
|
CString sSrcFullFile;
|
|
AecDbObjXDataMap mpData;
|
|
|
|
CString sName;
|
|
dlg.GetHolderData(sName, mpData, sSrcFullFile);
|
|
|
|
AcDbObjectId idLayer = KTSetting::InitLayer(_T("LAY_SUPPORT"));
|
|
AecDbPipeHanger *pPHg = new AecDbPipeHanger;
|
|
pPHg->setLayer(idLayer);
|
|
pPHg->AddVar(&mpData);
|
|
pPHg->LoadPmsFile(sSrcFullFile);
|
|
pPHg->SetElbow((AcDbArc*)pElbowBase, pt3dL1ElDn.z);
|
|
pPHg->Insert(ptIns, dRot);
|
|
|
|
CoreTools::AddToModelSpace(pPHg);
|
|
}
|
|
}
|
|
|
|
//引标
|
|
static void TJLeadDim(ads_point pt1, ads_point pt2, CString &sDimUp, CString &sDimDwn, AcDbObjectId &id1)
|
|
{
|
|
ads_point pt11, pt22;
|
|
acdbUcs2Wcs(pt1, pt11, false);
|
|
acdbUcs2Wcs(pt2, pt22, false);
|
|
|
|
AcGePoint3d ptFr = asPnt3d(pt11);
|
|
AcGePoint3d ptTo = asPnt3d(pt22);
|
|
|
|
AecDbEwPipeDim *pDim = new AecDbEwPipeDim;
|
|
pDim->AddAecDbWEntity(id1);
|
|
|
|
pDim->SetDimStyle(0);
|
|
pDim->SetDimDir(0);
|
|
pDim->SetDimTextUporDownFlag(1);
|
|
|
|
AcDbObjectId idDimLay = KTSetting::InitLayer(_T("LAY_PP3D_DIM"));
|
|
AcDbObjectId idTSty = CKTCadUtility::InitTextStyle(_T("Pipe_Dim"));
|
|
|
|
pDim->SetTextStyleId(idTSty);
|
|
pDim->SetTextLayerId(idDimLay);
|
|
|
|
double dScale = 100.0;
|
|
GetDocScale(dScale);
|
|
pDim->SetPScale(dScale);
|
|
|
|
sDimUp.TrimLeft();
|
|
sDimDwn.TrimLeft();
|
|
|
|
pDim->AddDimText(sDimUp, sDimDwn);
|
|
|
|
double dTxtH = 3.0, dTxWS = 0.75;
|
|
CString sDimupScr, sDimupScrTrue;
|
|
|
|
pDim->SetTextHeight(dTxtH);
|
|
pDim->SetTextWidthScale(dTxWS);
|
|
|
|
pDim->AppendPoint(ptFr);
|
|
pDim->AppendPoint(ptTo);
|
|
|
|
pDim->SetDimupdownSpace(0.0);
|
|
pDim->SetTextLayerId(idDimLay);
|
|
|
|
CoreTools::AddToModelSpace(pDim);
|
|
}
|
|
|
|
//圈标
|
|
static void TJCircleDim(ads_point pt1, ads_point pt2, CString &sDimUp, CString &sDimDwn, AcDbObjectId &id1)
|
|
{
|
|
ads_point pt11, pt22;
|
|
acdbUcs2Wcs(pt1, pt11, false);
|
|
acdbUcs2Wcs(pt2, pt22, false);
|
|
|
|
AcGePoint3d ptFr = asPnt3d(pt11);
|
|
AcGePoint3d ptTo = asPnt3d(pt22);
|
|
|
|
double dScale = 100.0;
|
|
GetDocScale(dScale);
|
|
|
|
double dTxtH = 2.0;
|
|
double dR = 3.0;
|
|
double dLead = 7.5;
|
|
|
|
dTxtH *= dScale;
|
|
dR *= dScale;
|
|
dLead *= dScale;
|
|
|
|
AcGeVector3d vtDir = ptTo - ptFr;
|
|
vtDir.normalize();
|
|
|
|
//判断水平或垂直
|
|
AcGeVector3d vtX = vtDir.orthoProject(AcGeVector3d::kYAxis);
|
|
AcGeVector3d vtY = vtDir.orthoProject(AcGeVector3d::kXAxis);
|
|
|
|
vtDir = vtY;
|
|
if (vtX.length() > vtY.length())
|
|
{
|
|
vtDir = vtX;
|
|
}
|
|
|
|
AcDbObjectId idDimLay = KTSetting::InitLayer(_T("LAY_PP3D_DIM"));
|
|
AcDbObjectId idTSty = CKTCadUtility::InitTextStyle(_T("Pipe_Dim"));
|
|
|
|
AcDbLine *pLn = new AcDbLine(ptFr, ptTo);
|
|
pLn->setLayer(idDimLay);
|
|
CoreTools::AddToModelSpace(pLn);
|
|
|
|
AcGePoint3d ptTo2 = ptTo + vtDir * (dLead + 2.0 * dR);
|
|
if (vtDir.isParallelTo(AcGeVector3d::kYAxis))
|
|
{
|
|
AcGePoint3d ptTo22 = ptTo + vtDir * dLead;
|
|
pLn = new AcDbLine(ptTo, ptTo22);
|
|
pLn->setLayer(idDimLay);
|
|
CoreTools::AddToModelSpace(pLn);
|
|
|
|
//水平线
|
|
AcGePoint3d ptS = ptTo2 - vtDir * dR;
|
|
ptS -= AcGeVector3d::kXAxis * dR;
|
|
AcGePoint3d ptE = ptS + AcGeVector3d::kXAxis * 2.0 * dR;
|
|
|
|
pLn = new AcDbLine(ptS, ptE);
|
|
pLn->setLayer(idDimLay);
|
|
CoreTools::AddToModelSpace(pLn);
|
|
}
|
|
else
|
|
{
|
|
pLn = new AcDbLine(ptTo, ptTo2);
|
|
pLn->setLayer(idDimLay);
|
|
CoreTools::AddToModelSpace(pLn);
|
|
}
|
|
|
|
AcGePoint3d ptC = ptTo2 - vtDir * dR;
|
|
|
|
AcDbCircle *pCir = new AcDbCircle;
|
|
pCir->setCenter(ptC);
|
|
pCir->setRadius(dR);
|
|
pCir->setNormal(AcGeVector3d::kZAxis);
|
|
pCir->setLayer(idDimLay);
|
|
CoreTools::AddToModelSpace(pCir);
|
|
|
|
double dSp = 0.2 * dScale;
|
|
ptC += AcGeVector3d::kYAxis * dSp;
|
|
|
|
AcDbText *pTxt = new AcDbText;
|
|
pTxt->setTextString(_T("支"));
|
|
pTxt->setPosition(ptC);
|
|
pTxt->setRotation(0.0);
|
|
pTxt->setHeight(dTxtH);
|
|
pTxt->setTextStyle(idTSty);
|
|
pTxt->setHorizontalMode(AcDb::kTextCenter);
|
|
pTxt->setVerticalMode(AcDb::kTextBottom);
|
|
pTxt->setAlignmentPoint(ptC);
|
|
pTxt->setLayer(idDimLay);
|
|
CoreTools::AddToModelSpace(pTxt);
|
|
|
|
ptC -= AcGeVector3d::kYAxis * 2.0 * dSp;
|
|
pTxt = new AcDbText;
|
|
pTxt->setTextString(sDimDwn);
|
|
pTxt->setPosition(ptC);
|
|
pTxt->setRotation(0.0);
|
|
pTxt->setHeight(dTxtH);
|
|
pTxt->setTextStyle(idTSty);
|
|
pTxt->setHorizontalMode(AcDb::kTextCenter);
|
|
pTxt->setVerticalMode(AcDb::kTextTop);
|
|
pTxt->setAlignmentPoint(ptC);
|
|
pTxt->setLayer(idDimLay);
|
|
CoreTools::AddToModelSpace(pTxt);
|
|
}
|
|
|
|
static void ClosestPointTo(ads_point pt1, AcDbLine &lnDir)
|
|
{
|
|
ads_point pt11;
|
|
acdbUcs2Wcs(pt1, pt11, false);
|
|
|
|
AcGePoint3d ptS = lnDir.startPoint();
|
|
AcGePoint3d ptE = lnDir.endPoint();
|
|
ptS.z = 0; ptE.z = 0;
|
|
if (asPnt3d(pt11).distanceTo(ptS) < asPnt3d(pt11).distanceTo(ptE))
|
|
{
|
|
ads_point_set(asDblArray(ptS), pt11);
|
|
}
|
|
else
|
|
{
|
|
ads_point_set(asDblArray(ptE), pt11);
|
|
}
|
|
acdbWcs2Ucs(pt11, pt1, false);
|
|
}
|
|
|
|
//[支托架标注]
|
|
void PL_TJBZCmd()
|
|
{
|
|
KTCADSysVar<int> var1(_T("pdmode"), 32);
|
|
|
|
ads_name ent1;
|
|
ads_point pt1;
|
|
struct resbuf *pRb = acutBuildList(RTDXF0, _T("AEC_PIPEHNGR,POINT,LINE,LWPOLYLINE,INSERT"), 0);
|
|
|
|
TCHAR szKey[131] = {};
|
|
acedInitGet(RSG_OTHER, _T("P O"));
|
|
|
|
static CString sDimStyle = _T("O");
|
|
CString sTip;
|
|
sTip.Format(_T("\n请选择管道支托架或支座[引出标注(P)/圆圈标注(O)]<%s>:"), sDimStyle);
|
|
|
|
int nRes = CKTCadUtility::SelectEntity(sTip, ent1, pRb, pt1);
|
|
acutRelRb(pRb);
|
|
if (nRes == RTNORM)
|
|
{
|
|
AcDbObjectId id1;
|
|
acdbGetObjectId(id1, ent1);
|
|
|
|
AcGePoint3d ptGe, ptMid;
|
|
AcGeVector3d vtDir;
|
|
AcDbLine lnDir;
|
|
|
|
double nDN = 0;
|
|
CString sDimUp = _T(""), sDimDwn = _T(""), sName, sName2, sSN = _T("");
|
|
AcDbEntity *pEnt1 = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt1, id1, AcDb::kForRead))
|
|
{
|
|
AecDbPipeHanger *pHg = AecDbPipeHanger::cast(pEnt1);
|
|
if (pHg != NULL)
|
|
{
|
|
pHg->GetAt(KEY_NAME, sName);
|
|
pHg->GetAt(_T("DN"), nDN);
|
|
|
|
sSN = _T("");
|
|
pHg->GetAt(KEY_BOMNO, sSN);
|
|
|
|
sName2 = sName;
|
|
int nPos = sName.Find(_T('('));
|
|
if (nPos != -1)
|
|
{
|
|
sName2 = sName.Mid(0, nPos);
|
|
sName2.TrimRight(_T("图"));
|
|
}
|
|
sDimUp.Format(_T("%s DN%d"), sName2, (int)(nDN + 0.5));
|
|
|
|
pHg->GetDirLine(lnDir);
|
|
}
|
|
|
|
AcDbLine *pLn = AcDbLine::cast(pEnt1);
|
|
if (pLn != NULL)
|
|
{
|
|
lnDir.setStartPoint(pLn->startPoint());
|
|
lnDir.setEndPoint(pLn->endPoint());
|
|
|
|
AecDbObjXDataMap xData;
|
|
if (xData.Read(pLn, BIMDATA_APP))
|
|
{
|
|
xData.GetAt(KEY_NAME, sName);
|
|
xData.GetAt(_T("DN"), nDN);
|
|
|
|
sName2 = sName;
|
|
int nPos = sName.Find(_T('('));
|
|
if (nPos != -1)
|
|
{
|
|
sName2 = sName.Mid(0, nPos);
|
|
sName2.TrimRight(_T("图"));
|
|
}
|
|
sDimUp.Format(_T("%s DN%d"), sName2, (int)(nDN + 0.5));
|
|
}
|
|
}
|
|
|
|
AcDbPolyline *pPl = AcDbPolyline::cast(pEnt1);
|
|
if (pPl != NULL)
|
|
{
|
|
AcGePoint3d ptS, ptE;
|
|
pPl->getStartPoint(ptS);
|
|
pPl->getEndPoint(ptE);
|
|
|
|
lnDir.setStartPoint(ptS);
|
|
lnDir.setEndPoint(ptE);
|
|
|
|
AecDbObjXDataMap xData;
|
|
if (xData.Read(pPl, BIMDATA_APP))
|
|
{
|
|
xData.GetAt(KEY_NAME, sName);
|
|
xData.GetAt(_T("DN"), nDN);
|
|
|
|
sName2 = sName;
|
|
int nPos = sName.Find(_T('('));
|
|
if (nPos != -1)
|
|
{
|
|
sName2 = sName.Mid(0, nPos);
|
|
sName2.TrimRight(_T("图"));
|
|
}
|
|
sDimUp.Format(_T("%s DN%d"), sName2, (int)(nDN + 0.5));
|
|
}
|
|
}
|
|
|
|
pEnt1->close();
|
|
}
|
|
|
|
if (!sDimUp.IsEmpty())
|
|
{
|
|
ClosestPointTo(pt1, lnDir);
|
|
|
|
ads_point pt2;
|
|
nRes = acedGetPoint(pt1, _T("\n请选择标注文字位置:"), pt2);
|
|
if (nRes == RTNORM)
|
|
{
|
|
if (_tcscmp(sDimStyle, _T("P")) == 0)
|
|
{
|
|
TJLeadDim(pt1, pt2, sDimUp, sDimDwn, id1);
|
|
}
|
|
else if (_tcscmp(sDimStyle, _T("O")) == 0)
|
|
{
|
|
sDimDwn = sSN;
|
|
|
|
if (sSN.IsEmpty())
|
|
{
|
|
TCHAR szTxt[33];
|
|
nRes = acedGetString(1, _T("\n请输入托架序号:"), szTxt);
|
|
if (nRes == RTNORM)
|
|
{
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt1, id1, AcDb::kForWrite))
|
|
{
|
|
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt1);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pEntBase->SetAt(KEY_BOMNO, szTxt);
|
|
}
|
|
|
|
AcDbLine *pLn = AcDbLine::cast(pEnt1);
|
|
if (pLn != NULL)
|
|
{
|
|
AecDbObjXDataMap xData;
|
|
if (xData.Read(pLn, BIMDATA_APP))
|
|
{
|
|
xData.SetAt(KEY_BOMNO, szTxt);
|
|
xData.Write(pLn, BIMDATA_APP);
|
|
}
|
|
}
|
|
pEnt1->close();
|
|
}
|
|
|
|
//ClosestPointTo(pt1, lnDir);
|
|
|
|
sDimDwn = szTxt;
|
|
TJCircleDim(pt1, pt2, sDimUp, sDimDwn, id1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//ClosestPointTo(pt1, lnDir);
|
|
|
|
TJCircleDim(pt1, pt2, sDimUp, sDimDwn, id1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//...
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (nRes == RTKWORD)
|
|
{
|
|
TCHAR szKey[3];
|
|
acedGetInput(szKey);
|
|
sDimStyle = szKey;
|
|
acutPrintf(_T("\nKeyword=%s"), szKey);
|
|
|
|
PL_TJBZCmd();
|
|
}
|
|
}
|
|
|
|
typedef struct PipeHanger
|
|
{
|
|
TCHAR szName[MAX_PATH];
|
|
TCHAR szSubTxt[MAX_PATH];
|
|
TCHAR szRem[MAX_PATH];
|
|
TCHAR szKey[MAX_PATH];
|
|
int nCount;
|
|
}PIPEHANGER;
|
|
|
|
static void AppendPipeHgr(AcArray<PipeHanger>& arPgs, PipeHanger& pgr)
|
|
{
|
|
CString sKey;
|
|
sKey.Format(_T("%s%s"),pgr.szName,pgr.szSubTxt);
|
|
sKey.TrimLeft(); sKey.TrimRight();
|
|
|
|
bool bFind = false;
|
|
for (int i = 0;i < arPgs.length();i++)
|
|
{
|
|
PipeHanger& pgrt = arPgs.at(i);
|
|
if (_tcscmp(pgrt.szKey, (LPCTSTR)sKey) == 0)
|
|
{
|
|
pgrt.nCount += 1;
|
|
bFind = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!bFind)
|
|
{
|
|
_tcscpy(pgr.szKey, sKey);
|
|
pgr.nCount = 1;
|
|
arPgs.append(pgr);
|
|
}
|
|
}
|
|
|
|
void PL_TJBBCmd()
|
|
{
|
|
ads_name ss, ent;
|
|
LPCTSTR pszMsg[] = { _T("\n请选择托架支座实体:"), _T("") };
|
|
|
|
resbuf* pRb = acutBuildList(RTDXF0, _T("AEC_PIPEHNGR"), 0);
|
|
acedSSGet(_T(":$"), pszMsg, NULL, pRb, ss);
|
|
acutRelRb(pRb);
|
|
|
|
double dDN = 0, dVal = 0;
|
|
CString sName,sSubTxt, sPNo,sTmp,sKey, sRem;
|
|
PipeHanger pgr;
|
|
memset(&pgr, 0, sizeof(PipeHanger));
|
|
|
|
AcArray<PipeHanger> arPipeHgrs;
|
|
|
|
AcDbObjectId id;
|
|
Adesk::Int32 nLen = 0;
|
|
acedSSLength(ss, &nLen);
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
for (int i = 0; i < nLen; i++)
|
|
{
|
|
acedSSName(ss, i, ent);
|
|
acdbGetObjectId(id, ent);
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
|
|
{
|
|
AecDbPipeHanger* pPHg = AecDbPipeHanger::cast(pEnt);
|
|
if (pPHg != NULL)
|
|
{
|
|
sSubTxt = _T(" "); sName = _T(" ");
|
|
pPHg->GetAt(KEY_NAME, sName);
|
|
|
|
//钢筋混凝土墙、柱预埋件式单管托架图(一)(DN15-150) --->
|
|
//钢筋混凝土墙、柱预埋件式单管托架图(一)
|
|
CString sName2 = sName;
|
|
int nPos = sName.Find(_T('('));
|
|
if (nPos != -1)
|
|
{
|
|
sName2 = sName.Mid(0, nPos);
|
|
sName2.TrimRight(_T("图"));
|
|
}
|
|
sName2.Insert(0, _T(" "));
|
|
sName = sName2;
|
|
|
|
pPHg->GetAt(_T("DN"), dDN);
|
|
sTmp.Format(_T("DN%d "), (int)(dDN + 0.5));
|
|
sSubTxt += sTmp;
|
|
dVal = 0;
|
|
if ( pPHg->GetAt(_T("L1"), dVal))
|
|
{
|
|
sTmp.Format(_T("L1=%d "),(int)(dVal+0.5));
|
|
sSubTxt += sTmp;
|
|
}
|
|
dVal = 0;
|
|
if (pPHg->GetAt(_T("L2"), dVal))
|
|
{
|
|
sTmp.Format(_T("L2=%d "), (int)(dVal + 0.5));
|
|
sSubTxt += sTmp;
|
|
}
|
|
dVal = 0;
|
|
if (pPHg->GetAt(_T("L3"), dVal))
|
|
{
|
|
sTmp.Format(_T("L3=%d "), (int)(dVal + 0.5));
|
|
sSubTxt += sTmp;
|
|
}
|
|
dVal = 0;
|
|
if (pPHg->GetAt(_T("H"), dVal))
|
|
{
|
|
sTmp.Format(_T("H=%d "), (int)(dVal + 0.5));
|
|
sSubTxt += sTmp;
|
|
}
|
|
dVal = 0;
|
|
if (pPHg->GetAt(_T("H1"), dVal))
|
|
{
|
|
sTmp.Format(_T("H1=%d "), (int)(dVal + 0.5));
|
|
sSubTxt += sTmp;
|
|
}
|
|
dVal = 0;
|
|
if (pPHg->GetAt(_T("H2"), dVal))
|
|
{
|
|
sTmp.Format(_T("H2=%d "), (int)(dVal + 0.5));
|
|
sSubTxt += sTmp;
|
|
}
|
|
|
|
sPNo = _T("");
|
|
pPHg->GetAt(_T("PAGENO"), sPNo);
|
|
sRem.Format(_T(" 03S402室内管道支架及吊架 第%s页"),sPNo);
|
|
|
|
memset(&pgr, 0, sizeof(PipeHanger));
|
|
_tcscpy(pgr.szName, (LPCTSTR)sName);
|
|
_tcscpy(pgr.szSubTxt, (LPCTSTR)sSubTxt);
|
|
_tcscpy(pgr.szRem, (LPCTSTR)sRem);
|
|
|
|
AppendPipeHgr(arPipeHgrs,pgr);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acedSSFree(ss);
|
|
|
|
AcDbObjectId idDimLay = KTSetting::InitLayer(_T("LAY_PP3D_DIM"));
|
|
AcDbObjectId idTSty = CKTCadUtility::InitTextStyle(_T("Pipe_Dim"));
|
|
|
|
if (!arPipeHgrs.isEmpty())
|
|
{
|
|
//选择位置,插入报表
|
|
//序号 名称 尺寸 个数 备注
|
|
//355x2 1420x3 355x2x2 355x2 355x2x2
|
|
|
|
ads_point pt, pt2;
|
|
int nRes = acedGetPoint(NULL, _T("请选择位置点插入报表:"), pt);
|
|
if (nRes == RTNORM)
|
|
{
|
|
acdbUcs2Wcs(pt, pt2, false);
|
|
|
|
AcDbTable* pTbl = new AcDbTable;
|
|
pTbl->setLayer(idDimLay);
|
|
//pTbl->setTextStyle(idTSty);
|
|
|
|
pTbl->setNumRows(arPipeHgrs.length() + 1);
|
|
pTbl->setNumColumns(5);
|
|
|
|
pTbl->setWidth(19500);
|
|
pTbl->setRowHeight(950);
|
|
|
|
pTbl->setColumnWidth(0, 1200);
|
|
pTbl->setColumnWidth(1, 6900);
|
|
pTbl->setColumnWidth(2, 5900);
|
|
pTbl->setColumnWidth(3, 1200);
|
|
pTbl->setColumnWidth(4, 4300);
|
|
|
|
pTbl->setDirection(AcGeVector3d::kXAxis);
|
|
pTbl->setPosition(asPnt3d(pt2));
|
|
pTbl->setNormal(AcGeVector3d::kZAxis);
|
|
|
|
pTbl->setTextHeight(0, 0, 300);
|
|
pTbl->setTextString(0, 0, _T("序号"));
|
|
pTbl->setAlignment(0, 0, kMiddleCenter);
|
|
|
|
pTbl->setTextHeight(0, 1, 300);
|
|
pTbl->setTextString(0, 1, _T("名称"));
|
|
pTbl->setAlignment(0, 1, kMiddleCenter);
|
|
|
|
pTbl->setTextHeight(0, 2, 300);
|
|
pTbl->setTextString(0, 2, _T("尺寸规格"));
|
|
pTbl->setAlignment(0, 2, kMiddleCenter);
|
|
|
|
pTbl->setTextHeight(0, 3, 300);
|
|
pTbl->setTextString(0, 3, _T("数量"));
|
|
pTbl->setAlignment(0, 3, kMiddleCenter);
|
|
|
|
pTbl->setTextHeight(0, 4, 300);
|
|
pTbl->setTextString(0, 4, _T("备注"));
|
|
pTbl->setAlignment(0, 4, kMiddleCenter);
|
|
|
|
CString sText;
|
|
for (int i = 0; i < arPipeHgrs.length(); i++)
|
|
{
|
|
PipeHanger& pipegr = arPipeHgrs.at(i);
|
|
|
|
//No
|
|
pTbl->setTextHeight(i + 1, 0, 300);
|
|
sText.Format(_T("%d"), i + 1);
|
|
pTbl->setTextString(i + 1, 0, sText);
|
|
pTbl->setAlignment(i + 1, 0, kMiddleCenter);
|
|
pTbl->setTextStyle(i + 1, 0, idTSty);
|
|
|
|
//名称
|
|
pTbl->setTextHeight(i + 1, 1, 300);
|
|
pTbl->setTextString(i + 1, 1, pipegr.szName);
|
|
pTbl->setAlignment(i + 1, 1, kMiddleLeft);
|
|
pTbl->setTextStyle(i + 1, 1, idTSty);
|
|
|
|
//尺寸
|
|
pTbl->setTextHeight(i + 1, 2, 300);
|
|
pTbl->setTextString(i + 1, 2, pipegr.szSubTxt);
|
|
pTbl->setAlignment(i + 1, 2, kMiddleLeft);
|
|
pTbl->setTextStyle(i + 1, 2, idTSty);
|
|
|
|
//页码
|
|
sTmp.Format(_T("%d"), pipegr.nCount);
|
|
pTbl->setTextHeight(i + 1, 3, 300);
|
|
pTbl->setTextString(i + 1, 3, sTmp);
|
|
pTbl->setAlignment(i + 1, 3, kMiddleCenter);
|
|
pTbl->setTextStyle(i + 1, 3, idTSty);
|
|
|
|
//备注
|
|
pTbl->setTextHeight(i + 1, 4, 300);
|
|
pTbl->setTextString(i + 1, 4, pipegr.szRem);
|
|
pTbl->setAlignment(i + 1, 4, kMiddleLeft);
|
|
pTbl->setTextStyle(i + 1, 4, idTSty);
|
|
}
|
|
|
|
CKTCadUtility::AddToBlockTableRecord(pTbl);
|
|
pTbl->close();
|
|
}
|
|
}
|
|
}
|
|
|
|
//测试
|
|
void PL_GTSTCmd()
|
|
{
|
|
}
|
|
|
|
|