907 lines
20 KiB
C++
907 lines
20 KiB
C++
#include "StdAfx.h"
|
||
#include "AecDbEntityBase.h"
|
||
#include "CSDFSDlg.h"
|
||
#include "CDLWJDlg.h"
|
||
#include "excel9.h"
|
||
#include "CCableRouting.h"
|
||
#include "CoreTools.h"
|
||
#include "KTExpressCalc.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_ROUT_PATH _T("AEC_DBCABTRY,AEC_ROADAXISLINE")
|
||
#endif
|
||
|
||
#define DLWJXLS _T("电缆型号外径.xls");
|
||
|
||
IMPLEMENT_DYNAMIC(CSDFSDlg, CDialog)
|
||
|
||
CSDFSDlg::CSDFSDlg(CWnd* pParent /*=NULL*/)
|
||
: CDialog(IDD_SDFS_DLG, pParent)
|
||
, m_sFr(_T(""))
|
||
, m_sTo(_T(""))
|
||
, m_sCablSpec(_T("ZR-YJV22-8.7/10kV"))
|
||
, m_dD(0)
|
||
, m_sCableSec(_T("3X95"))
|
||
, m_dLen(0)
|
||
, m_nAssocNoorName(FALSE)
|
||
, m_sSys(_T(""))
|
||
, m_bHasSect(FALSE)
|
||
, m_nPathUserDo(0)
|
||
, m_bIgoreFillUsed(FALSE)
|
||
, m_dPathOnPoint(0.1)
|
||
, m_dLenRever(2)
|
||
, m_dBypassDis(1)
|
||
, m_dEquFindDis(2.5)
|
||
, m_sXLSFileName(_T(""))
|
||
{
|
||
memset(&m_eHolder, 0, sizeof(EquHolder));
|
||
|
||
m_dPathOnPoint = 0.2;
|
||
m_dBypassDis = 1.0;//米
|
||
m_dEquFindDis = 5.0;//米
|
||
m_bIsVisible = true;
|
||
m_sFrHd = _T("");
|
||
m_sToHd = _T("");
|
||
m_sPathSteps = _T("");
|
||
m_nIDEvent = 0;
|
||
}
|
||
|
||
CSDFSDlg::~CSDFSDlg()
|
||
{
|
||
}
|
||
|
||
void CSDFSDlg::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CDialog::DoDataExchange(pDX);
|
||
DDX_Text(pDX, IDC_EDIT1, m_sFr);
|
||
DDX_Text(pDX, IDC_EDIT2, m_sTo);
|
||
DDX_Text(pDX, IDC_COMBO1, m_sCablSpec);
|
||
DDX_Control(pDX, IDC_COMBO1, m_wndComCableSpecs);
|
||
|
||
DDX_Text(pDX, IDC_EDIT4, m_dD);
|
||
DDX_Text(pDX, IDC_EDIT5, m_sCableSec);
|
||
DDX_Text(pDX, IDC_EDIT6, m_dLen);
|
||
DDX_Text(pDX, IDC_EDIT8, m_sSys);
|
||
DDX_Radio(pDX,IDC_RADIO3, m_nAssocNoorName);
|
||
DDX_Check(pDX,IDC_CHECK1, m_bHasSect);
|
||
DDX_Text(pDX, IDC_EDIT7, m_sFrHd);
|
||
DDX_Text(pDX, IDC_EDIT9, m_sToHd);
|
||
DDX_Radio(pDX, IDC_RADIO1, m_nPathUserDo);
|
||
DDX_Check(pDX, IDC_CHECK3, m_bIgoreFillUsed);
|
||
|
||
DDX_Text(pDX, IDC_EDIT12, m_dPathOnPoint);
|
||
DDX_Text(pDX, IDC_EDIT11, m_dLenRever);
|
||
DDX_Text(pDX, IDC_EDIT10, m_dBypassDis);
|
||
DDX_Text(pDX, IDC_EDIT13, m_dEquFindDis);
|
||
DDX_Text(pDX, IDC_EDIT14, m_sPathSteps);
|
||
DDX_Text(pDX, IDC_EDIT15, m_sXLSFileName);
|
||
|
||
}
|
||
|
||
BEGIN_MESSAGE_MAP(CSDFSDlg, CDialog)
|
||
ON_MESSAGE(WM_ACAD_KEEPFOCUS, &CSDFSDlg::onAcadKeepFocus)
|
||
ON_BN_CLICKED(IDC_BUTTON1, &CSDFSDlg::OnBnClickedButton1)
|
||
ON_BN_CLICKED(IDC_BUTTON3, &CSDFSDlg::OnBnClickedButton3)
|
||
ON_BN_CLICKED(IDC_BUTTON2, &CSDFSDlg::OnBnClickedButton2)
|
||
ON_BN_CLICKED(IDOK, &CSDFSDlg::OnBnClickedOk)
|
||
ON_WM_TIMER()
|
||
ON_BN_CLICKED(IDC_BUTTON5, &CSDFSDlg::OnBnClickedButton5)
|
||
ON_BN_CLICKED(IDC_BUTTON7, &CSDFSDlg::OnBnClickedButton7)
|
||
ON_BN_CLICKED(IDC_BUTTON8, &CSDFSDlg::OnBnClickedButton8)
|
||
ON_BN_CLICKED(IDC_BUTTON9, &CSDFSDlg::OnBnClickedButton9)
|
||
ON_BN_CLICKED(IDC_BUTTON10, &CSDFSDlg::OnBnClickedButton10)
|
||
ON_BN_CLICKED(IDCANCEL, &CSDFSDlg::OnBnClickedCancel)
|
||
ON_WM_CLOSE()
|
||
END_MESSAGE_MAP()
|
||
|
||
LONG_PTR CSDFSDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR)
|
||
{
|
||
POINT pt;
|
||
::GetCursorPos(&pt);
|
||
CRect rect;
|
||
GetWindowRect(&rect);
|
||
if (!(rect.PtInRect(pt)))
|
||
{
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL CSDFSDlg::OnInitDialog()
|
||
{
|
||
CDialog::OnInitDialog();
|
||
|
||
UpdateData(FALSE);
|
||
|
||
m_nIDEvent = SetTimer(1, 400, NULL);
|
||
|
||
ShowCableSpecs();
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
void CSDFSDlg::OnTimer(UINT_PTR nIDEvent)
|
||
{
|
||
ShowPath(m_bIsVisible);
|
||
m_bIsVisible = !m_bIsVisible;
|
||
|
||
CDialog::OnTimer(nIDEvent);
|
||
}
|
||
|
||
void CSDFSDlg::ShowPath(bool bIsShow)
|
||
{
|
||
AcDbEntity *pEnt = NULL;
|
||
AcAxDocLock lock;
|
||
|
||
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, m_idPath, AcDb::kForWrite))
|
||
{
|
||
pEnt->setVisibility(bIsShow ? AcDb::kVisible : AcDb::kInvisible);
|
||
pEnt->close();
|
||
}
|
||
|
||
acedUpdateDisplay();
|
||
actrTransactionManager->flushGraphics();
|
||
}
|
||
|
||
void CSDFSDlg::OnSetEquNo(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)
|
||
{
|
||
//弹出界面,由用户修改单元格的信息后填入
|
||
acdbGetObjectId(id, ent);
|
||
|
||
Acad::ErrorStatus es;
|
||
AcDbEntity *pEnt = NULL;
|
||
if (Acad::eOk == (es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead)))
|
||
{
|
||
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt);
|
||
if (pEntBase != NULL)
|
||
{
|
||
if (m_nAssocNoorName == 0)
|
||
pEntBase->GetSpecialtyData(AcDb::kForWrite)->GetAt(KEY_NO, nFrOrTo ? m_sTo : m_sFr);
|
||
else
|
||
pEntBase->GetSpecialtyData(AcDb::kForWrite)->GetAt(KEY_NAME, nFrOrTo ? m_sTo : m_sFr);
|
||
|
||
if (nFrOrTo == 0)
|
||
{
|
||
id.handle().getIntoAsciiBuffer(m_eHolder.szFrEqu);
|
||
m_sFrHd = m_eHolder.szFrEqu;
|
||
}
|
||
else
|
||
{
|
||
id.handle().getIntoAsciiBuffer(m_eHolder.szToEqu);
|
||
m_sToHd = m_eHolder.szToEqu;
|
||
}
|
||
}
|
||
|
||
AcDbBlockReference *pRef = AcDbBlockReference::cast(pEnt);
|
||
if (pRef != NULL)
|
||
{
|
||
AecDbObjXDataMap xData;
|
||
if (m_nAssocNoorName == 0)
|
||
xData.GetAt(KEY_NO, nFrOrTo ? m_sTo : m_sFr);
|
||
else
|
||
xData.GetAt(KEY_NAME, nFrOrTo ? m_sTo : m_sFr);
|
||
|
||
if (nFrOrTo == 0)
|
||
{
|
||
id.handle().getIntoAsciiBuffer(m_eHolder.szFrEqu);
|
||
m_sFrHd = m_eHolder.szFrEqu;
|
||
}
|
||
else
|
||
{
|
||
id.handle().getIntoAsciiBuffer(m_eHolder.szToEqu);
|
||
m_sToHd = m_eHolder.szToEqu;
|
||
}
|
||
}
|
||
pEnt->close();
|
||
}
|
||
}
|
||
}
|
||
|
||
//写入Fr
|
||
void CSDFSDlg::OnBnClickedButton5()
|
||
{
|
||
UpdateData();
|
||
WriteNoOrName(0);
|
||
}
|
||
|
||
void CSDFSDlg::OnBnClickedButton8()
|
||
{
|
||
|
||
}
|
||
|
||
void CSDFSDlg::OnBnClickedButton9()
|
||
{
|
||
ShowWindow(SW_HIDE);
|
||
|
||
AcAxDocLock lock;
|
||
//选择路径. 在桥架 或 电缆沟 路径线 上选择
|
||
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);
|
||
|
||
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);
|
||
|
||
AppendEquLockPath(m_sFrHd, szHd);
|
||
AppendEquLockPath(m_sToHd, szHd);
|
||
}
|
||
acedSSFree(ss);
|
||
}
|
||
|
||
ShowWindow(SW_SHOW);
|
||
}
|
||
|
||
void CSDFSDlg::OnBnClickedButton10()
|
||
{
|
||
AcAxDocLock lock;
|
||
|
||
RemoveEquLockPath(m_sFrHd);
|
||
RemoveEquLockPath(m_sToHd);
|
||
}
|
||
|
||
void CSDFSDlg::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 CSDFSDlg::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();
|
||
}
|
||
}
|
||
}
|
||
|
||
//写入To
|
||
void CSDFSDlg::OnBnClickedButton7()
|
||
{
|
||
UpdateData();
|
||
WriteNoOrName(1);
|
||
}
|
||
|
||
BOOL CSDFSDlg::WriteNoOrName(int nFrOrTo)
|
||
{
|
||
AcAxDocLock lock;
|
||
AcDbObjectId id;
|
||
BOOL bSuccess = FALSE;
|
||
|
||
AcDbHandle hand(nFrOrTo ? m_eHolder.szToEqu : m_eHolder.szFrEqu);
|
||
if (Acad::eOk == acdbCurDwg()->getAcDbObjectId(id, false, hand))
|
||
{
|
||
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, nFrOrTo ? m_sTo : m_sFr);
|
||
else
|
||
pEntBase->GetSpecialtyData(AcDb::kForWrite)->SetAt(KEY_NAME, nFrOrTo ? m_sTo : m_sFr);
|
||
bSuccess = TRUE;
|
||
}
|
||
|
||
AcDbBlockReference *pRef = AcDbBlockReference::cast(pEnt);
|
||
if (pRef != NULL)
|
||
{
|
||
AecDbObjXDataMap xData;
|
||
if (m_nAssocNoorName == 0)
|
||
xData.SetAt(KEY_NO, nFrOrTo ? m_sTo : m_sFr);
|
||
else
|
||
xData.SetAt(KEY_NAME, nFrOrTo ? m_sTo : m_sFr);
|
||
|
||
bSuccess = xData.Write(pRef, KEY_ASSOIC);
|
||
}
|
||
pEnt->close();
|
||
}
|
||
}
|
||
|
||
AfxMessageBox(bSuccess ? _T("编号或名称写入成功!") : _T("编号或名称写入失败!是否没有选择设备?"));
|
||
return TRUE;
|
||
}
|
||
|
||
//选择起点设备
|
||
void CSDFSDlg::OnBnClickedButton1()
|
||
{
|
||
UpdateData();
|
||
|
||
ShowWindow(SW_HIDE);
|
||
OnSetEquNo(0);
|
||
ShowWindow(SW_SHOW);
|
||
|
||
UpdateData(FALSE);
|
||
}
|
||
|
||
//选择终点设备
|
||
void CSDFSDlg::OnBnClickedButton3()
|
||
{
|
||
UpdateData();
|
||
|
||
ShowWindow(SW_HIDE);
|
||
OnSetEquNo(1);
|
||
ShowWindow(SW_SHOW);
|
||
|
||
UpdateData(FALSE);
|
||
}
|
||
|
||
void CSDFSDlg::ShowCableSpecs()
|
||
{
|
||
// 数据库
|
||
CString sCableODDbFile = FilePath::GetSysDir() + _T("\\") + DLWJXLS;
|
||
|
||
//从数据库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(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();
|
||
m_wndComCableSpecs.AddString(sSheetName2);
|
||
}
|
||
}
|
||
excelBooks.Close();
|
||
excelApp.Quit();
|
||
}
|
||
}
|
||
|
||
//查询截面直径
|
||
extern bool Variant2String(const COleVariant &varValue, CString &sVal);
|
||
void CSDFSDlg::OnBnClickedButton2()
|
||
{
|
||
UpdateData();
|
||
|
||
CAcModuleResourceOverride myResources;
|
||
CDLWJDlg dlg;
|
||
dlg.m_sCableSpecCol = m_sCablSpec;
|
||
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 nPos = -1;
|
||
|
||
sSpec = m_sCablSpec;
|
||
sSpec.TrimRight();
|
||
sSpec.TrimLeft();
|
||
sText = sSpec;
|
||
sText.Replace(_T('|'), _T('/'));
|
||
|
||
//如果有空格,取空格前面的为型号
|
||
nPos = sSpec.ReverseFind(_T(' '));
|
||
if (nPos != -1)
|
||
{
|
||
sText = sSpec.Mid(0, nPos);
|
||
}
|
||
sText2 = sText;
|
||
|
||
if (!m_bHasSect)//不含标称截面
|
||
{
|
||
sSect = m_sCableSec;
|
||
sText += _T(",");
|
||
sText += sSect;
|
||
sText.Replace(_T('|'), _T('/'));
|
||
|
||
sText2 += _T("-");
|
||
sText2 += sSect;
|
||
sText2.Replace(_T('|'), _T('/'));
|
||
}
|
||
|
||
sText.MakeUpper();
|
||
sText2.MakeUpper();
|
||
|
||
//外径
|
||
sOD = _T("");
|
||
if (mapSpec2OD.Lookup(sText, sOD))
|
||
{
|
||
m_dD = _ttof(sOD);
|
||
|
||
}
|
||
|
||
if (mapSpec2OD.Lookup(sText2, sOD))
|
||
{
|
||
m_dD = _ttof(sOD);
|
||
}
|
||
|
||
//系统
|
||
sSys = _T("");
|
||
if (mapSpec2Sys.Lookup(sText, sSys))
|
||
{
|
||
m_sSys = sSys;
|
||
}
|
||
|
||
if (mapSpec2Sys.Lookup(sText2, sOD))
|
||
{
|
||
m_sSys = sSys;
|
||
}
|
||
}
|
||
}
|
||
UpdateData(FALSE);
|
||
}
|
||
|
||
BOOL CSDFSDlg::GetCableData(CableData &data)
|
||
{
|
||
CString sText = m_sCablSpec;
|
||
sText.MakeUpper();
|
||
if (sText.IsEmpty())
|
||
return FALSE;
|
||
|
||
//可能的替换到, 便于解析
|
||
sText.Replace(_T(","), _T(","));
|
||
sText.Replace(_T(";"), _T(","));
|
||
sText.Replace(_T(";"), _T(","));
|
||
|
||
//ZRA-YJV-1kV,5x2.5 小写,分解
|
||
//5x16 or 3x120+2x70 解析为表达式 计算总直径
|
||
|
||
std::vector<CString> arTxts;
|
||
CoreTools::SplitStrintToArray(sText, arTxts, _T(','));
|
||
|
||
KTExpressCalc cal;
|
||
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('*'));
|
||
|
||
//dVal = 0.0;
|
||
//cal.Calculate(sItem, dVal);
|
||
//dD += dVal;
|
||
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);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
data.dD = m_dD;
|
||
_tcscpy(data.szSys, (LPCTSTR)m_sSys);
|
||
_tcscpy(data.szSpec, (LPCTSTR)m_sCablSpec);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
void CSDFSDlg::CableRoute()
|
||
{
|
||
CString sKey;
|
||
//其他显示搜索的路径
|
||
EquHolder *pHolder = &m_eHolder;
|
||
//if (_tcslen(pHolder->szPath) == 0)//没有敷设
|
||
{
|
||
AcAxDocLock lock;
|
||
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));
|
||
GetCableData(data);
|
||
|
||
int nUnit = 1000;//默认毫米
|
||
struct resbuf rb;
|
||
acedGetVar(_T("INSUNITS"), &rb);
|
||
if (rb.resval.rint == AcDb::kUnitsMeters)
|
||
{
|
||
nUnit = 2;
|
||
}
|
||
|
||
if (m_bIgoreFillUsed)
|
||
{
|
||
ShowWindow(SW_HIDE);
|
||
}
|
||
|
||
//找到多条路径,默认取最短路径,由用户决定选择路径
|
||
AcDbObjectId idPath;
|
||
CCableRouting crut;
|
||
|
||
crut.SetBypassDis(m_dBypassDis * nUnit);
|
||
crut.SetPathOnPoint(m_dPathOnPoint * nUnit);
|
||
crut.SetEquFindDis(m_dEquFindDis * nUnit);
|
||
crut.SetIgoreFillUsed(m_bIgoreFillUsed ? true : false);
|
||
crut.SetAssocNoorName(m_nAssocNoorName);
|
||
|
||
if (m_nPathUserDo)
|
||
{
|
||
ShowWindow(SW_HIDE);
|
||
}
|
||
|
||
if (crut.SearchRouting(idFr, idTo, data, m_nPathUserDo, idPath, m_sPathSteps))
|
||
{
|
||
if (m_bIgoreFillUsed)
|
||
{
|
||
ShowWindow(SW_SHOW);
|
||
}
|
||
m_idPath = idPath;
|
||
idPath.handle().getIntoAsciiBuffer(pHolder->szPath);
|
||
m_dLen = ((int)(data.dLen / nUnit) * 1000) / 1000.0;
|
||
m_dLen += m_dLenRever;
|
||
}
|
||
else
|
||
{
|
||
acutPrintf(_T("\n敷设计算没有算出满足填充率或系统属性的路径!"));
|
||
}
|
||
|
||
|
||
if (m_nPathUserDo)
|
||
{
|
||
ShowWindow(SW_SHOW);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CSDFSDlg::OnBnClickedOk()
|
||
{
|
||
UpdateData();
|
||
|
||
if (m_dD < 1.e-1 || m_sSys.IsEmpty())
|
||
{
|
||
AfxMessageBox(_T("没有查询电缆外径和系统!"));
|
||
return;
|
||
}
|
||
|
||
CableRoute();
|
||
|
||
UpdateData(FALSE);
|
||
}
|
||
|
||
void CSDFSDlg::OnBnClickedCancel()
|
||
{
|
||
ShowPath(true);
|
||
|
||
KillTimer(m_nIDEvent);
|
||
|
||
m_idPath.setNull();
|
||
|
||
ShowWindow(SW_HIDE);
|
||
}
|
||
|
||
void CSDFSDlg::OnClose()
|
||
{
|
||
ShowWindow(SW_HIDE);
|
||
m_idPath.setNull();
|
||
}
|