|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include "Visitor.h"
|
|
|
|
|
|
|
|
|
|
|
|
class BlobSerializer : public CActionVisitor
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
explicit BlobSerializer(CArchive &archive);
|
|
|
|
|
|
|
|
|
|
|
|
void visit(CActionAddItem& item) override;
|
|
|
|
|
|
void visit(CActionBackupItem& item) override;
|
|
|
|
|
|
void visit(CActionBackupProjectionItem& item) override;
|
|
|
|
|
|
void visit(CActionBackupXYItem& item) override;
|
|
|
|
|
|
void visit(CActionChangeColorItem& item) override;
|
|
|
|
|
|
void visit(CActionChangeLayerItem& item) override;
|
|
|
|
|
|
void visit(CActionChangeNameItem& item) override;
|
|
|
|
|
|
void visit(CActionComboItem& item) override;
|
|
|
|
|
|
void visit(CActionCurveEdit& item) override;
|
|
|
|
|
|
void visit(CActionCurveEditAddPoint& item) override;
|
|
|
|
|
|
void visit(CActionCurveEditDeletePoint& item) override;
|
|
|
|
|
|
void visit(CActionCurveReversalItem& item) override;
|
|
|
|
|
|
void visit(CActionCutOutItem& item) override;
|
|
|
|
|
|
void visit(CActionDeleteItem& item) override;
|
|
|
|
|
|
void visit(CActionEmbellishItem& item) override;
|
|
|
|
|
|
void visit(CActionExchangeXYItem& item) override;
|
|
|
|
|
|
void visit(CActionLayerAddItem& item) override;
|
|
|
|
|
|
void visit(CActionLayerDeleteItem& item) override;
|
|
|
|
|
|
void visit(CActionLayerDragDropItem& item) override;
|
|
|
|
|
|
void visit(CActionLayerRenameItem& item) override;
|
|
|
|
|
|
void visit(CActionListItem & item) override;
|
|
|
|
|
|
void visit(CActionMarkDeleteItem& item) override;
|
|
|
|
|
|
void visit(CActionMirrorItem& item) override;
|
|
|
|
|
|
void visit(CActionModifiedItem& item) override;
|
|
|
|
|
|
void visit(CActionModifiedMeshItem& item) override;
|
|
|
|
|
|
void visit(CActionModifiedMesh& item) override;
|
|
|
|
|
|
void visit(CActionMoveItem& item) override;
|
|
|
|
|
|
void visit(CActionOffsetItem& item) override;
|
|
|
|
|
|
void visit(CActionParamReplaceItem& item) override;
|
|
|
|
|
|
void visit(CActionReplaceColorItem& item) override;
|
|
|
|
|
|
void visit(CActionReplaceNameItem& item) override;
|
|
|
|
|
|
void visit(CActionReverseZItem& item) override;
|
|
|
|
|
|
void visit(CActionScaleProperty& item) override;
|
|
|
|
|
|
void visit(CActionSortItem& item) override;
|
|
|
|
|
|
void visit(CAtionBackupEditCurveInName& item) override;
|
|
|
|
|
|
void visit(CActionProjectionItem& item) override;
|
|
|
|
|
|
void visit(CActionRotationItem& item) override;
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param items
|
|
|
|
|
|
*/
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
|
void serialize(std::vector<T>& items)
|
|
|
|
|
|
{
|
|
|
|
|
|
// д<><D0B4><EFBFBD><EFBFBD><EFBFBD>鳤<EFBFBD><E9B3A4>
|
|
|
|
|
|
m_archive << static_cast<uint64_t>(items.size());
|
|
|
|
|
|
|
|
|
|
|
|
for (T item : items)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_archive << item;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
|
void serializeElement(T* element)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (element == nullptr)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_archive << uint64_t(0);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CMemFile memFile;
|
|
|
|
|
|
// Ϊʲô<CAB2><C3B4>һ<EFBFBD><D2BB>д<EFBFBD><D0B4> CMemFile <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>д<EFBFBD><D0B4> m_archive <20><><EFBFBD><EFBFBD>? <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵij<DDB5><C4B3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD>ͬ<EFBFBD><CDAC>
|
|
|
|
|
|
CArchive ar(&memFile, CArchive::store);
|
|
|
|
|
|
element->Serialize(ar, 2022);
|
|
|
|
|
|
ar.Close();
|
|
|
|
|
|
|
|
|
|
|
|
uint64_t count = memFile.GetLength();
|
|
|
|
|
|
m_archive << count;
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<BYTE> buffer(count);
|
|
|
|
|
|
memFile.SeekToBegin();
|
|
|
|
|
|
memFile.Read(buffer.data(), static_cast<UINT>(count));
|
|
|
|
|
|
|
|
|
|
|
|
m_archive.Write(buffer.data(), static_cast<UINT>(count));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
|
void deserializeElement(T*& element)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint64_t count = 0;
|
|
|
|
|
|
m_archive >> count;
|
|
|
|
|
|
|
|
|
|
|
|
if (count == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
element = nullptr;
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<BYTE> buffer(count);
|
|
|
|
|
|
m_archive.Read(buffer.data(), static_cast<UINT>(count));
|
|
|
|
|
|
|
|
|
|
|
|
CMemFile memFile(buffer.data(), static_cast<UINT>(count));
|
|
|
|
|
|
CArchive ar(&memFile, CArchive::load);
|
|
|
|
|
|
element = new T();
|
|
|
|
|
|
element->Serialize(ar, 2022);
|
|
|
|
|
|
ar.Close();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* \return
|
|
|
|
|
|
*/
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
|
void deserialize(std::vector<T> &items)
|
|
|
|
|
|
{
|
|
|
|
|
|
items.clear();
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>鳤<EFBFBD><E9B3A4>
|
|
|
|
|
|
uint64_t count = 0;
|
|
|
|
|
|
m_archive >> count;
|
|
|
|
|
|
|
|
|
|
|
|
items.resize(count);
|
|
|
|
|
|
for (size_t i = 0; i < items.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_archive >> items[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>л<EFBFBD> COne <EFBFBD>б<EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param ptrList
|
|
|
|
|
|
* \param owned <EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> COne <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>洢 id
|
|
|
|
|
|
*/
|
|
|
|
|
|
void serializeCOnes(CPtrList& ptrList, bool owned = false);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD> COne <EFBFBD>б<EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param ptrList <EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD>COne <EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD>У<EFBFBD>ע<EFBFBD>⣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ptrList
|
|
|
|
|
|
* \param owned <EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> COne <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD> id <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> CXy <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
void deserializeCOnes(CXy *pXy, CPtrList &ptrList, bool owned = false);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>л<EFBFBD> COne
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param pOne
|
|
|
|
|
|
*/
|
|
|
|
|
|
void serializeCOne(COne* pOne, bool owned = false);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD> COne
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param pOne
|
|
|
|
|
|
*/
|
|
|
|
|
|
void deserializeCOne(CXy* pxy, COne*& pOne, bool owned = false);
|
|
|
|
|
|
|
|
|
|
|
|
void serializeOwnedCOne(COne* pOne);
|
|
|
|
|
|
|
|
|
|
|
|
void deserializeOwnedCOne(CXy* pXy, COne*& pOne);
|
|
|
|
|
|
|
|
|
|
|
|
void serializeUnownedCOne(COne* pOne);
|
|
|
|
|
|
|
|
|
|
|
|
void deserializeUnownedCOne(CXy* pXy, COne*& pOne);
|
|
|
|
|
|
|
|
|
|
|
|
void serializeCLayer(CLayer* pLayer);
|
|
|
|
|
|
|
|
|
|
|
|
void deserializeCLayer(CLayer*& pLayer);
|
|
|
|
|
|
|
|
|
|
|
|
void serializeHowToViewCurve(CHowToViewCurve* viewCurve);
|
|
|
|
|
|
|
|
|
|
|
|
void deserializeHowToViewCurve(CHowToViewCurve*& viewCurve);
|
|
|
|
|
|
|
|
|
|
|
|
void serializeHowToViewPoint(CHowToViewPoint* viewCurve);
|
|
|
|
|
|
|
|
|
|
|
|
void deserializeHowToViewPoint(CHowToViewPoint*& viewCurve);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>л<EFBFBD> Action <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param action
|
|
|
|
|
|
*/
|
|
|
|
|
|
void serializeCAction(CAction& action);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD> Action <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
void deserializeCAction(CAction& action);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CActionItem
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param item
|
|
|
|
|
|
*/
|
|
|
|
|
|
void serializeCActionItem(CActionItem& item);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CActionItem
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param item
|
|
|
|
|
|
*/
|
|
|
|
|
|
void deserializeCActionItem(CActionItem& item);
|
|
|
|
|
|
|
|
|
|
|
|
void serializeCXy(CXy* pXy);
|
|
|
|
|
|
|
|
|
|
|
|
void deserializeCXy(CXy*& pXy);
|
|
|
|
|
|
|
|
|
|
|
|
void serializeDfPoint(dfPoint& point);
|
|
|
|
|
|
void deserializeDfPoint(dfPoint& point);
|
|
|
|
|
|
|
|
|
|
|
|
void serializeStdString(std::string& str);
|
|
|
|
|
|
|
|
|
|
|
|
void deserializeStdString(std::string& str);
|
|
|
|
|
|
|
|
|
|
|
|
void idsToPositions(CXy *pXy, const std::vector<int64_t>& ids, CPositionList& posList) const;
|
|
|
|
|
|
std::vector<int64_t> positionsToIds(CXy *pXy, const CPositionList& positions) const;
|
|
|
|
|
|
|
|
|
|
|
|
int64_t getIdByPosition(CXy* pXy, POSITION pos) const;
|
|
|
|
|
|
|
|
|
|
|
|
int64_t getIdFromArchive();
|
|
|
|
|
|
uint64_t getCountFromArchive();
|
|
|
|
|
|
|
|
|
|
|
|
COne* lookupCOneById(CXy* pXy, int64_t id) const;
|
|
|
|
|
|
std::vector<COne*> lookupCOneByIds(CXy* pXy, const std::vector<int64_t>& id) const;
|
|
|
|
|
|
|
|
|
|
|
|
CLayer* lookupCLayerByPath(CXy* pXy, const CString& layerPath) const;
|
|
|
|
|
|
std::vector<CLayer*> flatmapCLayer(CXy* pXy) const;
|
|
|
|
|
|
void addLayersFromList(CLayerList* pLayerList, std::vector<CLayer*>& result) const;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD>ָ<EFBFBD> parentClass
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param pXy
|
|
|
|
|
|
* \param pLayer
|
|
|
|
|
|
*/
|
|
|
|
|
|
void assignParentClass(CXy* pXy, CLayer* pLayer);
|
|
|
|
|
|
|
|
|
|
|
|
CArchive &m_archive;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
*
|
|
|
|
|
|
*/
|
|
|
|
|
|
std::vector<char> SerializeAction(const CAction* action);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* \return
|
|
|
|
|
|
*/
|
|
|
|
|
|
CAction* DeserializeAction(CSigmaDoc *pDoc, const std::vector<char>& data);
|