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

2643 lines
73 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "GeCurveInline.h"
#include "AcDbObjectPtr.h"
#include "ElevationCalc.h"
#include "PickEntSet.h"
#include "EdJigEx.h"
#include "DbWell.h"
#include "rxregsvc.h"
#include "DbVerticalSection.h"
#include "DbWellDim.h"
#include "DbPool.h"
#include "dbxutil.h"
#include "xtext.h"
#include "TBlockEdJig.h"
#include "SelectBlkDlg.h"
#include "TWellJig.h"
#include "SetDataSourceDlg.h"
#include "CollectElevation.h"
#include "layerdef.h"
extern CString GetLayerNames(const TCHAR * szTgSubName);
extern AcDbObjectId InitLayer(const TCHAR *szLayer, BOOL bApplyChange = TRUE);
extern AcDbObjectId InitTextStyle(TTextStyle ts, AcDbDatabase *pDb = NULL);
extern AcDbObjectId InitTextStyle(const TCHAR *pszStyle, AcDbDatabase *pDb);
extern AcDbObjectId InitBlock(const TCHAR *pszBlock, AcDbDatabase *pDb = NULL);
// 双击汇流面积 zxl 2013.12.25 add
int EditConflunceArea(AcDbObjectId id)
{
//TDbConfluenceArea *pArea = NULL;
//acdbOpenObject(pArea, id, AcDb::kForRead);
//if (pArea == NULL)
//{
// return 0;
//}
//AecObjectEditMethod pMethod = NULL;
//pMethod = pArea->GetEditMethodPoint();
//pArea->Close();
//if (pMethod != NULL)
//{
// Acad::ErrorStatus es = acdbOpenObject(pArea, id, AcDb::kForWrite);
// pArea->Close();
// pMethod(id);
//}
return 1;
}
extern void GrdrawRect(XRectAngle &rect);
class TPolyEdJig2 : public TSymbEdJig {
public:
enum TPolyOper { kNone = 0, kLinePoint = 1, kArcPoint = 2, kArcMidPoint = 3, kArcRadius = 4 };
protected:
TPolyOper m_nOperCode;
// I/O
AcDbPolyline *m_pDrawEnt;
public:
TPolyEdJig2(AcDbPolyline *);
virtual int DoIt(int *pKeyIndex = NULL);
DragStatus GetPoint(XPoint &pt);
protected:
virtual Adesk::Boolean update();
virtual AcDbEntity* entity() const;
public:
void SetOperCode(TPolyEdJig2::TPolyOper opCode) {
m_nOperCode = opCode;
}
TPolyOper GetOperCode() {
return m_nOperCode;
}
};
TPolyEdJig2::TPolyEdJig2(AcDbPolyline *pElev)
{
m_pDrawEnt = pElev;
}
AcEdJig::DragStatus
TPolyEdJig2::GetPoint(XPoint &pt)
{
AcGePoint3d ptBase;
m_pDrawEnt->getPointAt(m_pDrawEnt->numVerts() - 1, ptBase);
//if(m_nOperCode!=kArcMidPoint m_nOperCode!=kArcRadius)
// return acquirePoint(pt);
return acquirePoint(pt, ptBase);
}
// 开始执行拖动
int TPolyEdJig2::DoIt(int *keyIndex)
{
XPoly2D poly2d;
GlobalFunc::PolyConvert(*m_pDrawEnt, poly2d);
if (m_nOperCode == kLinePoint || m_nOperCode == kArcPoint) {
m_ptResult = *poly2d.Tail();
}
else if (m_nOperCode == kArcMidPoint) { // MidPoint
XCurveSegment cv;
poly2d.Nth(poly2d.TotalSegments() - 1, cv);
m_ptResult = cv.MidPoint();
}
int nRet = TSymbEdJig::DoIt(keyIndex);
return nRet;
}
// 更新实体数据
Adesk::Boolean TPolyEdJig2::update()
{
Adesk::Boolean bRet = Adesk::kTrue;
XPoly2D poly2d;
GlobalFunc::PolyConvert(*m_pDrawEnt, poly2d);
if (m_nOperCode == kLinePoint || m_nOperCode == kArcPoint) {
//*poly2d.Tail()=m_ptResult;
}
else if (m_nOperCode == kArcMidPoint) {
XDirectionCurve cv;
poly2d.Nth(poly2d.TotalSegments() - 1, cv);
XCurveSegment seg;
seg = XArc(cv.StartPoint(), m_ptResult, cv.EndPoint());
if (!!seg) {
if (seg.StartPoint().Distance(cv.StartPoint()) > g_DimOption::instance()._distSnap)
seg.SetBulge(-seg.GetBulge());// 2011-8-9 bsl TELEC8.2之后反向绘制弧线变成直线:seg.SetBulge(seg.GetBulge()-seg.GetBulge());
// *poly2d.bulges[poly2d.Length()-2]=seg.GetBulge();
poly2d.SetBulge(poly2d.Length() - 2, seg.GetBulge());
}
}
else if (m_nOperCode == kArcRadius) {
XPoint ptBase, ptPrev;
int numVert = m_pDrawEnt->numVerts();
m_pDrawEnt->getPointAt(numVert - 1, (AcGePoint3d &)ptBase);
m_pDrawEnt->getPointAt(numVert - 2, (AcGePoint3d &)ptPrev);
double nChordLen = ptBase.Distance2d(ptPrev);
double nRadius = ptBase.Distance2d(m_ptResult);
if (nChordLen < 2.0 * nRadius + 1.0E-6) {
double bulge = 2.0 * asin(nChordLen / 2.0 / nRadius);
if (XLine(ptPrev, ptBase).OnWhichSide(m_ptResult) == OFFSET_LEFT)
bulge = -bulge;
//*poly2d.bulges[poly2d.Length()-2]=bulge;
poly2d.SetBulge(poly2d.Length() - 2, bulge);
}
}
GlobalFunc::PolyConvert(poly2d, *m_pDrawEnt);
return bRet;
}
AcDbEntity* TPolyEdJig2::entity() const
{
return (AcDbEntity *)m_pDrawEnt;
}
int DragInputPoly2d(XPoint ptStart, XPoly2D &poly2dRet)
{
AcDbPolyline pline;
pline.addVertexAt(0, ptStart);
TPolyEdJig2 jig(&pline);
jig.SetPrompt(_T("\n直段下一点 [弧段(A)/回退(U)} <结束>: "));
jig.SetOperCode(TPolyEdJig2::kLinePoint);
jig.SetKeyword(_T("A U"));
while (1) {
int nKeyIndex = 0;
int nRetCode = jig.DoIt(&nKeyIndex);
if (nRetCode == RTNORM) {
pline.addVertexAt(pline.numVerts(), (AcGePoint2d &)jig.GetPickPoint());
if (jig.GetOperCode() == TPolyEdJig2::kArcPoint) {
TPolyEdJig2 jig1(&pline);
jig1.SetOperCode(TPolyEdJig2::kArcMidPoint);
jig1.SetPrompt(_T("\n点取弧上一点 [输入半径(R)]:"));
jig1.SetKeyword(_T("R"));
int nKeyIdx;
int nRetCode1 = jig1.DoIt(&nKeyIdx);
if (nRetCode1 == RTKWORD) {
TPolyEdJig2 jig2(&pline);
jig2.SetOperCode(TPolyEdJig2::kArcRadius);
jig2.SetPrompt(_T("\n输入半径(光标位置确定弧的方向):"));
jig2.DoIt();
}
}
else { //直段
jig.SetPrompt(_T("\n直段下一点 [弧段(A)/回退(U)] <结束>: "));
jig.SetOperCode(TPolyEdJig2::kLinePoint);
jig.SetKeyword(_T("A U"));
}
}
else if (nRetCode == RTKWORD) {
if (jig.GetOperCode() == TPolyEdJig2::kLinePoint) {
if (nKeyIndex == 0) {
jig.SetOperCode(TPolyEdJig2::kArcPoint);
jig.SetPrompt(_T("\n弧段下一点 [直段(L)/回退(U)] <结束>: "));
jig.SetKeyword(_T("L U"));
}
else if (nKeyIndex == 1) {
int numVert = pline.numVerts();
if (numVert > 1) {
pline.removeVertexAt(numVert - 1);
pline.setBulgeAt(numVert - 2, 0.0);
}
}
}
else if (jig.GetOperCode() == TPolyEdJig2::kArcPoint) {
if (nKeyIndex == 0) {
jig.SetOperCode(TPolyEdJig2::kLinePoint);
jig.SetPrompt(_T("\n直段下一点 [弧段(A)/回退(U)] <结束>: "));
jig.SetKeyword(_T("A U"));
}
else if (nKeyIndex == 1) {
int numVert = pline.numVerts();
if (numVert > 1) {
pline.removeVertexAt(numVert - 1);
pline.setBulgeAt(numVert - 2, 0.0);
}
}
}
}
else if (nRetCode == RTNONE) {
break;
}
else if (nRetCode == RTCAN) {
return RTERROR;
}
}
int numVert = pline.numVerts();
if (numVert < 2)
return RTERROR;
GlobalFunc::PolyConvert(pline, poly2dRet);
return RTNORM;
}
int GetOpenPoly2D2(const TCHAR *pMsg, XPoly2D &poly2d)
{
XString szPrompt;
if (pMsg)
szPrompt << pMsg;
else szPrompt << _T("\n曲线起点");
szPrompt << _T("或 [点取图中曲线(P)/点取参考点(R)/复制已有汇流面积(C)]<退出>:");
XPoint ptStart;
int nCode;
INITGET_BEG(0, _T("C P R"));
nCode = ads_getpoint(NULL, szPrompt, ptStart);
INITGET_END();
if (nCode == RTKWORD) {
XString sKeyword;
VERIFY(ads_getinput(sKeyword) == RTNORM);
if (sKeyword[0] == _T('R')) {
XPoint ptRef;
if (ads_getpoint(NULL, _T("\n输入参考点<退出>:"), ptRef) != RTNORM)
return RTERROR;
if (ads_getpoint(ptRef, _T("\n曲线起点<退出>:"), ptStart) != RTNORM)
return RTERROR;
ptStart = GlobalFunc::Ucs2Wcs(ptStart);
nCode = DragInputPoly2d(ptStart, poly2d);
}
else if (sKeyword[0] == _T('C') || sKeyword[0] == _T('c'))//复制汇流面积
{
return RTPICKS;
}
else {
RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE,LINE,ARC"), NULL);
Entity ent;
LAB_RESELECT:
if ((nCode = ent.FilterSelect(_T("\n选择一曲线(LINE/ARC/PLINE):"), mask)) != RTNORM)
return RTERROR;
if (ent.Is(_T("LINE")) || ent.Is(_T("ARC"))) {
XCurveSegment cv(ent);
poly2d.Reset();
cv.AsPoly2D(poly2d);
}
else {
XPoly2D poly(ent);
if (!!poly) {
poly2d = poly;
}
else {
g_Option::instance().adsout << _T("\n无效的选择!");
goto LAB_RESELECT;
}
}
}
}
else if (nCode == RTNORM) {
ptStart = GlobalFunc::Ucs2Wcs(ptStart);
nCode = DragInputPoly2d(ptStart, poly2d);
}
else { //
return nCode;
}
return nCode;
}
//***************************************************************************************************
// 世界坐标系
//***************************************************************************************************
void SetWcsCoord()
{
SHads_command(RTSTR, _T("UCS"), RTSTR, _T("W"), 0);
}
//***************************************************************************************************
// 测量坐标系
//***************************************************************************************************
void SetMeasureCoord()
{
Acad::ErrorStatus eStat;
AcDbObjectId idRec;
AcDbUCSTable* pTable = NULL;
acdbCurDwg()->getUCSTable(pTable, AcDb::kForWrite);
if (pTable != NULL)
{
struct resbuf rb1, rb2, rb3;
acedGetVar(_T("UCSORG"), &rb1);
acedGetVar(_T("UCSXDIR"), &rb2);
acedGetVar(_T("UCSYDIR"), &rb3);
ads_point ptOrg;
ads_point vtX, vtY;
(rb1.resval.rpoint, ptOrg, false);
acdbUcs2Wcs(rb2.resval.rpoint, vtX, true);
acdbUcs2Wcs(rb3.resval.rpoint, vtY, true);
AcGePoint3d ptGeOrg = asPnt3d(ptOrg);
AcGeVector3d vtX1 = asVec3d(rb2.resval.rpoint);
AcGeVector3d vtY1 = asVec3d(rb3.resval.rpoint);
AcDbUCSTableRecord* pRecord = NULL;
if (Acad::eOk != pTable->getAt(_T("Tg_MeasureCoord"), pRecord, AcDb::kForWrite))
{
pRecord = new AcDbUCSTableRecord;
pRecord->setName(_T("Tg_MeasureCoord"));
pRecord->setOrigin(ptGeOrg);
pRecord->setXAxis(vtY1);
pRecord->setYAxis(vtX1);
eStat = pTable->add(idRec, pRecord);
pRecord->close();
}
else
{
if (pRecord != NULL)
{
idRec = pRecord->objectId();
pRecord->close();
}
}
pTable->close();
}
SHads_command(RTSTR, _T("UCS"), RTSTR, _T("_R"), RTSTR, _T("Tg_MeasureCoord"), 0);
}
//***************************************************************************************************
// 搜索室外井系统
//***************************************************************************************************
// sr modify 2004/10/25 2005/5/24
// 搜索室外系统,可以定终止井,entEnd输入空,自动搜索最后一个井
// 搜索原则:顺着流向方向找,如果有分叉就结束,有汇集不关,继续向前
BOOL AutoSearchOutdoorWell(Entity ent, AcDbObjectId idFront, SSearchPipeList *pListAll, PickSet &ssAll)
{
AcDbObjectId id = NULL;
acdbGetObjectId(id, ent);
pListAll->m_ID = id;
AcDbObjectIdArray idArray;
int len(0);
{
PickSet ss(SS_FREE);
if (ent.Is(_T("AEC_ZT_PIPE"))) {
pListAll->m_iType = 0;
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe) {
//2008.4.30 增加以下代码, 在室外中, 标注管长不需要标注真实管长, 只需要标注平面管长
double dLen = pPipe->GetPlanLength();
pListAll->m_nLength = dLen;
pListAll->m_iDn = (int)pPipe->GetDnDiameter();
}
OPENOBJ_END();
pListAll->m_nI = GlobalFunc::GetPipeGradient(ent);
GlobalFunc::GetAllPipeAndNodeByPipe(id, idFront, ss);
}
else if (ent.Is(_T("AEC_ZT_POOL"))) { //2009-4-3 池改用单独对象实现
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbPool, pEquip);
if (pEquip) {
pListAll->m_nDang = pEquip->GetGroundEle();
}
OPENOBJ_END();
pListAll->m_iType = 4;
pListAll->m_csName = _T("HC");
GlobalFunc::GetAllPipeAndNodeByNode(id, idFront, ss);
}
else {
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
pListAll->m_nDang = pEquip->GetWellEleUp(); //井地面标高
pListAll->m_csName = pEquip->GetWellName(); //井编号
pListAll->m_iType = 3;
AcDbObjectId idBlk = pEquip->GetBlock2d();
CString csBlkName = GlobalFunc::GetBlkNameById(idBlk);
if (_tcsicmp(_T("$TWTSYS$00000186"), csBlkName) == 0) //阀门井
pListAll->m_iNum = 1;
else if (_tcsicmp(_T("$TWTSYS$00000187"), csBlkName) == 0 || _tcsicmp(_T("$TWTSYS$00000336"), csBlkName) == 0) //检查井
pListAll->m_iNum = 2;
else if (_tcsicmp(_T("$TWTSYS$00000190"), csBlkName) == 0) //水封井
pListAll->m_iNum = 3;
else if (_tcsicmp(_T("$TWTSYS$00000191"), csBlkName) == 0) //跌水井
pListAll->m_iNum = 4;
if (pEquip->IsDropWell())
pListAll->m_iNum = 4;
pListAll->m_nStartPress = pEquip->GetWellEleDown(); //跌水井底标高
pListAll->m_nLost = pEquip->GetScale(); //井口直径
}
else if (pListAll->m_iType != 4) {
pListAll->m_iType = -1;
}
OPENOBJ_END();
GlobalFunc::GetAllPipeAndNodeByNode(id, idFront, ss);
}
ss -= ent;
PickSet ssDel(SS_FREE);
XPoint ptFront;
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbPipeNode, pNode);
if (pNode) {
ptFront = pNode->GetLocation();
ptFront.z = 0;
}
OPENOBJ_END();
for (long j = 0; j < ss.Length(); j++) {
Entity entTmp = ss[j];
if (entTmp.In(&ssAll) > 0) {
return FALSE;
}
if (entTmp.Is(_T("AEC_ZT_PIPE"))) {
OPENOBJ_BEGIN(entTmp, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe) {
XPoint ptS = pPipe->StartPoint();
XPoint ptE = pPipe->EndPoint();
ptS.z = 0;
ptE.z = 0;
TPipeSys::FlowDirection dir = pPipe->GetFlowDir();
BOOL bDel = FALSE;
if (!ent.Is(_T("AEC_ZT_POOL")))
{
//从起点->终点 或 按【管线坡度】的方向
if (dir == TPipeSys::kUnknownDir) {
bDel = TRUE;
}
else if (dir == TPipeSys::kFromStart) {
double nDist = fabs(ads_distance(ptFront, ptS));
if (ptFront != ptS && nDist > 0.1) //xpoint != g_Option::instance()._distSnap=0.01 室外坐标过大的时候,精度太小
bDel = TRUE;
}
else if (dir == TPipeSys::kFromEnd) {
double nDist = fabs(ads_distance(ptFront, ptE));
if (ptFront != ptE && nDist > 0.1)
bDel = TRUE;
}
}
double dn = pPipe->GetDnDiameter();
if (bDel)
ssDel += entTmp;
if (!bDel && dn < 0) {
AfxMessageBox(_T("管线没有进行管径标注"));
return TRUE;
}
}
OPENOBJ_END();
}
}
ss -= ssDel;
len = ss.Length();
if (len != 1) //自动搜索,只能顺水流方向搜索,如果有分叉就结束
return TRUE;
ssAll += ss;
for (long i = 0; i < ss.Length(); i++) {
Entity entTmp = ss[i];
AcDbObjectId idTmp = NULL;
acdbGetObjectId(idTmp, entTmp);
idArray.append(idTmp);
}
}
len = idArray.length();
for (long i = 0; i < len; i++) {
AcDbObjectId idTmp = idArray[i];
ads_name ent;
Entity entTmp;
acdbGetAdsName(ent, idTmp);
entTmp = ent;
SSearchPipeList *pList = new SSearchPipeList();
pList->m_ID = idTmp;
pList->m_pPrevious = pListAll;
pListAll->m_lstNode.Append(pList);
if (!AutoSearchOutdoorWell(entTmp, id, pList, ssAll))
return FALSE;
if (pList->m_lstNode.Length() == 0 && pList->m_iType == -1) {
pListAll->m_lstNode.Remove(0);
ssAll -= entTmp;
}
if (pList->m_lstNode.Length() == 0 && pList->m_iType == 0) {
pListAll->m_lstNode.Remove(0);
ssAll -= entTmp;
}
}
return TRUE;
}
//将井编号写入链表
BOOL SetWellData(SSearchPipeList *pListAll)
{
BOOL bRet = TRUE;
AcDbObjectId id = NULL;
id = pListAll->m_ID;
ads_name adsent;
acdbGetAdsName(adsent, id);
Entity ent = adsent;
if (ent.Is(_T("AEC_ZT_PIPE"))) {
pListAll->m_iType = 0;
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe) {
pListAll->m_nLength = pPipe->Length();
pListAll->m_iDn = (int)pPipe->GetDnDiameter();
}
OPENOBJ_END();
pListAll->m_nI = GlobalFunc::GetPipeGradient(ent);
}
else {
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
pListAll->m_nDang = pEquip->GetWellEleUp(); //井地面标高
pListAll->m_csName = pEquip->GetWellName(); //井编号
pListAll->m_iType = 3;
AcDbObjectId idBlk = pEquip->GetBlock2d();
CString csBlkName = GlobalFunc::GetBlkNameById(idBlk);
if (_tcsicmp(_T("$TWTSYS$00000186"), csBlkName) == 0) //阀门井
pListAll->m_iNum = 1;
else if (_tcsicmp(_T("$TWTSYS$00000187"), csBlkName) == 0 || _tcsicmp(_T("$TWTSYS$00000336"), csBlkName) == 0) //检查井
pListAll->m_iNum = 2;
else if (_tcsicmp(_T("$TWTSYS$00000190"), csBlkName) == 0) //水封井
pListAll->m_iNum = 3;
else if (_tcsicmp(_T("$TWTSYS$00000191"), csBlkName) == 0) //跌水井
pListAll->m_iNum = 4;
if (pEquip->IsDropWell())
pListAll->m_iNum = 4;
pListAll->m_nStartPress = pEquip->GetWellEleDown(); //跌水井底标高
pListAll->m_nLost = pEquip->GetScale(); //井口直径
}
else if (pListAll->m_iType == 4) {
pListAll->m_csName = _T("HC"); //井编号
}
else {
pListAll->m_iType = -1;
g_Option::instance().adsout << _T("\n2管线相交之处缺少井!");
//AfxMessageBox(_T("2管线相交之处缺少井!"));
//return FALSE;
}
OPENOBJ_END();
}
long len = pListAll->m_lstNode.Length();
for (long i = 0; i < len; i++) {
SSearchPipeList *pList = pListAll->m_lstNode[i];
bRet = SetWellData(pList);
}
return bRet;
}
//本节点往下走,能通向终止井吗?
BOOL IsNodeLink2EndWell(SSearchPipeList *pListAll, Entity entEnd)
{
BOOL bRet = FALSE;
AcDbObjectId id = NULL;
if (pListAll->m_iType == 3) {
id = pListAll->m_ID;
ads_name adsent;
acdbGetAdsName(adsent, id);
Entity ent = adsent;
if (ent == entEnd)
return TRUE;
}
long len = pListAll->m_lstNode.Length();
for (long i = 0; i < len; i++) {
SSearchPipeList *pList = pListAll->m_lstNode[i];
bRet = IsNodeLink2EndWell(pList, entEnd);
if (bRet)
return TRUE;
}
return bRet;
}
//将整个系统pListAll的唯一通道提取出来放到pListNew中
//pListNew 是一个从 “起始井”到“终止井”的单向链表
BOOL SearchSysFromAll(SSearchPipeList *pListAll, SSearchPipeList *pListNew, Entity entEnd, PickSet &ssAll, BOOL bModifyDir)
{
BOOL bRet = TRUE;
//复制内容
pListNew->m_iDn = pListAll->m_iDn;
pListNew->m_bNeedCale = pListAll->m_bNeedCale;
pListNew->m_iNum = pListAll->m_iNum;
pListNew->m_ID = pListAll->m_ID;
pListNew->m_iType = pListAll->m_iType;
pListNew->m_csName = pListAll->m_csName;
pListNew->m_nLength = pListAll->m_nLength;
pListNew->m_nPipeQ = pListAll->m_nPipeQ;
pListNew->m_nDang = pListAll->m_nDang;
pListNew->m_nStartPress = pListAll->m_nStartPress;
pListNew->m_nI = pListAll->m_nI;
pListNew->m_nV = pListAll->m_nV;
pListNew->m_nLost = pListAll->m_nLost;
long len = pListAll->m_lstNode.Length();
ssAll += pListNew->m_ID;
//重新确定水流方向
if (pListAll->m_iType == 0 && bModifyDir) {
XPoint ptFront;
if (pListAll->m_pPrevious != NULL) {
OPENOBJ_BEGIN(pListAll->m_pPrevious->m_ID, AcDb::kForRead, CDbPipeNode, pNode);
if (pNode) {
ptFront = pNode->GetLocation();
}
OPENOBJ_END();
}
OPENOBJ_BEGIN(pListNew->m_ID, AcDb::kForWrite, CDbPipe, pPipe);
if (pPipe) {
XPoint p1 = ptFront;
p1.z = 0;
XPoint p2 = pPipe->StartPoint();
p2.z = 0;
if (p1 == p2)
pPipe->SetFlowDir(TPipeSys::kFromStart);
else
pPipe->SetFlowDir(TPipeSys::kFromEnd);
}
OPENOBJ_END();
}
for (long i = 0; i < len; i++) {
SSearchPipeList *pList = pListAll->m_lstNode[i];
if (!IsNodeLink2EndWell(pList, entEnd))
continue;
SSearchPipeList *pNodeNew = new SSearchPipeList();
pNodeNew->m_pPrevious = pListNew;
pListNew->m_lstNode.Append(pNodeNew);
bRet = SearchSysFromAll(pList, pNodeNew, entEnd, ssAll, bModifyDir);
}
return bRet;
}
BOOL SearchOutdoorWell(Entity ent, Entity entEnd, SSearchPipeList *pListAll, PickSet &ssAll, BOOL bModifyDir)
{
if (!entEnd) //没有指定终止井
return AutoSearchOutdoorWell(ent, NULL, pListAll, ssAll);
//有指定井,由于系统绘制方向可能不是有序的,首先搜索整个系统
SSearchPipeList *pListAll2 = new SSearchPipeList();
PickSet ss(SS_FREE);
ss += ent;
if (!GlobalFunc::SearchSprinkPipeSys(ent, NULL, pListAll2, ss)) {
delete pListAll2;
return FALSE;
}
long len = ss.Length();
int pos = entEnd.In(&ss);
// ss.Redraw(3);
if (pos == 0) {
delete pListAll2;
return FALSE;
}
SetWellData(pListAll2);
//2008-5-8 增加bModifyDir是否强制修改管道的方向,纵断面图需要修改,而计算地面标高则不需要
BOOL ret = SearchSysFromAll(pListAll2, pListAll, entEnd, ssAll, bModifyDir);
delete pListAll2;
len = ssAll.Length();
return ret;
}
//把树结构的数据转化为DLIST链表结构
BOOL GetWellListData(SSearchPipeList *pListAll, DList<TWellData> &lstWellSys)
{
if (pListAll->m_iType == -1)
return FALSE;
TWellData *pList = new TWellData();
pList->m_iDn = pListAll->m_iDn;
if (pListAll->m_iType == 3 || pListAll->m_iType == 4) {
pList->m_bIsWell = TRUE;
AcDbObjectId id = pListAll->m_ID;
ads_name ent;
acdbGetAdsName(ent, id);
BOOL bIsRectWell = FALSE;
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip) {
AcDbObjectId idRec = pEquip->GetBlock2d();
if (_tcsicmp(GlobalFunc::GetBlkNameById(idRec), _T("$TwtSys$00000336")) == 0)
bIsRectWell = TRUE;
}
OPENOBJ_END();
CString csWellRadius = GlobalFunc::ReadXdata(ent, _T("TG-WELL-RADIUS"));
pList->m_nWellRadius = _tstof(csWellRadius) / 2.0; //转化为半径
if (fabs(pList->m_nWellRadius) < 0.1)
pList->m_nWellRadius = 350;
if (bIsRectWell)
pList->m_nWellRadius *= (-1);
}
else
pList->m_bIsWell = FALSE;
if (pListAll->m_iNum == 4)
pList->m_bIsDropWell = TRUE;
//如果接化粪池,管线长度要减去化粪池遮挡的部分
if (pListAll->m_iType == 0) {
SSearchPipeList *pListPrevious = pListAll->m_pPrevious;
BOOL bFlag = FALSE;
if (pListPrevious != NULL && pListPrevious->m_iType == 4) {
bFlag = TRUE;
}
else if (pListAll->m_lstNode.Length() == 1) {
pListPrevious = pListAll->m_lstNode[0];
if (pListPrevious != NULL && pListPrevious->m_iType == 4)
bFlag = TRUE;
}
if (bFlag) {
AcDbObjectId id = pListPrevious->m_ID;
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip) {
double nXScale = pEquip->GetScale();
pListAll->m_nLength = pListAll->m_nLength - nXScale / 2;//管长=对象长-井直径
}
OPENOBJ_END();
}
}
pList->m_csName = pListAll->m_csName;
pList->m_ID = pListAll->m_ID;
pList->m_nI = pListAll->m_nI;
pList->m_nUpEle = pListAll->m_nDang; //井地面标高
// cet 2012.7.26 add 化粪池地面标高
if (pListAll->m_iType == 4)
{
CDbPool *pPool = NULL;
acdbOpenObject(pPool, pListAll->m_ID, AcDb::kForRead);
if (pPool != NULL)
{
pList->m_nUpEle = pPool->GetGroundEle();
pPool->close();
}
}
pList->m_nDownEle = pListAll->m_nStartPress; //跌水井底标高
pList->m_nLength = pListAll->m_nLength;
// if(!GlobalFunc::DocGetMeterUnitDraw())
// pList->m_nLength = pList->m_nLength/1000;
lstWellSys.Append(pList);
BOOL bRet = TRUE;
long len = pListAll->m_lstNode.Length();
for (long i = 0; i < len; i++) {
SSearchPipeList *pList = pListAll->m_lstNode[i];
bRet = GetWellListData(pList, lstWellSys);
}
return bRet;
}
//***************************************************************************************************
// 搜索井
//***************************************************************************************************
void FindMissWell(XStringList &lstWellName)
{
TCHAR szText1[256];
TCHAR szText2[256];
if (ads_getstring(NULL, _T("\n请输入要起始井的编号<退出>:"), szText1) != RTNORM) {
return;
}
if (ads_getstring(NULL, _T("\n请输入要终止井的编号<退出>:"), szText2) != RTNORM) {
return;
}
int idx1 = lstWellName.Index(szText1, 0);
int idx2 = lstWellName.Index(szText2, 0);
if (idx1 < 0 || idx2 < 0) {
g_Option::instance().adsout << _T("\n所输入起始井或终止井的编号不存在!");
return;
}
CString csBase(szText1);
CString csFinish(szText2);
while (1) {
CString csTmp = GlobalFunc::PlusString(csBase, 1, TRUE);
if (csTmp == csFinish) {
g_Option::instance().adsout << _T("\n没有漏井!");
return;
}
idx1 = lstWellName.Index(csTmp, 0);
CString csPrompt;
csPrompt.Format(_T("\n%s井不存在!"), csTmp);
if (idx1 < 0) {
g_Option::instance().adsout << (const TCHAR*)csPrompt;
return;
}
csBase = csTmp;
}
}
void FindWell()
{
TCHAR szText[256];
RBList rbMask(RTDXF0, _T("AEC_ZT_WELL"), NULL);
PickSet ss(SS_FREE);
ss.Get(_T("X"), NULL, NULL, rbMask);
long len = ss.Length();
XStringList lstWellName, lstRepeat;
for (long i = 0; i < len; i++) {
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
if (!pEquip->IsDrawLabel())
continue;
CString csName = pEquip->GetWellName();
if (lstWellName.Index(csName, 0) < 0)
lstWellName.Append(tstrnew(csName));
else
lstRepeat.Append(tstrnew(csName));
}
OPENOBJ_END();
}
for (int j = 0; j < lstRepeat.Length(); j++) {
g_Option::instance().adsout << XString(_T("\n编号为%s的井有重复。"), lstRepeat[j]);
}
if (ads_getstring(NULL, _T("\n请输入要搜索井的编号<搜索漏井>:"), szText) != RTNORM) {
FindMissWell(lstWellName);
return;
}
if (_tcsicmp(szText, _T("")) == 0) {
FindMissWell(lstWellName);
return;
}
int count = 0;
PickSet ssWell(SS_FREE);
for (i = 0; i < len; i++) {
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
if (!pEquip->IsDrawLabel())
continue;
CString csName = pEquip->GetWellName();
if (_tcsicmp(csName, szText) == 0) {
ssWell += ent;
count++;
}
}
OPENOBJ_END();
}
XPoint ptCen, ptLow, ptUp;
double x, y, z;
ssWell.GetExtend(ptCen, &x, &y, &z);
ptLow = ptUp = ptCen;
ptLow.x -= x;
ptLow.y -= y;
ptUp.x += x;
ptUp.y += y;
if (count < 1)
g_Option::instance().adsout << _T("\n没有发现该编号的井!");
else if (count > 1) {
g_Option::instance().adsout << _T("\n发现多个重名的井!");
GlobalFunc::AssureInCurrentView(ptLow, ptUp);
}
else {
g_Option::instance().adsout << _T("\n已经成功发现!该井位于屏幕中心黄叉处。");
GlobalFunc::ArxZoomTo(ptCen, 100 * GlobalFunc::DocGetPScale(), 100 * GlobalFunc::DocGetPScale());
}
for (i = 0; i < count; i++) {
Entity ent = ssWell[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
XPoint ptCen;
double nX(1), nY(1);
ent.GetExtend(ptCen, &nX, &nY);
double nDist = GlobalFunc::DocGetPScale() * 100;
XPoint p1, p2, p3, p4;
ads_polar(ptCen, 0, nDist, p1);
ads_polar(p1, PI / 2, nDist, p1);
ads_polar(ptCen, PI, nDist, p2);
ads_polar(p2, PI / 2, -nDist, p2);
ads_grdraw(GlobalFunc::Wcs2Ucs(p1), GlobalFunc::Wcs2Ucs(p2), 2, 0);
ads_polar(ptCen, PI / 2, nDist, p3);
ads_polar(p3, PI, nDist, p3);
ads_polar(ptCen, PI / 2, -nDist, p4);
ads_polar(p4, 0, nDist, p4);
ads_grdraw(GlobalFunc::Wcs2Ucs(p3), GlobalFunc::Wcs2Ucs(p4), 2, 0);
}
OPENOBJ_END();
}
}
//***************************************************************************************************
// 出户连井
//***************************************************************************************************
void ExtendOutdoorPipe()
{
RBList rbMask(RTDXF0, _T("AEC_ZT_PIPE"), 8, GetLayerNames(_T("管线")), NULL);
Entity entMain;
PickSet ss(SS_FREE);
if (GlobalFunc::SelectEntity(_T("\n请选择室外干管<退出>"), entMain, rbMask) != RTNORM)
return;
AcDbObjectId id = NULL;
OPENOBJ_BEGIN(entMain, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe) {
id = pPipe->GetNode(0);
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbWell, pEquip);
if (!pEquip) {
g_Option::instance().adsout << _T("\n请选择室外连井的管线!");
return;
}
OPENOBJ_END();
}
OPENOBJ_END();
TCHAR szLay[256];
entMain.GetData(8, szLay);
RBList rbMask2(RTDXF0, _T("AEC_ZT_PIPE"), 8, szLay, NULL);
if (GlobalFunc::SelectEntities(_T("\n请选择出户管<退出>"), ss, rbMask2) != RTNORM)
return;
XPoint p1, p2, p3, p4, ptTmp3, ptTmp4, ptInter;
GlobalFunc::GetPipePoint(entMain, p1, p2);
XLine line1(p1, p2);
line1.StartPoint().z = 0;
line1.EndPoint().z = 0;
AcGePoint3dArray arBreak;
for (long i = 0; i < ss.Length(); i++) {
double nElevation(0);
Entity ent = ss[i];
GlobalFunc::GetPipePoint(ent, p3, p4);
XLine line2(p3, p4);
line2.StartPoint().z = 0;
line2.EndPoint().z = 0;
int ret = line1.Intersection(&line2, ptInter);
if (ret != 1)
continue;
XPoint ptPro;
OPENOBJ_BEGIN(entMain, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe) {
AcGePoint3d secPt;
pPipe->getClosestPointTo(ptInter, AcGeVector3d::kZAxis, secPt);
ptPro = secPt;
}
OPENOBJ_END();
//判断附近有没有井,规范有间距限制
BOOL bIsTooClose = FALSE;
const double dDist = GlobalFunc::DocGetCurMeterUnitDraw() ? 0.5 : 500;// zxl 2012.08.15 add
for (int m = 0; m < arBreak.length(); m++)
{
XPoint ptTmp1 = arBreak[m];
ptTmp1.z = 0;
XPoint ptTmp2 = ptPro;
ptTmp2.z = 0;
double dDist2 = ads_distance(ptTmp1, ptTmp2);
//if(ads_distance(ptTmp1, ptTmp2) < 500) // zxl 2012.08.15 modify
if (ads_distance(ptTmp1, ptTmp2) < dDist)
{
bIsTooClose = TRUE;
break;
}
}
if (bIsTooClose)
continue;
arBreak.append(ptPro);
nElevation = ptPro.z;
ptTmp4 = ads_distance(p3, ptInter) > ads_distance(p4, ptInter) ? p3 : p4;
OPENOBJ_BEGIN(ent, AcDb::kForWrite, CDbPipe, pPipe);
if (pPipe) {
pPipe->SetModelType(TPipeSys::kModel);
ptTmp4.z = nElevation;
ptInter.z = nElevation;
pPipe->SetStartPoint(ptTmp4);
pPipe->SetEndPoint(ptInter);
}
OPENOBJ_END();
}
//2008-11-14 sr 收集所有的打断点,这里一次性打断
AcDbVoidPtrArray curves;
OPENOBJ_BEGIN(entMain, AcDb::kForWrite, CDbPipe, pPipe);
if (pPipe) {
pPipe->getSplitCurves(arBreak, curves);
for (long k = 0; k < curves.length(); k++) {
AcDbCurve *pCurve0 = (AcDbCurve *)curves[k];
GlobalFunc::AddToCurrentSpace(pCurve0, Adesk::kTrue);
}
if (curves.length() > 0)
pPipe->erase();
}
OPENOBJ_END();
//TPipePerDocData *pData = GetCurPipeDocData();
//pData->ApplyUpdates();
int len = arBreak.length();
for (int n = 0; n < len; n++)
{
XPoint ptInter = arBreak[n];
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbWell, pWell);
if (pWell) {
AecXDbWell *pNew = (AecXDbWell*)pWell->clone();
ptInter.z = 0;
pNew->SetLocation(ptInter);
pNew->SetInsert(ptInter);
pNew->SetWellName(_T(""));
pNew->SetLabelLocation(XPoint());
pNew->EnableDrawLabel(TRUE, 1.5);
pNew->SetDropWell(FALSE);
GlobalFunc::AddToCurrentSpace(pNew, Adesk::kTrue);
}
OPENOBJ_END();
}
return;
}
//***************************************************************************************************
// 雨水口连井
//***************************************************************************************************
void ModifyPipeDn(const std::map<AcDbObjectId, std::vector<int> > &mapEq, const std::vector<AcDbObjectId> &vecPipe)
{
AcGePoint3d ptLoc;
std::map<AcDbObjectId, std::vector<int> >::const_iterator itM = mapEq.begin();
for (; itM != mapEq.end(); itM++)
{
bool bSingle = true;// 不存在多篦
std::vector<int>::const_iterator it = (itM->second).begin();
for (; it != (itM->second).end(); it++)
{
if (*it == 1)
{
bSingle = false;
break;
}
}
int nType = 0;
OPENOBJ_BEGIN(itM->first, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip)
{
AcDbObjectId id = pEquip->GetBlock2d();
CString sName = GlobalFunc::GetBlkNameById(id);
CString csDwb = g_csDwbPath + _T("TwtSys");
XString xsTmp1;
if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000424"), xsTmp1) != RTNORM) //单蓖
return;
if (sName.Compare(xsTmp1) != 0)
{
nType = 1;
}
ptLoc = pEquip->GetLocation();
}
OPENOBJ_END();
double dDn = 300;
if ((itM->second).size() > 1 && (nType == 1 || !bSingle))
{
dDn = 400;
}
std::vector<AcDbObjectId>::const_iterator itV = vecPipe.begin();
for (; itV != vecPipe.end(); itV++)
{
OPENOBJ_BEGIN(*itV, AcDb::kForWrite, CDbPipe, pPipe);
if (pPipe != NULL)
{
if (pPipe->StartPoint().Distance(ptLoc) < 1e-3 || pPipe->EndPoint().Distance(ptLoc) < 1e-3)
{
pPipe->SetDnDiameter(dDn);
break;
}
}
OPENOBJ_END();
}
}
}
void Gully2Well()
{
GlobalFunc::DocGetPickFirst().Free();
PickSet ss(SS_FREE);
PickSet ssAll(SS_FREE);
PickSet ssGully(SS_FREE);
PickSet ssWell(SS_FREE);
XPushVar<int> vOsMode(_T("OSMODE"), 0);
RBList rbMask = ads_buildlist(-4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("AEC_ZT_WELL"), 8, LAY_WELL_RAIN, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("AEC_ZT_EQUIPMENT"), 8, LAY_TWT_GULLY, -4, _T("and>"),
-4, _T("or>"), NULL);
RBList rbMaskPipe(RTDXF0, _T("AEC_ZT_PIPE"), 8, LAY_PIPE_RAIN, NULL);
if (GlobalFunc::SelectEntities(_T("\n请选择雨水口和就近的雨水井<退出>:"), ss, rbMask) != RTNORM)
return;
ssAll += ss;
// ssAll.Get(_T("X"), NULL, NULL, rbMask);
GlobalFunc::InitPipeLayer(LAY_PIPE_RAIN);
long len = ss.Length();
for (long i = 0; i < len; i++) {
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (!pEquip) {
ssGully += ent;
}
OPENOBJ_END();
}
if (ssGully.Length() < 1)
return;
if (ssGully.Length() == ssAll.Length())
ssAll.Get(_T("X"), NULL, NULL, rbMask);
len = ssAll.Length();
for (i = 0; i < len; i++) {
Entity ent = ssAll[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
BOOL bFlag = FALSE;
AcDbObjectId idBlk = pEquip->GetBlock2d();
CString csBlkName = GlobalFunc::GetBlkNameById(idBlk);
// if(_tcsicmp(_T("$TWTSYS$00000187"), csBlkName) == 0
// || _tcsicmp(_T("$TWTSYS$00000336"), csBlkName) == 0
// || _tcsicmp(_T("$TWTSYS$00000375"), csBlkName) == 0
// || _tcsicmp(_T("$TWTSYS$00000414"), csBlkName) == 0
// || _tcsicmp(_T("$TWTSYS$00000376"), csBlkName) == 0 ) { //检查井
int num = pEquip->GetInterfaceNum();
for (int i = 0; i < num; i++) {
CPipeInterface face;
pEquip->GetInterface(i, face);
AcDbObjectId nextPipeId = face.m_idPipe;
OPENOBJ_BEGIN(nextPipeId, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe) {
if (pPipe->GetSysType() == TPipeSys::kRainWater) {
bFlag = TRUE;
break;
}
}
OPENOBJ_END();
}
if (bFlag)
ssWell += ent;
// }
}
OPENOBJ_END();
}
//以上代码,是把检查井,雨水口 分开
len = ssGully.Length();
// 重新更新雨水口,以确保由于copy时连续插入多个雨水口时,
// 清除新雨水口中错误的接口连接 cet 2013.3.15 add
for (i = 0; i < len; ++i)
{
OPENOBJ_BEGIN(ssGully[i], AcDb::kForWrite, CDbEquipment, pEquip)
OPENOBJ_END();
}
//TPipePerDocData* pDoc = GetCurPipeDocData();
//if (pDoc != NULL)
//{
// pDoc->ApplyUpdates();
//}
// zxl 2013.05.29 add
std::map<AcDbObjectId, std::vector<int> > mapEq;
std::vector<AcDbObjectId> vecPipe;
bool bLinkWithGully = false;
for (i = 0; i < len; i++) {
Entity entCurGully = ssGully[i];
XPoint ptCurGullyLoc;
BOOL bHasLinkPipe = FALSE;
SSearchPipeList *pListAll = new SSearchPipeList();
PickSet ssSearch(SS_FREE);
GlobalFunc::SearchSprinkPipeSys(entCurGully, NULL, pListAll, ssSearch);
delete pListAll;
for (long m = 0; m < ssSearch.Length(); m++) {
Entity entTmp = ssSearch[m];
if (entTmp.Is(_T("AEC_ZT_WELL"))) {
bHasLinkPipe = TRUE;
break;
}
}
if (bHasLinkPipe)//如果这个雨水口已经接管线,就不理会他
continue;
OPENOBJ_BEGIN(entCurGully, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip) {
ptCurGullyLoc = pEquip->GetLocation();
}
OPENOBJ_END();
double nDist = -1;
Entity entNearWellOrGully;//找到雨水口最近的检查井, 或雨水口
XPoint ptNearWellOrGully; //检查井的插入点
for (long j = 0; j < ssWell.Length(); j++) {
Entity entWell = ssWell[j];
XPoint ptLoc2;
OPENOBJ_BEGIN(entWell, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip) {
ptLoc2 = pEquip->GetLocation();
}
OPENOBJ_END();
double n = ads_distance(ptCurGullyLoc, ptLoc2);
if (nDist < 0 || nDist > n) {
nDist = n;
entNearWellOrGully = entWell;
ptNearWellOrGully = ptLoc2;
}
}
if (!!entNearWellOrGully) {//看看这个检查井最近的雨水口是否是它自己
double nDist2 = -1;
Entity entNearGully;//找到检查井最近的雨水口
XPoint ptNearGully; //最近的雨水口的插入点
for (long m = 0; m < len; m++) {
Entity ent3 = ssGully[m];
XPoint ptLoc3;
OPENOBJ_BEGIN(ent3, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip) {
ptLoc3 = pEquip->GetLocation();
}
OPENOBJ_END();
double n = ads_distance(ptNearWellOrGully, ptLoc3);
if (nDist2 < 0 || nDist2 > n) {
nDist2 = n;
entNearGully = ent3;
ptNearGully = ptLoc3;
}
}
if (!(entNearGully == entCurGully)) {
double n = ads_distance(ptCurGullyLoc, ptNearGully);//2雨水口的距离
struct resbuf *pointlist;
PickSet ssPipe(SS_FREE);
GlobalFunc::AssureInCurrentView(ptCurGullyLoc, ptNearGully);
pointlist = ads_buildlist(RTPOINT, &ptCurGullyLoc, RTPOINT, &ptNearGully, NULL);
ssPipe.Get(_T("F"), pointlist, NULL, rbMaskPipe);
ads_relrb(pointlist);
long e = ssPipe.Length();
if (ssPipe.Length() == 0 && n < nDist) {//2雨水口相连
entNearWellOrGully = entNearGully;
ptNearWellOrGully = ptNearGully;
// zxl 2013.05.29 add
int nType = 0;
bLinkWithGully = true;
AcDbObjectId idGully;
acdbGetObjectId(idGully, entNearWellOrGully);
OPENOBJ_BEGIN(entCurGully, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip)
{
AcDbObjectId id = pEquip->GetBlock2d();
CString sName = GlobalFunc::GetBlkNameById(id);
CString csDwb = g_csDwbPath + _T("TwtSys");
XString xsTmp1;
if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000424"), xsTmp1) != RTNORM) //单蓖
return;
if (sName.Compare(xsTmp1) != 0)
{
nType = 1;
}
}
OPENOBJ_END();
std::map<AcDbObjectId, std::vector<int> >::iterator it = mapEq.find(idGully);
std::vector<int> vecGullyType;
if (it != mapEq.end())
{
vecGullyType = it->second;
vecGullyType.push_back(nType);
it->second = vecGullyType;
}
else
{
vecGullyType.push_back(nType);
mapEq.insert(std::make_pair(idGully, vecGullyType));
}
}
}
}
if (!!entNearWellOrGully) {
OPENOBJ_BEGIN(entNearWellOrGully, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
double dEle = pEquip->GetWellEleDown();
ptCurGullyLoc.z = dEle * 1000;
ptNearWellOrGully.z = dEle * 1000;
}
OPENOBJ_END();
double dDn = 200;// zxl 2013.05.29 add
OPENOBJ_BEGIN(entCurGully, AcDb::kForWrite, CDbEquipment, pEquip);
if (pEquip) {
pEquip->SetLocation(ptCurGullyLoc);
// zxl 2013.05.29 add
AcDbObjectId id = pEquip->GetBlock2d();
CString sName = GlobalFunc::GetBlkNameById(id);
CString csDwb = g_csDwbPath + _T("TwtSys");
XString xsTmp1;
if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000424"), xsTmp1) != RTNORM) //单蓖
return;
bool bSingle = true;
if (sName.Compare(xsTmp1) != 0)
{
bSingle = false;
dDn = 300;
}
}
OPENOBJ_END();
CDbPipe *pNewPipe = new CDbPipe;
pNewPipe->SetStartPoint(ptCurGullyLoc);
pNewPipe->SetEndPoint(ptNearWellOrGully);
// cet 2013.1.4 add 自动修正上华带文字线型的逆向管线
CString sLineType = GlobalFunc::GetLayerLineType(LAY_PIPE_RAIN);
if (sLineType.Find(_T("TG")) > -1)
{
AcGeVector3d vtDir = GlobalFunc::Wcs2Ucs(ptNearWellOrGully) - GlobalFunc::Wcs2Ucs(ptCurGullyLoc);
vtDir.z = 0.0;
double dAngle = (AcGeVector3d::kXAxis).angleTo(vtDir, AcGeVector3d::kZAxis);
if (dAngle > PI / 2 && dAngle < (PI / 2 * 3 + 0.001))
{
pNewPipe->SetStartPoint(ptNearWellOrGully);
pNewPipe->SetEndPoint(ptCurGullyLoc);
}
}
pNewPipe->SetPipeWeight(g_Option::instance().g_nPipeWidth[5]);
pNewPipe->SetSysType(TPipeSys::kRainWater);
pNewPipe->SetModelType(TPipeSys::kModel);
pNewPipe->SetMaterial(12);//钢筋混凝土
// zxl 2013.05.29 modify
// pNewPipe->SetDnDiameter(200);
pNewPipe->SetDnDiameter(dDn);
pNewPipe->SetPipeGradient(0.01);
pNewPipe->setLayer(LAY_PIPE_RAIN);
pNewPipe->setLinetype(GlobalFunc::GetPipeWireLayLineType(LAY_PIPE_RAIN));
pNewPipe->setColor(AcCmColor());
AcDbObjectId id = GlobalFunc::AddToCurrentSpace(pNewPipe, Adesk::kTrue);
if (!bLinkWithGully)
{
vecPipe.push_back(id);
}
bLinkWithGully = false;
}
}
ModifyPipeDn(mapEq, vecPipe);
}
//***************************************************************************************************
// 室外图库
//***************************************************************************************************
void OutLib()
{
InitLayer(LAY_TWT_OUT);
GlobalFunc::PushVarStr clayer(_T("CLAYER"), LAY_TWT_OUT);
XString sLibFile, sTkw;
sLibFile << g_csDwbPath << _T("室外库.TKW");
XString xsTmp = _T("00000001");
//InvokeTkwMan(sLibFile, FALSE, xsTmp);
}
void PoolLib()
{
InitLayer(LAY_TWT_OUT);
GlobalFunc::PushVarStr clayer(_T("CLAYER"), LAY_TWT_OUT);
XString sLibFile, sTkw;
sLibFile << g_csDwbPath << _T("水池库.TKW");
XString xsTmp = _T("00000001");
//InvokeTkwMan(sLibFile, FALSE, xsTmp);
}
//***************************************************************************************************
// 管线交叉检查
//***************************************************************************************************
double GetPipeStartEle(Entity entPipe)
{
double dUnitMeter = 1000;
if (GlobalFunc::DocGetMeterUnitDraw())
dUnitMeter = 1;
OPENOBJ_BEGIN(entPipe, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe) {
AcDbObjectId nodeId1(NULL);
double dn = pPipe->GetDnDiameter();
dn = GlobalFunc::GetPipeOutDByDn(pPipe->GetMaterial(), dn); // cet 2010.3.18 add
dn = dn / 2000;
TPipeSys::FlowDirection dir = pPipe->GetFlowDir();
if (dir == TPipeSys::kFromStart) {
return pPipe->StartPoint().z / dUnitMeter - dn;
}
else {
return pPipe->EndPoint().z / dUnitMeter - dn;
}
}
OPENOBJ_END();
return 0;
}
double GetPipeThick(Entity& ent)
{
double dThick = 0.0;
CDbPipe *pPipe = NULL;
AcDbObjectId ident;
acdbGetObjectId(ident, ent);
double dDn1 = 0.0; // 外径
double dDn2 = 0.0; // 内径
acdbOpenObject(pPipe, ident, AcDb::kForRead);
if (pPipe != NULL)
{
double dDn = pPipe->GetDnDiameter();
int nMat = pPipe->GetMaterial();
dDn1 = GlobalFunc::GetPipeOutDByDn(nMat, dDn);
dDn1 = dDn1 / 1000;
CString strMat = GlobalFunc::GetPipeMaterialByIdx(nMat);
dDn2 = GlobalFunc::GetPipeDjByDn(strMat, (int)dDn);
pPipe->close();
}
dThick = (dDn1 - dDn2) / 2;
return dThick;
}
//***************************************************************************************************
// 污井流量
//***************************************************************************************************
void SetDirtWellQ()
{
double nQ(0);
CString csQ;
RBList rbMask(RTDXF0, _T("AEC_ZT_WELL"), 8, LAY_WELL_DIRT, NULL);
PickSet ss(SS_FREE);
PickSet ssAll(SS_FREE), ssDel(SS_FREE);
ssAll.Get(_T("X"), NULL, NULL, rbMask);
for (long j = 0; j < ssAll.Length(); j++) {
Entity ent = ssAll[j];
csQ = GlobalFunc::ReadXdata(ent, _T("TG-DIRTWELLQ"));
if (csQ != _T("")) {
XPoint ptLoc;
double nScale(0);
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip) {
ptLoc = pEquip->GetLocation();
nScale = pEquip->GetScale();
}
OPENOBJ_END();
XText text(XString(_T("Q=%s(L/S)"), csQ), ptLoc, g_Option::instance().g_nTwtDimHeight * GlobalFunc::DocGetPScale(), g_Option::instance().g_nDimScale, g_Option::instance().g_csTwtDimStyle, LAY_CALC_TEXT);
text.Draw();
Entity entCir2;
entCir2.GetLast();
ssDel += entCir2;
}
}
if (GlobalFunc::SelectEntities(_T("\n请选择污水井:<退出>"), ss, rbMask) != RTNORM) {
ssDel.Erase();
return;
}
ssDel.Erase();
long len = ss.Length();
if (ads_getreal(_T("\n请给出流入污水井的流量(L/S)(注意不包括转输流量)<退出>:"), &nQ) != RTNORM)
return;
csQ.Format(_T("%.2f"), nQ);
for (long i = 0; i < len; i++) {
Entity ent = ss[i];
GlobalFunc::WriteXdata(ent, _T("TG-DIRTWELLQ"), csQ);
}
}
//***************************************************************************************************
// 雨水参数
//***************************************************************************************************
void RainCalcParm()
{
TCHAR szText[256];
if (ads_getstring(0, _T("\n请选择要输入的雨水井参数1:径流系数 2:重现期 3:汇水时间<径流系数>:"), szText) != RTNORM)
return;
RBList rbMask(RTDXF0, _T("AEC_ZT_WELL"), 8, LAY_WELL_RAIN, NULL);
PickSet ss(SS_FREE);
if (_tcsicmp(szText, _T("3")) == 0) {
Entity ent;
if (GlobalFunc::SelectEntity(_T("\n请选择起点雨水井:<退出>"), ent, rbMask) != RTNORM)
return;
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
int num = pEquip->GetInterfaceNum();
if (num != 1) {
g_Option::instance().adsout << _T("\n不是起点井!");
return;
}
}
OPENOBJ_END();
ss += ent;
}
else {
if (GlobalFunc::SelectEntities(_T("\n请选择雨水井:<退出>"), ss, rbMask) != RTNORM)
return;
}
CString csTime, csFactor, csP;
if (_tcsicmp(szText, _T("2")) == 0) {
int iP(0);
if (ads_getint(_T("\n请给出重现期<默认>:"), &iP) == RTNORM) {
if (iP > 0.001) {
csP.Format(_T("%d"), iP);
}
}
}
else if (_tcsicmp(szText, _T("3")) == 0) {
int iTime(0);
if (ads_getint(_T("\n请给出汇水时间(5~15分钟)<默认>:"), &iTime) == RTNORM) {
if (iTime > 0.1) {
csTime.Format(_T("%d"), iTime);
}
}
}
else {
double nFactor(-1);
if (ads_getreal(_T("\n请给出单井径流系数(如:绿地0.15, 沥青路面0.6等))<默认>:"), &nFactor) == RTNORM) {
if (nFactor > 0.001) {
csFactor.Format(_T("%.2f"), nFactor);
}
}
}
for (long i = 0; i < ss.Length(); i++) {
Entity ent = ss[i];
if (csFactor != _T(""))
GlobalFunc::WriteXdata(ent, _T("TG-RAINWELLFACTOR"), csFactor);
if (csP != _T(""))
GlobalFunc::WriteXdata(ent, _T("TG-RAINWELLP"), csP);
if (csTime != _T(""))
GlobalFunc::WriteXdata(ent, _T("TG-WELLTIME"), csTime);
}
}
//***************************************************************************************************
// 汇流面积
//***************************************************************************************************
void UpdateRainWellArea()
{
RBList rbMask2(RTDXF0, _T("AEC_ZT_SPACE"), 8, LAY_CALC_AREA, NULL);
PickSet ss(SS_FREE);
PickSet ssAll(SS_FREE);
ssAll.Get(_T("X"), NULL, NULL, rbMask2);
int len = ssAll.Length();
if (len < 1)
return;
for (long i = 0; i < len; i++)
{
Entity ent = ssAll[i];
//OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbConfluenceArea, pDbSpace);
//if (pDbSpace)
//{
// CString csArea;
// double nArea = pDbSpace->m_nUseArea;
// if (nArea < 1 && GlobalFunc::DocGetMeterUnitDraw())
// nArea = nArea * 1000000;
// csArea.Format(_T("%.2f"), nArea);
// ads_name name;
// acdbGetAdsName(name, pDbSpace->GetWellId());
// Entity entWell = name;
// GlobalFunc::WriteXdata(entWell, _T("TG-WELLAREA"), csArea);
//}
//OPENOBJ_END();
}
}
// zxl 2013.12.18 add
void RemoveWellArea(Entity ent)
{
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AecXDbWell, pEquip);
if (pEquip != NULL)
{
AcDbObjectId idSpace = pEquip->GetSpaceId();
pEquip->SetSpaceId(NULL);
//OPENOBJ_BEGIN(idSpace, AcDb::kForWrite, TDbConfluenceArea, pSpace);
//if (pSpace != NULL)
//{
// pSpace->SetWellId(NULL);
//}
//OPENOBJ_END();
}
OPENOBJ_END();
}
void RemoveAreaWell(Entity &ent)
{
// 如果是旧的TDBSPACE实体,转换为新实体TDBCONFLUENCEAREA
bool bIsNewObj = false;
//OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbConfluenceArea, pArea);
//if (pArea != NULL)
//{
// AcDbObjectId idWell = pArea->GetWellId();
// pArea->SetWellId(NULL);
// OPENOBJ_BEGIN(idWell, AcDb::kForWrite, AecXDbWell, pEquip);
// if (pEquip != NULL)
// {
// pEquip->SetSpaceId(NULL);
// }
// OPENOBJ_END();
// bIsNewObj = true;
//}
//OPENOBJ_END();
if (!bIsNewObj)
{
//OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSpace, pSpace);
//if (pSpace != NULL)
//{
// TDbConfluenceArea *pArea = new TDbConfluenceArea();
// pArea->m_ptLocation = pSpace->m_ptLocation;
// pArea->SetHas3D(FALSE);
// pArea->SetHighlight(TRUE);
// pArea->m_nUseArea = pSpace->m_nUseArea;
// pArea->m_nOccuArea = 0;
// pArea->m_nCeilArea = 0;
// pArea->m_nWallSurfArea = 0;
// pArea->m_nExtWallArea = 0;
// pArea->m_nExtWinArea = 0;
// pArea->m_nExtDoorArea = 0;
// pArea->m_nPerimeter = 0;
// pArea->m_nKickboardLength = 0;
// pArea->SetShowOutline(TRUE);
// pArea->SetTextStyleId(InitTextStyle(g_Option::instance().g_csDimWellStyle));
// AcDbObjectId idArea = pArea->AddToCSpace(Adesk::kFalse);
// pArea->setLayer(InitLayer(LAY_CALC_AREA));
// pArea->m_outline = pSpace->m_outline;
// pArea->m_sName = pSpace->m_sName;
// pArea->SetWellId(NULL);
// pArea->Close();
//}
//OPENOBJ_END();
ent.Erase();
ent.GetLast();
}
}
void ReNewWellArea(Entity entWell, Entity entArea)// 绑定井和汇流面积
{
AcDbObjectId idWell, idArea;
RemoveWellArea(entWell);
RemoveAreaWell(entArea);
acdbGetObjectId(idWell, entWell);
acdbGetObjectId(idArea, entArea);
OPENOBJ_BEGIN(entWell, AcDb::kForWrite, AecXDbWell, pEquip);
if (pEquip != NULL)
{
pEquip->SetSpaceId(idArea);
//OPENOBJ_BEGIN(entArea, AcDb::kForWrite, TDbConfluenceArea, pSpace);
//if (pSpace != NULL)
//{
// pSpace->SetWellId(idWell);
//}
//OPENOBJ_END();
}
OPENOBJ_END();
}
void CopyArea2Well(Entity entWell)
{
GlobalFunc::DocGetPickFirst().Free();
RBList rbMask(RTDXF0, _T("AEC_ZT_SPACE"), 8, LAY_CALC_AREA, NULL);
Entity entSel;
XPoint ptPick;
if (GlobalFunc::SelectEntity(_T("\n请选择要复制的汇流面积:<退出>"), entSel, ptPick, rbMask) == RTNORM)
{
xg_setvar(_T("CMDECHO"), 0);
int nOsMode = 0;
xg_getvar(_T("OSMODE"), &nOsMode);
//if (g_bTgOsnap)
//{
// nOsMode &= ~0x4000;
// nOsMode |= OS_INT | OS_NEA | OS_PER | OS_END | OS_CEN;
//}
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
double dCeltScale = 1;
xg_getvar(_T("CELTSCALE"), &dCeltScale);
PickSet ss(SS_FREE);
ss += entSel;
ads_printf(_T("\n请点取位置点:<退出>"));
ptPick = GlobalFunc::Ucs2Wcs(ptPick);
ADSGePoint3d _pt(GlobalFunc::Wcs2Ucs(ptPick));
int nRet = SHads_command(RTSTR, _T("COPY"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""),
RT3DPOINT, &_pt, RTSTR, PAUSE, 0);
Entity ent;
ent.GetLast();
ReNewWellArea(entWell, ent);
}
}
bool CheckWellArea(Entity entWell)
{
//GlobalFunc::DocGetPickFirst().Free();
//OPENOBJ_BEGIN(entWell, AcDb::kForRead, AecXDbWell, pEquip);
//if (pEquip != NULL)
//{
// AcDbObjectId idSpace = pEquip->GetSpaceId();
// OPENOBJ_BEGIN(idSpace, AcDb::kForRead, TDbSpace, pSpace);
// if (pSpace != NULL)
// {
// XPoly2D poly2d = pSpace->m_outline;
// if ((pEquip->GetInsert() & poly2d) == PR_INSIDE)
// {
// return true;
// }
// }
// OPENOBJ_END();
//}
//OPENOBJ_END();
return false;
}
XPoint GetWellLoction(Entity ent)
{
XPoint ptLoc;
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip != NULL)
{
ptLoc = pEquip->GetInsert();
}
OPENOBJ_END();
return ptLoc;
}
void BindArea2Well(Entity entWell, PickSet ssArea)
{
double dArea = 0.0;
Entity entArea;
int nIndex = 0;
GlobalFunc::DocGetPickFirst().Free();
XPoint ptLoc = GetWellLoction(entWell);
for (long l = 0l; l < ssArea.Length(); l++)
{
Entity ent1 = ssArea[l];
//OPENOBJ_BEGIN(ent1, AcDb::kForRead, TDbSpace, pSpace);
//if (pSpace != NULL)
//{
// XPoly2D poly2d = pSpace->m_outline;
// bool bInSide = (ptLoc & poly2d) == PR_INSIDE ? true : false;
// RBList rbFence;
// for (int i = 0; i < poly2d.Length(); i++)
// {
// XPoint pt = *(poly2d.GetAt(i));
// rbFence.Append(acutBuildList(RTPOINT, &GlobalFunc::Wcs2Ucs(pt), NULL));
// }
// PickSet ss(SS_FREE);
// RBList rbMask(RTDXF0, _T("AEC_ZT_WELL"), 8, LAY_WELL_RAIN, NULL);
// ss.Get(_T("CP"), rbFence, NULL, rbMask);
// int len = 0.0;
// for (long l = 0; l < ss.Length(); l++)
// {
// XPoint pt = GetWellLoction(ss[l]);
// if ((pt & poly2d) == PR_INSIDE)
// {
// len++;
// }
// }
// if (len == 1 && bInSide)// 汇流面积只包含该井
// {
// double dAreaNew = pSpace->m_nUseArea;
// if (nIndex == 0)
// {
// dArea = dAreaNew;
// nIndex++;
// entArea = ent1;
// }
// else if (dArea > dAreaNew)
// {
// dArea = dAreaNew;
// entArea = ent1;
// }
// }
//}
//OPENOBJ_END();
}
if (!!entArea)
{
ReNewWellArea(entWell, entArea);
}
}
void BindArea2Well(PickSet &ss)
{
PickSet ssWell(SS_FREE);
PickSet ssArea(SS_FREE);
for (long l = 0l; l < ss.Length(); l++)
{
Entity ent = ss[l];
if (ent.Is(_T("AEC_ZT_WELL")))
{
ssWell += ent;
}
else
{
ssArea += ent;
}
}
if (ssWell.Length() == 0 || ssArea.Length() == 0)
{
return;
}
else if (ssWell.Length() == 1 && ssArea.Length() == 1)
{
ReNewWellArea(ssWell[0l], ssArea[0l]);
}
else
{
for (long l = 0l; l < ssWell.Length(); l++)
{
Entity ent = ssWell[l];
if (!CheckWellArea(ent))// 未绑定汇流面积或者绑定的汇流面积没有包围井,重新绑定
{
BindArea2Well(ent, ssArea);
}
}
}
}
void RainWellArea()
{
double nArea(0);
CString csArea;
RBList rbMask(RTDXF0, _T("AEC_ZT_WELL"), 8, LAY_WELL_RAIN, NULL);
RBList rbMask2(RTDXF0, _T("AEC_ZT_SPACE"), 8, LAY_CALC_AREA, NULL);
PickSet ss(SS_FREE);
PickSet ssAll(SS_FREE);
ssAll.Get(_T("X"), NULL, NULL, rbMask2);
for (long j = 0; j < ssAll.Length(); j++) {
Entity ent = ssAll[j];
//OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSpace, pSpace);
//if (pSpace) {
// pSpace->SetHighlight(TRUE);
//}
//OPENOBJ_END();
}
int nRet;
TCHAR cKey = _T('\0');
INITGET_BEG(0, _T("G "));
nRet = GlobalFunc::SelectEntities(_T("\n请选择雨水井[关联存在的汇流面积与井(G)]:<退出>"), ss, rbMask, _T("G "), cKey);
INITGET_END();
if (nRet == RTKWORD && cKey == _T('G'))
{
GlobalFunc::DocGetPickFirst().Free();
RBList rbMask3 = ads_buildlist(-4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("AEC_ZT_WELL"), 8, LAY_WELL_RAIN, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("AEC_ZT_SPACE"), 8, LAY_CALC_AREA, -4, _T("and>"),
-4, _T("or>"), NULL);
PickSet ssWellAndArea(SS_FREE);
if (GlobalFunc::SelectEntities(_T("\n请选择需要关联的井和汇流面积<退出>"), ssWellAndArea, rbMask3) != RTNORM)
return;
BindArea2Well(ssWellAndArea);
return;
}
else if (nRet != RTNORM) {
return;
}
long len = ss.Length();
if (len == 1) {
XPoly2D poly2d;
nRet = GetOpenPoly2D2(_T("\n请勾绘封闭汇流面积:"), poly2d);
if (nRet != RTNORM) {
if (poly2d.Length() == 0 && nRet == RTPICKS)// 复制汇流面积
{
CopyArea2Well(ss[0l]);
return;
}
int iRet = ads_getreal(_T("\n请给出单井汇流面积(平方米)<退出>:"), &nArea);
if (iRet != RTNORM)
return;
// zxl 2013.12.18 add
csArea.Format(_T("%.2f"), nArea);
for (long i = 0; i < len; i++)
{
Entity ent = ss[i];
RemoveWellArea(ent);
GlobalFunc::WriteXdata(ent, _T("TG-WELLAREA"), csArea);
}
}
else {
if (!poly2d.IsClosed())
poly2d.SetFlag(1);
XPoint ptLoc;
CString csName;
AcDbObjectId idWell;
OPENOBJ_BEGIN(ss[0L], AcDb::kForWrite, AecXDbWell, pEquip);
if (pEquip) {
ptLoc = pEquip->GetLocation();
csName = pEquip->GetWellName();
// zxl 2013.12.17 del
// double nScale = pEquip->GetScale();
// ads_polar(ptLoc, -PI/2, nScale*2, ptLoc);
idWell = pEquip->id();
}
OPENOBJ_END();
if (!GlobalFunc::DocGetMeterUnitDraw())
nArea = _AS_SQMETER(poly2d.Area());
else
nArea = poly2d.Area();
g_Option::instance().adsout << _T("汇流面积=") << nArea << _T("(平方米)\n");
//TDbConfluenceArea *pDbSpace = new TDbConfluenceArea();
//pDbSpace->m_sName = csName + _T("汇流面积");
//pDbSpace->m_ptLocation = ptLoc;
//pDbSpace->SetHas3D(FALSE);
//pDbSpace->SetHighlight(TRUE);
//pDbSpace->m_outline = poly2d;
//pDbSpace->m_nUseArea = nArea;
//pDbSpace->m_nOccuArea = 0;
//pDbSpace->m_nCeilArea = 0;
//pDbSpace->m_nWallSurfArea = 0;
//pDbSpace->m_nExtWallArea = 0;
//pDbSpace->m_nExtWinArea = 0;
//pDbSpace->m_nExtDoorArea = 0;
//pDbSpace->m_nPerimeter = 0;
//pDbSpace->m_nKickboardLength = 0;
//pDbSpace->SetShowOutline(TRUE);
//pDbSpace->SetTextStyleId(InitTextStyle(g_Option::instance().g_csDimWellStyle));
//pDbSpace->SetTextHeight(g_Option::instance().g_nDimWellHeight);
//AcDbObjectId idSpace = pDbSpace->AddToCSpace(Adesk::kFalse);
//pDbSpace->setLayer(InitLayer(LAY_CALC_AREA));
// zxl 2013.12.18 add
RemoveWellArea(ss[0L]);
//OPENOBJ_BEGIN(idWell, AcDb::kForWrite, AecXDbWell, pEquip);
//if (pEquip != NULL)
//{
// pEquip->SetSpaceId(idSpace);
// pDbSpace->SetWellId(idWell);
//}
//OPENOBJ_END();
//pDbSpace->close();
}
}
else {
int iRet = ads_getreal(_T("\n请给出单井汇流面积(平方米)<退出>:"), &nArea);
if (iRet != RTNORM)
return;
// zxl 2013.12.18 add
csArea.Format(_T("%.2f"), nArea);
for (long i = 0; i < len; i++) {
Entity ent = ss[i];
RemoveWellArea(ent);
GlobalFunc::WriteXdata(ent, _T("TG-WELLAREA"), csArea);
}
}
// zxl 2013.12.18 del
// csArea.Format(_T("%.2f"), nArea);
// for(long i=0;i<len;i++)
// {
// Entity ent = ss[i];
// GlobalFunc::WriteXdata(ent, _T("TG-WELLAREA"), csArea);
// }
}
bool Well2Gully(AecXDbWell *pWell)
{
AcDbObjectId idWell, id;
AcDbEntity *pEnt = NULL;
bool bRet = false;
for (int i = 0; i < pWell->GetInterfaceNum(); i++)
{
CString s = pWell->GetWellName();
CPipeInterface face;
idWell = pWell->id();
face = pWell->GetInterface(i);
CDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, face.m_idPipe, AcDb::kForRead);
if (pPipe != NULL)
{
if (pPipe->GetNode(0) == idWell)
{
id = pPipe->GetNode(1);
}
else
{
id = pPipe->GetNode(0);
}
acdbOpenObject(pEnt, id, AcDb::kForRead);
if (pEnt)
{
CString sLayer = pEnt->layer();
if (sLayer.Compare(LAY_TWT_GULLY) == 0)
{
bRet = true;
}
pEnt->close();
}
pPipe->close();
}
}
return bRet;
}
void GetWellColor(std::map<AcDbObjectId, int> &mapColor, AcDbObjectId id, int iColor)
{
mapColor.insert(std::make_pair(id, iColor));
}
int SetWellColor(AcDbObjectId id, std::map<AcDbObjectId, int> mapColor)
{
std::map<AcDbObjectId, int>::iterator it;
for (it = mapColor.begin(); it != mapColor.end(); it++)
{
if ((*it).first == id)
{
return (*it).second;
}
}
return -1;
}
int GetWellTextColor(AecXDbWell *pWell)
{
int iColor = -1;
pWell->layerId();
AcDbObjectId id = pWell->GetLabelLayer();
iColor = GlobalFunc::GetLayerColor(id);
if (iColor < 0)
{
}
return iColor;
}
void RainWellAreaCmd()
{
// CString csAreaLayer = _T("TWT_汇流面积"); // 8.0发行之前要修改过来
// zxl 2012.03.30 add
RBList rbMask(RTDXF0, _T("AEC_ZT_WELL"), 8, LAY_WELL_RAIN, NULL);
PickSet ssAllWall(SS_FREE);
ssAllWall.Get(_T("X"), NULL, NULL, rbMask);
CString sWallName, sArea;
AcDbObjectId id;
std::map<AcDbObjectId, int> mapColor;
for (long l = 0; l < ssAllWall.Length(); l++) {
Entity ent = ssAllWall[l];
XPoint ptLoc;
double nScale(1), nEle(0);
acdbGetObjectId(id, ent);
sArea = GlobalFunc::ReadXdata(ent, _T("TG-WELLAREA"));
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
if (pEquip->visibility() != AcDb::kInvisible)
{
if (Acad::eOk == pEquip->upgradeOpen())
{
pEquip->SetUpdatable(false);
sWallName = pEquip->GetWellName();
if (!sArea.IsEmpty())
{
sWallName += _T("(");
sWallName += sArea;
sWallName += _T(")");
pEquip->SetWellName(sWallName);
}
else
{
int iColor = GetWellTextColor(pEquip);
GetWellColor(mapColor, id, pEquip->colorIndex());
if (Well2Gully(pEquip))
{
if (iColor == 1)
{
pEquip->setColorIndex(2);
}
else
{
pEquip->setColorIndex(1);
}
}
else
{
if (iColor == 3)
{
pEquip->setColorIndex(6);
}
else
{
pEquip->setColorIndex(3);
}
}
}
pEquip->downgradeOpen();
}
}
}
OPENOBJ_END();
}
GlobalFunc::UpdateGraphic(ssAllWall);
// zxl 2012.03.30 modify
RainWellArea();
// zxl 2012.03.30 add
for (long j = 0; j < ssAllWall.Length(); j++) {
Entity ent = ssAllWall[j];
acdbGetObjectId(id, ent);
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
if (pEquip->visibility() != AcDb::kInvisible)
{
if (Acad::eOk == pEquip->upgradeOpen())
{
sWallName = pEquip->GetWellName();
if (sWallName.Find(_T("(")) > 0)
{
sWallName = sWallName.Left(sWallName.Find(_T("(")));
pEquip->SetWellName(sWallName);
}
pEquip->setColorIndex(SetWellColor(id, mapColor));
pEquip->SetUpdatable(false);
pEquip->downgradeOpen();
}
}
}
OPENOBJ_END();
}
GlobalFunc::UpdateGraphic(ssAllWall);
}
//***************************************************************************************************
// 水表井
//***************************************************************************************************
void InsWaterMeter()
{
CString csDwb = g_csDwbPath + _T("TwtSys");
XString xsTmp;
if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000311"), xsTmp) != RTNORM)
return;
XPoint ptIns;
InitLayer(LAY_TWT_OUT);
xg_getvar(_T("VIEWCTR"), ptIns);
ptIns = GlobalFunc::Ucs2Wcs(ptIns);
g_Option::instance().g_csInsBlkName = xsTmp;
BOOL bRotate(FALSE), bMirror(FALSE);
TBlockEdJig jig(g_Option::instance().g_csInsBlkName, ptIns, 1);
int nOsMode = 0;
double nScale = 3 * GlobalFunc::DocGetPScale() / 100;
if (g_Option::instance().g_bEquipByScale)
nScale = 3;
nOsMode |= OS_INT | OS_NEA | OS_MID;
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
while (1) {
jig.m_nSacle = nScale;
jig.m_bReversal = bMirror;
CString csPrompt, csRotate;
if (bRotate)
csRotate = _T("不旋转");
else
csRotate = _T("旋转");
csPrompt.Format(_T("\n请点取水表井插入点[放大(E)/缩小(D)/左右翻转(F)/%s(R)]<完成>:"), csRotate);
jig.SetPrompt(csPrompt);
jig.SetKeyword(_T("E D F R"));
int nKeyIndex = 0;
int ret = jig.DoIt(&nKeyIndex);
if (ret == RTKWORD) {
if (nKeyIndex == 0)
nScale += 0.5;
else if (nKeyIndex == 1 && jig.m_nSacle > 0.5)
nScale -= 0.5;
else if (nKeyIndex == 2)
bMirror = !bMirror;
else if (nKeyIndex == 3)
bRotate = !bRotate;
continue;
}
else if (ret != RTNORM)
break;
ptIns = jig.GetPickPoint();
CDbEquipment *pEquip = new CDbEquipment;
pEquip->SetBlock2d(GlobalFunc::GetBlockIdFromString(g_Option::instance().g_csInsBlkName));
pEquip->SetHidePipe(TRUE);
pEquip->SetScale(nScale);
pEquip->MirrorByY(bMirror);
pEquip->setLayer(LAY_TWT_OUT);
pEquip->setColor(AcCmColor()); //随层
pEquip->SetLocation(ptIns);
AcDbObjectId id = GlobalFunc::AddToCurrentSpace(pEquip, Adesk::kTrue);
if (bRotate) {
Entity entLast;
entLast.GetLast();
double nRotate(0);
entLast.Rotate(ptIns, &nRotate);
}
}
}
//***************************************************************************************************
// 平面树
//***************************************************************************************************
BOOL InsertBlock2(const TCHAR*szBlkName, XPoint pt, double nScale, double Rotation, const TCHAR* szLayer)
{
InitBlock(szBlkName);
AcDbBlockTable *pBlockTable;
AcDbBlockTableRecord* pRecord;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
if ((pBlockTable->getAt(szBlkName, pRecord, AcDb::kForRead)) != Acad::eOk)
return FALSE;
pBlockTable->close();
AcDbObjectId BlockId;
BlockId = pRecord->objectId();
pRecord->close();
AcDbBlockReference *pBlkRef = new AcDbBlockReference;
pBlkRef->setBlockTableRecord(BlockId);
pBlkRef->setRotation(Rotation);
pBlkRef->setPosition(AcGePoint3d(pt));
pBlkRef->setScaleFactors(nScale);
pBlkRef->setLayer(szLayer);
GlobalFunc::PostToDb(pBlkRef);
pBlkRef->close();
return TRUE;
}
void DrawTreeCmd()
{
int nOsMode = 0;
xg_getvar(_T("OSMODE"), &nOsMode);
nOsMode &= ~0x4000;
nOsMode |= OS_INT | OS_NEA;
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
XPoint ptStart, ptEnd;
Entity entSel;
RBList rbMask = ads_buildlist(-4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("INSERT"), 8, LAY_TWT_TREE, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("AEC_BLOCK_INSERT"), 8, LAY_TWT_OUT, -4, _T("and>"),
-4, _T("or>"), NULL);
PickSet ss(SS_FREE);
ss.Get(_T("X"), NULL, NULL, rbMask);
int ret = -1;
CString csInsBlkName;
if (ss.Length() > 0)
ret = GlobalFunc::SelectEntity(_T("\n请选择图中已有树作为样本树<从图库中选取>"), entSel, rbMask);
if (ret != RTNORM) {
XPoint ptIns;
ads_prompt(_T("\n请在图库中选择一树<确定>"));
xg_getvar(_T("VIEWCTR"), ptIns);
CPoint ptDwgView;
int cvport = 0;
VERIFY(xg_getvar(_T("CVPORT"), &cvport) == RTNORM);
acedCoordFromWorldToPixel(cvport, ptIns, ptDwgView);
acedGetAcadDwgView()->ClientToScreen(&ptDwgView);
CTemporaryResourceOverride vTemp;
CSelectBlkDlg dlg;
dlg.m_staticSlide.m_iRowNum = 4;
dlg.m_staticSlide.m_iColNum = 4;
dlg.m_csTkName = _T("out");
dlg.m_csType = _T("树");
dlg.m_ptBase = ptDwgView;
if (dlg.DoModal() == IDOK) {
CString csRet = dlg.m_staticSlide.m_csCurRecord;
XString xsTKName, xsRocord;
GlobalFunc::SplitSlbName(csRet, xsTKName, xsRocord);
XString xsBlk;
GlobalFunc::LoadDwbBlock(xsTKName, xsRocord, xsBlk);
csInsBlkName = xsBlk;
}
else
return;
}
else {
TCHAR szBlkName[256];
entSel.GetData(2, szBlkName);
csInsBlkName = szBlkName;
}
InitLayer(LAY_TWT_TREE);
GlobalFunc::PushVarStr clayer(_T("CLAYER"), LAY_TWT_TREE);
if (ads_getpoint(NULL, _T("\n请输入起始点<退出>:"), ptStart) != RTNORM) {
return;
}
double nScale(1), nDist(120);
nScale = nScale / 100 * GlobalFunc::DocGetPScale();
nDist = nDist * GlobalFunc::DocGetPScale();
GlobalFunc::InsertBlock((const TCHAR*)csInsBlkName, asPnt3d(ptStart), nScale, nScale, 0, LAY_TWT_TREE);
double nOld = g_Option::instance().g_nSprinklerRadius;
int iMode = 1;
while (1) {
g_Option::instance().g_nSprinklerRadius = 1500;
TWellJig jig(ptStart);
jig.SetKeyword(_T("F S L D"));
CString csPrompt;
if (iMode == 0) {
jig.m_nDist = nDist;
}
else if (iMode == 2) {
jig.SetDist2(nDist);
}
csPrompt.Format(_T("\n请点取插入点[等距布置(F)/任意布置(S)/两点均布(L)/间距(D)]<退出>:"));
jig.SetPrompt(csPrompt);
// jig.SetStartPoint(ptStart);
int nKeyIndex;
int nRetCode = jig.DoIt(&nKeyIndex);
if (nRetCode == RTKWORD) {
if (nKeyIndex == 0) {
iMode = 0;
}
else if (nKeyIndex == 1) {
iMode = 1;
}
else if (nKeyIndex == 2) {
iMode = 2;
}
else if (nKeyIndex == 3) {
ads_getdist(ptStart, _T("\n请输入树的间距<任意>:"), &nDist);
}
continue;
}
else if (nRetCode != RTNORM)
break;
XLine line(ptStart, jig.GetPickPoint(), 1);
ptStart = jig.GetPickPoint();
if (iMode == 2) {
XCurveSegment seg;
seg = line;
XPointList lstPt;
GlobalFunc::GetPointList(seg, nDist, lstPt);
double nRotate = line.Direction();
int len = lstPt.Length();
for (int i = 0; i < len; i++) {
XPoint ptIns = *lstPt[i];
SHads_command(RTSTR, _T(".INSERT"), RTSTR, (const TCHAR*)csInsBlkName, RT3DPOINT, &ptIns,
RTREAL, nScale, RTREAL, nScale, RTREAL, nRotate, NULL);
ptStart = ptIns;
}
}
else
GlobalFunc::InsertBlock((const TCHAR*)csInsBlkName, asPnt3d(ptStart), nScale, nScale, 0, LAY_TWT_TREE);
}
g_Option::instance().g_nSprinklerRadius = nOld;
SHads_command(RTNONE);
return;
}
//***************************************************************************************************
// 改管高程
//***************************************************************************************************
//2007-11-14 修改管的标高,可以连带修改前后管的高程
void ModifyPipeEle()
{
RBList rbMask(RTDXF0, _T("AEC_ZT_PIPE"), 8, GetLayerNames(_T("管线")), NULL);
Entity entMainPipe;
if (GlobalFunc::SelectEntity(_T("\n请选择要修改高程的管线(注意选择点):<退出>"), entMainPipe, rbMask) != RTNORM)
return;
}
//***************************************************************************************************
// 采集高程
//***************************************************************************************************
// 判断实体是否为数据源对象 cet 2011.12.2 add
bool IsNeedDataObj(Entity &ent)
{
AcDbObjectId id;
acdbGetObjectId(id, ent);
AcDbEntity *pEnt = NULL;
acdbOpenObject(pEnt, id, AcDb::kForRead);
CString s = pEnt->isA()->dxfName();
if (ent.Is(_T("TEXT")) || ent.Is(_T("AEC_ZT_TEXT")) || ent.Is(_T("POINT")) || ent.Is(_T("CIRCLE"))
|| ent.Is(_T("INSERT")) || ent.Is(_T("AEC_ZT_ELEVATION")))
{
return true;
}
return false;
}
// 从外部参照中获取数据源 cet 2011.12.2 add
bool GetDataFromExternalBlock(Entity &ent, Entity &entSel)
{
// 从外部参照中选择数据源
ads_name adsent;
ads_point ptResult;
ads_matrix xformres;
resbuf* refstkres = NULL;
int result = acedNEntSelP(_T("\n外部参照!请继续选择外部参照上的数据源<退出>: "), adsent, ptResult, 0, xformres, &refstkres);
if (refstkres != NULL)
ads_relrb(refstkres);
if (result == RTNORM)
{
entSel = adsent;
}
else
{
return false;
}
// 判断数据源是否是需要的实体数据来源, 不是数据源entsel设置为空
if (IsNeedDataObj(entSel))
{
return true;
}
else
{
Entity entNull;
entSel = entNull;
return false;
}
}
// 获得外部参照的转换矩阵
bool GetBlkMat(Entity &ent, AcGeMatrix3d &mat)
{
AcDbBlockReference *pRef = NULL;
AcDbObjectId idRef;
acdbGetObjectId(idRef, ent);
acdbOpenObject(pRef, idRef, AcDb::kForRead);
if (pRef)
{
mat = pRef->blockTransform();
pRef->close();
return true;
}
return false;
}
//2008-02-28 谢真
void CollectElevWell()
{
RBList rbMask(RTDXF0, _T("INSERT,TEXT,POINT,CIRCLE,AEC_DANHTEXT,AEC_BIAOGAOBIAOZHU"), NULL);
Entity entInsert;
if (GlobalFunc::SelectEntity(_T("\n请选择要配置的数据源对象:<退出>"), entInsert, rbMask) != RTNORM)
return;
// cet 2011.12.1 add 支持从外部参照中获取数据源
bool bExternalBlock = false;
Entity entSel;
if (GlobalFunc::IsExternalBlock(entInsert))
{
if (!GetDataFromExternalBlock(entInsert, entSel))
{
if (!entSel)
{
acutPrintf(_T("\n外部参照中选择数据源错误!"));
}
return;
}
bExternalBlock = true;
}
// 获得外部参照转换矩阵
AcGeMatrix3d mat;
if (bExternalBlock && !GetBlkMat(entInsert, mat))
{
return;
}
CTemporaryResourceOverride vTemp;
CSetDataSourceDlg sourceDlg;
sourceDlg.SetSelEntity(entInsert);
// cet 2011.12.2 add
if (bExternalBlock)
{
sourceDlg.SetSelEntity(entSel);
sourceDlg.SetExternalBlk(entInsert);
sourceDlg.SetExternalBlk(bExternalBlock);
sourceDlg.SetExnternalBlkMat(mat);
}
CString sTag;
double dZValue = 0.0; //图块Z坐标值
if (sourceDlg.DoModal() == IDOK)
{
PickSet ss(SS_FREE);
sourceDlg.GetPickSet(ss);
CCollectElevation collect;
collect.SetPickSet(ss);
// cet 2010.5.17 del
// if (sourceDlg.m_nLandForm != 2)
// collect.SetCollectObjectCount(5);
// else
// collect.SetCollectObjectCount(20);
collect.SetLandForm(sourceDlg.m_nLandForm);
// cet 2011.12.2 add
collect.SetExternalBlk(bExternalBlock);
collect.SetExnternalBlkMat(mat);
CString csPrompt;
RBList rbMask = ads_buildlist(-4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("AEC_ZT_WELL"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("AEC_ZT_POOL"), 8, LAY_TWT_OUT, -4, _T("and>"),
-4, _T("or>"), NULL);
PickSet ssAll(SS_FREE);
if (GlobalFunc::SelectEntities(_T("\n请选择需要采集高程的井:<退出>"), ssAll, rbMask) != RTNORM)
return;
// cet 2011.3.25 添加进度条
acedSetStatusBarProgressMeter(_T("计算中..."), 0, ssAll.Length());
for (long j = 0; j < ssAll.Length(); j++)
{
acedSetStatusBarProgressMeterPos(j); // cet 2011.3.25 添加进度条
Entity ent = ssAll[j];
XPoint ptLoc;
double nScale(1), nEle(0);
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip)
{
ptLoc = pEquip->GetLocation();
}
OPENOBJ_END();
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbPool, pPump);
if (pPump) {
ptLoc = pPump->GetLocation();
}
OPENOBJ_END();
//获得高程
int nType = sourceDlg.GetDataSourceType();
// cet 2010.4.16 add
double dEle = 0.0;
bool bRet = true;
bRet = collect.GetSelectPointElevation(ptLoc, entInsert, nType, dEle);
if (bRet)
{
//精确到小数点后三位
CString sTmpEl;
sTmpEl.Format(_T("%.3f"), dEle);
nEle = _tstof(sTmpEl);
//设置高程
AcDbObjectId id;
if (ent.Is(_T("AEC_ZT_WELL")))
{
AecXDbWell *pWell = NULL;
acdbGetObjectId(id, ent);
acdbOpenObject(pWell, id, AcDb::kForWrite);
if (pWell != NULL)
{
pWell->SetWellEleUp(dEle);
pWell->close();
}
}
else if (ent.Is(_T("AEC_ZT_POOL")))
{
CDbPool *pPool = NULL;
acdbGetObjectId(id, ent);
acdbOpenObject(pPool, id, AcDb::kForWrite);
if (pPool != NULL)
{
pPool->SetGroundEle(nEle);
pPool->close();
}
}
}
else
{
CString strTip = _T("\n出错,无法设置标高!");
acutPrintf(strTip);
}
}
acedRestoreStatusBar(); // cet 2011.3.25 添加进度条
GlobalFunc::UpdateGraphic(ssAll);
XPoint ptLow, ptUp;
ssAll.GetExtend(ptLow, ptUp);
GlobalFunc::AssureInCurrentView_New(ptLow, ptUp);
}
else
{
return;
}
}