You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
4.8 KiB
C++

1 month ago
#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();
}