void CModelWriter_3MF_Native::addAttachments(_In_ CModel * pModel, _In_ POpcPackageWriter pPackageWriter, _In_ POpcPackagePart pModelPart)
	{
		__NMRASSERT(pModel != nullptr);
		__NMRASSERT(pModelPart.get() != nullptr);
		__NMRASSERT(pPackageWriter.get() != nullptr);

		nfUint32 nCount = pModel->getAttachmentCount();
		nfUint32 nIndex;

		if (nCount > 0) {
			for (nIndex = 0; nIndex < nCount; nIndex++) {
				PModelAttachment pAttachment = pModel->getModelAttachment(nIndex);
				PImportStream pStream = pAttachment->getStream();
				
				std::wstring sPath = fnIncludeLeadingPathDelimiter(pAttachment->getPathURI());
				std::wstring sRelationShipType = pAttachment->getRelationShipType();

				if (pStream.get() == nullptr)
					throw CNMRException(NMR_ERROR_INVALIDPARAM);

				// create Texture Part
				POpcPackagePart pAttachmentPart = pPackageWriter->addPart(sPath);
				PExportStream pExportStream = pAttachmentPart->getExportStream();

				// Copy data
				pStream->seekPosition(0, true);
				pExportStream->copyFrom(pStream.get(), pStream->retrieveSize(), MODELWRITER_NATIVE_BUFFERSIZE);

				// add relationships
				pModelPart->addRelationship(generateRelationShipID(), sRelationShipType.c_str(), pAttachmentPart->getURI());
			}
		}
	}
	void CModelWriter_3MF_Native::addTextureParts(_In_ CModel * pModel, _In_ POpcPackageWriter pPackageWriter, _In_ POpcPackagePart pModelPart)
	{
		__NMRASSERT(pModel != nullptr);
		__NMRASSERT(pModelPart.get() != nullptr);
		__NMRASSERT(pPackageWriter.get() != nullptr);

		nfUint32 nCount = pModel->getTextureStreamCount();
		nfUint32 nIndex;

		if (nCount > 0) {


			for (nIndex = 0; nIndex < nCount; nIndex++) {
				PImportStream pStream = pModel->getTextureStream(nIndex);
				std::wstring sPath = fnIncludeLeadingPathDelimiter (pModel->getTextureStreamPath(nIndex));

				if (pStream.get() == nullptr)
					throw CNMRException(NMR_ERROR_INVALIDPARAM);

				// create Texture Part
				POpcPackagePart pTexturePart = pPackageWriter->addPart(sPath);
				PExportStream pExportStream = pTexturePart->getExportStream();

				// Copy data
				pStream->seekPosition(0, true);
				pExportStream->copyFrom(pStream.get(), pStream->retrieveSize(), MODELWRITER_NATIVE_BUFFERSIZE);

				// add relationships
				pModelPart->addRelationship(generateRelationShipID(), PACKAGE_TEXTURE_RELATIONSHIP_TYPE, pTexturePart.get());

			}
		}
	}
void COpcPackageRelationship::writeToXML(_In_ CXmlWriter * pXMLWriter)
{
    if (pXMLWriter == nullptr)
        throw CNMRException(NMR_ERROR_INVALIDPARAM);

    std::wstring sTarget = fnIncludeLeadingPathDelimiter(m_sTargetPartURI);

    pXMLWriter->WriteStartElement(nullptr, L"Relationship", nullptr);
    pXMLWriter->WriteAttributeString(nullptr, L"Type", nullptr, m_sType.c_str());
    pXMLWriter->WriteAttributeString(nullptr, L"Target", nullptr, sTarget.c_str());
    pXMLWriter->WriteAttributeString(nullptr, L"Id", nullptr, m_sID.c_str());
    pXMLWriter->WriteEndElement();
}
	void COpcPackageRelationship::writeToXML(_In_ CXmlWriter * pXMLWriter)
	{
		if (pXMLWriter == nullptr)
			throw CNMRException(NMR_ERROR_INVALIDPARAM);

		std::wstring sTarget = fnIncludeLeadingPathDelimiter(m_sTargetPartURI);

		pXMLWriter->WriteStartElement(nullptr, OPC_RELS_RELATIONSHIP_NODE, nullptr);
		pXMLWriter->WriteAttributeString(nullptr, OPC_RELS_ATTRIB_TYPE, nullptr, m_sType.c_str());
		pXMLWriter->WriteAttributeString(nullptr, OPC_RELS_ATTRIB_TARGET, nullptr, sTarget.c_str());
		pXMLWriter->WriteAttributeString(nullptr, OPC_RELS_ATTRIB_ID, nullptr, m_sID.c_str());
		pXMLWriter->WriteEndElement();
	}