Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Debalance от 17-11-2020, 11:14:24

Название: Валидность AcDbBlockTableRecordIterator
Отправлено: Debalance от 17-11-2020, 11:14:24
Бэкграунд:
1. Итерирую содержимое записи от позиции start() до позиции done().
2. Нахожу последний (предшествующий позиции done()) валидный итератор записи.
3. Сохраняю этот итератор в переменной LastIter.
4. Далее осуществляю добавление в запись неких новых объектов.

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

Вопросы:
1. Сохранит ли валидность итератор LastIter после добавления в запись новых объектов?
2. Будет ли корректным такой вариант считывания всех новых данных с позиции ++LastIter до позиции done()?
Название: Re: Валидность AcDbBlockTableRecordIterator
Отправлено: Александр Ривилис от 17-11-2020, 12:23:39
Вопросы:
1. Сохранит ли валидность итератор LastIter после добавления в запись новых объектов?
2. Будет ли корректным такой вариант считывания всех новых данных с позиции ++LastIter до позиции done()?
Нет. Но есть значительно более надежный способ:
1. Запоминаешь AcDbObjectId idLast последнего.
2. После добавления новых создаёшь новый итератор и используешь AcDbBlockTableRecordIterator::seek(idLast), т.е. позиционируешься на старый последний.
Название: Re: Валидность AcDbBlockTableRecordIterator
Отправлено: Debalance от 17-11-2020, 12:57:23
2. После добавления новых создаёшь новый итератор и используешь AcDbBlockTableRecordIterator::seek(idLast), т.е. позиционируешься на старый последний.
Понял. Т.е. все последующие новые Id будут гарантированно располагаться за последним старым?
Название: Re: Валидность AcDbBlockTableRecordIterator
Отправлено: Александр Ривилис от 17-11-2020, 14:26:02
Debalance,
Есть одно исключение, но оно не должно тебя интересовать. Это когда вызывается метод обмена AcDbHandle у двух примитивов.