1) Стандартная команда _-ATTEDITСпасибо! Неплохо справляется с задачей в виде
(vl-cmdf "_-attedit" "" "" "" "" atr "_P" pause "")
Правда, без "резиновой нити" (не так важно). Кроме того, на месте первоначальной точки возникает огромное перекрестие. Может, за его отображение отвечает какая-то системная переменная?
Кроме того, на месте первоначальной точки возникает огромное перекрестие. Может, за его отображение отвечает какая-то системная переменная?Насколько я помню возможности управлять этим перекрестьем нет.
+ к сказанному - при установленных Express Tools становится доступна лисп функция acet-ss-drag-move ...А тут ты попался! :) Будет двигаться весь блок. Атрибут таким образом ты не подвинешь.
Сделать дубликат атрибута в виде текста (или мультитекста - зависит от многострочности атрибута) и таскать его.Кстати, тоже хороший вариант! Я не уточнил в начале: если данное действие требуется совершать во время вставки блока с атрибутом, то, может, есть встроенные решения? Не нашёл свойства атрибута вроде "указание точки вставки" при вставке блока.
при установленных Express Tools становится доступна лисп функцияНе подойдёт, поскольку Express Tools может быть и не установлен, нужны простые решения!
Я не уточнил в начале: если данное действие требуется совершать во время вставки блока с атрибутом, то, может, есть встроенные решения?Это как? Если вставлять командой _INSERT, то положение атрибутов во время вставки изменить нельзя. Управлять запросом вставки атрибутов можно при помощи системных переменных ATTREQ и ATTDIA.
1. А если пользователь в ответ на запрос нажмет правую кнопку или Esc?1. Если пользователь прерывает команду, атрибут останется на месте по умолчанию. Этот цикл обрамлён в другой цикл:
2. Почему создается текст, а удаляется примитив, который был перед ним? Там же может быть все что угодно...
3. Не учитывается вариант многострочного атрибута
4. Не учитывается вариант установленного выравнивания атрибута
5. Не учитываются варианты заблокированных / замороженных слоев
- отдельная универсальная функция вставки блока. Используется при вставке block_nameНепосредственно для вставки блока используется одна команда (insert), тем более если она в условии цикла, а сразу после while идёт добавление слоя-цвета, то функцию применять (мне кажется) не очень удобно.
2. Создаётся текст, затем он же заносится в переменную temp_text, а потом он удаляется через (entdel temp_text).В том виде, в котором ты выложил код, происходит совсем другое:
В том виде, в котором ты выложил код, происходит совсем другоеНе обратил внимание: разместил здесь код с ошибкой, а у себя проверял с нормальной последовательностью.
Не обратил внимание: разместил здесь код с ошибкой, а у себя проверял с нормальной последовательностью.Исправь тогда, пожалуйста, и здесь тоже свой код на рабочий.
Создаётся текст, затем он же заносится в переменную temp_text, а потом он удаляется через (entdel temp_text).Я вижу другое: сначала (setq temp_text (entlast)), потом создается текст.
Атрибут будет задаваться в окне и не сможет быть многострочным или с другим выравниванием.Что и как показывается в окне - дело десятое. Сам атрибут может иметь признак многострочности. Соответственно обработка для него будет немного другой.
Кстати, как считаешь, можно ли в функцию-обработчик завершения программы, где идёт восстановление системных переменных, дописать PURGE all? Если идёт вставка блоков, когда каждый блок находится в отдельном файле (command "_insert" (strcat block_name ".dwg") nil), то потом во "Вставке" остаётся мусор с названиями файлов.Я делал не так: через ObjectDBX открывается "библиотечный файл", и оттуда берется описание блока. Копирование через CoyObjects. В результате мусора - минимум.
Я совсем упустил из виду вариант работы не в мировой системе координат... У тебя нигде не выполняется преобразование (ни координат, ни нормалей) - так и должно быть? Или возможны варианты?Я про различные системы даже не подумал. Как делать правильно?
Я про различные системы даже не подумал. Как делать правильно?Изучай функцию (trans). В большинстве случаев тебе понадобится преобразование ПСК->МСК и МСК->ПСК, т.е.
При этом запросы точек getpoint вообще возвращает координаты в экранной системе (если не ошибаюсь).В ПСК (UCS)
(getvar "laspoint") в какой системе вернет значения - не знаю, надо тестировать.В ПСК (UCS)
Сейчас точно не помню, но, по-моему, vla-get-insertionpoint для блока, текста и атрибута возвращают координаты в WSC.В МСК (WCS)
А если попробовать заменить vl-cmdf на command или command-sОни в любом случае (при выполнении и прерывании) выдадут nil, а vl-catch-all-apply при прерывании ошибку не почувствует.
с проверкой entlastСпасибо за совет! Вроде, помогла такая форма: