Example #1
0
 public virtual void ReadHeaderTest(string test)
 {
     using (T reader = (T)Activator.CreateInstance(typeof(T), test, null))
     {
         reader.OnNotificationHandler += this.onNotification;
         CadHeader header = reader.ReadHeader();
     }
 }
Example #2
0
        /// <inheritdoc/>
        public override CadHeader ReadHeader()
        {
            this._reader = this.goToSection(DxfFileToken.HeaderSection);

            CadHeader header = new CadHeader();

            Dictionary <string, DxfCode[]> headerMap = CadHeader.GetHeaderMap();

            this._reader.ReadNext();

            //Loop until the section ends
            while (!this._reader.EndSectionFound)
            {
                //Get the current header variable
                string currVar = this._reader.LastValueAsString;

                if (this._reader.LastValueAsString == null || !headerMap.TryGetValue(currVar, out var codes))
                {
                    //this.notificationHandler(this, new NotificationEventArgs($"Header variable not implemented {currVar}"));
                    this._reader.ReadNext();
                    continue;
                }

                object[] parameters = new object[codes.Length];
                for (int i = 0; i < codes.Length; i++)
                {
                    this._reader.ReadNext();
                    parameters[i] = this._reader.LastValue;
                }

                //Set the header value by name
                header.SetValue(currVar, parameters);

                this._reader.ReadNext();
            }

            return(header);
        }
Example #3
0
        /// <summary>
        /// Read the HEADER section of the file.
        /// </summary>
        /// <returns></returns>
        public CadHeader ReadHeader()
        {
            //Get the needed handler
            m_reader = getSectionHandler(DxfFileToken.HeaderSection);

            CadHeader header = new CadHeader();

            Dictionary <string, DxfCode[]> headerMap = CadHeader.GetHeaderMap();

            //Loop until the section ends
            while (!m_reader.EndSectionFound)
            {
                //Get next key/value
                m_reader.ReadNext();

                //Get the current header variable
                string currVar = m_reader.LastValueAsString;

                if (!headerMap.TryGetValue(currVar, out var codes))
                {
                    continue;
                }

                object[] parameters = new object[codes.Length];
                for (int i = 0; i < codes.Length; i++)
                {
                    m_reader.ReadNext();
                    parameters[i] = m_reader.LastValue;
                }

                //Set the header value by name
                header.SetValue(currVar, parameters);
            }

            return(header);
        }
