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

1200 lines
33 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.
// SAmountItem.cpp: implementation of the SAmountItem class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <dbgridsheet.h>
#include <dbequipment.h>
#include <dbpipeValve.h>
#include "TSheetEdJig.h"
#include "tapi.h"
#include "SAmountItem.h"
#include "SSearchPipeList.h"
//#include "arxtools.h"
#include "twtdef.h"
#include "Teldef.h"
#include "dbxrecrd.h"
#include "DbPool.h"
#include "DbWell.h"
#include "DbPump.h"
#include "DbFireExtinguisher.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 统计合并
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DrawPlanTable(DList<SAmountItem> &lstEquipInfo, BOOL bIsDown, double nTextSize, double nTableHeight, AcDbObjectId idTextStyle, int iPrePipeLen)
{
CString csPrompt = _T("点取新表格左上角位置\n");
if(bIsDown)
csPrompt = _T("点取新表格左下角位置\n");
XPoint pt;
int ret = XGetPoint(NULL, csPrompt, pt);
if(ret != RTNORM)
return;
TDbSheet *pSheet = new TDbSheet;
TGridStyle gridStyle;
gridStyle.SetOverrideAll(TRUE);
gridStyle.SetTextHeight(nTextSize);
gridStyle.SetTextStyleId(idTextStyle);
gridStyle.SetHorMode(AcDb::kTextCenter);
gridStyle.SetVerMode(AcDb::kTextVertMid);
gridStyle.SetLineSpaceFactor(0.2);
gridStyle.SetTextWrap(FALSE);
pSheet->SetGridStyle(gridStyle);
pSheet->SetRowHeight(nTableHeight);
pSheet->InitSheet(lstEquipInfo.Length()+1, 7, nTableHeight, 50);
TSheetColumn column;
column.SetWidth(12); //序号
pSheet->SetColumnAt(0, column);
column.SetWidth(14); //图例
pSheet->SetColumnAt(1, column);
column.SetWidth(43); //名称
pSheet->SetColumnAt(2, column);
column.SetWidth(43); //规格
pSheet->SetColumnAt(3, column);
column.SetWidth(12); //单位
pSheet->SetColumnAt(4, column);
column.SetWidth(15); //数量
pSheet->SetColumnAt(5, column);
column.SetWidth(41); //备注
pSheet->SetColumnAt(6, column);
int FirstRow = 0;
if(bIsDown)
FirstRow = lstEquipInfo.Length();
TGridCell &cell=*(*pSheet)(FirstRow, 0);
cell.SetText(_T("序号"));
TGridCell &cell2=*(*pSheet)(FirstRow, 1);
cell2.SetText(_T("图例"));
TGridCell &cell3=*(*pSheet)(FirstRow, 2);
cell3.SetText(_T("名称"));
TGridCell &cell4=*(*pSheet)(FirstRow, 3);
cell4.SetText(_T("规格"));
TGridCell &cell5=*(*pSheet)(FirstRow, 4);
cell5.SetText(_T("单位"));
TGridCell &cell6=*(*pSheet)(FirstRow, 5);
cell6.SetText(_T("数量"));
TGridCell &cell7=*(*pSheet)(FirstRow, 6);
cell7.SetText(_T("备注"));
pSheet->SetLocation(Ucs2Wcs(pt));
XPoint ptex = pSheet->GetExtents(FALSE);
int len = lstEquipInfo.Length();
int index(0);
for(int i=0;i<len;i++){
int j = i, index = i + 1;
if(bIsDown){
index = lstEquipInfo.Length() - j;
}
else
j = i + 1;
TGridCell &Cell=*(*pSheet)(j, 0);
XString xsIndex(_T("%d"), index);
Cell.SetText(xsIndex);
CString csBlk = lstEquipInfo[i]->m_csBlkName;
if(csBlk != _T("") && csBlk != _T("*")){
TCellBlockInsert blk;
if(lstEquipInfo[i]->m_csAttribText != _T("")){ //有属性字
TAttribValue *pAttrib = new TAttribValue();
pAttrib->m_sName = _T("$TEXT$");
pAttrib->m_sValue = lstEquipInfo[i]->m_csAttribText;
blk.m_lstAttribs.Append(pAttrib);
}
blk.m_sBlockName = csBlk;
blk.m_nControlFlag = CBF_AUTOSIZE | CBF_UNISCALE | CBF_SHOW_ATTR | CBF_EQUAL_SIDE;
XString xsBlk;
blk.OutputDesc(xsBlk);
TGridCell &Cell1=*(*pSheet)(j, 1);
Cell1.SetText(xsBlk);
}
TGridCell &Cell2=*(*pSheet)(j, 2);
Cell2.SetText(lstEquipInfo[i]->m_csName);
TGridCell &Cell3=*(*pSheet)(j, 3);
Cell3.SetText(lstEquipInfo[i]->m_csSpec);
TGridCell &Cell4=*(*pSheet)(j, 4);
Cell4.SetText(lstEquipInfo[i]->m_csUnit);
TGridCell &Cell5=*(*pSheet)(j, 5);
if(iPrePipeLen < 0 || lstEquipInfo[i]->m_csUnit != _T("米"))
Cell5.SetText(XString(_T("%.0f"), lstEquipInfo[i]->m_nNum));
else
{
CString sHead,sFormat,csNum;
sHead.Format(_T("%d"), iPrePipeLen);
sFormat = _T("%.") + sHead + _T("f");
csNum.Format(sFormat, lstEquipInfo[i]->m_nNum);
Cell5.SetText(csNum);
}
TGridCell &Cell6=*(*pSheet)(j, 6);
Cell6.SetText(lstEquipInfo[i]->m_csDemo);
}
if(bIsDown){
pt.y += (ptex.y*DocGetPScale());
pSheet->SetLocation(pt);
}
pSheet->AddToCSpace(TRUE);
}
//判断2个用户图块,虽然后缀机器名不一样,但内容一样,系统认为他们是同一设备
//判断标准:包含图元数量一致,外包一致
BOOL IsSameBlk(CString csBlk1, CString csBlk2)
{
BOOL bRet = FALSE;
AcDbObjectId id1 = GetBlockIdFromString(csBlk1);
AcDbObjectId id2 = GetBlockIdFromString(csBlk2);
int len1(0), len2(0);
AcDbExtents extAll1, extAll2;
OPENOBJ_BEGIN(id1, AcDb::kForRead, AcDbBlockTableRecord, pRec);
if(pRec){
AcDbBlockTableRecordIterator *pIterator = NULL;
pRec->newIterator(pIterator);
for(pIterator->start(); !pIterator->done(); pIterator->step()){
len1++;
AcDbEntity *pEnt = NULL;
pIterator->getEntity(pEnt, AcDb::kForRead);
if(pEnt != NULL){
AcDbExtents ext;
pEnt->getGeomExtents(ext);
extAll1.addExt(ext);
pEnt->close();
}
}
}
OPENOBJ_END();
OPENOBJ_BEGIN(id2, AcDb::kForRead, AcDbBlockTableRecord, pRec);
if(pRec){
AcDbBlockTableRecordIterator *pIterator = NULL;
pRec->newIterator(pIterator);
for(pIterator->start(); !pIterator->done(); pIterator->step()){
len2++;
AcDbEntity *pEnt = NULL;
pIterator->getEntity(pEnt, AcDb::kForRead);
if(pEnt != NULL){
AcDbExtents ext;
pEnt->getGeomExtents(ext);
extAll2.addExt(ext);
pEnt->close();
}
}
}
OPENOBJ_END();
if(len1 == len2){
if(extAll1.maxPoint() == extAll2.maxPoint() && extAll1.minPoint() == extAll2.minPoint())
bRet = TRUE;
}
return bRet;
}
void MergeCountSheet()
{
RBList rbMask(RTDXF0, _T("ATS_SHEET"), NULL);
Entity entFirst, entLast;
PickSet ss(SS_FREE);
if(SelectEntities(_T("\n请选择要合并的上华统计表格:<退出>"), ss, rbMask) != RTNORM)
return;
if(ss.Length() < 2)
return;
BOOL bIsDown;
int iPrePipeLen = -1;
DList<SAmountItem> lstEquipInfo, lstSort;
double nTextSize(5), nTableHeight(7);
AcDbObjectId idTextStyle;
long len = ss.Length();
for(long j=0;j<len;j++){
Entity ent = ss[j];
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbSheet, pSheet);
if(pSheet){
if(j==0){
TGridStyle style = pSheet->GetGridStyle();
nTextSize = style.GetTextHeight();
nTableHeight = pSheet->GetRowHeight();
idTextStyle = style.GetTextStyleId();
}
int nColnum = pSheet->GetColumnNum();
int nRownum = pSheet->GetRowNum();
if(nColnum != 7){
AfxMessageBox(_T("不是上华统计表"));
return;
}
for(int i=0;i<nRownum;i++){
TGridCell &cell1=*(*pSheet)(i, 0);
CString csIndex = cell1.GetText();
TGridCell &cell2=*(*pSheet)(i, 1);
CString csBlk = cell2.GetText();
TGridCell &cell3=*(*pSheet)(i, 2);
CString csName = cell3.GetText();
TGridCell &cell4=*(*pSheet)(i, 3);
CString csSpec = cell4.GetText();
TGridCell &cell5=*(*pSheet)(i, 4);
CString csUnit = cell5.GetText();
TGridCell &cell6=*(*pSheet)(i, 5);
CString csNum = cell6.GetText();
TGridCell &cell7=*(*pSheet)(i, 6);
CString csDemo = cell7.GetText();
TCellBlockInsert blk;
blk.ParserDesc(csBlk);
CString csBlkName = (const TCHAR*)blk.m_sBlockName;
CString csAttrib;
if(csBlkName != _T("") && blk.m_lstAttribs.Length() > 0)
csAttrib = blk.m_lstAttribs[0]->m_sValue;
int iType = 0;
if(csUnit == _T("米"))
iType = 0;
else if(csUnit == _T("个") && csBlkName != _T(""))
iType = 1;
else if(csUnit == _T("个") && csBlkName == _T(""))
iType = 5;
else if(csUnit == _T("盏") && csBlkName != _T(""))
iType = 2;
else if(csUnit == _T("台") && csBlkName != _T(""))
iType = 3;
if(iPrePipeLen < 0 && csUnit == _T("米"))//获得管线(导线)长度精度
{
int idx = csNum.Find(_T("."));
if(idx > -1)
iPrePipeLen = csNum.GetLength() - idx - 1;
}
SAmountItem* pListItem = new SAmountItem(iType, csBlkName, csName, csSpec, csUnit, _tstof(csNum), csDemo);
pListItem->m_csAttribText = csAttrib;
if(csIndex == _T("序号") && csBlk == _T("图例") && csName == _T("名称") && csDemo == _T("备注")
&& csSpec == _T("规格") && csUnit == _T("单位") && csNum == _T("数量"))
{
if(j != 0)//只检查第一个表格
continue;
if(i == 0)
bIsDown = FALSE;
else if(i == (nRownum -1))
bIsDown = TRUE;
else{
AfxMessageBox(_T("不是上华统计表"));
return;
}
continue;
}
BOOL bIsUser = FALSE;
CString csBlk1;
if(csBlkName.Find(_T("_U")) > -1 && csBlkName.Find(_T("(")) > -1)
{//检查用户图块
bIsUser = TRUE;
int idx1 = csBlkName.Find(_T("("));
csBlk1 = csBlkName.Left(idx1);
}
int iLength = lstEquipInfo.Length();
int iIndex = -1;
for(int j=0;j<iLength;j++)
{
if((lstEquipInfo[j]->m_csName == csName)
&& (lstEquipInfo[j]->m_csBlkName == csBlkName)
&& (lstEquipInfo[j]->m_csAttribText == csAttrib)
&& (lstEquipInfo[j]->m_csSpec == csSpec))
{
iIndex = j;
break;
}
else if(bIsUser && lstEquipInfo[j]->m_csBlkName.Find(_T("_U")) > -1
&& lstEquipInfo[j]->m_csBlkName.Find(_T("(")) > -1)
{ //仅仅图块名不同,看看是不是用户自定义图块
CString csBlk2;
int idx2 = lstEquipInfo[j]->m_csBlkName.Find(_T("("));
csBlk2 = lstEquipInfo[j]->m_csBlkName.Left(idx2);
if(_tcsicmp(csBlk1, csBlk2) == 0)
{
if(IsSameBlk(lstEquipInfo[j]->m_csBlkName, csBlkName)){
iIndex = j;
break;
}
}
}
}
if(iIndex > -1){
lstEquipInfo[iIndex]->m_nNum += _tstof(csNum);
delete pListItem;
}
else{
lstEquipInfo.Append(pListItem);
}
}
}
OPENOBJ_END();
}
lstEquipInfo.QuickSort(SAmountItem::SortByItem);
DrawPlanTable(lstEquipInfo, bIsDown, nTextSize, nTableHeight, idTextStyle, iPrePipeLen);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 统计查询
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 获得备注 cet 2011.11.30 add
BOOL GetLayerReMark(const TCHAR *szLayer, CString &sRemark)
{
sRemark.Empty();
XString fullFile;
if(FindFile(_T("LAYERDEF.DAT"), fullFile))
{
FILE *fp=fopen(_AS(fullFile), "r");
if(!fp)
return FALSE;
while(!feof(fp))
{
char sBuf[256]="";
TCHAR eName[256]=_T(""),sTemp[256]=_T("");
fgets(sBuf, 255, fp);
if(sBuf[0])
{
CT_strnth(TString(sBuf), 2, eName);
}
if (_tcscmp(eName, szLayer) == 0)
{
CT_strnth(TString(sBuf), 5, sTemp);
sRemark = sTemp;
break;
}
}
fclose(fp);
}
else
return FALSE;
return TRUE;
}
void GetLayerPipeName(std::map<CString, CString> &mapLayerPipeName)
{
CString sTemp;
if(GetLayerReMark(LAY_PIPE_COAGULATE, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_COAGULATE, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_COAGULATE, CString(_T("凝结"))));
}
if(GetLayerReMark(LAY_PIPE_DRINK, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_DRINK, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_DRINK, CString(_T("直饮"))));
}
if(GetLayerReMark(LAY_PIPE_PRESSDIRT, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_PRESSDIRT, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_PRESSDIRT, CString(_T("压力污"))));
}
if(GetLayerReMark(LAY_PIPE_PRESSUSELESS, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_PRESSUSELESS, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_PRESSUSELESS, CString(_T("压力废"))));
}
if(GetLayerReMark(LAY_PIPE_PRESSRAIN, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_PRESSRAIN, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_PRESSRAIN, CString(_T("压力雨"))));
}
if(GetLayerReMark(LAY_PIPE_USER1, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER1, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER1, CString(_T("用户1管线"))));
}
if(GetLayerReMark(LAY_PIPE_USER2, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER2, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER2, CString(_T("用户2管线"))));
}
if(GetLayerReMark(LAY_PIPE_USER3, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER3, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER3, CString(_T("用户3管线"))));
}
if(GetLayerReMark(LAY_PIPE_USER4, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER4, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER4, CString(_T("用户4管线"))));
}
if(GetLayerReMark(LAY_PIPE_USER5, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER5, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER5, CString(_T("用户5管线"))));
}
if(GetLayerReMark(LAY_PIPE_USER6, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER6, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER6, CString(_T("用户6管线"))));
}
if(GetLayerReMark(LAY_PIPE_USER7, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER7, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER7, CString(_T("用户7管线"))));
}
if(GetLayerReMark(LAY_PIPE_USER8, sTemp) && !sTemp.IsEmpty())
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER8, sTemp + _T("管线")));
}
else
{
mapLayerPipeName.insert(std::make_pair(LAY_PIPE_USER8, CString(_T("用户8管线"))));
}
}
void GetPipeLayNameBySheet(CString csSheetName, CString &csPipeLay, CString &csVPipeLay)
{
if(csSheetName == _T("给水管线"))
{
csPipeLay = LAY_PIPE_FEED;
csVPipeLay = LAY_VPIPE_FEED;
}
else if(csSheetName == _T("给水中区管线"))
{
csPipeLay = LAY_PIPE_FEED2;
csVPipeLay = LAY_VPIPE_FEED2;
}
else if(csSheetName == _T("给水高区管线"))
{
csPipeLay = LAY_PIPE_FEED3;
csVPipeLay = LAY_VPIPE_FEED3;
}
else if(csSheetName == _T("喷淋管线"))
{
csPipeLay = LAY_PIPE_SPRINKLE;
csVPipeLay = LAY_VPIPE_SPRINKLE;
}
else if(csSheetName == _T("喷淋中区管线"))
{
csPipeLay = LAY_PIPE_SPRINKLE2;
csVPipeLay = LAY_VPIPE_SPRINKLE2;
}
else if(csSheetName == _T("喷淋高区管线"))
{
csPipeLay = LAY_PIPE_SPRINKLE3;
csVPipeLay = LAY_VPIPE_SPRINKLE3;
}
else if(csSheetName == _T("热回水管线"))
{
csPipeLay = LAY_PIPE_HEADBACK;
csVPipeLay = LAY_VPIPE_HEADBACK;
}
else if(csSheetName == _T("热回水中区管线"))
{
csPipeLay = LAY_PIPE_HEADBACK2;
csVPipeLay = LAY_VPIPE_HEADBACK2;
}
else if(csSheetName == _T("热回水高区管线"))
{
csPipeLay = LAY_PIPE_HEADBACK3;
csVPipeLay = LAY_VPIPE_HEADBACK3;
}
else if(csSheetName == _T("热给水管线"))
{
csPipeLay = LAY_PIPE_HEADFEED;
csVPipeLay = LAY_VPIPE_HEADFEED;
}
else if(csSheetName == _T("热给水中区管线"))
{
csPipeLay = LAY_PIPE_HEADFEED2;
csVPipeLay = LAY_VPIPE_HEADFEED2;
}
else if(csSheetName == _T("热给水高区管线"))
{
csPipeLay = LAY_PIPE_HEADFEED3;
csVPipeLay = LAY_VPIPE_HEADFEED3;
}
else if(csSheetName == _T("中水管线"))
{
csPipeLay = LAY_PIPE_USED;
csVPipeLay = LAY_VPIPE_USED;
}
else if(csSheetName == _T("中水中区管线"))
{
csPipeLay = LAY_PIPE_USED2;
csVPipeLay = LAY_VPIPE_USED2;
}
else if(csSheetName == _T("中水高区管线"))
{
csPipeLay = LAY_PIPE_USED3;
csVPipeLay = LAY_VPIPE_USED3;
}
else if(csSheetName == _T("消防管线"))
{
csPipeLay = LAY_PIPE_FIRE;
csVPipeLay = LAY_VPIPE_FIRE;
}
else if(csSheetName == _T("消防中区管线"))
{
csPipeLay = LAY_PIPE_FIRE2;
csVPipeLay = LAY_VPIPE_FIRE2;
}
else if(csSheetName == _T("消防高区管线"))
{
csPipeLay = LAY_PIPE_FIRE3;
csVPipeLay = LAY_VPIPE_FIRE3;
}
else if(csSheetName == _T("废水管线"))
{
csPipeLay = LAY_PIPE_USELESS;
csVPipeLay = LAY_VPIPE_USELESS;
}
else if(csSheetName == _T("污水管线"))
{
csPipeLay = LAY_PIPE_DIRT;
csVPipeLay = LAY_VPIPE_DIRT;
}
else if(csSheetName == _T("雨水管线"))
{
csPipeLay = LAY_PIPE_RAIN;
csVPipeLay = LAY_VPIPE_RAIN;
}
else if(csSheetName == _T("其它管线"))
{
csPipeLay = LAY_PIPE_OTHER;
csVPipeLay = LAY_VPIPE_OTHER;
}
else // cet 2012.9.19 add 其他13类管线
{
std::map<CString,CString> mapPipe;
GetLayerPipeName(mapPipe);
std::map<CString,CString>::iterator it;
for (it = mapPipe.begin(); it != mapPipe.end(); it++)
{
if (it->second == csSheetName)
{
break;
}
}
if (it != mapPipe.end())
{
CString sPipeLayer = it->first;
if (sPipeLayer == LAY_PIPE_COAGULATE)
{
csPipeLay = LAY_PIPE_COAGULATE;
csVPipeLay = LAY_VPIPE_COAGULATE;
}
else if (sPipeLayer == LAY_PIPE_DRINK)
{
csPipeLay = LAY_PIPE_DRINK;
csVPipeLay = LAY_VPIPE_DRINK;
}
else if (sPipeLayer == LAY_PIPE_PRESSDIRT)
{
csPipeLay = LAY_PIPE_PRESSDIRT;
csVPipeLay = LAY_VPIPE_PRESSDIRT;
}
else if (sPipeLayer == LAY_PIPE_PRESSUSELESS)
{
csPipeLay = LAY_PIPE_PRESSUSELESS;
csVPipeLay = LAY_VPIPE_PRESSUSELESS;
}
else if (sPipeLayer == LAY_PIPE_PRESSRAIN)
{
csPipeLay = LAY_PIPE_PRESSRAIN;
csVPipeLay = LAY_VPIPE_PRESSRAIN;
}
else if (sPipeLayer == LAY_PIPE_USER1)
{
csPipeLay = LAY_PIPE_USER1;
csVPipeLay = LAY_VPIPE_USER1;
}
else if (sPipeLayer == LAY_PIPE_USER2)
{
csPipeLay = LAY_PIPE_USER2;
csVPipeLay = LAY_VPIPE_USER2;
}
else if (sPipeLayer == LAY_PIPE_USER3)
{
csPipeLay = LAY_PIPE_USER3;
csVPipeLay = LAY_VPIPE_USER3;
}
else if (sPipeLayer == LAY_PIPE_USER4)
{
csPipeLay = LAY_PIPE_USER4;
csVPipeLay = LAY_VPIPE_USER4;
}
else if (sPipeLayer == LAY_PIPE_USER5)
{
csPipeLay = LAY_PIPE_USER5;
csVPipeLay = LAY_VPIPE_USER5;
}
else if (sPipeLayer == LAY_PIPE_USER6)
{
csPipeLay = LAY_PIPE_USER6;
csVPipeLay = LAY_VPIPE_USER6;
}
else if (sPipeLayer == LAY_PIPE_USER7)
{
csPipeLay = LAY_PIPE_USER7;
csVPipeLay = LAY_VPIPE_USER7;
}
else if (sPipeLayer == LAY_PIPE_USER8)
{
csPipeLay = LAY_PIPE_USER8;
csVPipeLay = LAY_VPIPE_USER8;
}
}
}
}
// cet 2012.9.18 add 从实体扩展字典中读取实体id
void ReadXDataFromEntity(const AcDbObjectId &idEnt, PickSet &ss, const CString &sXRecordName = _T("XdPickset"))
{
AcDbEntity *pEnt = NULL;
acdbOpenObject(pEnt, idEnt, AcDb::kForRead);
if (pEnt == NULL)
{
return;
}
// 获取扩展字典
AcDbObjectId idDict = pEnt->extensionDictionary();
pEnt->close();
// 打开扩展字典,获得扩展记录
AcDbDictionary *pDict = NULL;
acdbOpenObject(pDict, idDict, AcDb::kForRead);
if (pDict == NULL)
{
return;
}
AcDbXrecord *pXd = NULL;
pDict->getAt(sXRecordName, (AcDbObject *&)pXd, AcDb::kForRead);
pDict->close();
if (pXd == NULL)
{
return;
}
struct resbuf *pBuf = NULL;
pXd->rbChain(&pBuf);
pXd->close();
if (pBuf != NULL)
{
struct resbuf *pTemp = pBuf;
AcDbObjectId id;
while(pTemp != NULL)
{
if (pTemp->restype == AcDb::kDxfSoftPointerId)
{
// 排除无效实体id(如已被删除的实体)
acdbGetObjectId(id, pTemp->resval.rlname);
if(!id.isValid())
{
pTemp = pTemp->rbnext;
continue;
}
Entity ent(pTemp->resval.rlname);
ss += ent;
pTemp = pTemp->rbnext;
continue;
}
break;
}
acutRelRb(pBuf);
}
}
//void SelectPipeBySpec(CString csMat, CString csSpec, CString csLayName) cet 2012.9.18 modify
void SelectPipeBySpec(const AcDbObjectId &idSheet, CString csMat, CString csSpec, CString csLayName)
{
/* cet 2012.9.18 modify 从扩展字典中读取实体
g_ssPickFirst.Free();
RBList rbMask(RTDXF0, _T("ATS_PIPE"), NULL);
PickSet ssAll(SS_FREE), ssPipe(SS_FREE);
ssAll.Get(_T("X"), NULL, NULL, rbMask);
*/
PickSet ssAll(SS_FREE), ssPipe(SS_FREE);
ReadXDataFromEntity(idSheet, ssAll);
if(ssAll.Length() == 0)
{
g_ssPickFirst.Free();
RBList rbMask(RTDXF0, _T("ATS_PIPE"), NULL);
ssAll.Get(_T("X"), NULL, NULL, rbMask);
}
CString csPipeLay, csVPipeLay;
GetPipeLayNameBySheet(csLayName, csPipeLay, csVPipeLay);
long len = ssAll.Length();
for(long i=0;i<len;i++){
Entity ent = ssAll[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe);
if(pPipe) {
int iMaterial = pPipe->GetMaterial();
CString csMat2 = GetPipeMaterialByIdx(iMaterial);
if(csMat2 == csMat){
int iDn = (int)pPipe->GetDnDiameter();
CString csLable = pPipe->GetLabel();
CString csDn;
csDn.Format(_T("%s%d"), csLable, iDn);
if(csSpec == csDn)
{
if(csLayName == _T(""))
ssPipe += ent;
else
{
TCHAR szLayer[256];
ent.GetData(8, szLayer);
if(_tcsicmp(szLayer, csPipeLay) == 0 || _tcsicmp(szLayer, csVPipeLay) == 0)
ssPipe += ent;
}
}
}
}
OPENOBJ_END();
}
adsout << _T("\n总共选中了") << int(ssPipe.Length()) << _T("根管线");
ads_sssetfirst(ssPipe, ssPipe);
}
//void SelectBlkByName(CString csBlkName) cet 2012.9.18 modify
//void SelectBlkByName(const AcDbObjectId &idSheet, CString csBlkName)
void SelectBlkByName(const AcDbObjectId &idSheet, CString csBlkName, const CString &csSpec, const CString &sName)
{
/* cet 2012.9.18 modify 从扩展字典中读取实体
g_ssPickFirst.Free();
RBList rbMask = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("INSERT"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_EQUIPMENT"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_PIPEVALVE"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_WELL"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_PUMP"), -4, _T("and>"),
-4, _T("or>"), NULL);
PickSet ssAll(SS_FREE), ssSel(SS_FREE);
ssAll.Get(_T("X"), NULL, NULL, rbMask);
*/
PickSet ssAll(SS_FREE), ssSel(SS_FREE);
ReadXDataFromEntity(idSheet, ssAll);
if(ssAll.Length() == 0)
{
g_ssPickFirst.Free();
RBList rbMask = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("INSERT"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_EQUIPMENT"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_PIPEVALVE"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_WELL"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_PUMP"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_POOL"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_FIRE_EXTINGUISHER"), -4, _T("and>"), // cet 2014.9.4 add 灭火器
-4, _T("or>"), NULL);
ssAll.Get(_T("X"), NULL, NULL, rbMask);
}
long len = ssAll.Length();
for(long i=0;i<len;i++){
Entity ent = ssAll[i];
if(ent.Is(_T("INSERT"))){
TCHAR szBlkName[256];
ent.GetData(2, szBlkName);
if(_tcsicmp((const TCHAR*)csBlkName, szBlkName) == 0){
ssSel += ent;
}
}
else if (ent.Is(_T("ATS_EQUIPMENT"))){
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbEquipment, pEquip);
if(pEquip) {
AcDbObjectId idBlk = pEquip->GetBlock2d();
CString csName = GetSymbolName(idBlk);
if(_tcsicmp((const TCHAR*)csBlkName, (const TCHAR*)csName) == 0){
ssSel += ent;
}
else
{
// zxl 2012.09.19 add
CString csNodeSpec;
double dX = pEquip->GetScale();
double dY = pEquip->GetYScale();
if(dX > 10 && dY > 10)
{
csNodeSpec.Format(_T("%.0f*%.0f"), dX, dY);
}
if(_tcsicmp((const TCHAR*)csName, _T("$TwtSys$00000125")) == 0) //喷淋头
{
if(_tcsicmp((const TCHAR*)csBlkName, _T("$TwtSys$00000283")) == 0 && !pEquip->IsHidePipe())
{
ssSel += ent;//下喷
}
else if(_tcsicmp((const TCHAR*)csBlkName, _T("$TwtSys$00000443")) == 0 && pEquip->IsHidePipe())
{
ssSel += ent;//上喷
}
}
else if(_tcsicmp((const TCHAR*)csName, _T("$TwtSys$00000128")) == 0) //上下喷头
{
if(_tcsicmp((const TCHAR*)csBlkName, _T("$TwtSys$00000444")) == 0)
{
ssSel += ent;
}
}
else if (_tcsicmp((const TCHAR*)csName, _T("$TwtSys$00000172")) == 0)//淋浴头 zxl 2012.09.19 add
{
if (_tcsicmp((const TCHAR*)csBlkName, _T("$TwtSys$00000017")) == 0)
{
ssSel += ent;
}
}
else if (_tcsicmp((const TCHAR*)csName, _T("$TwtSys$00000225")) == 0)//给水点 zxl 2012.09.19 add
{
if (_tcsicmp((const TCHAR*)csBlkName, _T("$TwtSys$00000297")) == 0)
{
ssSel += ent;
}
}
else if (pEquip->IsHydrant() && csNodeSpec.Compare(csSpec) == 0)// 支持消火栓 zxl 2012.09.19 add
{
if (_tcsicmp((const TCHAR*)csName, _T("$TwtSys$00000434")) == 0)
{
if (_tcsicmp((const TCHAR*)csBlkName, _T("$TwtSys$00000427")) == 0)
{
ssSel += ent;
}
}
else if (_tcsicmp((const TCHAR*)csName, _T("$TwtSys$00000435")) == 0)
{
if (_tcsicmp((const TCHAR*)csBlkName, _T("$TwtSys$00000421")) == 0)
{
ssSel += ent;
}
}
}
}
}
OPENOBJ_END();
}
else if (ent.Is(_T("ATS_PIPEVALVE")))
{
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipeValve, pEquip);
if(pEquip) {
AcDbObjectId idBlk = pEquip->GetBlock2d();
CString csName = GetSymbolName(idBlk);
// cet 2014.5.5 modify
// if(_tcsicmp((const TCHAR*)csBlkName, (const TCHAR*)csName) == 0){
// ssSel += ent;
// }
if (csName != csBlkName)
{
continue;
}
CString sValveSpec;
AcDbObjectId idPipe = pEquip->GetPipeId();
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, idPipe, AcDb::kForRead);
if (pPipe != NULL)
{
double dDn = pPipe->GetDnDiameter();
CString sLabel = pPipe->GetLabel();
sValveSpec.Format(_T("%s%.0f"), sLabel, dDn);
pPipe->close();
}
if (sValveSpec == csSpec)
{
ssSel += ent;
}
}
OPENOBJ_END();
}
else if (ent.Is(_T("ATS_POOL"))) // cet 2012.9.19 add
{
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPool, pPool);
if(pPool != NULL)
{
const int nScale = DocGetMeterUnitDraw() ? 1000 : 1;
int dWidth = pPool->GetPoolWidth() * nScale;
int dLength = pPool->GetPoolLength() * nScale;
CString sPoolSpec;
sPoolSpec.Format(_T("%d*%d"), dLength, dWidth);
AcDbObjectId idBlk = pPool->GetBlock2d();
CString csName = GetSymbolName(idBlk);
if(_tcsicmp((const TCHAR*)csBlkName, (const TCHAR*)csName) == 0 && sPoolSpec.Compare(csSpec) == 0)
{
ssSel += ent;
}
}
OPENOBJ_END();
}
else if (ent.Is(_T("ATS_WELL"))) // cet 2012.9.20 add
{
// cet 2013.1.23 modify 支持方检查井
// CString sWellRadius = ReadXdata(ent, _T("TG-WELL-RADIUS"));
// CString sWellSpec;
// sWellSpec.Format(_T("Φ %.0f"), _tstof(sWellRadius));
// OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbWell, pWell);
// if(pWell != NULL)
// {
// CString sWellName = _T("检查井"), sWellLayer;
// TCHAR *pLayer = pWell->layer();
// sWellLayer = pLayer;
// delete pLayer;
// pLayer = NULL;
// if (sWellLayer.CompareNoCase(LAY_WELL_RAIN) == 0)
// {
// sWellName = _T("雨水检查井");
// }
// else if (sWellLayer.CompareNoCase(LAY_WELL_DIRT) == 0)
// {
// sWellName = _T("污水检查井");
// }
//
// AcDbObjectId idBlk = pWell->GetBlock2d();
// CString csName = GetSymbolName(idBlk);
// if((_tcsicmp((const TCHAR*)csBlkName, (const TCHAR*)csName) == 0) &&
// (sWellSpec.Compare(csSpec) == 0) &&
// sWellName.Compare(sName) == 0)
// {
// ssSel += ent;
// }
// }
// OPENOBJ_END();
int nItem(0);
CString sWellBlkName, sWellDesName;
AcDbObjectId id;
acdbGetObjectId(id, ent);
if(!GetEquipNameById(id, sWellBlkName, sWellDesName, nItem))
{
continue;
}
CString sWellRadius = ReadXdata(ent, _T("TG-WELL-RADIUS"));
double dWellRadius = _tstof(sWellRadius);
CString sWellSpec;
if (sWellDesName.CompareNoCase(_T("方检查井")) == 0)
{
sWellSpec.Format(_T("%.0fX%.0f"), dWellRadius, dWellRadius);
}
else if (sWellDesName.CompareNoCase(_T("检查井")) == 0)
{
sWellSpec.Format(_T("Φ %.0f"), _tstof(sWellRadius));
}
CString sWellLayer;
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbWell, pWell);
if(pWell != NULL)
{
if (sWellDesName.CompareNoCase(_T("检查井")) == 0)
{
TCHAR *pLayer = pWell->layer();
sWellLayer = pLayer;
delete pLayer;
pLayer = NULL;
if (sWellLayer.CompareNoCase(LAY_WELL_RAIN) == 0)
{
sWellDesName = _T("雨水检查井");
}
else if (sWellLayer.CompareNoCase(LAY_WELL_DIRT) == 0)
{
sWellDesName = _T("污水检查井");
}
}
if((sWellBlkName.Compare(csBlkName) == 0) &&
(sWellSpec.Compare(csSpec) == 0) &&
sWellDesName.Compare(sName) == 0)
{
ssSel += ent;
}
}
OPENOBJ_END();
}
else if (ent.Is(_T("ATS_PUMP"))) // cet 2012.9.20 add
{
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPump, pPump);
if(pPump != NULL)
{
AcDbObjectId idBlk = pPump->GetBlock2d();
CString csName = GetSymbolName(idBlk);
if(_tcsicmp((const TCHAR*)csBlkName, (const TCHAR*)csName) == 0)
{
ssSel += ent;
}
}
OPENOBJ_END();
}
else if (ent.Is(_T("ATS_OPENING"))) // cet 2014.5.5 add 基础洞
{
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbOpening, pOpening);
if (pOpening != NULL)
{
AcDbObjectId idBlk = pOpening->m_nIdStyle2d;
CString sName = GetSymbolName(idBlk);
if (sName != csBlkName)
{
continue;
}
double dW = 0.0, dH = 0.0, dT = 0.0;
dW = pOpening->GetWidth();
dH = pOpening->GetHeight();
dT = pOpening->GetWallThickness(TRUE);
CString sOpeningSpec;
sOpeningSpec.Format(_T("%.0f×%.0f×%.0f"), dW, dH, dT);
if (sOpeningSpec == csSpec)
{
ssSel += ent;
}
}
OPENOBJ_END();
}
else if (ent.Is(_T("ATS_FIRE_EXTINGUISHER"))) // cet 2014.9.4 add 支持灭火器
{
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbFireExtinguisher, pEnt);
if (pEnt != NULL)
{
CString sName = GetSymbolName(pEnt->GetBlock2d());
CString sSpecification = pEnt->GetSpec();
int nIndex = sSpecification.Find(_T("("));
if (nIndex != -1)
{
sSpecification = sSpecification.Left(nIndex);
}
// 按规格和图块名区分不同灭火器
if (sSpecification == csSpec && sName == csBlkName)
{
ssSel += ent;
}
}
OPENOBJ_END();
}
}
adsout << _T("\n总共选中了") << int(ssSel.Length()) << _T("个图块");
ads_sssetfirst(ssSel, ssSel);
}
void CountSheetFind()
{
XPushVar<int> vOsMode(_T("OSMODE"), 0);
TSheetEdJig jig;
jig.SetOperCode(TSheetEdJig::kSingleRow);
jig.SetPrompt(_T("\n请点取要查询材料的表行<退出>"));
int nKeyIndex=0;
int nCode=jig.DoIt(&nKeyIndex);
if(nCode != RTNORM)
return;
int nRow;
AcDbObjectId id = jig.GetHitRow(nRow);
XStringList lstMat;
CString csSpec, csBlk, csName, csBlkName, csLayName;
if(!!id) {
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbSheet, pSheet);
if(pSheet) {
int nColnum = pSheet->GetColumnNum();
if(nColnum != 7){
AfxMessageBox(_T("不是上华统计表"));
return;
}
TGridCell &cell2=*(*pSheet)(nRow, 1);
csBlk = cell2.GetText();
TGridCell &cell3=*(*pSheet)(nRow, 2);
csName = cell3.GetText();
TGridCell &cell4=*(*pSheet)(nRow, 3);
csSpec = cell4.GetText();
TCellBlockInsert blk;
blk.ParserDesc(csBlk);
csBlkName = (const TCHAR*)blk.m_sBlockName;
CString csAttrib;
if(csBlkName != _T("") && blk.m_lstAttribs.Length() > 0)
csAttrib = blk.m_lstAttribs[0]->m_sValue;
if(csBlkName.Find(_T("TWT_")) > -1 && csName.Find(_T("管线")) > -1)
{
csLayName = csName;
TCHAR szMat[64], szSpec[64];
CT_strnth(csSpec, 1, szMat);
CT_strnth(csSpec, 2, szSpec);
csName = szMat;
csSpec = szSpec;
csBlk = _T("");
}
}
OPENOBJ_END();
}
else
return;
if(g_nProductId==14)//给排水专业需要统计管材
GetPipeMaterialList(lstMat);
if(lstMat.Index(csName) > -1 && csBlk == _T("")){
//SelectPipeBySpec(csName, csSpec, csLayName); cet 2012.9.18 modify
SelectPipeBySpec(id,csName, csSpec, csLayName);
}
else if(csBlkName != _T("")){
//SelectBlkByName(csBlkName); cet 2012.9.18 modify
//SelectBlkByName(id,csBlkName);
SelectBlkByName(id,csBlkName, csSpec, csName);
}
}