Есть ли какое-то ограничение на количество одновременно открытых объектов?

Автор Тема: Есть ли какое-то ограничение на количество одновременно открытых объектов?  (Прочитано 18168 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
По куску несколько вопросов возникает: после  "as AcDb.Entity;" нужно проверять на null, т.к. нет гарантии, что это Entity.
100%. Я с этим сталкивался.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Кстати, BlockReference.Name открывает соответствующий BlockTableRecord и уже оттуда берёт Name.
Ну вот и возможная причина eAtMaxReaders, т.к. может быть большое количество однотипных блоков.

Очень надеюсь, что в этом коде всё чисто и он сколько раз открывает, столько раз и закрывает.
А он это кто? Кто по идее должен закрывать BlockTableRecord, свойство BlockReference.Name, транзакция или в коде отдельно нужно дополнительно дописывать закрытие BlockTableRecord?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А он это кто?
Он - это код метода/свойства BlockReference.Name. В этом методе транзакция не используется. Там всё на Open/Close, но код достаточно запутанный,  так что на 100% я не уверен, что в нём на каждый Open найдётся его Close. Но по логике всё должно быть внутри него и внешний Close не требуется.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
1. Стоит поискать объекты, которые вызывают вылеты при Explode.
Может не все, что содержится после Explode стоит добавлять в текущее пространство.
Всегда разные объекты. Вылеты нестабильны. На одном и том же чертеже с одними и теми же объектами может корректно отработать, а может споткнуться. У меня сложилось впечатление, что это не объекты вызывают вылет при Explode, а какие-то скрытые внутренние дефекты.
Код скорее всего кусок из реального кода?
Да.
после  "as AcDb.Entity;" нужно проверять на null, т.к. нет гарантии, что это Entity.
В коде есть проверка на BlockReference. Если в неё придёт null, то она вернёт false. Дополнительно на null проверять будет излишним.
...далее ты хочешь работать с BlockReference, но внешние ссылки это тоже BlockReference и Table унаследован от BlockReference  и кто знает, может в Civil имеются еще объекты унаследованные от BlockReference. Возможно они вызывают ошибки с Explode.
В коде обрабатываются объекты, полученные после первого взрыва объекта Civil 3D. Поэтому, там не может быть ни таблиц ни внешних ссылок. Может быть анонимный блок - если используется базовый метод Explode, либо простые примитивы - если был взорван объект, для которого я переопределил Explode через TransformOverrule.
внутри динамических блоков могут содержаться операции и параметры, можно посмотреть, что остается после explode динамических блоков.
Динамические блоки не взрываю. Только объекты Civil 3D.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Кстати, BlockReference.Name открывает соответствующий BlockTableRecord и уже оттуда берёт Name. Очень надеюсь, что в этом коде всё чисто и он сколько раз открывает, столько раз и закрывает.
Попробовать брать Name из BlockTableRecord? В смысле, самому его открывать-читать-закрывать.

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Хм, тогда получать имя нет смысла. Есть у BlockTableRecord нужное свойство:
Код - C# [Выбрать]
  1. bool isAnonBlk = false;
  2.  
  3. using (Transaction tr = db.TransactionManager.StartTransaction())
  4. {
  5.     AcDb.Entity firstExplodeObj = tr.GetObject
  6.         (firstExplodeObjId, OpenMode.ForRead, false, true) as AcDb.Entity;
  7.  
  8.     // Если это блок
  9.     if (firstExplodeObj is BlockReference blkRef)
  10.     {
  11.         BlockTableRecord blkRec = tr.GetObject
  12.             (blkRef.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  13.  
  14.         // и это анонимный блок
  15.         isAnonBlk = blkRec.IsAnonymous;
  16.     }
  17.  
  18.     tr.Commit();
  19. }
  20.  

Сейчас буду тестировать

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Не помогло. На третий раз выдало исключение.
Приложение не поддерживает оперативную (JIT)
отладку. Подробная информацию приводится в конце данного сообщения.

************** Текст исключения **************
Autodesk.AutoCAD.Runtime.Exception: eAtMaxReaders
   в Autodesk.AutoCAD.DatabaseServices.TransactionManager.GetObjectInternal(AcDbTransactionManager* pTM, ObjectId id, OpenMode mode, Boolean openErased, Boolean forceOpenOnLockedLayer)
   в Autodesk.AutoCAD.DatabaseServices.Transaction.GetObject(ObjectId id, OpenMode mode, Boolean openErased, Boolean forceOpenOnLockedLayer)
   в <...>.PViewObjectsData.ExplodeCivilObject(ObjectId id, ObjectId mSpaceId, Extents3d pViewExts, List`1 AllTmpObjectIds) в <...>\PViewObjectsData.cs:строка 208
   <...>
Чертёж был открыт непосредственно перед выполнением команды.
Видимо, проблема где-то до этого куска. Здесь просто она проявляется.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Видимо, проблема где-то до этого куска. Здесь просто она проявляется.
Ну да. Объект то уже открыт 255 раз до того. И видимо не в этом месте.
А как у тебя обстоят дела с обработчиками событий или Overrule? Не может быть что где-то там этот объект открывается и не всегда закрывается???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
А как у тебя обстоят дела с обработчиками событий или Overrule? Не может быть что где-то там этот объект открывается и не всегда закрывается???
Специально я такого не делал. Если только ошибка где-то... Но все другие инструменты работают нормально. Поэтому, предполагаю, что с этим всё в порядке.

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
В том смысле, что есть и обработчики событий и Overrule. Но они вроде как аккуратно работают и проблем не создают. Пробовал отключить обработку событий объектов базы данных - ситуация не изменилась, исключение выскакивает периодически. Overrule отключить не могу - мне надо чтобы работало с ним. Без него нет смысла в этой команде.
SPDS не ставил. Я же не враг самому себе  :)

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
В нём (или в них) ты что-нибудь открываешь (не важно - в транзакции или Open)?
Да. Например, при переопределении труб и колодцев на виде профиля. Чтобы получить нужные параметры, допустим, трубы, открываются на чтение: вид профиля, трасса вида профиля, труба в модели, присоединённые колодцы в модели и т.п. Открываются с помощью Open/Close с использованием через using.