private void SaveObjects(BitWriter writer, DwgObjectMap objectMap, int pointerOffset) { var writtenHandles = new HashSet <int>(); foreach (var groupObject in TopLevelObjects) { groupObject.Write(writer, objectMap, writtenHandles, pointerOffset, FileHeader.Version); } }
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); }
private void AssignHandles(DwgObjectMap objectMap) { BlockHeaders.ClearHandles(); Layers.ClearHandles(); Styles.ClearHandles(); LineTypes.ClearHandles(); Views.ClearHandles(); UCSs.ClearHandles(); ViewPorts.ClearHandles(); AppIds.ClearHandles(); DimStyles.ClearHandles(); ViewPortEntityHeaders.ClearHandles(); GroupDictionary.ClearHandles(); MLineStyleDictionary.ClearHandles(); NamedObjectDictionary.ClearHandles(); BlockHeaders.AssignHandles(objectMap); Layers.AssignHandles(objectMap); Styles.AssignHandles(objectMap); LineTypes.AssignHandles(objectMap); Views.AssignHandles(objectMap); UCSs.AssignHandles(objectMap); ViewPorts.AssignHandles(objectMap); AppIds.AssignHandles(objectMap); DimStyles.AssignHandles(objectMap); ViewPortEntityHeaders.AssignHandles(objectMap); GroupDictionary.AssignHandles(objectMap); MLineStyleDictionary.AssignHandles(objectMap); NamedObjectDictionary.AssignHandles(objectMap); Variables.BlockControlObjectHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, BlockHeaders.Handle.HandleOrOffset); Variables.LayerControlObjectHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, Layers.Handle.HandleOrOffset); Variables.StyleObjectControlHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, Styles.Handle.HandleOrOffset); Variables.LineTypeObjectControlHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, LineTypes.Handle.HandleOrOffset); Variables.ViewControlObjectHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, Views.Handle.HandleOrOffset); Variables.UcsControlObjectHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, UCSs.Handle.HandleOrOffset); Variables.ViewPortControlObjectHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, ViewPorts.Handle.HandleOrOffset); Variables.AppIdControlObjectHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, AppIds.Handle.HandleOrOffset); Variables.DimStyleControlObjectHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, DimStyles.Handle.HandleOrOffset); Variables.ViewPortEntityHeaderControlObjectHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, ViewPortEntityHeaders.Handle.HandleOrOffset); Variables.GroupDictionaryHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, GroupDictionary.Handle.HandleOrOffset); Variables.MLineStyleDictionaryHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, MLineStyleDictionary.Handle.HandleOrOffset); Variables.NamedObjectsDictionaryHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftPointer, NamedObjectDictionary.Handle.HandleOrOffset); Variables.PaperSpaceBlockRecordHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, PaperSpaceBlockRecord.Handle.HandleOrOffset); Variables.ModelSpaceBlockRecordHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, ModelSpaceBlockRecord.Handle.HandleOrOffset); Variables.ByLayerLineTypeHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, ByLayerLineType.Handle.HandleOrOffset); Variables.ByBlockLineTypeHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, ByBlockLineType.Handle.HandleOrOffset); Variables.ContinuousLineTypeHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, ContinuousLineType.Handle.HandleOrOffset); Variables.CurrentViewPortEntityHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, CurrentViewPort?.Handle.HandleOrOffset ?? 0); Variables.CurrentLayerHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, CurrentLayer.Handle.HandleOrOffset); Variables.TextStyleHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, TextStyle.Handle.HandleOrOffset); Variables.CurrentEntityLineTypeHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, CurrentEntityLineType.Handle.HandleOrOffset); Variables.DimensionStyleHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, DimensionStyle.Handle.HandleOrOffset); Variables.CurrentMultiLineStyleHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, CurrentMultiLineStyle.Handle.HandleOrOffset); Variables.PaperSpaceCurrentUCSHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, PaperSpaceCurrentUCS?.Handle.HandleOrOffset ?? 0); Variables.CurrentUCSHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, CurrentUCS?.Handle.HandleOrOffset ?? 0); Variables.DimensionTextStyleHandle = new DwgHandleReference(DwgHandleReferenceCode.SoftOwner, DimensionTextStyle.Handle.HandleOrOffset); objectMap.SetNextAvailableHandle(Variables); }