Database.Handseed - очень большое значение.

Автор Тема: Database.Handseed - очень большое значение.  (Прочитано 8644 раз)

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

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Database.Handseed - очень большое значение.
« Ответ #15 : 25-06-2019, 08:14:30 »
То есть, при каждом сохранении-закрытии-открытии чертежа, Civil "накидывает" +50 объектов. Причём, похоже, что накидывает он их всегда в самый конец.
"накидывает" объекты даже чистый AutoCAD, даже если чертеж открыть-сохранить.
Объекты предполагаю всегда добавляются в конец, т.е. идет приращение Handle.

Поэтому, легко образуются вот такие "пустоты" из сотен миллионов чисел...
50 и сотен миллионов слишком отличаются, так что не из-за этого. Предполагаю что, при импорте точек и создании поверхности происходит основное накидывание Handle.

Обычно команда _WBLOCK всего чертежа позволяет исправить HANDSEED, но при этом вполне возможно, что метки промежуточных объектов тоже будут изменены.
_WBLOCK к сожалению не всегда применима, особенно к топографии, геологии, генпланам и т.д.

Команда _WBLOCK похоже основана на  WblockCloneObjects, клонирует объекты в новую БД и затем сохраняет. Естественно что Handle начинаются с начала.

Данная команда клонирует не все, может зависеть от версии, по крайней мере в 2010 не клонирует переменные исходного чертежа, системы координат(ПСК) , отображение слоев видовых экранов. Возможно не клонирует также порядок прорисовки объектов, фильтры слоев, словари и т.д. Для чистки большинства чертежей это хорошо, но для обозначенных выше типов чертежей плохо, что не клонирует систему координат, отображаемые слои видовых экранов и порядок прорисовки.

