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.

258 lines
6.3 KiB
C

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