0

I've been working with OpenDesign Specification for .dwg files about two weeks. And now, i've got all information except non-entity object and entity object. Maybe i can't understand how this information written. Concretely i need to know how to differ non-entity object and entity object. Work on C#. http://opendesign.com/files/guestdownloads/OpenDesign_Specification_for_.dwg_files.pdf on the page 98.

This is how i found out non-entity object format:

private bool ReadNonEntityObject(FileReader fileReader, DWGVersion version, long handle, long fileLoc)
    {
        long oldPos = fileReader.BufferPosition;

        BaseTypes bReader = new BaseTypes(fileReader);
        fileReader.SeekAbsolute(fileLoc);

        var size = bReader.GetModularShort();

        if (version.IsLaterOrEqual(DWGVersion.VersionEnum.R2010))
        {
            var HandleSize = bReader.GetModularChar(false);
        }

        var objectType = bReader.GetObjectType(version);
        Console.WriteLine(BitConverter.ToString(BitConverter.GetBytes(objectType), 0).Substring(0, 2));
        if (version.IsLaterOrEqual(DWGVersion.VersionEnum.R2000) && version.IsEarlier(DWGVersion.VersionEnum.R2010))
        {
            var ObjectSize = bReader.GetLongRaw();
        }

        var handl = bReader.GetHandle();

        if (handl != handle)
            throw new Exception("DWG file is corrupted or incorrect");

        var extendedSize = bReader.GetShort();
        int size1 = 0;
        bool isGraphic = fileReader.GetBits(1, true)[0];
        if (isGraphic)
            size1 = bReader.GetLongRaw();
        if (extendedSize != 0)
        {
            var appHandle = bReader.GetHandle();
            var endPos = fileReader.BufferPosition + extendedSize;

            string data = "";//DEBUG for testing

            while (fileReader.BufferPosition < endPos)
            {
                int byteCode = bReader.GetByteRaw();
                object val = null;
                switch (byteCode) //TODO add all byteCode
                {
                    case 0:
                        {
                            if (version.IsEarlier(DWGVersion.VersionEnum.R2007))
                            {
                                int N = bReader.GetByteRaw();
                                var codePage = bReader.GetShortRaw();
                                val = bReader.GetStringAscii(N);
                            }
                            if (version.IsLaterOrEqual(DWGVersion.VersionEnum.R2007))
                            {
                                //TODO
                            }
                        }
                        break;
                    case 1:
                        val = bReader.GetText();
                        break;
                    case 8:
                        {
                            break;
                        }
                    case 2:
                        val = bReader.GetCharAscii() == 0 ? '{' : '}';
                        break;
                    case 40:
                        bReader.Get3DDouble();
                        break;
                    case 145:
                        {
                            val = bReader.GetDouble();
                            break;
                        }
                    case 70:
                        val = bReader.GetShortRaw();
                        break;
                    case 71:
                        val = bReader.GetLongRaw();
                        break;
                    default:
                        val = "";
                        break;

                }
                data += val + " ";
                //Console.WriteLine(data);
            }
        }

        if (version.Equals(DWGVersion.VersionEnum.R13_R14))
        {
            var DataSize = bReader.GetLongRaw();
            var persistentNum = bReader.GetByteRaw();
        }
        if (version.IsLaterOrEqual(DWGVersion.VersionEnum.R2004))
        { 

        }

        fileReader.SeekAbsolute(oldPos);
        return true;
    }
4

1 回答 1

0

非实体对象中没有 isGraphic 位。仅限扩展数据。它是循环的,参见第 254 页。

以我的经验,大多数类型 - 是实体对象。我有对象的基类和一些 heder 阅读器。许多类型相互延伸。使用 crc 检查,用于检查您的证明。

于 2014-10-22T10:59:33.073 回答