Насколько правильно было бы в AutoCAD использовать указатель на выбранный элемент?Так делать очень не рекомендую. Следует придерживаться принципа: открывать объект/примитив только тогда, когда нужно получить из него информацию или изменить его и сразу же закрывать. Во всяком случае перед тем как твоя программа возвращает управление AutoCAD ты должен закрыть все открытые тобой объекты. Иначе проблем не оберёшься. Особенно если открывал объект для ForWrite.
По поводу запрета изменений свойств внутри реактора я так понимаю это следует из принципа что в обработчике событий нельзя делать то что может снова вызвать событие. Верно?Упрощенно - верно.
Вы в правильном примере используете выбор элемента (acedSSLength) 2 раза.Эта функция получает количество элементов в наборе (в данном случае в наборе предварительного выбора - pickfirst).
А разве элемент остается открытым если на него получен указатель?Конечно. Закрывает его метод close() (или деструктор AcDbObjectPointer - он вызвает метод close()). После вызова close() объект становится недействительным и указатель ссылается на область памяти, которая уже не является объектом (сравни с операторами new/delete)
Ну да, логично.Добавлю еще один существенный момент. Открыть объект ForRead можно 256 раз не закрывая, а вот открыть ForWrite можно только один раз, причем если этот объект еще ни разу не открыт ни ForRead, ни ForWrite. Именно по этой причине - перестал быть нужен объект - сразу его закрываем.
Спасибо за разъяснения, теперь более понятен принцип.
Поэтому у меня и не применялись изменения к свойствам )))Меня больше удивляет другое: почему в твоём коде не возникло исключение:
INTERNAL ERROR: !dbobji.cpp@8743: eNotOpenForWriteВызов pBlkRef->setPosition(p3d_2); должен был привести к падению AutoCAD с такой ошибкой, так как метод pBlkRef->upgradeOpen(); не должен был сработать. Кстати, проверять код результата, методов возвращающих Acad::ErrorStatus очень желательно.
Открыть объект ForRead можно 256 раз не закрывая, а вот открыть ForWrite можно только один раз, причем если этот объект еще ни разу не открыт ни ForRead, ни ForWrite.Прошу прощения что вмешиваюсь, но хотелось бы узнать, эти ограничения действуют и для .net платформы? В справке не нашел этого момента.
Прошу прощения что вмешиваюсь, но хотелось бы узнать, эти ограничения действуют и для .net платформы? В справке не нашел этого момента.Конечно. Ибо .NET платформа по сути это обёртки над ObjectARX. Кстати и в справке ты плохо искал:
Кстати и в справке ты плохо искалВернее не там искал, я в разделе транзакций смотрел...
Вызов pBlkRef->setPosition(p3d_2); должен был привести к падению AutoCADВсе верно падение было. Причем не только тут
Все верно падение было.О! Теперь ты меня успокоил. :)
А на ошибки я пока никогда не проверяю потом все вставлю проверки, пока что всю суть надо понять.Вот как раз суть то и можно понять, если проверять на ошибки. Тем более, что у них достаточно понятные аббревиатуры.
Вот как раз суть то и можно понять, если проверять на ошибки. Тем более, что у них достаточно понятные аббревиатуры.