пятница, 20 ноября 2015 г.

Создаем кнопку для выбора блоков в 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 можно познакомиться на странице блога.

С уважением, Андрей.
Если вы получили ответ на свой вопрос и хотите поддержать проект материально - внизу страницы для этого есть специальная форма.

15 комментариев:

  1. Спасибо, огромное спасибо! я уже обыскался как подавить окно "быстрый выбор"... а тут так все просто. А если усложнить задачу: есть блоки - столы, стулья. Причем стулья стоят как вместе со столами,так и отдельно от столов, Нужно сделать, чтоб можно было выбрать стулья со столами, а отдельные стулья и столы в этот выбор не входили..

    ОтветитьУдалить
    Ответы
    1. Можно и такое сделать, думаю, надо контролировать вхождение блока, и, в зависимости от этого, выбирать его или нет.

      Удалить
  2. А чем команда "Выбрать подобные" не устраивает? Точно так же соберет все вхождения блоков, причем не только имена которых прописаны в коде, а на какой укажешь, те и выберет, если они в одном слое конечно, хоть столы, хоть стулья, хоть черти лысые.

    ОтветитьУдалить
    Ответы
    1. Тем, что задачи разные. Задача была в том, чтобы одним нажатием готовой кнопки выбирались объекты. В вашем случае никакой автоматизации.

      Удалить
    2. Видимо что-то не понимаю. Я также могу создать кнопку, в макрос которой пропишу selectsimilar \;. При ее нажатии запустится выбор объекта. В какой объект кликну, те объекты в чертеже и выберутся. Будь это блок или какой другой объект. Тут думаю ничего страшного в одном разъедином клике нет, зато кнопка одна, можно использовать для разных блоков. Автоматизации нет, не спорю, но и задача не требует ее. Если результат - то он достигнут.

      Удалить
  3. (sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Имя блока")))) А можно по подробней за что отвечает 0, _x, 2 .

    ОтветитьУдалить
    Ответы
    1. В посте есть ссылка с подробным описанием функции ssget.
      _x - значит выбирать из всего чертежа, включая пространства модели и листов
      (0 . "INSERT") - 0 выбирать все примитивы типа INSERT (блоки)
      2 - код фильтра выбора (например, 2 - имя блока, 8 - слой, 62 - цвет и пр, в хэлпе есть все коды)

      Удалить
  4. Здравствуйте, задам вопрос не по теме)
    В 15 версии автокада при создании pdf не может сделать А4 формат вертикальным. При просмотре показывает горизонтальный лист, а по середине вертикально расположена выделенная область.
    Можно ли как-то заставить его повернуть лист? )

    ОтветитьУдалить
    Ответы
    1. Добрый день! Даже не знаю что ответить. Каким принтером формируете pdf? Пробовали выбрать нужную ориентацию листа?

      Удалить
  5. Здраствуйте.
    Если пытаюсь имя блока передать неявно
    (sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . (vl-filename-base (getvar "dwgname"))))))
    то не работает. Как можно выцепить в буфер обмена блок с именем совпадающем с именем файла?

    ОтветитьУдалить
  6. Здравствуйте!
    Подскажите пожалуйста, как дополнить код команды ^C^C(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Стол")))), чтобы еще и взорвать все выбранные блоки.

    ОтветитьУдалить
    Ответы
    1. ^C^C(sssetfirst nil (ssget "_x" '((0 . "INSERT")(2 . "Стол")))) _explode

      Удалить
  7. Здраствуйте! А не подскажете через объектную модель ActiveX нельзя работать с быстрым выбором?
    Например произвести аналог выбора:
    Применить > Ко всему чертежу, Тип объектов > Несколько, Свойства > Цвет, Оператор > = Равно, Значение > Зеленый

    ОтветитьУдалить
    Ответы
    1. Добрый день! Сходу не скажу, спросите на форуме

      Удалить
    2. Спасибо за направление.

      Удалить

Related Posts Plugin for WordPress, Blogger...