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

279 lines
6.3 KiB
C++

#include "StdAfx.h"
#include "DbPipeFitting.h"
#include "DrawDrainChamfer.h"
/*============================================================================*
* Copyright(c), 1994-2007, Beijing Tangent Engineering Software Co.Ltd.
* 作 者: 陈恩涛
* 创建时间: 2010-5-25
* 描 述: 排水倒角
* 归属项目: 给排水
* 历史记录:
=============================================================================*/
//***************************************************************************************************
// 排水倒角
//***************************************************************************************************
extern void ResetPipeDir(SSearchPipeList *pListAll);
void UpdateChamferLen(double &dChamferLen, bool bRead = true)
{
CRegProperty regProp(GetRegLocation(), _T("DrainChamfer"));
regProp.SetTopRootKey(HKEY_CURRENT_USER);
if (bRead) // 读
{
if (!regProp.GetValue(_T("ChamferLen"), dChamferLen))
{
dChamferLen = 3 * DocGetPScale();
}
}
else // 写
{
regProp.SetValue(_T("ChamferLen"), dChamferLen);
}
}
// 主要用于区分立管与扣弯
bool IsValidLayer(CString &strLayer)
{
if (strLayer.Compare(LAY_VPIPE_RAIN) == 0 ||
strLayer.Compare(LAY_VPIPE_DIRT) == 0 ||
strLayer.Compare(LAY_VPIPE_USELESS) == 0)
{
return true;
}
return false;
}
void FindVPipe(PickSet &ssVPipe, PickSet &ssAll)
{
TDbPipe *pPipe = NULL;
for(long i = 0; i < ssAll.Length(); i++)
{
Entity ent = ssAll[i];
AcDbObjectId idEnt;
acdbGetObjectId(idEnt, ent);
acdbOpenObject(pPipe, idEnt, AcDb::kForRead);
if (pPipe != NULL)
{
CString strLayer = pPipe->layer();
if (pPipe->IsVertical() && IsValidLayer(strLayer))
{
ssVPipe += ent;
}
pPipe->close();
}
}
}
// 立管是否共线
bool IsOnSameLine(PickSet &ss)
{
int nNum = ss.Length();
if (nNum == 0)
{
return false;
}
else if (nNum == 1)
{
return true;
}
else
{
Entity ent = ss[0L];
TDbPipe *pPipe = NULL;
AcDbObjectId id;
acdbGetObjectId(id, ent);
AcGePoint3d ptS, ptE;
acdbOpenObject(pPipe, id, AcDb::kForRead);
if (pPipe != NULL)
{
pPipe->getStartPoint(ptS);
pPipe->getEndPoint(ptE);
pPipe->close();
}
else
{
return false;
}
AcGeVector3d vt = ptE - ptS;
for (long i = 1; i < nNum; i++)
{
Entity ent1 = ss[i];
acdbGetObjectId(id, ent1);
AcGePoint3d pt1, pt2;
acdbOpenObject(pPipe,id, AcDb::kForRead);
if (pPipe != NULL)
{
pPipe->getStartPoint(pt1);
pPipe->getEndPoint(pt2);
pPipe->close();
}
else
{
return false;
}
AcGeVector3d vt1 = pt1 - pt2;
pt1.z = 0;
ptS.z = 0;
if (ptS.distanceTo(pt1) < 1e-3 && vt1.isParallelTo(vt))
{
continue;
}
return false;
}
}
return true;
}
bool CreatePipeSys(SSearchPipeList *&pListAll, PickSet &ssAll, Entity &entPipe, double &dChamferLen)
{
// 选择管道
PickSet ss(SS_FREE);
RBList rbMask = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("ATS_PIPE"), 8, LAY_PIPE_RAIN, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_PIPE"), 8, LAY_PIPE_DIRT, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_PIPE"), 8, LAY_PIPE_USELESS, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_PIPE"), 8, LAY_VPIPE_RAIN, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_PIPE"), 8, LAY_VPIPE_DIRT, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_PIPE"), 8, LAY_VPIPE_USELESS, -4, _T("and>"),
-4, _T("or>"), NULL);
int nRet;
TCHAR chKey;
const TCHAR* pKey = _T("A");
UpdateChamferLen(dChamferLen);
if (ss.Length() == 0)
{
while (true)
{
INITGET_BEG(0,pKey);
nRet = SelectEntities(_T("\n请选择管道{改变倒角长度(A)}<退出>:"), ss, rbMask, pKey, chKey);
INITGET_END();
if (nRet == RTNORM)
{
break;
}
else if (nRet == RTKWORD)
{
if (chKey == _T('A') || chKey == _T('a'))
{
CString strTip;
strTip.Format(_T("\n请输入倒角长度(mm)<%.0f>:"), dChamferLen);
acedGetReal(strTip, &dChamferLen);
UpdateChamferLen(dChamferLen, false);
}
}
else
{
return false;
}
}
}
ssAll += ss;
// 搜索立管
PickSet ssVPipe(SS_FREE);
FindVPipe(ssVPipe,ss);
if (IsOnSameLine(ssVPipe)) // 所有立管共线
{
entPipe = ssVPipe[0L];
}
else // 存在多个立管或没有立管
{
if (SelectEntity(_T("\n请选择排水口<退出>:"), entPipe, rbMask) != RTNORM)
{
return false;
}
}
// 以排水管道建立管道系统
ss.Free();
ss += entPipe;
pListAll = new SSearchPipeList();
if (!SearchSprinkPipeSys(entPipe, NULL, pListAll, ss))
{
adsout << _T("\n图中为环状管网请修改后再操作!");
return false;
}
return true;
}
bool ModifyPipeSysFlow(SSearchPipeList *&pListAll, Entity &entPipe)
{
// 修改管道流向
ads_name entHead;
if(pListAll->m_lstNode.Length() == 2)
{
SSearchPipeList *p1 = pListAll->m_lstNode[0];
SSearchPipeList *p2 = pListAll->m_lstNode[1];
if(p1->m_lstNode.Length() >= 1 && p2->m_lstNode.Length() >= 1)
{
adsout << _T("\n请选择末端排水管道!");
return false;
}
if(p1->m_lstNode.Length() == 0)
acdbGetAdsName(entHead, p1->m_ID);
else if(p2->m_lstNode.Length() == 0)
acdbGetAdsName(entHead, p2->m_ID);
}
XPoint ptS, ptE, ptLoc;
GetPipePoint(entPipe, ptS, ptE);
OPENOBJ_BEGIN(entHead, AcDb::kForRead, TDbPipeNode, pNode);
if(pNode != NULL)
{
XPoint ptS2 = ptS;
XPoint ptE2 = ptE;
ptS2.z = 0;
ptE2.z = 0;
ptLoc = pNode->GetLocation();
ptLoc.z = 0;
//先把主管线流向给纠正
OPENOBJ_BEGIN(entPipe, AcDb::kForWrite, TDbPipe, pPipe);
if(pPipe != NULL)
{
if(ptLoc == ptS2)
{
pPipe->SetFlowDir(TPipeSys::kFromEnd);
}
else if(ptLoc == ptE2)
{
pPipe->SetFlowDir(TPipeSys::kFromStart);
}
}
OPENOBJ_END();
}
OPENOBJ_END();
//再把系统其他管线流向都纠正
ResetPipeDir(pListAll);
return true;
}
//主命令函数
void DrainChamfer()
{
SSearchPipeList *pListAll = NULL;
PickSet ssAll(SS_FREE);
Entity entPipe; //排水管
double dChamferLen = 0.0; //倒角长度
if (CreatePipeSys(pListAll, ssAll, entPipe, dChamferLen)) // 建立管道系统
{
if (ModifyPipeSysFlow(pListAll, entPipe)) // 修改管道流向
{
// 生成倒角
CDrawDrainChamfer drawChamfer;
drawChamfer.MakeChamfer(pListAll, ssAll, dChamferLen);
}
delete pListAll;
}
}