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

907 lines
20 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "StdAfx.h"
#include "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();
}