2706 lines
61 KiB
C++
2706 lines
61 KiB
C++
#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();
|
||
}
|