1283 lines
35 KiB
C++
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;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|