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

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()
{
}