Files
envi-code/SourceCode/Code2026/HvacCmd/DuctlineTools.cpp
T
2026-09-28 15:28:50 +08:00

375 lines
9.3 KiB
C++

#include "stdafx.h"
#include "CoreTools.h"
#include "sys/stat.h"
#include "DuctlineTools.h"
#include "KTSetting.h"
#include "KTModelLayoutXData.h"
#include "PipeSystemSetting.h"
#include "KTCADUtilityEx.h"
#ifndef PIPE_CENTER_SYS
#define PIPE_CENTER_SYS _T("风管中心线")
#define PIPE_OUTSIDE_SYS _T("风管边线")
#endif
#ifndef LAY_HVAC_SIG
#define LAY_HVAC_SIG _T("风管中心线")
#endif
#ifndef FITN_CENTER_SYS
#define FITN_CENTER_SYS _T("风管中心线")
#define FITN_OUTSIDE_SYS _T("风管边线")
#define FITN_SINGLE_SYS _T("风管中心线")
#endif
CString DuctlineTools::getCurrentPipeSysTblName()
{
CString sRel(_T("THVacCfg_Std0"));
CUIISQLiteServer db;
if (!db.InitADOServer(FilePath::GetSysDir() + _T("\\HvacConfig.db"))) return sRel;
CString sql(_T(""));
sql.Format(_T("SELECT [TABLENAME] FROM THvacCfg WHERE [STDNAME]='THvac'"));
db.GetSelData(sql, sRel);
return sRel;
}
AcDbObjectId DuctlineTools::getLtByPipeSys(LPCTSTR sys, bool bCenter)
{
AcDbObjectId id(AcDbObjectId::kNull);
CUIISQLiteServer db;
if (!db.InitADOServer(FilePath::GetSysDir() + _T("\\HvacConfig.db"))) return id;
CString sTable(DuctlineTools::getCurrentPipeSysTblName());
CString pipesys = bCenter ? _T("中心线") : _T("风管");
CString sql;
sql.Format(_T("SELECT [LINETYPE] FROM %s WHERE [SYSTEM]='%s' AND [PIPESYS]='%s'"), sTable, sys, pipesys);
CString sLt(_T("Continuous"));
db.GetSelData(sql, sLt);
int nPos = sLt.Find(_T(':'));//CENTER2:___ _ ___
if (nPos != -1)
{
CString sLtL = sLt.Mid(0, nPos);
sLt = sLtL;
}
AcDbDatabase *pDb = acdbCurDwg();
if (!pDb) return id;
AcDbLinetypeTable *pTable(NULL);
pDb->getLinetypeTable(pTable, AcDb::kForRead);
ACHAR *psz(NULL);
if (pTable)
{
pTable->getAt(sLt, id);
pTable->close();
}
if (!id.isValid())
{
id = CoreTools::loadLineType(FilePath::GetSysDir(), sLt);
}
return id;
}
AcDbObjectId DuctlineTools::getLyByPipeSys(LPCTSTR sys, bool bCenter, bool bUpdate)
{
AcDbObjectId id;
CUIISQLiteServer db;
if (!db.InitADOServer(FilePath::GetSysDir() + _T("\\HvacConfig.db"))) return id;
CString sTable(DuctlineTools::getCurrentPipeSysTblName());
CString pipesys = bCenter ? _T("中心线") : _T("风管");
CString sql;
sql.Format(_T("SELECT [LAYNAME] FROM %s WHERE [SYSTEM]='%s' AND [PIPESYS]='%s'"), sTable, sys, pipesys);
CString sLy(_T("0"));
db.GetSelData(sql, sLy);
AcDbDatabase *pDb = acdbCurDwg();
if (!pDb) return id;
AcDbLayerTable *pTable(NULL);
pDb->getLayerTable(pTable, AcDb::kForWrite);
ACHAR *psz(NULL);
if (pTable)
{
if (!pTable->has(sLy))
{ // 没有则新建
AcDbLayerTableRecord *pRec = new AcDbLayerTableRecord();
AcDbObjectId idLt = DuctlineTools::getLtByPipeSys(sys, bCenter);
if (idLt.isValid())
pRec->setLinetypeObjectId(idLt);
int clr = DuctlineTools::getColorByPipeSys(sys, bCenter);
AcCmColor aclr;
aclr.setColorIndex(clr);
pRec->setColor(aclr);
pRec->setName(sLy);
pTable->add(id, pRec);
pRec->close();
}
else
pTable->getAt(sLy, id);
pTable->close();
}
if (!bUpdate) return id;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbLayerTableRecord, pRec)
if (pRec)
{
AcDbObjectId idLt = DuctlineTools::getLtByPipeSys(sys, bCenter);
int clr = DuctlineTools::getColorByPipeSys(sys, bCenter);
AcCmColor aclr;
aclr.setColorIndex(clr);
pRec->setLinetypeObjectId(idLt);
pRec->setColor(aclr);
}
OPENOBJ_END()
return id;
}
double DuctlineTools::getLwByPipeSys(LPCTSTR sys, bool bCenter)
{
CUIISQLiteServer db;
if (!db.InitADOServer(FilePath::GetSysDir() + _T("\\HvacConfig.db"))) return 0;
CString sTable(CoreTools::getCurrentPipeSysTblName());
CString pipesys = bCenter ? _T("中心线") : _T("风管");
CString sql;
sql.Format(_T("SELECT [LINEWIDTH] FROM %s WHERE [SYSTEM]='%s' AND [PIPESYS]='%s'"), sTable, sys, pipesys);
CString sLw(_T("0"));
db.GetSelData(sql, sLw);
AecDbObjXDataMap xdata;
if (KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, xdata))
{
CString sScale(_T("1:100"));
xdata.GetAt(DOC_SCALE, sScale);
int nIndex = sScale.Find(':', 0);
double dDocScale = 1.0;
if (nIndex != -1)
{
dDocScale = _ttof(sScale.Mid(nIndex + 1)) / _ttof(sScale.Mid(0, nIndex));
}
return _ttof(sLw) * dDocScale;
}
return _ttof(sLw);
}
AcDbObjectId DuctlineTools::getLyForPipe(LPCTSTR sys, bool bUpdate)
{
CString sName = _T("DUCT-");
sName += sys;
sName += _T("管");
AcDbObjectId idPipeLayer;
AcDbDatabase *pDb = acdbCurDwg();
if (!pDb) return idPipeLayer;
AcDbLayerTable *pTable(NULL);
if (Acad::eOk == pDb->getLayerTable(pTable, AcDb::kForRead))
{
pTable->getAt(sName, idPipeLayer);
pTable->close();
}
if (idPipeLayer.isValid())
{
if (!bUpdate) return idPipeLayer;
OPENOBJ_BEGIN(idPipeLayer, AcDb::kForWrite, AcDbLayerTableRecord, pRec)
if (pRec)
{
AcDbObjectId idLt = DuctlineTools::getLtByPipeSys(sys, true);
int clr = DuctlineTools::getColorByPipeSys(sys, true);
AcCmColor aclr;
aclr.setColorIndex(clr);
pRec->setLinetypeObjectId(idLt);
pRec->setColor(aclr);
}
OPENOBJ_END()
return idPipeLayer;
}
AcDbObjectId idLy = DuctlineTools::getLyByPipeSys(sys, true, bUpdate);
OPENOBJ_BEGIN(idLy, AcDb::kForRead, AcDbLayerTableRecord, pRec)
if (pRec)
{
AcDbLayerTableRecord *pNew = (AcDbLayerTableRecord *)pRec->clone();
pNew->setName(sName);
int clr = DuctlineTools::getColorByPipeSys(sys, true);
AcCmColor aclr;
aclr.setColorIndex(clr);
pNew->setColor(aclr);
AcDbDatabase *pDb = acdbCurDwg();
if (pDb)
{
AcDbLayerTable *pT(NULL);
if (pDb->getLayerTable(pT, AcDb::kForWrite) == Acad::eOk)
{
if (pT->add(idPipeLayer, pNew) == Acad::eOk)
pNew->close();
pT->close();
}
}
}
OPENOBJ_END()
return idPipeLayer;
}
int DuctlineTools::getColorByPipeSys(LPCTSTR sys, bool bCenter)
{
CUIISQLiteServer db;
if (!db.InitADOServer(FilePath::GetSysDir() + _T("\\HvacConfig.db"))) return 256;
CString sTable(DuctlineTools::getCurrentPipeSysTblName());
CString pipesys = bCenter ? _T("中心线") : _T("风管");
CString sql;
sql.Format(_T("SELECT [COLOR] FROM %s WHERE [SYSTEM]='%s' AND [PIPESYS]='%s'"), sTable, sys, pipesys);
CString sClr(_T("256"));
db.GetSelData(sql, sClr);
return _ttoi(sClr);
}
AcDbObjectId DuctlineTools::AecInitLayerEx(LPCTSTR pszLayer,LPCTSTR pszSys,int nColorIndex,LPCTSTR pszLineType,AcDbDatabase* pDb,bool bUpdate )
{
//外部调用
//AcDbObjectId idCenLay = DuctlineTools::AecInitLayerEx(LAY_HVAC_CEN, pParam->szSys, 4, _T("center2"), NULL);
//AcDbObjectId idOutLay = DuctlineTools::AecInitLayerEx(LAY_HVAC_OUT, pParam->szSys, 7, _T("Continuous"), NULL);
//AcDbObjectId idSingle = DuctlineTools::AecInitLayerEx(LAY_HVAC_SIG, pParam->szSys, 7, _T("Continuous"), NULL);
AcDbObjectId id;
CUIISQLiteServer db;
if (!db.InitADOServer(FilePath::GetSysDir() + _T("\\HvacConfig.db"))) return id;
CString sTable(DuctlineTools::getCurrentPipeSysTblName());
//CString pipesys = bCenter ? _T("管线中心线") : _T("管线外边线");
CString pipesys;
bool bCenter = false;
if (_tcscmp(pszLayer, LAY_HVAC_OUT) == 0)
pipesys = _T("风管");
if (_tcscmp(pszLayer, LAY_HVAC_CEN) == 0)
{
pipesys = _T("中心线");
bCenter = true;
}
if (_tcscmp(pszLayer, LAY_HVAC_SIG) == 0)
pipesys = _T("风管单线");
CString sql;
sql.Format(_T("SELECT [LAYNAME] FROM %s WHERE [SYSTEM]='%s' AND [PIPESYS]='%s'"), sTable, pszSys, pipesys);
CString sLy(_T("0"));
db.GetSelData(sql, sLy);
if(pDb == NULL) pDb = acdbCurDwg();
if (!pDb) return id;
AcDbLayerTable *pTable(NULL);
pDb->getLayerTable(pTable, AcDb::kForWrite);
ACHAR *psz(NULL);
if (pTable)
{
if (!pTable->has(sLy))
{ // 没有则新建
AcDbLayerTableRecord *pRec = new AcDbLayerTableRecord();
AcDbObjectId idLt = DuctlineTools::getLtByPipeSys(pszSys, bCenter);
if (idLt.isValid())
pRec->setLinetypeObjectId(idLt);
int clr = DuctlineTools::getColorByPipeSys(pszSys, bCenter);
AcCmColor aclr;
aclr.setColorIndex(clr);
pRec->setColor(aclr);
pRec->setName(sLy);
pTable->add(id, pRec);
pRec->close();
}
else
pTable->getAt(sLy, id);
pTable->close();
}
if (!bUpdate) return id;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbLayerTableRecord, pRec)
if (pRec)
{
AcDbObjectId idLt = DuctlineTools::getLtByPipeSys(pszSys, bCenter);
int clr = DuctlineTools::getColorByPipeSys(pszSys, bCenter);
AcCmColor aclr;
aclr.setColorIndex(clr);
pRec->setLinetypeObjectId(idLt);
pRec->setColor(aclr);
}
OPENOBJ_END()
return id;
}
bool DuctlineTools::getSqliteDB(LPCTSTR dbName, CUIISQLiteServer & db)
{
CString dbPath = FilePath::GetSysDir();
dbPath += _T("\\");
dbPath += dbName;
if (!db.InitADOServer(dbPath))
return false;
return true;
}
bool DuctlineTools::setLayerSys(CUIISQLiteServer *pDb, CStringArray &ar)
{
if (!pDb) return false;
CAcModuleResourceOverride myResources;
//CWSysLayCfgDlg wsysDlg;
CPipeSystemSettingDlg wsysDlg;
int nRes = wsysDlg.DoModal();
if (nRes != IDOK) return false;
//显示当前图层系统
CString sSQL, sStd = _T("THVacCfg_Std0");
//sSQL = _T("select tablename from thvaccfg where currstd=1");
//pDb->GetSelData(sSQL, sStd);
sSQL.Format(_T("select distinct system from %s"), sStd);
pDb->GetSelData(sSQL, ar);
return true;
}
bool DuctlineTools::getLayerSys(CUIISQLiteServer *pDb, CStringArray &ar)
{
//显示当前图层系统
CString sSQL, sStd = _T("THVacCfg_Std0");
//sSQL = _T("select tablename from wpipecfg where currstd=1");
//pDb->GetSelData(sSQL, sStd);
sSQL.Format(_T("select distinct system from %s"), sStd);
pDb->GetSelData(sSQL, ar);
return true;
}