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++
258 lines
6.3 KiB
C++
#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:
|
|
/**
|
|
* ÐòÁл¯Êý×ÖÊý×é
|
|
*
|
|
* \param items
|
|
*/
|
|
template <typename T>
|
|
void serialize(std::vector<T>& items)
|
|
{
|
|
// дÈëÊý×鳤¶È
|
|
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;
|
|
// Ϊʲô¶àÒ»´ÎдÈë CMemFile ²Ù×÷¶ø²»Ö±½ÓдÈë m_archive ¶ÔÏó? ÎÒÃÇÏë»ñÈ¡¶þ½øÖÆÄÚÈݵij¤¶È£¬ÆäËüµØ·½Í¬Àí
|
|
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();
|
|
}
|
|
|
|
/**
|
|
* ·´ÐòÁл¯Êý×ÖÊý×é
|
|
*
|
|
* \return
|
|
*/
|
|
template <typename T>
|
|
void deserialize(std::vector<T> &items)
|
|
{
|
|
items.clear();
|
|
|
|
// ¶ÁÈ¡Êý×鳤¶È
|
|
uint64_t count = 0;
|
|
m_archive >> count;
|
|
|
|
items.resize(count);
|
|
for (size_t i = 0; i < items.size(); i++)
|
|
{
|
|
m_archive >> items[i];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ÐòÁл¯ COne Áбí
|
|
*
|
|
* \param ptrList
|
|
* \param owned ÊÇ·ñ³ÖÓÐ COne ¶ÔÏó£¬Èç¹û³ÖÓУ¬ÔòÍêÈ«ÐòÁл¯£¬·ñÔòÖ»´æ´¢ id
|
|
*/
|
|
void serializeCOnes(CPtrList& ptrList, bool owned = false);
|
|
|
|
/**
|
|
* ·´ÐòÁл¯ COne Áбí
|
|
*
|
|
* \param ptrList ³ö²Î£¬COne »á×·¼Óµ½¸ÃÁбíÖУ¬×¢Ò⣬²¢²»»áÇå¿Õ ptrList
|
|
* \param owned ÊÇ·ñ³ÖÓÐ COne ¶ÔÏó£¬Èç¹û³ÖÓУ¬ÔòÍêÈ«ÐòÁл¯£¬Í¨¹ý id ÔÙÈ¥Äà CXy ¶ÔÏóÀïÃæµÄÖ¸Õë
|
|
*/
|
|
void deserializeCOnes(CXy *pXy, CPtrList &ptrList, bool owned = false);
|
|
|
|
/**
|
|
* ÐòÁл¯ COne
|
|
*
|
|
* \param pOne
|
|
*/
|
|
void serializeCOne(COne* pOne, bool owned = false);
|
|
|
|
/**
|
|
* ·´ÐòÁл¯ 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);
|
|
|
|
/**
|
|
* ÐòÁл¯ Action »ùÀà
|
|
*
|
|
* \param action
|
|
*/
|
|
void serializeCAction(CAction& action);
|
|
|
|
/**
|
|
* ·´ÐòÁл¯ Action »ùÀà
|
|
*/
|
|
void deserializeCAction(CAction& action);
|
|
|
|
/**
|
|
* ÐòÁл¯»ù´¡µÄ CActionItem
|
|
*
|
|
* \param item
|
|
*/
|
|
void serializeCActionItem(CActionItem& item);
|
|
|
|
/**
|
|
* ·´ÐòÁл¯»ù´¡µÄ 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;
|
|
|
|
/**
|
|
* »Ö¸´ parentClass
|
|
*
|
|
* \param pXy
|
|
* \param pLayer
|
|
*/
|
|
void assignParentClass(CXy* pXy, CLayer* pLayer);
|
|
|
|
CArchive &m_archive;
|
|
};
|
|
|
|
/**
|
|
*
|
|
*/
|
|
std::vector<char> SerializeAction(const CAction* action);
|
|
|
|
/**
|
|
* ´´½¨¾ßÌåµÄ×ÓÀà¶ÔÏó
|
|
*
|
|
* \return
|
|
*/
|
|
CAction* DeserializeAction(CSigmaDoc *pDoc, const std::vector<char>& data);
|