#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 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 vecNode) { AcGePoint3d ptCur, ptPre, ptSan; // 当前节点和子节点 AcGePoint3d ptS, ptE; // 产生的直线的起始点 double dSanEle = 0.0, dPipeEle = 0.0; // 洁具点标高,洁具支管标高 int nType; // 点类型 LinkNode *pNode = NULL; std::set setEle; // 点的标高值 std::vector::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 &mapSan ) { m_mapSanPt = mapSan; } void UnfoldInstallAdjustElevation::SetPipeSysType( TPipeSys::SysType sys ) { m_sysPipeType = sys; } void UnfoldInstallAdjustElevation::SanitarySort(std::vector &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 &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::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::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 &setEle ) { std::vector::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 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::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::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::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 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 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::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::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::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 setEle; GetPointElevation(ptCur, setEle); // 取标高最小值 dEle = *setEle.begin(); } break; } ptPre = pNode->ptCur; pNode = pNode->pPreNode; } return dEle; }