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

1319 lines
26 KiB
C++

#include "stdafx.h"
#include "TContainerSingleton.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
TContainerSingleton* TContainerSingleton::m_pSingleton = NULL;
TContainerSingleton::TContainerSingleton()
{
}
TContainerSingleton* TContainerSingleton::GetInstance()
{
if (m_pSingleton == NULL)
{
m_pSingleton = new TContainerSingleton;
m_pSingleton->MapCurrentDwg();
}
return m_pSingleton;
}
void TContainerSingleton::ReleaseInstance()
{
if (m_pSingleton != NULL)
{
delete m_pSingleton;
m_pSingleton = NULL;
}
}
void TContainerSingleton::MapCurrentDwg()
{
m_mapProHeight.clear();
m_mapID.clear();
m_mapCircle.clear();
m_mapRegion.clear();
m_map3DSolid.clear();
m_mapThundLine.clear();
m_mapTLRegion.clear();
m_mapTL3DSolid.clear();
AcDbObjectId id;
CString sGroupNo;
long i = 0;
// 映射避雷针
PickSet ssAll(SS_FREE);
RBList rbThunder = ads_buildlist(RTDXF0, _T("INSERT"), 8, LAY_EL_THUNDER, 2, _T("$Ectrical$00000091"), NULL);
ssAll.Get(_T("X"), NULL, NULL, rbThunder);
for (i = 0;i < ssAll.Length();++i)
{
Entity _ent(ssAll[i]);
id = GetIdFromEntity(_ent);
if (GetThunderGroupNo(id, sGroupNo))
{
AppendThunder(sGroupNo, id);
}
}
// 映射保护圆
ssAll.Free();
RBList rbCircle = ads_buildlist(RTDXF0, _T("CIRCLE"), 8, LAY_EL_THUNDER_2D, NULL);
ssAll.Get(_T("X"), NULL, NULL, rbCircle);
for (i = 0;i < ssAll.Length();++i)
{
Entity _ent(ssAll[i]);
id = GetIdFromEntity(_ent);
if (GetThunderGroupNo(id, sGroupNo))
{
AppendCircle(sGroupNo, id);
}
}
// 映射保护区域
ssAll.Free();
RBList rbReg = ads_buildlist(RTDXF0, _T("REGION"), 8, LAY_EL_THUNDER_2D, NULL);
ssAll.Get(_T("X"), NULL, NULL, rbReg);
for (i = 0;i < ssAll.Length();++i)
{
Entity _ent(ssAll[i]);
id = GetIdFromEntity(_ent);
if (GetThunderGroupNo(id, sGroupNo))
{
AppendRegion(sGroupNo, id);
}
else if (GetThunderGroupNo(id, sGroupNo, KEY_LINE_GROUP_NO))
{
AppendLineRegion(sGroupNo, id);
}
}
// 映射避雷线
ssAll.Free();
RBList rbLine = ads_buildlist(RTDXF0, _T("LWPOLYLINE"), 8, LAY_EL_THUNDER_2D, NULL);
ssAll.Get(_T("X"), NULL, NULL, rbLine);
for (i = 0;i < ssAll.Length();++i)
{
Entity _ent(ssAll[i]);
id = GetIdFromEntity(_ent);
if (GetThunderGroupNo(id, sGroupNo, KEY_LINE_GROUP_NO))
{
AppendThunderLine(sGroupNo, id);
}
}
// 映射三维实体
ssAll.Free();
RBList rbSolid = ads_buildlist(RTDXF0, _T("3DSOLID"), 8, LAY_EL_THUNDER_3D, NULL);
ssAll.Get(_T("X"), NULL, NULL, rbSolid);
for (i = 0;i < ssAll.Length();++i)
{
Entity _ent(ssAll[i]);
id = GetIdFromEntity(_ent);
if (GetThunderGroupNo(id, sGroupNo))
{
Append3DSolid(sGroupNo, id);
}
else if (GetThunderGroupNo(id, sGroupNo, KEY_LINE_GROUP_NO))
{
AppendLine3DSolid(sGroupNo, id);
}
}
// 映射预览三维实体
ssAll.Free();
RBList rbPreSolid = ads_buildlist(RTDXF0, _T("3DSOLID"), 8, LAY_EL_THUNDER_3D, NULL);
ssAll.Get(_T("X"), NULL, NULL, rbPreSolid);
for (i = 0;i < ssAll.Length();++i)
{
Entity _ent(ssAll[i]);
id = GetIdFromEntity(_ent);
if (GetThunderGroupNo(id, sGroupNo))
{
AppendPreview3DSolid(sGroupNo, id);
}
}
}
void TContainerSingleton::AppendThunder(LPCTSTR pszGNo, const AcDbObjectId& idThunder)
{
if (pszGNo != NULL)
{
LstGroupIDMap::iterator it;
if ((it = m_mapID.find(pszGNo)) != m_mapID.end())
{
if (!HasExist(idThunder,it->second))
{
it->second.push_back(idThunder);
}
}
else
{
LstIDData lstID;
lstID.push_back(idThunder);
m_mapID.insert(std::make_pair(pszGNo, lstID));
}
}
}
void TContainerSingleton::GetNumArrayBySpecGroup(LPCTSTR pszGNo, AcGeIntArray& arNum)
{
arNum.setLogicalLength(0);
if (pszGNo != NULL)
{
CString sTemp;
std::list<int> lstSort;
AcDbObjectIdArray arID;
GetGroupThunder(pszGNo, arID);
for (int i = 0;i < arID.length();++i)
{
if (arID[i].isValid())
{
OPENOBJ_BEGIN(arID[i],AcDb::kForRead,AcDbEntity,pEnt);
if (pEnt != NULL)
{
GetXData(pEnt,TEL_ORDER_NUMBER,sTemp);
lstSort.push_back(_ttoi(sTemp));
}
OPENOBJ_END();
}
}
if (lstSort.size() > 0)
{
lstSort.sort();
std::list<int>::iterator it;
for (it = lstSort.begin();it != lstSort.end();++it)
{
arNum.append(*it);
}
}
}
}
void TContainerSingleton::AppendThunder(LPCTSTR pszGNo, const AcDbObjectIdArray& arIdThunder)
{
if (pszGNo != NULL)
{
for (int i = 0;i < arIdThunder.length();++i)
{
AppendThunder(pszGNo,arIdThunder[i]);
}
}
}
int TContainerSingleton::GetGroupThunder(LPCTSTR pszGNo, AcDbObjectIdArray& arIdThunder)
{
arIdThunder.setLogicalLength(0);
if (pszGNo != NULL)
{
LstGroupIDMap::iterator it;
if ((it = m_mapID.find(pszGNo)) != m_mapID.end())
{
LstIDData lstID = it->second;
LstIDData::iterator itLst;
for (itLst = lstID.begin();itLst != lstID.end();++itLst)
{
arIdThunder.append(*itLst);
}
}
}
return arIdThunder.length();
}
int TContainerSingleton::GetThunderMap(LstGroupIDMap& mapThunder)
{
mapThunder = m_mapID;
return (int)mapThunder.size();
}
void TContainerSingleton::AppendRemoveProHeight(LPCTSTR pszGNo, double dProHeight)
{
if (pszGNo != NULL)
{
LstProHeightMap::iterator it;
if ((it = m_mapRemove.find(pszGNo)) != m_mapRemove.end())
{
if (!HasExist(dProHeight, it->second))
{
it->second.push_back(dProHeight);
}
}
else
{
LstProHeight lstH;
lstH.push_back(dProHeight);
m_mapRemove.insert(std::make_pair(pszGNo, lstH));
}
}
}
void TContainerSingleton::ClearProHeight()
{
m_mapProHeight.clear();
m_mapRemove.clear();
}
void TContainerSingleton::AppendProHeight(LPCTSTR pszGNo, const AcGeDoubleArray& arProHeight)
{
if (pszGNo != NULL)
{
if (arProHeight.length() > 0)
{
for (int i = 0;i < arProHeight.length();++i)
{
LstProHeightMap::iterator it;
if ((it = m_mapProHeight.find(pszGNo)) != m_mapProHeight.end())
{
if (!HasExist(arProHeight[i], it->second))
{
it->second.push_back(arProHeight[i]);
}
}
else
{
LstProHeight lstH;
lstH.push_back(arProHeight[i]);
m_mapProHeight.insert(std::make_pair(pszGNo, lstH));
}
}
}
else
{
LstProHeight lstH;
m_mapProHeight.insert(std::make_pair(pszGNo, lstH));
}
}
}
int TContainerSingleton::GetGroupProHeight(LPCTSTR pszGNo, AcGeDoubleArray& arProHeight)
{
arProHeight.setLogicalLength(0);
if (pszGNo != NULL)
{
MergeProHeight(m_mapRemove, m_mapProHeight);
LstProHeightMap::iterator it;
if ((it = m_mapProHeight.find(pszGNo)) != m_mapProHeight.end())
{
LstProHeight lstH = it->second;
LstProHeight::iterator itLst;
for (itLst = lstH.begin();itLst != lstH.end();++itLst)
{
arProHeight.append(*itLst);
}
}
}
return arProHeight.length();
}
void TContainerSingleton::MergeProHeight(LstProHeightMap& mapRomve, LstProHeightMap& mapProHeight)
{
LstProHeightMap::iterator it,itMain;
LstProHeight::iterator itLst,itMainLst;
for (it = mapRomve.begin();it != mapRomve.end();++it) // 被删除的保护高度key
{
if ((itMain = mapProHeight.find(it->first)) != mapProHeight.end()) // 原有的保护高度中是否存在该key
{
for (itLst = it->second.begin();itLst != it->second.end();++itLst) //遍历被删除的保护高度
{
// 从原有保护高度序列中剔除
for (itMainLst = itMain->second.begin();itMainLst != itMain->second.end();)
{
if (fabs((*itLst)-(*itMainLst)) < 1e-3)
{
itMainLst = itMain->second.erase(itMainLst);
}
else
{
itMainLst++;
}
}
}
}
}
}
int TContainerSingleton::GetProHeightMap(LstProHeightMap& mapProHeight)
{
MergeProHeight(m_mapRemove, m_mapProHeight);
mapProHeight = m_mapProHeight;
return (int)mapProHeight.size();
}
BOOL TContainerSingleton::HasExist(const AcDbObjectId& idThunder, const LstIDData& lstID)
{
if (idThunder.isValid())
{
LstIDData::const_iterator it;
it = std::find(lstID.begin(),lstID.end(),idThunder);
if (it != lstID.end())
{
return TRUE;
}
}
return FALSE;
}
BOOL TContainerSingleton::HasExist(double dProHeight, const LstProHeight& lstProHeight)
{
LstProHeight::const_iterator it;
// 可控精确小数位
for (it = lstProHeight.begin();it != lstProHeight.end();++it)
{
if (fabs(dProHeight-*it) < 1e-3)
{
return TRUE;
}
}
return FALSE;
}
AcDbObjectId TContainerSingleton::GetIdFromEntity(Entity& ent)
{
AcDbObjectId id;
id.setNull();
if (!!ent)
{
acdbGetObjectId(id, ent);
}
return id;
}
BOOL TContainerSingleton::GetThunderGroupNo(const AcDbObjectId& idThun, CString& sGroupNo, LPCTSTR pszKey)
{
sGroupNo.Empty();
if (pszKey != NULL && idThun.isValid())
{
OPENOBJ_BEGIN(idThun,AcDb::kForRead,AcDbEntity,pEnt);
if (pEnt != NULL)
{
GetXData(pEnt, pszKey, sGroupNo);
}
OPENOBJ_END();
}
return (!sGroupNo.IsEmpty());
}
BOOL TContainerSingleton::GetThunderNumber(const AcDbObjectId& idThun, CString& sNumber)
{
sNumber.Empty();
if (idThun.isValid())
{
OPENOBJ_BEGIN(idThun,AcDb::kForRead,AcDbEntity,pEnt);
if (pEnt != NULL)
{
GetXData(pEnt, TEL_ORDER_NUMBER, sNumber);
}
OPENOBJ_END();
}
return (!sNumber.IsEmpty());
}
BOOL TContainerSingleton::GetThunderNumber(AcDbEntity* pEnt, CString& sNumber)
{
sNumber.Empty();
if (pEnt != NULL)
{
GetXData(pEnt, TEL_ORDER_NUMBER, sNumber);
}
return (!sNumber.IsEmpty());
}
BOOL TContainerSingleton::GetXData(AcDbEntity* pEnt, LPCTSTR pszAppName, CString& sXData)
{
sXData.Empty();
if (pszAppName == NULL || pEnt == NULL)
{
return FALSE;
}
struct resbuf* pRb = NULL;
pRb = pEnt->xData(pszAppName);
struct resbuf* pTemp = NULL;
if (pRb == NULL)
{
return FALSE;
}
else
{
// 首先跳过程序名
for (pTemp = pRb->rbnext; pTemp != NULL;
pTemp = pTemp->rbnext)
{
if (pTemp->restype == AcDb::kDxfXdAsciiString)
{
sXData = pTemp->resval.rstring;
break;
}
}
}
acutRelRb(pRb);
return TRUE;
}
void TContainerSingleton::RemoveThunderNoGNo(const AcDbObjectId& idThunder)
{
LstGroupIDMap::iterator it;
LstIDData::iterator itLst;
for (it = m_mapID.begin();it != m_mapID.end();++it)
{
if ((itLst = std::find(it->second.begin(),it->second.end(),idThunder)) != it->second.end())
{
it->second.erase(itLst);
if (it->second.size() < 1)
{
m_mapID.erase(it);
}
break;
}
}
}
void TContainerSingleton::RemoveThunder(const AcDbObjectId& idThunder)
{
if (idThunder.isValid())
{
CString sGNo;
GetThunderGroupNo(idThunder, sGNo);
RemoveThunder(sGNo, idThunder);
}
}
void TContainerSingleton::RemoveThunder(const AcDbObjectIdArray& arIdThunder)
{
for (int i = 0;i < arIdThunder.length();++i)
{
RemoveThunder(arIdThunder[i]);
}
}
void TContainerSingleton::RemoveThunder(LPCTSTR pszGNo, const AcDbObjectId& idThunder)
{
if (pszGNo != NULL && idThunder.isValid())
{
LstGroupIDMap::iterator it;
if ((it = m_mapID.find(pszGNo)) != m_mapID.end())
{
LstIDData::iterator itLst;
if ((itLst = std::find(it->second.begin(),it->second.end(),idThunder)) != it->second.end())
{
it->second.erase(itLst);
}
if (it->second.size() < 1)
{
m_mapID.erase(it);
}
}
}
}
void TContainerSingleton::RemoveThunder(LPCTSTR pszGNo, const AcDbObjectIdArray& arIdThunder)
{
if (pszGNo != NULL)
{
for (int i = 0;i < arIdThunder.length();++i)
{
RemoveThunder(pszGNo, arIdThunder[i]);
}
}
}
// subobjopt
void TContainerSingleton::AppendCircle(LPCTSTR pszGNo, const AcDbObjectId& idCir)
{
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_mapCircle.find(pszGNo)) != m_mapCircle.end())
{
it->second.push_back(idCir);
}
else
{
LstIDData lstID;
lstID.push_back(idCir);
m_mapCircle.insert(std::make_pair(pszGNo, lstID));
}
}
}
void TContainerSingleton::AppendCircle(LPCTSTR pszGNo, const AcDbObjectIdArray& arIdCir)
{
if (pszGNo != NULL)
{
for (int i = 0;i < arIdCir.length();++i)
{
AppendCircle(pszGNo,arIdCir[i]);
}
}
}
int TContainerSingleton::GetCircle(LPCTSTR pszGNo, AcDbObjectIdArray& arIdCir)
{
arIdCir.setLogicalLength(0);
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_mapCircle.find(pszGNo)) != m_mapCircle.end())
{
LstIDData::iterator itLst;
for (itLst = it->second.begin();itLst != it->second.end();++itLst)
{
arIdCir.append(*itLst);
}
}
}
return arIdCir.length();
}
void TContainerSingleton::AppendRegion(LPCTSTR pszGNo, const AcDbObjectId& idReg)
{
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_mapRegion.find(pszGNo)) != m_mapRegion.end())
{
it->second.push_back(idReg);
}
else
{
LstIDData lstID;
lstID.push_back(idReg);
m_mapRegion.insert(std::make_pair(pszGNo, lstID));
}
}
}
void TContainerSingleton::AppendRegion(LPCTSTR pszGNo, const AcDbObjectIdArray& arIdReg)
{
if (pszGNo != NULL)
{
for (int i = 0;i < arIdReg.length();++i)
{
AppendCircle(pszGNo,arIdReg[i]);
}
}
}
int TContainerSingleton::GetRegion(LPCTSTR pszGNo, AcDbObjectIdArray& arIdReg)
{
arIdReg.setLogicalLength(0);
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_mapRegion.find(pszGNo)) != m_mapRegion.end())
{
LstIDData::iterator itLst;
for (itLst = it->second.begin();itLst != it->second.end();++itLst)
{
arIdReg.append(*itLst);
}
}
}
return arIdReg.length();
}
void TContainerSingleton::Append3DSolid(LPCTSTR pszGNo, const AcDbObjectId& idSolid)
{
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_map3DSolid.find(pszGNo)) != m_map3DSolid.end())
{
it->second.push_back(idSolid);
}
else
{
LstIDData lstID;
lstID.push_back(idSolid);
m_map3DSolid.insert(std::make_pair(pszGNo, lstID));
}
}
}
void TContainerSingleton::Append3DSolid(LPCTSTR pszGNo, const AcDbObjectIdArray& arIdSolid)
{
if (pszGNo != NULL)
{
for (int i = 0;i < arIdSolid.length();++i)
{
AppendCircle(pszGNo,arIdSolid[i]);
}
}
}
int TContainerSingleton::Get3DSolid(LPCTSTR pszGNo, AcDbObjectIdArray& arIdSolid)
{
arIdSolid.setLogicalLength(0);
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_map3DSolid.find(pszGNo)) != m_map3DSolid.end())
{
LstIDData::iterator itLst;
for (itLst = it->second.begin();itLst != it->second.end();++itLst)
{
arIdSolid.append(*itLst);
}
}
}
return arIdSolid.length();
}
void TContainerSingleton::RemoveCircle(LPCTSTR pszGNo, const AcDbObjectId& idCir)
{
if (pszGNo != NULL && idCir.isValid())
{
LstSubIDMap::iterator it;
if ((it = m_mapCircle.find(pszGNo)) != m_mapCircle.end())
{
LstIDData::iterator itLst;
for (itLst = it->second.begin();itLst != it->second.end();++itLst)
{
if (*itLst == idCir)
{
it->second.erase(itLst);
break;
}
}
if (it->second.size() < 1)
{
m_mapCircle.erase(it);
}
}
}
}
void TContainerSingleton::RemoveRegion(LPCTSTR pszGNo, const AcDbObjectId& idReg)
{
if (pszGNo != NULL && idReg.isValid())
{
LstSubIDMap::iterator it;
if ((it = m_mapRegion.find(pszGNo)) != m_mapRegion.end())
{
LstIDData::iterator itLst;
for (itLst = it->second.begin();itLst != it->second.end();++itLst)
{
if (*itLst == idReg)
{
it->second.erase(itLst);
break;
}
}
if (it->second.size() < 1)
{
m_mapRegion.erase(it);
}
}
}
}
void TContainerSingleton::Remove3DSolid(LPCTSTR pszGNo, const AcDbObjectId& idSolid)
{
if (pszGNo != NULL && idSolid.isValid())
{
LstSubIDMap::iterator it;
if ((it = m_map3DSolid.find(pszGNo)) != m_map3DSolid.end())
{
LstIDData::iterator itLst;
for (itLst = it->second.begin();itLst != it->second.end();++itLst)
{
if (*itLst == idSolid)
{
it->second.erase(itLst);
break;
}
}
if (it->second.size() < 1)
{
m_map3DSolid.erase(it);
}
}
}
}
void TContainerSingleton::EreaseSpecGNoCircl(LPCTSTR pszGNo)
{
if (pszGNo != NULL)
{
AcDbObjectIdArray arIDCircle;
GetCircle(pszGNo, arIDCircle);
for (int i = 0;i < arIDCircle.length();++i)
{
if (arIDCircle[i].isValid())
{
OPENOBJ_BEGIN(arIDCircle[i],AcDb::kForWrite,AcDbEntity,pEnt);
if (pEnt != NULL)
{
pEnt->erase();
}
OPENOBJ_END();
}
}
}
LstSubIDMap::iterator it;
if ((it = m_mapCircle.find(pszGNo)) != m_mapCircle.end())
{
m_mapCircle.erase(it);
}
}
void TContainerSingleton::EreaseSpecGNoRegion(LPCTSTR pszGNo)
{
if (pszGNo != NULL)
{
AcDbObjectIdArray arIDRegion;
GetRegion(pszGNo, arIDRegion);
for (int i = 0;i < arIDRegion.length();++i)
{
if (arIDRegion[i].isValid())
{
OPENOBJ_BEGIN(arIDRegion[i],AcDb::kForWrite,AcDbEntity,pEnt);
if (pEnt != NULL)
{
pEnt->erase();
}
OPENOBJ_END();
}
}
}
LstSubIDMap::iterator it;
if ((it = m_mapRegion.find(pszGNo)) != m_mapRegion.end())
{
m_mapRegion.erase(it);
}
}
void TContainerSingleton::EreaseSpecGNo3dSolid(LPCTSTR pszGNo)
{
if (pszGNo != NULL)
{
AcDbObjectIdArray arIDSolid;
Get3DSolid(pszGNo, arIDSolid);
for (int i = 0;i < arIDSolid.length();++i)
{
if (arIDSolid[i].isValid())
{
OPENOBJ_BEGIN(arIDSolid[i],AcDb::kForWrite,AcDbEntity,pEnt);
if (pEnt != NULL)
{
pEnt->erase();
}
OPENOBJ_END();
}
}
}
LstSubIDMap::iterator it;
if ((it = m_map3DSolid.find(pszGNo)) != m_map3DSolid.end())
{
m_map3DSolid.erase(it);
}
}
AcGePoint3d TContainerSingleton::GetThunderInsertPosition(const AcDbObjectId& idThunder)
{
AcGePoint3d ptPos;
if (idThunder.isValid())
{
OPENOBJ_BEGIN(idThunder, AcDb::kForRead, AcDbBlockReference, pRef);
if (pRef != NULL)
{
ptPos = pRef->position();
}
OPENOBJ_END();
}
return ptPos;
}
void TContainerSingleton::AppendPreview3DSolid(LPCTSTR pszGNo, const AcDbObjectId& idSolid)
{
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_mapPreview3DSolid.find(pszGNo)) != m_mapPreview3DSolid.end())
{
it->second.push_back(idSolid);
}
else
{
LstIDData lstID;
lstID.push_back(idSolid);
m_mapPreview3DSolid.insert(std::make_pair(pszGNo, lstID));
}
}
}
void TContainerSingleton::EreasePreview3DSolid()
{
LstSubIDMap::iterator it;
LstIDData lstData;
LstIDData::iterator itLst;
for (it = m_mapPreview3DSolid.begin();it != m_mapPreview3DSolid.end();++it)
{
lstData = it->second;
for (itLst = lstData.begin();itLst != lstData.end();++itLst)
{
if ((*itLst).isValid())
{
OPENOBJ_BEGIN(*itLst, AcDb::kForWrite, AcDbEntity, pEnt);
if (pEnt != NULL)
{
pEnt->erase();
}
OPENOBJ_END();
}
}
}
m_mapPreview3DSolid.clear();
}
// 避雷线
void TContainerSingleton::AppendThunderLine(LPCTSTR pszGNo, const AcDbObjectId& idThunderLine)
{
if (pszGNo != NULL)
{
LstGroupIDMap::iterator it;
if ((it = m_mapThundLine.find(pszGNo)) != m_mapThundLine.end())
{
if (!HasExist(idThunderLine,it->second))
{
it->second.push_back(idThunderLine);
}
}
else
{
LstIDData lstID;
lstID.push_back(idThunderLine);
m_mapThundLine.insert(std::make_pair(pszGNo, lstID));
}
}
}
void TContainerSingleton::RemoveThunderLine(const AcDbObjectId& idThunderLine)
{
LstGroupIDMap::iterator it;
LstIDData::iterator itLst;
for (it = m_mapThundLine.begin();it != m_mapThundLine.end();++it)
{
if ((itLst = std::find(it->second.begin(),it->second.end(),idThunderLine)) != it->second.end())
{
it->second.erase(itLst);
if (it->second.size() < 1)
{
m_mapThundLine.erase(it);
}
break;
}
}
}
void TContainerSingleton::RemoveThunderLine(LPCTSTR pszGNo, const AcDbObjectId& idThunderLine)
{
if (pszGNo != NULL && idThunderLine.isValid())
{
LstGroupIDMap::iterator it;
if ((it = m_mapThundLine.find(pszGNo)) != m_mapThundLine.end())
{
LstIDData::iterator itLst;
if ((itLst = std::find(it->second.begin(),it->second.end(),idThunderLine)) != it->second.end())
{
it->second.erase(itLst);
}
if (it->second.size() < 1)
{
m_mapThundLine.erase(it);
}
}
}
}
int TContainerSingleton::GetGroupThunderLine(LPCTSTR pszGNo, AcDbObjectIdArray& arIdThunderLine)
{
arIdThunderLine.setLogicalLength(0);
if (pszGNo != NULL)
{
LstGroupIDMap::iterator it;
if ((it = m_mapThundLine.find(pszGNo)) != m_mapThundLine.end())
{
LstIDData lstID = it->second;
LstIDData::iterator itLst;
for (itLst = lstID.begin();itLst != lstID.end();++itLst)
{
arIdThunderLine.append(*itLst);
}
}
}
return arIdThunderLine.length();
}
int TContainerSingleton::GetThunderLineMap(LstGroupIDMap& mapThunder)
{
mapThunder = m_mapThundLine;
return (int)mapThunder.size();
}
void TContainerSingleton::AppendLineRegion(LPCTSTR pszGNo, const AcDbObjectId& idReg)
{
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_mapTLRegion.find(pszGNo)) != m_mapTLRegion.end())
{
it->second.push_back(idReg);
}
else
{
LstIDData lstID;
lstID.push_back(idReg);
m_mapTLRegion.insert(std::make_pair(pszGNo, lstID));
}
}
}
void TContainerSingleton::RemoveLineRegion(LPCTSTR pszGNo, const AcDbObjectId& idReg)
{
if (pszGNo != NULL && idReg.isValid())
{
LstSubIDMap::iterator it;
if ((it = m_mapTLRegion.find(pszGNo)) != m_mapTLRegion.end())
{
LstIDData::iterator itLst;
for (itLst = it->second.begin();itLst != it->second.end();++itLst)
{
if (*itLst == idReg)
{
it->second.erase(itLst);
break;
}
}
if (it->second.size() < 1)
{
m_mapTLRegion.erase(it);
}
}
}
}
int TContainerSingleton::GetLineRegion(LPCTSTR pszGNo, AcDbObjectIdArray& arIdReg)
{
arIdReg.setLogicalLength(0);
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_mapTLRegion.find(pszGNo)) != m_mapTLRegion.end())
{
LstIDData::iterator itLst;
for (itLst = it->second.begin();itLst != it->second.end();++itLst)
{
arIdReg.append(*itLst);
}
}
}
return arIdReg.length();
}
void TContainerSingleton::EreaseSpecGNoLineRegion(LPCTSTR pszGNo)
{
if (pszGNo != NULL)
{
AcDbObjectIdArray arIDRegion;
GetLineRegion(pszGNo, arIDRegion);
for (int i = 0;i < arIDRegion.length();++i)
{
if (arIDRegion[i].isValid())
{
OPENOBJ_BEGIN(arIDRegion[i],AcDb::kForWrite,AcDbEntity,pEnt);
if (pEnt != NULL)
{
pEnt->erase();
}
OPENOBJ_END();
}
}
}
LstSubIDMap::iterator it;
if ((it = m_mapTLRegion.find(pszGNo)) != m_mapTLRegion.end())
{
m_mapTLRegion.erase(it);
}
}
void TContainerSingleton::AppendLine3DSolid(LPCTSTR pszGNo, const AcDbObjectId& idSolid)
{
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_mapTL3DSolid.find(pszGNo)) != m_mapTL3DSolid.end())
{
it->second.push_back(idSolid);
}
else
{
LstIDData lstID;
lstID.push_back(idSolid);
m_mapTL3DSolid.insert(std::make_pair(pszGNo, lstID));
}
}
}
void TContainerSingleton::RemoveLine3DSolid(LPCTSTR pszGNo, const AcDbObjectId& idSolid)
{
if (pszGNo != NULL && idSolid.isValid())
{
LstSubIDMap::iterator it;
if ((it = m_mapTL3DSolid.find(pszGNo)) != m_mapTL3DSolid.end())
{
LstIDData::iterator itLst;
for (itLst = it->second.begin();itLst != it->second.end();++itLst)
{
if (*itLst == idSolid)
{
it->second.erase(itLst);
break;
}
}
if (it->second.size() < 1)
{
m_mapTL3DSolid.erase(it);
}
}
}
}
int TContainerSingleton::GetLine3DSolid(LPCTSTR pszGNo, AcDbObjectIdArray& arIdSolid)
{
arIdSolid.setLogicalLength(0);
if (pszGNo != NULL)
{
LstSubIDMap::iterator it;
if ((it = m_mapTL3DSolid.find(pszGNo)) != m_mapTL3DSolid.end())
{
LstIDData::iterator itLst;
for (itLst = it->second.begin();itLst != it->second.end();++itLst)
{
arIdSolid.append(*itLst);
}
}
}
return arIdSolid.length();
}
void TContainerSingleton::EreaseSpecGNoLine3dSolid(LPCTSTR pszGNo)
{
if (pszGNo != NULL)
{
AcDbObjectIdArray arIDSolid;
GetLine3DSolid(pszGNo, arIDSolid);
for (int i = 0;i < arIDSolid.length();++i)
{
if (arIDSolid[i].isValid())
{
OPENOBJ_BEGIN(arIDSolid[i],AcDb::kForWrite,AcDbEntity,pEnt);
if (pEnt != NULL)
{
pEnt->erase();
}
OPENOBJ_END();
}
}
}
LstSubIDMap::iterator it;
if ((it = m_mapTL3DSolid.find(pszGNo)) != m_mapTL3DSolid.end())
{
m_mapTL3DSolid.erase(it);
}
}
void TContainerSingleton::AppendRemoveLineProHeight(LPCTSTR pszGNo, double dProHeight)
{
if (pszGNo != NULL)
{
LstProHeightMap::iterator it;
if ((it = m_mapLineRemove.find(pszGNo)) != m_mapLineRemove.end())
{
if (!HasExist(dProHeight, it->second))
{
it->second.push_back(dProHeight);
}
}
else
{
LstProHeight lstH;
lstH.push_back(dProHeight);
m_mapLineRemove.insert(std::make_pair(pszGNo, lstH));
}
}
}
void TContainerSingleton::AppendLineProHeight(LPCTSTR pszGNo, const AcGeDoubleArray& arProHeight)
{
if (pszGNo != NULL)
{
if (arProHeight.length() > 0)
{
for (int i = 0;i < arProHeight.length();++i)
{
LstProHeightMap::iterator it;
if ((it = m_mapLineProHeight.find(pszGNo)) != m_mapLineProHeight.end())
{
if (!HasExist(arProHeight[i], it->second))
{
it->second.push_back(arProHeight[i]);
}
}
else
{
LstProHeight lstH;
lstH.push_back(arProHeight[i]);
m_mapLineProHeight.insert(std::make_pair(pszGNo, lstH));
}
}
}
else
{
LstProHeight lstH;
m_mapLineProHeight.insert(std::make_pair(pszGNo, lstH));
}
}
}
void TContainerSingleton::ClearLineProHeight()
{
m_mapLineProHeight.clear();
m_mapLineRemove.clear();
}
int TContainerSingleton::GetGroupLineProHeight(LPCTSTR pszGNo, AcGeDoubleArray& arProHeight)
{
arProHeight.setLogicalLength(0);
if (pszGNo != NULL)
{
MergeProHeight(m_mapLineRemove,m_mapLineProHeight);
LstProHeightMap::iterator it;
if ((it = m_mapLineProHeight.find(pszGNo)) != m_mapLineProHeight.end())
{
LstProHeight lstH = it->second;
LstProHeight::iterator itLst;
for (itLst = lstH.begin();itLst != lstH.end();++itLst)
{
arProHeight.append(*itLst);
}
}
}
return arProHeight.length();
}
int TContainerSingleton::GetProLineHeightMap(LstProHeightMap& mapProHeight)
{
MergeProHeight(m_mapLineRemove, m_mapLineProHeight);
mapProHeight = m_mapLineProHeight;
return (int)mapProHeight.size();
}
void TContainerSingleton::GetTLineNumArrayBySpecGroup(LPCTSTR pszGNo, AcGeIntArray& arNum)
{
arNum.setLogicalLength(0);
if (pszGNo != NULL)
{
CString sTemp;
std::list<int> lstSort;
AcDbObjectIdArray arID;
GetGroupThunderLine(pszGNo, arID);
for (int i = 0;i < arID.length();++i)
{
if (arID[i].isValid())
{
OPENOBJ_BEGIN(arID[i],AcDb::kForRead,AcDbEntity,pEnt);
if (pEnt != NULL)
{
GetXData(pEnt,TEL_ORDER_NUMBER,sTemp);
lstSort.push_back(_ttoi(sTemp));
}
OPENOBJ_END();
}
}
if (lstSort.size() > 0)
{
lstSort.sort();
std::list<int>::iterator it;
for (it = lstSort.begin();it != lstSort.end();++it)
{
arNum.append(*it);
}
}
}
}