Example #4
0
        public CadHeader Read(IDwgStreamReader sreader,
                              int acadMaintenanceVersion, out DwgHeaderHandlesCollection objectPointers)
        {
            //Save the parameter handler in a local variable
            _mainReader = sreader;

            CadHeader header = new CadHeader(_version);

            objectPointers = new DwgHeaderHandlesCollection();

            //0xCF,0x7B,0x1F,0x23,0xFD,0xDE,0x38,0xA9,0x5F,0x7C,0x68,0xB8,0x4E,0x6D,0x33,0x5F
            byte[] sn = sreader.ReadSentinel();

            //RL : Size of the section.
            long size = sreader.ReadRawLong();

            //R2010/R2013 (only present if the maintenance version is greater than 3!) or R2018+:
            if (R2010Plus && acadMaintenanceVersion > 3 || R2018Plus)
            {
                //Unknown (4 byte long), might be part of a 64-bit size.
                long unknown = sreader.ReadRawLong();
            }

            long initialPos = sreader.PositionInBits();

            //+R2007 Only:
            if (R2007Plus)
            {
                //RL : Size in bits
                long sizeInBits = sreader.ReadRawLong();

                long lastPositionInBits = initialPos + sizeInBits - 1L;

                //Setup the text handler for versions 2007 and above
                IDwgStreamReader textReader = DwgStreamReader.GetStreamHandler(_version,
                                                                               //Create a copy of the stream
                                                                               new StreamIO(sreader.Stream, true).Stream);
                //Set the position and use the flag
                textReader.SetPositionByFlag(lastPositionInBits);

                //Setup the handler for the references for versions 2007 and above
                IDwgStreamReader referenceReader = DwgStreamReader.GetStreamHandler(_version,
                                                                                    //Create a copy of the stream
                                                                                    new StreamIO(sreader.Stream, true).Stream);
                //Set the position and jump the flag
                referenceReader.SetPositionInBits(lastPositionInBits + 0b1);

                sreader = new DwgMergedReader(sreader, textReader, referenceReader);
            }

            //R2013+:
            if (R2013Plus)
            {
                //BLL : Variabele REQUIREDVERSIONS, default value 0, read only.
                header.RequiredVersions = sreader.ReadBitLongLong();
            }

            //Common:
            //BD : Unknown, default value 412148564080.0
            double unknownbd = sreader.ReadBitDouble();

            //BD: Unknown, default value 1.0
            unknownbd = sreader.ReadBitDouble();
            //BD: Unknown, default value 1.0
            unknownbd = sreader.ReadBitDouble();
            //BD: Unknown, default value 1.0
            unknownbd = sreader.ReadBitDouble();
            //TV: Unknown text string, default "m"
            var unknowntv = sreader.ReadVariableText();

            //TV: Unknown text string, default ""
            unknowntv = sreader.ReadVariableText();
            //TV: Unknown text string, default ""
            unknowntv = sreader.ReadVariableText();
            //TV: Unknown text string, default ""
            unknowntv = sreader.ReadVariableText();
            //BL : Unknown long, default value 24L
            var unknownbl = sreader.ReadBitLong();

            //BL: Unknown long, default value 0L;
            unknownbl = sreader.ReadBitLong();

            //R13-R14 Only:
            if (R13_14Only)
            {
                //BS : Unknown short, default value 0
                short unknowns = sreader.ReadBitShort();
            }

            //Pre-2004 Only:
            if (R2004Pre)
            {
                //H : Handle of the current viewport entity header (hard pointer)
                ulong pointerViewPort = sreader.HandleReference();
            }

            //Common:
            //B: DIMASO
            header.AssociatedDimensions = sreader.ReadBit();
            //B: DIMSHO
            header.UpdateDimensionsWhileDragging = sreader.ReadBit();

            //R13-R14 Only:
            if (R13_14Only)
            {
                //B : DIMSAV Undocumented.
                header.DIMSAV = sreader.ReadBit();
            }

            //Common:
            //B: PLINEGEN
            header.PolylineLineTypeGeneration = sreader.ReadBit();
            //B : ORTHOMODE
            header.OrthoMode = sreader.ReadBit();
            //B: REGENMODE
            header.RegenerationMode = sreader.ReadBit();
            //B : FILLMODE
            header.FillMode = sreader.ReadBit();
            //B : QTEXTMODE
            header.QuickTextMode = sreader.ReadBit();
            //B : PSLTSCALE
            header.PaperSpaceLineTypeScaling = sreader.ReadBit() ? SpaceLineTypeScaling.Normal : SpaceLineTypeScaling.Viewport;
            //B : LIMCHECK
            header.LimitCheckingOn = sreader.ReadBit();

            //R13-R14 Only (stored in registry from R15 onwards):
            if (R13_14Only)
            {
                //B : BLIPMODE
                header.BlipMode = sreader.ReadBit();
            }
            //R2004+:
            if (R2004Plus)
            {
                //B : Undocumented
                sreader.ReadBit();
            }

            //Common:
            //B: USRTIMER(User timer on / off).
            header.UserTimer = sreader.ReadBit();
            //B : SKPOLY
            header.SketchPolylines = sreader.ReadBit();
            //B : ANGDIR
            header.AngularDirection = (AngularDirection)sreader.ReadBitAsShort();
            //B : SPLFRAME
            header.ShowSplineControlPoints = sreader.ReadBit();

            //R13-R14 Only (stored in registry from R15 onwards):
            if (R13_14Only)
            {
                //B : ATTREQ
                sreader.ReadBit();
                //B : ATTDIA
                sreader.ReadBit();
            }

            //Common:
            //B: MIRRTEXT
            header.MirrorText = sreader.ReadBit();
            //B : WORLDVIEW
            header.WorldView = sreader.ReadBit();

            //R13 - R14 Only:
            if (R13_14Only)
            {
                //B: WIREFRAME Undocumented.
                sreader.ReadBit();
            }

            //Common:
            //B: TILEMODE
            header.ShowModelSpace = sreader.ReadBit();
            //B : PLIMCHECK
            header.PaperSpaceLimitsChecking = sreader.ReadBit();
            //B : VISRETAIN
            header.RetainXRefDependentVisibilitySettings = sreader.ReadBit();

            //R13 - R14 Only(stored in registry from R15 onwards):
            if (R13_14Only)
            {
                //B : DELOBJ
                sreader.ReadBit();
            }

            //Common:
            //B: DISPSILH
            header.DisplaySilhouetteCurves = sreader.ReadBit();
            //B : PELLIPSE(not present in DXF)
            header.CreateEllipseAsPolyline = sreader.ReadBit();
            //BS: PROXYGRAPHICS
            header.ProxyGraphics = sreader.ReadBitShortAsBool();

            //R13-R14 Only (stored in registry from R15 onwards):
            if (R13_14Only)
            {
                //BS : DRAGMODE
                sreader.ReadBitShort();
            }

            //Common:
            //BS: TREEDEPTH
            header.SpatialIndexMaxTreeDepth = sreader.ReadBitShort();
            //BS : LUNITS
            header.LinearUnitFormat = (LinearUnitFormat)sreader.ReadBitShort();
            //BS : LUPREC
            header.LinearUnitPrecision = sreader.ReadBitShort();
            //BS : AUNITS
            header.AngularUnit = (AngularUnitFormat)sreader.ReadBitShort();
            //BS : AUPREC
            header.AngularUnitPrecision = sreader.ReadBitShort();

            //R13 - R14 Only Only(stored in registry from R15 onwards):
            if (R13_14Only)
            {
                //BS: OSMODE
                header.ObjectSnapMode = (ObjectSnapMode)sreader.ReadBitShort();
            }

            //Common:
            //BS: ATTMODE
            header.AttributeVisibility = (AttributeVisibilityMode)sreader.ReadBitShort();

            //R13 - R14 Only Only(stored in registry from R15 onwards):
            if (R13_14Only)
            {
                //BS: COORDS
                sreader.ReadBitShort();
            }

            //Common:
            //BS: PDMODE
            header.PointDisplayMode = sreader.ReadBitShort();

            //R13 - R14 Only Only(stored in registry from R15 onwards):
            if (R13_14Only)
            {
                //BS: PICKSTYLE
                sreader.ReadBitShort();
            }

            //R2004 +:
            if (R2004Plus)
            {
                //BL: Unknown
                sreader.ReadBitLong();
                //BL: Unknown
                sreader.ReadBitLong();
                //BL: Unknown
                sreader.ReadBitLong();
            }

            //Common:
            //BS : USERI1
            header.UserShort1 = sreader.ReadBitShort();
            //BS : USERI2
            header.UserShort2 = sreader.ReadBitShort();
            //BS : USERI3
            header.UserShort3 = sreader.ReadBitShort();
            //BS : USERI4
            header.UserShort4 = sreader.ReadBitShort();
            //BS : USERI5
            header.UserShort5 = sreader.ReadBitShort();

            //BS: SPLINESEGS
            header.NumberOfSplineSegments = sreader.ReadBitShort();
            //BS : SURFU
            header.SurfaceDensityU = sreader.ReadBitShort();
            //BS : SURFV
            header.SurfaceDensityV = sreader.ReadBitShort();
            //BS : SURFTYPE
            header.SurfaceType = sreader.ReadBitShort();
            //BS : SURFTAB1
            header.SurfaceMeshTabulationCount1 = sreader.ReadBitShort();
            //BS : SURFTAB2
            header.SurfaceMeshTabulationCount2 = sreader.ReadBitShort();
            //BS : SPLINETYPE
            header.SplineType = (SplineType)sreader.ReadBitShort();
            //BS : SHADEDGE
            header.ShadeEdge = (ShadeEdgeType)sreader.ReadBitShort();
            //BS : SHADEDIF
            header.ShadeDiffuseToAmbientPercentage = sreader.ReadBitShort();
            //BS: UNITMODE
            header.UnitMode = sreader.ReadBitShort();
            //BS : MAXACTVP
            header.MaxViewportCount = sreader.ReadBitShort();
            //BS : ISOLINES
            header.SurfaceIsolineCount = sreader.ReadBitShort();
            //BS : CMLJUST
            header.CurrentMultilineJustification = (Entities.TextVerticalAlignment)sreader.ReadBitShort();
            //BS : TEXTQLTY
            header.TextQuality = sreader.ReadBitShort();
            //BD : LTSCALE
            header.LineTypeScale = sreader.ReadBitDouble();
            //BD : TEXTSIZE
            header.TextHeightDefault = sreader.ReadBitDouble();
            //BD : TRACEWID
            header.TraceWidthDefault = sreader.ReadBitDouble();
            //BD : SKETCHINC
            header.SketchIncrement = sreader.ReadBitDouble();
            //BD : FILLETRAD
            header.FilletRadius = sreader.ReadBitDouble();
            //BD : THICKNESS
            header.ThicknessDefault = sreader.ReadBitDouble();
            //BD : ANGBASE
            header.AngleBase = sreader.ReadBitDouble();
            //BD : PDSIZE
            header.PointDisplaySize = sreader.ReadBitDouble();
            //BD : PLINEWID
            header.PolylineWidthDefault = sreader.ReadBitDouble();
            //BD : USERR1
            header.UserDouble1 = sreader.ReadBitDouble();
            //BD : USERR2
            header.UserDouble2 = sreader.ReadBitDouble();
            //BD : USERR3
            header.UserDouble3 = sreader.ReadBitDouble();
            //BD : USERR4
            header.UserDouble4 = sreader.ReadBitDouble();
            //BD : USERR5
            header.UserDouble5 = sreader.ReadBitDouble();
            //BD : CHAMFERA
            header.ChamferDistance1 = sreader.ReadBitDouble();
            //BD : CHAMFERB
            header.ChamferDistance2 = sreader.ReadBitDouble();
            //BD : CHAMFERC
            header.ChamferLength = sreader.ReadBitDouble();
            //BD : CHAMFERD
            header.ChamferAngle = sreader.ReadBitDouble();
            //BD : FACETRES
            header.FacetResolution = sreader.ReadBitDouble();
            //BD : CMLSCALE
            header.CurrentMultilineScale = sreader.ReadBitDouble();
            //BD : CELTSCALE
            header.CurrentEntityLinetypeScale = sreader.ReadBitDouble();

            //TV: MENUNAME
            header.MenuFileName = sreader.ReadVariableText();

            //Common:
            //BL: TDCREATE(Julian day)
            //BL: TDCREATE(Milliseconds into the day)
            header.CreateDateTime = sreader.ReadDateTime();
            //BL: TDUPDATE(Julian day)
            //BL: TDUPDATE(Milliseconds into the day)
            header.UpdateDateTime = sreader.ReadDateTime();

            //R2004 +:
            if (R2004Plus)
            {
                //BL : Unknown
                sreader.ReadBitLong();
                //BL : Unknown
                sreader.ReadBitLong();
                //BL : Unknown
                sreader.ReadBitLong();
            }

            //Common:
            //BL: TDINDWG(Days)
            //BL: TDINDWG(Milliseconds into the day)
            header.TotalEditingTime = sreader.ReadTimeSpan();
            //BL: TDUSRTIMER(Days)
            //BL: TDUSRTIMER(Milliseconds into the day)
            header.UserElapsedTimeSpan = sreader.ReadTimeSpan();

            //CMC : CECOLOR
            header.CurrentEntityColor = sreader.ReadCmColor();

            //H : HANDSEED The next handle, with an 8-bit length specifier preceding the handle
            //bytes (standard hex handle form) (code 0). The HANDSEED is not part of the handle
            //stream, but of the normal data stream (relevant for R21 and later).
            header.HandleSeed = _mainReader.HandleReference();

            //H : CLAYER (hard pointer)
            objectPointers.CLAYER = sreader.HandleReference();
            //H: TEXTSTYLE(hard pointer)
            objectPointers.TEXTSTYLE = sreader.HandleReference();
            //H: CELTYPE(hard pointer)
            objectPointers.CELTYPE = sreader.HandleReference();

            //R2007 + Only:
            if (R2007Plus)
            {
                //H: CMATERIAL(hard pointer)
                objectPointers.CMATERIAL = sreader.HandleReference();
            }

            //Common:
            //H: DIMSTYLE (hard pointer)
            objectPointers.DIMSTYLE = sreader.HandleReference();
            //H: CMLSTYLE (hard pointer)
            objectPointers.CMLSTYLE = sreader.HandleReference();

            //R2000+ Only:
            if (R2000Plus)
            {
                //BD: PSVPSCALE
                header.ViewportDefaultViewScaleFactor = sreader.ReadBitDouble();
            }

            //Common:
            //3BD: INSBASE(PSPACE)
            header.PaperSpaceUcs.PaperSpaceInsertionBase = sreader.Read3BitDouble();
            //3BD: EXTMIN(PSPACE)
            header.PaperSpaceUcs.PaperSpaceExtMin = sreader.Read3BitDouble();
            //3BD: EXTMAX(PSPACE)
            header.PaperSpaceUcs.PaperSpaceExtMax = sreader.Read3BitDouble();
            //2RD: LIMMIN(PSPACE)
            header.PaperSpaceUcs.PaperSpaceLimitsMin = sreader.Read2RawDouble();
            //2RD: LIMMAX(PSPACE)
            header.PaperSpaceUcs.PaperSpaceLimitsMax = sreader.Read2RawDouble();
            //BD: ELEVATION(PSPACE)
            header.PaperSpaceUcs.Elevation = sreader.ReadBitDouble();
            //3BD: UCSORG(PSPACE)
            header.PaperSpaceUcs.Origin = sreader.Read3BitDouble();
            //3BD: UCSXDIR(PSPACE)
            header.PaperSpaceUcs.XAxis = sreader.Read3BitDouble();
            //3BD: UCSYDIR(PSPACE)
            header.PaperSpaceUcs.YAxis = sreader.Read3BitDouble();

            //H: UCSNAME (PSPACE) (hard pointer)
            objectPointers.UCSNAME_PSPACE = sreader.HandleReference();

            //R2000+ Only:
            if (R2000Plus)
            {
                //H : PUCSORTHOREF (hard pointer)
                objectPointers.PUCSORTHOREF = sreader.HandleReference();

                //BS : PUCSORTHOVIEW	??
                int PUCSORTHOVIEW = sreader.ReadBitShort();

                //H: PUCSBASE(hard pointer)
                objectPointers.PUCSBASE = sreader.HandleReference();

                //3BD: PUCSORGTOP
                header.PaperSpaceUcs.OrthographicTopDOrigin = sreader.Read3BitDouble();
                //3BD: PUCSORGBOTTOM
                header.PaperSpaceUcs.OrthographicBottomDOrigin = sreader.Read3BitDouble();
                //3BD: PUCSORGLEFT
                header.PaperSpaceUcs.OrthographicLeftDOrigin = sreader.Read3BitDouble();
                //3BD: PUCSORGRIGHT
                header.PaperSpaceUcs.OrthographicRightDOrigin = sreader.Read3BitDouble();
                //3BD: PUCSORGFRONT
                header.PaperSpaceUcs.OrthographicFrontDOrigin = sreader.Read3BitDouble();
                //3BD: PUCSORGBACK
                header.PaperSpaceUcs.OrthographicBackDOrigin = sreader.Read3BitDouble();
            }

            //Common:
            //3BD: INSBASE(MSPACE)
            header.InsertionBase = sreader.Read3BitDouble();
            //3BD: EXTMIN(MSPACE)
            header.ExtMin = sreader.Read3BitDouble();
            //3BD: EXTMAX(MSPACE)
            header.ExtMax = sreader.Read3BitDouble();
            //2RD: LIMMIN(MSPACE)
            header.LimitsMin = sreader.Read2RawDouble();
            //2RD: LIMMAX(MSPACE)
            header.LimitsMax = sreader.Read2RawDouble();
            //BD: ELEVATION(MSPACE)
            header.Elevation = sreader.ReadBitDouble();
            //3BD: UCSORG(MSPACE)
            header.Ucs.Origin = sreader.Read3BitDouble();
            //3BD: UCSXDIR(MSPACE)
            header.Ucs.XAxis = sreader.Read3BitDouble();
            //3BD: UCSYDIR(MSPACE)
            header.Ucs.YAxis = sreader.Read3BitDouble();

            //H: UCSNAME(MSPACE)(hard pointer)
            objectPointers.UCSNAME_MSPACE = sreader.HandleReference();

            //R2000 + Only:
            if (R2000Plus)
            {
                //H: UCSORTHOREF(hard pointer)
                objectPointers.UCSORTHOREF = sreader.HandleReference();

                //BS: UCSORTHOVIEW	??
                short UCSORTHOVIEW = sreader.ReadBitShort();

                //H : UCSBASE(hard pointer)
                objectPointers.UCSBASE = sreader.HandleReference();

                //3BD: UCSORGTOP
                header.Ucs.OrthographicTopDOrigin = sreader.Read3BitDouble();
                //3BD: UCSORGBOTTOM
                header.Ucs.OrthographicBottomDOrigin = sreader.Read3BitDouble();
                //3BD: UCSORGLEFT
                header.Ucs.OrthographicLeftDOrigin = sreader.Read3BitDouble();
                //3BD: UCSORGRIGHT
                header.Ucs.OrthographicRightDOrigin = sreader.Read3BitDouble();
                //3BD: UCSORGFRONT
                header.Ucs.OrthographicFrontDOrigin = sreader.Read3BitDouble();
                //3BD: UCSORGBACK
                header.Ucs.OrthographicBackDOrigin = sreader.Read3BitDouble();

                //TV : DIMPOST
                header.DimensionStyleOverrides.PostFix = sreader.ReadVariableText();
                //TV : DIMAPOST
                header.DimensionStyleOverrides.AlternateDimensioningSuffix = sreader.ReadVariableText();
            }

            //R13-R14 Only:
            if (R13_14Only)
            {
                //B: DIMTOL
                header.DimensionStyleOverrides.GenerateTolerances = sreader.ReadBit();
                //B : DIMLIM
                header.DimensionStyleOverrides.LimitsGeneration = sreader.ReadBit();
                //B : DIMTIH
                header.DimensionStyleOverrides.TextInsideHorizontal = sreader.ReadBit();
                //B : DIMTOH
                header.DimensionStyleOverrides.TextOutsideHorizontal = sreader.ReadBit();
                //B : DIMSE1
                header.DimensionStyleOverrides.SuppressFirstExtensionLine = sreader.ReadBit();
                //B : DIMSE2
                header.DimensionStyleOverrides.SuppressSecondExtensionLine = sreader.ReadBit();
                //B : DIMALT
                header.DimensionStyleOverrides.AlternateUnitDimensioning = sreader.ReadBit();
                //B : DIMTOFL
                header.DimensionStyleOverrides.TextOutsideExtensions = sreader.ReadBit();
                //B : DIMSAH
                header.DimensionStyleOverrides.SeparateArrowBlocks = sreader.ReadBit();
                //B : DIMTIX
                header.DimensionStyleOverrides.TextInsideExtensions = sreader.ReadBit();
                //B : DIMSOXD
                header.DimensionStyleOverrides.SuppressOutsideExtensions = sreader.ReadBit();
                //RC : DIMALTD
                header.DimensionStyleOverrides.AlternateUnitDecimalPlaces = (short)sreader.ReadRawChar();
                //RC : DIMZIN
                header.DimensionStyleOverrides.ZeroHandling = (Tables.ZeroHandling)sreader.ReadRawChar();
                //B : DIMSD1
                header.DimensionStyleOverrides.SuppressFirstDimensionLine = sreader.ReadBit();
                //B : DIMSD2
                header.DimensionStyleOverrides.SuppressSecondDimensionLine = sreader.ReadBit();
                //RC : DIMTOLJ
                header.DimensionStyleOverrides.ToleranceAlignment = (Tables.ToleranceAlignment)sreader.ReadRawChar();
                //RC : DIMJUST
                header.DimensionStyleOverrides.TextHorizontalAlignment = (Tables.DimensionTextHorizontalAlignment)sreader.ReadRawChar();
                //RC : DIMFIT
                header.DimensionStyleOverrides.DimensionFit = sreader.ReadRawChar();
                //B : DIMUPT
                header.DimensionStyleOverrides.CursorUpdate = sreader.ReadBit();
                //RC : DIMTZIN
                header.DimensionStyleOverrides.ToleranceZeroHandling = (Tables.ZeroHandling)sreader.ReadRawChar();
                //RC: DIMALTZ
                header.DimensionStyleOverrides.AlternateUnitZeroHandling = (Tables.ZeroHandling)sreader.ReadRawChar();
                //RC : DIMALTTZ
                header.DimensionStyleOverrides.AlternateUnitToleranceZeroHandling = (Tables.ZeroHandling)sreader.ReadRawChar();
                //RC : DIMTAD
                header.DimensionStyleOverrides.TextVerticalAlignment = (Tables.DimensionTextVerticalAlignment)sreader.ReadRawChar();
                //BS : DIMUNIT
                header.DimensionStyleOverrides.DimensionUnit = sreader.ReadBitShort();
                //BS : DIMAUNIT
                header.DimensionStyleOverrides.AngularDimensionDecimalPlaces = sreader.ReadBitShort();
                //BS : DIMDEC
                header.DimensionStyleOverrides.DecimalPlaces = sreader.ReadBitShort();
                //BS : DIMTDEC
                header.DimensionStyleOverrides.ToleranceDecimalPlaces = sreader.ReadBitShort();
                //BS : DIMALTU
                header.DimensionStyleOverrides.AlternateUnitFormat = (LinearUnitFormat)sreader.ReadBitShort();
                //BS : DIMALTTD
                header.DimensionStyleOverrides.AlternateUnitToleranceDecimalPlaces = sreader.ReadBitShort();
                //H : DIMTXSTY(hard pointer)
                objectPointers.DIMTXSTY = sreader.HandleReference();
            }

            //Common:
            //BD: DIMSCALE
            header.DimensionStyleOverrides.ScaleFactor = sreader.ReadBitDouble();
            //BD : DIMASZ
            header.DimensionStyleOverrides.ArrowSize = sreader.ReadBitDouble();
            //BD : DIMEXO
            header.DimensionStyleOverrides.ExtensionLineOffset = sreader.ReadBitDouble();
            //BD : DIMDLI
            header.DimensionStyleOverrides.DimensionLineIncrement = sreader.ReadBitDouble();
            //BD : DIMEXE
            header.DimensionStyleOverrides.ExtensionLineExtension = sreader.ReadBitDouble();
            //BD : DIMRND
            header.DimensionStyleOverrides.Rounding = sreader.ReadBitDouble();
            //BD : DIMDLE
            header.DimensionStyleOverrides.DimensionLineExtension = sreader.ReadBitDouble();
            //BD : DIMTP
            header.DimensionStyleOverrides.PlusTolerance = sreader.ReadBitDouble();
            //BD : DIMTM
            header.DimensionStyleOverrides.MinusTolerance = sreader.ReadBitDouble();

            //R2007 + Only:
            if (R2007Plus)
            {
                //BD: DIMFXL
                header.DimensionStyleOverrides.FixedExtensionLineLength = sreader.ReadBitDouble();
                //BD : DIMJOGANG
                header.DimensionStyleOverrides.JoggedRadiusDimensionTransverseSegmentAngle = sreader.ReadBitDouble();
                //BS : DIMTFILL
                header.DimensionStyleOverrides.TextBackgroundFillMode = (Tables.DimensionTextBackgroundFillMode)sreader.ReadBitShort();
                //CMC : DIMTFILLCLR
                header.DimensionStyleOverrides.TextBackgroundColor = sreader.ReadCmColor();
            }

            //R2000 + Only:
            if (R2000Plus)
            {
                //B: DIMTOL
                header.DimensionStyleOverrides.GenerateTolerances = sreader.ReadBit();
                //B : DIMLIM
                header.DimensionStyleOverrides.LimitsGeneration = sreader.ReadBit();
                //B : DIMTIH
                header.DimensionStyleOverrides.TextInsideHorizontal = sreader.ReadBit();
                //B : DIMTOH
                header.DimensionStyleOverrides.TextOutsideHorizontal = sreader.ReadBit();
                //B : DIMSE1
                header.DimensionStyleOverrides.SuppressFirstExtensionLine = sreader.ReadBit();
                //B : DIMSE2
                header.DimensionStyleOverrides.SuppressSecondExtensionLine = sreader.ReadBit();
                //BS : DIMTAD
                header.DimensionStyleOverrides.TextVerticalAlignment = (Tables.DimensionTextVerticalAlignment)(char) sreader.ReadBitShort();
                //BS : DIMZIN
                header.DimensionStyleOverrides.ZeroHandling = (Tables.ZeroHandling)(char) sreader.ReadBitShort();
                //BS : DIMAZIN
                header.DimensionStyleOverrides.AngularZeroHandling = (Tables.ZeroHandling)sreader.ReadBitShort();
            }

            //R2007 + Only:
            if (R2007Plus)
            {
                //BS: DIMARCSYM
                header.DimensionStyleOverrides.ArcLengthSymbolPosition = (Tables.ArcLengthSymbolPosition)sreader.ReadBitShort();
            }

            //Common:
            //BD: DIMTXT
            header.DimensionStyleOverrides.TextHeight = sreader.ReadBitDouble();
            //BD : DIMCEN
            header.DimensionStyleOverrides.CenterMarkSize = sreader.ReadBitDouble();
            //BD: DIMTSZ
            header.DimensionStyleOverrides.TickSize = sreader.ReadBitDouble();
            //BD : DIMALTF
            header.DimensionStyleOverrides.AlternateUnitScaleFactor = sreader.ReadBitDouble();
            //BD : DIMLFAC
            header.DimensionStyleOverrides.LinearScaleFactor = sreader.ReadBitDouble();
            //BD : DIMTVP
            header.DimensionStyleOverrides.TextVerticalPosition = sreader.ReadBitDouble();
            //BD : DIMTFAC
            header.DimensionStyleOverrides.ToleranceScaleFactor = sreader.ReadBitDouble();
            //BD : DIMGAP
            header.DimensionStyleOverrides.DimensionLineGap = sreader.ReadBitDouble();

            //R13 - R14 Only:
            if (R13_14Only)
            {
                //T: DIMPOST
                header.DimensionStyleOverrides.PostFix = sreader.ReadVariableText();
                //T : DIMAPOST
                header.DimensionStyleOverrides.AlternateDimensioningSuffix = sreader.ReadVariableText();
                //T : DIMBLK
                header.DimensionBlockName = sreader.ReadVariableText();
                //T : DIMBLK1
                header.DimensionBlockNameFirst = sreader.ReadVariableText();
                //T : DIMBLK2
                header.DimensionBlockNameSecond = sreader.ReadVariableText();
            }

            //R2000 + Only:
            if (R2000Plus)
            {
                //BD: DIMALTRND
                header.DimensionStyleOverrides.AlternateUnitRounding = sreader.ReadBitDouble();
                //B : DIMALT
                header.DimensionStyleOverrides.AlternateUnitDimensioning = sreader.ReadBit();
                //BS : DIMALTD
                header.DimensionStyleOverrides.AlternateUnitDecimalPlaces = (short)(char)sreader.ReadBitShort();
                //B : DIMTOFL
                header.DimensionStyleOverrides.TextOutsideExtensions = sreader.ReadBit();
                //B : DIMSAH
                header.DimensionStyleOverrides.SeparateArrowBlocks = sreader.ReadBit();
                //B : DIMTIX
                header.DimensionStyleOverrides.TextInsideExtensions = sreader.ReadBit();
                //B : DIMSOXD
                header.DimensionStyleOverrides.SuppressOutsideExtensions = sreader.ReadBit();
            }

            //Common:
            //CMC: DIMCLRD
            header.DimensionStyleOverrides.DimensionLineColor = sreader.ReadCmColor();
            //CMC : DIMCLRE
            header.DimensionStyleOverrides.ExtensionLineColor = sreader.ReadCmColor();
            //CMC : DIMCLRT
            header.DimensionStyleOverrides.TextColor = sreader.ReadCmColor();

            //R2000 + Only:
            if (R2000Plus)
            {
                //BS: DIMADEC
                header.DimensionStyleOverrides.AngularDimensionDecimalPlaces = sreader.ReadBitShort();
                //BS : DIMDEC
                header.DimensionStyleOverrides.DecimalPlaces = sreader.ReadBitShort();
                //BS : DIMTDEC
                header.DimensionStyleOverrides.ToleranceDecimalPlaces = sreader.ReadBitShort();
                //BS : DIMALTU
                header.DimensionStyleOverrides.AlternateUnitFormat = (LinearUnitFormat)sreader.ReadBitShort();
                //BS : DIMALTTD
                header.DimensionStyleOverrides.AlternateUnitToleranceDecimalPlaces = sreader.ReadBitShort();
                //BS : DIMAUNIT
                header.DimensionStyleOverrides.AngularDimensionDecimalPlaces = sreader.ReadBitShort();
                //BS : DIMFRAC
                header.DimensionStyleOverrides.FractionFormat = (Tables.FractionFormat)sreader.ReadBitShort();
                //BS : DIMLUNIT
                header.DimensionStyleOverrides.LinearUnitFormat = (LinearUnitFormat)sreader.ReadBitShort();
                //BS : DIMDSEP
                header.DimensionStyleOverrides.DecimalSeparator = (char)sreader.ReadBitShort();
                //BS : DIMTMOVE
                header.DimensionStyleOverrides.TextMovement = (Tables.TextMovement)sreader.ReadBitShort();
                //BS : DIMJUST
                header.DimensionStyleOverrides.TextHorizontalAlignment = (Tables.DimensionTextHorizontalAlignment)(char) sreader.ReadBitShort();
                //B : DIMSD1
                header.DimensionStyleOverrides.SuppressFirstExtensionLine = sreader.ReadBit();
                //B : DIMSD2
                header.DimensionStyleOverrides.SuppressSecondExtensionLine = sreader.ReadBit();
                //BS : DIMTOLJ
                header.DimensionStyleOverrides.ToleranceAlignment = (Tables.ToleranceAlignment)(char) sreader.ReadBitShort();
                //BS : DIMTZIN
                header.DimensionStyleOverrides.ToleranceZeroHandling = (Tables.ZeroHandling)(char) sreader.ReadBitShort();
                //BS: DIMALTZ
                header.DimensionStyleOverrides.AlternateUnitZeroHandling = (Tables.ZeroHandling)(char) sreader.ReadBitShort();
                //BS : DIMALTTZ
                header.DimensionStyleOverrides.AlternateUnitToleranceZeroHandling = (Tables.ZeroHandling)(char) sreader.ReadBitShort();
                //B : DIMUPT
                header.DimensionStyleOverrides.CursorUpdate = sreader.ReadBit();
                //BS : DIMATFIT
                header.DimensionStyleOverrides.DimensionTextArrowFit = sreader.ReadBitShort();
            }

            //R2007 + Only:
            if (R2007Plus)
            {
                //B: DIMFXLON
                header.DimensionStyleOverrides.IsExtensionLineLengthFixed = sreader.ReadBit();
            }

            //R2010 + Only:
            if (R2010Plus)
            {
                //B: DIMTXTDIRECTION
                header.DimensionStyleOverrides.TextDirection = sreader.ReadBit() ? Tables.TextDirection.RightToLeft : Tables.TextDirection.LeftToRight;
                //BD : DIMALTMZF
                header.DimensionStyleOverrides.AltMzf = sreader.ReadBitDouble();
                //T : DIMALTMZS
                header.DimensionStyleOverrides.AltMzs = sreader.ReadVariableText();
                //BD : DIMMZF
                header.DimensionStyleOverrides.Mzf = sreader.ReadBitDouble();
                //T : DIMMZS
                header.DimensionStyleOverrides.Mzs = sreader.ReadVariableText();
            }

            //R2000 + Only:
            if (R2000Plus)
            {
                //H: DIMTXSTY(hard pointer)
                objectPointers.DIMTXSTY = sreader.HandleReference();
                //H: DIMLDRBLK(hard pointer)
                objectPointers.DIMLDRBLK = sreader.HandleReference();
                //H: DIMBLK(hard pointer)
                objectPointers.DIMBLK = sreader.HandleReference();
                //H: DIMBLK1(hard pointer)
                objectPointers.DIMBLK1 = sreader.HandleReference();
                //H: DIMBLK2(hard pointer)
                objectPointers.DIMBLK2 = sreader.HandleReference();
            }

            //R2007+ Only:
            if (R2007Plus)
            {
                //H : DIMLTYPE (hard pointer)
                objectPointers.DIMLTYPE = sreader.HandleReference();
                //H: DIMLTEX1(hard pointer)
                objectPointers.DIMLTEX1 = sreader.HandleReference();
                //H: DIMLTEX2(hard pointer)
                objectPointers.DIMLTEX2 = sreader.HandleReference();
            }

            //R2000+ Only:
            if (R2000Plus)
            {
                //BS: DIMLWD
                header.DimensionStyleOverrides.DimensionLineWeight = (LineweightType)sreader.ReadBitShort();
                //BS : DIMLWE
                header.DimensionStyleOverrides.ExtensionLineWeight = (LineweightType)sreader.ReadBitShort();
            }

            //H: BLOCK CONTROL OBJECT(hard owner)
            objectPointers.BLOCK_CONTROL_OBJECT = sreader.HandleReference();
            //H: LAYER CONTROL OBJECT(hard owner)
            objectPointers.LAYER_CONTROL_OBJECT = sreader.HandleReference();
            //H: STYLE CONTROL OBJECT(hard owner)
            objectPointers.STYLE_CONTROL_OBJECT = sreader.HandleReference();
            //H: LINETYPE CONTROL OBJECT(hard owner)
            objectPointers.LINETYPE_CONTROL_OBJECT = sreader.HandleReference();
            //H: VIEW CONTROL OBJECT(hard owner)
            objectPointers.VIEW_CONTROL_OBJECT = sreader.HandleReference();
            //H: UCS CONTROL OBJECT(hard owner)
            objectPointers.UCS_CONTROL_OBJECT = sreader.HandleReference();
            //H: VPORT CONTROL OBJECT(hard owner)
            objectPointers.VPORT_CONTROL_OBJECT = sreader.HandleReference();
            //H: APPID CONTROL OBJECT(hard owner)
            objectPointers.APPID_CONTROL_OBJECT = sreader.HandleReference();
            //H: DIMSTYLE CONTROL OBJECT(hard owner)
            objectPointers.DIMSTYLE_CONTROL_OBJECT = sreader.HandleReference();

            //R13 - R15 Only:
            if (R13_15Only)
            {
                //H: VIEWPORT ENTITY HEADER CONTROL OBJECT(hard owner)
                objectPointers.VIEWPORT_ENTITY_HEADER_CONTROL_OBJECT = sreader.HandleReference();
            }

            //Common:
            //H: DICTIONARY(ACAD_GROUP)(hard pointer)
            objectPointers.DICTIONARY_ACAD_GROUP = sreader.HandleReference();
            //H: DICTIONARY(ACAD_MLINESTYLE)(hard pointer)
            objectPointers.DICTIONARY_ACAD_MLINESTYLE = sreader.HandleReference();

            //H : DICTIONARY (NAMED OBJECTS) (hard owner)
            objectPointers.DICTIONARY_NAMED_OBJECTS = sreader.HandleReference();

            //R2000+ Only:
            if (R2000Plus)
            {
                //BS: TSTACKALIGN, default = 1(not present in DXF)
                header.StackedTextAlignment = sreader.ReadBitShort();
                //BS: TSTACKSIZE, default = 70(not present in DXF)
                header.StackedTextSizePercentage = sreader.ReadBitShort();

                //TV: HYPERLINKBASE
                header.HyperLinkBase = sreader.ReadVariableText();
                //TV : STYLESHEET
                header.StyleSheetName = sreader.ReadVariableText();

                //H : DICTIONARY(LAYOUTS)(hard pointer)
                objectPointers.DICTIONARY_LAYOUTS = sreader.HandleReference();
                //H: DICTIONARY(PLOTSETTINGS)(hard pointer)
                objectPointers.DICTIONARY_PLOTSETTINGS = sreader.HandleReference();
                //H: DICTIONARY(PLOTSTYLES)(hard pointer)
                objectPointers.DICTIONARY_PLOTSTYLES = sreader.HandleReference();
            }

            //R2004 +:
            if (R2004Plus)
            {
                //H: DICTIONARY (MATERIALS) (hard pointer)
                objectPointers.DICTIONARY_MATERIALS = sreader.HandleReference();
                //H: DICTIONARY (COLORS) (hard pointer)
                objectPointers.DICTIONARY_COLORS = sreader.HandleReference();
            }

            //R2007 +:
            if (R2007Plus)
            {
                //H: DICTIONARY(VISUALSTYLE)(hard pointer)
                objectPointers.DICTIONARY_VISUALSTYLE = sreader.HandleReference();

                //R2013+:
                if (this.R2013Plus)
                {
                    //H : UNKNOWN (hard pointer)
                    objectPointers.DICTIONARY_VISUALSTYLE = sreader.HandleReference();
                }
            }

            //R2000 +:
            if (R2000Plus)
            {
                //BL: Flags:
                int flags = sreader.ReadBitLong();
                //CELWEIGHT Flags & 0x001F
                header.CurrentEntityLineWeight = (short)(flags & 0x1F);
                //ENDCAPS Flags & 0x0060
                header.EndCaps = (short)(flags & 0x60);
                //JOINSTYLE Flags & 0x0180
                header.JoinStyle = (short)(flags & 0x180);
                //LWDISPLAY!(Flags & 0x0200)
                header.DisplayLineWeight = (short)(flags & 0x200);
                //XEDIT!(Flags & 0x0400)
                header.XEdit = (short)(flags & 0x400);
                //EXTNAMES Flags & 0x0800
                header.ExtendedNames = (short)(flags & 0x800);
                //PSTYLEMODE Flags & 0x2000
                header.PlotStyleMode = (short)(flags & 0x2000);
                //OLESTARTUP Flags & 0x4000
                header.LoadOLEObject = (short)(flags & 0x4000);

                //BS: INSUNITS
                header.InsUnits = sreader.ReadBitShort();
                //BS : CEPSNTYPE
                header.CurrentEntityPlotStyleType = sreader.ReadBitShort();

                if (header.CurrentEntityPlotStyleType == 3)
                {
                    //H: CPSNID(present only if CEPSNTYPE == 3) (hard pointer)
                    objectPointers.CPSNID = sreader.HandleReference();
                }

                //TV: FINGERPRINTGUID
                header.FingerPrintGuid = sreader.ReadVariableText();
                //TV : VERSIONGUID
                header.VersionGuid = sreader.ReadVariableText();
            }

            //R2004 +:
            if (R2004Plus)
            {
                //RC: SORTENTS
                header.EntitySortingFlags = (ObjectSortingFlags)sreader.ReadByte();
                //RC : INDEXCTL
                header.IndexCreationFlags = sreader.ReadByte();
                //RC : HIDETEXT
                header.HideText = sreader.ReadByte();
                //RC : XCLIPFRAME, before R2010 the value can be 0 or 1 only.
                header.ExternalReferenceClippingBoundaryType = sreader.ReadByte();
                //RC : DIMASSOC
                header.DimensionAssociativity = (DimensionAssociation)sreader.ReadByte();
                //RC : HALOGAP
                header.HaloGapPercentage = sreader.ReadByte();
                //BS : OBSCUREDCOLOR
                header.ObscuredColor = new Color(sreader.ReadBitShort());
                //BS : INTERSECTIONCOLOR
                header.InterfereColor = new Color(sreader.ReadBitShort());
                //RC : OBSCUREDLTYPE
                header.ObscuredType = sreader.ReadByte();
                //RC: INTERSECTIONDISPLAY
                header.IntersectionDisplay = sreader.ReadByte();

                //TV : PROJECTNAME
                header.ProjectName = sreader.ReadVariableText();
            }

            //Common:
            //H: BLOCK_RECORD(*PAPER_SPACE)(hard pointer)
            objectPointers.PAPER_SPACE = sreader.HandleReference();
            //H: BLOCK_RECORD(*MODEL_SPACE)(hard pointer)
            objectPointers.MODEL_SPACE = sreader.HandleReference();
            //H: LTYPE(BYLAYER)(hard pointer)
            objectPointers.BYLAYER = sreader.HandleReference();
            //H: LTYPE(BYBLOCK)(hard pointer)
            objectPointers.BYBLOCK = sreader.HandleReference();
            //H: LTYPE(CONTINUOUS)(hard pointer)
            objectPointers.CONTINUOUS = sreader.HandleReference();

            //R2007 +:
            if (R2007Plus)
            {
                //B: CAMERADISPLAY
                header.CameraDisplayObjects = sreader.ReadBit();

                //BL : unknown
                sreader.ReadBitLong();
                //BL : unknown
                sreader.ReadBitLong();
                //BD : unknown
                sreader.ReadBitDouble();

                //BD : STEPSPERSEC
                header.StepsPerSecond = sreader.ReadBitDouble();
                //BD : STEPSIZE
                header.StepSize = sreader.ReadBitDouble();
                //BD : 3DDWFPREC
                header.Dw3DPrecision = sreader.ReadBitDouble();
                //BD : LENSLENGTH
                header.LensLength = sreader.ReadBitDouble();
                //BD : CAMERAHEIGHT
                header.CameraHeight = sreader.ReadBitDouble();
                //RC : SOLIDHIST
                header.SolidsRetainHistory = sreader.ReadRawChar();
                //RC : SHOWHIST
                header.ShowSolidsHistory = sreader.ReadRawChar();
                //BD : PSOLWIDTH
                header.SweptSolidWidth = sreader.ReadBitDouble();
                //BD : PSOLHEIGHT
                header.SweptSolidHeight = sreader.ReadBitDouble();
                //BD : LOFTANG1
                header.DraftAngleFirstCrossSection = sreader.ReadBitDouble();
                //BD : LOFTANG2
                header.DraftAngleSecondCrossSection = sreader.ReadBitDouble();
                //BD : LOFTMAG1
                header.DraftMagnitudeFirstCrossSection = sreader.ReadBitDouble();
                //BD : LOFTMAG2
                header.DraftMagnitudeSecondCrossSection = sreader.ReadBitDouble();
                //BS : LOFTPARAM
                header.SolidLoftedShape = sreader.ReadBitShort();
                //RC : LOFTNORMALS
                header.LoftedObjectNormals = sreader.ReadRawChar();
                //BD : LATITUDE
                header.Latitude = sreader.ReadBitDouble();
                //BD : LONGITUDE
                header.Longitude = sreader.ReadBitDouble();
                //BD : NORTHDIRECTION
                header.NorthDirection = sreader.ReadBitDouble();
                //BL : TIMEZONE
                header.TimeZone = sreader.ReadBitLong();
                //RC : LIGHTGLYPHDISPLAY
                header.DisplayLightGlyphs = sreader.ReadRawChar();
                //RC : TILEMODELIGHTSYNCH	??
                sreader.ReadRawChar();
                //RC : DWFFRAME
                header.DwgUnderlayFramesVisibility = sreader.ReadRawChar();
                //RC : DGNFRAME
                header.DgnUnderlayFramesVisibility = sreader.ReadRawChar();

                //B : unknown
                sreader.ReadBit();

                //CMC : INTERFERECOLOR
                header.InterfereColor = sreader.ReadCmColor();

                //H : INTERFEREOBJVS(hard pointer)
                objectPointers.INTERFEREOBJVS = sreader.HandleReference();
                //H: INTERFEREVPVS(hard pointer)
                objectPointers.INTERFEREVPVS = sreader.HandleReference();
                //H: DRAGVS(hard pointer)
                objectPointers.DRAGVS = sreader.HandleReference();

                //RC: CSHADOW
                header.ShadowMode = sreader.ReadByte();
                //BD : unknown
                header.ShadowPlaneLocation = sreader.ReadBitDouble();
            }

            //Set the position at the end of the section
            _mainReader.SetPositionInBits(initialPos + size * 8);
            _mainReader.ResetShift();

            //Ending sentinel: 0x30,0x84,0xE0,0xDC,0x02,0x21,0xC7,0x56,0xA0,0x83,0x97,0x47,0xB1,0x92,0xCC,0xA0
            var endsn = _mainReader.ReadSentinel();

            return(header);
        }