for binary vsdx

This commit is contained in:
ElenaSubbotina
2025-05-29 18:14:31 +03:00
parent 14df0d2b58
commit bed33af917
6 changed files with 306 additions and 7 deletions

View File

@ -120,6 +120,10 @@ namespace PPTX
{
variationClrSchemeLst = nodeExt.ReadNodeNoNS(L"variationClrSchemeLst");
}
else if (uri == L"{2703A3B3-D2E1-43D9-8057-6E9D74E0F44A}")
{
schemeID = nodeExt.ReadNodeNoNS(L"schemeID");
}
}
}
}
@ -140,6 +144,14 @@ namespace PPTX
{
oValue.m_strValue += L"<a:extLst>";
if (schemeID.IsInit())
{
schemeID->bSchemas = true;
oValue.m_strValue += L"<a:ext uri=\"{2703A3B3-D2E1-43D9-8057-6E9D74E0F44A}\">";
oValue.Write(*schemeID);
oValue.m_strValue += L"</a:ext>";
}
if (bkgnd.IsInit())
{
oValue.m_strValue += L"<a:ext uri=\"{093E89EA-6996-430E-BFF9-83A9FAAAAB73}\">";
@ -182,15 +194,25 @@ namespace PPTX
pWriter->EndNode(_T("a:") + arr[i]);
}
}
if (bkgnd.IsInit() || variationClrSchemeLst.IsInit())
if (bkgnd.IsInit() || variationClrSchemeLst.IsInit() || schemeID.IsInit())
{
pWriter->StartNode(L"a:extLst");
pWriter->EndAttributes();
if (schemeID.IsInit())
{
schemeID->bSchemas = true;
pWriter->StartNode(L"a:ext");
pWriter->WriteAttribute(L"uri", L"{2703A3B3-D2E1-43D9-8057-6E9D74E0F44A}");
pWriter->EndAttributes();
schemeID->toXmlWriter(pWriter);
pWriter->EndNode(L"a:ext");
}
if (bkgnd.IsInit())
{
pWriter->StartNode(L"a:ext");
pWriter->WriteAttribute(L"uri", L"{2703A3B3-D2E1-43D9-8057-6E9D74E0F44A}");
pWriter->WriteAttribute(L"uri", L"{093E89EA-6996-430E-BFF9-83A9FAAAAB73}");
pWriter->EndAttributes();
bkgnd->toXmlWriter(pWriter);
pWriter->EndNode(L"a:ext");
@ -257,6 +279,7 @@ namespace PPTX
}
pWriter->WriteRecord2(20, bkgnd);
pWriter->WriteRecord2(21, variationClrSchemeLst);
pWriter->WriteRecord2(22, schemeID);
}
void ClrScheme::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
@ -287,6 +310,11 @@ namespace PPTX
variationClrSchemeLst.Init();
variationClrSchemeLst->fromPPTY(pReader);
}
else if (_rec == 22)
{
schemeID.Init();
schemeID->fromPPTY(pReader);
}
else if (pReader->GetPos() + 4 < _e)
{
Logic::UniColor color;
@ -314,6 +342,7 @@ namespace PPTX
}
bkgnd = oSrc.bkgnd;
variationClrSchemeLst = oSrc.variationClrSchemeLst;
schemeID = oSrc.schemeID;
return *this;
}
@ -404,6 +433,7 @@ namespace PPTX
}
if (bkgnd.IsInit()) bkgnd->SetParentPointer(this);
if (variationClrSchemeLst.IsInit()) variationClrSchemeLst->SetParentPointer(this);
if (schemeID.IsInit()) schemeID->SetParentPointer(this);
}
} // namespace nsTheme
} // namespace PPTX

View File

@ -63,6 +63,7 @@ namespace PPTX
//visio ext
nullable<Bkgnd> bkgnd;
nullable<VariationClrSchemeLst> variationClrSchemeLst;
nullable<SchemeID> schemeID;
ClrScheme& operator=(const ClrScheme& oSrc);

View File

