#pragma once #include "stdafx.h" #include "GDfdMap.h" #include "PublicFunctions.h" #include "BaseElements.h" #include #include using namespace std; GDfdMap::GDfdMap() :m_tmpLayer("") ,m_tmpColor(RGB(0, 0, 0)) { } GDfdMap::~GDfdMap() { ClearAll(); } void GDfdMap::ClearAll(void) { OBJITER iter = m_elements.begin(); for (; iter != m_elements.end(); iter++) { if (nullptr != *iter) delete *iter; } m_mapLayerObjs.clear(); m_elements.clear(); m_tmpLayer = ""; m_tmpColor = RGB(0, 0, 0); } string GDfdMap::GetParentLayer(string curLayer) { size_t idx = curLayer.find_last_of('\\'); if (idx == std::string::npos) return string(); return curLayer.substr(0,idx); } void GDfdMap::InsertObj(GBaseObj * pobj) { pobj->SetLayer(m_tmpLayer); pobj->SetColor(m_tmpColor); m_elements.push_back(pobj); if (m_tmpLayer.size() > 0) m_mapLayerObjs[m_tmpLayer].push_back(pobj); } void GDfdMap::InsertObj(GBaseObj* pobj, const string& strLayer, COLORREF color) { if(!strLayer.empty()) pobj->SetLayer(strLayer); pobj->SetColor(color); m_elements.push_back(pobj); if (m_tmpLayer.size() > 0) m_mapLayerObjs[m_tmpLayer].push_back(pobj); } //layerdst是否为scr的子层 bool GDfdMap::IsSubLayer(string layerscr, string layerdst) { if (layerdst.size() <= layerscr.size()) return false; size_t idx = layerdst.find(layerscr); if (0 == idx) return true; return false; } int GDfdMap::GetSubLayers(string parentLayer, list& sublayers) { sublayers.clear(); map >::iterator iter = m_mapLayerObjs.begin(); for (; iter != m_mapLayerObjs.end(); iter++) { if (IsSubLayer(parentLayer, iter->first)) sublayers.push_back(iter->first); } return (int)sublayers.size(); } //获取指定层下所有元素 int GDfdMap::GetElements(std::list& dstObjs, string layername, bool bIncludingSublayers /*= true*/) { if (layername.empty()) { dstObjs.assign(m_elements.begin(), m_elements.end()); return (int)m_elements.size(); } if (m_mapLayerObjs.count(layername) < 1 ) return 0; dstObjs.assign(m_mapLayerObjs[layername].begin(), m_mapLayerObjs[layername].end()); if (bIncludingSublayers) { string strFind = layername; strFind += "\\"; map >::iterator iter = m_mapLayerObjs.begin(); for (; iter != m_mapLayerObjs.end(); iter++) { if (!IsSubLayer(strFind, iter->first)) continue; //sublayer dstObjs.insert(dstObjs.end(), iter->second.begin(), iter->second.end()); } } return (int)dstObjs.size(); } std::list& GDfdMap::GetElements() { return m_elements; } int GDfdMap::GetLayers(std::vector& layers) { layers.clear(); map >::iterator iter = m_mapLayerObjs.begin(); for (; iter != m_mapLayerObjs.end(); iter++) layers.push_back(iter->first); return (int)layers.size(); } string GDfdMap::InsertLayer(string layername) { CPublicFunctions::Trim(layername); if (layername.empty()) return string(); if (m_mapLayerObjs.count(layername) < 1) m_mapLayerObjs[layername] = list(); //解析 string strparent = GetParentLayer(layername); while (strparent.size() > 0) { if (m_mapLayerObjs.count(strparent) < 1) m_mapLayerObjs[strparent] = list(); strparent = GetParentLayer(strparent); } return layername; } int GDfdMap::ReadFile(const char* fname) { ClearAll(); ifstream ifs(fname, fstream::in); if (!ifs) return 0; string line; stringstream sstr; size_t idx = 0; string curLayer; char ch; int nSymbol = 0; while (getline(ifs, line)) { if (line.size() < 1) continue; if (line.substr(0, 4) == "New ") { nSymbol++; } if (line.substr(0, 6) == "EndNew") { nSymbol--; continue; } if (nSymbol > 0) { continue; } CPublicFunctions::Trim(line); if ((idx = line.find("Layer M")) == 0 && line.size() > 7) { curLayer = InsertLayer(line.substr(idx + 7)); if (curLayer.size() > 0) m_tmpLayer = curLayer; continue; } if ((idx = line.find("Color")) == 0 && line.size() > 5) { line = line.substr(5); CPublicFunctions::Trim(line); m_tmpColor = atol(line.c_str()); continue; } //point if ((idx = line.find("3dPoint")) == 0 && line.size() > 8) { line = line.substr(8); CPublicFunctions::Trim(line); sstr.clear(); sstr.str(line); GPoint3D* pobj = new GPoint3D(); sstr >> pobj->x0 >> ch >> pobj->y0 >> ch >> pobj->z0; idx = line.find_last_of(' '); line = line.substr(idx + 1); pobj->SetName(line); InsertObj(pobj); continue; } //curve if ((idx = line.find("Pline")) == 0) { GPline* pc = new GPline(); if(line.size() > 5) { size_t i = line.find_first_of('.', 5); pc->SetName(line.substr(i + 1)); } if (pc->ReadFile(ifs) < 2 ) { delete pc; continue; } InsertObj(pc); continue; } } ifs.close(); return (int)m_elements.size(); }