Как узнать о наличии в чертеже прокси-объектов?

Автор Тема: Как узнать о наличии в чертеже прокси-объектов?  (Прочитано 8497 раз)

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Встал вопрос проверки наличия в чертеже прокси объектов. Пол интернета уже облазил - единственное, что пока приходит на ум - итерация по всем объектам базы с проверкой что это прокси объекты. Но ведь когда чертеж открывается, то автокад моментально сообщает о наличии прокси. Значит эта информация хранится в БД. Как ее получить?

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В общем, листая различные ссылки, остановился на варианте итерации по объектам в файле. Опираясь на эту запись сделал себе такой метод:
Код - C# [Выбрать]
  1. public static bool HasProxyEntities(string file)
  2. {
  3.     if (!File.Exists(file)) return false;
  4.     var db = new Database(false, true);
  5.     db.ReadDwgFile(file, FileShare.Read, true,string.Empty);
  6.     using (var tr = db.TransactionManager.StartTransaction())
  7.     {
  8.         var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  9.         foreach (var objectId in bt)
  10.         {
  11.             var btr = tr.GetObject(objectId, OpenMode.ForRead) as BlockTableRecord;
  12.             foreach (var objId in btr)
  13.             {
  14.                 var ent = tr.GetObject(objId, OpenMode.ForRead) as Entity;
  15.                 if (ent.IsAProxy)
  16.                     return true;
  17.             }
  18.         }
  19.     }
  20.     return false;
  21. }

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63

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

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр Ривилис, я видел Ваш комментарий в той теме, на которую ссылку давал. Но я еще не разу ни сталкивался с полной проверкой БД. Даже не знаю с чего начать и что должно быть

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Почитай тему: http://adn-cis.org/forum/index.php?topic=1060.0 Там есть ответы на твои вопросы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр Ривилис, без зазрения совести взял ваш код из ссылки)) Думаю, вы совершенно не против ;)
Получилось так:
Код - C# [Выбрать]
  1. public static bool HasProxyEntities(string file)
  2. {
  3.     // Взято у Александра Ривилиса - http://adn-cis.org/forum/index.php?topic=1060.msg5017#msg5017
  4.     if (!File.Exists(file)) return false;
  5.     var db = new Database(false, true);
  6.     db.ReadDwgFile(file, FileShare.Read, true, string.Empty);
  7.     Handle firstHandle = db.BlockTableId.Handle;  // Первая метка объекта - метка таблицы блоков
  8.     Handle lastHandle = db.Handseed;              // Следующая после последней метки
  9.     int nObjects = db.ApproxNumObjects;           // Приблизительное количество объектов в базе
  10.     string bufferLast = lastHandle.ToString();
  11.     string bufferFirst = firstHandle.ToString();
  12.     Int64 iLast = Int64.Parse(bufferLast, System.Globalization.NumberStyles.HexNumber);
  13.     Int64 iFirst = Int64.Parse(bufferFirst, System.Globalization.NumberStyles.HexNumber);
  14.  
  15.     using (var tr = db.TransactionManager.StartTransaction())
  16.     {
  17.         for (Int64 i = iFirst; i < iLast && nObjects > 0; i++)
  18.         {
  19.             Handle h = new Handle(i);
  20.             ObjectId id = ObjectId.Null;
  21.             if (db.TryGetObjectId(h, out id))
  22.             {
  23.                 try
  24.                 {
  25.                     DBObject dbObj = tr.GetObject(id, OpenMode.ForRead, true, true);
  26.                     if (dbObj != null && !dbObj.IsErased && dbObj.IsAProxy)
  27.                     {
  28.                         return true;
  29.                     }
  30.                     nObjects--;
  31.                 }
  32.                 catch
  33.                 {
  34.                     //ignored
  35.                 }
  36.             }
  37.         }
  38.         tr.Commit();
  39.     }
  40.     return false;
  41. }

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

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

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
если я правильно понял идею...
Код - C# [Выбрать]
  1.         public static bool HasProxyEntities(string file)
  2.         {
  3.            if (!File.Exists(file)) return false;
  4.             var db = new Db.Database(false, true);
  5.             db.ReadDwgFile(file, FileShare.Read, true, string.Empty);
  6.             Db.Handle firstHandle = db.BlockTableId.Handle;  // Первая метка объекта - метка таблицы блоков
  7.             Db.Handle lastHandle = db.Handseed;              // Следующая после последней метки
  8.             int nObjects = db.ApproxNumObjects;           // Приблизительное количество объектов в базе
  9.             Int64 iLast = Int64.Parse(lastHandle.ToString(), System.Globalization.NumberStyles.HexNumber);
  10.             Int64 iFirst = Int64.Parse(firstHandle.ToString(), System.Globalization.NumberStyles.HexNumber);
  11.  
  12.             for (Int64 i = iFirst; i < iLast && nObjects > 0; i++)
  13.             {
  14.                 Db.ObjectId id = db.GetObjectId(false, new Db.Handle(i), 0);
  15.                 bool isProxyObject = id.ObjectClass.IsDerivedFrom(Rtm.RXClass.GetClass(typeof(Db.ProxyObject)));
  16.                 bool isProxyEntity = id.ObjectClass.IsDerivedFrom(Rtm.RXClass.GetClass(typeof(Db.ProxyEntity)));
  17.                 if (!id.IsNull && !id.IsErased &&
  18.                     !id.IsEffectivelyErased && !isProxyObject &&
  19.                     !isProxyEntity && id.IsResident && id.IsValid)
  20.                     return true;
  21.             }
  22.             return false;
  23.         }
  24.  

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
А случайно вот это:
Код - C# [Выбрать]
  1. Int64.Parse(lastHandle.ToString(), System.Globalization.NumberStyles.HexNumber)
не то же самое, что:
Код - C# [Выбрать]
  1.  lastHandle.Value
?
А зачем проверка:
Код - C# [Выбрать]
  1. nObjects > 0
выполняется в условии цикла, если в теле цикла это значение не меняется?

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Как ни странно, но вариант проверки ВСЕГО мне не подходит) Вариант проверки только на наличие прокси примитивов в моем случае лучше. Ну это касаемо уже потребностей моей функции

Если создать файл в 2017 автокаде и сохранить его в 2010 версию, то в автокаде 2010 у этого файла уже появятся прокси объекты (не примитивы)