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

1283 lines
35 KiB
C++

// JoinPipe2Sanitary.cpp: implementation of the CJoinPipe2Sanitary class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <DbEquipment.h>
#include <PipeWireMonitor.h>
#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;i<ss.Length();i++){
XString xsTmp;
Entity ent = ss[i];
TCHAR szBlkName[256];
ent.GetData(2, szBlkName);
if(lstBlk.Index(szBlkName) < 0)
lstBlk.Append(tstrnew(szBlkName));
if(_tcsicmp(szBlkName, _T("_LV5")) == 0){
if(LoadDwbBlock(csDwb, _T("00000235"), xsTmp) != RTNORM)//坐便器
return;
}
else if(_tcsicmp(szBlkName, _T("_LV6")) == 0){
if(LoadDwbBlock(csDwb, _T("00000236"), xsTmp) != RTNORM)//蹲便器
return;
}
else if(_tcsicmp(szBlkName, _T("_LV1")) == 0){
if(LoadDwbBlock(csDwb, _T("00000284"), xsTmp) != RTNORM)//洗脸盆
return;
}
else if(_tcsicmp(szBlkName, _T("_LV2")) == 0){
if(LoadDwbBlock(csDwb, _T("00000285"), xsTmp) != RTNORM)//洗脸盆
return;
}
else if(_tcsicmp(szBlkName, _T("_LV19")) == 0){
if(LoadDwbBlock(csDwb, _T("00000239"), xsTmp) != RTNORM)//浴盆
return;
}
else if(_tcsicmp(szBlkName, _T("_LV7")) == 0){
if(LoadDwbBlock(csDwb, _T("00000244"), xsTmp) != RTNORM)//小便器
return;
}
else if(_tcsicmp(szBlkName, _T("_LV8")) == 0){
if(LoadDwbBlock(csDwb, _T("00000241"), xsTmp) != RTNORM)//小便器
return;
}
if(_tcsicmp(xsTmp, _T("")) != 0){
AcDbObjectId idRlk = GetBlkIdByName((const TCHAR*)xsTmp);
AcDbObjectId Id = NULL;
acdbGetObjectId(Id, ent);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForWrite);
if(pBlkRef != NULL){
pBlkRef->setBlockTableRecord(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("<or"),
-4, _T("<and"), RTDXF0, _T("INSERT"), 8, _T("*"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("AEC_BLOCK_INSERT"), 8, LAY_SANIWARE, -4, _T("and>"),
-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]<Y>:");
}
else
{
sNote = _T("\n排水管道是否45度斜向连接[Y/N]<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<ss.Length();i++){
CString csBlk, csSysBlk;
Entity ent = ss[i];
XPoint ptNew, ptIns;
ptIns.z = 0;
double nRadius(-1);
double nDang(0.5), nBigQ(0), dEle(0);
obj.GetSanitaryInfo(ent, ptIns, csBlk, csSysBlk, nRadius, nDang, nBigQ, dEle);
if(!ptIns)
continue;
if(dEle > 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("<or"),
-4, _T("<and"), RTDXF0, _T("ATS_WALL"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("LINE"), 8, LAY_WALL, -4, _T("and>"),
// -4, _T("<and"), RTDXF0, _T("ARC"), 8, LAY_WALL, -4, _T("and>"),
// -4, _T("<and"), RTDXF0, _T("INSERT"), 8, _T("*"), -4, _T("and>"),
-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;j<len;j++)
{
Entity entWall = ssWall[j];
if(!entWall.Is(_T("ATS_WALL")))
continue;
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))
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;
}