Добрый день! Пришел вопрос от читателя
К сожалению, в AutoCAD с помощью команды Быстрый выбор такого сделать нельзя, поскольку она закрыта и до ее параметров не достучаться программными средствами. Однако, задача легко решаема с помощью одной строчки кода на AutoLISP.
Пишем строку кода на AutoLISP
(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Имя блока"))))
Функция sssetfirst в данном случае, выражаясь не программистским языком, позволяет выделить все объекты из списка, функция ssget - создает список из всех блоков с именем "Имя блока", которые есть в текущем чертеже.
Т.е. если вы хотите выбрать все блоки с именем "Стол", то запись будет выглядеть
(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Стол"))))
Можете протестировать работу - скопируйте запись в командную строку и нажмите Enter, должны выбраться все блоки с именем "Стол"
Добавить кнопку на панель или ленту нет никакой сложности. Например, создадим панель Выбор блоков и добавим на нее кнопки
1. Запускаем команду Пользовательский интерфейс на ленте Управление или вводим команду НПИ (_CUI)
2. Создаем новую команду - нажимаем кнопку Создание новой команды
3. Описываем свойства команды. Задаем Имя, например Блоки Стол, вводим Описание и пр.
В поле макрос вводим созданную ранее строку кода
^C^C(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Стол"))))
^C^C - это двойное нажатие Cancel, нужно для выхода из текущей команды перед запуском команды выбора, хотя это совершенно необязательно.
Также можно выбрать значок для команды или создать свой.
Не забываем нажимать Применить.
4. По аналогии создаем команды для выбора других блоков
5. Создаем новую инструментальную панель, например, Выбор блоков
6. Добавляем созданные команды на новую панель. Просто перетаскиваем их на нужную панель (можно выбрать группу команд)
Выходим из окна.
7. Отображаем панель в рабочем пространстве. Пишем в командной строке
-ПАНЕЛЬ "Выбор блоков"
8. Наслаждаемся.
С остальными приемами работы и настройки в AutoCAD можно познакомиться на странице блога.
С уважением, Андрей.
Если вы получили ответ на свой вопрос и хотите поддержать проект материально - внизу страницы для этого есть специальная форма.
Евгений Пронь
Можно ли создать макрокоманды по "быстрому выбору", в частности по выбору тех или иных блоков? Например есть блоки с именем двери, стулья, столы... Нажал кнопочку и "выбрались" все блоки с именем "столы"..Спасибо за отличный вопрос. Отвечаю.
К сожалению, в AutoCAD с помощью команды Быстрый выбор такого сделать нельзя, поскольку она закрыта и до ее параметров не достучаться программными средствами. Однако, задача легко решаема с помощью одной строчки кода на AutoLISP.
Создаем команду выбора
Пишем строку кода на AutoLISP
(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Имя блока"))))
Функция sssetfirst в данном случае, выражаясь не программистским языком, позволяет выделить все объекты из списка, функция ssget - создает список из всех блоков с именем "Имя блока", которые есть в текущем чертеже.
Т.е. если вы хотите выбрать все блоки с именем "Стол", то запись будет выглядеть
(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Стол"))))
Можете протестировать работу - скопируйте запись в командную строку и нажмите Enter, должны выбраться все блоки с именем "Стол"
Создаем инструментальную панель с кнопками выбора блоков
Добавить кнопку на панель или ленту нет никакой сложности. Например, создадим панель Выбор блоков и добавим на нее кнопки
1. Запускаем команду Пользовательский интерфейс на ленте Управление или вводим команду НПИ (_CUI)
2. Создаем новую команду - нажимаем кнопку Создание новой команды
3. Описываем свойства команды. Задаем Имя, например Блоки Стол, вводим Описание и пр.
В поле макрос вводим созданную ранее строку кода
^C^C(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Стол"))))
^C^C - это двойное нажатие Cancel, нужно для выхода из текущей команды перед запуском команды выбора, хотя это совершенно необязательно.
Также можно выбрать значок для команды или создать свой.
Не забываем нажимать Применить.
4. По аналогии создаем команды для выбора других блоков
5. Создаем новую инструментальную панель, например, Выбор блоков
6. Добавляем созданные команды на новую панель. Просто перетаскиваем их на нужную панель (можно выбрать группу команд)
Выходим из окна.
7. Отображаем панель в рабочем пространстве. Пишем в командной строке
-ПАНЕЛЬ "Выбор блоков"
8. Наслаждаемся.
С остальными приемами работы и настройки в AutoCAD можно познакомиться на странице блога.
С уважением, Андрей.
Если вы получили ответ на свой вопрос и хотите поддержать проект материально - внизу страницы для этого есть специальная форма.
Спасибо, огромное спасибо! я уже обыскался как подавить окно "быстрый выбор"... а тут так все просто. А если усложнить задачу: есть блоки - столы, стулья. Причем стулья стоят как вместе со столами,так и отдельно от столов, Нужно сделать, чтоб можно было выбрать стулья со столами, а отдельные стулья и столы в этот выбор не входили..
ОтветитьУдалитьМожно и такое сделать, думаю, надо контролировать вхождение блока, и, в зависимости от этого, выбирать его или нет.
УдалитьА чем команда "Выбрать подобные" не устраивает? Точно так же соберет все вхождения блоков, причем не только имена которых прописаны в коде, а на какой укажешь, те и выберет, если они в одном слое конечно, хоть столы, хоть стулья, хоть черти лысые.
ОтветитьУдалитьТем, что задачи разные. Задача была в том, чтобы одним нажатием готовой кнопки выбирались объекты. В вашем случае никакой автоматизации.
УдалитьВидимо что-то не понимаю. Я также могу создать кнопку, в макрос которой пропишу selectsimilar \;. При ее нажатии запустится выбор объекта. В какой объект кликну, те объекты в чертеже и выберутся. Будь это блок или какой другой объект. Тут думаю ничего страшного в одном разъедином клике нет, зато кнопка одна, можно использовать для разных блоков. Автоматизации нет, не спорю, но и задача не требует ее. Если результат - то он достигнут.
Удалить(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Имя блока")))) А можно по подробней за что отвечает 0, _x, 2 .
ОтветитьУдалитьВ посте есть ссылка с подробным описанием функции ssget.
Удалить_x - значит выбирать из всего чертежа, включая пространства модели и листов
(0 . "INSERT") - 0 выбирать все примитивы типа INSERT (блоки)
2 - код фильтра выбора (например, 2 - имя блока, 8 - слой, 62 - цвет и пр, в хэлпе есть все коды)
Здравствуйте, задам вопрос не по теме)
ОтветитьУдалитьВ 15 версии автокада при создании pdf не может сделать А4 формат вертикальным. При просмотре показывает горизонтальный лист, а по середине вертикально расположена выделенная область.
Можно ли как-то заставить его повернуть лист? )
Добрый день! Даже не знаю что ответить. Каким принтером формируете pdf? Пробовали выбрать нужную ориентацию листа?
УдалитьЗдраствуйте.
ОтветитьУдалитьЕсли пытаюсь имя блока передать неявно
(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . (vl-filename-base (getvar "dwgname"))))))
то не работает. Как можно выцепить в буфер обмена блок с именем совпадающем с именем файла?
Здравствуйте!
ОтветитьУдалитьПодскажите пожалуйста, как дополнить код команды ^C^C(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Стол")))), чтобы еще и взорвать все выбранные блоки.
^C^C(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Стол")))) _explode
УдалитьЗдраствуйте! А не подскажете через объектную модель ActiveX нельзя работать с быстрым выбором?
ОтветитьУдалитьНапример произвести аналог выбора:
Применить > Ко всему чертежу, Тип объектов > Несколько, Свойства > Цвет, Оператор > = Равно, Значение > Зеленый
Добрый день! Сходу не скажу, спросите на форуме
УдалитьСпасибо за направление.
УдалитьИскал способ, который позволил бы выбрать на чертежи все блоки с совпадающей частью имени. Предложенный вариант позволяет использовать маску в имени блока, что полностью решает задачу по выбору. Одна строчка и всё готово. Большое спасибо!
ОтветитьУдалитьПожалуйста!
Удалить