public void Save(Stream stream) { var objectMap = new DwgObjectMap(); AssignHandles(objectMap); // write the file header; this will be re-written again once the pointers have been calculated var writer = new BitWriter(stream); var fileHeaderLocation = writer.Position; FileHeader.Write(writer); var variablesStart = writer.Position; Variables.Write(writer, FileHeader.Version); FileHeader.HeaderVariablesLocator = DwgFileHeader.DwgSectionLocator.HeaderVariablesLocator(variablesStart - fileHeaderLocation, writer.Position - variablesStart); var classesStart = writer.Position; DwgClasses.Write(Classes, writer); FileHeader.ClassSectionLocator = DwgFileHeader.DwgSectionLocator.ClassSectionLocator(classesStart - fileHeaderLocation, writer.Position - classesStart); var paddingStart = writer.Position; writer.WriteBytes(new byte[0x200]); // may contain the MEASUREMENT variable as the first 4 bytes, but not required FileHeader.UnknownSection_PaddingLocator = DwgFileHeader.DwgSectionLocator.UnknownSection_PaddingLocator(paddingStart - fileHeaderLocation, writer.Position - paddingStart); var objectDataStart = writer.Position; SaveObjects(writer, objectMap, objectDataStart); var objectMapStart = writer.Position; objectMap.Write(writer); FileHeader.ObjectMapLocator = DwgFileHeader.DwgSectionLocator.ObjectMapLocator(objectMapStart - fileHeaderLocation, writer.Position - objectMapStart); var unknownR13C3Start = writer.Position; DwgUnknownSectionR13C3.Write(writer); FileHeader.UnknownSection_R13C3AndLaterLocator = DwgFileHeader.DwgSectionLocator.UnknownSection_R13C3AndLaterLocator(unknownR13C3Start - fileHeaderLocation, writer.Position - unknownR13C3Start); var secondHeaderStart = writer.Position; FileHeader.WriteSecondHeader(writer, Variables, secondHeaderStart - fileHeaderLocation); var imageDataStart = writer.Position; ImageData.Write(writer, imageDataStart - fileHeaderLocation); FileHeader.ImagePointer = imageDataStart - fileHeaderLocation; // re-write the file header now that the pointer values have been set var endPos = writer.Position; writer.BaseStream.Seek(fileHeaderLocation, SeekOrigin.Begin); FileHeader.Write(writer); writer.BaseStream.Seek(endPos, SeekOrigin.Begin); }
public static DwgDrawing Load(byte[] data) { var reader = new BitReader(data); var drawing = new DwgDrawing(); drawing.FileHeader = DwgFileHeader.Parse(reader); drawing.Variables = DwgHeaderVariables.Parse(reader.FromOffset(drawing.FileHeader.HeaderVariablesLocator.Pointer), drawing.FileHeader.Version); drawing.Classes = DwgClasses.Parse(reader.FromOffset(drawing.FileHeader.ClassSectionLocator.Pointer), drawing.FileHeader.Version); // don't read the R13C3 and later unknown section drawing.FileHeader.ValidateSecondHeader(reader, drawing.Variables); drawing.ImageData = DwgImageData.Parse(reader.FromOffset(drawing.FileHeader.ImagePointer)); var objectCache = DwgObjectCache.Parse(reader.FromOffset(drawing.FileHeader.ObjectMapLocator.Pointer), drawing.FileHeader.Version); drawing.LoadObjects(reader, objectCache); return(drawing); }