GroupRenderer.cpp 4.8 KB

#ifndef _GroupRenderer_H_
#define _GroupRenderer_H_

#include "GroupRenderer.h"
#include"SimpleMarkerSymbol.h"
#include"SimpleLabelRenderer.h"
#include"SimpleLineSymbol.h"
#include"SimplePolygonSymbol.h"
#include"ValueMapRenderer.h"
//#include"RangeMapRenderer.h"
#include"SimpleRenderer.h"
#include"TrueTypeMarkerSymbol.h"
#include "clsUtil.h"
#include "clsXML.h"
#include "clsPtree.h"
namespace DmapCore_30
{
	GroupRenderer::GroupRenderer()
	{
		m_vSymbols = {};
		m_sTag = "";
		m_sXML = "";
		m_simpleRenderer = true;
	}
	GroupRenderer::~GroupRenderer()
	{
		this->Clear();
	}
	bool GroupRenderer::Parse(boost::property_tree::ptree &pt, AppendBuffer *f)
	{
		
		//遍历所有节点
			for (auto ptchild =pt.begin(); ptchild != pt.end(); ++ptchild)
			{
				//所有子节点都是样式
				Renderer* renderer = NULL;
				if (clsXML::XMLParse(ptchild->first, ptchild->second,  &renderer))
				{
					if (renderer)m_vSymbols.push_back(renderer);
				}
			}
			return true;
		

	}

	bool  GroupRenderer::ParsePtree( boost::property_tree::ptree &pt)
	{
		boost::property_tree::ptree ptRenderer;
		int length = (int)m_vSymbols.size();
		for (int i = 0; i < length; i++)
		{
			Renderer* renderer = m_vSymbols[i];
			renderer->ParsePtree(ptRenderer);
		}
		pt.add_child("GROUPRENDERER",ptRenderer);
		return true;
	}

	void  GroupRenderer::ToJson(AppendBuffer *ab)
	{

		//strcat(resultbuff,R"("GROUPRENDERER":[)");
		ab->AppendString(R"("GROUPRENDERER":[)");
		int length = (int)m_vSymbols.size();
		for (int i = 0; i < length; i++)
		{
			if(i>0){
				ab->AppendString(",");
			} 
			//	strcat(resultbuff,",");
			Renderer* renderer = m_vSymbols[i];
			renderer->ToJson(ab);
		}
		ab->AppendString("]");
		//strcat(resultbuff,"]");
		

	}



	GroupRenderer* GroupRenderer::CreateNew()
	{
		GroupRenderer* dest = new GroupRenderer();
		return dest;
	}
	int GroupRenderer::RendererType()
	{
		return dmapGroupRenderer;
	}

	const char* GroupRenderer::GetTag()
	{
		return m_sTag.c_str();
	}
	bool  GroupRenderer::SetTag(const char* sTag)
	{
		if (!sTag)
			return false;
		m_sTag = sTag;
		return true;
	}
	bool  GroupRenderer::AddSymbol(int index, Renderer* pRenderer)
	{
		int length__ = m_vSymbols.size();
		if (index > length__)return false;
		pRenderer->AddRef();
		if (index < 0 || index == length__)
			m_vSymbols.push_back(pRenderer);
		else
			m_vSymbols.insert(m_vSymbols.begin() + index, pRenderer);
		return true;
	}
	bool  GroupRenderer::Remove(int index)
	{
		RemoveIndexP(index, m_vSymbols);
	}
	Renderer* GroupRenderer::GetItem(int index)
	{
		GetIndexP(index, m_vSymbols);
	}
	bool  GroupRenderer::SetItem(int index, Renderer* pRenderer)
	{
		SetIndexP(index, pRenderer, m_vSymbols);
	}
	int   GroupRenderer::GetSymbolCount()
	{
		int length = (int)m_vSymbols.size();
		return length;

	}
	bool  GroupRenderer::Clear()
	{
		ClearP(m_vSymbols);
	}

	//bool GroupRenderer::DrawSimpleData(clsCrSurf* pClsCS, DataCollection* data, char* pFlag)
	//{
	//	int length = (int)(m_vSymbols.size());

	//	for (int i = 0; i < length; i++)
	//	{
	//		Renderer* renderer = m_vSymbols[i];
	//		if (renderer->m_simpleRenderer)
	//		{
	//			int renType = renderer->RendererType();
	//			renderer->DrawData(pClsCS, data, pFlag);
	//		}
	//	}
	//	return true;
	//}


	bool GroupRenderer::DrawData(clsCrSurf* pClsCS, DataCollection* data, bool drawSimpleData, char* pFlag)
	{
		int length = (int)(m_vSymbols.size());

		for (int i = 0; i < length; i++)
		{
			Renderer* renderer = m_vSymbols[i];
			//if (renderer->m_simpleRenderer == drawSimpleData)
			{
				int renType = renderer->RendererType();
				renderer->DrawData(pClsCS, data,true, pFlag);
			}
		}
		return true;
	}
	bool GroupRenderer::DrawData(clsCrSurf* pClsCS, DataCollection* data, int dataIndex, char* pFlag)
	{
		int length = (int)(m_vSymbols.size());
		for (int i = 0; i < length; i++)
		{
			Renderer* renderer = m_vSymbols[i];
			int renType = renderer->RendererType();
			renderer->DrawData(pClsCS, data, dataIndex, pFlag);
		}
		return true;
	}

	 bool GroupRenderer::DrawLegend(clsCrSurf* pClsCS,  shared_ptr<legendParamater> pLegendParamater,  int layerType,char* pFlag = NULL) 
	 {
		 int length = (int)(m_vSymbols.size());
		for (int i = 0; i < length; i++)
		{
			Renderer* renderer = m_vSymbols[i];
			int renType = renderer->RendererType();
			renderer->DrawLegend(pClsCS, pLegendParamater,layerType, pFlag);
		}
		 return true;
	 }


	void GroupRenderer::TryAddField(vector<string>&pvField)
	{
		int length = (int)(m_vSymbols.size());
		for (int i = 0; i < length; i++)
		{
			if (m_vSymbols[i] == 0)continue;
			m_vSymbols[i]->TryAddField(pvField);
		}
	}

	bool GroupRenderer::TryFindHeatRenderer()
	{
		 int length = (int)(m_vSymbols.size());
		for (int i = 0; i < length; i++)
		{
			Renderer* renderer = m_vSymbols[i];
			if(renderer->TryFindHeatRenderer())
			{
				return true;
			}
		}
		 return false;
	}
}

#endif