Получить свойства dwg файла без его открытия

Автор Тема: Получить свойства dwg файла без его открытия  (Прочитано 7721 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Всем привет.
Мне нужно получить свойства dwg чертежа не открывая его при помощи AutoCAD.
Нашел очень полезную статью http://adn-cis.org/chtenie-svojstv-chertezha-(summaryinfo)-iz-vneshnego-prilozheniya.html
Но там пропускаются файлы версии 2000...2002
Цитировать
if (atoi(ACADVER+2) < 1018){  // AutoCAD R14,2000...2002 обрабатывать не будем
      _close(h);
      return 0;
}
Есть ли возможность получить свойства для пропущенных в данной статье версий?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Теоретически можно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Теоретически можно.
А можете мне помочь с решением моей проблемы. Если даже не все решение, хотя бы с какого байта в файле, что можно получить?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Насколько я помню там совсем другая структура. Я когда-то ковырялся в ней и забросил, так как это хак, а не документированная вещь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Насколько я помню там совсем другая структура. Я когда-то ковырялся в ней и забросил, так как это хак, а не документированная вещь.
Жаль. Видимо придется отлавливать файлы старой версии и просить проектировщиков пересохранять их (Но так делать очень не хотелось бы).

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Посмотри этот код: https://www.theswamp.org/index.php?topic=36419.msg416104#msg416104
Я его быстро нагуглил со смартфона.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Посмотри этот код: https://www.theswamp.org/index.php?topic=36419.msg416104#msg416104
Я его быстро нагуглил со смартфона.
Спасибо за ссылку, буду разбираться

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Перевел решение для 2010 на C#, но он не работает. На 61 строке после проверки происходит выход из цикла  :(
Код - C# [Выбрать]
  1. BinaryReader br = new BinaryReader(new FileStream(dwg.FullName, FileMode.Open, FileAccess.Read));
  2. char[] _versionId = br.ReadChars(6);
  3. string versionId = "";
  4. foreach(char ch in _versionId)
  5. {
  6.         versionId += ch;
  7. }
  8. if (!versionId.Equals("AC1015", StringComparison.InvariantCultureIgnoreCase))
  9. {
  10.         continue;
  11. }
  12. //  six bytes of 0 (in R14, 5 0’s and the ACADMAINTVER variable) and a byte of 1
  13. br.ReadBytes(7);
  14. //Image seeker
  15. int imageSeeker = br.ReadInt32();
  16. // Unknown section
  17. br.ReadBytes(2);
  18. // Dwgcodepage
  19. br.ReadBytes(2);
  20. int objectmapSeeker = 0;
  21. int count = br.ReadInt32();
  22. for (int i = 0; i < count; i++)
  23. {
  24.         byte recnum = br.ReadByte();
  25.         int seeker = br.ReadInt32();
  26.         int size = br.ReadInt32();
  27.         switch (recnum)
  28.         {
  29.                 case 0:
  30.                         //System.Diagnostics.Debug.Print("Header variables")
  31.                         break;
  32.                 case 1:
  33.                         //System.Diagnostics.Debug.Print("Class section")
  34.                         break;
  35.                 case 2:
  36.                         //System.Diagnostics.Debug.Print("Object map")
  37.                         objectmapSeeker = seeker;
  38.                         break;
  39.  
  40.                 case 3:
  41.                         //'System.Diagnostics.Debug.Print("Unknown")
  42.                         break;
  43.                 case 4:
  44.                         //'System.Diagnostics.Debug.Print("R14DATA")
  45.                         break;
  46.                 case 5:
  47.                         //System.Diagnostics.Debug.Print("R14REC5")
  48.                         break;
  49.                 default:
  50.                         continue;
  51.         }
  52. }
  53. br.BaseStream.Seek(imageSeeker, SeekOrigin.Begin);
  54. byte[] mask = new byte[] { 87, 71, 80, 82, 79, 80, 83, 32, 67, 79, 79, 75, 73, 69 };
  55. while (br.BaseStream.Position < objectmapSeeker)
  56. {
  57.         // Search DWGPROPS COOKIE
  58.         byte d = br.ReadByte();
  59.         if (d != 68)
  60.         {
  61.                 break;
  62.         }
  63.         byte[] test = br.ReadBytes(mask.Length);
  64.         bool temp = false;
  65.         for (int i = 0; i < mask.Length; i++)
  66.         {
  67.                 if (test[i] != mask[i])
  68.                 {
  69.                         br.BaseStream.Seek(-mask.Length, SeekOrigin.Current);
  70.                         temp = true;
  71.                         break;
  72.                 }
  73.         }
  74.         if (temp)
  75.         {
  76.                 break;
  77.         }
  78.         //------------------------------------------------------------
  79.         // Predefined properties, in this order:
  80.         // title, subject, author, comments, keywords,  
  81.         // lastSavedBy, revisionNumber
  82.         // DXF codes : 2, 3, 4, 6, 7, 8, 9
  83.         for (int i = 0; i < 7; i++)
  84.         {
  85.                 short code = br.ReadInt16();    // DXF code
  86.                 short len = br.ReadInt16();     // String lenght
  87.                 br.ReadByte(); // ?
  88.                 byte[] bytes = br.ReadBytes(len);
  89.                 string value = Encoding.ASCII.GetString(bytes);
  90.                 System.Diagnostics.Debug.Print(value);
  91.         }
  92.         //------------------------------------------------------------
  93.         // 10 custom properties in the format:
  94.         // <name=value>
  95.         // DXF codes : 300, 301, 302, 303, 304, 305, 306, 307, 308, 309
  96.         for (int i = 0; i < 10; i++)
  97.         {
  98.                 short code = br.ReadInt16();    // DXF code
  99.                 short len = br.ReadInt16();     // String lenght
  100.                 br.ReadByte(); // ?
  101.                 byte[] bytes = br.ReadBytes(len);
  102.                 string value = Encoding.ASCII.GetString(bytes);
  103.                 //Dim pairs() As String = value.Split(New Char() {"="c})
  104.                 System.Diagnostics.Debug.Print(value);
  105.         }
  106.         // Total editing time, Create date time and Modified
  107.         // date time in the format:
  108.         // <Julian day number>.<Decimal fraction of a day>
  109.         // DXF codes: 40, 41 ,42
  110.         for (int i = 0; i < 3; i++)
  111.         {
  112.                 short code = br.ReadInt16();    // DXF code
  113.                 double value = br.ReadDouble(); // Value
  114.                 System.Diagnostics.Debug.Print(value.ToString());
  115.         }
  116.         //------------------------------------------------------------
  117.         // hyperlinkBase
  118.         // DXF code: 1
  119.         short c = br.ReadInt16();   // DXF code
  120.         short l = br.ReadInt16();   // String lenght
  121.         br.ReadByte(); // ? Unknow
  122.         byte[] b = br.ReadBytes(l);
  123.         string v = Encoding.ASCII.GetString(b);
  124.         System.Diagnostics.Debug.Print(v);
  125.         //------------------------------------------------------------
  126. }
  127.  
  128.  
  129. KeyValuePair <string, string> TempHashSym;
  130. if (Guids.TryGetValue(guid, out TempHashSym) || NameDates.ContainsKey(nameDate))
  131. {
  132.         FilesArray.Remove(guid);
  133.         FileStatus = "Unchange";
  134.         if (TempHashSym.Value != string.Empty)
  135.         {
  136.                 CurrentHashSym = TempHashSym.Value;
  137.         }
  138.         else
  139.         {
  140.                 CurrentHashSym = Guids[NameDates[nameDate]].Value;
  141.         }
  142.         Log.Error(dwg.FullName + " Сохранена предыдущая версия из базы ");
  143.         result.Unchange.Add(dwg.FullName, new FilesState.FileInform(dwg.FullName, tempFullName, CurrentHashSym, directory));
  144. }
  145. else
  146. {
  147.         continue;
  148. }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Перевел решение для 2010 на C#, но он не работает. На 61 строке после проверки происходит выход из цикла  :(
Плохо перевёл. Остальное я не смотрел, но в этой строке точно должно быть continue; вместо break;
И похоже это не единственное место.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Леонид Семенов 26-10-2017, 06:52:08

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Перевел решение для 2010 на C#, но он не работает. На 61 строке после проверки происходит выход из цикла  :(
Плохо перевёл. Остальное я не смотрел, но в этой строке точно должно быть continue; вместо break;
И похоже это не единственное место.
Спасибо большое, оказывается я еще в одном месте допустил ошибку. написал continue вместо return
Вот код, который работает  :)
Код - C# [Выбрать]
  1. void Method(string FullName)
  2. {
  3.         BinaryReader br = new BinaryReader(new FileStream(FullName, FileMode.Open, FileAccess.Read));
  4.         char[] _versionId = br.ReadChars(6);
  5.         string versionId = "";
  6.         foreach (char ch in _versionId)
  7.         {
  8.                 versionId += ch;
  9.         }
  10.         if (!versionId.Equals("AC1015", StringComparison.InvariantCultureIgnoreCase))
  11.         {
  12.                 return;
  13.         }
  14.         //  six bytes of 0 (in R14, 5 0’s and the ACADMAINTVER variable) and a byte of 1
  15.         br.ReadBytes(7);
  16.         //Image seeker
  17.         int imageSeeker = br.ReadInt32();
  18.         // Unknown section
  19.         br.ReadBytes(2);
  20.         // Dwgcodepage
  21.         br.ReadBytes(2);
  22.         int objectmapSeeker = 0;
  23.         int count = br.ReadInt32();
  24.         for (int i = 0; i < count; i++)
  25.         {
  26.                 byte recnum = br.ReadByte();
  27.                 int seeker = br.ReadInt32();
  28.                 int size = br.ReadInt32();
  29.                 switch (recnum)
  30.                 {
  31.                         case 0:
  32.                                 //System.Diagnostics.Debug.Print("Header variables")
  33.                                 break;
  34.                         case 1:
  35.                                 //System.Diagnostics.Debug.Print("Class section")
  36.                                 break;
  37.                         case 2:
  38.                                 //System.Diagnostics.Debug.Print("Object map")
  39.                                 objectmapSeeker = seeker;
  40.                                 break;
  41.                         case 3:
  42.                                 //'System.Diagnostics.Debug.Print("Unknown")
  43.                                 break;
  44.                         case 4:
  45.                                 //'System.Diagnostics.Debug.Print("R14DATA")
  46.                                 break;
  47.                         case 5:
  48.                                 //System.Diagnostics.Debug.Print("R14REC5")
  49.                                 break;
  50.                         default:
  51.                                 return;
  52.                 }
  53.         }
  54.         br.BaseStream.Seek(imageSeeker, SeekOrigin.Begin);
  55.         byte[] mask = new byte[] { 87, 71, 80, 82, 79, 80, 83, 32, 67, 79, 79, 75, 73, 69 };
  56.         while (br.BaseStream.Position < objectmapSeeker)
  57.         {
  58.                 // Search DWGPROPS COOKIE
  59.                 byte d = br.ReadByte();
  60.                 if (d != 68)
  61.                 {
  62.                         continue;
  63.                 }
  64.                 byte[] test = br.ReadBytes(mask.Length);
  65.                 bool temp = false;
  66.                 for (int i = 0; i < mask.Length; i++)
  67.                 {
  68.                         if (test[i] != mask[i])
  69.                         {
  70.                                 br.BaseStream.Seek(-mask.Length, SeekOrigin.Current);
  71.                                 temp = true;
  72.                                 break;
  73.                         }
  74.                 }
  75.                 if (temp)
  76.                 {
  77.                         continue;
  78.                 }
  79.                 //------------------------------------------------------------
  80.                 // Predefined properties, in this order:
  81.                 // title, subject, author, comments, keywords,  
  82.                 // lastSavedBy, revisionNumber
  83.                 // DXF codes : 2, 3, 4, 6, 7, 8, 9
  84.                 for (int i = 0; i < 7; i++)
  85.                 {
  86.                         short code = br.ReadInt16();    // DXF code
  87.                         short len = br.ReadInt16();     // String lenght
  88.                         br.ReadByte(); // ?
  89.                         byte[] bytes = br.ReadBytes(len);
  90.                         string value = Encoding.ASCII.GetString(bytes);
  91.                         System.Diagnostics.Debug.Print(value);
  92.                 }
  93.                 //------------------------------------------------------------
  94.                 // 10 custom properties in the format:
  95.                 // <name=value>
  96.                 // DXF codes : 300, 301, 302, 303, 304, 305, 306, 307, 308, 309
  97.                 for (int i = 0; i < 10; i++)
  98.                 {
  99.                         short code = br.ReadInt16();    // DXF code
  100.                         short len = br.ReadInt16();     // String lenght
  101.                         br.ReadByte(); // ?
  102.                         byte[] bytes = br.ReadBytes(len);
  103.                         string value = Encoding.ASCII.GetString(bytes);
  104.                         //Dim pairs() As String = value.Split(New Char() {"="c})
  105.                         System.Diagnostics.Debug.Print(value);
  106.                 }
  107.                 // Total editing time, Create date time and Modified
  108.                 // date time in the format:
  109.                 // <Julian day number>.<Decimal fraction of a day>
  110.                 // DXF codes: 40, 41 ,42
  111.                 for (int i = 0; i < 3; i++)
  112.                 {
  113.                         short code = br.ReadInt16();    // DXF code
  114.                         double value = br.ReadDouble(); // Value
  115.                         System.Diagnostics.Debug.Print(value.ToString());
  116.                 }
  117.                 //------------------------------------------------------------
  118.                 // hyperlinkBase
  119.                 // DXF code: 1
  120.                 short c = br.ReadInt16();   // DXF code
  121.                 short l = br.ReadInt16();   // String lenght
  122.                 br.ReadByte(); // ? Unknow
  123.                 byte[] b = br.ReadBytes(l);
  124.                 string v = Encoding.ASCII.GetString(b);
  125.                 System.Diagnostics.Debug.Print(v);
  126.         }
  127. }