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

435 lines
10 KiB
C++

#include "stdafx.h"
#include "sys/stat.h"
#include "CablelineTools.h"
#include "KTSetting.h"
#include "KTModelLayoutXData.h"
#include "CoreTools.h"
#include "uiiado.h"
CString CablelineTools::getCurrentLayerSys()
{
CString sysName(_T(""));
AecDbObjXDataMap xDataMap;
if (KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, xDataMap))
xDataMap.GetAt(_T("PIPE_LAY_SYS"), sysName);
return sysName;
}
AcDbObjectId CablelineTools::AecInitLayerEx(LPCTSTR pszLayer, int nColorIndex, LPCTSTR pszLineType, AcDbDatabase* pDb = NULL)
{
CString sLayerInit = pszLayer;
CString sLineTypeinit = pszLineType;
int nLineWidth = AcDb::kLnWt000;
if (pDb == NULL)
pDb = acdbCurDwg();
//映射到系统图层
BOOL bFindSysRec = FALSE;
CString dbPath = FilePath::GetSysDir();
dbPath += _T("\\Plumbing.db");
CUIISQLiteServer *pDbSrv = new CUIISQLiteServer;
pDbSrv->InitADOServer(dbPath);
if (pDbSrv)
{
CString sSQL, sTablename, sCurrSys;
sCurrSys = getCurrentLayerSys();
sSQL = _T("select tablename from wpipecfg where currstd=1");
if (pDbSrv->GetSelData(sSQL, sTablename))
{
//LAYKEY LAYNAME PIPESYS SYSTEM COLOR LINETYPE LINEWIDTH
//11 废水管线中心线 管线中心线 废水 4 Continuous:________ 0
sSQL.Format(_T("select layname,pipesys,color,linetype,linewidth from [%s] where system='%s'"), sTablename, sCurrSys);
CUIIValueTable table;
pDbSrv->GetSelData(sSQL, table);
DELETE_PTR(pDbSrv);
CStringArray arVals;
CString sLayName, sPipeSys, sColor, sLineType, sLineWidth, sTemp;
for (int i = 0; i < table.GetTableLogicSize(); i++)
{
arVals.RemoveAll();
table.GetValueRecord(i, arVals);
sLayName = arVals.GetAt(0);
sPipeSys = arVals.GetAt(1);
sColor = arVals.GetAt(2);
sLineType = arVals.GetAt(3);
//管线中心线
if (_tcscmp(pszLayer, LAY_CABTRY_CEN) == 0 )
{
sLayerInit = sLayName;
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
bFindSysRec = TRUE;
break;
}
//管线边线
if (_tcscmp(pszLayer, LAY_CABTRY_OUT) == 0 )
{
sLayerInit = sLayName;
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
break;
}
//管线中心线 单线
if (_tcscmp(pszLayer, LAY_CABTRY_SIG) == 0)
{
sLayerInit = sLayName;
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
break;
}
//FITN_CENTER_SYS
if (_tcscmp(pszLayer, LAY_CFITN_CENTER) == 0 )
{
sLayerInit = sLayName;
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
break;
}
if (_tcscmp(pszLayer, LAY_CFITN_OUTSIDE) == 0 )
{
sLayerInit = sLayName;
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
break;
}
if (_tcscmp(pszLayer, LAY_CFITN_SINGLE) == 0 )
{
sLayerInit = sLayName;
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
break;
}
if (_tcscmp(pszLayer, LAY_CEQU) == 0 )
{
sLayerInit = sLayName;
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
break;
}
}
}
}
AcDbObjectId id;
AcDbLayerTable* pLayTbl = NULL;
if (Acad::eOk == pDb->getLayerTable(pLayTbl, AcDb::kForWrite))
{
if (Acad::eOk == pLayTbl->getAt(sLayerInit, id))
{
//如果找到
pLayTbl->close();
return id;
}
AcCmColor color;
color.setColorIndex(nColorIndex);
AcDbLayerTableRecord* pRec = new AcDbLayerTableRecord;
pRec->setColor(color);
pRec->setLineWeight((AcDb::LineWeight)nLineWidth);
//首先判断是否有此线型
bool bFind = false;
AcDbObjectId idLt;
AcDbLinetypeTable* pLTbl = NULL;
if (Acad::eOk == pDb->getLinetypeTable(pLTbl, AcDb::kForRead))
{
if (Acad::eOk == pLTbl->getAt(sLineTypeinit, idLt))
{
bFind = true;
}
pLTbl->close();
}
if (!bFind)
{
//加载线型
//D:\Program Files\AutoCAD 2008\acad.exe
TCHAR szFileName[MAX_PATH];
::GetModuleFileName(acedGetAcadWinApp()->m_hInstance, szFileName, MAX_PATH);
//
CString sLtFile = szFileName;
sLtFile.MakeLower();
sLtFile.Replace(_T("acad.exe"), _T("support\\acad.lin"));
CFileFind find;
if (find.FindFile(sLtFile))
{
acdbLoadLineTypeFile(sLineTypeinit, sLtFile, pDb);
if (Acad::eOk == pDb->getLinetypeTable(pLTbl, AcDb::kForRead))
{
pLTbl->getAt(sLineTypeinit, idLt);
pLTbl->close();
}
}
else
{
if (CoreTools::FindFile(_T("acad.lin"), sLtFile))
{
sLtFile = szFileName;
acdbLoadLineTypeFile(sLineTypeinit, sLtFile, pDb);
if (Acad::eOk == pDb->getLinetypeTable(pLTbl, AcDb::kForRead))
{
pLTbl->getAt(sLineTypeinit, idLt);
pLTbl->close();
}
}
}
}
pRec->setName(sLayerInit);
pRec->setLinetypeObjectId(idLt);
pLayTbl->add(id, pRec);
pRec->close();
pLayTbl->close();
}
return id;
}
AcDbObjectId CablelineTools::AecInitLayerEx(LPCTSTR pszLayer,LPCTSTR pszSys,int nColorIndex,LPCTSTR pszLineType,AcDbDatabase* pDb)
{
CString sLayerInit = pszLayer;
CString sLineTypeinit = pszLineType;
int nLineWidth = AcDb::kLnWt000;
if (pDb == NULL)
pDb = acdbCurDwg();
//映射到系统图层
BOOL bFindSysRec = FALSE;
CString dbPath = FilePath::GetSysDir();
dbPath += _T("\\Plumbing.db");
CUIISQLiteServer *pDbSrv = new CUIISQLiteServer;
pDbSrv->InitADOServer(dbPath);
if (pDbSrv)
{
CString sSQL, sTablename, sCurrSys;
sCurrSys = pszSys;
sSQL = _T("select tablename from wpipecfg where currstd=1");
if (pDbSrv->GetSelData(sSQL, sTablename))
{
//LAYKEY LAYNAME PIPESYS SYSTEM COLOR LINETYPE LINEWIDTH
//11 废水管线中心线 管线中心线 废水 4 Continuous:________ 0
sSQL.Format(_T("select layname,pipesys,color,linetype,linewidth from [%s] where system='%s'"), sTablename, sCurrSys);
CUIIValueTable table;
pDbSrv->GetSelData(sSQL, table);
DELETE_PTR(pDbSrv);
CStringArray arVals;
CString sLayName, sPipeSys, sColor, sLineType, sLineWidth, sTemp;
for (int i = 0; i < table.GetTableLogicSize(); i++)
{
arVals.RemoveAll();
table.GetValueRecord(i, arVals);
sLayName = arVals.GetAt(0);
sPipeSys = arVals.GetAt(1);
sColor = arVals.GetAt(2);
sLineType = arVals.GetAt(3);
//管线中心线
if (_tcscmp(pszLayer, LAY_CABTRY_CEN) == 0 )
{
sLayerInit = sLayName;
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
bFindSysRec = TRUE;
break;
}
//管线边线
if (_tcscmp(pszLayer, LAY_CABTRY_OUT) == 0)
{
//sLayerInit = sLayName;
sLayerInit.Format(_T("%s-%s"),pszSys,pszLayer);
sLineTypeinit = sLineType;
nColorIndex = KTSetting::GetLayerColor(pszLayer);
nLineWidth = _ttoi(sLineWidth);
break;
}
//管线中心线 单线
if (_tcscmp(pszLayer, LAY_CABTRY_SIG) == 0 )
{
//sLayerInit = sLayName;
sLayerInit.Format(_T("%s-%s"),pszSys,pszLayer);
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
break;
}
//FITN_CENTER_SYS
if (_tcscmp(pszLayer, LAY_CFITN_CENTER) == 0 )
{
sLayerInit = sLayName;
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
break;
}
if (_tcscmp(pszLayer, LAY_CFITN_OUTSIDE) == 0 )
{
//sLayerInit = sLayName;
sLayerInit.Format(_T("%s-%s"),pszSys,pszLayer);
sLineTypeinit = sLineType;
nColorIndex = KTSetting::GetLayerColor(pszLayer);
nLineWidth = _ttoi(sLineWidth);
break;
}
if (_tcscmp(pszLayer, LAY_CFITN_SINGLE) == 0 )
{
//sLayerInit = sLayName;
sLayerInit.Format(_T("%s-%s"),pszSys,pszLayer);
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
break;
}
if (_tcscmp(pszLayer, LAY_CEQU) == 0)
{
//sLayerInit = sLayName;
sLayerInit.Format(_T("%s-%s"),pszSys,pszLayer);
sLineTypeinit = sLineType;
nColorIndex = _ttoi(sColor);
nLineWidth = _ttoi(sLineWidth);
break;
}
}
}
}
if (!bFindSysRec)
{
CString sTemp;
sTemp.Format(_T("%s-%s"),pszSys,sLayerInit);
sLayerInit = sTemp;
}
AcDbObjectId id;
AcDbLayerTable* pLayTbl = NULL;
if (Acad::eOk == pDb->getLayerTable(pLayTbl, AcDb::kForWrite))
{
if (Acad::eOk == pLayTbl->getAt(sLayerInit, id))
{
//如果找到
pLayTbl->close();
return id;
}
AcCmColor color;
color.setColorIndex(nColorIndex);
AcDbLayerTableRecord* pRec = new AcDbLayerTableRecord;
pRec->setColor(color);
pRec->setLineWeight((AcDb::LineWeight)nLineWidth);
//首先判断是否有此线型
bool bFind = false;
AcDbObjectId idLt;
AcDbLinetypeTable* pLTbl = NULL;
if (Acad::eOk == pDb->getLinetypeTable(pLTbl, AcDb::kForRead))
{
if (Acad::eOk == pLTbl->getAt(sLineTypeinit, idLt))
{
bFind = true;
}
pLTbl->close();
}
if (!bFind)
{
//加载线型
//D:\Program Files\AutoCAD 2008\acad.exe
TCHAR szFileName[MAX_PATH];
::GetModuleFileName(acedGetAcadWinApp()->m_hInstance, szFileName, MAX_PATH);
//
CString sLtFile = szFileName;
sLtFile.MakeLower();
sLtFile.Replace(_T("acad.exe"), _T("support\\acad.lin"));
CFileFind find;
if (find.FindFile(sLtFile))
{
acdbLoadLineTypeFile(sLineTypeinit, sLtFile, pDb);
if (Acad::eOk == pDb->getLinetypeTable(pLTbl, AcDb::kForRead))
{
pLTbl->getAt(sLineTypeinit, idLt);
pLTbl->close();
}
}
else
{
if (CoreTools::FindFile(_T("acad.lin"), sLtFile))
{
sLtFile = szFileName;
acdbLoadLineTypeFile(sLineTypeinit, sLtFile, pDb);
if (Acad::eOk == pDb->getLinetypeTable(pLTbl, AcDb::kForRead))
{
pLTbl->getAt(sLineTypeinit, idLt);
pLTbl->close();
}
}
}
}
pRec->setName(sLayerInit);
pRec->setLinetypeObjectId(idLt);
pLayTbl->add(id, pRec);
pRec->close();
pLayTbl->close();
}
return id;
}
bool CablelineTools::getSqliteDB(LPCTSTR dbName, CUIISQLiteServer & db)
{
CString dbPath = FilePath::GetSysDir();
dbPath += _T("\\");
dbPath += dbName;
if (!db.InitADOServer(dbPath))
return false;
return true;
}