#include "stdafx.h" #include "CDLFSDlg.h" #include "excel9.h" #include "CQCBDDlg.h" #include "CFSSZDlg.h" #include "AecDbEntityBase.h" #include "CSetEquNoDlg.h" #include "CCableRouting.h" #include "AecDbDirPosition.h" #include "KTSetting.h" #include "CoreTools.h" #include "CDLWJDlg.h" #include "KTTempZoom.h" #include "CXYCDDlg.h" #include "AecDb3dRoadAxisLine.h" #include "KTCadUtility.h" #ifndef DXF_EQU #define DXF_EQU _T("AEC_DBWEQUIPMENT,AEC_DBXEQUIPMENT,AEC_DBPARAEQUI,INSERT") #define DXF_PATH _T("LINE,LWPOLYLINE,AEC_ROADAXISLINE") #define DXF_CABLEPATH _T("AEC_ROADAXISLINE") #define DXF_ROUT_PATH _T("AEC_DBCABTRY,AEC_ROADAXISLINE") #endif IMPLEMENT_DYNAMIC(CDLFSDlg, CDialog) CDLFSDlg::CDLFSDlg(CWnd* pParent /*=NULL*/) : CDialog(IDD_DLFS_DLG, pParent) { m_nEquFrCol = -1; m_nEquToCol = -1; m_nCableLenCol = -1; m_nCableSpec = -1; m_nPathUserDo = 0; m_dLenRever = 2; m_dPathOnPoint = 0.2; m_dBypassDis = 1.0;//米 m_dEquFindDis = 2.5;//米 m_bHasSect = FALSE; m_nCableSectCol = -1; m_nPathNosCol = -1; m_bIsVisible = false; } CDLFSDlg::~CDLFSDlg() { } void CDLFSDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_wndList); DDX_Control(pDX, IDC_BUTTON1, m_wndBt1); } BEGIN_MESSAGE_MAP(CDLFSDlg, CDialog) ON_MESSAGE(WM_ACAD_KEEPFOCUS, &CDLFSDlg::onAcadKeepFocus) ON_BN_CLICKED(IDC_BUTTON1, &CDLFSDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON7, &CDLFSDlg::OnBnClickedButton7) ON_WM_SIZE() ON_BN_CLICKED(IDC_BUTTON9, &CDLFSDlg::OnBnClickedButton9) ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CDLFSDlg::OnNMRClickList1) ON_NOTIFY(NM_CLICK, IDC_LIST1, &CDLFSDlg::OnNMClickList1) ON_BN_CLICKED(IDC_BUTTON2, &CDLFSDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON3, &CDLFSDlg::OnBnClickedButton3) ON_WM_CTLCOLOR() ON_BN_CLICKED(IDC_BUTTON5, &CDLFSDlg::OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON6, &CDLFSDlg::OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON10, &CDLFSDlg::OnBnClickedButton10) ON_WM_TIMER() ON_WM_DESTROY() END_MESSAGE_MAP() LONG_PTR CDLFSDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR) { POINT pt; ::GetCursorPos(&pt); CRect rect; GetWindowRect(&rect); if (!(rect.PtInRect(pt))) { return FALSE; } return TRUE; } BOOL CDLFSDlg::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_wndList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SINGLEROW); m_wndList.SetImageList(&m_imageList, LVSIL_SMALL); m_NewHeaderFont.CreatePointFont(190, _T("MS Serif")); CHeaderCtrl *pHeader = NULL; pHeader = m_wndList.GetHeaderCtrl(); if (pHeader == NULL) return FALSE; VERIFY(m_HeaderCtrl.SubclassWindow(pHeader->m_hWnd)); m_HeaderCtrl.SetFont(&m_NewHeaderFont); GetWindowRect(&m_rcMain); m_wndBt1.GetWindowRect(&m_rcBt); m_wndList.GetWindowRect(m_rcLst); m_nIDEvent = SetTimer(1, 300, NULL); return TRUE; } void CDLFSDlg::OnTimer(UINT_PTR nIDEvent) { ShowPath(m_bIsVisible); m_bIsVisible = !m_bIsVisible; CDialog::OnTimer(nIDEvent); } void CDLFSDlg::ShowPath(bool bIsShow) { if (m_wndList.GetItemCount() == 0) return; AcDbObjectId id; Acad::ErrorStatus es = Acad::eInvalidInput; int nItem = -1; POSITION ps = m_wndList.GetFirstSelectedItemPosition(); if (ps != NULL) { nItem = m_wndList.GetNextSelectedItem(ps); if (nItem != -1) { DWORD_PTR pXData = m_wndList.GetItemData(nItem); if (pXData != NULL) { EquHolder *pHolder = (EquHolder *)pXData; if (pHolder != NULL) { AcDbHandle hd(pHolder->szPath); es = acdbCurDwg()->getAcDbObjectId(id, false, hd); } } } } if (es == Acad::eOk) { AcAxDocLock lock; AcDbEntity *pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite)) { pEnt->setVisibility(bIsShow ? AcDb::kVisible : AcDb::kInvisible); pEnt->close(); acedUpdateDisplay(); actrTransactionManager->flushGraphics(); } } } BOOL CDLFSDlg::OnCommand(WPARAM wParam, LPARAM lParam) { switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: case IDCLOSE: { ShowWindow(SW_HIDE); } return TRUE; default: break; } return CDialog::OnCommand(wParam, lParam); } void CDLFSDlg::OnSize(UINT nType, int cx, int cy) { if (cx < m_rcMain.Width() && cy < m_rcMain.Height()) return; CDialog::OnSize(nType, cx, cy); if (::IsWindow(m_wndList.m_hWnd)) { CRect rc; GetClientRect(&rc); rc.DeflateRect(12,m_rcBt.Height() + 13,10,10); m_wndList.MoveWindow(rc); } } bool Variant2String(const COleVariant &varValue, CString& sVal) { sVal = _T(""); switch (varValue.vt) { case VT_I4: { sVal.Format(_T("%d"), varValue.lVal); break; } case VT_UI1: { sVal.Format(_T("%d"), varValue.bVal); break; } case VT_I2: { sVal.Format(_T("%d"), varValue.iVal); break; } case VT_R4: { sVal.Format(_T("%f"), varValue.fltVal); break; } case VT_R8: { sVal.Format(_T("%g"), varValue.dblVal); break; } case VT_BSTR: { sVal = varValue.bstrVal; break; } case VT_UI2: { sVal.Format(_T("%d"), varValue.uiVal); break; } case VT_UI4: { sVal.Format(_T("%d"), varValue.ulVal); break; } case VT_INT: { sVal.Format(_T("%d"), varValue.intVal); break; } case VT_UINT: { sVal.Format(_T("%d"), varValue.uintVal); } default: return false; } return true; } //读取清册内容-> 读取完毕后,显示关联, 有关联为绿色 void CDLFSDlg::OnBnClickedButton1() { CAcModuleResourceOverride myResources; CQCBDDlg dlg; if (IDOK != dlg.DoModal()) return; m_nEquFrCol = -1; m_nEquToCol = -1; m_nCableLenCol = -1; m_nCableSpec = -1; m_nSheetIndex = -1; m_sXLSFile = _T(""); m_nODCol = -1; m_nSysCol = -1; m_mapSubItem2Modified.RemoveAll(); m_mapSubItem2Cell.RemoveAll(); CStringArray arCols; dlg.GetCols(arCols); CWaitCursor wait; CString sXLSFile = dlg.m_sXlsFile; int nTitleRow = dlg.m_nTitleRow; int nRowFrom = dlg.m_nRowFrom; int nRowTo = dlg.m_nRowTo; CString sSheetName = dlg.m_sWorkSheet; ::CoInitialize(NULL); _Application excelApp; Workbooks excelBooks; _Workbook excelBook; Worksheets excelSheets; _Worksheet excelSheet; COleVariant vResult; COleVariant covTrue((short)TRUE), covFalse((short)FALSE); Range range; Range iCell; Validation vald; BOOL bSuccess = excelApp.CreateDispatch(_T("excel.application")); if (bSuccess) { LPDISPATCH pLpDisp = NULL; excelBooks.AttachDispatch(excelApp.GetWorkbooks()); COleVariant vOp((long)DISP_E_PARAMNOTFOUND, VT_ERROR); COleVariant vUpdateLinks((short)0), vReadOnly((short)1), vFormat = vOp, vPassword = vOp; COleVariant vWriteResPassword = vOp, vIgnoreReadOnlyRecommended = vOp; COleVariant vOrigin = vOp, vDelimiter = vOp, vEditable((short)0), vNotify = vOp, vConverter = vOp, vAddToMru = vOp; pLpDisp = excelBooks.Open(sXLSFile, vUpdateLinks, vReadOnly, vFormat, vPassword, vWriteResPassword, vIgnoreReadOnlyRecommended, vOrigin, vDelimiter, vEditable, vNotify, vConverter, vAddToMru); if (pLpDisp == NULL) { AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!")); return; } excelBook.AttachDispatch(pLpDisp); //得到Worksheets excelSheets.AttachDispatch(excelBook.GetWorksheets()); CString sTitleA_Z = _T("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); CString sCell,sTitle,sText,sSheetName2,sKey; m_wndList.DeleteAllItems(); while (m_wndList.GetHeaderCtrl()->GetItemCount() > 0) { m_wndList.GetHeaderCtrl()->DeleteItem(0); } //获取sheet 数量 long lCount = excelSheets.GetCount(); for (short nSheetIndex = 1; nSheetIndex <= lCount; nSheetIndex++) { COleVariant varIndex(nSheetIndex); pLpDisp = excelSheets.GetItem(varIndex); if (pLpDisp != NULL) { excelSheet.AttachDispatch(pLpDisp); CUIntArray arAZPos; sSheetName2 = excelSheet.GetName(); if (sSheetName.CompareNoCase(sSheetName2) == 0)//找到页 { m_nSheetIndex = nSheetIndex; //抬头 From for (int i = 0;i < arCols.GetSize();i++) { sCell.Format(_T("%s%d"), arCols.GetAt(i), nTitleRow); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant val = range.GetValue(); sTitle = _T(""); Variant2String(val, sTitle); sTitle.TrimRight(); sTitle.TrimLeft(); //如果为空,在往下读一行,不超过 nRowFrom if (sTitle.IsEmpty()) { int nAdd = 1; while (true) { if ((nTitleRow + nAdd) < nRowFrom) { sCell.Format(_T("%s%d"), arCols.GetAt(i), nTitleRow + nAdd); COleVariant varCell2(sCell); range = excelSheet.GetRange(varCell2, varCell2); COleVariant val2 = range.GetValue(); sTitle = _T(""); Variant2String(val2, sTitle); sTitle.TrimRight(); sTitle.TrimLeft(); if (!sTitle.IsEmpty()) { break; } } else { break; } nAdd += 1; } } m_wndList.InsertColumn(i,sTitle, LVCFMT_LEFT,200,200); range.ReleaseDispatch(); } //最后两列为 电缆外径 电缆系统 m_nODCol = m_wndList.InsertColumn(arCols.GetSize(), _T("电缆外径"), LVCFMT_LEFT, 120, 120); m_nSysCol = m_wndList.InsertColumn(arCols.GetSize()+1, _T("电缆系统"), LVCFMT_LEFT, 120, 120); HDITEM hdItem; hdItem.mask = HDI_FORMAT; for (i = 0; i < m_wndList.GetHeaderCtrl()->GetItemCount(); i++) { m_wndList.GetHeaderCtrl()->GetItem(i, &hdItem); hdItem.fmt |= HDF_OWNERDRAW; m_wndList.GetHeaderCtrl()->SetItem(i, &hdItem); } //读取数据 int nItem = 0; for (int n = nRowFrom;n <= nRowTo;n++) { for (int nP = 0;nP < arCols.GetSize();nP++) { //D10 sCell.Format(_T("%s%d"), arCols.GetAt(nP), n); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant val = range.GetValue(); Variant2String(val, sText); sText.TrimRight(); sText.TrimLeft(); if (nP == 0) { nItem = m_wndList.InsertItem(m_wndList.GetItemCount(), sText,0); } else { m_wndList.SetItemText(nItem,nP, sText); } //(nItem,nSubItem)---sCell 关系 //CPoint pt(nItem, nP); sKey.Format(_T("%d,%d"), nItem, nP); m_mapSubItem2Cell.SetAt(sKey, sCell); } } break;//其他页不考虑 } excelSheet.ReleaseDispatch(); } } excelBooks.Close(); //excelApp.Quit(); m_wndList.Invalidate(); m_wndList.RedrawWindow(); m_sXLSFile = sXLSFile; sText.Format(_T("电缆敷设:%s"),m_sXLSFile); SetWindowText(sText); } else { AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!")); } } bool SortEListLine(EListLine2& rListLast, EListLine2& rListNext) { //最后一列 外径 if ( rListLast.dOD <= rListNext.dOD ) { return false; } return true; } bool CDLFSDlg::GetEListLine(std::vector& rList) { CString sTxt, sItem; EListLine2 rlst; for (int i = 0; i < m_wndList.GetItemCount(); i++) { memset(&rlst, 0, sizeof(EListLine2)); rlst.nItem = i; sTxt = _T(""); if (m_nODCol != -1) rlst.dOD = _ttof(m_wndList.GetItemText(i, m_nODCol)); EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(i); if (pHolder != NULL) { memcpy(&rlst.holder, pHolder, sizeof(EquHolder)); } rList.push_back(rlst); } return rList.empty() ? false : true; } bool GetEquObjectId(TCHAR* szEqu, AcDbObjectId& id) { AcDbHandle hd(szEqu); if (Acad::eOk == acdbCurDwg()->getAcDbObjectId(id, false, hd)) return true; return false; } //自动敷设 void CDLFSDlg::OnBnClickedButton7() { //检查设备是否和清单关联 if (!CheckEquAssocList()) { int nRes = AfxMessageBox(_T("设备清单有未关联设备实体的条目!是否继续敷设?"), MB_YESNO); if (nRes == IDNO) return; } //... int nPriStep = -1; if (m_arPriSteps.GetSize() > 0) { std::vector rList; GetEListLine(rList); nPriStep = m_arPriSteps.GetAt(0); if (nPriStep == 0)//电缆外径 从大到小 { //排序 std::sort(rList.begin(), rList.end(), SortEListLine); } else //清册顺序 { } int nUnit = 1000;//默认毫米 struct resbuf rb; acedGetVar(_T("INSUNITS"), &rb); if (rb.resval.rint == AcDb::kUnitsMeters) { nUnit = 1; } CString sTxt,sKey; AcDbObjectId idFrom, idTo, idPath; CCableRouting crut; crut.SetBypassDis(m_dBypassDis * nUnit); crut.SetPathOnPoint(m_dPathOnPoint * nUnit); crut.SetEquFindDis(m_dEquFindDis * nUnit); crut.SetIgoreFillUsed(false); crut.SetAssocNoorName(m_nAssocNoorName); AcAxDocLock lock; acedSetStatusBarProgressMeter(_T("正在自动敷设..."), 0, rList.size()); for (int i = 0;i < rList.size();i++) { acedSetStatusBarProgressMeterPos(i); EListLine2& lstLn = rList.at(i); CableData data; memset(&data, 0, sizeof(CableData)); if (!GetItemCableData(lstLn.nItem, data)) continue; if ( GetEquObjectId(lstLn.holder.szFrEqu, idFrom) && GetEquObjectId(lstLn.holder.szToEqu, idTo)) { CString sPathSteps; crut.SearchRouting(idFrom, idTo, data, 0, idPath,sPathSteps); idPath.handle().getIntoAsciiBuffer(lstLn.holder.szPath); EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(lstLn.nItem); if (pHolder != NULL) _tcscpy(pHolder->szPath, lstLn.holder.szPath); sTxt.Format(_T("%.1f"),data.dLen * 0.001 + m_dLenRever); m_wndList.SetItemText(lstLn.nItem, m_nCableLenCol, sTxt); m_wndList.SetItemText(lstLn.nItem, m_nPathNosCol, sPathSteps); //CPoint pt(lstLn.nItem, m_nCableLenCol); sKey.Format(_T("%d,%d"), lstLn.nItem, m_nCableLenCol); m_mapSubItem2Modified.SetAt(sKey, TRUE); } } acedRestoreStatusBar(); } } bool CDLFSDlg::CheckEquAssocList() { if (m_nEquFrCol != -1 && m_nEquToCol != -1) { CString sFr, sTo; for (int i = 0;i < m_wndList.GetItemCount();i++) { sFr = m_wndList.GetItemText(i, m_nEquFrCol); sTo = m_wndList.GetItemText(i, m_nEquToCol); if ( !sFr.IsEmpty() && !sTo.IsEmpty() ) { EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(i); if (pHolder != NULL) { if (_tcslen(pHolder->szFrEqu) == 0 || _tcslen(pHolder->szToEqu) == 0) { return false; } } } } } return true; } //设置 void CDLFSDlg::OnBnClickedButton9() { if (m_wndList.GetItemCount() == 0) { AfxMessageBox(_T("清册表单没有内容!请先读取表单!")); return; } HDITEM hdItem; hdItem.mask = HDI_TEXT; TCHAR szBuffer[MAX_PATH]; hdItem.pszText = szBuffer; hdItem.cchTextMax = MAX_PATH; CAcModuleResourceOverride myResources; CFSSZDlg dlg; for (int i = 0;i < m_wndList.GetHeaderCtrl()->GetItemCount();i++) { szBuffer[0] = _T('\0'); m_wndList.GetHeaderCtrl()->GetItem(i, &hdItem); dlg.AddCol(szBuffer); } dlg.m_dPathOnPoint = m_dPathOnPoint; dlg.m_dLenRever = m_dLenRever; dlg.m_nEquFrCol = m_nEquFrCol; dlg.m_nEquToCol = m_nEquToCol; dlg.m_nCableLenCol = m_nCableLenCol; dlg.m_nCableSpec = m_nCableSpec; dlg.m_nPathNosCol = m_nPathNosCol; dlg.m_nAssocNoorName = m_nAssocNoorName; dlg.m_dBypassDis = m_dBypassDis; dlg.m_dEquFindDis = m_dEquFindDis; dlg.m_bHasSect = m_bHasSect; dlg.m_nCableSectCol = m_nCableSectCol; dlg.m_nPathUserDo = m_nPathUserDo; dlg.SetRoutePriStep(m_arPriSteps); dlg.SetIgoreFillUsed(m_bIgoreFillUsed); if (IDOK == dlg.DoModal()) { //...设备关联, 关联上cell 为绿色 未关联为红色 m_nEquFrCol = dlg.m_nEquFrCol; m_nEquToCol = dlg.m_nEquToCol; m_nCableLenCol = dlg.m_nCableLenCol; m_nPathNosCol = dlg.m_nPathNosCol; m_nCableSpec = dlg.m_nCableSpec; m_nPathUserDo = dlg.m_nPathUserDo; m_nAssocNoorName = dlg.m_nAssocNoorName; m_dPathOnPoint = dlg.m_dPathOnPoint; m_arPriSteps.RemoveAll(); m_bHasSect = dlg.m_bHasSect; m_nCableSectCol = dlg.m_nCableSectCol; m_dEquFindDis = dlg.m_dEquFindDis; m_dBypassDis = dlg.m_dBypassDis; m_bIgoreFillUsed = dlg.m_bIgoreFillUsed ? true : false; dlg.GetRoutePriStep(m_arPriSteps); SearchEqu(); //SortCableSpec(); //查找上次保存的敷设 SearchSavedRoutPath(); OnBnClickedButton3(); } } bool CDLFSDlg::SearchEqu() { bool bColOk = false; if (m_nEquFrCol > -1 && m_nEquFrCol < m_wndList.GetHeaderCtrl()->GetItemCount() && m_nEquToCol > -1 && m_nEquToCol < m_wndList.GetHeaderCtrl()->GetItemCount() ) { bColOk = true; } if (!bColOk) return false; AcAxDocLock lock; ads_name ss,ent; AcDbObjectId id; struct resbuf *pRb = acutBuildList(RTDXF0, DXF_EQU, 0); int nRes = acedSSGet(_T("A"),NULL,NULL,pRb,ss); acutRelRb(pRb); if (nRes == RTNORM) { Adesk::Int32 nLen = 0; acedSSLength(ss, &nLen); CString sNo,sEquFr,sEquTo,sName; AcDbEntity *pEnt = NULL; acedSetStatusBarProgressMeter(_T("正在按编号或名称搜索设备..."), 0, nLen); for (int i = 0;i < nLen;i++) { acedSetStatusBarProgressMeterPos(i); acedSSName(ss, i, ent); acdbGetObjectId(id, ent); if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead)) { AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt); if (pEntBase != NULL) { sNo = _T(""); sName = _T(""); pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNo); pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NAME, sName); if (m_nAssocNoorName) sNo = sName; //找列表 bool bFindFr = false, bFindTo = false; for (int j = 0;j < m_wndList.GetItemCount();j++) { sEquFr = m_wndList.GetItemText(j, m_nEquFrCol); sEquTo = m_wndList.GetItemText(j, m_nEquToCol); if (sEquFr.Find(sNo) != -1)//编号在 sEquFr 中体现 { bFindFr = true; //设置关联 DWORD_PTR pXData = m_wndList.GetItemData(j); if (pXData == NULL) { EquHolder *pHolder = new EquHolder; memset(pHolder, 0, sizeof(EquHolder)); id.handle().getIntoAsciiBuffer(pHolder->szFrEqu); pHolder->nFrCol = m_nEquFrCol; pHolder->nToCol = -1; m_wndList.SetItemData(j,(DWORD_PTR)pHolder); } else { EquHolder *pHolder = (EquHolder *)pXData; id.handle().getIntoAsciiBuffer(pHolder->szFrEqu); pHolder->nFrCol = m_nEquFrCol; } } if (sEquTo.Find(sNo) != -1)//编号在 sEquFr 中体现 { bFindTo = true; //设置关联 DWORD_PTR pXData = m_wndList.GetItemData(j); if (pXData == NULL) { EquHolder *pHolder = new EquHolder; memset(pHolder, 0, sizeof(EquHolder)); id.handle().getIntoAsciiBuffer(pHolder->szToEqu); pHolder->nToCol = m_nEquToCol; pHolder->nFrCol = -1; m_wndList.SetItemData(j, (DWORD_PTR)pHolder); } else { EquHolder *pHolder = (EquHolder *)pXData; id.handle().getIntoAsciiBuffer(pHolder->szToEqu); pHolder->nToCol = m_nEquToCol; } } if (bFindFr && bFindTo) { break; } } } AcDbBlockReference *pRef = AcDbBlockReference::cast(pEnt); if (pRef != NULL) { AecDbObjXDataMap xData; if (xData.Read(pRef, KEY_ASSOIC)) { sNo = _T(""); sName = _T(""); xData.GetAt(KEY_NO, sNo); xData.GetAt(KEY_NAME, sName); if (m_nAssocNoorName) sNo = sName; //找列表 bool bFindFr = false, bFindTo = false; for (int j = 0; j < m_wndList.GetItemCount(); j++) { sEquFr = m_wndList.GetItemText(j, m_nEquFrCol); sEquTo = m_wndList.GetItemText(j, m_nEquToCol); if (sEquFr.Find(sNo) != -1)//编号在 sEquFr 中体现 { bFindFr = true; //设置关联 DWORD_PTR pXData = m_wndList.GetItemData(j); if (pXData == NULL) { EquHolder *pHolder = new EquHolder; memset(pHolder, 0, sizeof(EquHolder)); id.handle().getIntoAsciiBuffer(pHolder->szFrEqu); pHolder->nFrCol = m_nEquFrCol; pHolder->nToCol = -1; m_wndList.SetItemData(j, (DWORD_PTR)pHolder); } else { EquHolder *pHolder = (EquHolder *)pXData; id.handle().getIntoAsciiBuffer(pHolder->szFrEqu); pHolder->nFrCol = m_nEquFrCol; } } if (sEquTo.Find(sNo) != -1)//编号在 sEquFr 中体现 { bFindTo = true; //设置关联 DWORD_PTR pXData = m_wndList.GetItemData(j); if (pXData == NULL) { EquHolder *pHolder = new EquHolder; memset(pHolder, 0, sizeof(EquHolder)); id.handle().getIntoAsciiBuffer(pHolder->szToEqu); pHolder->nToCol = m_nEquToCol; pHolder->nFrCol = -1; m_wndList.SetItemData(j, (DWORD_PTR)pHolder); } else { EquHolder *pHolder = (EquHolder *)pXData; id.handle().getIntoAsciiBuffer(pHolder->szToEqu); pHolder->nToCol = m_nEquToCol; } } if (bFindFr && bFindTo) { break; } } } } pEnt->close(); } } acedRestoreStatusBar(); acedSSFree(ss); } return true; } bool CDLFSDlg::SearchSavedRoutPath() { AcAxDocLock lock; ads_name ss, ent; AcDbObjectId id; AcDbEntity *pEnt = NULL; CString sFr, sTo,sKey; TCHAR szPath[33]; CMapStringToString mapFrTo2Path; struct resbuf *pRb = acutBuildList(RTDXF0, DXF_CABLEPATH, 0); int nRes = acedSSGet(_T("A"), NULL, NULL, pRb, ss); acutRelRb(pRb); if (nRes == RTNORM) { Adesk::Int32 nLen = 0; acedSSLength(ss, &nLen); acedSetStatusBarProgressMeter(_T("正在关联路径..."), 0, nLen); for (int i = 0;i < nLen;i++) { acedSetStatusBarProgressMeterPos(i); acedSSName(ss, i, ent); acdbGetObjectId(id, ent); id.handle().getIntoAsciiBuffer(szPath); if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead)) { AecDb3dRoadAxisLine *pRd = AecDb3dRoadAxisLine::cast(pEnt); if (pRd != NULL) { AecDbObjXDataMap xData; if (xData.Read(pRd, KEY_APP)) { sFr = _T(""); sTo = _T(""); if (xData.GetAt(KEY_START, sFr) && xData.GetAt(KEY_END, sTo) ) { sKey = sFr + sTo; mapFrTo2Path.SetAt(sKey, szPath); } } } pEnt->close(); } } } acedRestoreStatusBar(); acedSSFree(ss); acedSetStatusBarProgressMeter(_T("正在关联路径..."), 0, m_wndList.GetItemCount()); CString sPath; for (int j = 0; j < m_wndList.GetItemCount(); j++) { acedSetStatusBarProgressMeterPos(j); DWORD_PTR pXData = m_wndList.GetItemData(j); if (pXData != NULL) { EquHolder *pHolder = (EquHolder *)pXData; if (pHolder != NULL) { sKey.Format(_T("%s%s"),pHolder->szFrEqu,pHolder->szToEqu); if (mapFrTo2Path.Lookup(sKey, sPath) ) { _tcscpy(pHolder->szPath, (LPCTSTR)sPath); } } } } acedRestoreStatusBar(); return true; } bool CDLFSDlg::SortCableSpec() { int nSpecGrade = m_wndList.GetHeaderCtrl()->GetItemCount() - 1; CString sSpec; CableData data; for (int i = 0;i < m_wndList.GetItemCount();i++) { memset(&data, 0, sizeof(CableData)); if (GetItemCableData(i, data)) { //优先级别为 data.dD sSpec.Format(_T("%d"),(int)(data.dD + 0.5)); m_wndList.SetItemText(i, nSpecGrade, sSpec); } } return true; } #ifndef ID_SELFREQU #define ID_SELFREQU 5000 #define ID_SELTOEQU 5001 #define ID_PATHPASSBY 5002 #define ID_PATHPASSNO 5003 #define ID_ROUTINGON 5004 #define ID_SELTERMPT 5005 #define ID_SETUP 5006 #endif // ! ID_SELFREQU UINT CDLFSDlg::EnableMenuItem(int nItem, UINT nID) { UINT nFlag = MF_ENABLED; /* switch (nID) { case ID_SELFREQU: { break; } case ID_SELTOEQU: { break; } case ID_SELCABLE: { break; } case ID_ROUTINGON: { break; } case ID_SELPATHPT: { break; } case ID_SETUP: { break; } default: break; } */ return nFlag; } void CDLFSDlg::OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); *pResult = 0; m_wndList.Invalidate(); m_wndList.RedrawWindow(); //右键菜单 CPoint point, ptcursor; ::GetCursorPos(&point); ptcursor = point; int nItem = pNMItemActivate->iItem; int nSubItem = pNMItemActivate->iSubItem; CString sText = m_wndList.GetItemText(nItem, nSubItem); sText.TrimRight(); if (sText.IsEmpty()) return; if (nItem != -1) { CAcModuleResourceOverride myResources; CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(nItem, ID_SELFREQU), ID_SELFREQU, _T("选择起点设备(&F)")); menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(nItem, ID_SELTOEQU), ID_SELTOEQU, _T("选择终点设备(&T)")); menu.AppendMenu(MF_SEPARATOR); menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(nItem, ID_SELTERMPT), ID_SELTERMPT, _T("添加设备接线点(&P)")); menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(nItem, ID_PATHPASSBY),ID_PATHPASSBY,_T("指定电缆必经路径(&B)")); menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(nItem, ID_PATHPASSNO),ID_PATHPASSNO,_T("清空电缆必经路径(&K)")); menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(nItem, ID_ROUTINGON), ID_ROUTINGON, _T("选择此条目敷设(&R)")); menu.AppendMenu(MF_SEPARATOR); menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(nItem, ID_SETUP), ID_SETUP, _T("设置(&S)")); int nID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, ptcursor.x, ptcursor.y, &m_wndList); switch (nID) { case ID_SELFREQU: { OnSelFrEqu(nItem,nSubItem); break; } case ID_SELTOEQU: { OnSelToEqu(nItem, nSubItem); break; } case ID_PATHPASSBY: { OnPathPassBy(nItem,nSubItem); break; } case ID_PATHPASSNO: { OnPathPassByNo(nItem, nSubItem); break; } case ID_ROUTINGON: { OnRoutingOn(nItem, nSubItem); break; } case ID_SELTERMPT: { //必须fr - to equ 有效的情况下 OnSelTermPoint(nItem, nSubItem); break; } case ID_SETUP: { OnSetup(nItem, nSubItem); break; } default: break; } } } void CDLFSDlg::OnSelFrEqu(int nItem, int nSubItem) { ShowWindow(SW_MINIMIZE); OnSetEquNo(nItem, nSubItem, 0); ShowWindow(SW_NORMAL); } void CDLFSDlg::OnSetEquNo(int nItem, int nSubItem,int nFrOrTo) { AcAxDocLock lock; ads_name ent; AcDbObjectId id; LPCTSTR pszMsg = _T("\n请选择设备关联此编号:"); struct resbuf *pRb = acutBuildList(RTDXF0, DXF_EQU, 0); int nRes = CKTCadUtility::SelectEntity(pszMsg, ent, pRb); acutRelRb(pRb); if (nRes == RTNORM) { //弹出界面,由用户修改单元格的信息后填入 CAcModuleResourceOverride myResources; CSetEquNoDlg dlg; dlg.m_sNo = m_wndList.GetItemText(nItem, nSubItem); if (IDOK == dlg.DoModal()) { acdbGetObjectId(id, ent); Acad::ErrorStatus es; AcDbEntity *pEnt = NULL; if (Acad::eOk == (es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite))) { AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt); if (pEntBase != NULL) { if (m_nAssocNoorName == 0) pEntBase->GetSpecialtyData(AcDb::kForWrite)->SetAt(KEY_NO, dlg.m_sNo); else pEntBase->GetSpecialtyData(AcDb::kForWrite)->SetAt(KEY_NAME, dlg.m_sNo); EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(nItem); if (pHolder != NULL) { if (nFrOrTo == 0) { pHolder->nFrCol = nSubItem; id.handle().getIntoAsciiBuffer(pHolder->szFrEqu); } else { pHolder->nToCol = nSubItem; id.handle().getIntoAsciiBuffer(pHolder->szToEqu); } } else { pHolder = new EquHolder; memset(pHolder, 0, sizeof(EquHolder)); if (nFrOrTo == 0) { pHolder->nFrCol = nSubItem; id.handle().getIntoAsciiBuffer(pHolder->szFrEqu); } else { pHolder->nToCol = nSubItem; id.handle().getIntoAsciiBuffer(pHolder->szToEqu); } m_wndList.SetItemData(nItem, (DWORD_PTR)pHolder); } } AcDbBlockReference *pRef = AcDbBlockReference::cast(pEnt); if (pRef != NULL) { AecDbObjXDataMap xData; if (m_nAssocNoorName == 0) xData.SetAt(KEY_NO, dlg.m_sNo); else xData.SetAt(KEY_NAME, dlg.m_sNo); xData.Write(pRef,KEY_ASSOIC); EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(nItem); if (pHolder != NULL) { if (nFrOrTo == 0) { pHolder->nFrCol = nSubItem; id.handle().getIntoAsciiBuffer(pHolder->szFrEqu); } else { pHolder->nToCol = nSubItem; id.handle().getIntoAsciiBuffer(pHolder->szToEqu); } } else { pHolder = new EquHolder; memset(pHolder, 0, sizeof(EquHolder)); if (nFrOrTo == 0) { pHolder->nFrCol = nSubItem; id.handle().getIntoAsciiBuffer(pHolder->szFrEqu); } else { pHolder->nToCol = nSubItem; id.handle().getIntoAsciiBuffer(pHolder->szToEqu); } m_wndList.SetItemData(nItem, (DWORD_PTR)pHolder); } } pEnt->close(); } } } } void CDLFSDlg::OnSelToEqu(int nItem, int nSubItem) { ShowWindow(SW_MINIMIZE); OnSetEquNo(nItem, nSubItem, 1); ShowWindow(SW_NORMAL); } void CDLFSDlg::OnSelTermPoint(int nItem, int nSubItem) { ShowWindow(SW_MINIMIZE); CAcModuleResourceOverride myResources; CXYCDDlg dlg; dlg.m_sEqu = m_wndList.GetItemText(nItem, nSubItem); if (IDOK == dlg.DoModal()) { AcAxDocLock lock; ads_point pt1; acdbUcs2Wcs(dlg.m_pt, pt1, false); pt1[Z] = dlg.m_dEl; //创建一个 AcDbObjectId idLay = KTSetting::InitLayer(LAY_CABTRY_OUT); AecDbDirPosition *pDirPt = new AecDbDirPosition; pDirPt->SetPosition(asPnt3d(pt1)); pDirPt->SetSys(dlg.m_sSys); pDirPt->SetOnEqu(dlg.m_sEqu); pDirPt->setLayer(idLay); AcDbObjectId idPt = CoreTools::AddToModelSpace(pDirPt); } ShowWindow(SW_NORMAL); } bool CDLFSDlg::GetItemCableData(int nItem, CableData& data) { if (m_nCableSpec != -1) { CString sText = m_wndList.GetItemText(nItem, m_nCableSpec); sText.MakeUpper(); if (sText.IsEmpty()) return false; _tcscpy(data.szSpec, (LPCTSTR)sText); //可能的替换到, 便于解析 sText.Replace(_T(","), _T(",")); sText.Replace(_T(";"), _T(",")); sText.Replace(_T(";"), _T(",")); //ZRA-YJV-1kV,5x2.5 小写,分解 std::vector arTxts; CoreTools::SplitStrintToArray(sText, arTxts, _T(',')); double dD = 0.0,dVal = 0.0; int nKv = 0,nKv2 = -1; data.dV = 0; data.dD = 0; CString sItem,sKv; for (int i = 0;i < arTxts.size();i++) { sItem = arTxts.at(i); sItem.MakeUpper();//大写 if (sItem.Find(_T('X')) != -1) { //含有截面 _tcscpy(data.szSect, (LPCTSTR)sItem); sItem.Replace(_T('X'), _T('*')); dD = 0.0; } else { nKv = sItem.Find(_T("KV")); if ( nKv != -1) { //向前找不是数字的停止,一般5个数字最多 int nFr = -1; for (int ii = 1;ii < 5;ii++) { nFr = nKv - ii; TCHAR chP = sItem.GetAt(nFr); if (::isdigit(chP)) { //continue } else { break; } } if (nFr != -1) { data.dV = _ttoi(sItem.Mid(nFr, nKv - nFr)) * 1000; } else { //粗略计算 nKv2 = sItem.ReverseFind(_T('-')); if (nKv2 < nKv) { sKv = sItem.Mid(nKv2 + 1, nKv - nKv2 - 1); data.dV = _ttoi(sKv) * 1000; } } } else { nKv = sItem.Find(_T("V")); if (nKv != -1) { //向前找不是数字的停止,一般5个数字最多 int nFr = -1; for (int ii = 1; ii < 5; ii++) { nFr = nKv - ii; TCHAR chP = sItem.GetAt(nFr); if (::isdigit(chP)) { //continue } else { break; } } if (nFr != -1) { data.dV = _ttoi(sItem.Mid(nFr, nKv - nFr)); } else { nKv2 = sItem.ReverseFind(_T('-')); if (nKv2 < nKv) { sKv = sItem.Mid(nKv2 + 1, nKv - nKv2 - 1); data.dV = _ttoi(sKv); } } } } } } int nHn = m_wndList.GetHeaderCtrl()->GetItemCount() - 2; if (nHn > 0) { HDITEM hdItem; hdItem.mask = HDI_TEXT; TCHAR szBuffer[MAX_PATH]; hdItem.pszText = szBuffer; hdItem.cchTextMax = MAX_PATH; m_wndList.GetHeaderCtrl()->GetItem(nHn, &hdItem); if (_tcscmp(szBuffer, _T("电缆外径")) == 0) { sItem = m_wndList.GetItemText(nItem,nHn); data.dD = _ttof(sItem); } } nHn = m_wndList.GetHeaderCtrl()->GetItemCount() - 1; if (nHn > 0) { HDITEM hdItem; hdItem.mask = HDI_TEXT; TCHAR szBuffer[MAX_PATH]; hdItem.pszText = szBuffer; hdItem.cchTextMax = MAX_PATH; m_wndList.GetHeaderCtrl()->GetItem(nHn, &hdItem); if (_tcscmp(szBuffer, _T("电缆系统")) == 0) { sItem = m_wndList.GetItemText(nItem, nHn); //data.dD = _ttof(sItem); _tcscpy(data.szSys, (LPCTSTR)sItem); } } //截面 单独列 if (m_nCableSectCol != -1) { sItem = m_wndList.GetItemText(nItem, m_nCableSectCol); _tcscpy(data.szSect, (LPCTSTR)sItem); } return true; } return false; } bool HilightEntity(AcDbObjectId &id) { //时刻闪动,知道用户按space键 AcDbEntity *pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead)) { //pEnt->setVisibility(AcDb::kVisible); pEnt->highlight(); pEnt->close(); return true; } return false; } void HightEqu(LPCTSTR pszFrEqu) { if (pszFrEqu == NULL) return; if (_tcslen(pszFrEqu) == 0) return; AcDbHandle hd(pszFrEqu); AcDbObjectId id; AcAxDocLock lock; if (Acad::eOk == acdbCurDwg()->getAcDbObjectId(id, false, hd)) { //加入选择集 ads_name ssPick, ent; acdbGetAdsName(ent, id); acedSSAdd(ent, NULL, ssPick); acedSSSetFirst(ssPick, ssPick); acedSSFree(ssPick); AcDbExtents ext; AcDbEntity *pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead)) { pEnt->getGeomExtents(ext); pEnt->close(); } KTTempZoom::arxZoom(asDblArray(ext.minPoint()), asDblArray(ext.maxPoint())); acedUpdateDisplay(); acedPostCommand(_T("regen ")); } } void CDLFSDlg::AppendLockPath(EquHolder *pHolder, LPCTSTR pszHd) { if (_tcslen(pHolder->szLockPathBy) == 0) { _tcscat(pHolder->szLockPathBy, pszHd); _tcscat(pHolder->szLockPathBy, _T(",")); } else { //追加到 CString sHd; CStringArray arInfo; CoreTools::SplitStrintToArray(pHolder->szLockPathBy, arInfo, _T(',')); for (int i = 0;i < arInfo.GetSize();i++) { sHd = arInfo.GetAt(i); if (sHd.CompareNoCase(pszHd) == 0) { //已经添加 return; } } //不能超过最大 LOCKPATH_MAX if ((_tcslen(pHolder->szLockPathBy) + _tcslen(pszHd)) >= LOCKPATH_MAX) { return; } _tcscat(pHolder->szLockPathBy, pszHd); _tcscat(pHolder->szLockPathBy, _T(",")); } //写入起点 终点 设备中 AppendEquLockPath(pHolder->szFrEqu, pszHd); AppendEquLockPath(pHolder->szToEqu, pszHd); } void CDLFSDlg::AppendEquLockPath(LPCTSTR pszEqu, LPCTSTR pszHd) { AcDbDatabase *pDb = acdbCurDwg(); if (pDb == NULL) return; AcDbHandle hdFr(pszEqu); AcDbObjectId id; if (Acad::eOk == pDb->getAcDbObjectId(id, false, hdFr) ) { AcDbEntity *pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite)) { AecDbObjXDataMap xData; xData.Read(pEnt, KEY_LOCKPATH); xData.SetAt(pszHd,pszHd); xData.Write(pEnt, KEY_LOCKPATH); pEnt->close(); } } } void CDLFSDlg::OnPathPassBy(int nItem, int nSubItem) { ShowWindow(SW_MINIMIZE); //选择起点,终点. 或绘制路径? EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(nItem); if (pHolder != NULL) { if (_tcslen(pHolder->szFrEqu) > 0 && _tcslen(pHolder->szToEqu) > 0)//有起点 终点 { //选择路径. 在桥架 或 电缆沟 路径线 上选择 ads_name ss,ent; AcDbObjectId id; TCHAR szHd[17]; struct resbuf *pRb = acutBuildList(RTDXF0, DXF_ROUT_PATH, 0); int nRes = CKTCadUtility::SelectEntities(_T("\n请选择电缆必须经过的桥架、电缆沟、预埋路径:"), ss, pRb); acutRelRb(pRb); AcAxDocLock lock; if (nRes == RTNORM) { Adesk::Int32 nLen = 0; acedSSLength(ss, &nLen); for (int i = 0;i < nLen;i++) { acedSSName(ss, i, ent); acdbGetObjectId(id, ent); id.handle().getIntoAsciiBuffer(szHd); AppendLockPath(pHolder,szHd); } acedSSFree(ss); } } else { AfxMessageBox(_T("选择的条目起点或终点信息没有关联设备!")); } } ShowWindow(SW_NORMAL); } void CDLFSDlg::OnPathPassByNo(int nItem, int nSubItem) { //选择起点,终点. 或绘制路径? EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(nItem); if (pHolder != NULL) { if (_tcslen(pHolder->szFrEqu) > 0 && _tcslen(pHolder->szToEqu) > 0)//有起点 终点 { AcAxDocLock lock; RemoveEquLockPath(pHolder->szFrEqu); RemoveEquLockPath(pHolder->szToEqu); } } } void CDLFSDlg::RemoveEquLockPath(LPCTSTR pszEqu) { AcDbDatabase *pDb = acdbCurDwg(); if (pDb == NULL) return; AcDbHandle hdFr(pszEqu); AcDbObjectId id; if (Acad::eOk == pDb->getAcDbObjectId(id, false, hdFr)) { AcDbEntity *pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite)) { AecDbObjXDataMap xData; xData.Read(pEnt, KEY_LOCKPATH); xData.Empty(); xData.SetAt(_T("NULL"), _T("NULL")); xData.Write(pEnt, KEY_LOCKPATH); pEnt->close(); } } } void CDLFSDlg::OnRoutingOn(int nItem, int nSubItem) { EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(nItem); if (pHolder != NULL) { /*if (pHolder->nFrCol == nSubItem) { HightEqu(pHolder->szFrEqu); return; } if (pHolder->nToCol == nSubItem) { HightEqu(pHolder->szFrEqu); return; }*/ int nUnit = 1000;//默认毫米 struct resbuf rb; acedGetVar(_T("INSUNITS"), &rb); if (rb.resval.rint == AcDb::kUnitsMeters) { nUnit = 1; } AcAxDocLock lock; CString sKey; //其他显示搜索的路径 if (_tcslen(pHolder->szPath) == 0)//没有敷设 { if (_tcslen(pHolder->szFrEqu) > 0 && _tcslen(pHolder->szToEqu) > 0)//有起点 终点 { AcDbDatabase *pDb = acdbCurDwg(); AcDbHandle hdFr(pHolder->szFrEqu); AcDbHandle hdTo(pHolder->szToEqu); AcDbObjectId idFr,idTo; if (Acad::eOk == pDb->getAcDbObjectId(idFr,false,hdFr) && Acad::eOk == pDb->getAcDbObjectId(idTo,false,hdTo) ) { CableData data; memset(&data, 0, sizeof(CableData)); GetItemCableData(nItem, data); //找到多条路径,默认取最短路径,由用户决定选择路径 AcDbObjectId idPath; CCableRouting crut; crut.SetBypassDis(m_dBypassDis * nUnit); crut.SetPathOnPoint(m_dPathOnPoint * nUnit); crut.SetEquFindDis(m_dEquFindDis * nUnit); crut.SetIgoreFillUsed(m_bIgoreFillUsed); crut.SetAssocNoorName(m_nAssocNoorName); CString sPathSteps; if (crut.SearchRouting(idFr, idTo, data, m_nPathUserDo,idPath, sPathSteps)) { idPath.handle().getIntoAsciiBuffer(pHolder->szPath); //填写计算结果 CString sLen; sLen.Format(_T("%.3f"), data.dLen / nUnit + m_dLenRever);//米 m_wndList.SetItemText(nItem, m_nCableLenCol, sLen); m_wndList.SetItemText(nItem, m_nPathNosCol, sPathSteps); //CPoint pt(lstLn.nItem, m_nCableLenCol); sKey.Format(_T("%d,%d"), nItem, m_nCableLenCol); m_mapSubItem2Modified.SetAt(sKey, TRUE); } } } } else //动态显示已经找到的路径 { AcDbDatabase *pDb = acdbCurDwg(); AcDbHandle hdPh(pHolder->szPath); AcDbObjectId idPh; if (Acad::eOk == pDb->getAcDbObjectId(idPh, false, hdPh) ) { if (!HilightEntity(idPh))//没有路径 { //if (!idPh.isValid())//无效 { acedAlert(_T("敷设路径已删除!开始重新敷设...")); if (_tcslen(pHolder->szFrEqu) > 0 && _tcslen(pHolder->szToEqu) > 0)//有起点终点 { AcDbDatabase *pDb = acdbCurDwg(); AcDbHandle hdFr(pHolder->szFrEqu); AcDbHandle hdTo(pHolder->szToEqu); AcDbObjectId idFr, idTo; if (Acad::eOk == pDb->getAcDbObjectId(idFr, false, hdFr) && Acad::eOk == pDb->getAcDbObjectId(idTo, false, hdTo)) { CableData data; memset(&data, 0, sizeof(CableData)); GetItemCableData(nItem, data); //找到多条路径,默认取最短路径,由用户决定选择路径 AcDbObjectId idPath; CCableRouting crut; crut.SetBypassDis(m_dBypassDis * nUnit); crut.SetPathOnPoint(m_dPathOnPoint * nUnit); crut.SetEquFindDis(m_dEquFindDis * nUnit); crut.SetIgoreFillUsed(m_bIgoreFillUsed); CString sPathSteps; if (crut.SearchRouting(idFr, idTo, data, m_nPathUserDo, idPath, sPathSteps)) { idPath.handle().getIntoAsciiBuffer(pHolder->szPath); //填写计算结果 CString sLen; sLen.Format(_T("%.3f"), data.dLen / nUnit + m_dLenRever);//米 m_wndList.SetItemText(nItem, m_nCableLenCol, sLen); m_wndList.SetItemText(nItem, m_nPathNosCol, sPathSteps); //CPoint pt(lstLn.nItem, m_nCableLenCol); sKey.Format(_T("%d,%d"), nItem, m_nCableLenCol); m_mapSubItem2Modified.SetAt(sKey, TRUE); } } } HilightEntity(idPh); return; } } } } } } void CDLFSDlg::OnSetup(int nItem, int nSubItem) { OnBnClickedButton9(); } static CString GetCol(int nCol) { CString sCell = _T(""); CString sTitleA_Z = _T("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); if (nCol < 26) { sCell += sTitleA_Z.GetAt(nCol); } return sCell; } //写出清册 void CDLFSDlg::OnBnClickedButton2() { if (m_sXLSFile.IsEmpty() || m_nSheetIndex == -1) { AfxMessageBox(_T("当前没有读取清册页!")); return; } //sys\\电缆敷设清单.xls //m_mapCell2CableLenCol 写回 CWaitCursor wait; ::CoInitialize(NULL); _Application excelApp; Workbooks excelBooks; _Workbook excelBook; Worksheets excelSheets; _Worksheet excelSheet; COleVariant vResult; COleVariant covTrue((short)TRUE), covFalse((short)FALSE); Range range; Range iCell; Validation vald; BOOL bSuccess = excelApp.CreateDispatch(_T("excel.application")); if (bSuccess) { LPDISPATCH pLpDisp = NULL; excelBooks.AttachDispatch(excelApp.GetWorkbooks()); COleVariant vOp((long)DISP_E_PARAMNOTFOUND, VT_ERROR); COleVariant vResult; COleVariant covTrue((short)TRUE), covFalse((short)FALSE); COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); CString sSysPath = FilePath::GetSysDir(); CString sTmpXLS = sSysPath; sTmpXLS += _T("\\电缆敷设清单.xls"); pLpDisp = excelBooks.Open(sTmpXLS, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional); if (pLpDisp == NULL) { AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!")); return; } excelBook.AttachDispatch(pLpDisp); //得到Worksheets excelSheets.AttachDispatch(excelBook.GetWorksheets()); //获取sheet 数量 bool bModified = false; short nSheetIndex = 1; COleVariant varIndex(nSheetIndex); pLpDisp = excelSheets.GetItem(varIndex); if (pLpDisp != NULL) { excelSheet.AttachDispatch(pLpDisp); CUIntArray arAZPos; CString sCell, sVal,sKey; //全写特别慢.... /* CPoint pt; BOOL bMod = 0; for (POSITION ps = m_mapSubItem2Modified.GetStartPosition(); ps != NULL;) { //sCell A10 //CPoint pt(nItem, m_nCableLenCol); m_mapSubItem2Modified.GetNextAssoc(ps, sKey, bMod); if (bMod)//敷设填写的数据 { //(nItem, m_nCableLenCol) -- D10 if (m_mapSubItem2Cell.Lookup(sKey, sCell))//找到sheet cell { int nPos = sKey.Find(_T(',')); if (nPos != -1) { pt.x = _ttoi(sKey.Mid(0, nPos)); pt.y = _ttoi(sKey.Mid(nPos + 1)); sVal = m_wndList.GetItemText(pt.x, pt.y); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant varVal(sVal); range.SetValue(varVal); bModified = true; } } } }*/ //写表头 CHeaderCtrl* pHeadCtrl = m_wndList.GetHeaderCtrl(); int nRow = 1; HDITEM hdItem; hdItem.mask = HDI_TEXT; TCHAR szBuffer[MAX_PATH]; hdItem.pszText = szBuffer; hdItem.cchTextMax = MAX_PATH; for (int i = 0;i < pHeadCtrl->GetItemCount();i++) { pHeadCtrl->GetItem(i, &hdItem); sVal = szBuffer; //A1 B1 C1 sCell.Format(_T("%s%d"),GetCol(i), nRow); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant varVal(sVal); range.SetValue(varVal); } nRow += 1; // for (int i = 0;i < m_wndList.GetItemCount();i++) { for (int j = 0;j < pHeadCtrl->GetItemCount();j++) { sVal = m_wndList.GetItemText(i, j); sCell.Format(_T("%s%d"), GetCol(j), nRow); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant varVal(sVal); range.SetValue(varVal); } nRow += 1; } bModified = TRUE; } if (bModified) { //另外保存新文件 CString sSaveAsFileName = m_sXLSFile; //年月 日 分 秒 文件记录 CString sAdd; CTime tNow = CTime::GetCurrentTime(); sAdd = tNow.Format("_%Y-%m-%d_%H.%M.%S"); sAdd += _T(".xls"); sSaveAsFileName.MakeLower(); if (sSaveAsFileName.Find(_T(".xlsx")) != -1) sSaveAsFileName.Replace(_T(".xlsx"), sAdd); else sSaveAsFileName.Replace(_T(".xls"), sAdd); COleVariant varNewEFile(sSaveAsFileName); excelBook.SaveAs(varNewEFile, covOptional, covOptional, covOptional, covOptional, covOptional, 0, covOptional, covOptional, covOptional, covOptional); } excelBooks.Close(); //excelApp.Quit(); } } void CDLFSDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); int nItem = pNMItemActivate->iItem; int nSubItem = pNMItemActivate->iSubItem; //显示高亮路径 EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(nItem); if (pHolder != NULL) { if (_tcslen(pHolder->szPath) > 0 && nSubItem != m_nEquFrCol && nSubItem != m_nEquToCol) { AcDbHandle hd(pHolder->szPath); AcDbDatabase *pDb = acdbCurDwg(); if (pDb != NULL) { AcDbObjectId id; if (Acad::eOk == pDb->getAcDbObjectId(id, false, hd)) { AcAxDocLock lock; HilightEntity(id); } } } if (_tcslen(pHolder->szFrEqu) > 0 && nSubItem == m_nEquFrCol) { HightEqu(pHolder->szFrEqu); } if (_tcslen(pHolder->szToEqu) > 0 && nSubItem == m_nEquToCol) { HightEqu(pHolder->szToEqu); } } *pResult = 0; } //查询外径 void CDLFSDlg::OnBnClickedButton3() { //[电缆型号]表单==> 截面(mm2) 电缆外径(mm) 系统分类 if (m_sXLSFile.IsEmpty()) { AfxMessageBox(_T("请先打开电缆清单文件!")); return; } if (m_nCableSpec == -1) { AfxMessageBox(_T("请先执行电缆清单设置!")); return; } CAcModuleResourceOverride myResources; CDLWJDlg dlg; HDITEM hdItem; hdItem.mask = HDI_TEXT; TCHAR szBuffer[MAX_PATH]; hdItem.pszText = szBuffer; hdItem.cchTextMax = MAX_PATH; m_wndList.GetHeaderCtrl()->GetItem(m_nCableSpec, &hdItem); dlg.m_sCableSpecCol = szBuffer; if (IDOK == dlg.DoModal()) { //从数据库xls中更新 敷设优先级 ::CoInitialize(NULL); _Application excelApp; Workbooks excelBooks; _Workbook excelBook; Worksheets excelSheets; _Worksheet excelSheet; COleVariant vResult; COleVariant covTrue((short)TRUE), covFalse((short)FALSE); CString sSheetName2,sCell, sText, sText2,sSpec,sSpec2,sOD, sSect,sSys; CMapStringToString mapSpec2OD, mapSpec2Sys; Range range; Range iCell; Validation vald; BOOL bSuccess = excelApp.CreateDispatch(_T("excel.application")); if (bSuccess) { LPDISPATCH pLpDisp = NULL; excelBooks.AttachDispatch(excelApp.GetWorkbooks()); COleVariant vOp((long)DISP_E_PARAMNOTFOUND, VT_ERROR); COleVariant vUpdateLinks((short)0), vReadOnly((short)1), vFormat = vOp, vPassword = vOp; COleVariant vWriteResPassword = vOp, vIgnoreReadOnlyRecommended = vOp; COleVariant vOrigin = vOp, vDelimiter = vOp, vEditable((short)0), vNotify = vOp, vConverter = vOp, vAddToMru = vOp; pLpDisp = excelBooks.Open(dlg.m_sCableODDbFile, vUpdateLinks, vReadOnly, vFormat, vPassword, vWriteResPassword, vIgnoreReadOnlyRecommended, vOrigin, vDelimiter, vEditable, vNotify, vConverter, vAddToMru); if (pLpDisp == NULL) { AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!")); return; } excelBook.AttachDispatch(pLpDisp); //得到Worksheets excelSheets.AttachDispatch(excelBook.GetWorksheets()); //获取sheet 数量 long lCount = excelSheets.GetCount(); for (short nSheetIndex = 1; nSheetIndex <= lCount; nSheetIndex++) { COleVariant varIndex(nSheetIndex); pLpDisp = excelSheets.GetItem(varIndex); if (pLpDisp != NULL) { excelSheet.AttachDispatch(pLpDisp); CUIntArray arAZPos; sSheetName2 = excelSheet.GetName(); //ZR-YJV-0.6|1KV-->ZR-YJV-0.6/1KV sSheetName2.Replace(_T('|'), _T('/')); { int nRowFrom = 2; int nRowTo = 65535; //读取数据 for (int n = nRowFrom; n <= nRowTo; n++) { sSpec = sSheetName2; sSpec.TrimLeft(); sSpec.TrimRight(); sSpec2 = sSpec; //A 截面(mm2) B 电缆外径(mm) C 系统分类 //A 截面mm2 sCell.Format(_T("%s%d"), _T("A"), n); COleVariant varCell2(sCell); range = excelSheet.GetRange(varCell2, varCell2); sText = _T(""); COleVariant val2 = range.GetValue(); Variant2String(val2, sText); sText.TrimRight(); sText.TrimLeft(); range.ReleaseDispatch(); if (sText.IsEmpty()) break; sSect = sText; //B 电缆外径 sCell.Format(_T("%s%d"), _T("B"), n); COleVariant varCell3(sCell); range = excelSheet.GetRange(varCell3, varCell3); sText = _T(""); COleVariant val3 = range.GetValue(); Variant2String(val3, sText); sText.TrimRight(); sText.TrimLeft(); range.ReleaseDispatch(); if (sText.IsEmpty()) break; sOD = sText; //C 系统分类 sCell.Format(_T("%s%d"), _T("C"), n); COleVariant varCell4(sCell); range = excelSheet.GetRange(varCell4, varCell4); sText = _T(""); COleVariant val4 = range.GetValue(); Variant2String(val4, sText); sText.TrimRight(); sText.TrimLeft(); range.ReleaseDispatch(); if (sText.IsEmpty()) break; sSys = sText; //ZRA-YJV-1kV,3x120+2x70 或 ZRA-YJV-1kV-3x120+2x70 sSpec += _T("-"); sSpec += sSect; sSpec2 += _T(","); sSpec2 += sSect; sOD.TrimLeft(); sOD.TrimRight(); sSpec.TrimLeft(); sSpec.TrimRight(); sSpec.MakeUpper(); sSpec2.MakeUpper(); mapSpec2OD.SetAt(sSpec, sOD); mapSpec2OD.SetAt(sSpec2, sOD); mapSpec2Sys.SetAt(sSpec,sSys); mapSpec2Sys.SetAt(sSpec2,sSys); } } } } excelBooks.Close(); //excelApp.Quit(); int nODCol = m_wndList.GetHeaderCtrl()->GetItemCount() - 2; int nSysCol = m_wndList.GetHeaderCtrl()->GetItemCount() - 1; if (m_nCableSpec != -1 && nODCol > 0) { int nPos = -1; for (int i = 0;i < m_wndList.GetItemCount();i++) { sSpec = m_wndList.GetItemText(i, m_nCableSpec); sSpec.TrimRight(); sSpec.TrimLeft(); sText = sSpec; //如果有空格,取空格前面的为型号 nPos = sSpec.ReverseFind(_T(' ')); if (nPos != -1) { sText = sSpec.Mid(0, nPos); } sText2 = sText; if (!m_bHasSect)//不含标称截面 { if (m_nCableSectCol != -1) { sSect = m_wndList.GetItemText(i, m_nCableSectCol); sText += _T(","); sText += sSect; sText2 += _T("-"); sText2 += sSect; } } sText.MakeUpper(); sText2.MakeUpper(); //ZR-YJV-0.6|1KV-->ZR-YJV-0.6/1KV sText.Replace(_T('|'), _T('/')); sText2.Replace(_T('|'), _T('/')); //外径 sOD = _T(""); if (mapSpec2OD.Lookup(sText, sOD) ) { m_wndList.SetItemText(i, nODCol, sOD); } if (mapSpec2OD.Lookup(sText2, sOD)) { m_wndList.SetItemText(i, nODCol, sOD); } //系统 sSys = _T(""); if (mapSpec2Sys.Lookup(sText, sSys)) { m_wndList.SetItemText(i, nSysCol, sSys); } if (mapSpec2Sys.Lookup(sText2, sOD)) { m_wndList.SetItemText(i, nSysCol, sSys); } } } m_wndList.Invalidate(); m_wndList.RedrawWindow(); } else { AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!")); } } } HBRUSH CDLFSDlg::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (nCtlColor == CTLCOLOR_STATIC) { if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_ASS) { COLORREF crColor = RGB(0, 255, 0);//GREEN pDC->SetTextColor(crColor); } else if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_USS) { COLORREF crColor = RGB(255, 0, 0);//RED pDC->SetTextColor(crColor); } } return hbr; } bool CDLFSDlg::GetListHead(ListHead& head) { CString sDwgFile = curDoc()->fileName(); int nPos = sDwgFile.ReverseFind(_T('.')); if (nPos != -1) { CString sFileName, sStack, sEl; sFileName = sDwgFile.Mid(0, nPos); head.m_nEquFrCol = m_nEquFrCol; head.m_nEquToCol = m_nEquToCol; head.m_nCableLenCol = m_nCableLenCol; head.m_nCableSpec = m_nCableSpec; head.m_nPathUserDo = m_nPathUserDo; head.m_dLenRever = m_dLenRever; head.m_nAssocNoorName = m_nAssocNoorName; head.m_nSheetIndex = m_nSheetIndex; for (int i = 0; i < 17; i++) { head.m_nPriSteps[i] = -1; } for (int j = 0; j < m_arPriSteps.GetSize(); j++) { head.m_nPriSteps[i] = m_arPriSteps.GetAt(j); } _tcscpy(head.m_szDwgFileName, sFileName); _tcscpy(head.m_szXLSFile, m_sXLSFile); HDITEM hdItem; hdItem.mask = HDI_TEXT; TCHAR szBuffer[MAX_PATH]; hdItem.pszText = szBuffer; hdItem.cchTextMax = MAX_PATH; CString sTxt, sItem; for (int j = 0; j < head.m_nItemCount; j++) { m_wndList.GetHeaderCtrl()->GetItem(m_nCableSpec, &hdItem); sTxt += szBuffer; if (j < head.m_nItemCount - 1) sTxt += _T("@"); } _tcscpy(head.m_szHeadList, (LPCTSTR)sTxt); return true; } return false; } //保存敷设 void CDLFSDlg::OnBnClickedButton5() { } bool CableSumCmpFnc(const CableSum& data1, const CableSum& data2) { return false; } //根据定制格式,输出报表 void CDLFSDlg::OnBnClickedButton6() { //汇总列,模板 CString sSysPath = FilePath::GetSysDir(); CString sIniFile, sXlsFile; sIniFile.Format(_T("%s\\%s"),sSysPath,_T("电缆汇总.ini")); CFileFind find; if (find.FindFile(sIniFile)) { /* * A = 序号 B = 电缆及规格 C = 截面 D = 全长 E = 电缆外径 F = 电缆系统 G = 备注 */ CString sTip; TCHAR szVal[MAX_PATH]; memset(szVal, 0, sizeof(TCHAR)* MAX_PATH); if (0 == ::GetPrivateProfileString(_T("File"), _T("Templ"), _T(""), szVal, MAX_PATH, sIniFile)) return; sXlsFile.Format(_T("%s\\%s"), sSysPath, szVal); if (!find.FindFile(sXlsFile)) { sTip.Format(_T("汇总模板文件[%s]不存在!"),sXlsFile); AfxMessageBox(sTip); return; } memset(szVal, 0, sizeof(TCHAR) * MAX_PATH); if (0 == ::GetPrivateProfileString(_T("Row"), _T("RowFrom"), _T(""), szVal, MAX_PATH, sIniFile)) return; int nRowFrom = _ttoi(szVal); memset(szVal, 0, sizeof(TCHAR) * MAX_PATH); if (0 == ::GetPrivateProfileString(_T("Row"), _T("Cells"), _T(""), szVal, MAX_PATH, sIniFile)) return; //继续读 cells CStringArray arCells; CoreTools::SplitStrintToArray(szVal, arCells, _T(',')); //写入的位置 CString sCell, sName,sTitle; CMapStringToString mapCellToName; for (int i = 0;i < arCells.GetSize();i++) { sCell = arCells.GetAt(i); memset(szVal, 0, sizeof(TCHAR) * MAX_PATH); if (0 == ::GetPrivateProfileString(_T("Cell"), sCell, _T(""), szVal, MAX_PATH, sIniFile)) return; mapCellToName.SetAt(sCell, szVal); } CHeaderCtrl *pHeadCtrl = m_wndList.GetHeaderCtrl(); CStringArray arTitle; HDITEM hdItem; hdItem.mask = HDI_TEXT; TCHAR szBuffer[MAX_PATH]; hdItem.pszText = szBuffer; hdItem.cchTextMax = MAX_PATH; for (int i = 0; i < pHeadCtrl->GetItemCount(); i++) { pHeadCtrl->GetItem(i, &hdItem); sTitle = szBuffer; arTitle.Add(sTitle); } if (m_nODCol == -1 || m_nSysCol == -1) return; CString sSpec, sSect, sSys, sOD, sLen,sKey; CableSum* pData = NULL; CMapStringToPtr mapSumm2Data; std::vector vtCableSumPtrs; acedSetStatusBarProgressMeter(_T("正在汇总..."), 0, m_wndList.GetItemCount()); for (int i = 0;i < m_wndList.GetItemCount();i++) { acedSetStatusBarProgressMeterPos(i); //电缆规格 sSpec = m_wndList.GetItemText(i, m_nCableSpec); sSpec.TrimRight(); if (sSpec.IsEmpty()) continue; //截面 sSect = m_wndList.GetItemText(i, m_nCableSectCol); //电缆系统 sSys = m_wndList.GetItemText(i, m_nSysCol); //外径 sOD = m_wndList.GetItemText(i, m_nODCol); //全长 sLen = m_wndList.GetItemText(i, m_nCableLenCol); sKey.Format(_T("%s-%s"), sSpec, sSect); if (mapSumm2Data.Lookup(sKey, (void *&)pData)) { //汇总 pData->dLen += _ttof(sLen); } else { pData = new CableSum; memset(pData, 0, sizeof(CableSum)); _tcscpy(pData->szSpec, (LPCTSTR)sSpec); _tcscpy(pData->szSect, (LPCTSTR)sSect); _tcscpy(pData->szSys, (LPCTSTR)sSys); pData->dOD = _ttof(sOD); pData->dLen = _ttof(sLen); mapSumm2Data.SetAt(sKey, pData); vtCableSumPtrs.push_back(pData); } } acedRestoreStatusBar(); //std::sort(vtCableSumPtrs.begin(), vtCableSumPtrs.end(), CableSumCmpFnc); //... CWaitCursor wait; ::CoInitialize(NULL); _Application excelApp; Workbooks excelBooks; _Workbook excelBook; Worksheets excelSheets; _Worksheet excelSheet; COleVariant vResult; COleVariant covTrue((short)TRUE), covFalse((short)FALSE); Range range; Range iCell; Validation vald; BOOL bSuccess = excelApp.CreateDispatch(_T("excel.application")); if (bSuccess) { LPDISPATCH pLpDisp = NULL; excelBooks.AttachDispatch(excelApp.GetWorkbooks()); COleVariant vOp((long)DISP_E_PARAMNOTFOUND, VT_ERROR); COleVariant vResult; COleVariant covTrue((short)TRUE), covFalse((short)FALSE); COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); pLpDisp = excelBooks.Open(sXlsFile, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional); if (pLpDisp == NULL) { AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!")); return; } excelBook.AttachDispatch(pLpDisp); //得到Worksheets excelSheets.AttachDispatch(excelBook.GetWorksheets()); //获取sheet 数量 bool bModified = false; short nSheetIndex = 1; COleVariant varIndex(nSheetIndex); pLpDisp = excelSheets.GetItem(varIndex); if (pLpDisp != NULL) { excelSheet.AttachDispatch(pLpDisp); CUIntArray arAZPos; CString sCell, sVal, sKey,sItem; int nRow = nRowFrom; // for (int i = 0; i < vtCableSumPtrs.size(); i++) { pData = vtCableSumPtrs.at(i); for (POSITION ps = mapCellToName.GetStartPosition();ps != NULL;) { mapCellToName.GetNextAssoc(ps,sKey, sName); /* * A = 序号 B = 电缆及规格 C = 截面 D = 全长 E = 电缆外径 F = 电缆系统 G = 备注 */ //CableSum 的 文本 涵盖 sName //电缆及规格 if (sName.Find(_T("电缆及规格")) != -1) { //A1 B1 C1 sCell.Format(_T("%s%d"), sKey, nRow); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant varVal(pData->szSpec); range.SetValue(varVal); continue; } //截面 if (sName.Find(_T("截面")) != -1) { //A1 B1 C1 sCell.Format(_T("%s%d"), sKey, nRow); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant varVal(pData->szSect); range.SetValue(varVal); continue; } //电缆系统 if (sName.Find(_T("电缆系统")) != -1) { //A1 B1 C1 sCell.Format(_T("%s%d"), sKey, nRow); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant varVal(pData->szSys); range.SetValue(varVal); continue; } //电缆外径 if (sName.Find(_T("电缆外径")) != -1) { //A1 B1 C1 sCell.Format(_T("%s%d"), sKey, nRow); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant varVal(pData->dOD); range.SetValue(varVal); continue; } //全长 if (sName.Find(_T("全长")) != -1) { //A1 B1 C1 sCell.Format(_T("%s%d"), sKey, nRow); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant varVal(pData->dLen); range.SetValue(varVal); continue; } //序号 if (sName.Find(_T("序号")) != -1) { //A1 B1 C1 sCell.Format(_T("%s%d"), sKey, nRow); COleVariant varCell(sCell); range = excelSheet.GetRange(varCell, varCell); COleVariant varVal( (long)(nRow - nRowFrom + 1)); range.SetValue(varVal); continue; } //... } nRow += 1; } bModified = TRUE; } CString sSaveAsFileName = sXlsFile; if (bModified) { //另外保存新文件 //年月 日 分 秒 文件记录 CString sAdd; CTime tNow = CTime::GetCurrentTime(); sAdd = tNow.Format("_%Y-%m-%d_%H.%M.%S"); sAdd += _T(".xls"); sSaveAsFileName.MakeLower(); if (sSaveAsFileName.Find(_T(".xlsx")) != -1) sSaveAsFileName.Replace(_T(".xlsx"), sAdd); else sSaveAsFileName.Replace(_T(".xls"), sAdd); COleVariant varNewEFile(sSaveAsFileName); excelBook.SaveAs(varNewEFile, covOptional, covOptional, covOptional, covOptional, covOptional, 0, covOptional, covOptional, covOptional, covOptional); } excelBooks.Close(); //excelApp.Quit(); //open if (bModified) { ShellExecute(AfxGetMainWnd()->m_hWnd, _T("open"), sSaveAsFileName, _T(""), _T(""), SW_SHOWNORMAL); } } } } //打开敷设 void CDLFSDlg::OnBnClickedButton10() { } void CDLFSDlg::OnDestroy() { KillTimer(m_nIDEvent); CDialog::OnDestroy(); }