#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 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::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 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::iterator it; for (it = lstSort.begin();it != lstSort.end();++it) { arNum.append(*it); } } } }