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

1455 lines
37 KiB
C++

#include "StdAfx.h"
#include "UnfoldInstallAdjustElevation.h"
#include "DbEquipment.h"
#include "NewSanitaryDefineDlg.h"
extern double GetEntDriection(const XPoint &ptStart, const XPoint &ptEnd);
extern int GetSanitaryDataSourceType(Entity ent);
extern bool GetLocSanitaryData(Entity ent, CSanitaryInfo &data, AcGePoint3d &ptFeed,
AcGePoint3d &ptHeatFeed, AcGePoint3d &ptDrain, AcGePoint3d &ptDir);
UnfoldInstallAdjustElevation::UnfoldInstallAdjustElevation()
{
m_pLinkNode = NULL;
m_dToWallDist = 100;
m_dFeedEle = 1000;
}
UnfoldInstallAdjustElevation::~UnfoldInstallAdjustElevation()
{
// 找出根节点
LinkNode *pNode = m_pLinkNode;
while(pNode->pPreNode != NULL)
{
pNode = pNode->pPreNode;
}
// 从供水点开始依次删除本节点和其子节点
DeleteNode(m_pLinkNode);
}
void UnfoldInstallAdjustElevation::AdjustElevation()
{
// 排序变高洁具顺序
std::vector<LinkNode*> vecNode;
SanitarySort(vecNode);
if (vecNode.empty())
{
return;
}
// 先变高第一个洁具到供水点整条路径
LinkNode *pFirstNode = vecNode[0];
AdjustFirstSanEle(pFirstNode);
vecNode.erase(vecNode.begin());
// 其余洁具高过程中止于存在多个分支的点
AdjustSanitaryElevation(vecNode);
// DrawLine();
DrawPipe();
}
void UnfoldInstallAdjustElevation::AdjustFirstSanEle(LinkNode *pFirstNode)
{
AcGePoint3d ptCur, ptPre, ptSan; // 当前节点和上一个节点
AcGePoint3d ptS, ptE; // 产生的直线的起始点
double dSanEle = 0.0, dPipeEle = 0.0; // 洁具点标高,洁具支管标高
int nType;
while(pFirstNode != NULL)
{
ptCur = pFirstNode->ptCur;
nType = pFirstNode->type;
if (SearchPointType(Point_Sanitary, nType)) // 洁具点
{
ptPre = ptCur; // 保存当前节点
// 洁具点标高
AcDbObjectId idSan = GetSanitaryId(ptCur);
if (IsSanitaryPtEleSamePipe(idSan)) // 洁具点标高随支管
{
if (!GetPipeEleForSanitary(idSan, dSanEle)) // 洁具标高随供水点标高
{
// 未定义标高时,以供水点标高为准
dSanEle = GetFeedPtEle();
}
dPipeEle = dSanEle;
ptPre.z = dSanEle;
}
else // 用户指定了洁具点标高
{
if (!GetPipeEleForSanitary(idSan, dPipeEle))
{
// 未定义支管标高时,支管标高随供水管标高
dPipeEle = GetFeedPtEle();
}
if (!GetSanitaryPtEle(idSan, dSanEle))
{
// 未定义洁具点标高时,随支管标高
dSanEle = dPipeEle;
}
if (SearchPointType(Point_KW, nType)) // 在洁具点处产生扣弯, 水平连接方式
{
ptS = ptCur;
ptE = ptCur;
ptS.z = dPipeEle;
ptE.z = dSanEle;
CreateLine(ptS, ptE, eKWPipe);
AddPointElevation(ptCur, dPipeEle);
AddPointElevation(ptCur, dSanEle);
}
}
ptSan = ptCur;
ptSan.z = dSanEle;
ModifySanitaryPt(ptSan);
}
else if (SearchPointType(Point_Int, nType)) // 普通交点
{
if (SearchPointType(Point_KW, nType)) // 扣弯,垂直连接方式
{
ptS = ptCur;
ptE = ptPre;
ptS.z = dSanEle;
ptE.z = dSanEle;
CreateLine(ptS, ptE, eSmallPipe);
ptS = ptCur;
ptE = ptCur;
ptS.z = dPipeEle;
ptE.z = dSanEle;
CreateLine(ptS, ptE, eKWPipe);
AddPointElevation(ptCur, dSanEle);
AddPointElevation(ptCur, dPipeEle);
AddPointElevation(ptPre, dSanEle);
}
else
{
ptS = ptCur;
ptE = ptPre;
ptS.z = dPipeEle;
ptE.z = dPipeEle;
CreateLine(ptS, ptE, ePipe);
AddPointElevation(ptCur, dPipeEle);
AddPointElevation(ptPre, dPipeEle);
}
ptPre = ptCur;
}
else if (SearchPointType(Point_Feed, nType)) // 供水点
{
double dFeedEle = GetFeedPtEle();
if (IsFeedVPipe() || fabs(dFeedEle - dPipeEle) < 0.001) // 供水管为立管或供水点标高与洁具支管标高相同
{
ptS = ptCur;
ptE = ptPre;
ptS.z = dPipeEle;
ptE.z = dPipeEle;
CreateLine(ptS, ptE, ePipe);
AddPointElevation(ptCur, dPipeEle);
AddPointElevation(ptPre, dPipeEle);
}
else // 供水点标高与洁具支管标高不一致,需变高产生扣弯
{
AdjustEleBetweenPts(ptCur, ptPre, dFeedEle, dPipeEle);
}
ptPre = ptCur;
}
pFirstNode = pFirstNode->pPreNode;
}
}
void UnfoldInstallAdjustElevation::AdjustSanitaryElevation(const std::vector<LinkNode*> vecNode)
{
AcGePoint3d ptCur, ptPre, ptSan; // 当前节点和子节点
AcGePoint3d ptS, ptE; // 产生的直线的起始点
double dSanEle = 0.0, dPipeEle = 0.0; // 洁具点标高,洁具支管标高
int nType; // 点类型
LinkNode *pNode = NULL;
std::set<double> setEle; // 点的标高值
std::vector<LinkNode*>::const_iterator it;
for (it = vecNode.begin(); it != vecNode.end(); it++)
{
pNode = *it;
while(pNode != NULL)
{
ptCur = pNode->ptCur;
nType = pNode->type;
if (IsAdjustPointEle(ptCur)) // 该点已经被处理过
{
AdjustEleBetweenPts(ptCur, ptPre, dPipeEle);
break;
}
else
{
if (SearchPointType(Point_Sanitary, nType)) // 洁具点
{
ptPre = ptCur; // 保存当前节点
// 洁具点标高
AcDbObjectId idSan = GetSanitaryId(ptCur);
if (IsSanitaryPtEleSamePipe(idSan)) // 洁具点标高随支管
{
if (!GetPipeEleForSanitary(idSan, dSanEle)) // 洁具标高随供水点标高
{
dSanEle = GetParentNodeEle(ptCur);
}
dPipeEle = dSanEle;
ptPre.z = dSanEle;
}
else // 用户指定了洁具点标高
{
if (!GetPipeEleForSanitary(idSan, dPipeEle))
{
dPipeEle = GetParentNodeEle(ptCur);
}
if(!GetSanitaryPtEle(idSan, dSanEle))
{
dSanEle = dPipeEle;
}
if (SearchPointType(Point_KW, nType)) // 在洁具点处产生扣弯, 水平连接方式
{
ptS = ptCur;
ptE = ptCur;
ptS.z = dPipeEle;
ptE.z = dSanEle;
CreateLine(ptS, ptE, eKWPipe);
AddPointElevation(ptCur, dPipeEle);
AddPointElevation(ptCur, dSanEle);
}
}
ptSan = ptCur;
ptSan.z = dSanEle;
ModifySanitaryPt(ptSan);
}
else if (SearchPointType(Point_Int, nType)) // 普通交点
{
if (SearchPointType(Point_KW, nType)) // 扣弯,垂直连接方式
{
ptS = ptCur;
ptE = ptPre;
ptS.z = dSanEle;
ptE.z = dSanEle;
CreateLine(ptS, ptE, eSmallPipe);
ptS = ptCur;
ptE = ptCur;
ptS.z = dPipeEle;
ptE.z = dSanEle;
CreateLine(ptS, ptE, eKWPipe);
AddPointElevation(ptCur, dSanEle);
AddPointElevation(ptCur, dPipeEle);
AddPointElevation(ptPre, dSanEle);
}
else
{
ptS = ptCur;
ptE = ptPre;
ptS.z = dPipeEle;
ptE.z = dPipeEle;
CreateLine(ptS, ptE, ePipe);
AddPointElevation(ptCur, dPipeEle);
AddPointElevation(ptPre, dPipeEle);
}
ptPre = ptCur;
}
}
pNode = pNode->pPreNode;
}
}
}
void UnfoldInstallAdjustElevation::SetLinkNode( LinkNode *pNode )
{
m_pLinkNode = pNode;
}
void UnfoldInstallAdjustElevation::SetFeedElevation( double dEle )
{
m_dFeedEle = dEle;
if (!DocGetMeterUnitDraw())
{
m_dFeedEle *= 1000;
}
}
void UnfoldInstallAdjustElevation::SetFeedPipe( const AcDbObjectId &idPipe )
{
m_idFeedPipe = idPipe;
}
void UnfoldInstallAdjustElevation::SetSanitaryPt( const std::map<AcDbObjectId,AcGePoint3d> &mapSan )
{
m_mapSanPt = mapSan;
}
void UnfoldInstallAdjustElevation::SetPipeSysType( TPipeSys::SysType sys )
{
m_sysPipeType = sys;
}
void UnfoldInstallAdjustElevation::SanitarySort(std::vector<LinkNode*> &vecNode)
{
// 找出供水点
LinkNode *pNode = m_pLinkNode;
while(pNode->pPreNode != NULL)
{
pNode = pNode->pPreNode;
}
// 按流经洁具点先后顺序获得洁具点
GetSanitaryNode(pNode, vecNode);
}
bool UnfoldInstallAdjustElevation::SearchPointType( int nType, int nOrignType )
{
bool bRet = ((nOrignType & nType) != 0) ? true : false;
return bRet;
}
void UnfoldInstallAdjustElevation::DeleteNode( LinkNode *pNode )
{
if (pNode != NULL)
{
for (int i = 0; i < pNode->m_vecNode.size(); i++)
{
DeleteNode(pNode->m_vecNode[i]);
}
delete pNode;
}
}
void UnfoldInstallAdjustElevation::GetSanitaryNode( LinkNode *pNode, std::vector<LinkNode*> &vecNode )
{
if (pNode != NULL)
{
if (SearchPointType(Point_Sanitary, pNode->type)) // 洁具点
{
vecNode.push_back(pNode);
}
else if (pNode->m_vecNode.size() != 0)
{
int nLinkNum = pNode->m_vecNode.size();
if (nLinkNum == 1)
{
GetSanitaryNode(pNode->m_vecNode[0], vecNode);
}
else
{
if (pNode->pPreNode != NULL) // 前向节点存在,其中后续节点,前向节点,本节点共线的分支最后处理
{
LinkNode *pParallelNode = NULL; // 平行节点
AcGePoint3d ptPre = pNode->pPreNode->ptCur;
AcGePoint3d ptNext;
for(int i = 0; i < pNode->m_vecNode.size(); i++)
{
ptNext = pNode->m_vecNode[i]->ptCur;
if (!IsSameOnLine(ptNext, ptPre, pNode->ptCur))
{
GetSanitaryNode(pNode->m_vecNode[i], vecNode);
}
else
{
pParallelNode = pNode->m_vecNode[i];
}
}
// 后处理平行节点
if (pParallelNode != NULL)
{
GetSanitaryNode(pParallelNode, vecNode);
}
}
else // 前向节点不存在
{
for(int i = 0; i < pNode->m_vecNode.size(); i++)
{
GetSanitaryNode(pNode->m_vecNode[i], vecNode);
}
}
}
}
}
}
bool UnfoldInstallAdjustElevation::IsSameOnLine( const AcGePoint3d &pt1, const AcGePoint3d &pt2, const AcGePoint3d &pt3 )
{
if (pt1.distanceTo(pt3) < 0.001)
{
return false;
}
AcGeVector3d vt1 = pt1 - pt2;
AcGeVector3d vt2 = pt3 - pt2;
AcGeTol tol;
tol.setEqualVector(0.001);
if (vt1.isParallelTo(vt2, tol))
{
return true;
}
return false;
}
bool UnfoldInstallAdjustElevation::IsFeedVPipe()
{
bool bRet = false;
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, m_idFeedPipe, AcDb::kForRead);
if (pPipe != NULL)
{
bRet = pPipe->IsVertical() ? true : false;
pPipe->close();
}
return bRet;
}
double UnfoldInstallAdjustElevation::GetFeedPtEle()
{
double dEle = 0.0;
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, m_idFeedPipe, AcDb::kForRead);
if (pPipe != NULL)
{
if (pPipe->IsVertical()) // 供水管为立管
{
dEle = m_dFeedEle;
}
else // 供水管为管线时,标高随管线标高
{
dEle = pPipe->StartPoint().z;
}
pPipe->close();
}
return dEle;
}
bool UnfoldInstallAdjustElevation::IsSanitaryPtEleSamePipe( const AcDbObjectId &idSan )
{
double dPtFeedEle = 0.0;
if (!GetSanitaryPtEle(idSan, dPtFeedEle))
{
return false;
}
double dRefVal = DocGetMeterUnitDraw() ? 1 : 1000;
if (fabs(dPtFeedEle + dRefVal) < 0.001)
{
return true;
}
return false;
}
extern bool GetSanitaryInfo(Entity ent, XPoint &ptRet, CString &csBlk, CString &csSysBlk, double &nRadius, double &nDang, double &nBigQ, double &dEle, int iType, CString &sDwbName, CString &sFeedElev, CString &sHotElev);
bool UnfoldInstallAdjustElevation::GetSanitaryPtEle( const AcDbObjectId &idSan, double &dSanEle )
{
ads_name name;
acdbGetAdsName(name, idSan);
XPoint ptFeed;
CString sTmp1, sTmp2, sDwbName, sFeedElev, sHotElev;
double dRadius = 0.0, dDang = 0.0, dRateQ = 0.0, dSanPtEle;
Entity ent = name;
// zxl 2012.12.11 modify 获取洁具数据源
int nDataSourceType = GetSanitaryDataSourceType(ent);
if (nDataSourceType == 1 || nDataSourceType == 0)
{
if (!GetSanitaryInfo(ent, ptFeed, sTmp1, sTmp2, dRadius, dDang, dRateQ, dSanPtEle, 0, sDwbName, sFeedElev, sHotElev))
{
return false;
}
}
else
{
CSanitaryInfo sanInfo;
XPoint ptFeed, ptHeatFeed, ptDir, ptDrain;
GetLocSanitaryData(ent, sanInfo, ptFeed, ptHeatFeed, ptDrain, ptDir);
dSanPtEle = ptFeed.z;
}
if (!DocGetMeterUnitDraw())
{
dSanPtEle *= 1000;
}
dSanEle = dSanPtEle;
return true;
}
bool UnfoldInstallAdjustElevation::GetPipeEleForSanitary( const AcDbObjectId &idSan, double &dPipeEle)
{
ads_name name;
acdbGetAdsName(name, idSan);
XPoint ptFeed;
CString sTmp1, sTmp2, sDwbName, sFeedElev, sHotElev;
double dRadius = 0.0, dDang = 0.0, dRateQ = 0.0, dSanEle = 0.0;
Entity ent = name;
// zxl 2012.12.11 modify 获取洁具数据源
int nDataSourceType = GetSanitaryDataSourceType(ent);
if (nDataSourceType == 1 || nDataSourceType == 0)// 图纸取数据
{
if (m_sysPipeType == TPipeSys::kFeedWater || m_sysPipeType == TPipeSys::kFeedWater2 || m_sysPipeType == TPipeSys::kFeedWater3
|| m_sysPipeType == TPipeSys::kUsedWater || m_sysPipeType == TPipeSys::kUsedWater2 || m_sysPipeType == TPipeSys::kUsedWater3)
{
if (!GetSanitaryInfo(ent, ptFeed, sTmp1, sTmp2, dRadius, dDang, dRateQ, dSanEle, 0, sDwbName, sFeedElev, sHotElev))
{
return false;
}
dPipeEle = _tstof(sFeedElev);
}
else
{
if (!GetSanitaryInfo(ent, ptFeed, sTmp1, sTmp2, dRadius, dDang, dRateQ, dSanEle, 1, sDwbName, sFeedElev, sHotElev))
{
return false;
}
dPipeEle = _tstof(sHotElev);
}
}
else// 本地取数据
{
CSanitaryInfo sanInfo;
XPoint ptFeed, ptHeatFeed, ptDir, ptDrain;
GetLocSanitaryData(ent, sanInfo, ptFeed, ptHeatFeed, ptDrain, ptDir);
if (m_sysPipeType == TPipeSys::kFeedWater || m_sysPipeType == TPipeSys::kFeedWater2 || m_sysPipeType == TPipeSys::kFeedWater3
|| m_sysPipeType == TPipeSys::kUsedWater || m_sysPipeType == TPipeSys::kUsedWater2 || m_sysPipeType == TPipeSys::kUsedWater3)
{
dPipeEle = _tstof(sanInfo.sFeedElev);
}
else
{
dPipeEle = _tstof(sanInfo.sHotElev);
}
}
if (!DocGetMeterUnitDraw())
{
dPipeEle *= 1000;
}
return true;
}
AcDbObjectId UnfoldInstallAdjustElevation::GetSanitaryId( const AcGePoint3d &ptSan )
{
AcDbObjectId idSan = AcDbObjectId::kNull;
std::map<AcDbObjectId,AcGePoint3d>::iterator it;
AcGePoint3d ptTemp;
for (it = m_mapSanPt.begin(); it != m_mapSanPt.end(); it++)
{
ptTemp = it->second;
ptTemp.z = 0.0;
if (ptSan.distanceTo(ptTemp) < 0.001)
{
idSan = it->first;
break;
}
}
return idSan;
}
void UnfoldInstallAdjustElevation::CreateLine( const AcGePoint3d &ptS, const AcGePoint3d &ptE, LineType type)
{
LineInfo info;
info.ptS = ptS;
info.ptE = ptE;
info.type = type;
m_vecLineInfo.push_back(info);
}
void UnfoldInstallAdjustElevation::AddPointElevation( const AcGePoint3d &pt, double dEle )
{
std::vector<PointNode>::iterator it;
AcGePoint3d ptTemp = pt;
ptTemp.z = 0.0;
for (it = m_vecPtEle.begin(); it != m_vecPtEle.end(); it++)
{
if (ptTemp.distanceTo(it->pt) < 0.001)
{
it->setEle.insert(dEle);
break;
}
}
if (it == m_vecPtEle.end())
{
PointNode node;
node.pt = ptTemp;
node.setEle.insert(dEle);
m_vecPtEle.push_back(node);
}
}
bool UnfoldInstallAdjustElevation::GetPointElevation( const AcGePoint3d &pt, std::set<double> &setEle )
{
std::vector<PointNode>::iterator it;
AcGePoint3d ptTemp = pt;
ptTemp.z = 0.0;
for (it = m_vecPtEle.begin(); it != m_vecPtEle.end(); it++)
{
if (ptTemp.distanceTo(it->pt) < 0.001)
{
setEle = it->setEle;
return true;
}
}
return false;
}
bool UnfoldInstallAdjustElevation::IsCorner( const AcGePoint3d &pt )
{
LinkNode *pNode = GetLinkNode(pt);
if (pNode != NULL)
{
LinkNode *pPreNode = pNode->pPreNode;
if (pPreNode != NULL && pNode->m_vecNode.size() == 1)
{
AcGePoint3d ptPre = pPreNode->ptCur;
AcGePoint3d ptNext = pNode->m_vecNode[0]->ptCur;
AcGePoint3d ptCur = pt;
AcGeVector3d vt1 = ptPre - ptCur;
AcGeVector3d vt2 = ptCur - ptNext;
vt1.z = 0.0;
vt2.z = 0.0;
AcGeTol tol;
tol.setEqualVector(0.001);
if (!vt1.isParallelTo(vt2, tol))
{
return true;
}
}
}
return false;
}
bool UnfoldInstallAdjustElevation::IsPointKw( const AcGePoint3d &pt )
{
bool bRet = false;
LinkNode *pNode = GetLinkNode(pt);
if (pNode != NULL && SearchPointType(Point_KW, pNode->type))
{
bRet = true;
}
return bRet;
}
LinkNode* UnfoldInstallAdjustElevation::GetLinkNode( const AcGePoint3d &pt )
{
if (m_pLinkNode == NULL)
{
return NULL;
}
LinkNode *pRetNode = NULL;
LinkNode *pTemp = m_pLinkNode;
std::vector<LinkNode*> vecNode;
vecNode.push_back(pTemp);
while(!vecNode.empty())
{
pTemp = *(vecNode.begin());
vecNode.erase(vecNode.begin());
if (pt.distanceTo(pTemp->ptCur) < 0.001)
{
pRetNode = pTemp;
break;
}
for (int i = 0; i < pTemp->m_vecNode.size(); i++)
{
vecNode.push_back(pTemp->m_vecNode[i]);
}
}
return pRetNode;
}
bool UnfoldInstallAdjustElevation::IsExistPerpendicularWall( const AcGePoint3d &pt1, const AcGePoint3d &pt2, AcDbObjectId &idWall )
{
PickSet ssName(SS_FREE);
RBList rbMake = acutBuildList(RTDXF0, _T("ATS_WALL"), NULL);
acedSSGet(_T("C"), Wcs2Ucs(pt1), Wcs2Ucs(pt2), rbMake, ssName);
bool bRet = false;
AcDbObjectId id;
XCurveSegment segL,segR;
AcGeVector3d vtWall;
AcGeVector3d vt = pt1 - pt2; // 两点直线方向
vt.z = 0.0;
AcGeTol tol;
tol.setEqualVector(0.001);
for (long i = 0; (i < ssName.Length()) && !bRet; i++)
{
acdbGetObjectId(id, ssName[i]);
TDbWall *pWall = NULL;
acdbOpenObject(pWall, id, AcDb::kForRead);
if (pWall != NULL)
{
if (pWall->Is(CURVE_LINE))
{
pWall->GetSideCurve(segL,segR);
vtWall = segR.StartPoint() - segR.EndPoint();
vtWall.z = 0.0;
if (vt.isPerpendicularTo(vtWall, tol))
{
bRet = true;
idWall = id;
}
}
pWall->close();
}
}
return bRet;
}
bool UnfoldInstallAdjustElevation::GetAdjustPoint( const AcGePoint3d &ptS, const AcGePoint3d &ptE, const AcDbObjectId &idWall, AcGePoint3d &pt )
{
bool bRet = false;
TDbWall *pWall = NULL;
acdbOpenObject(pWall, idWall, AcDb::kForRead);
if (pWall != NULL)
{
if (pWall->Is(CURVE_LINE))
{
XCurveSegment segL,segR;
pWall->GetSideCurve(segL,segR);
XPoint pt1, pt2;
Midpoint(segL.StartPoint(), segR.StartPoint(), pt1);
Midpoint(segL.EndPoint(), segR.EndPoint(), pt2);
pt1.z = 0.0;
pt2.z = 0.0;
AcDbLine line1(pt1, pt2);
AcGePoint3d pt3 = ptS, pt4 = ptE;
pt3.z = 0.0;
pt4.z = 0.0;
AcDbLine line2(pt3, pt4);
AcGePoint3dArray arrPt;
line1.intersectWith(&line2, AcDb::kOnBothOperands, arrPt);
if (arrPt.length() == 1)
{
AcGePoint3d ptInt = arrPt[0];
pt1 = segL.StartPoint();
pt2 = segR.StartPoint();
double dWitdh = pt1.Distance2d(pt2);
double dDist = dWitdh / 2 + m_dToWallDist;
double dMinDist = 0.1; // 变高点距端点的最小距离
if (!DocGetMeterUnitDraw())
{
dMinDist *= 1000;
}
if (pt3.distanceTo(ptInt) > dDist + dMinDist)
{
AcGeVector3d vtDir = ptS - ptInt;
vtDir.z = 0.0;
vtDir.normalize();
pt = ptInt + vtDir * dDist;
bRet = true;
}
else if (pt4.distanceTo(ptInt) > dDist + dMinDist)
{
AcGeVector3d vtDir = ptE - ptInt;
vtDir.z = 0.0;
vtDir.normalize();
pt = ptInt + vtDir * dDist;
bRet = true;
}
}
}
pWall->close();
}
return bRet;
}
void UnfoldInstallAdjustElevation::DrawLine()
{
std::vector<LineInfo>::iterator it;
for (it = m_vecLineInfo.begin(); it != m_vecLineInfo.end(); it++)
{
AcGePoint3d ptS = it->ptS, ptE = it->ptE;
if (ptS.distanceTo(ptE) < 0.001)
{
continue;
}
AcDbLine *pLine = new AcDbLine;
pLine->setStartPoint(ptS);
pLine->setEndPoint(ptE);
AddToCurrentSpace(pLine, Adesk::kTrue);
}
}
bool UnfoldInstallAdjustElevation::IsAdjustPointEle( const AcGePoint3d &pt )
{
bool bRet = false;
std::vector<PointNode>::iterator it;
AcGePoint3d ptTemp = pt;
ptTemp.z = 0.0;
for (it = m_vecPtEle.begin(); it != m_vecPtEle.end(); it++)
{
if (ptTemp.distanceTo(it->pt) < 0.001)
{
bRet = true;
break;
}
}
return bRet;
}
bool UnfoldInstallAdjustElevation::FindParallelLine( const AcGePoint3d &ptS, const AcGePoint3d &ptE, double &dPipeEle )
{
bool bRet = false;
AcGePoint3d pt1 = ptS, pt2 = ptE;
pt1.z = 0.0;
pt2.z = 0.0;
std::vector<LineInfo>::iterator it;
AcGePoint3d ptTemp, ptTemp2;
AcGeVector3d vt1 = pt1 - pt2, vt2;
AcGeTol tol;
tol.setEqualVector(0.001);
for (it = m_vecLineInfo.begin(); it != m_vecLineInfo.end(); it++)
{
if (it->type == eKWPipe)
{
continue;
}
ptTemp = it->ptE;
ptTemp2 = it->ptS;
ptTemp.z = 0.0;
ptTemp2.z = 0.0;
if(ptTemp.distanceTo(pt1) < 0.001 || ptTemp2.distanceTo(pt1) < 0.001)
{
vt2 = it->ptE - it->ptS;
vt2.z = 0.0;
if (vt1.isParallelTo(vt2, tol))
{
dPipeEle = it->ptS.z;
bRet = true;
break;
}
}
}
return bRet;
}
void UnfoldInstallAdjustElevation::AdjustEleBetweenPts( const AcGePoint3d &ptCur, const AcGePoint3d &ptPre, double dFeedEle, double dPipeEle )
{
AcGePoint3d ptS, ptE;
AcDbObjectId idWall = AcDbObjectId::kNull;
if (IsCorner(ptPre) && !IsPointKw(ptPre)) // 转角位置并且转角点不具有Point_KW类型
{
ptS = ptCur;
ptE = ptPre;
ptS.z = dFeedEle;
ptE.z = dFeedEle;
CreateLine(ptS, ptE, ePipe);
ptS = ptPre;
ptE = ptPre;
ptS.z = dFeedEle;
ptE.z = dPipeEle;
CreateLine(ptS, ptE, eKWPipe);
AddPointElevation(ptCur, dFeedEle);
AddPointElevation(ptPre, dFeedEle);
AddPointElevation(ptPre, dPipeEle);
}
else if (IsExistPerpendicularWall(ptCur, ptPre, idWall)) // 两点穿过墙体,在墙边上变高
{
AcGePoint3d ptTemp;
if (!GetAdjustPoint(ptCur, ptPre, idWall, ptTemp)) // 得到变高点
{
ptTemp = ptCur;
}
ptS = ptCur;
ptS.z = dFeedEle;
ptTemp.z = dFeedEle;
CreateLine(ptS, ptTemp, ePipe);
ptE = ptTemp;
ptE.z = dPipeEle;
CreateLine(ptTemp, ptE, eKWPipe);
ptS = ptTemp;
ptE = ptPre;
ptS.z = dPipeEle;
ptE.z = dPipeEle;
CreateLine(ptS, ptE, ePipe);
AddPointElevation(ptCur, dFeedEle);
AddPointElevation(ptTemp, dFeedEle);
AddPointElevation(ptTemp, dPipeEle);
AddPointElevation(ptPre, dPipeEle);
}
else // 取两点中点变高
{
AcGePoint3d ptMid;
ptMid.x = (ptCur.x + ptPre.x) / 2;
ptMid.y = (ptCur.y + ptPre.y) / 2;
ptMid.z = 0.0;
ptS = ptCur;
ptS.z = dFeedEle;
ptMid.z = dFeedEle;
CreateLine(ptS, ptMid, ePipe);
ptE = ptMid;
ptE.z = dPipeEle;
CreateLine(ptMid, ptE, eKWPipe);
ptS = ptMid;
ptE = ptPre;
ptS.z = dPipeEle;
ptE.z = dPipeEle;
CreateLine(ptS, ptE, ePipe);
AddPointElevation(ptCur, dFeedEle);
AddPointElevation(ptMid, dFeedEle);
AddPointElevation(ptMid, dPipeEle);
AddPointElevation(ptPre, dPipeEle);
}
}
void UnfoldInstallAdjustElevation::AdjustEleBetweenPts(const AcGePoint3d &ptCur, const AcGePoint3d &ptPre, double dPipeEle)
{
// 获取当前节点
LinkNode *pCurNode = GetLinkNode(ptCur);
if (pCurNode == NULL)
{
AfxMessageBox(_T("恭喜你发现了错误,哈哈!"));
return;
}
// 确定当前点标高值
double dCurEle = 0.0;
// 不存在端点与ptCur重合且与ptPre共线已变高管线
if (!FindParallelLine(ptCur, ptPre, dCurEle))
{
// 获得ptCur点目前已确定的标高值
std::set<double> setEle;
GetPointElevation(ptCur, setEle);
// 取标高最小值
dCurEle = *setEle.begin();
}
AcGePoint3d ptS, ptE;
AcDbObjectId idWall = AcDbObjectId::kNull;
if (IsCorner(ptPre) && !IsPointKw(ptPre)) // 转角位置且转角点不能具有Point_KW类型
{
ptS = ptCur;
ptE = ptPre;
ptS.z = dCurEle;
ptE.z = dCurEle;
CreateLine(ptS, ptE, ePipe);
// 更新点的连接
UpdateNodeLink(ptPre, dCurEle);
UpdateNodeLink(ptPre, dPipeEle);
AddPointElevation(ptCur, dCurEle);
AddPointElevation(ptPre, dCurEle);
}
else if (IsExistPerpendicularWall(ptCur, ptPre, idWall)) // 两点穿过墙体,在墙边上变高
{
AcGePoint3d ptTemp;
if (GetAdjustPoint(ptCur, ptPre, idWall, ptTemp)) // 得到变高点
{
ptS = ptCur;
ptS.z = dCurEle;
ptTemp.z = dCurEle;
CreateLine(ptS, ptTemp, ePipe);
ptE = ptTemp;
ptE.z = dPipeEle;
CreateLine(ptTemp, ptE, eKWPipe);
ptS = ptTemp;
ptE = ptPre;
ptS.z = dPipeEle;
ptE.z = dPipeEle;
CreateLine(ptS, ptE, ePipe);
AddPointElevation(ptCur, dCurEle);
AddPointElevation(ptTemp, dCurEle);
AddPointElevation(ptTemp, dPipeEle);
AddPointElevation(ptPre, dPipeEle);
}
else // 无法获得标高点,在父节点处变高
{
ptS = ptCur;
ptE = ptPre;
ptS.z = dPipeEle;
ptE.z = dPipeEle;
CreateLine(ptS, ptE, ePipe);
// 更新点的连接
UpdateNodeLink(ptCur, dCurEle);
UpdateNodeLink(ptCur, dPipeEle);
AddPointElevation(ptCur, dPipeEle);
AddPointElevation(ptPre, dPipeEle);
}
}
else // 取两点中点变高
{
AcGePoint3d ptMid;
ptMid.x = (ptCur.x + ptPre.x) / 2;
ptMid.y = (ptCur.y + ptPre.y) / 2;
ptMid.z = 0.0;
ptS = ptCur;
ptS.z = dCurEle;
ptMid.z = dCurEle;
CreateLine(ptS, ptMid, ePipe);
ptE = ptMid;
ptE.z = dPipeEle;
CreateLine(ptMid, ptE, eKWPipe);
ptS = ptMid;
ptE = ptPre;
ptS.z = dPipeEle;
ptE.z = dPipeEle;
CreateLine(ptS, ptE, ePipe);
AddPointElevation(ptCur, dCurEle);
AddPointElevation(ptMid, dCurEle);
AddPointElevation(ptMid, dPipeEle);
AddPointElevation(ptPre, dPipeEle);
}
}
void UnfoldInstallAdjustElevation::UpdateNodeLink( const AcGePoint3d &pt, double dEle )
{
// 获得pt点已确定的标高值
std::set<double> setEle;
GetPointElevation(pt, setEle);
if (setEle.empty())
{
return;
}
double dMinEle = *setEle.begin();
double dMaxEle = *setEle.rbegin();
if (setEle.size() == 1) // pt点只确定了一个标高值
{
AcGePoint3d ptS = pt;
AcGePoint3d ptE = pt;
ptS.z = dEle;
ptE.z = dMinEle;
CreateLine(ptS, ptE, eKWPipe);
AddPointElevation(pt, dEle);
}
else if (dEle < dMinEle + 0.001)
{
AcGePoint3d ptS = pt;
AcGePoint3d ptE = pt;
ptS.z = dMinEle;
ptE.z = dEle;
CreateLine(ptS, ptE, eKWPipe);
AddPointElevation(pt, dEle);
}
else if (dEle > dMaxEle + 0.001)
{
AcGePoint3d ptS = pt;
AcGePoint3d ptE = pt;
ptS.z = dMaxEle;
ptE.z = dEle;
CreateLine(ptS, ptE, eKWPipe);
AddPointElevation(pt, dEle);
}
}
void UnfoldInstallAdjustElevation::DrawPipe()
{
// 获取管线信息
CString sPipeLayer = GetPipeLayer(m_sysPipeType);
CString sVPipeLayer = GetVPipeLayer(m_sysPipeType);
InitLayer(sPipeLayer);
InitLayer(sVPipeLayer);
int iPipeIdx = GetPipeLayerIdxByName(sPipeLayer);
CString sLineType = GetPipeWireLayLineType(sPipeLayer);
CString sMaterial = GetPipeMaterialByIdx(g_iPipeMaterial[iPipeIdx]);
CString sDnType = GetDnByMat(sMaterial);
double dPipeDn = 20;
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, m_idFeedPipe, AcDb::kForRead);
if (pPipe != NULL)
{
dPipeDn = pPipe->GetDnDiameter();
pPipe->close();
}
CString sLineType2 = GetLayerLineType(sPipeLayer);
AcGePoint3d ptS, ptE;
std::vector<LineInfo>::iterator it;
for (it = m_vecLineInfo.begin(); it != m_vecLineInfo.end(); it++)
{
ptS = it->ptS;
ptE = it->ptE;
if (ptS.distanceTo(ptE) < 0.001) // 可能存在重合点
{
continue;
}
TDbPipe *pPipe = new TDbPipe();
int iPipeIdx = GetPipeLayerIdxByName(sPipeLayer);
pPipe->SetRadius(g_nPipeRadius[iPipeIdx]);
if (it->type == eKWPipe)//设置立管显示半径
{
if(g_bPipeDouble[iPipeIdx])
{
pPipe->SetRadiusIn(g_nPipeRadius[iPipeIdx] / 2);
}
else
{
if(!g_bStandPipeArc)//传统扣弯
pPipe->SetRadiusIn(-2);
}
}
pPipe->SetStartPoint(ptS);
pPipe->SetEndPoint(ptE);
pPipe->SetFlowDir(TPipeSys::kFromStart);
if(sLineType2.Find(_T("TG")) > -1)
{
XLine line(asDblArray(ptS), asDblArray(ptE));
double nAng = line.Direction();
if(nAng > PI/2 && nAng < (PI/2*3 + 0.001))
{
pPipe->SetStartPoint(ptE);
pPipe->SetEndPoint(ptS);
pPipe->SetFlowDir(TPipeSys::kFromEnd);
}
}
pPipe->SetDnDiameter(dPipeDn);
pPipe->setLayer(sPipeLayer);
pPipe->SetSysType(GetPipeSysByLayer(sPipeLayer));
pPipe->setColor(AcCmColor()); //随层
pPipe->SetPipeWeight(g_nPipeWidth[iPipeIdx]);
pPipe->setLinetype(sLineType);
pPipe->setLineWeight(AcDb::kLnWtByLayer);
pPipe->SetMaterial(g_iPipeMaterial[iPipeIdx]);
pPipe->SetLabel(sDnType);
AddToCurrentSpace(pPipe, Adesk::kTrue);
}
InsertSanitaryEquip();
}
CString UnfoldInstallAdjustElevation::GetPipeLayer(TPipeSys::SysType sys)
{
CString sLayer;
if(sys == TPipeSys::kFeedWater)
sLayer = LAY_PIPE_FEED;
else if (sys == TPipeSys::kFeedWater2)
sLayer = LAY_PIPE_FEED2;
else if (sys == TPipeSys::kFeedWater3)
sLayer = LAY_PIPE_FEED3;
else if(sys == TPipeSys::kHeatFeedWater)
sLayer = LAY_PIPE_HEADFEED;
else if(sys == TPipeSys::kHeatFeedWater2)
sLayer = LAY_PIPE_HEADFEED2;
else if(sys == TPipeSys::kHeatFeedWater3)
sLayer = LAY_PIPE_HEADFEED3;
else if(sys == TPipeSys::kHeatBackWater)
sLayer = LAY_PIPE_HEADBACK;
else if(sys == TPipeSys::kHeatBackWater2)
sLayer = LAY_PIPE_HEADBACK2;
else if(sys == TPipeSys::kHeatBackWater3)
sLayer = LAY_PIPE_HEADBACK3;
else if(sys == TPipeSys::kDirtWater)
sLayer = LAY_PIPE_DIRT;
else if(sys == TPipeSys::kUselessWater)
sLayer = LAY_PIPE_USELESS;
else if(sys == TPipeSys::kRainWater)
sLayer = LAY_PIPE_RAIN;
else if(sys == TPipeSys::kUsedWater)
sLayer = LAY_PIPE_USED;
else if(sys == TPipeSys::kUsedWater2)
sLayer = LAY_PIPE_USED2;
else if(sys == TPipeSys::kUsedWater3)
sLayer = LAY_PIPE_USED3;
else if(sys == TPipeSys::kFireFighting)
sLayer = LAY_PIPE_FIRE;
else if(sys == TPipeSys::kFireFighting2)
sLayer = LAY_PIPE_FIRE2;
else if(sys == TPipeSys::kFireFighting3)
sLayer = LAY_PIPE_FIRE3;
else if(sys == TPipeSys::kSprinkle)
sLayer = LAY_PIPE_SPRINKLE;
else if(sys == TPipeSys::kSprinkle2)
sLayer = LAY_PIPE_SPRINKLE2;
else if(sys == TPipeSys::kSprinkle3)
sLayer = LAY_PIPE_SPRINKLE3;
else if(sys == TPipeSys::kCoagulate)
sLayer = LAY_PIPE_COAGULATE;
else if(sys == TPipeSys::kDrink)
sLayer = LAY_PIPE_DRINK;
else if(sys == TPipeSys::kPressDirt)
sLayer = LAY_PIPE_PRESSDIRT;
else if(sys == TPipeSys::kPressUseless)
sLayer = LAY_PIPE_PRESSUSELESS;
else if(sys == TPipeSys::kPressRain)
sLayer = LAY_PIPE_PRESSRAIN;
else if(sys == TPipeSys::kCivilFeed)
sLayer = LAY_PIPE_USER1;
else if(sys == TPipeSys::kCycleFeed)
sLayer = LAY_PIPE_USER2;
else if(sys == TPipeSys::kOther)
sLayer = LAY_PIPE_OTHER;
else if (sys == TPipeSys::kUser3)
sLayer = LAY_PIPE_USER3;
else if (sys == TPipeSys::kUser4)
sLayer = LAY_PIPE_USER4;
else if (sys == TPipeSys::kUser5)
sLayer = LAY_PIPE_USER5;
else if (sys == TPipeSys::kUser6)
sLayer = LAY_PIPE_USER6;
else if (sys == TPipeSys::kUser7)
sLayer = LAY_PIPE_USER7;
else if (sys == TPipeSys::kUser8)
sLayer = LAY_PIPE_USER8;
return sLayer;
}
CString UnfoldInstallAdjustElevation::GetVPipeLayer(TPipeSys::SysType sys)
{
CString sLayer;
if(sys == TPipeSys::kFeedWater)
sLayer = LAY_VPIPE_FEED;
else if (sys == TPipeSys::kFeedWater2)
sLayer = LAY_VPIPE_FEED2;
else if (sys == TPipeSys::kFeedWater3)
sLayer = LAY_VPIPE_FEED3;
else if(sys == TPipeSys::kHeatFeedWater)
sLayer = LAY_VPIPE_HEADFEED;
else if(sys == TPipeSys::kHeatFeedWater2)
sLayer = LAY_VPIPE_HEADFEED2;
else if(sys == TPipeSys::kHeatFeedWater3)
sLayer = LAY_VPIPE_HEADFEED3;
else if(sys == TPipeSys::kHeatBackWater)
sLayer = LAY_VPIPE_HEADBACK;
else if(sys == TPipeSys::kHeatBackWater2)
sLayer = LAY_VPIPE_HEADBACK2;
else if(sys == TPipeSys::kHeatBackWater3)
sLayer = LAY_VPIPE_HEADBACK3;
else if(sys == TPipeSys::kDirtWater)
sLayer = LAY_VPIPE_DIRT;
else if(sys == TPipeSys::kUselessWater)
sLayer = LAY_VPIPE_USELESS;
else if(sys == TPipeSys::kRainWater)
sLayer = LAY_VPIPE_RAIN;
else if(sys == TPipeSys::kUsedWater)
sLayer = LAY_VPIPE_USED;
else if(sys == TPipeSys::kUsedWater2)
sLayer = LAY_VPIPE_USED2;
else if(sys == TPipeSys::kUsedWater3)
sLayer = LAY_VPIPE_USED3;
else if(sys == TPipeSys::kFireFighting)
sLayer = LAY_VPIPE_FIRE;
else if(sys == TPipeSys::kFireFighting2)
sLayer = LAY_VPIPE_FIRE2;
else if(sys == TPipeSys::kFireFighting3)
sLayer = LAY_VPIPE_FIRE3;
else if(sys == TPipeSys::kSprinkle)
sLayer = LAY_VPIPE_SPRINKLE;
else if(sys == TPipeSys::kSprinkle2)
sLayer = LAY_VPIPE_SPRINKLE2;
else if(sys == TPipeSys::kSprinkle3)
sLayer = LAY_VPIPE_SPRINKLE3;
else if(sys == TPipeSys::kCoagulate)
sLayer = LAY_VPIPE_COAGULATE;
else if(sys == TPipeSys::kDrink)
sLayer = LAY_VPIPE_DRINK;
else if(sys == TPipeSys::kPressDirt)
sLayer = LAY_VPIPE_PRESSDIRT;
else if(sys == TPipeSys::kPressUseless)
sLayer = LAY_VPIPE_PRESSUSELESS;
else if(sys == TPipeSys::kPressRain)
sLayer = LAY_VPIPE_PRESSRAIN;
else if(sys == TPipeSys::kCivilFeed)
sLayer = LAY_VPIPE_USER1;
else if(sys == TPipeSys::kCycleFeed)
sLayer = LAY_VPIPE_USER2;
else if(sys == TPipeSys::kOther)
sLayer = LAY_VPIPE_OTHER;
else if (sys == TPipeSys::kUser3)
sLayer = LAY_VPIPE_USER3;
else if (sys == TPipeSys::kUser4)
sLayer = LAY_VPIPE_USER4;
else if (sys == TPipeSys::kUser5)
sLayer = LAY_VPIPE_USER5;
else if (sys == TPipeSys::kUser6)
sLayer = LAY_VPIPE_USER6;
else if (sys == TPipeSys::kUser7)
sLayer = LAY_VPIPE_USER7;
else if (sys == TPipeSys::kUser8)
sLayer = LAY_VPIPE_USER8;
return sLayer;
}
void UnfoldInstallAdjustElevation::ModifySanitaryPt( const AcGePoint3d &ptSan )
{
AcGePoint3d ptTemp = ptSan;
std::map<AcDbObjectId,AcGePoint3d>::iterator it;
for (it = m_mapSanPt.begin(); it != m_mapSanPt.end(); it++)
{
ptTemp.z = it->second.z;
if (ptTemp.distanceTo(it->second) < 0.001)
{
it->second.z = ptSan.z;
break;
}
}
}
void UnfoldInstallAdjustElevation::InsertSanitaryEquip()
{
std::map<AcDbObjectId,AcGePoint3d>::iterator it;
for (it = m_mapSanPt.begin(); it != m_mapSanPt.end(); it++)
{
DrawFeedEquip(it->first, it->second);
}
}
extern bool GetSanitaryDriection(Entity ent, double &dSanitaryDriec);
void UnfoldInstallAdjustElevation::DrawFeedEquip(const AcDbObjectId &idSan, const AcGePoint3d &ptSan)
{
ads_name name;
acdbGetAdsName(name, idSan);
Entity ent(name);
CString sDwbName, sHotElev, sFeedElev, sBlk, sSysBlk;
double dEle = 0.0, dRadius = 0.0, dDang = 0.0, dBigQ = 0.0;
XPoint pt;
int nType = 0;
if (m_sysPipeType == TPipeSys::kHeatFeedWater
|| m_sysPipeType == TPipeSys::kHeatFeedWater2
|| m_sysPipeType == TPipeSys::kHeatFeedWater3)
{
nType = 1;
}
else if (m_sysPipeType == TPipeSys::kFeedWater
|| m_sysPipeType == TPipeSys::kFeedWater2
|| m_sysPipeType == TPipeSys::kFeedWater3) // 给水
{
nType = 0;
}
else if (m_sysPipeType == TPipeSys::kUsedWater
|| m_sysPipeType == TPipeSys::kUsedWater2
|| m_sysPipeType == TPipeSys::kUsedWater3) // 中水
{
nType = 0;
}
double dAngle = 0.0;
// zxl 2012.12.11 modify 获取洁具数据源
int nDataSourceType = GetSanitaryDataSourceType(ent);
if (nDataSourceType == 1 || nDataSourceType == 0)
{
GetSanitaryInfo(ent, pt, sBlk, sSysBlk, dRadius, dDang, dBigQ, dEle, nType,
sDwbName, sFeedElev, sHotElev);
ent.GetData(50, &dAngle);
if (GetSanitaryDriection(ent, dAngle))
{
dAngle += PI / 2;
}
}
else
{
CSanitaryInfo sanInfo;
XPoint ptFeed, ptHeatFeed, ptDir, ptBlk;
GetLocSanitaryData(ent, sanInfo, ptFeed, ptHeatFeed, pt, ptDir);
sBlk = sanInfo.sFeedSys;
sSysBlk = sanInfo.sSysBlk1;
dDang = sanInfo.dDang;
dBigQ = sanInfo.dRateQ;
if (nType == 1 || nType == 0)
{
pt = ptSan;
pt.z = ptFeed.z * 1000;
}
AcDbObjectId Id = NULL;
acdbGetObjectId(Id, ent);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForRead);
if(!pBlkRef)
return;
ptBlk = pBlkRef->position();
pBlkRef->close();
dAngle = GetEntDriection(ptBlk, ptDir);
dAngle += PI / 2;
}
// 加载图块
LoadTkBlock(sBlk);
LoadTkBlock(sSysBlk);
TDbEquipment *pEquip = new TDbEquipment;
pEquip->SetBlock2d(GetBlkIdByName(sBlk));
pEquip->SetDang(dDang);
pEquip->SetSpare(dBigQ);
pEquip->SetLocation(ptSan);
pEquip->SetHidePipe(FALSE);
pEquip->SetAngle(dAngle);
if(_tcsicmp(sSysBlk, _T("twtsys(00000322)")) == 0){
if(g_bBlk3D){
CString csDwb = g_csDwbPath + _T("TwtSys");
XString xsTmp6;
if(LoadDwbBlock(csDwb, _T("00000364"), xsTmp6) != RTNORM)//3d水龙头
return;
pEquip->SetBlock3d(GetBlockIdFromString(xsTmp6));
}
}
else if(_tcsicmp(sSysBlk, _T("twtsys(00000005)")) == 0){
if(g_bBlk3D){
CString csDwb = g_csDwbPath + _T("TwtSys");
XString xsTmp6;
if(LoadDwbBlock(csDwb, _T("00000416"), xsTmp6) != RTNORM)//3d水龙头
return;
pEquip->SetBlock3d(GetBlockIdFromString(xsTmp6));
}
}
else if(_tcsicmp(sSysBlk, _T("twtsys(00000352)")) == 0 || _tcsicmp(sSysBlk, _T("twtsys(00000014)")) == 0){//小便器自闭式冲洗阀
if(g_bBlk3D){
CString csDwb = g_csDwbPath + _T("TwtSys");
XString xsTmp7;
if(LoadDwbBlock(csDwb, _T("00000368"), xsTmp7) != RTNORM)//3d自闭式冲洗阀
return;
pEquip->SetBlock3d(GetBlockIdFromString(xsTmp7));
}
}
else if(g_bBlk3D && _tcsicmp(sSysBlk, _T("twtsys(00000293)")) == 0){ //大便器自闭式冲洗阀
CString csDwb = g_csDwbPath + _T("TwtSys");
XString xsTmp7;
if(LoadDwbBlock(csDwb, _T("00000369"), xsTmp7) != RTNORM)//3d自闭式冲洗阀
return;
pEquip->SetBlock3d(GetBlockIdFromString(xsTmp7));
}
if (_tcsicmp(sBlk, _T("$TWTSYS$00000519")) == 0)// 给水圆比例 zxl 2012.04.16 add
{
pEquip->SetScale(g_nFeedCircleScale);
}
pEquip->SetSysBlock((const TCHAR*)sSysBlk);
pEquip->setLayer(InitLayer(LAY_EQ_FEED));
pEquip->setColor(AcCmColor()); //随层
AddToCurrentSpace(pEquip, Adesk::kTrue);
}
double UnfoldInstallAdjustElevation::GetParentNodeEle( const AcGePoint3d &ptCur )
{
double dEle = 0.0;
LinkNode *pNode = GetLinkNode(ptCur);
if(pNode == NULL)
{
return dEle;
}
AcGePoint3d ptPre = pNode->ptCur;
pNode = pNode->pPreNode;
while(pNode != NULL)
{
if (IsAdjustPointEle(pNode->ptCur))
{
// 不存在端点与ptCur重合且与ptPre共线已变高管线
if (!FindParallelLine(pNode->ptCur, ptPre, dEle))
{
// 获得ptCur点目前已确定的标高值
std::set<double> setEle;
GetPointElevation(ptCur, setEle);
// 取标高最小值
dEle = *setEle.begin();
}
break;
}
ptPre = pNode->ptCur;
pNode = pNode->pPreNode;
}
return dEle;
}