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