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

2706 lines
62 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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<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;
}
//自动敷设
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<EListLine2> 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<LPNMITEMACTIVATE>(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<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);
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<LPNMITEMACTIVATE>(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<CableSum *> 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();
}