Т.е. если не расширили клонирование в _WBLOCK в последних версиях, то после создания клона чертежа, его лучше открыть и склонировать дополнительно то что нужно.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Database.Handseed - очень большое значение.
« Ответ #16 : 25-06-2019, 12:40:24 »
"накидывает" объекты даже чистый AutoCAD, даже если чертеж открыть-сохранить.
Объекты предполагаю всегда добавляются в конец, т.е. идет приращение Handle.
Да, скорее всего так и есть.
50 и сотен миллионов слишком отличаются, так что не из-за этого.
Ну я и не писал, что именно из-за этого  ;) Мысль была такая, что если уж на простом открытии-сохранении столько объектов добавляется (а впоследствии удаляется), то неудивительно что при долгой работе с чертежом в течение нескольких месяцев образуются такие пустоты и значение Handseed растёт до сотен миллионов.
Кстати, я проанализировал эти пустоты и выяснил, как значения эти фрагментированы в чертеже. Совсем маленькие промежутки я не учитывал, поставил ограничение - не менее 10000 "пустых" чисел (чего мелочиться-то?  ;D) и получил результат:
Команда: FINDHANDSEEDSGROUPS
Handseed value: 169059631
Empty space finded: from 168902180 to 168920706
Empty space finded: from 168824584 to 168838858
Empty space finded: from 168721414 to 168736519
Empty space finded: from 168697116 to 168708368
Empty space finded: from 168685672 to 168697050
Empty space finded: from 168655742 to 168666241
Empty space finded: from 168587469 to 168603814
Empty space finded: from 168522944 to 168534231
Empty space finded: from 151647956 to 168434286
Empty space finded: from 134803404 to 151589888
Empty space finded: from 117963460 to 134749484
Empty space finded: from 117906000 to 117934478
Empty space finded: from 101122047 to 117899263
Empty space finded: from 67421639 to 101113061
Empty space finded: from 33738858 to 67421638
Empty space finded: from 16901946 to 33738856
Empty space finded: from 119645 to 16896864
Empty space finded: from 15837 to 26444
То есть, промежутки в 16 млн - вполне нормальное явление  :D
_WBLOCK к сожалению не всегда применима, особенно к топографии, геологии, генпланам и т.д.
Да, на самом деле, я никогда не стану WBLOCK делать для чертежа Civil 3D. Он и в стандартных режимах работы иногда "разваливается", а уж такую нетипичную для него операцию он вряд ли переживёт.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Database.Handseed - очень большое значение.
« Ответ #17 : 25-06-2019, 12:41:57 »
О! Т.е. в сто раз. Неплохо!
А сможете угадать, что я переделал в одном из тех методов в первом посте, что дало основной прирост скорости?  :)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Database.Handseed - очень большое значение.
« Ответ #18 : 25-06-2019, 12:46:43 »
Да, на самом деле, я никогда не стану WBLOCK делать для чертежа Civil 3D. Он и в стандартных режимах работы иногда "разваливается", а уж такую нетипичную для него операцию он вряд ли переживёт.
У меня была несколько иная идея. Я смотрел в сторону Database.Wblock и получения IdMapping. В результирующей базе промежутков нет и в IdMapping есть информация об исходных Handle. Поэтому найдя в клонированной базе нужный элемент можно найти его оригинал в исходной базе. Но тестирование показало, что в AutoCAD .NET API (в отличие от ObjectARX) соответствующие события при Database.Wblock не срабатывают (хотя при команде _WBLOOCK срабатывают) и получить правильный IdMapping нельзя.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Database.Handseed - очень большое значение.
« Ответ #19 : 25-06-2019, 12:50:27 »
А сможете угадать, что я переделал в одном из тех методов в первом посте, что дало основной прирост скорости?  :)
О! Т.е. в сто раз. Неплохо!
А сможете угадать, что я переделал в одном из тех методов в первом посте, что дало основной прирост скорости?  :)
Предполагаю, что:
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Find a object in the database
  3. /// </summary>
  4. /// <typeparam name="T">Type of the object</typeparam>
  5. /// <param name="db">Database of the drawing</param>
  6. /// <param name="testFunction">Test function for identification of the object</param>
  7. /// <returns>ObjectId or ObjectId.Null if object is not found</returns>
  8. public static ObjectId FindObjectInDatabase<T>
  9.     (this Database db, Func<T, bool> testFunction) where T : DBObject
  10. {
  11.     Handle handseed = db.Handseed;
  12.  
  13.     long handseedTotal = handseed.Value;
  14.  
  15.     for (int i = 1; i < handseedTotal; i++)
  16.     {
  17.         ObjectId currentId = db.IdFromHandleValue(i);
  18.         if (currentId.IsNull) continue; // <-- Вот эта добавочка
  19.         if (!CheckObjectIdFor<T>(currentId)) continue;
  20.  
  21.         using (T obj = currentId.SafeOpen<T>())
  22.         {
  23.             if (testFunction(obj)) return currentId;
  24.         }
  25.     }
  26.  
  27.     return ObjectId.Null;
  28. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Database.Handseed - очень большое значение.
« Ответ #20 : 25-06-2019, 12:54:58 »
Ну, в общем-то, угадали! Только я это сделал в методе CheckObjectIdFor. Если точнее, то там есть такая проверка. Но сперва идёт получение RXClass, которое в сотнях миллионов случаев излишне и, как оказалось, является очень затратной операцией...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Database.Handseed - очень большое значение.
« Ответ #21 : 25-06-2019, 12:58:05 »
Ну, в общем-то, угадали!
Тут и гадать не нужно было. В первую очередь следовало отсечь невалидные ObjectId. Я еще вчера подумал, что у тебя не очень рационально это сделано. Но не думал, что прирост скорости будет столь значительным.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Database.Handseed - очень большое значение.
« Ответ #22 : 25-06-2019, 13:03:16 »
Я еще вчера подумал, что у тебя не очень рационально это сделано.
Это я ещё не выложил метод SafeOpen...  ::)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Database.Handseed - очень большое значение.
« Ответ #23 : 25-06-2019, 13:05:10 »
Я еще вчера подумал, что у тебя не очень рационально это сделано.
Это я ещё не выложил метод SafeOpen...  ::)
Там тоже проверка валидности ObjectId происходит не сразу? ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Database.Handseed - очень большое значение.
« Ответ #24 : 25-06-2019, 13:06:14 »
Там повторный вызов CheckObjectIdFor  8)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Database.Handseed - очень большое значение.
« Ответ #25 : 25-06-2019, 13:12:35 »
Там повторный вызов CheckObjectIdFor  8)
Главное, что ты уже разобрался!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение