2013-11-22 43 views
0

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

这对我是如何发现非实体对象格式:

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

你的问题到底是什么@Denish Kosov ???????它是否相关?????? –

回答

0

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

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