@ -71,15 +71,15 @@ namespace PPTX
}
else if (uri == L"{D75FF423-9257-4291-A4FE-1B2448832E17}")
{
//themeScheme - schemeID
themeScheme = nodeExt.ReadNodeNoNS(L"themeScheme");
}
else if (uri == L"{27CD58D4-7086-4B73-B2AB-7AEBE2148A8C}")
{
//fmtSchemeEx - schemeID
fmtSchemeEx = nodeExt.ReadNodeNoNS(L"fmtSchemeEx");
}
else if (uri == L"{C6430689-8E98-42EC-ADBF-087148533A3F}")
{
//fmtConnectorSchemeEx - schemeID
fmtConnectorSchemeEx = nodeExt.ReadNodeNoNS(L"fmtConnectorSchemeEx"); //- schemeID
}
else if (uri == L"{56243398-1771-4C39-BF73-A5702A9C147F}")
{
@ -122,6 +122,27 @@ namespace PPTX
oValue.Write(*fmtConnectorScheme);
oValue.m_strValue += L"</a:ext>";
}
if (themeScheme.IsInit())
{
themeScheme->node_name = L"vt:themeScheme";
oValue.m_strValue += L"<a:ext uri=\"{D75FF423-9257-4291-A4FE-1B2448832E17}\">";
oValue.Write(*themeScheme);
oValue.m_strValue += L"</a:ext>";
}
if (fmtSchemeEx.IsInit())
{
fmtSchemeEx->node_name = L"vt:fmtSchemeEx";
oValue.m_strValue += L"<a:ext uri=\"{27CD58D4-7086-4B73-B2AB-7AEBE2148A8C}\">";
oValue.Write(*fmtSchemeEx);
oValue.m_strValue += L"</a:ext>";
}
if (fmtConnectorSchemeEx.IsInit())
{
fmtConnectorSchemeEx->node_name = L"vt:fmtConnectorSchemeEx";
oValue.m_strValue += L"<a:ext uri=\"{C6430689-8E98-42EC-ADBF-087148533A3F}\">";
oValue.Write(*fmtConnectorSchemeEx);
oValue.m_strValue += L"</a:ext>";
}
if (fillStyles.IsInit())
{
oValue.m_strValue += L"<a:ext uri=\"{56243398-1771-4C39-BF73-A5702A9C147F}\">";
@ -160,6 +181,9 @@ namespace PPTX
pWriter->WriteRecord2(5, lineStyles);
pWriter->WriteRecord2(6, fontStylesGroup);
pWriter->WriteRecord2(7, variationStyleSchemeLst);
pWriter->WriteRecord2(8, themeScheme);
pWriter->WriteRecord2(9, fmtSchemeEx);
pWriter->WriteRecord2(10, fmtConnectorSchemeEx);
}
void ThemeElements::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
{
@ -170,7 +194,8 @@ namespace PPTX
fontScheme.toXmlWriter(pWriter);
fmtScheme.toXmlWriter(pWriter);
if (fmtConnectorScheme.IsInit() || fillStyles.IsInit() || lineStyles.IsInit() || fontStylesGroup.IsInit() || variationStyleSchemeLst.IsInit())
if (fmtConnectorScheme.IsInit() || fillStyles.IsInit() || lineStyles.IsInit() || fontStylesGroup.IsInit() || variationStyleSchemeLst.IsInit() ||
themeScheme.IsInit() || fmtSchemeEx.IsInit() || fmtConnectorSchemeEx.IsInit())
{
pWriter->StartNode(L"a:extLst");
pWriter->EndAttributes();
@ -183,6 +208,33 @@ namespace PPTX
fmtConnectorScheme->toXmlWriter(pWriter);
pWriter->EndNode(L"a:ext");
}
if (themeScheme.IsInit())
{
themeScheme->node_name = L"vt:themeScheme";
pWriter->StartNode(L"a:ext");
pWriter->WriteAttribute(L"uri", L"{D75FF423-9257-4291-A4FE-1B2448832E17}");
pWriter->EndAttributes();
themeScheme->toXmlWriter(pWriter);
pWriter->EndNode(L"a:ext");
}
if (fmtSchemeEx.IsInit())
{
fmtSchemeEx->node_name = L"vt:fmtSchemeEx";
pWriter->StartNode(L"a:ext");
pWriter->WriteAttribute(L"uri", L"{27CD58D4-7086-4B73-B2AB-7AEBE2148A8C}");
pWriter->EndAttributes();
fmtSchemeEx->toXmlWriter(pWriter);
pWriter->EndNode(L"a:ext");
}
if (fmtConnectorSchemeEx.IsInit())
{
fmtConnectorSchemeEx->node_name = L"vt:fmtConnectorSchemeEx";
pWriter->StartNode(L"a:ext");
pWriter->WriteAttribute(L"uri", L"{C6430689-8E98-42EC-ADBF-087148533A3F}");
pWriter->EndAttributes();
fmtConnectorSchemeEx->toXmlWriter(pWriter);
pWriter->EndNode(L"a:ext");
}
if (fillStyles.IsInit())
{
pWriter->StartNode(L"a:ext");
@ -266,6 +318,21 @@ namespace PPTX
variationStyleSchemeLst.Init();
variationStyleSchemeLst->fromPPTY(pReader);
}break;
case 8:
{
themeScheme.Init();
themeScheme->fromPPTY(pReader);
}break;
case 9:
{
fmtSchemeEx.Init();
fmtSchemeEx->fromPPTY(pReader);
}break;
case 10:
{
fmtConnectorSchemeEx.Init();
fmtConnectorSchemeEx->fromPPTY(pReader);
}break;
default:
break;
}
@ -284,6 +351,9 @@ namespace PPTX
if (lineStyles.IsInit()) lineStyles->SetParentPointer(this);
if (fontStylesGroup.IsInit()) fontStylesGroup->SetParentPointer(this);
if (variationStyleSchemeLst.IsInit()) variationStyleSchemeLst->SetParentPointer(this);
if (themeScheme.IsInit()) themeScheme->SetParentPointer(this);
if (fmtSchemeEx.IsInit()) fmtSchemeEx->SetParentPointer(this);
if (fmtConnectorSchemeEx.IsInit()) fmtConnectorSchemeEx->SetParentPointer(this);
}
} // namespace nsTheme
} // namespace PPTX

