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

109 lines
2.7 KiB
C++

#include "stdafx.h"
#include "HydrantSetting.h"
#include "DbEquipment.h"
#include <algorithm>
//设置消火栓的颜色
void CHydrantSetting::SetHydrantColor(AcDbObjectId idHydrant, int nColor)
{
if (idHydrant.isValid())
{
TDbEquipment *pEquip = NULL;
acdbOpenObject(pEquip, idHydrant, AcDb::kForWrite);
if (pEquip != NULL)
{
AcDbObjectId idBlk = pEquip->GetBlock2d();
AcDbBlockTableRecord *pBlkTblRec = NULL;
acdbOpenObject(pBlkTblRec, idBlk, AcDb::kForRead);
if (pBlkTblRec != NULL)
{
AcDbBlockTableRecordIterator *pIter = NULL;
pBlkTblRec->newIterator(pIter);
AcDbEntity *pEnt = NULL;
for (pIter->start(); !pIter->done(); pIter->step())
{
Acad::ErrorStatus es = pIter->getEntity(pEnt, AcDb::kForWrite);
if (pEnt != NULL && es == Acad::eOk)
{
pEnt->setColorIndex(nColor);
pEnt->close();
}
}
delete pIter;
pIter = NULL;
pEquip->SetBlock2d(idBlk);
pBlkTblRec->close();
}
pEquip->close();
}
}
}
//设置消火栓的颜色
void CHydrantSetting::SetHydrantColor(std::vector<AcDbObjectId> &vecId, int nColor)
{
if (!vecId.empty())
{
std::vector<AcDbObjectId>::iterator iter = vecId.begin();
for (; iter != vecId.end(); iter++)
{
SetHydrantColor(*iter, nColor);
int i = 0;
}
}
}
//根据B值即消火栓的宽度为消火栓排序
void CHydrantSetting::Compositor(std::vector<AcDbObjectId> &vecId, std::multimap<double, AcDbObjectId> &mapTemp)
{
int nSize = (int)vecId.size();
TDbEquipment *pEquip = NULL;
mapTemp.clear();
for (int i = 0; i < nSize; i++)
{
acdbOpenObject(pEquip, vecId[i], AcDb::kForRead);
if (pEquip != NULL)
{
AcGeScale3d sca = pEquip->GetInsertScale();
double dWidth = fabs(sca.sx);
mapTemp.insert(std::make_pair(dWidth, vecId[i]));
pEquip->close();
}
}
}
//根据小火栓类型将其分为两类: 水平接,上接
void CHydrantSetting::Sort(std::map<AcDbObjectId, AcDbObjectId> &mapId, std::vector<AcDbObjectId> &vecId1, std::vector<AcDbObjectId> &vecId2)
{
AcDbObjectId idHydrant = AcDbObjectId::kNull;
std::map<AcDbObjectId, AcDbObjectId>::iterator iter = mapId.begin();
TDbEquipment *pEquip = NULL;
vecId1.clear();
vecId2.clear();
for (; iter != mapId.end(); iter++)
{
idHydrant = iter->first;
if (idHydrant.isValid())
{
acdbOpenObject(pEquip, idHydrant, AcDb::kForRead);
if (pEquip != NULL)
{
double dPipeLength = pEquip->GetPipeLength();
if (fabs(dPipeLength) < 1e-6) //消火栓类型为水平接
{
vecId1.push_back(idHydrant);
}
else if (fabs(dPipeLength - 250) < 1e-6) //消火栓类型为上接
{
vecId2.push_back(idHydrant);
}
}
pEquip->close();
}
}
}