#include "stdafx.h" #include "OTSFieldData.h" namespace OTSDATA { // COTSParticle // constructor COTSFieldData::COTSFieldData() // constructor { Init(); } COTSFieldData::COTSFieldData(const COTSFieldData& a_oSource) // copy constructor { // can't copy itself if (&a_oSource == this) { return; } // copy data over Duplicate(a_oSource); } COTSFieldData::COTSFieldData(COTSFieldData* a_poSource) // copy constructor { // can't copy itself if (a_poSource == this) { return; } // copy data over Duplicate(*a_poSource); } COTSFieldData& COTSFieldData::operator=(const COTSFieldData& a_oSource) // =operator { // cleanup Cleanup(); // copy the class data over Duplicate(a_oSource); // return class return *this; } // ==operator BOOL COTSFieldData::operator==(const COTSFieldData& a_oSource) { int nSize = (int)m_listParticles.size(); if (nSize != (int)a_oSource.m_listParticles.size()) { return FALSE; } for (int i = 0; i < (int)nSize; ++i) { if (!(*(m_listParticles[i].get()) == *(a_oSource.m_listParticles[i].get()))) { return FALSE; } } return m_nID == a_oSource.m_nID && m_poiPos == a_oSource.m_poiPos && m_strFieldFileFolder.CompareNoCase(a_oSource.m_strFieldFileFolder); } COTSFieldData::~COTSFieldData() // destructor { Cleanup(); } void COTSFieldData::Serialize(bool isStoring, tinyxml2::XMLDocument * classDoc, tinyxml2::XMLElement * rootNode) { xmls::xInt xnID; xmls::xPoint xpoiPos; xmls::xString xstrFieldFileFolder; xmls::Collection parts; xmls::Slo slo; slo.Register("ID", &xnID); slo.Register("poiPos", &xpoiPos); slo.Register("FieldFileFolder", &xstrFieldFileFolder); slo.Register("Particles", &parts); if (isStoring) { xnID = m_nID; xpoiPos = m_poiPos; xstrFieldFileFolder = m_strFieldFileFolder; parts.Clear(); for (auto pParticle : m_listParticles) { parts.addItem(pParticle.get()); } slo.Serialize(true, classDoc, rootNode); } else { slo.Serialize(false, classDoc, rootNode); m_nID = xnID.value(); m_poiPos = xpoiPos.value(); m_strFieldFileFolder = xstrFieldFileFolder.value().c_str(); m_listParticles.clear(); for (unsigned int i=0; i < parts.size(); i++) { m_listParticles.push_back(COTSParticlePtr(parts.getItem(i))); } } } void COTSFieldData::SetParticleList(COTSParticleList& a_listParticles, BOOL a_bClear) { // clear holes list if necessary if (a_bClear) { m_listParticles.clear(); } // copy the list for (auto pParticle : a_listParticles) { //COTSParticlePtr pParticleNew = COTSParticlePtr(new COTSParticle(*pParticle.get())); //COTSParticlePtr pParticleNew = COTSParticlePtr(pParticle.get()); m_listParticles.push_back(pParticle); } } void COTSFieldData::SetBigParticleList(COTSParticleList& a_listParticles, BOOL a_bClear) { // clear holes list if necessary if (a_bClear) { m_listBigParticles.clear(); } // copy the list for (auto pParticle : a_listParticles) { //COTSParticlePtr pParticleNew = COTSParticlePtr(new COTSParticle(*pParticle.get())); //COTSParticlePtr pParticleNew = COTSParticlePtr(pParticle.get()); m_listBigParticles.push_back(pParticle); } } COTSParticleList COTSFieldData::GetTopBorderedBigParticles() { COTSParticleList parts; for (auto p : m_listBigParticles) { auto segs = p->GetFeature()->GetSegmentsList(); for (auto seg : segs) { if (seg->GetHeight() == 0) { parts.push_back(p); break; } } } return parts; } COTSParticleList COTSFieldData::GetBottomBorderedBigParticles() { COTSParticleList parts; for (auto p : m_listBigParticles) { auto segs = p->GetFeature()->GetSegmentsList(); for (auto seg : segs) { if (seg->GetHeight() == this->Height - 1)//the lowest height is 767(height-1),cause starting from 0. { parts.push_back(p); break; } } } return parts; } COTSParticleList COTSFieldData::GetLeftBorderedBigParticles() { COTSParticleList parts; for (auto p : m_listBigParticles) { auto segs = p->GetFeature()->GetSegmentsList(); for (auto seg : segs) { if (seg->GetStart() == 0) { parts.push_back(p); break; } } } return parts; } COTSParticleList COTSFieldData::GetRightBorderedBigParticles() { COTSParticleList parts; for (auto p : m_listBigParticles) { auto segs = p->GetFeature()->GetSegmentsList(); for (auto seg : segs) { if (seg->GetStart() + seg->GetLength() == this->Width) { parts.push_back(p); break; } } } return parts; } // cleanup void COTSFieldData::Cleanup() { m_listParticles.clear(); } // initialization void COTSFieldData::Init() { // initialization m_nID = -1; m_poiPos = CPoint(0, 0); m_strFieldFileFolder = _T(""); m_listParticles.clear(); } // duplication void COTSFieldData::Duplicate(const COTSFieldData& a_oSource) { // initialization Init(); m_nID = a_oSource.m_nID; m_poiPos = a_oSource.m_poiPos; m_strFieldFileFolder = a_oSource.m_strFieldFileFolder; // copy data over for (auto pParticle : a_oSource.m_listParticles) { COTSParticlePtr pParticleNew = COTSParticlePtr(new COTSParticle(*pParticle.get())); m_listParticles.push_back(pParticleNew); } } }