Files
envi-code/SourceCode/Code2026/ElecCmd/CDLFSDlg.cpp
T

2705 lines
62 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
#include "stdafx.h"
2026-09-28 15:28:50 +08:00
#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;
2026-10-04 00:04:20 +08:00
m_dBypassDis = 1.0;//米
m_dEquFindDis = 2.5;//米
2026-09-28 15:28:50 +08:00
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;
}
2026-10-04 00:04:20 +08:00
//读取清册内容-> 读取完毕后,显示关联, 有关联为绿色
2026-09-28 15:28:50 +08:00
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)
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!"));
2026-09-28 15:28:50 +08:00
return;
}
excelBook.AttachDispatch(pLpDisp);
2026-10-04 00:04:20 +08:00
//得到Worksheets
2026-09-28 15:28:50 +08:00
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);
}
2026-10-04 00:04:20 +08:00
//获取sheet 数量
2026-09-28 15:28:50 +08:00
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();
2026-10-04 00:04:20 +08:00
if (sSheetName.CompareNoCase(sSheetName2) == 0)//找到页
2026-09-28 15:28:50 +08:00
{
m_nSheetIndex = nSheetIndex;
2026-10-04 00:04:20 +08:00
//抬头 From
2026-09-28 15:28:50 +08:00
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();
2026-10-04 00:04:20 +08:00
//如果为空,在往下读一行,不超过 nRowFrom
2026-09-28 15:28:50 +08:00
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();
}
2026-10-04 00:04:20 +08:00
//最后两列为 电缆外径 电缆系统
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);
2026-09-28 15:28:50 +08:00
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);
}
2026-10-04 00:04:20 +08:00
//读取数据
2026-09-28 15:28:50 +08:00
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);
}
2026-10-04 00:04:20 +08:00
//(nItem,nSubItem)---sCell 关系
2026-09-28 15:28:50 +08:00
//CPoint pt(nItem, nP);
sKey.Format(_T("%d,%d"), nItem, nP);
m_mapSubItem2Cell.SetAt(sKey, sCell);
}
}
2026-10-04 00:04:20 +08:00
break;//其他页不考虑
2026-09-28 15:28:50 +08:00
}
excelSheet.ReleaseDispatch();
}
}
excelBooks.Close();
//excelApp.Quit();
m_wndList.Invalidate();
m_wndList.RedrawWindow();
m_sXLSFile = sXLSFile;
2026-10-04 00:04:20 +08:00
sText.Format(_T("电缆敷设:%s"),m_sXLSFile);
2026-09-28 15:28:50 +08:00
SetWindowText(sText);
}
else
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!"));
2026-09-28 15:28:50 +08:00
}
}
bool SortEListLine(EListLine2& rListLast, EListLine2& rListNext)
{
2026-10-04 00:04:20 +08:00
//最后一列 外径
2026-09-28 15:28:50 +08:00
if ( rListLast.dOD <= rListNext.dOD )
{
return false;
}
return true;
}
bool CDLFSDlg::GetEListLine(std::vector<EListLine2>& 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;
}
2026-10-04 00:04:20 +08:00
//自动敷设
2026-09-28 15:28:50 +08:00
void CDLFSDlg::OnBnClickedButton7()
{
2026-10-04 00:04:20 +08:00
//检查设备是否和清单关联
2026-09-28 15:28:50 +08:00
if (!CheckEquAssocList())
{
2026-10-04 00:04:20 +08:00
int nRes = AfxMessageBox(_T("设备清单有未关联设备实体的条目!是否继续敷设?"), MB_YESNO);
2026-09-28 15:28:50 +08:00
if (nRes == IDNO)
return;
}
//...
int nPriStep = -1;
if (m_arPriSteps.GetSize() > 0)
{
std::vector<EListLine2> rList;
GetEListLine(rList);
nPriStep = m_arPriSteps.GetAt(0);
2026-10-04 00:04:20 +08:00
if (nPriStep == 0)//电缆外径 从大到小
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
//排序
2026-09-28 15:28:50 +08:00
std::sort(rList.begin(), rList.end(), SortEListLine);
}
2026-10-04 00:04:20 +08:00
else //清册顺序
2026-09-28 15:28:50 +08:00
{
}
2026-10-04 00:04:20 +08:00
int nUnit = 1000;//默认毫米
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
acedSetStatusBarProgressMeter(_T("正在自动敷设..."), 0, rList.size());
2026-09-28 15:28:50 +08:00
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;
}
2026-10-04 00:04:20 +08:00
//设置
2026-09-28 15:28:50 +08:00
void CDLFSDlg::OnBnClickedButton9()
{
if (m_wndList.GetItemCount() == 0)
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("清册表单没有内容!请先读取表单!"));
2026-09-28 15:28:50 +08:00
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())
{
2026-10-04 00:04:20 +08:00
//...设备关联, 关联上cell 为绿色 未关联为红色
2026-09-28 15:28:50 +08:00
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();
2026-10-04 00:04:20 +08:00
//查找上次保存的敷设
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
acedSetStatusBarProgressMeter(_T("正在按编号或名称搜索设备..."), 0, nLen);
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
//找列表
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
if (sEquFr.Find(sNo) != -1)//编号在 sEquFr 中体现
2026-09-28 15:28:50 +08:00
{
bFindFr = true;
2026-10-04 00:04:20 +08:00
//设置关联
2026-09-28 15:28:50 +08:00
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;
}
}
2026-10-04 00:04:20 +08:00
if (sEquTo.Find(sNo) != -1)//编号在 sEquFr 中体现
2026-09-28 15:28:50 +08:00
{
bFindTo = true;
2026-10-04 00:04:20 +08:00
//设置关联
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
//找列表
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
if (sEquFr.Find(sNo) != -1)//编号在 sEquFr 中体现
2026-09-28 15:28:50 +08:00
{
bFindFr = true;
2026-10-04 00:04:20 +08:00
//设置关联
2026-09-28 15:28:50 +08:00
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;
}
}
2026-10-04 00:04:20 +08:00
if (sEquTo.Find(sNo) != -1)//编号在 sEquFr 中体现
2026-09-28 15:28:50 +08:00
{
bFindTo = true;
2026-10-04 00:04:20 +08:00
//设置关联
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
acedSetStatusBarProgressMeter(_T("正在关联路径..."), 0, nLen);
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
acedSetStatusBarProgressMeter(_T("正在关联路径..."), 0, m_wndList.GetItemCount());
2026-09-28 15:28:50 +08:00
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))
{
2026-10-04 00:04:20 +08:00
//优先级别为 data.dD
2026-09-28 15:28:50 +08:00
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<LPNMITEMACTIVATE>(pNMHDR);
*pResult = 0;
m_wndList.Invalidate();
m_wndList.RedrawWindow();
2026-10-04 00:04:20 +08:00
//右键菜单
2026-09-28 15:28:50 +08:00
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();
2026-10-04 00:04:20 +08:00
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)"));
2026-09-28 15:28:50 +08:00
menu.AppendMenu(MF_SEPARATOR);
2026-10-04 00:04:20 +08:00
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(nItem, ID_SELTERMPT), ID_SELTERMPT, _T("添加设备接线点(&P)"));
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
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)"));
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(nItem, ID_ROUTINGON), ID_ROUTINGON, _T("选择此条目敷设(&R)"));
2026-09-28 15:28:50 +08:00
menu.AppendMenu(MF_SEPARATOR);
2026-10-04 00:04:20 +08:00
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(nItem, ID_SETUP), ID_SETUP, _T("设置(&S)"));
2026-09-28 15:28:50 +08:00
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:
{
2026-10-04 00:04:20 +08:00
//必须fr - to equ 有效的情况下
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
LPCTSTR pszMsg = _T("\n请选择设备关联此编号:");
2026-09-28 15:28:50 +08:00
struct resbuf *pRb = acutBuildList(RTDXF0, DXF_EQU, 0);
int nRes = CKTCadUtility::SelectEntity(pszMsg, ent, pRb);
acutRelRb(pRb);
if (nRes == RTNORM)
{
2026-10-04 00:04:20 +08:00
//弹出界面,由用户修改单元格的信息后填入
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
//创建一个
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
//可能的替换到, 便于解析
sText.Replace(_T(","), _T(","));
sText.Replace(_T(";"), _T(","));
2026-09-28 15:28:50 +08:00
sText.Replace(_T(";"), _T(","));
2026-10-04 00:04:20 +08:00
//ZRA-YJV-1kV,5x2.5 小写,分解
2026-09-28 15:28:50 +08:00
std::vector<CString> 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);
2026-10-04 00:04:20 +08:00
sItem.MakeUpper();//大写
2026-09-28 15:28:50 +08:00
if (sItem.Find(_T('X')) != -1)
{
2026-10-04 00:04:20 +08:00
//含有截面
2026-09-28 15:28:50 +08:00
_tcscpy(data.szSect, (LPCTSTR)sItem);
sItem.Replace(_T('X'), _T('*'));
dD = 0.0;
}
else
{
nKv = sItem.Find(_T("KV"));
if ( nKv != -1)
{
2026-10-04 00:04:20 +08:00
//向前找不是数字的停止,一般5个数字最多
2026-09-28 15:28:50 +08:00
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
{
2026-10-04 00:04:20 +08:00
//粗略计算
2026-09-28 15:28:50 +08:00
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)
{
2026-10-04 00:04:20 +08:00
//向前找不是数字的停止,一般5个数字最多
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
if (_tcscmp(szBuffer, _T("电缆外径")) == 0)
2026-09-28 15:28:50 +08:00
{
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);
2026-10-04 00:04:20 +08:00
if (_tcscmp(szBuffer, _T("电缆系统")) == 0)
2026-09-28 15:28:50 +08:00
{
sItem = m_wndList.GetItemText(nItem, nHn);
//data.dD = _ttof(sItem);
_tcscpy(data.szSys, (LPCTSTR)sItem);
}
}
2026-10-04 00:04:20 +08:00
//截面 单独列
2026-09-28 15:28:50 +08:00
if (m_nCableSectCol != -1)
{
sItem = m_wndList.GetItemText(nItem, m_nCableSectCol);
_tcscpy(data.szSect, (LPCTSTR)sItem);
}
return true;
}
return false;
}
bool HilightEntity(AcDbObjectId &id)
{
2026-10-04 00:04:20 +08:00
//时刻闪动,知道用户按space键
2026-09-28 15:28:50 +08:00
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))
{
2026-10-04 00:04:20 +08:00
//加入选择集
2026-09-28 15:28:50 +08:00
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
{
2026-10-04 00:04:20 +08:00
//追加到
2026-09-28 15:28:50 +08:00
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)
{
2026-10-04 00:04:20 +08:00
//已经添加
2026-09-28 15:28:50 +08:00
return;
}
}
2026-10-04 00:04:20 +08:00
//不能超过最大 LOCKPATH_MAX
2026-09-28 15:28:50 +08:00
if ((_tcslen(pHolder->szLockPathBy) + _tcslen(pszHd)) >= LOCKPATH_MAX)
{
return;
}
_tcscat(pHolder->szLockPathBy, pszHd);
_tcscat(pHolder->szLockPathBy, _T(","));
}
2026-10-04 00:04:20 +08:00
//写入起点 终点 设备中
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
//选择起点,终点. 或绘制路径?
2026-09-28 15:28:50 +08:00
EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(nItem);
if (pHolder != NULL)
{
2026-10-04 00:04:20 +08:00
if (_tcslen(pHolder->szFrEqu) > 0 && _tcslen(pHolder->szToEqu) > 0)//有起点 终点
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
//选择路径. 在桥架 或 电缆沟 路径线 上选择
2026-09-28 15:28:50 +08:00
ads_name ss,ent;
AcDbObjectId id;
TCHAR szHd[17];
struct resbuf *pRb = acutBuildList(RTDXF0, DXF_ROUT_PATH, 0);
2026-10-04 00:04:20 +08:00
int nRes = CKTCadUtility::SelectEntities(_T("\n请选择电缆必须经过的桥架、电缆沟、预埋路径:"), ss, pRb);
2026-09-28 15:28:50 +08:00
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
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("选择的条目起点或终点信息没有关联设备!"));
2026-09-28 15:28:50 +08:00
}
}
ShowWindow(SW_NORMAL);
}
void CDLFSDlg::OnPathPassByNo(int nItem, int nSubItem)
{
2026-10-04 00:04:20 +08:00
//选择起点,终点. 或绘制路径?
2026-09-28 15:28:50 +08:00
EquHolder *pHolder = (EquHolder *)m_wndList.GetItemData(nItem);
if (pHolder != NULL)
{
2026-10-04 00:04:20 +08:00
if (_tcslen(pHolder->szFrEqu) > 0 && _tcslen(pHolder->szToEqu) > 0)//有起点 终点
2026-09-28 15:28:50 +08:00
{
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;
}*/
2026-10-04 00:04:20 +08:00
int nUnit = 1000;//默认毫米
2026-09-28 15:28:50 +08:00
struct resbuf rb;
acedGetVar(_T("INSUNITS"), &rb);
if (rb.resval.rint == AcDb::kUnitsMeters)
{
nUnit = 1;
}
AcAxDocLock lock;
CString sKey;
2026-10-04 00:04:20 +08:00
//其他显示搜索的路径
if (_tcslen(pHolder->szPath) == 0)//没有敷设
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
if (_tcslen(pHolder->szFrEqu) > 0 && _tcslen(pHolder->szToEqu) > 0)//有起点 终点
2026-09-28 15:28:50 +08:00
{
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);
2026-10-04 00:04:20 +08:00
//找到多条路径,默认取最短路径,由用户决定选择路径
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
//填写计算结果
2026-09-28 15:28:50 +08:00
CString sLen;
2026-10-04 00:04:20 +08:00
sLen.Format(_T("%.3f"), data.dLen / nUnit + m_dLenRever);//米
2026-09-28 15:28:50 +08:00
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);
}
}
}
}
2026-10-04 00:04:20 +08:00
else //动态显示已经找到的路径
2026-09-28 15:28:50 +08:00
{
AcDbDatabase *pDb = acdbCurDwg();
AcDbHandle hdPh(pHolder->szPath);
AcDbObjectId idPh;
if (Acad::eOk == pDb->getAcDbObjectId(idPh, false, hdPh) )
{
2026-10-04 00:04:20 +08:00
if (!HilightEntity(idPh))//没有路径
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
//if (!idPh.isValid())//无效
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
acedAlert(_T("敷设路径已删除!开始重新敷设..."));
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
if (_tcslen(pHolder->szFrEqu) > 0 && _tcslen(pHolder->szToEqu) > 0)//有起点终点
2026-09-28 15:28:50 +08:00
{
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);
2026-10-04 00:04:20 +08:00
//找到多条路径,默认取最短路径,由用户决定选择路径
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
//填写计算结果
2026-09-28 15:28:50 +08:00
CString sLen;
2026-10-04 00:04:20 +08:00
sLen.Format(_T("%.3f"), data.dLen / nUnit + m_dLenRever);//米
2026-09-28 15:28:50 +08:00
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;
}
2026-10-04 00:04:20 +08:00
//写出清册
2026-09-28 15:28:50 +08:00
void CDLFSDlg::OnBnClickedButton2()
{
if (m_sXLSFile.IsEmpty() || m_nSheetIndex == -1)
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("当前没有读取清册页!"));
2026-09-28 15:28:50 +08:00
return;
}
2026-10-04 00:04:20 +08:00
//sys\\电缆敷设清单.xls
//m_mapCell2CableLenCol 写回
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
sTmpXLS += _T("\\电缆敷设清单.xls");
2026-09-28 15:28:50 +08:00
pLpDisp = excelBooks.Open(sTmpXLS, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional);
if (pLpDisp == NULL)
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!"));
2026-09-28 15:28:50 +08:00
return;
}
excelBook.AttachDispatch(pLpDisp);
2026-10-04 00:04:20 +08:00
//得到Worksheets
2026-09-28 15:28:50 +08:00
excelSheets.AttachDispatch(excelBook.GetWorksheets());
2026-10-04 00:04:20 +08:00
//获取sheet 数量
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
//全写特别慢....
2026-09-28 15:28:50 +08:00
/* 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);
2026-10-04 00:04:20 +08:00
if (bMod)//敷设填写的数据
2026-09-28 15:28:50 +08:00
{
//(nItem, m_nCableLenCol) -- D10
2026-10-04 00:04:20 +08:00
if (m_mapSubItem2Cell.Lookup(sKey, sCell))//找到sheet cell
2026-09-28 15:28:50 +08:00
{
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;
}
}
}
}*/
2026-10-04 00:04:20 +08:00
//写表头
2026-09-28 15:28:50 +08:00
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)
{
2026-10-04 00:04:20 +08:00
//另外保存新文件
2026-09-28 15:28:50 +08:00
CString sSaveAsFileName = m_sXLSFile;
2026-10-04 00:04:20 +08:00
//年月 日 分 秒 文件记录
2026-09-28 15:28:50 +08:00
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<LPNMITEMACTIVATE>(pNMHDR);
int nItem = pNMItemActivate->iItem;
int nSubItem = pNMItemActivate->iSubItem;
2026-10-04 00:04:20 +08:00
//显示高亮路径
2026-09-28 15:28:50 +08:00
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;
}
2026-10-04 00:04:20 +08:00
//查询外径
2026-09-28 15:28:50 +08:00
void CDLFSDlg::OnBnClickedButton3()
{
2026-10-04 00:04:20 +08:00
//[电缆型号]表单==> 截面(mm2) 电缆外径(mm) 系统分类
2026-09-28 15:28:50 +08:00
if (m_sXLSFile.IsEmpty())
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("请先打开电缆清单文件!"));
2026-09-28 15:28:50 +08:00
return;
}
if (m_nCableSpec == -1)
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("请先执行电缆清单设置!"));
2026-09-28 15:28:50 +08:00
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())
{
2026-10-04 00:04:20 +08:00
//从数据库xls中更新 敷设优先级
2026-09-28 15:28:50 +08:00
::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)
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!"));
2026-09-28 15:28:50 +08:00
return;
}
excelBook.AttachDispatch(pLpDisp);
2026-10-04 00:04:20 +08:00
//得到Worksheets
2026-09-28 15:28:50 +08:00
excelSheets.AttachDispatch(excelBook.GetWorksheets());
2026-10-04 00:04:20 +08:00
//获取sheet 数量
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
//读取数据
2026-09-28 15:28:50 +08:00
for (int n = nRowFrom; n <= nRowTo; n++)
{
sSpec = sSheetName2;
sSpec.TrimLeft();
sSpec.TrimRight();
sSpec2 = sSpec;
2026-10-04 00:04:20 +08:00
//A 截面(mm2) B 电缆外径(mm) C 系统分类
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
//A 截面mm2
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
//B 电缆外径
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
//C 系统分类
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
//ZRA-YJV-1kV,3x120+2x70 或 ZRA-YJV-1kV-3x120+2x70
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
//如果有空格,取空格前面的为型号
2026-09-28 15:28:50 +08:00
nPos = sSpec.ReverseFind(_T(' '));
if (nPos != -1)
{
sText = sSpec.Mid(0, nPos);
}
sText2 = sText;
2026-10-04 00:04:20 +08:00
if (!m_bHasSect)//不含标称截面
2026-09-28 15:28:50 +08:00
{
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('/'));
2026-10-04 00:04:20 +08:00
//外径
2026-09-28 15:28:50 +08:00
sOD = _T("");
if (mapSpec2OD.Lookup(sText, sOD) )
{
m_wndList.SetItemText(i, nODCol, sOD);
}
if (mapSpec2OD.Lookup(sText2, sOD))
{
m_wndList.SetItemText(i, nODCol, sOD);
}
2026-10-04 00:04:20 +08:00
//系统
2026-09-28 15:28:50 +08:00
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
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!"));
2026-09-28 15:28:50 +08:00
}
}
}
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;
}
2026-10-04 00:04:20 +08:00
//保存敷设
2026-09-28 15:28:50 +08:00
void CDLFSDlg::OnBnClickedButton5()
{
}
bool CableSumCmpFnc(const CableSum& data1, const CableSum& data2)
{
return false;
}
2026-10-04 00:04:20 +08:00
//根据定制格式,输出报表
2026-09-28 15:28:50 +08:00
void CDLFSDlg::OnBnClickedButton6()
{
2026-10-04 00:04:20 +08:00
//汇总列,模板
2026-09-28 15:28:50 +08:00
CString sSysPath = FilePath::GetSysDir();
CString sIniFile, sXlsFile;
2026-10-04 00:04:20 +08:00
sIniFile.Format(_T("%s\\%s"),sSysPath,_T("电缆汇总.ini"));
2026-09-28 15:28:50 +08:00
CFileFind find;
if (find.FindFile(sIniFile))
{
/*
2026-10-04 00:04:20 +08:00
* A = 序号
B = 电缆及规格
C = 截面
D = 全长
E = 电缆外径
F = 电缆系统
G = 备注
2026-09-28 15:28:50 +08:00
*/
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))
{
2026-10-04 00:04:20 +08:00
sTip.Format(_T("汇总模板文件[%s]不存在!"),sXlsFile);
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
//继续读 cells
2026-09-28 15:28:50 +08:00
CStringArray arCells;
CoreTools::SplitStrintToArray(szVal, arCells, _T(','));
2026-10-04 00:04:20 +08:00
//写入的位置
2026-09-28 15:28:50 +08:00
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<CableSum *> vtCableSumPtrs;
2026-10-04 00:04:20 +08:00
acedSetStatusBarProgressMeter(_T("正在汇总..."), 0, m_wndList.GetItemCount());
2026-09-28 15:28:50 +08:00
for (int i = 0;i < m_wndList.GetItemCount();i++)
{
acedSetStatusBarProgressMeterPos(i);
2026-10-04 00:04:20 +08:00
//电缆规格
2026-09-28 15:28:50 +08:00
sSpec = m_wndList.GetItemText(i, m_nCableSpec);
sSpec.TrimRight();
if (sSpec.IsEmpty())
continue;
2026-10-04 00:04:20 +08:00
//截面
2026-09-28 15:28:50 +08:00
sSect = m_wndList.GetItemText(i, m_nCableSectCol);
2026-10-04 00:04:20 +08:00
//电缆系统
2026-09-28 15:28:50 +08:00
sSys = m_wndList.GetItemText(i, m_nSysCol);
2026-10-04 00:04:20 +08:00
//外径
2026-09-28 15:28:50 +08:00
sOD = m_wndList.GetItemText(i, m_nODCol);
2026-10-04 00:04:20 +08:00
//全长
2026-09-28 15:28:50 +08:00
sLen = m_wndList.GetItemText(i, m_nCableLenCol);
sKey.Format(_T("%s-%s"), sSpec, sSect);
if (mapSumm2Data.Lookup(sKey, (void *&)pData))
{
2026-10-04 00:04:20 +08:00
//汇总
2026-09-28 15:28:50 +08:00
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)
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!"));
2026-09-28 15:28:50 +08:00
return;
}
excelBook.AttachDispatch(pLpDisp);
2026-10-04 00:04:20 +08:00
//得到Worksheets
2026-09-28 15:28:50 +08:00
excelSheets.AttachDispatch(excelBook.GetWorksheets());
2026-10-04 00:04:20 +08:00
//获取sheet 数量
2026-09-28 15:28:50 +08:00
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);
/*
2026-10-04 00:04:20 +08:00
* A = 序号
B = 电缆及规格
C = 截面
D = 全长
E = 电缆外径
F = 电缆系统
G = 备注
2026-09-28 15:28:50 +08:00
*/
2026-10-04 00:04:20 +08:00
//CableSum 的 文本 涵盖 sName
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
//电缆及规格
if (sName.Find(_T("电缆及规格")) != -1)
2026-09-28 15:28:50 +08:00
{
//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;
}
2026-10-04 00:04:20 +08:00
//截面
if (sName.Find(_T("截面")) != -1)
2026-09-28 15:28:50 +08:00
{
//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;
}
2026-10-04 00:04:20 +08:00
//电缆系统
if (sName.Find(_T("电缆系统")) != -1)
2026-09-28 15:28:50 +08:00
{
//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;
}
2026-10-04 00:04:20 +08:00
//电缆外径
if (sName.Find(_T("电缆外径")) != -1)
2026-09-28 15:28:50 +08:00
{
//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;
}
2026-10-04 00:04:20 +08:00
//全长
if (sName.Find(_T("全长")) != -1)
2026-09-28 15:28:50 +08:00
{
//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;
}
2026-10-04 00:04:20 +08:00
//序号
if (sName.Find(_T("序号")) != -1)
2026-09-28 15:28:50 +08:00
{
//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)
{
2026-10-04 00:04:20 +08:00
//另外保存新文件
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
//年月 日 分 秒 文件记录
2026-09-28 15:28:50 +08:00
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);
}
}
}
}
2026-10-04 00:04:20 +08:00
//打开敷设
2026-09-28 15:28:50 +08:00
void CDLFSDlg::OnBnClickedButton10()
{
}
void CDLFSDlg::OnDestroy()
{
KillTimer(m_nIDEvent);
CDialog::OnDestroy();
}