#include "stdafx.h" #include "StdArx.h" #include "BomReportDlg.h" #include "CoreTools.h" #include #define PRONO_GRP _T("PRONO") #define DWGNO_GRP _T("DWGNO") #define PAGENO_GRP _T("PAGENO") #define TOTALNO_GRP _T("TOTALNO") #define LINEPRE_GRP _T("LINE") extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt, AcDbObjectId& id, AcDbDatabase* pDb, bool bClose); IMPLEMENT_DYNAMIC(CBomReportDlg, CDialog) CBomReportDlg::CBomReportDlg(CWnd* pParent /*=NULL*/) : CDialog(CBomReportDlg::IDD, pParent) , m_sProno(_T("SH-001")) , m_sDwgno(_T("SH-001")) , m_sBomDwg(_T("WBOM.dwg")) { } CBomReportDlg::~CBomReportDlg() { } void CBomReportDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_BOMLIST, m_wndBomList); DDX_Text(pDX, IDC_EDITPRONO, m_sProno); DDX_Text(pDX, IDC_EDITDRWNO, m_sDwgno); DDX_Text(pDX, IDC_EDITBOMTMPL, m_sBomDwg); } BEGIN_MESSAGE_MAP(CBomReportDlg, CDialog) ON_WM_CLOSE() ON_BN_CLICKED(IDC_BTTMPL, &CBomReportDlg::OnBnClickedBtTmpl) ON_BN_CLICKED(IDOK, &CBomReportDlg::OnBnClickedOk) ON_BN_CLICKED(IDCANCEL, &CBomReportDlg::OnBnClickedCancel) ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CBomReportDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap bmp; if (!bmp.LoadBitmap (IDB_BITMAPI)) { AfxMessageBox(_T("Can't load bitmap: %x\n"), IDB_BITMAPI); ASSERT (FALSE); return FALSE; } BITMAP bmpObj; bmp.GetBitmap (&bmpObj); UINT nFlags = ILC_COLOR24 | ILC_MASK; m_imageList.Create (16, bmpObj.bmHeight, nFlags, 0, 0); m_imageList.Add (&bmp, RGB (255, 0, 0)); m_wndBomList.SetImageList(&m_imageList,LVSIL_SMALL); m_wndBomList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); m_wndBomList.InsertColumn(0,_T("序号"),LVCFMT_LEFT,80,80); m_wndBomList.InsertColumn(1,_T("名称"),LVCFMT_LEFT,160,160); m_wndBomList.InsertColumn(2,_T("规格"),LVCFMT_LEFT,200,200); m_wndBomList.InsertColumn(3,_T("单位"),LVCFMT_LEFT,60,60); m_wndBomList.InsertColumn(4,_T("数量"),LVCFMT_LEFT,80,80); m_wndBomList.InsertColumn(5,_T("材料"),LVCFMT_LEFT,120,120); m_wndBomList.InsertColumn(6,_T("备注"),LVCFMT_LEFT,120,120); m_wndBomList.SetColumnItemData(2,NULL,ET_Edit); m_wndBomList.SetColumnItemData(4,NULL,ET_Edit); m_wndBomList.SetColumnItemData(5,NULL,ET_Edit); CString sBomXlsIni = FilePath::GetSysDir() + _T("\\BOMReport.ini"); m_sBomDwg = FilePath::GetSysDir() + _T("\\WBOM.dwg"); OnBnClickedBtselents(); UpdateData(FALSE); return TRUE; } void CBomReportDlg::OnClose() { CDialog::OnClose(); } void CBomReportDlg::OnBnClickedBtselfile() { //选一堆dwg文件 CAcModuleResourceOverride resOverride; const TCHAR *pszFilter = _T("dwg文件 (*.dwg;)|*.dwg|"); CFileDialog dlg(TRUE, _T("dwg"), NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_ALLOWMULTISELECT, pszFilter, NULL); TCHAR strFileName[MAX_PATH] = _T(""); TCHAR strFileTitle[] = _T("选择要物料统计的DWG文件"); int maxChar = MAX_PATH; dlg.m_ofn.lpstrFile = strFileName; dlg.m_ofn.nMaxFile = maxChar; dlg.m_ofn.lpstrTitle = strFileTitle; if(dlg.DoModal() != IDOK) { return; } CString sFileName; POSITION ps = dlg.GetStartPosition(); while(ps != NULL) { sFileName = dlg.GetNextPathName(ps); sFileName.Replace( _T("\\\\"), _T("\\")); //读取文件统计 BomFromReadDwg(sFileName); } ShowtoReportlist(); } void CBomReportDlg::OnBnClickedBtTmpl() { //选一堆dwg文件 UpdateData(); CAcModuleResourceOverride resOverride; const TCHAR *pszFilter = _T("dwg文件 (*.dwg;)|*.dwg|"); CFileDialog dlg(TRUE, _T("dwg"), NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER, pszFilter, NULL); TCHAR strFileName[MAX_PATH] = _T(""); TCHAR strFileTitle[] = _T("选择报表模板文件"); int maxChar = MAX_PATH; dlg.m_ofn.lpstrFile = strFileName; dlg.m_ofn.nMaxFile = maxChar; dlg.m_ofn.lpstrTitle = strFileTitle; if(dlg.DoModal() != IDOK) { return; } m_sBomDwg = dlg.GetPathName(); UpdateData(FALSE); } void CBomReportDlg::BomFromReadDwg(CString& sFileName) { } void CBomReportDlg::OnBnClickedBtselents() { AcDbEntity* pEnt = NULL; for (long i = 0;i < m_arAddtionPtrs.length();i++) { pEnt = (AcDbEntity*)m_arAddtionPtrs.at(i); ExtractBomOfEntity(pEnt); } ShowtoReportlist(); } void CBomReportDlg::AddPipeLineEntPtr(AcDbEntity* pEnt) { if (pEnt != NULL) { m_arAddtionPtrs.append(pEnt); } } void CBomReportDlg::ExtractBomOfEntity(AcDbEntity* pEnt) { // int nFitType = 0; CString sMater,sText,sModel,sFact; double dDn = 0.0,dLen = 0.0; double dEDn = 0.0,dED = 0.0,dL = 0.0,dB = 0.0; double dD = 0.0,dThick = 0.0,dRatio = 0.0,dE = 0.0,dM = 0.0; //管子 PipeBom* pPipeBom = NULL; //std::vector vtPipeBomPtrs; //CMapStringToPtr mapPipeBom; CableBom* pCabBom = NULL; //弯头 ElbowBom* pElbowBom = NULL; //std::vector vtElbowBomPtrs; //CMapStringToPtr mapElbowBom; //大小头 ReducerBom* pReducerBom = NULL; //std::vector vtReducerBomPtrs; //CMapStringToPtr mapReducerBom; //三通 TeeBom* pTeeBom = NULL; //std::vector vtTeeBomPtrs; //CMapStringToPtr mapTeeBom; //L三通 LTeeBom* pLTeeBom = NULL; //std::vector vtLTeeBomPtrs; //CMapStringToPtr mapLTeeBom; //WYE WyeBom* pWyeBom = NULL; //std::vector vtWyeBomPtrs; //CMapStringToPtr mapWyeBom; //四通 CrossBom* pCrossBom = NULL; //std::vector vtCrossBomPtrs; //CMapStringToPtr mapCrossBom; //堵头 WCapBom* pWCap = NULL; //std::vector vtWCapBomPtrs; //CMapStringToPtr mapWCapBom; WFlangeBom* pFlangeBom = NULL; //设备 //CMapStringToPtr mapName2Count; double dAng = 0.0; AcGeVector3d vtOff; AecDbObjXDataMap* pMap = NULL; //1.管子 AecDbEwPipe* pWpipe = AecDbEwPipe::cast(pEnt); if (pWpipe != NULL) { pMap = pWpipe->GetSpecialtyData(); //规格 pMap->GetAt(PIPE_DN,dDn); pMap->GetAt(PIPE_OD,dD); pMap->GetAt(PIPE_THICK,dThick); pMap->GetAt(PIPE_MATERIAL,sMater); dLen = pWpipe->EndPoint().distanceTo(pWpipe->StartPoint() );//默认是米单位 dDn = AS_M2MM(dDn); dD = AS_M2MM(dD); dThick = AS_M2MM(dThick); sText.Format(_T("%d-%d-%.1f-%s"),(short)(AS_M2MM(dDn) + 0.5),(short)(dD + 0.5),dThick,sMater); if (!m_mapPipeBom.Lookup(sText,(void*&)pPipeBom)) { pPipeBom = new PipeBom; pPipeBom->nDn = (short)(dDn + 0.5); pPipeBom->nD = (short)(dD + 0.5); pPipeBom->fThick = (float)dThick; pPipeBom->dLen = dLen; _tcscpy(pPipeBom->szMertial,sMater); m_mapPipeBom.SetAt(sText,pPipeBom); m_vtPipeBomPtrs.push_back(pPipeBom); } else { pPipeBom->dLen += dLen; } } AecDbEwCable* pCable = AecDbEwCable::cast(pEnt); if (pCable != NULL) { pMap = pCable->GetSpecialtyData(); //规格 pMap->GetAt(CABLE_D,dD); pMap->GetAt(CABLE_MODEL,sModel); pMap->GetAt(CABLE_FACTORY,sFact); sText.Format(_T("%d-%s-%s"),(short)(AS_M2MM(dD) + 0.5),sMater,sFact); pCable->getEndParam(dLen);//默认是米单位 if (!m_mapCableBom.Lookup(sText,(void*&)pCabBom)) { pCabBom = new CableBom; pCabBom->nD = (short)(AS_M2MM(dD) + 0.5); pCabBom->dLen = dLen; _tcscpy(pCabBom->szModel,sModel); _tcscpy(pCabBom->szFactory,sFact); m_mapCableBom.SetAt(sText,pCabBom); m_vtCableBomPtrs.push_back(pCabBom); } else { pCabBom->dLen += dLen; } } //2.管件 AecDbEwFitting* pWFit = AecDbEwFitting::cast(pEnt); if (pWFit != NULL) { pMap = pWFit->GetSpecialtyData(); pMap->GetAt(KEY_RUNTIME,nFitType); switch(nFitType) { case eElbow: { //规格 pMap->GetAt(PIPE_DN,dDn); pMap->GetAt(PIPE_OD,dD); pMap->GetAt(PIPE_THICK,dThick); pMap->GetAt(PIPE_MATERIAL,sMater); pMap->GetAt(PIPE_RATIO,dRatio); pMap->GetAt(PIPE_ELBOWANG,dAng); dAng *= 180.0 / PI; dDn = AS_M2MM(dDn); dD = AS_M2MM(dD); dThick = AS_M2MM(dThick); sText.Format(_T("%d-%d-%d-%.1f-%.1f-%s"),(short)(dDn + 0.5),(short)(dD + 0.5),(short)(dAng + 0.5),dThick,dRatio,sMater); if (!m_mapElbowBom.Lookup(sText,(void*&)pElbowBom)) { pElbowBom = new ElbowBom; pElbowBom->nDn = (short)(dDn + 0.5); pElbowBom->nD = (short)(dD + 0.5); pElbowBom->fThick = (float)dThick; pElbowBom->fRRatio = (float)dRatio; pElbowBom->nAngle = (short)(dAng + 0.5); _tcscpy(pElbowBom->szMertial,sMater); pElbowBom->nCount = 1; m_vtElbowBomPtrs.push_back(pElbowBom); m_mapElbowBom.SetAt(sText,pElbowBom); } else { pElbowBom->nCount += 1; } break; } case eReduceElbow: { break; } case eReduce: { //规格 pMap->GetAt(PIPE_DN,dDn); pMap->GetAt(PIPE_OD,dD); pMap->GetAt(PIPE_EDN,dEDn); pMap->GetAt(PIPE_EOD,dED); pMap->GetAt(PIPE_THICK,dThick); pMap->GetAt(PIPE_MATERIAL,sMater); pMap->GetAt(KEY_Length,dLen); pMap->GetAt(KEY_OFFSET,vtOff); dDn = AS_M2MM(dDn); dD = AS_M2MM(dD); dThick = AS_M2MM(dThick); dEDn = AS_M2MM(dEDn); dED = AS_M2MM(dED); dLen = AS_M2MM(dLen); sText.Format(_T("%d-%d-%d-%d-%d-%.1f-%.1f-%s"), (short)(__min(dDn,dEDn) + 0.5), (short)(__max(dDn,dEDn) + 0.5), (short)(__min(dD,dED) + 0.5), (short)(__max(dD,dED) + 0.5), vtOff.isZeroLength(), dThick,dRatio,sMater); if (!m_mapReducerBom.Lookup(sText,(void*&)pReducerBom)) { pReducerBom = new ReducerBom; pReducerBom->nDn = (short)(__max(dDn,dEDn) + 0.5); pReducerBom->nD = (short)(__max(dD,dED) + 0.5); pReducerBom->nTDn = (short)(__min(dDn,dEDn) + 0.5); pReducerBom->nTD = (short)(__min(dD,dED) + 0.5); pReducerBom->nCount = 1; pReducerBom->fThick = (float)dThick; pReducerBom->nLen = (short)(dLen + 0.5); _tcscpy(pReducerBom->szMertial,sMater); pReducerBom->nOffset = vtOff.isZeroLength() ? FALSE : TRUE; m_vtReducerBomPtrs.push_back(pReducerBom); m_mapReducerBom.SetAt(sText,pReducerBom); } else { pReducerBom->nCount += 1; } break; } case eTee: { //规格 pMap->GetAt(PIPE_DN,dDn); pMap->GetAt(PIPE_OD,dD); pMap->GetAt(PIPE_TDN,dEDn); pMap->GetAt(PIPE_TOD,dED); pMap->GetAt(PIPE_THICK,dThick); pMap->GetAt(PIPE_MATERIAL,sMater); pMap->GetAt(KEY_L,dL); pMap->GetAt(KEY_T,dB); dDn = AS_M2MM(dDn); dD = AS_M2MM(dD); dThick = AS_M2MM(dThick); dEDn = AS_M2MM(dEDn); dED = AS_M2MM(dED); dL = AS_M2MM(dL); dB = AS_M2MM(dB); sText.Format(_T("%d-%d-%d-%d-%.1f-%s"),(short)(dDn + 0.5),(short)(dD + 0.5),(short)(dEDn + 0.5),(short)(dED + 0.5),dThick,sMater); if (!m_mapTeeBom.Lookup(sText,(void*&)pTeeBom)) { pTeeBom = new TeeBom; pTeeBom->nDn = (short)(dDn + 0.5); pTeeBom->nD = (short)(dD + 0.5); pTeeBom->nTDn = (short)(dEDn + 0.5); pTeeBom->nTD = (short)(dED + 0.5); pTeeBom->nL = (short)(dL + 0.5); pTeeBom->nB = (short)(dB + 0.5); pTeeBom->fThick = (float)dThick; pTeeBom->nCount = 1; _tcscpy(pTeeBom->szMertial,sMater); m_mapTeeBom.SetAt(sText,pTeeBom); m_vtTeeBomPtrs.push_back(pTeeBom); } else { pTeeBom->nCount += 1; } break; } case eLateral: { //规格 pMap->GetAt(PIPE_DN,dDn); pMap->GetAt(PIPE_OD,dD); pMap->GetAt(PIPE_TDN,dEDn); pMap->GetAt(PIPE_TOD,dED); pMap->GetAt(PIPE_THICK,dThick); pMap->GetAt(PIPE_MATERIAL,sMater); pMap->GetAt(PIPE_E,dE); pMap->GetAt(PIPE_M,dM); pMap->GetAt(PIPE_B,dB); dDn = AS_M2MM(dDn); dD = AS_M2MM(dD); dThick = AS_M2MM(dThick); dEDn = AS_M2MM(dEDn); dED = AS_M2MM(dED); dE = AS_M2MM(dE); dM = AS_M2MM(dM); dB = AS_M2MM(dB); sText.Format(_T("%d-%d-%d-%d-%.1f-%s"),(short)(dDn + 0.5),(short)(dD + 0.5),(short)(dEDn + 0.5),(short)(dED + 0.5),dThick,sMater); if (!m_mapLTeeBom.Lookup(sText,(void*&)pLTeeBom)) { pLTeeBom = new LTeeBom; pLTeeBom->nDn = (short)(dDn + 0.5); pLTeeBom->nD = (short)(dD + 0.5); pLTeeBom->nTDn = (short)(dEDn + 0.5); pLTeeBom->nTD = (short)(dED + 0.5); pLTeeBom->nE = (short)(dE + 0.5); pLTeeBom->nM = (short)(dM + 0.5); pLTeeBom->nB = (short)(dB + 0.5); pLTeeBom->fThick = dThick; _tcscpy(pLTeeBom->szMertial,sMater); pLTeeBom->nCount = 1; m_mapLTeeBom.SetAt(sText,pLTeeBom); m_vtLTeeBomPtrs.push_back(pLTeeBom); } else { pLTeeBom->nCount += 1; } break; } case eWye: { //规格 pMap->GetAt(PIPE_DN,dDn); pMap->GetAt(PIPE_OD,dD); pMap->GetAt(PIPE_TDN,dEDn); pMap->GetAt(PIPE_TOD,dED); pMap->GetAt(PIPE_THICK,dThick); pMap->GetAt(PIPE_MATERIAL,sMater); pMap->GetAt(PIPE_M,dM); pMap->GetAt(PIPE_B,dB); dDn = AS_M2MM(dDn); dD = AS_M2MM(dD); dThick = AS_M2MM(dThick); dEDn = AS_M2MM(dEDn); dED = AS_M2MM(dED); dM = AS_M2MM(dM); dB = AS_M2MM(dB); sText.Format(_T("%d-%d-%d-%.1f-%s"),(short)(dDn + 0.5),(short)(dD + 0.5),(short)(dED + 0.5),dThick,sMater); if (!m_mapWyeBom.Lookup(sText,(void*&)pWyeBom)) { pWyeBom = new WyeBom; pWyeBom->nDn = (short)(dDn + 0.5); pWyeBom->nD = (short)(dD + 0.5); pWyeBom->nTDn = (short)(dEDn + 0.5); pWyeBom->nTD = (short)(dED + 0.5); pWyeBom->nM = (short)(dM + 0.5); pWyeBom->nB = (short)(dB + 0.5); pWyeBom->fThick = dThick; _tcscpy(pWyeBom->szMertial,sMater); pWyeBom->nCount = 1; m_mapWyeBom.SetAt(sText,pWyeBom); m_vtWyeBomPtrs.push_back(pWyeBom); } else { pWyeBom->nCount += 1; } break; } case eCross: { //规格 pMap->GetAt(PIPE_DN,dDn); pMap->GetAt(PIPE_OD,dD); pMap->GetAt(PIPE_TDN,dEDn); pMap->GetAt(PIPE_TOD,dED); pMap->GetAt(PIPE_THICK,dThick); pMap->GetAt(PIPE_MATERIAL,sMater); pMap->GetAt(KEY_L,dM); pMap->GetAt(KEY_T,dB); dDn = AS_M2MM(dDn); dD = AS_M2MM(dD); dThick = AS_M2MM(dThick); dEDn = AS_M2MM(dEDn); dED = AS_M2MM(dED); dM = AS_M2MM(dM); dB = AS_M2MM(dB); sText.Format(_T("%d-%d-%d-%d-%.1f-%s"),(short)(dDn + 0.5),(short)(dD + 0.5),(short)(dEDn + 0.5),(short)(dED + 0.5),dThick,sMater); if (!m_mapCrossBom.Lookup(sText,(void*&)pCrossBom)) { pCrossBom = new CrossBom; pCrossBom->nDn = (short)(dDn + 0.5); pCrossBom->nD = (short)(dD + 0.5); pCrossBom->nTDn = (short)(dEDn + 0.5); pCrossBom->nTD = (short)(dED + 0.5); pCrossBom->nCount = 1; pCrossBom->nL = (short)(dM + 0.5); pCrossBom->fThick = (float)(dThick + 0.5); _tcscpy(pCrossBom->szMertial,sMater); m_mapCrossBom.SetAt(sText,pCrossBom); m_vtCrossBomPtrs.push_back(pCrossBom); } else { pCrossBom->nCount += 1; } break; } case eWcap: { pMap->GetAt(PIPE_DN,dDn); pMap->GetAt(PIPE_OD,dD); pMap->GetAt(PIPE_THICK,dThick); pMap->GetAt(PIPE_MATERIAL,sMater); pMap->GetAt(KEY_L,dM); dDn = AS_M2MM(dDn); dD = AS_M2MM(dD); dThick = AS_M2MM(dThick); dM = AS_M2MM(dM); sText.Format(_T("%d-%d-%.1f-%s"),(short)(dDn + 0.5),(short)(dD + 0.5),dThick,sMater); if (!m_mapWCapBom.Lookup(sText,(void*&)pWCap)) { pWCap = new WCapBom; pWCap->nDn = (short)(dDn + 0.5); pWCap->nD = (short)(dD + 0.5); pWCap->nL = (short)(dM + 0.5); pWCap->fThick = (float)(dThick + 0.5); _tcscpy(pWCap->szMertial,sMater); pWCap->nCount = 1; m_mapWCapBom.SetAt(sText,pWCap); m_vtWCapBomPtrs.push_back(pWCap); } else { pWCap->nCount += 1; } break; } case eFlange: { pMap->GetAt(PIPE_DN,dDn); pMap->GetAt(PIPE_MATERIAL,sMater); dDn = AS_M2MM(dDn); sText.Format(_T("DN%d"),(short)(dDn + 0.5)); if (!m_mapWFlangeBom.Lookup(sText,(void*&)pFlangeBom)) { pFlangeBom = new WFlangeBom; pFlangeBom->nDn = (short)(dDn+0.5); pFlangeBom->nCount = 1; _tcscpy(pFlangeBom->szMertial,sMater); m_mapWFlangeBom.SetAt(sText,pFlangeBom); m_vtWFlangeBomPtrs.push_back(pFlangeBom); } else { pFlangeBom->nCount += 1; } break; } default: break; } } //3.设备 AecDbEwEquipment* pWEqu =AecDbEwEquipment::cast(pEnt); if (pWEqu != NULL) { //按名称统计 CString sName,sSpec; pMap = pWEqu->GetSpecialtyData(); pMap->GetAt(KEY_NAME,sName); sSpec = sName; SH_BIM_BLOCK bims; CoreTools::getBimData(*pMap, _T("规格"), sSpec); WEquBom* pCount = NULL; if (!m_mapName2Count.Lookup(sName,(void*&)pCount)) { pCount = new WEquBom; pCount->nCount = 1; _tcscpy(pCount->szName,sName); _tcscpy(pCount->szSpec,sSpec); m_mapName2Count.SetAt(sName,pCount); } else { pCount->nCount += 1; } } } /* #define PRONO_GRP _T("PRONO") #define DWGNO_GRP _T("DWGNO") #define PAGENO_GRP _T("PAGENO") #define TOTALNO_GRP _T("TOTALNO") #define LINEPRE_GRP _T("LINE") */ static void FindGroup(AcDbDatabase* pDb,LPCTSTR pszLineGrp,AcDbObjectId& idGrp) { AcDbDictionary* pDict = NULL; if ( Acad::eOk == pDb->getGroupDictionary(pDict,AcDb::kForRead )) { CString sName; AcDbGroup* pGrp = NULL; AcDbDictionaryIterator* pIt = pDict->newIterator(); for (;!pIt->done();pIt->next()) { if ( Acad::eOk == pIt->getObject((AcDbObject*&)pGrp,AcDb::kForRead) ) { sName = pGrp->name(); if (sName.CompareNoCase(pszLineGrp) == 0) { idGrp = pGrp->objectId(); pGrp->close(); break; } pGrp->close(); } } DELETE_PTR(pIt); pDict->close(); } } static void FindGroupEntities(AcDbObjectId& idGroup,AcDbObjectIdArray& arIds) { AcDbGroup* pGroup = NULL; if (Acad::eOk == acdbOpenObject(pGroup,idGroup,AcDb::kForRead) ) { AcDbGroupIterator* pIter = pGroup->newIterator(); for(;!pIter->done();pIter->next()) { arIds.append(pIter->objectId()); } DELETE_PTR(pIter); pGroup->close(); } } static void ReplaceText(AcDbDatabase* pDb,LPCTSTR pszText,LPCTSTR pszGrpname) { AcDbObjectId idGrp; FindGroup(pDb,pszGrpname,idGrp); AcDbObjectIdArray arIds; FindGroupEntities(idGrp,arIds); if (arIds.length() > 0) { AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,arIds.first(),AcDb::kForWrite)) { AcDbText* pText = AcDbText::cast(pEnt); if (pText != NULL) { pText->setTextString(pszText); } pEnt->close(); } } } void CBomReportDlg::OnBnClickedOk() { //写入DWG模板,或者EXCEL 模板 UpdateData(); EnableWindow(FALSE); CWnd* pFrame = acedGetAcadFrame(); pFrame->EnableWindow(TRUE); ShowWindow(SW_HIDE); pFrame->SetFocus(); /* m_wndBomList.InsertColumn(0,_T("序号"),LVCFMT_LEFT,80,80); m_wndBomList.InsertColumn(1,_T("名称"),LVCFMT_LEFT,160,160); m_wndBomList.InsertColumn(2,_T("规格"),LVCFMT_LEFT,200,200); m_wndBomList.InsertColumn(3,_T("单位"),LVCFMT_LEFT,60,60); m_wndBomList.InsertColumn(4,_T("数量"),LVCFMT_LEFT,80,80); m_wndBomList.InsertColumn(6,_T("材料"),LVCFMT_LEFT,120,120); m_wndBomList.InsertColumn(6,_T("备注"),LVCFMT_LEFT,120,120); */ /*if (m_bCheckExcel) //导到外部excel { TCHAR szBomXlsIni[MAX_PATH]; if(!FindFile(_T("BOMReport.ini"), szBomXlsIni)) { AfxMessageBox(_T("系统没有找到报表模板配置BOMReport.ini文件!请检查软件是否正确安装!")); return; } CExcelWrite ExcelWrite; ExcelWrite.ExcelWrite(&m_wndBomList, szBomXlsIni); } else //导入bom dwg 模板 */ { //文档锁定 AcAxDocLock lock; AcApDocument* pDoc = acDocManager->curDocument(); CString sBomXlsIni = FilePath::GetSysDir() + _T("\\BOMReport.ini"); m_sBomDwg = FilePath::GetSysDir() + _T("\\wbom.dwg"); ::WritePrivateProfileString(_T("FILE"),_T("DwgTmpl"), m_sBomDwg,sBomXlsIni); /*if(!FindFile(_T("wbom.dwg"), szBomDwg)) { AfxMessageBox(_T("系统没有找到报表模板wbom.dwg文件!请检查软件是否正确安装!")); return; }*/ //清理一下wbom*** 的块 AcDbBlockTable* pTable = NULL; pDoc->database()->getBlockTable(pTable,AcDb::kForRead); if (pTable != NULL) { AcDbBlockTableIterator* pIt = NULL; pTable->newIterator(pIt); AcDbObjectIdArray arIds1; if (pIt != NULL) { AcDbObjectId idRec; for(pIt->start();!pIt->done();pIt->step()) { pIt->getRecordId(idRec); arIds1.append(idRec); } } CString sName; AcDbObjectIdArray ids; AcDbBlockTableRecord* pRec = NULL; for (int j = 0;j < arIds1.length();j++) { if (Acad::eOk == acdbOpenAcDbObject((AcDbObject*&)pRec,arIds1.at(j),AcDb::kForWrite)) { ids.removeAll(); ids.append(arIds1.at(j)); LPCTSTR pName = NULL; pRec->getName(pName); sName = pName; if (sName.Find(_T("WBOM")) != -1 ) { Adesk::UInt32 nCountX[2]; memset(nCountX,0,sizeof(nCountX)); pDoc->database()->countHardReferences(ids,nCountX); if (nCountX[0] == 0) { pRec->erase(); } } pRec->close(); } } pTable->close(); } //请选择插入基点 ads_point pt; int nRes = acedGetPoint(NULL,_T("请选择材料报表的插入点:"),pt); if (nRes != RTNORM) { return; } acdbUcs2Wcs(pt,pt,false); AcGePoint3d ptIns = asPnt3d(pt); double dScale = 0.001; AcGeScale3d gscale(dScale,dScale,dScale); AcDbObjectId idBlk,idGrp,id; AcDbObjectIdArray arIds; AcDbEntity* pEnt = NULL; CString sPageno,sTotalno,sNoT; CString sBomBlkName,sTime,sGroup,sLineGrp,sText,sNo,sTemp; bool bSetNull = false; int nIndex = 0; int nCount = m_wndBomList.GetItemCount(); int nLoop = nCount / 27; int nMode = nCount % 27; if (nMode > 0) nLoop += 1; sTotalno.Format(_T("%d"),nLoop); for (int i = 0;i < nLoop; i++ ) //一共27行每页 { CTime t1 = CTime::GetCurrentTime(); sTime = t1.Format(_T("%y-%m-%d-%H-%M")); sBomBlkName.Format(_T("WBOM%s%d"),sTime,i); sPageno.Format(_T("%d"),i + 1); AcDbDatabase db(Adesk::kFalse); if (Acad::eOk == db.readDwgFile(m_sBomDwg)) { //第页 ReplaceText(&db,sPageno,PAGENO_GRP); //总页 ReplaceText(&db,sTotalno,TOTALNO_GRP); //工程号 ReplaceText(&db,m_sProno,PRONO_GRP); //图号 ReplaceText(&db,m_sDwgno,DWGNO_GRP); //明细 for (int ii = 0;ii < 27;ii++) { nIndex = i * 27 + ii; if (nIndex > nCount) { bSetNull = true; } sNo.Format(_T("%d"),nIndex + 1); sLineGrp.Format(_T("%s%d"),LINEPRE_GRP,ii); FindGroup(&db,sLineGrp,idGrp); arIds.removeAll(); FindGroupEntities(idGrp,arIds); for (int jj = 0;jj < arIds.length();jj++) { if (Acad::eOk == acdbOpenAcDbEntity(pEnt,arIds.at(jj),AcDb::kForWrite)) { AcDbText* pText = AcDbText::cast(pEnt); if (pText != NULL) { LPCTSTR pszTxt = pText->textStringConst(); sText = pszTxt; sNoT.Format(_T("%d"),ii); if (sText.CompareNoCase(sNoT) == 0) //序号 { //sNo.Format(_T("%d"),nIndex + 1); pText->setTextString(bSetNull ? _T(" "):(LPCTSTR)sNo); } else if(sText.CompareNoCase(_T("Name")) == 0) //名称 { if (!bSetNull) { sTemp = m_wndBomList.GetItemText(nIndex,1); pText->setTextString(sTemp); } else { pText->setTextString(_T(" ")); } } else if(sText.CompareNoCase(_T("Spec")) == 0)//规格 { if (!bSetNull) { sTemp = m_wndBomList.GetItemText(nIndex,2); pText->setTextString(sTemp); } else { pText->setTextString(_T(" ")); } } else if (sText.CompareNoCase(_T("Unit")) == 0) //单位 { if (!bSetNull) { sTemp = m_wndBomList.GetItemText(nIndex,3); pText->setTextString(sTemp); } else { pText->setTextString(_T(" ")); } } else if (sText.CompareNoCase(_T("Count")) == 0)//数量 { if (!bSetNull) { sTemp = m_wndBomList.GetItemText(nIndex,4); pText->setTextString(sTemp); } else { pText->setTextString(_T(" ")); } } else if (sText.CompareNoCase(_T("Mertial")) == 0) //材料 { if (!bSetNull) { sTemp = m_wndBomList.GetItemText(nIndex,5); pText->setTextString(sTemp); } else { pText->setTextString(_T(" ")); } } else if (sText.CompareNoCase(_T("Rem")) == 0) //备注 { if (!bSetNull) { sTemp = m_wndBomList.GetItemText(nIndex,6); pText->setTextString(sTemp); } else { pText->setTextString(_T(" ")); } } else if (sText.CompareNoCase(_T("Weight")) == 0) //单重 { pText->setTextString(_T(" ")); } else if (sText.CompareNoCase(_T("TWeight")) == 0) //纵重 { pText->setTextString(_T(" ")); } } pEnt->close(); } } } } //插入; db.setInsbase(AcGePoint3d::kOrigin); Acad::ErrorStatus es = acdbCurDwg()->insert(idBlk,sBomBlkName,&db); AcDbBlockTableRecord* pRec = NULL; if (Acad::eOk == acdbOpenAcDbObject((AcDbObject*&)pRec,idBlk,AcDb::kForWrite)) { pRec->setOrigin(AcGePoint3d::kOrigin); pRec->close(); } //然后放大倍数 AcDbObjectId idRef; AcDbBlockReference* pRef = new AcDbBlockReference; pRef->setScaleFactors(gscale); pRef->setPosition(ptIns); pRef->setBlockTableRecord(idBlk); AddToModelSpace(pRef,idRef,NULL,true); //平移动一下 ptIns += 250.0 * AcGeVector3d::kXAxis; } } EndDialog(IDOK); } void CBomReportDlg::OnBnClickedCancel() { EndDialog(IDCANCEL); } void CBomReportDlg::OnDestroy() { CDialog::OnDestroy(); FreeBomBuffer(); } void CBomReportDlg::FreeBomBuffer() { typedef std::vector::iterator IT1; for(IT1 it1 = m_vtPipeBomPtrs.begin();it1 != m_vtPipeBomPtrs.end();it1++) { PipeBom* pPipeBom = (*it1); DELETE_PTR(pPipeBom); } } static bool SortPipeBom(PipeBom* pPipe1,PipeBom* pPipe2) { if (pPipe1->nDn <= pPipe2->nDn) { return true; } return false; } static bool SortCableBom(CableBom* pPipe1,CableBom* pPipe2) { if (pPipe1->nD <= pPipe2->nD) { return true; } return false; } static bool SortElbowBom(ElbowBom* pPipe1,ElbowBom* pPipe2) { if (pPipe1->nDn <= pPipe2->nDn) { return true; } return false; } static bool SortReducerBom(ReducerBom* pPipe1,ReducerBom* pPipe2) { if (pPipe1->nDn <= pPipe2->nDn) { return true; } return false; } static bool SortTeeBom(TeeBom* pPipe1,TeeBom* pPipe2) { if (pPipe1->nDn <= pPipe2->nDn) { return true; } return false; } static bool SortLTeeBom(LTeeBom* pPipe1,LTeeBom* pPipe2) { if (pPipe1->nDn <= pPipe2->nDn) { return true; } return false; } static bool SortWyeBom(WyeBom* pPipe1,WyeBom* pPipe2) { if (pPipe1->nDn <= pPipe2->nDn) { return true; } return false; } static bool SortCrossBom(CrossBom* pPipe1,CrossBom* pPipe2) { if (pPipe1->nDn <= pPipe2->nDn) { return true; } return false; } static bool SortWCapBom(WCapBom* pPipe1,WCapBom* pPipe2) { if (pPipe1->nDn <= pPipe2->nDn) { return true; } return false; } static bool SortFlangeBom(WFlangeBom* pBom1,WFlangeBom* pBom2) { if (pBom1->nDn <= pBom2->nDn) { return true; } return false; } void CBomReportDlg::ShowtoReportlist() { std::sort(m_vtPipeBomPtrs.begin(),m_vtPipeBomPtrs.end(),SortPipeBom); std::sort(m_vtCableBomPtrs.begin(),m_vtCableBomPtrs.end(),SortCableBom); std::sort(m_vtElbowBomPtrs.begin(),m_vtElbowBomPtrs.end(),SortElbowBom); std::sort(m_vtReducerBomPtrs.begin(),m_vtReducerBomPtrs.end(),SortReducerBom); std::sort(m_vtTeeBomPtrs.begin(),m_vtTeeBomPtrs.end(),SortTeeBom); std::sort(m_vtLTeeBomPtrs.begin(),m_vtLTeeBomPtrs.end(),SortLTeeBom); std::sort(m_vtWyeBomPtrs.begin(),m_vtWyeBomPtrs.end(),SortWyeBom); std::sort(m_vtCrossBomPtrs.begin(),m_vtCrossBomPtrs.end(),SortCrossBom); std::sort(m_vtWCapBomPtrs.begin(),m_vtWCapBomPtrs.end(),SortWCapBom); std::sort(m_vtWFlangeBomPtrs.begin(),m_vtWFlangeBomPtrs.end(),SortFlangeBom); //std::sort(m_vtWGasketBomPtrs.begin(),m_vtWGasketBomPtrs.end(),SortGasketBom); /* m_wndBomList.InsertColumn(0,_T("序号"),LVCFMT_LEFT,80,80); m_wndBomList.InsertColumn(1,_T("名称"),LVCFMT_LEFT,160,160); m_wndBomList.InsertColumn(2,_T("规格"),LVCFMT_LEFT,200,200); m_wndBomList.InsertColumn(3,_T("单位"),LVCFMT_LEFT,60,60); m_wndBomList.InsertColumn(4,_T("数量"),LVCFMT_LEFT,80,80); m_wndBomList.InsertColumn(5,_T("备注"),LVCFMT_LEFT,120,120); */ m_wndBomList.DeleteAllItems(); int nItem = 0; CString sText,sTemp; //PIPE PipeBom* pPipe = NULL; typedef std::vector::iterator PBomIT; //for (int i = 0;i < m_vtPipeBomPtrs.size();i++) for(PBomIT it1 = m_vtPipeBomPtrs.begin();it1 != m_vtPipeBomPtrs.end();it1++) { //pPipe = m_vtPipeBomPtrs[i]; pPipe = (*it1); sText.Format(_T("%d"),m_wndBomList.GetItemCount() + 1); nItem = m_wndBomList.InsertItem(m_wndBomList.GetItemCount(),sText); sText = _T("管"); sTemp = pPipe->szMertial; sTemp.TrimRight(); if (sTemp.IsEmpty()) { sText = _T("焊接钢管"); } m_wndBomList.SetItemText(nItem,1,sText); sText.Format(_T("D%dx%.1f"),pPipe->nD,pPipe->fThick); m_wndBomList.SetItemText(nItem,2,sText); sText = _T("米"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),(short)(pPipe->dLen + 0.5)); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,pPipe->szMertial); m_wndBomList.SetItemText(nItem,6,_T("")); } CableBom* pCable = NULL; typedef std::vector::iterator CabBomIT; for(CabBomIT it1 = m_vtCableBomPtrs.begin();it1 != m_vtCableBomPtrs.end();it1++) { pCable = (*it1); sText.Format(_T("%d"),m_wndBomList.GetItemCount() + 1); nItem = m_wndBomList.InsertItem(m_wndBomList.GetItemCount(),sText); sText = _T("电缆"); m_wndBomList.SetItemText(nItem,1,sText); sText.Format(_T("%s D%d"),pCable->szModel,pCable->nD); m_wndBomList.SetItemText(nItem,2,sText); sText = _T("米"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),(short)(pCable->dLen + 0.5)); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,pCable->szModel); m_wndBomList.SetItemText(nItem,6,pCable->szFactory); } //Elbow ElbowBom* pElbow = NULL; typedef std::vector::iterator EBomIT; for(EBomIT it2 = m_vtElbowBomPtrs.begin();it2 != m_vtElbowBomPtrs.end();it2++) //for (int i = 0;i < m_vtElbowBomPtrs.size();i++) { //pElbow = m_vtElbowBomPtrs[i]; pElbow = (*it2); sText.Format(_T("%d"),m_wndBomList.GetItemCount() + 1); nItem = m_wndBomList.InsertItem(m_wndBomList.GetItemCount(),sText); sText = _T("弯头"); m_wndBomList.SetItemText(nItem,1,sText); sText.Format(_T("%d度弯头 D%dx%.1f"),pElbow->nAngle,pElbow->nD,pElbow->fThick); m_wndBomList.SetItemText(nItem,2,sText); sText = _T("个"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),pElbow->nCount); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,pElbow->szMertial); m_wndBomList.SetItemText(nItem,6,_T("")); } //Reducer ReducerBom* pReducer = NULL; typedef std::vector::iterator RBomIT; //for (int i = 0;i < m_vtReducerBomPtrs.size();i++) for (RBomIT it3 = m_vtReducerBomPtrs.begin();it3 != m_vtReducerBomPtrs.end();it3++) { //pReducer = m_vtReducerBomPtrs[i]; pReducer = (*it3); sText.Format(_T("%d"),m_wndBomList.GetItemCount() + 1); nItem = m_wndBomList.InsertItem(m_wndBomList.GetItemCount(),sText); sText = pReducer->nOffset ? _T("偏心变径") : _T("变径"); m_wndBomList.SetItemText(nItem,1,sText); sText.Format(_T("D%dx%.1f-D%dx%.1f L=%d"),pReducer->nD,pReducer->fThick,pReducer->nTD,pReducer->fThick,pReducer->nLen); m_wndBomList.SetItemText(nItem,2,sText); sText = _T("个"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),pReducer->nCount); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,pReducer->szMertial); m_wndBomList.SetItemText(nItem,6,_T("")); } //Tee TeeBom* pTee = NULL; typedef std::vector::iterator TBomIT; //for (int i = 0;i < m_vtTeeBomPtrs.size();i++) for(TBomIT it4 = m_vtTeeBomPtrs.begin();it4 != m_vtTeeBomPtrs.end();it4++) { //pTee = m_vtTeeBomPtrs[i]; pTee = (*it4); sText.Format(_T("%d"),m_wndBomList.GetItemCount() + 1); nItem = m_wndBomList.InsertItem(m_wndBomList.GetItemCount(),sText); sText = _T("三通"); m_wndBomList.SetItemText(nItem,1,sText); sText.Format(_T("D%dx%.1f-D%dx%.1f L=%d B=%d"),pTee->nD,pTee->fThick,pTee->nTD,pTee->fThick,pTee->nL,pTee->nB); m_wndBomList.SetItemText(nItem,2,sText); sText = _T("个"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),pTee->nCount); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,pTee->szMertial); m_wndBomList.SetItemText(nItem,6,_T("")); } //LTee LTeeBom* pLTee = NULL; typedef std::vector::iterator LTBomIT; //for (int i = 0;i < m_vtLTeeBomPtrs.size();i++) for(LTBomIT it5 = m_vtLTeeBomPtrs.begin();it5 != m_vtLTeeBomPtrs.end();it5++) { //pLTee = m_vtLTeeBomPtrs[i]; pLTee = (*it5); sText.Format(_T("%d"),m_wndBomList.GetItemCount() + 1); nItem = m_wndBomList.InsertItem(m_wndBomList.GetItemCount(),sText); sText = _T("L三通"); m_wndBomList.SetItemText(nItem,1,sText); sText.Format(_T("D%dx%.1f-D%dx%.1f E=%d M=%d B=%d"),pLTee->nD, pLTee->fThick, pLTee->nTD, pLTee->fThick, pLTee->nE, pLTee->nM, pLTee->nB); m_wndBomList.SetItemText(nItem,2,sText); sText = _T("个"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),pLTee->nCount); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,pLTee->szMertial); m_wndBomList.SetItemText(nItem,6,_T("")); } //WYE WyeBom* pWye = NULL; typedef std::vector::iterator WyBomIT; //for (int i = 0;i < m_vtWyeBomPtrs.size();i++) for(WyBomIT it6 = m_vtWyeBomPtrs.begin();it6 != m_vtWyeBomPtrs.end();it6++) { //pWye = m_vtWyeBomPtrs[i]; pWye = (*it6); sText.Format(_T("%d"),m_wndBomList.GetItemCount() + 1); nItem = m_wndBomList.InsertItem(m_wndBomList.GetItemCount(),sText); sText = _T("Y三通"); m_wndBomList.SetItemText(nItem,1,sText); sText.Format(_T("D%dx%.1f-D%dx%.1f M=%d B=%d"),pWye->nD, pWye->fThick,pWye->nTD,pWye->fThick,pWye->nM,pWye->nB); m_wndBomList.SetItemText(nItem,2,sText); sText = _T("个"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),pWye->nCount); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,pWye->szMertial); m_wndBomList.SetItemText(nItem,6,_T("")); } //Cross CrossBom* pCross = NULL; typedef std::vector::iterator CBomIT; //for (int i = 0;i < m_vtCrossBomPtrs.size();i++) for (CBomIT it7 = m_vtCrossBomPtrs.begin();it7 != m_vtCrossBomPtrs.end();it7++) { //pCross = m_vtCrossBomPtrs[i]; pCross = (*it7); sText.Format(_T("%d"),m_wndBomList.GetItemCount() + 1); nItem = m_wndBomList.InsertItem(m_wndBomList.GetItemCount(),sText); sText = _T("四通"); m_wndBomList.SetItemText(nItem,1,sText); sText.Format(_T("D%dx%.1f-D%dx%.1f L=%d B=%d"),pCross->nD,pCross->fThick,pCross->nTD,pCross->fThick,pCross->nL,pCross->nB); m_wndBomList.SetItemText(nItem,2,sText); sText = _T("个"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),pCross->nCount); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,pCross->szMertial); m_wndBomList.SetItemText(nItem,6,_T("")); } //WCap WCapBom* pWcap = NULL; typedef std::vector::iterator WCBomIT; //for (int i = 0;i nD,pWcap->fThick,pWcap->nL); m_wndBomList.SetItemText(nItem,2,sText); sText = _T("个"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),pWcap->nCount); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,pWcap->szMertial); m_wndBomList.SetItemText(nItem,6,_T("")); } //Flange WFlangeBom* pFlangeBom = NULL; typedef std::vector::iterator WFlangeBomIT; //for (int i = 0;i nDn); m_wndBomList.SetItemText(nItem,2,sText); sText = _T("个"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),pFlangeBom->nCount); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,pFlangeBom->szMertial); m_wndBomList.SetItemText(nItem,6,_T("")); } //设备 CString sName; WEquBom* pCount = NULL; for (POSITION ps = m_mapName2Count.GetStartPosition();ps != NULL;) { m_mapName2Count.GetNextAssoc(ps,sName,(void*&)pCount); sText.Format(_T("%d"),m_wndBomList.GetItemCount() + 1); nItem = m_wndBomList.InsertItem(m_wndBomList.GetItemCount(),sText); m_wndBomList.SetItemText(nItem,1,sName); m_wndBomList.SetItemText(nItem,2,pCount->szSpec); sText = _T("个"); m_wndBomList.SetItemText(nItem,3,sText); sText.Format(_T("%d"),pCount->nCount); m_wndBomList.SetItemText(nItem,4,sText); m_wndBomList.SetItemText(nItem,5,_T("")); m_wndBomList.SetItemText(nItem,6,_T("")); } }