private SegmentHeader GetMetaDataSegmentHeader(JTNode node) { if (uniqueMetaDataSegmentHeaders.ContainsKey(node)) { return(uniqueMetaDataSegmentHeaders[node]); } var attributes = node.Attributes; if (attributes.Count == 0) { return(null); } var keys = new List <string>(attributes.Keys); var values = new List <object>(attributes.Values); var metaDataSegment = new MetaDataSegment(new PropertyProxyMetaDataElement(keys, values)); var compressedMetaDataSegment = CompressionUtils.Compress(metaDataSegment.Bytes); var metaDataSegmentHeaderZLIB = new LogicElementHeaderZLIB(2, compressedMetaDataSegment.Length + 1, 2); // CompressionAlgorithm field (of type Byte) is included in CompressedDataLength var metaDataSegmentHeader = new SegmentHeader(GUID.NewGUID(), 4, SegmentHeader.Size + metaDataSegmentHeaderZLIB.ByteCount + compressedMetaDataSegment.Length); uniqueMetaDataSegmentHeaders[node] = metaDataSegmentHeader; compressedMetaDataSegments.Add(compressedMetaDataSegment); metaDataSegmentHeadersZLIB.Add(metaDataSegmentHeaderZLIB); metaDataSegmentHeaders.Add(metaDataSegmentHeader); return(metaDataSegmentHeader); }
//public PartitionNodeElement Save(string path, bool monolithic = true, bool separateAttributeSegments = false) public byte[] ToBytes() { uniquePropertyIds.Clear(); uniqueAttributeIds.Clear(); uniqueMetaDataSegmentHeaders.Clear(); propertyTableContents.Clear(); elements.Clear(); propertyAtomElements.Clear(); savedFileIds.Clear(); shapeLODSegments.Clear(); shapeLODSegmentHeaders.Clear(); compressedMetaDataSegments.Clear(); metaDataSegmentHeadersZLIB.Clear(); metaDataSegmentHeaders.Clear(); /*this.monolithic = monolithic; * this.separateAttributeSegments = separateAttributeSegments;*/ this.monolithic = true; this.separateAttributeSegments = false; // this.savePath = Path.Combine(String.Join("_", Path.GetDirectoryName(path).Split(Path.GetInvalidPathChars())), String.Join("_", Path.GetFileName(path).Split(Path.GetInvalidFileNameChars()))); // File Header var fileHeader = new FileHeader("Version 8.1 JT", (Byte)(BitConverter.IsLittleEndian ? 0 : 1), FileHeader.Size, GUID.NewGUID()); // END File Header // Create all elements //FindInstancedNodes(this); CreateElement(this); // END Create all elements // LSG Segment var keys = new int[propertyTableContents.Keys.Count]; propertyTableContents.Keys.CopyTo(keys, 0); var values = new NodePropertyTable[propertyTableContents.Values.Count]; propertyTableContents.Values.CopyTo(values, 0); var lsgSegment = new LSGSegment(new List <BaseDataStructure>(elements), propertyAtomElements, new PropertyTable(keys, values)); // END LSG Segment // Compress LSG Segment var compressedLSGSegmentData = CompressionUtils.Compress(lsgSegment.Bytes); // END Compress LSG Segment // LSG Segment Logic Element Header ZLIB var lsgSegmentLogicElementHeaderZLIB = new LogicElementHeaderZLIB(2, compressedLSGSegmentData.Length + 1, 2); // CompressionAlgorithm field (of type Byte) is included in CompressedDataLength // END LSG Segment Logic Element Header ZLIB // Segment Header var lsgSegmentHeader = new SegmentHeader(fileHeader.LSGSegmentID, 1, SegmentHeader.Size + lsgSegmentLogicElementHeaderZLIB.ByteCount + compressedLSGSegmentData.Length); // END Segment Header // Toc Segments var lsgTOCEntry = new TOCEntry(lsgSegmentHeader.SegmentID, -1, lsgSegmentHeader.SegmentLength, (UInt32)(lsgSegmentHeader.SegmentType << 24)); var tocEntries = new List <TOCEntry>() { lsgTOCEntry }; for (int i = 0, c = shapeLODSegmentHeaders.Count; i < c; ++i) { var shapeLODSegmentHeader = shapeLODSegmentHeaders[i]; tocEntries.Add(new TOCEntry(shapeLODSegmentHeader.SegmentID, -1, shapeLODSegmentHeader.SegmentLength, (UInt32)(shapeLODSegmentHeader.SegmentType << 24))); } for (int i = 0, c = metaDataSegmentHeaders.Count; i < c; ++i) { var metaDataSegmentHeader = metaDataSegmentHeaders[i]; tocEntries.Add(new TOCEntry(metaDataSegmentHeader.SegmentID, -1, metaDataSegmentHeader.SegmentLength, (UInt32)(metaDataSegmentHeader.SegmentType << 24))); } if (tocEntries.Count == 1) { tocEntries.Add(lsgTOCEntry); } var tocSegment = new TOCSegment(tocEntries.ToArray()); var segmentTotalSizeTracker = 0; for (int i = 0, c = tocEntries.Count; i < c; ++i) { var tocEntry = tocEntries[i]; if (i > 0 && tocEntry == tocEntries[i - 1]) { continue; } tocEntry.SegmentOffset = fileHeader.ByteCount + tocSegment.ByteCount + segmentTotalSizeTracker; segmentTotalSizeTracker += tocEntry.SegmentLength; } // END Toc Segments // Write to file //using (var outputFileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write)) using (var outputFileStream = new MemoryStream()) { outputFileStream.Write(fileHeader.Bytes, 0, fileHeader.ByteCount); outputFileStream.Write(tocSegment.Bytes, 0, tocSegment.ByteCount); outputFileStream.Write(lsgSegmentHeader.Bytes, 0, lsgSegmentHeader.ByteCount); outputFileStream.Write(lsgSegmentLogicElementHeaderZLIB.Bytes, 0, lsgSegmentLogicElementHeaderZLIB.ByteCount); outputFileStream.Write(compressedLSGSegmentData, 0, compressedLSGSegmentData.Length); for (int i = 0, c = shapeLODSegmentHeaders.Count; i < c; ++i) { var shapeLODSegmentHeader = shapeLODSegmentHeaders[i]; var shapeLODSegment = shapeLODSegments[i]; outputFileStream.Write(shapeLODSegmentHeader.Bytes, 0, shapeLODSegmentHeader.ByteCount); outputFileStream.Write(shapeLODSegment.Bytes, 0, shapeLODSegment.ByteCount); } for (int i = 0, c = metaDataSegmentHeaders.Count; i < c; ++i) { var metaDataSegmentHeader = metaDataSegmentHeaders[i]; var metaDataSegmentHeaderZLIB = metaDataSegmentHeadersZLIB[i]; var compressedMetaDataSegment = compressedMetaDataSegments[i]; outputFileStream.Write(metaDataSegmentHeader.Bytes, 0, metaDataSegmentHeader.ByteCount); outputFileStream.Write(metaDataSegmentHeaderZLIB.Bytes, 0, metaDataSegmentHeaderZLIB.ByteCount); outputFileStream.Write(compressedMetaDataSegment, 0, compressedMetaDataSegment.Length); } return(outputFileStream.ToArray()); } // END Write to file //return elements.Count > 0 ? (PartitionNodeElement)elements[0] : null; }