View File

@ -61,6 +61,9 @@ namespace PPTX
nullable<LineStyles> lineStyles;
nullable<FontStylesGroup> fontStylesGroup;
nullable<VariationStyleSchemeLst> variationStyleSchemeLst;
nullable<Scheme> themeScheme;
nullable<Scheme> fmtSchemeEx;
nullable<Scheme> fmtConnectorSchemeEx;
protected:
virtual void FillParentPointersForChilds();

View File

@ -1408,5 +1408,162 @@ namespace PPTX
}
pReader->Seek(_end_rec);
}
//-----------------------------------------------------------------------------------------
SchemeID& SchemeID::operator=(const SchemeID& oSrc)
{
parentFile = oSrc.parentFile;
parentElement = oSrc.parentElement;
schemeEnum = oSrc.schemeEnum;
schemeGUID = oSrc.schemeGUID;
return *this;
}
void SchemeID::fromXML(XmlUtils::CXmlNode& node)
{
XmlMacroReadAttributeBase(node, L"schemeEnum", schemeEnum);
XmlMacroReadAttributeBase(node, L"schemeGUID", schemeGUID);
}
std::wstring SchemeID::toXML() const
{
XmlUtils::CAttribute oAttr;
if (bSchemas)
{
oAttr.Write(L"xmlns:vt", L"http://schemas.microsoft.com/office/visio/2012/theme");
}
oAttr.Write(L"schemeEnum", schemeEnum);
oAttr.Write(L"schemeGUID", schemeGUID);
XmlUtils::CNodeValue oValue;
return XmlUtils::CreateNode(L"vt:schemeID", oAttr, oValue);
}
void SchemeID::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
{
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
pWriter->WriteUInt2(0, schemeEnum);
pWriter->WriteString2(1, schemeGUID);
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
}
void SchemeID::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
{
pWriter->StartNode(L"vt:schemeID");
if (bSchemas)
{
pWriter->WriteAttribute(L"xmlns:vt", L"http://schemas.microsoft.com/office/visio/2012/theme");
}
pWriter->WriteAttribute2(L"schemeEnum", schemeEnum);
pWriter->WriteAttribute2(L"schemeGUID", schemeGUID);
pWriter->EndAttributes();
pWriter->EndNode(L"vt:schemeID");
}
void SchemeID::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
pReader->Skip(1); // start attributes
while (true)
{
BYTE _at = pReader->GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
switch (_at)
{
case 0:
{
schemeEnum = pReader->GetULong();
}break;
case 1:
{
schemeGUID = pReader->GetString2();
}break;
default:
break;
}
}
pReader->Seek(_end_rec);
}
//-----------------------------------------------------------------------------------------
Scheme& Scheme::operator=(const Scheme& oSrc)
{
parentFile = oSrc.parentFile;
parentElement = oSrc.parentElement;
node_name = oSrc.node_name;
schemeID = oSrc.schemeID;
return *this;
}
void Scheme::fromXML(XmlUtils::CXmlNode& node)
{
node_name = node.GetName();
std::vector<XmlUtils::CXmlNode> oNodes;
if (node.GetNodes(L"*", oNodes))
{
for (size_t i = 0; i < oNodes.size(); ++i)
{
XmlUtils::CXmlNode& oNode = oNodes[i];
std::wstring strName = XmlUtils::GetNameNoNS(oNode.GetName());
if (L"schemeID" == strName)
{
schemeID = oNode;
}
}
}
FillParentPointersForChilds();
}
std::wstring Scheme::toXML() const
{
XmlUtils::CAttribute oAttr;
oAttr.Write(L"xmlns:vt", L"http://schemas.microsoft.com/office/visio/2012/theme");
XmlUtils::CNodeValue oValue;
oValue.WriteNullable(schemeID);
return XmlUtils::CreateNode(node_name, oAttr, oValue);
}
void Scheme::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
{
pWriter->WriteRecord2(0, schemeID);
}
void Scheme::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
{
pWriter->StartNode(node_name);
pWriter->WriteAttribute(L"xmlns:vt", L"http://schemas.microsoft.com/office/visio/2012/theme");
pWriter->EndAttributes();
pWriter->Write(schemeID);
pWriter->EndNode(node_name);
}
void Scheme::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
while (pReader->GetPos() < _end_rec)
{
BYTE _at = pReader->GetUChar();
switch (_at)
{
case 0:
{
schemeID.Init();
schemeID->fromPPTY(pReader);
}break;
default:
break;
}
}
pReader->Seek(_end_rec);
}
void Scheme::FillParentPointersForChilds()
{
if (schemeID.IsInit())
schemeID->SetParentPointer(this);
}
} // namespace nsTheme
} // namespace PPTX

View File

@ -37,7 +37,45 @@
namespace PPTX
{
namespace nsTheme
{
{
class SchemeID : public WrapperWritingElement
{
public:
PPTX_LOGIC_BASE(SchemeID)
SchemeID& operator=(const SchemeID& oSrc);
virtual void fromXML(XmlUtils::CXmlNode& node);
virtual std::wstring toXML() const;
virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const;
virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const;
virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader);
nullable_uint schemeEnum;
nullable_string schemeGUID;
bool bSchemas = false;
};
class Scheme : public WrapperWritingElement
{
public:
PPTX_LOGIC_BASE(Scheme)
Scheme& operator=(const Scheme& oSrc);
virtual void fromXML(XmlUtils::CXmlNode& node);
virtual std::wstring toXML() const;
virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const;
virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const;
virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader);
std::wstring node_name;
nullable<SchemeID> schemeID;
protected:
virtual void FillParentPointersForChilds();
};
class LineEx : public WrapperWritingElement
{
public: