Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        public DwgObject GetObject(BitReader reader, int handle, bool allowNull = false)
        {
            if (_handleToObject.TryGetValue(handle, out var obj))
            {
                return(obj);
            }

            if (_handleToOffset.TryGetValue(handle, out var offset))
            {
                obj = DwgObject.Parse(reader.FromOffset(offset), this, _version);
                if (obj == null && !allowNull)
                {
                    throw new DwgReadException($"Unsupported object from handle {handle} at offset {offset}.");
                }

                _handleToObject.Add(handle, obj);
                return(obj);
            }

            throw new DwgReadException($"Object with handle {handle} not found in object map.");
        }
Ejemplo n.º 3
0
        internal void ValidateSecondHeader(BitReader parentReader, DwgHeaderVariables headerVariables)
        {
            var reader = parentReader.FromOffset(SecondHeaderPointer);

            reader.ValidateSentinel(SecondHeaderStartSentinel);
            var sectionStart = reader.Offset;

            reader.StartCrcCheck();
            var reportedSectionSize = reader.Read_RL();
            var expectedLocation    = reader.Read_BL();

            if (expectedLocation != sectionStart - SecondHeaderStartSentinel.Length)
            {
                throw new DwgReadException("Reported second header location incorrect.");
            }

            var version = DwgVersionIdExtensions.VersionIdFromString(reader.ReadStringAscii(6));

            if (version != Version)
            {
                throw new DwgReadException("Inconsistent reported version.");
            }

            reader.ReadBytes(6);
            reader.Read_B();
            reader.Read_B();
            reader.Read_B();
            reader.Read_B();
            reader.ReadBytes(2);
            reader.ValidateBytes(SecondHeaderMidSentinel);

            var recordLocatorCount = reader.ReadByte();

            for (int i = 0; i < recordLocatorCount; i++)
            {
                var id      = reader.ReadByte();
                var pointer = reader.Read_BL();
                var length  = reader.Read_BL();

                if (pointer != 0)
                {
                    switch (i)
                    {
                    case 0:
                        HeaderVariablesLocator.ValidateLocator(id, pointer, length);
                        break;

                    case 1:
                        ClassSectionLocator.ValidateLocator(id, pointer, length);
                        break;

                    case 2:
                        ObjectMapLocator.ValidateLocator(id, pointer, length);
                        break;

                    case 3:
                        UnknownSection_R13C3AndLaterLocator.ValidateLocator(id, pointer, length);
                        break;

                    case 4:
                        UnknownSection_PaddingLocator.ValidateLocator(id, pointer, length);
                        break;
                    }
                }
            }

            var handleRecordCount = reader.Read_BS();

            for (int i = 0; i < handleRecordCount; i++)
            {
                var byteCount = reader.Read_RC();
                var id        = reader.Read_RC();
                var handle    = DwgHandleReference.ReadSecondHeader(reader, byteCount);

                if (byteCount > 0)
                {
                    if (id != i)
                    {
                        throw new DwgReadException("Invalid record handle ID.");
                    }

                    var actualHandle = -1;
                    switch (i)
                    {
                    case 0:
                        actualHandle = headerVariables.NextAvailableHandle.HandleOrOffset;
                        break;

                    case 1:
                        actualHandle = headerVariables.BlockControlObjectHandle.HandleOrOffset;
                        break;

                    case 2:
                        actualHandle = headerVariables.LayerControlObjectHandle.HandleOrOffset;
                        break;

                    case 3:
                        actualHandle = headerVariables.StyleObjectControlHandle.HandleOrOffset;
                        break;

                    case 4:
                        actualHandle = headerVariables.LineTypeObjectControlHandle.HandleOrOffset;
                        break;

                    case 5:
                        actualHandle = headerVariables.ViewControlObjectHandle.HandleOrOffset;
                        break;

                    case 6:
                        actualHandle = headerVariables.UcsControlObjectHandle.HandleOrOffset;
                        break;

                    case 7:
                        actualHandle = headerVariables.ViewPortControlObjectHandle.HandleOrOffset;
                        break;

                    case 8:
                        actualHandle = headerVariables.AppIdControlObjectHandle.HandleOrOffset;
                        break;

                    case 9:
                        actualHandle = headerVariables.DimStyleControlObjectHandle.HandleOrOffset;
                        break;

                    case 10:
                        actualHandle = headerVariables.ViewPortEntityHeaderControlObjectHandle.HandleOrOffset;
                        break;

                    case 11:
                        actualHandle = headerVariables.NamedObjectsDictionaryHandle.HandleOrOffset;
                        break;

                    case 12:
                        actualHandle = headerVariables.MLineStyleDictionaryHandle.HandleOrOffset;
                        break;

                    case 13:
                        actualHandle = headerVariables.GroupDictionaryHandle.HandleOrOffset;
                        break;
                    }

                    if (actualHandle > 0)
                    {
                        if (handle != actualHandle)
                        {
                            throw new DwgReadException($"Invalid record handle ID at location {i}.  Expected: {handle}, Actual: {actualHandle}");
                        }
                    }
                }
            }

            reader.ReadByte();
            reader.ValidateCrc(initialValue: DwgHeaderVariables.InitialCrcValue);
            var junkByteCount = Math.Max(0, reportedSectionSize - (reader.Offset - sectionStart));

            reader.SkipBytes(junkByteCount);
            reader.ValidateSentinel(SecondHeaderEndSentinel);

            var computedSectionSize = reader.Offset - sectionStart - SecondHeaderEndSentinel.Length;

            if (computedSectionSize != reportedSectionSize)
            {
                throw new DwgReadException($"Reported and actual second header sizes differ.  Expected: {reportedSectionSize}, Actual: {computedSectionSize}");
            }
        }