|
|
|
|
|
#pragma once
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "GDfdMap.h"
|
|
|
|
|
|
#include "PublicFunctions.h"
|
|
|
|
|
|
#include "BaseElements.h"
|
|
|
|
|
|
#include <fstream>
|
|
|
|
|
|
#include <sstream>
|
|
|
|
|
|
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<73>Ƿ<EFBFBD>Ϊscr<63><72><EFBFBD>Ӳ<EFBFBD>
|
|
|
|
|
|
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<string>& sublayers)
|
|
|
|
|
|
{
|
|
|
|
|
|
sublayers.clear();
|
|
|
|
|
|
map<string, std::list<GBaseObj*> >::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();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
|
|
|
|
|
|
|
|
|
|
|
int GDfdMap::GetElements(std::list<GBaseObj*>& 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<string, std::list<GBaseObj*> >::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<GBaseObj*>& GDfdMap::GetElements()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_elements;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int GDfdMap::GetLayers(std::vector<string>& layers)
|
|
|
|
|
|
{
|
|
|
|
|
|
layers.clear();
|
|
|
|
|
|
map<string, std::list<GBaseObj*> >::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<GBaseObj*>();
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
|
string strparent = GetParentLayer(layername);
|
|
|
|
|
|
while (strparent.size() > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_mapLayerObjs.count(strparent) < 1)
|
|
|
|
|
|
m_mapLayerObjs[strparent] = list<GBaseObj*>();
|
|
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
|
|
|
|
|
|
|
}
|