.dwg文件的OpenDesign规范

时间:2013-11-22 07:04:46

标签: c# specifications dwg

我一直在使用.dwg文件的OpenDesign规范大约两周。现在,除了非实体对象和实体对象之外,我已经获得了所有信息。也许我无法理解这些信息是如何写的。具体而言,我需要知道如何区分非实体对象和实体对象。在C#上工作。第98页的http://opendesign.com/files/guestdownloads/OpenDesign_Specification_for_.dwg_files.pdf

这就是我发现非实体对象格式的方式:

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;
    }

1 个答案:

答案 0 :(得分:0)

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

根据我的经验,大多数类型 - 是实体对象。 我有对象的基类和一些heder阅读器。许多类型彼此延伸。 使用crc检查,检查你的证明。