void CModelWriter_3MF_Native::addSlicerefAttachments(_In_ CModel *pModel) { __NMRASSERT(pModel != nullptr); nfUint32 nCount = pModel->getSliceStackCount(); if (nCount > 0) { nfUint32 nIndex; for (nIndex = 0; nIndex < nCount; nIndex++) { CModelSliceStackResource* pSliceStackResource = dynamic_cast<CModelSliceStackResource*>(pModel->getSliceStackResource(nIndex).get()); CSliceStack* pSliceStack = pSliceStackResource->getSliceStack().get(); if (pSliceStack->usesSliceRef()) { PExportStreamMemory p = std::make_shared<CExportStreamMemory>(); PXmlWriter_Native pXMLWriter = std::make_shared<CXmlWriter_Native>(p); writeSlicestackStream(pXMLWriter.get(), pModel, pSliceStackResource); PImportStream pStream = std::make_shared<CImportStream_Memory>(p->getData(), p->getDataSize()); // check, whether that's already in here PModelAttachment pSliceRefAttachment = m_pModel->findModelAttachment(pSliceStackResource->sliceRefPath()); if (pSliceRefAttachment.get() != nullptr) { if (pSliceRefAttachment->getRelationShipType() != PACKAGE_START_PART_RELATIONSHIP_TYPE) throw CNMRException(NMR_ERROR_DUPLICATEATTACHMENTPATH); pSliceRefAttachment->setStream(pStream); } else m_pModel->addAttachment(pSliceStackResource->sliceRefPath(), PACKAGE_START_PART_RELATIONSHIP_TYPE, pStream); } } } }
void CModelWriter_3MF_Native::writePackageToStream(_In_ PExportStream pStream) { if (pStream.get() == nullptr) throw CNMRException(NMR_ERROR_INVALIDPARAM); if (m_pModel == nullptr) throw CNMRException(NMR_ERROR_NOMODELTOWRITE); // Write Model Stream POpcPackageWriter pPackageWriter = std::make_shared<COpcPackageWriter>(pStream); POpcPackagePart pModelPart = pPackageWriter->addPart(PACKAGE_3D_MODEL_URI); PXmlWriter_Native pXMLWriter = std::make_shared<CXmlWriter_Native>(pModelPart->getExportStream()); writeModelStream(pXMLWriter.get(), m_pModel); // add Root relationships pPackageWriter->addRootRelationship(generateRelationShipID(), PACKAGE_START_PART_RELATIONSHIP_TYPE, pModelPart.get()); // add Textures addTextureParts(m_pModel, pPackageWriter, pModelPart); // add Content Types pPackageWriter->addContentType(PACKAGE_3D_RELS_EXTENSION, PACKAGE_3D_RELS_CONTENT_TYPE); pPackageWriter->addContentType(PACKAGE_3D_MODEL_EXTENSION, PACKAGE_3D_MODEL_CONTENT_TYPE); pPackageWriter->addContentType(PACKAGE_3D_TEXTURE_EXTENSION, PACKAGE_TEXTURE_CONTENT_TYPE); pPackageWriter->addContentType(PACKAGE_3D_PNG_EXTENSION, PACKAGE_PNG_CONTENT_TYPE); pPackageWriter->addContentType(PACKAGE_3D_JPEG_EXTENSION, PACKAGE_JPG_CONTENT_TYPE); pPackageWriter->addContentType(PACKAGE_3D_JPG_EXTENSION, PACKAGE_JPG_CONTENT_TYPE); }
void CModelWriter_3MF_Native::writePackageToStream(_In_ PExportStream pStream) { if (pStream.get() == nullptr) throw CNMRException(NMR_ERROR_INVALIDPARAM); if (m_pModel == nullptr) throw CNMRException(NMR_ERROR_NOMODELTOWRITE); // Write Model Stream POpcPackageWriter pPackageWriter = std::make_shared<COpcPackageWriter>(pStream); POpcPackagePart pModelPart = pPackageWriter->addPart(PACKAGE_3D_MODEL_URI); PXmlWriter_Native pXMLWriter = std::make_shared<CXmlWriter_Native>(pModelPart->getExportStream()); writeModelStream(pXMLWriter.get(), m_pModel); // add Root relationships pPackageWriter->addRootRelationship(generateRelationShipID(), PACKAGE_START_PART_RELATIONSHIP_TYPE, pModelPart.get()); PModelAttachment pPackageThumbnail = m_pModel->getPackageThumbnail(); if (pPackageThumbnail.get() != nullptr) { // create Package Thumbnail Part POpcPackagePart pThumbnailPart = pPackageWriter->addPart(pPackageThumbnail->getPathURI()); PExportStream pExportStream = pThumbnailPart->getExportStream(); // Copy data PImportStream pPackageThumbnailStream = pPackageThumbnail->getStream(); pPackageThumbnailStream->seekPosition(0, true); pExportStream->copyFrom(pPackageThumbnailStream.get(), pPackageThumbnailStream->retrieveSize(), MODELWRITER_NATIVE_BUFFERSIZE); // add root relationship pPackageWriter->addRootRelationship(generateRelationShipID(), pPackageThumbnail->getRelationShipType(), pThumbnailPart.get()); } // add slicestacks that reference other files addSlicerefAttachments(m_pModel); // add Attachments addAttachments(m_pModel, pPackageWriter, pModelPart); // add Content Types pPackageWriter->addContentType(PACKAGE_3D_RELS_EXTENSION, PACKAGE_3D_RELS_CONTENT_TYPE); pPackageWriter->addContentType(PACKAGE_3D_MODEL_EXTENSION, PACKAGE_3D_MODEL_CONTENT_TYPE); pPackageWriter->addContentType(PACKAGE_3D_TEXTURE_EXTENSION, PACKAGE_TEXTURE_CONTENT_TYPE); pPackageWriter->addContentType(PACKAGE_3D_PNG_EXTENSION, PACKAGE_PNG_CONTENT_TYPE); pPackageWriter->addContentType(PACKAGE_3D_JPEG_EXTENSION, PACKAGE_JPG_CONTENT_TYPE); pPackageWriter->addContentType(PACKAGE_3D_JPG_EXTENSION, PACKAGE_JPG_CONTENT_TYPE); std::map<std::wstring, std::wstring> CustomContentTypes = m_pModel->getCustomContentTypes(); std::map<std::wstring, std::wstring>::iterator iContentTypeIterator; for (iContentTypeIterator = CustomContentTypes.begin(); iContentTypeIterator != CustomContentTypes.end(); iContentTypeIterator++) { if (!m_pModel->contentTypeIsDefault(iContentTypeIterator->first)) { pPackageWriter->addContentType(iContentTypeIterator->first, iContentTypeIterator->second); } } }
void COpcPackagePart::writeRelationships(_In_ PExportStream pExportStream) { if (pExportStream.get() == nullptr) throw CNMRException(NMR_ERROR_INVALIDPARAM); PXmlWriter_Native pXMLWriter = std::make_shared<CXmlWriter_Native>(pExportStream); pXMLWriter->WriteStartDocument(); pXMLWriter->WriteStartElement(nullptr, OPC_RELS_RELATIONSHIP_CONTAINER, nullptr); pXMLWriter->WriteAttributeString(nullptr, "xmlns", nullptr, OPCPACKAGE_SCHEMA_RELATIONSHIPS); auto iIterator = m_Relationships.begin(); while (iIterator != m_Relationships.end()) { POpcPackageRelationship pRelationShip = *iIterator; pRelationShip->writeToXML(pXMLWriter.get()); iIterator++; } pXMLWriter->WriteFullEndElement(); pXMLWriter->WriteEndDocument(); }
void COpcPackageWriter::writeRootRelationships() { if (m_RootRelationships.size() == 0) return; PExportStream pStream = m_pZIPWriter->createEntry(OPCPACKAGE_PATH_ROOTRELATIONSHIPS, fnGetUnixTime()); PXmlWriter_Native pXMLWriter = std::make_shared<CXmlWriter_Native>(pStream); pXMLWriter->WriteStartDocument(); pXMLWriter->WriteStartElement(nullptr, L"Relationships", nullptr); pXMLWriter->WriteAttributeString(nullptr, L"xmlns", nullptr, OPCPACKAGE_SCHEMA_RELATIONSHIPS); auto iIterator = m_RootRelationships.begin(); while (iIterator != m_RootRelationships.end()) { POpcPackageRelationship pRelationShip = *iIterator; pRelationShip->writeToXML(pXMLWriter.get()); iIterator++; } pXMLWriter->WriteFullEndElement(); pXMLWriter->WriteEndDocument(); }