#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 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(); }