Валидность AcDbBlockTableRecordIterator

Автор Тема: Валидность AcDbBlockTableRecordIterator  (Прочитано 7772 раз)

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

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Бэкграунд:
1. Итерирую содержимое записи от позиции start() до позиции done().
2. Нахожу последний (предшествующий позиции done()) валидный итератор записи.
3. Сохраняю этот итератор в переменной LastIter.
4. Далее осуществляю добавление в запись неких новых объектов.

Задача:
Хочу считать из записи все последние добавленные объекты начиная с позиции ++LastIter.

Вопросы:
1. Сохранит ли валидность итератор LastIter после добавления в запись новых объектов?
2. Будет ли корректным такой вариант считывания всех новых данных с позиции ++LastIter до позиции done()?

Отмечено как Решение Debalance 17-11-2020, 15:35:00

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Валидность AcDbBlockTableRecordIterator
« Ответ #1 : 17-11-2020, 12:23:39 »
Вопросы:
1. Сохранит ли валидность итератор LastIter после добавления в запись новых объектов?
2. Будет ли корректным такой вариант считывания всех новых данных с позиции ++LastIter до позиции done()?
Нет. Но есть значительно более надежный способ:
1. Запоминаешь AcDbObjectId idLast последнего.
2. После добавления новых создаёшь новый итератор и используешь AcDbBlockTableRecordIterator::seek(idLast), т.е. позиционируешься на старый последний.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Валидность AcDbBlockTableRecordIterator
« Ответ #2 : 17-11-2020, 12:57:23 »
2. После добавления новых создаёшь новый итератор и используешь AcDbBlockTableRecordIterator::seek(idLast), т.е. позиционируешься на старый последний.
Понял. Т.е. все последующие новые Id будут гарантированно располагаться за последним старым?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Валидность AcDbBlockTableRecordIterator
« Ответ #3 : 17-11-2020, 14:26:02 »
Debalance,
Есть одно исключение, но оно не должно тебя интересовать. Это когда вызывается метод обмена AcDbHandle у двух примитивов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение