// JoinPipe2Sanitary.cpp: implementation of the CJoinPipe2Sanitary class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include #include #include "JoinPipe2Sanitary.h" #include "SanitaryLinkTypeDlg.h" #include "NewSanitaryDefineDlg.h" extern int GetSanitaryDataSourceType(Entity ent); extern bool GetLocSanitaryData(Entity ent, CSanitaryInfo &data, AcGePoint3d &ptFeed, AcGePoint3d &ptHeatFeed, AcGePoint3d &ptDrain, AcGePoint3d &ptDir); #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif //将上华3洁具转化为 void ConvertSanitary(PickSet &ss) { CString csDwb = g_csDwbPath + _T("TwtSys"); XStringList lstBlk; for(long i=0;isetBlockTableRecord(idRlk); pBlkRef->close(); } } } } //*************************************************************************************************** // 管连洁具 //*************************************************************************************************** BOOL JoinPipe2ExternalSanitary(Entity entMain) { CJoinPipe2Sanitary obj(entMain); TPipeSys::SysType sys; XLine line(1); OPENOBJ_BEGIN(entMain, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ line.StartPoint() = pPipe->StartPoint(); line.EndPoint() = pPipe->EndPoint(); sys = pPipe->GetSysType(); } OPENOBJ_END(); while(1){ ads_name adsent; Acad::ErrorStatus es; ads_point ptResult; ads_matrix xformres; resbuf* refstkres = NULL; AcGeMatrix3d mat; int result = acedNEntSelP(_T("\n外部参照!请继续选择外部参照上洁具图块<退出>: "), adsent, ptResult, 0, xformres, &refstkres); if (refstkres != NULL) ads_relrb(refstkres); if (result == RTNORM) { AcDbObjectId objId; es = acdbGetObjectId(objId, adsent); if (es == Acad::eOk) { Entity ent = adsent; TCHAR szLay[256]; ent.GetData(8, szLay); CString csBlk, csSysBlk; XPoint ptNew, ptIns; double nRadius(-1); double nDang(0.5), nBigQ(0), dEle(0); AcGePoint3d ptLoc; if(!obj.GetSanitaryInBlkInfo(ent, ptLoc, csBlk, csSysBlk, nRadius, nDang, nBigQ, dEle)) continue; ptLoc = ptLoc.transformBy(*(AcGeMatrix3d*)xformres); ptIns = ptLoc; LoadTkBlock(csBlk); LoadTkBlock(csSysBlk); ptIns.Project(&line, ptNew); ptIns.z = ptNew.z; double nAng = ads_angle(ptNew, ptIns); nAng += PI/2; double dDn(20); if(obj.m_iType == 0 || obj.m_iType == 1) obj.DrawFeedEquip(csBlk, csSysBlk, nDang, nBigQ, ptIns, nAng); else if(obj.m_iType == 2) { if(nDang > 4) dDn = 100; else dDn = 50; obj.DrawDirtEquip(csBlk, csSysBlk, nDang, nBigQ, ptIns, nAng, nRadius); } obj.DrawPipe(ptIns, ptNew, dDn); TPipePerDocData *pData = GetCurPipeDocData(); pData->ApplyUpdates(); } } else break; } return TRUE; } // cet 2012.1.12 add 根据设置的洁具方向调整设备角度 extern bool GetSanitaryDriection(Entity ent, double &dSanitaryDriec); double GetEquipmentAdjustAngle(Entity &ent, double dEquipmentAngle, double dDrainAngle = 0.0, bool bDrain = false) { double dAngle = dEquipmentAngle, dTemp = 0.0; if (bDrain) { dAngle = dDrainAngle; } if (GetSanitaryDriection(ent, dTemp)) // 获得定义的洁具角度 { dAngle = dTemp + PI * 0.5; } return dAngle; } bool bSlantLink = false;// 排水是否斜向45度连接 zxl 2013.04.16 add void JoinPipe2Sanitary() { Entity entMain; RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); RBList rbMaskPipe(RTDXF0, _T("ATS_PIPE"), NULL); if(SelectEntity(_T("\n请选择支管<退出>:"), entMain, rbMaskPipe) != RTNORM) return; PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择需要连接管线的洁具<退出>"), ss, rbMask) != RTNORM) return; if(ss.Length() == 1){ Entity ent = ss[0L]; if(IsExternalBlock(ent)){ JoinPipe2ExternalSanitary(entMain); return; } } bool bDirtSys = false; CJoinPipe2Sanitary obj(entMain); XLine line(1); OPENOBJ_BEGIN(entMain, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ line.StartPoint() = pPipe->StartPoint(); line.EndPoint() = pPipe->EndPoint(); if (pPipe->GetSysType() == TPipeSys::kDirtWater || pPipe->GetSysType() == TPipeSys::kUselessWater) { bDirtSys = true; } } OPENOBJ_END(); // 排水斜向45度连接 zxl 2013.04.16 add XPoint ptEnd; if (bDirtSys) { TCHAR szSelChar[10]; CString sNote; if (bSlantLink) { sNote = _T("\n排水管道是否45度斜向连接[Y/N]:"); } else { sNote = _T("\n排水管道是否45度斜向连接[Y/N]:"); } int nStatus = 0; INITGET_BEG(0, _T("Y N ")); nStatus = acedGetString(0, sNote, szSelChar); INITGET_END(); if (nStatus == RTNORM) { if (szSelChar[0] == 'Y' || szSelChar[0] == 'y' || (szSelChar[0] == '\0' && bSlantLink)) { bSlantLink = true; Entity entSel; if(SelectEntity(_T("\n请选择排水端<退出>:"), entSel, ptEnd, rbMaskPipe) != RTNORM) return; if (!(entSel == entMain)) { return; } ptEnd.Project(&line, ptEnd); } else { bSlantLink = false; } } else { return; } } int iLinkType = -1; BOOL bHideLink = FALSE; for(long i=0;i 0.001) { ptIns.z = dEle * 1000;//得到给水点指定标高 } LoadTkBlock(csBlk); LoadTkBlock(csSysBlk); ptIns.Project(&line, ptNew); // 排水需要斜向连接时 zxl 2013.04.16 add if (bDirtSys && bSlantLink) { AcGeVector3d vt = ptEnd - ptNew; vt.normalize(); double dDist = ptIns.Distance2d(ptNew); ptNew = ptNew + vt * dDist; } if(ptIns.z > 0.001) ptNew.z = ptIns.z; else ptIns.z = ptNew.z; double nAng = ads_angle(ptNew, ptIns); nAng += PI/2; double dAngFeed(0); //2010-5-19 sr 把给水接管的角度改为洁具的角度,不知道是否可行,依赖于定义洁具必须正确,污水保持原状(根据接管决定角度) ent.GetData(50, &dAngFeed); if(obj.IsMirrorTgSanitary(ent)) dAngFeed += PI; double dDn(20); if(obj.m_iType == 2) { if(nDang > 4) dDn = 100; else dDn = 50; } if(fabs(ptIns.z - line.StartPoint().z) > 0.001) //有标高差,需要绘制一段立管 { if(iLinkType < 0) { CTemporaryResourceOverride vTemp; CSanitaryLinkTypeDlg dlg; if(dlg.DoModal() != IDOK || dlg.GetLinkType() == -1) { return; } iLinkType = dlg.GetLinkType(); bHideLink = dlg.m_bHide; } if(iLinkType == 0) //水平 { double dFeedEle = ptIns.z; ptIns.z = line.StartPoint().z; ptNew.z = line.StartPoint().z; XPoint ptPipe = ptNew; XPoint ptSan = ptIns; ptPipe.z = 0; ptSan.z = 0; XPoint ptIntWall; BOOL bRet = FALSE; if(bHideLink) bRet= obj.GetHideSetupPoint(ent, ptIns, ptNew, line, ptIntWall); if(bRet && !!ptIntWall)//如果有墙,进行暗装 { double dFeedVPipeRadius = g_nPipeRadius[0] * DocGetPScale(); //给水立管圆半径 AcGeVector3d vt3(ptIntWall - ptSan); vt3.normalize(); vt3 = vt3 * dFeedVPipeRadius; ptIntWall += vt3; ptIntWall.z = ptIns.z; obj.DrawPipe(ptIntWall, ptNew, dDn); XPoint ptIntWall2 = ptIntWall; ptIntWall.z = dFeedEle; ptIns.z = dFeedEle; obj.DrawPipe(ptIntWall, ptIns, dDn); obj.DrawPipe(ptIntWall, ptIntWall2, dDn); } else //没找到墙,直接连管 { obj.DrawPipe(ptIns, ptNew, dDn); XPoint p1,p2; p1 = ptIns; p2 = ptIns; p2.z = dFeedEle; obj.DrawPipe(p1, p2, dDn); } ptIns.z = dFeedEle; } else if(iLinkType == 1) //垂直 { obj.DrawPipe(ptIns, ptNew, dDn); XPoint p1,p2; p1 = ptNew; p2 = ptNew; p2.z = line.StartPoint().z; obj.DrawPipe(p1, p2, dDn); } } else obj.DrawPipe(ptIns, ptNew, dDn); double dTemp = dAngFeed; // cet 2012.2.1 add // cet 2012.1.12 add 调整由于洁具重新定义方向导致的设置角度变化 dAngFeed = GetEquipmentAdjustAngle(ent, dAngFeed); // cet 2012.2.1 add 排水需特殊处理 if (obj.IsMirrorTgSanitary(ent)) { dTemp -= PI * 0.5; } nAng = GetEquipmentAdjustAngle(ent, dTemp, nAng, true); if(obj.m_iType == 0 || obj.m_iType == 1) obj.DrawFeedEquip(csBlk, csSysBlk, nDang, nBigQ, ptIns, dAngFeed); else if(obj.m_iType == 2) obj.DrawDirtEquip(csBlk, csSysBlk, nDang, nBigQ, ptIns, nAng, nRadius); } } // //if(fabs(ptIns.z - ptNew.z) > 0.001) //有标高差,需要绘制一段立管 //{ // TDbPipe *pNewPipe2 = new TDbPipe; // pNewPipe2 = (TDbPipe*)pPipe->clone(); // XPoint p1,p2; // p1 = ptNew; // p2 = ptNew; // p2.z = ptIns.z; // pNewPipe2->SetStartPoint(p1); // pNewPipe2->SetEndPoint(p2); // if(dDn > 1) // pNewPipe2->SetDnDiameter(dDn); // AcDbObjectId idNew2 = AddToCurrentSpace(pNewPipe2, Adesk::kTrue); // //} // ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CJoinPipe2Sanitary::CJoinPipe2Sanitary(Entity ent) { m_entPipe = ent; OPENOBJ_BEGIN(m_entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ if(pPipe->GetSysType() == TPipeSys::kFeedWater || pPipe->GetSysType() == TPipeSys::kUsedWater || pPipe->GetSysType() == TPipeSys::kFeedWater2 || pPipe->GetSysType() == TPipeSys::kFeedWater3 // cet 2011.12.6 add 给水中高区 || pPipe->GetSysType() == TPipeSys::kUsedWater2 || pPipe->GetSysType() == TPipeSys::kUsedWater3 // cet 2011.12.6 add 中水中高区 ) //给水 m_iType = 0; else if(pPipe->GetSysType() == TPipeSys::kHeatFeedWater || pPipe->GetSysType() == TPipeSys::kHeatFeedWater2 // cet 2011.12.6 add 热给水中区 || pPipe->GetSysType() == TPipeSys::kHeatFeedWater3) // cet 2011.12.6 add 热给水高区 m_iType = 1; else if(pPipe->GetSysType() == TPipeSys::kDirtWater || pPipe->GetSysType() == TPipeSys::kUselessWater || pPipe->GetSysType() == TPipeSys::kHeatBackWater || pPipe->GetSysType() == TPipeSys::kHeatBackWater2 // cet 2011.12.6 add 热回水中区 || pPipe->GetSysType() == TPipeSys::kHeatBackWater3) // cet 2011.12.6 add 热回水高区 m_iType = 2; } OPENOBJ_END(); } CJoinPipe2Sanitary::~CJoinPipe2Sanitary() { } // cet 2010.6.30 add 根据立管图层获取相应管线图层 bool GetPipeLayer(const CString &strVPipeLayer, CString &strPipeLayer) { if (strVPipeLayer.Compare(LAY_VPIPE_FEED) == 0) // 给水立管 { strPipeLayer = LAY_PIPE_FEED; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_FEED2) == 0) // 给水立管2 { strPipeLayer = LAY_PIPE_FEED2; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_FEED3) == 0) // 给水立管3 { strPipeLayer = LAY_PIPE_FEED3; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_HEADFEED) == 0) // 热给水立管 { strPipeLayer = LAY_PIPE_HEADFEED; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_HEADFEED2) == 0) // 热给水立管2 { strPipeLayer = LAY_PIPE_HEADFEED2; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_HEADFEED3) == 0) // 热给水立管3 { strPipeLayer = LAY_PIPE_HEADFEED3; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_HEADBACK) == 0) // 热回给水立管 { strPipeLayer = LAY_PIPE_HEADBACK; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_HEADBACK2) == 0) // 热回给水立管2 { strPipeLayer = LAY_PIPE_HEADBACK2; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_HEADBACK3) == 0) // 热回给水立管3 { strPipeLayer = LAY_PIPE_HEADBACK3; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_DIRT) == 0) // 污水立管 { strPipeLayer = LAY_PIPE_DIRT; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_USELESS) == 0) // 废水立管 { strPipeLayer = LAY_PIPE_USELESS; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_RAIN) == 0) // 雨水立管 { strPipeLayer = LAY_PIPE_RAIN; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_USED) == 0) // 中水立管 { strPipeLayer = LAY_PIPE_USED; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_USED2) == 0) // 中水立管2 { strPipeLayer = LAY_PIPE_USED2; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_USED3) == 0) // 中水立管3 { strPipeLayer = LAY_PIPE_USED3; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_FIRE) == 0) // 消防立管 { strPipeLayer = LAY_PIPE_FIRE; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_FIRE2) == 0) // 消防立管2 { strPipeLayer = LAY_PIPE_FIRE2; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_FIRE3) == 0) // 消防立管3 { strPipeLayer = LAY_PIPE_FIRE3; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_SPRINKLE) == 0) // 喷淋立管 { strPipeLayer = LAY_PIPE_SPRINKLE; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_SPRINKLE2) == 0) // 喷淋立管2 { strPipeLayer = LAY_PIPE_SPRINKLE2; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_SPRINKLE3) == 0) // 喷淋立管3 { strPipeLayer = LAY_PIPE_SPRINKLE3; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_COAGULATE) == 0) // 凝结水立管 { strPipeLayer = LAY_PIPE_COAGULATE; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_DRINK) == 0) // 直饮水立管 { strPipeLayer = LAY_PIPE_DRINK; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_PRESSDIRT) == 0) // 压力污水立管 { strPipeLayer = LAY_PIPE_PRESSDIRT; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_PRESSUSELESS) == 0) // 压力废水立管 { strPipeLayer = LAY_PIPE_PRESSUSELESS; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_PRESSRAIN) == 0) // 压力雨水立管 { strPipeLayer = LAY_PIPE_PRESSRAIN; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_USER1) == 0) // 市政给 { strPipeLayer = LAY_PIPE_USER1; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_USER2) == 0) // 循环给 { strPipeLayer = LAY_PIPE_USER2; return true; } else if (strVPipeLayer.Compare(LAY_VPIPE_OTHER) == 0) // 其它管 { strPipeLayer = LAY_PIPE_OTHER; return true; } return false; } void CJoinPipe2Sanitary::DrawPipe(XPoint ptIns, XPoint ptNew, double dDn) { if(ptIns == ptNew) //2011-6-21 sr add 管线穿过洁具的时候,会生成无意义的立管 return; OPENOBJ_BEGIN(m_entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ TDbPipe *pNewPipe = new TDbPipe; pNewPipe = (TDbPipe*)pPipe->clone(); pNewPipe->ResetAllShip(); //sr 2010-9-8 新创建的管线前后节点信息清空 // ptIns.z = ptNew.z; pNewPipe->SetStartPoint(ptIns); pNewPipe->SetEndPoint(ptNew); // cet 2010.6.30 add 修改管线图层 CString strVPipeLayer; TCHAR* szLay = pNewPipe->layer(); strVPipeLayer = szLay; delete [] szLay; // cet 2012.5.16 设置立管数据 if (pNewPipe->IsVertical()) { int nPipeIdx = GetPipeLayerIdxByName(strVPipeLayer); pNewPipe->SetRadius(g_nPipeRadius[nPipeIdx]); if(g_bPipeDouble[nPipeIdx]) //pPipe->SetRadiusIn(g_nPipeRadius[nPipeIdx] / 2); // zxl 2012.08.13 modify pNewPipe->SetRadiusIn(g_nPipeRadius[nPipeIdx] / 2); else { if(!g_bStandPipeArc)//传统扣弯 //pPipe->SetRadiusIn(-2); // zxl 2012.08.13 modify pNewPipe->SetRadiusIn(-2); } } CString strPipeLayer; if (GetPipeLayer(strVPipeLayer, strPipeLayer)) { pNewPipe->setLayer(InitLayer(strPipeLayer)); } if(dDn > 1) pNewPipe->SetDnDiameter(dDn); AcDbObjectId idNew = AddToCurrentSpace(pNewPipe, Adesk::kTrue); } OPENOBJ_END(); } void CJoinPipe2Sanitary::DrawDirtEquip(CString csBlk, CString csSysBlk, double nDang, double nBigQ, XPoint ptIns, double nAng, double nRadius) { TDbEquipment *pEquip = new TDbEquipment; pEquip->SetBlock2d(GetBlkIdByName(csBlk)); pEquip->SetLocation(ptIns); pEquip->SetDang(nDang); pEquip->SetSpare(nBigQ); pEquip->SetHidePipe(TRUE); pEquip->SetAngle(nAng); if(nRadius < 0) pEquip->SetScale(g_nDrainPtRadius); else pEquip->SetScale(nRadius); pEquip->SetSysBlock((const TCHAR*)csSysBlk); if(g_bBlk3D && (_tcsicmp(csSysBlk, _T("TWTSYS(00000101)")) == 0 || _tcsicmp(csSysBlk, _T("TWTSYS(00000102)")) == 0 || _tcsicmp(csSysBlk, _T("TWTSYS(00000103)")) == 0)){ CString csDwb = g_csDwbPath + _T("TwtSys"); XString xsTmp6; if(_tcsicmp(csSysBlk, _T("TWTSYS(00000103)")) == 0){ if(LoadDwbBlock(csDwb, _T("00000363"), xsTmp6) != RTNORM)//3dP存水弯 return; } else{ if(LoadDwbBlock(csDwb, _T("00000362"), xsTmp6) != RTNORM)//3dS存水弯 return; } pEquip->SetBlock3d(GetBlockIdFromString(xsTmp6)); } pEquip->SetNumber(_T("CIRCLE-1")); pEquip->setLayer(InitLayer(LAY_EQ_DIRT)); pEquip->setColor(AcCmColor()); //随层 AddToCurrentSpace(pEquip, Adesk::kTrue); } void CJoinPipe2Sanitary::DrawFeedEquip(CString csBlk, CString csSysBlk, double nDang, double nBigQ, XPoint ptIns, double nAng) { TDbEquipment *pEquip = new TDbEquipment; pEquip->SetBlock2d(GetBlkIdByName(csBlk)); pEquip->SetDang(nDang); pEquip->SetSpare(nBigQ); pEquip->SetLocation(ptIns); pEquip->SetHidePipe(FALSE); pEquip->SetAngle(nAng); if(_tcsicmp(csSysBlk, _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(csSysBlk, _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(csSysBlk, _T("twtsys(00000352)")) == 0 || _tcsicmp(csSysBlk, _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(csSysBlk, _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(csBlk, _T("$TWTSYS$00000519")) == 0)// 给水圆比例 zxl 2012.04.16 add { pEquip->SetScale(g_nFeedCircleScale); } pEquip->SetSysBlock((const TCHAR*)csSysBlk); pEquip->setLayer(InitLayer(LAY_EQ_FEED)); pEquip->setColor(AcCmColor()); //随层 AddToCurrentSpace(pEquip, Adesk::kTrue); } BOOL CJoinPipe2Sanitary::IsMirrorTgSanitary(Entity ent) { double xscale, yscale; ent.GetData(41, &xscale); ent.GetData(42, &yscale); BOOL bMirror = FALSE; if(ent.Is(_T("AEC_BLOCK_INSERT"))) { if(yscale < 0) bMirror = TRUE; } return bMirror; } //2010-3-30 支持洁具镜像后,冷热水颠倒 BOOL CJoinPipe2Sanitary::GetSanitaryInfo(Entity ent, XPoint &ptRet, CString &csBlk, CString &csSysBlk, double &nRadius, double &nDang, double &nBigQ, double &dEle) { double xscale, yscale; ent.GetData(41, &xscale); ent.GetData(42, &yscale); BOOL bMirror = FALSE; BOOL bMirror2 = FALSE; if(ent.Is(_T("INSERT"))) { if(xscale < 0) bMirror = TRUE; } else if(ent.Is(_T("AEC_BLOCK_INSERT"))) { if(yscale < 0) bMirror = TRUE; } CString csApp; if(m_iType == 0) csApp = _T("SANITARYFEED"); else if(m_iType == 1) csApp = _T("SANITARYHEADFEED"); else if(m_iType == 2) csApp = _T("SANITARYDRAIN"); BOOL ret = FALSE; int nDataSourceInfo = GetSanitaryDataSourceType(ent); if(csApp != _T("SANITARYDRAIN"))// 如果是镜像的,冷热水颠倒 { XPoint ptCold, ptHeat, ptDrain, ptDir; CString csBlkCold, csBlkHeat, csSysBlkCold, csSysBlkHeat; double dRadiusCold(0), dRadiusHeat(0), dDangCold(0), dDangHeat(0), dBigQCold(0), dBigQHeat(0), dEleCold(0), dEleHeat(0); BOOL ret1 = FALSE, ret2 = FALSE; if (nDataSourceInfo == 0 || nDataSourceInfo == 1) { ret1 = GetSanitaryInfo(ent, _T("SANITARYHEADFEED"), ptHeat, csBlkHeat, csSysBlkHeat, dRadiusHeat, dDangHeat, dBigQHeat, dEleHeat); ret2 = GetSanitaryInfo(ent, _T("SANITARYFEED"), ptCold, csBlkCold, csSysBlkCold, dRadiusCold, dDangCold, dBigQCold, dEleCold); } else { CSanitaryInfo info; GetLocSanitaryData(ent, info, ptCold, ptHeat, ptDrain, ptDir); if (!!ptCold) { ret1 = TRUE; csBlkCold = info.sFeedSys; csSysBlkCold = info.sSysBlk1; dDangCold = info.dDang; dBigQCold = info.dRateQ; dEleCold = ptCold.z; } if (!!ptHeat) { ret2 = TRUE; csBlkHeat = info.sFeedSys; csSysBlkHeat = info.sSysBlk1; dDangHeat = info.dDang; dBigQHeat = info.dRateQ; dEleHeat = ptHeat.z; } } if(dDangCold < 0) { dDangCold = fabs(dDangCold); bMirror2 = TRUE; } if((bMirror && !bMirror2) || (!bMirror && bMirror2)) bMirror = TRUE; else bMirror = FALSE; if(m_iType == 0) //冷水 { if(ret1 == TRUE && ret2 == TRUE && bMirror)//有冷有热,给水点换成热水点 { ptRet = ptHeat; csBlk = csBlkCold; csSysBlk = csSysBlkCold; nRadius = dRadiusCold; nDang = dDangCold; nBigQ = dBigQCold; dEle = dEleCold; } else //有冷无热,给水点保持不变 { ptRet = ptCold; csBlk = csBlkCold; csSysBlk = csSysBlkCold; nRadius = dRadiusCold; nDang = dDangCold; nBigQ = dBigQCold; dEle = dEleCold; } } else if(m_iType == 1)//热水 { if(ret1 == TRUE && ret2 == TRUE && bMirror)//有冷有热,给水点换成热水点 { ptRet = ptCold; csBlk = csBlkHeat; csSysBlk = csSysBlkHeat; nRadius = dRadiusHeat; nDang = dDangHeat; nBigQ = dBigQHeat; dEle = dEleHeat; } else//有热无冷,热水点保持不变 { ptRet = ptHeat; csBlk = csBlkHeat; csSysBlk = csSysBlkHeat; nRadius = dRadiusHeat; nDang = dDangHeat; nBigQ = dBigQHeat; dEle = dEleHeat; } } } else { if (nDataSourceInfo == 1 || nDataSourceInfo == 0) { ret = GetSanitaryInfo(ent, csApp, ptRet, csBlk, csSysBlk, nRadius, nDang, nBigQ, dEle); } else { CSanitaryInfo data; XPoint ptFeed, ptHeat, ptDir; ret = GetLocSanitaryData(ent, data, ptFeed, ptHeat, ptRet, ptDir); CString csDwb = g_csDwbPath + _T("TwtSys"); XString xsTmp; LoadDwbBlock(csDwb, _T("00000147"), xsTmp);//排水点 csBlk = (const TCHAR*)xsTmp; csSysBlk = data.sSysBlk2; nDang = data.dNg; nBigQ = data.dBigQ; dEle = ptRet.z; } } ptRet.z = 0; //防止图块本身有标高,强制接管点标高为0 if(m_iType == 2) { dEle = 0; //排水管强制标高为0 } return ret; } BOOL CJoinPipe2Sanitary::GetSanitaryInfo(Entity ent, CString csApp, XPoint &ptRet, CString &csBlk, CString &csSysBlk, double &nRadius, double &nDang, double &nBigQ, double &dEle) { double xscale; ent.GetData(41, &xscale); xscale = fabs(xscale); BOOL bRet(FALSE); AcDbObjectId Id = NULL; acdbGetObjectId(Id, ent); AcDbBlockReference *pBlkRef = NULL; acdbOpenObject(pBlkRef, Id, AcDb::kForRead); if(!pBlkRef) return FALSE; AcGeMatrix3d matrix = pBlkRef->blockTransform(); pBlkRef->close(); TCHAR szBlkName[256]; ent.GetData(2, szBlkName); AcDbBlockTableRecord *pRecord = NULL; AcDbBlockTable* pBlockTable = NULL; acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead); if(!pBlockTable) return FALSE; if(Acad::eOk != pBlockTable->getAt(szBlkName, pRecord, AcDb::kForRead)){ pBlockTable->close(); return FALSE; } pBlockTable->close(); if(!pRecord) return FALSE; AcDbBlockTableRecordIterator *pIterator; pRecord->newIterator(pIterator); pRecord->close(); if(!pIterator) return FALSE; for(pIterator->start(); !pIterator->done(); pIterator->step()){ AcDbEntity *pEnt = NULL; pIterator->getEntity(pEnt, AcDb::kForRead); if(pEnt){ AcDbPoint *pll = NULL; AcDbCircle *pCir = NULL; if(pCir = AcDbCircle::cast(pEnt)){ if(m_iType == 2){ resbuf *pRb = pEnt->xData(csApp); if(pRb) { resbuf *pNext = pRb->rbnext; if(pNext && pNext->restype == 1000) { csBlk = pNext->resval.rstring; pNext = pNext->rbnext; if(pNext && pNext->restype == 1000) { csSysBlk = pNext->resval.rstring; pNext = pNext->rbnext; } if(pNext && pNext->restype == 1040) { nDang = pNext->resval.rreal; pNext = pNext->rbnext; } if(pNext && pNext->restype == 1040) { nBigQ = pNext->resval.rreal; } } ads_relrb(pRb); AcGePoint3d ptIns = pCir->center(); nRadius = pCir->radius()*xscale; ptIns = ptIns.transformBy(matrix); ptRet = ptIns; bRet = TRUE; pEnt->close(); break; } } } else if(pll = AcDbPoint::cast(pEnt)){ resbuf *pRb = pEnt->xData(csApp); if(pRb) { resbuf *pNext = pRb->rbnext; if(pNext && pNext->restype == 1000) { csBlk = pNext->resval.rstring; pNext = pNext->rbnext; if(pNext && pNext->restype == 1000) { csSysBlk = pNext->resval.rstring; pNext = pNext->rbnext; } if(pNext && pNext->restype == 1040) { nDang = pNext->resval.rreal; pNext = pNext->rbnext; } if(pNext && pNext->restype == 1040) { nBigQ = pNext->resval.rreal; pNext = pNext->rbnext; } if(pNext && pNext->restype == 1040) {//sr 2010-7-9 把标高从z改为扩展数据 dEle = pNext->resval.rreal; } } ads_relrb(pRb); AcGePoint3d ptIns = pll->position(); ptIns = ptIns.transformBy(matrix); ptRet = ptIns; bRet = TRUE; pEnt->close(); break; } } pEnt->close(); } } delete pIterator; return bRet; } BOOL CJoinPipe2Sanitary::GetSanitaryInBlkInfo(Entity ent, AcGePoint3d &ptRet, CString &csBlk, CString &csSysBlk, double &nRadius, double &nDang, double &nBigQ, double &dEle) { BOOL bRet = FALSE; CString csApp; if(m_iType == 0) csApp = _T("SANITARYFEED"); else if(m_iType == 1) csApp = _T("SANITARYHEADFEED"); else if(m_iType == 2) csApp = _T("SANITARYDRAIN"); ///////////////////////////////////////////////////////////////////////////////////////// OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); if(pEnt){ CString csN = pEnt->isA()->name(); AcDbObjectId id = pEnt->ownerId(); OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord){ const TCHAR *szBlkName = NULL; pRecord->getName(szBlkName); CString csBlkName = szBlkName; AcDbBlockTableRecordIterator *pIterator; pRecord->newIterator(pIterator); pRecord->close(); if(!pIterator) return FALSE; for(pIterator->start(); !pIterator->done(); pIterator->step()){ AcDbEntity *pEnt = NULL; pIterator->getEntity(pEnt, AcDb::kForRead); if(pEnt){ AcDbPoint *pll = NULL; AcDbCircle *pCir = NULL; if(pCir = AcDbCircle::cast(pEnt)){ if(m_iType == 2){ resbuf *pRb = pEnt->xData(csApp); if(pRb) { resbuf *pNext = pRb->rbnext; if(pNext && pNext->restype == 1000) { csBlk = pNext->resval.rstring; pNext = pNext->rbnext; if(pNext && pNext->restype == 1000) { csSysBlk = pNext->resval.rstring; pNext = pNext->rbnext; } if(pNext && pNext->restype == 1040) { nDang = pNext->resval.rreal; pNext = pNext->rbnext; } if(pNext && pNext->restype == 1040) { nBigQ = pNext->resval.rreal; pNext = pNext->rbnext; } if(pNext && pNext->restype == 1040) { dEle = pNext->resval.rreal; } } ads_relrb(pRb); AcGePoint3d ptIns = pCir->center(); nRadius = pCir->radius(); ptRet = ptIns; pEnt->close(); bRet = TRUE; break; } } } else if(pll = AcDbPoint::cast(pEnt)){ resbuf *pRb = pEnt->xData(csApp); if(pRb) { resbuf *pNext = pRb->rbnext; if(pNext && pNext->restype == 1000) { csBlk = pNext->resval.rstring; pNext = pNext->rbnext; if(pNext && pNext->restype == 1000) { csSysBlk = pNext->resval.rstring; pNext = pNext->rbnext; } if(pNext && pNext->restype == 1040) { nDang = pNext->resval.rreal; pNext = pNext->rbnext; } if(pNext && pNext->restype == 1040) { nBigQ = pNext->resval.rreal; } } ads_relrb(pRb); AcGePoint3d ptIns = pll->position(); ptRet = ptIns; pEnt->close(); bRet = TRUE; break; } } pEnt->close(); } } delete pIterator; } OPENOBJ_END(); } OPENOBJ_END(); return bRet; } //得到安装立管位置点 BOOL CJoinPipe2Sanitary::GetHideSetupPoint(Entity entSan, XPoint ptIns, XPoint ptNew, XLine &pipeLine, XPoint &ptIntWall) { BOOL bRet = TRUE; double dFeedEle = ptIns.z; ptIns.z = pipeLine.StartPoint().z; ptNew.z = pipeLine.StartPoint().z; //先判断是否经过墙,如果有,是否进行暗装 XPoint ptPipe = ptNew; XPoint ptSan = ptIns; ptPipe.z = 0; ptSan.z = 0; XLine line(ptIns, ptNew, 0); line.SetElevation(0.0); PickSet ssWall(SS_FREE); RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), // -4, _T(""), // -4, _T(""), -4, _T("or>"), NULL); struct resbuf *list = ads_buildlist( RTPOINT, &ptIns, RTPOINT, &ptNew, NULL); ssWall.Get(_T("F"), list, NULL, rbMask); ads_relrb(list); long len = ssWall.Length(); AcGeVector3d vt1(ptIns - ptNew); if(len > 0) { XCurveSegment CurveTmp; double dDistShort(-1); for(long j=0;jGetSideCurve(lCurve, rCurve); } OPENOBJ_END(); if(!lCurve.Is(CURVE_LINE)) continue; AcGeVector3d vt2(lCurve.GetStartPoint() - lCurve.GetEndPoint()); double dDotProduct = vt1.dotProduct(vt2); //判断是否垂直 if(fabs(dDotProduct) > 1.0E-6) continue; int ret1 = lCurve.Intersection(line, ptInt1, ptInt2); int ret2 = rCurve.Intersection(line, ptInt3, ptInt4); if(ret1 == 1 && ret2 == 1) { double dDist1 = ads_distance(ptInt1, ptSan); double dDist2 = ads_distance(ptInt3, ptSan); if((dDistShort > dDist1 && dDistShort > dDist2) || dDistShort < 0) { if(dDist1 < dDist2) { CurveTmp = lCurve; dDistShort = dDist1; ptIntWall = ptInt1; } else { CurveTmp = rCurve; dDistShort = dDist2; ptIntWall = ptInt3; } } } } } else { bRet = FALSE; XPoint ptSanIns; entSan.GetData(10, ptSanIns); PickSet ss2(SS_FREE); GetPointPickSet(Wcs2Ucs(ptSanIns), ss2, rbMask, 2); if(ss2.Length() == 1) { Entity entWall = ss2[0L]; if(entWall.Is(_T("ATS_WALL"))) { XCurveSegment lCurve, rCurve; XPoint ptInt1, ptInt2, ptInt3, ptInt4; OPENOBJ_BEGIN(entWall, AcDb::kForRead, TDbWall, pWall); if(pWall) { pWall->GetSideCurve(lCurve, rCurve); } OPENOBJ_END(); if(lCurve.Is(CURVE_LINE)) { AcGeVector3d vt2(lCurve.GetStartPoint() - lCurve.GetEndPoint()); double dDotProduct = vt1.dotProduct(vt2); //判断是否垂直 if(fabs(dDotProduct) < 1.0E-6) { int ret1 = lCurve.Intersection(line, ptInt1, ptInt2); int ret2 = rCurve.Intersection(line, ptInt3, ptInt4); if(ret1 == 1 && ret2 == 1) { double dDist1 = ads_distance(ptInt1, ptSan); double dDist2 = ads_distance(ptInt3, ptSan); if(dDist1 < dDist2) { ptIntWall = ptInt1; } else { ptIntWall = ptInt3; } bRet = TRUE; } } } } } } return bRet; }