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

906 lines
20 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#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();
}