// SAmountItem.cpp: implementation of the SAmountItem class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include #include #include #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 &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;im_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 lstEquipInfo, lstSort; double nTextSize(5), nTableHeight(7); AcDbObjectId idTextStyle; long len = ss.Length(); for(long j=0;jGetGridStyle(); 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 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;jm_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 &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 mapPipe; GetLayerPipeName(mapPipe); std::map::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;iGetMaterial(); 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(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), -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(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), // cet 2014.9.4 add 灭火器 -4, _T("or>"), NULL); ssAll.Get(_T("X"), NULL, NULL, rbMask); } long len = ssAll.Length(); for(long i=0;iGetBlock2d(); 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 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); } }