Урок 10. AutoLISP. Стандартные команды Автокад.

Если вы хорошо знаете стандартные команды Автокад, то написание программ на языке AutoLISP не составить для вас большого труда. Создание своих программ позволит вам одним нажатием выполнять серию стандартных команд Автокад, сократит время вашей работы, избавит от рутины и оставит больше время для творчества.

В языке AutoLISP есть функция, которая имитирует командную строку. Это функция «command». Давайте проведем аналогию между написанием стандартных команд Автокад в командной строке и написании тех же команд в программе AutoLISP.

Для того, что все наш действия в командной строке имели одинаковые результаты, в самом начале необходимо отключить динамический ввод:

Для этого в низу слева нужно выключить динамический ввод, щелкнув по соответствующей кнопке. См. Рис. 1.

AutoLISP. Komandy AutoCAD.

Рис. 1.   Отключение Динамического ввода.

Или выключить его при помощи клавиши <F12> на клавиатуре.

Отрезок.

Для того, чтобы построить отрезки с координатами первой точки (X=300, Y=300)  координатами второй точки (X=700, Y=300) и координатами третий точки (X=700, Y=700).

Нам нужно набрать в командной строке ОТРЕЗОК и нажать <Enter>.

Далее на запрос Первая точка: вводим 300,300 и нажимаем <Enter>.

На запрос Следующая точка: вводим 700,300 и нажимаем <Enter>.

На запрос Следующая точка: вводим 700,700 и нажимаем <Enter>.

На запрос Следующая точка: нажимаем <Enter> чтобы прервать выполнение команды.

В результате получим два отрезка. См. Рис. 2.

AutoLISP. Komandy AutoCAD.

Рис. 2.   Построение отрезков.

Чтобы посмотреть полный порядок действий, нажимаем на клавиатуре клавишу <F2>. Откроется  Текстовое окно AutoCAD. См. Рис. 3.

AutoLISP. Komandy AutoCAD.

Рис. 3.    Порядок действий.

Если вы работаете в англоязычной версии AutoCAD, то вместо команды ОТРЕЗОК в командной строке нужно было ввести LINE.

Англоязычная версия с нижним подчеркиванием впереди _LINE будет работать в обоих версиях.

Строка в программе на языке AutoLISP рисующая такие же отрезки выглядит так:

(command "_line" '(300 300) '(700 300) '(700 700) "")

См. Рис. 4.

AutoLISP. Komandy AutoCAD.

Рис. 4.     AutoLISP.  Построение отрезков.

Выделите всю строку и нажмите на кнопку «Загрузить выделенный фрагмент».

AutoCAD начертит отрезки.

Если точку надо задать не вводом координат, а указать мышкой. Используем команду getpoint.

(getpoint "\nУкажите базовую точку : ")

Чтобы запомнить координаты указанной точки в переменной р1, используем функцию setq.

(setq p1 (getpoint "\nУкажите базовую точку : "))

Координаты следующих точек можно рассчитать относительно первой. Для этого в AutoLISP есть несколько способов.

Приведем один из них:

Координаты второй точки смещены относительно первой на 400 единиц  по координате Х.

Давайте предварительно создадим список с этим смещением при помощи функции list.

(list 400 0) – смещение по оси Х=400; смещение по оси Y=0

Затем сложим нас список с координатами точки р1 при помощи функции mapcar

(mapcar '+ p1 (list 400 0))

Запомним координаты второй точки в переменной р2

(setq p2 (mapcar '+ p1 (list 400 0)))

Аналогичным способом находим координаты третей точки относительно второй и запоминаем ее в переменной р3.

(setq p3 (mapcar '+ p2 (list 0 400)))

Мы могли найти координаты точки р3 относительно р1. Это выглядело бы так:

(setq p3 (mapcar '+ p1 (list 400 400)))

После, того как координаты сохранены в переменных, в строке рисующей отрезки меняем координаты на эти переменные:

(command "_line" p1 p2 p3 "")

Теперь наша программа выглядит так: См. Рис. 5.

AutoLISP. Komandy AutoCAD.

Рис. 5.   LISP. Построение отрезков.

Выделите все строки, нажмите на кнопку «Загрузить выделенный фрагмент».

В командной строке появится запрос: «Укажите базовую точку:»

Укажите ее с некоторым смещением от координат старой первой точки. AutoCAD начертит отрезки со смещением. См. Рис. 6.

AutoLISP. Komandy AutoCAD.

Рис. 6.    AutoLISP. Построение отрезков.

Я думаю, что с отрезками мы разобрались. Давайте теперь построим окружность.

Окружность.

Для того, чтобы построить окружность с координатами центра (X=700, Y=700) и радиусом окружности (R=200).

Нам нужно набрать в командной строке КРУГ и нажать <Enter>.

Далее на запрос Центр круга: вводим 700,700 и нажимаем <Enter>.

И запрос Радиус круга:  вводим 200 и нажимаем <Enter>.

В результате получим окружность. См. Рис. 7.

AutoLISP. Komandy AutoCAD.

Рис. 7.    Построение окружности.

Если вы работаете в англоязычной версии AutoCAD, то вместо команды КРУГ в командной строке нужно было ввести CIRCLE.

Команда _CIRCLE будет работать в обоих версиях.

Строка в программе на языке AutoLISP рисующая ту же окружность выглядит так:

(command "_circle" '(700 700) 200)

Вместо координат можно поставить какую либо из ранее созданных переменных. Например переменную р3 в которой хранятся координаты третьей точки.

См. Рис. 8.

AutoLISP. Komandy AutoCAD.

Рис. 8.    AutoLISP. Построение окружности.

Выделите последнюю строчку, нажмите на кнопку «Загрузить выделенный фрагмент». AutoCAD построит окружность с центром в точке р3 и радиусом 200. См. Рис. 9

AutoLISP. Komandy AutoCAD.

Рис. 9.     LISP. Построение окружности.

Дуга.

Для того, чтобы построить дугу с координатами первой точки (X=300, Y=300)  координатами второй точки (X=700, Y=300) и координатами третий точки (X=700, Y=700).

Нам нужно набрать в командной строке ДУГА и нажать <Enter>.

Далее на запрос Начальная точка дуги: вводим 300,300 и нажимаем <Enter>.

На запрос Вторая точка дуги: вводим 700,300 и нажимаем <Enter>.

На запрос Конечная точка дуги: вводим 700,700 и нажимаем <Enter>.

В результате получим дугу. См. Рис. 10.

AutoLISP. Komandy AutoCAD.

Рис. 10.    Построение дуги.

Если вы работаете в англоязычной версии AutoCAD, то вместо команды ДУГА в командной строке нужно было ввести ARC.

Команда _ARC будет работать в обоих версиях.

Строка в программе на языке AutoLISP рисующая ту же дугу выглядит так:

(command "_arc" '(300 300) '(700 300) '(700 700))

Давайте вместо координат поставим переменные р1, р2, р3 и добавим эту строчку в программу.

В результате получим см. Рис. 11.

AutoLISP. Komandy AutoCAD.

Рис. 11.   AutoLISP. Построение дуги.

Выделите последнюю строчку, нажмите на кнопку «Загрузить выделенный фрагмент». AutoCAD построит дугу по точкам р1, р2, р3. См. Рис. 12.

AutoLISP. Komandy AutoCAD.

Рис. 12.  LISP. Построение дуги.

Надеюсь, что с построением простых примитивов мы разобрались. Теперь давайте рассмотрим какую нибудь команду редактирования. Например Зеркало.

Команда редактирования. Зеркало.

Давайте оставим только два отрезка и дугу. См. Рис. 13.

LISP. Komandy AutoCAD.

Рис. 13.    Два отрезка и дуга.

Затем отзеркалим их относительно вертикального отрезка.

Для этого в командной строке вводим команду Зеркало, нажимаем <Enter>.

На запрос Выберите объекты: указываем мышью все три примитива и нажимаем <Enter>.

На запрос Первая точка оси отражения: указываем верхнюю точку вертикального отрезка.

На запрос Вторая точка оси отражения: указываем нижнюю точку вертикального отрезка.

На запрос Удалить исходные объекты? [Да/Нет] <Н>: нажимаем <Enter>.

В результате получаем следующее. См. Рис. 14.

LISP. Komandy AutoCAD.

Рис. 14.    Команда редактирования. Зеркало.

Если вы работаете в англоязычной версии AutoCAD, то вместо команды ЗЕРКАЛО в командной строке нужно было ввести MIRROR.

Команда _MIRROR будет работать в обоих версиях.

Для того, чтобы сделать тоже самое в программе на языке AutoLISP нужно после построение примитива сохранять его имя в переменой. Это можно сделать при помощи функции entlast, которая возвращает имя последнего нарисованного примитива.

Строим горизонтальный отрезок:

(command "_line" p1 p2 "")

Сохраняем имя горизонтального отрезка в переменной gLine:

(setq gLine (entlast))

Строим вертикальный отрезок:

(command "_line" p2 p3 "")

Сохраняем имя вертикального отрезка в переменной vLine:

(setq vLine (entlast))

Строим дугу:

(command "_arc" p1 p2 p3 "")

Сохраняем имя дуги в переменной duga:

(setq duga (entlast))

Зеркалим отрезки и дугу относительно линии проходящей через точки р2 и р3:

(command "_mirror" gLine vLine duga "" p2 p3 "")

Все вместе в программе это будет выглядеть так: См. рис. 15.

LISP. Komandy AutoCAD.

Рис. 15.   AutoLISP. Команда редактирования. Зеркало.

Выделите все строки, нажмите на кнопку «Загрузить выделенный фрагмент».

В командной строке появится запрос: «Укажите базовую точку:»

Укажите ее выше уже имеющихся примитивов. AutoCAD сначала, начертит новые отрезки и дугу, а затем отзеркалит их. И в конце, построит окружность. См. Рис. 16.

LISP. Komandy AutoCAD.

Рис. 16.   LISP. Команда редактирования. Зеркало.

И в заключении давайте построим какую нибудь фигуру вращения в 3d. Например половину конуса.

Фигура вращения. Половина конуса.

Для лучшей наглядности давайте удалим ранее нарисованные примитивы и переведем чертеж ЮЗ изометрию.

Для этого набираем в командной строке _-VIEW и нажать <Enter>.

Далее вводим _swiso и нажимаем <Enter>.

Чертеж будет переведен в ЮЗ изометрию. См. Рис. 17.

LISP. Komandy AutoCAD.

Рис. 17.    Переход в ЮЗ изометрию

Второй способ перевести чертеж в ЮЗ изометрию. Это на видовом кубе щелкнуть между Ю и З в место, которое показано на Рис. 18.

LISP. Komandy AutoCAD.

Рис. 18. Переход в ЮЗ изометрию

Далее чертим отрезок с координатами первой точки (X=1000, Y=0, Z=0) и координатами второй точки (X=1200, Y=0, Z=700)

Набираем в командной строке ОТРЕЗОК и нажать <Enter>.

Далее на запрос Первая точка: вводим 1000,0,0 и нажимаем <Enter>.

На запрос Следующая точка: вводим 1200,0,700 и нажимаем <Enter>.

На запрос Следующая точка: нажимаем <Enter>, чтобы прервать выполнение команды.

Далее набираем команду ВРАЩАТЬ, нажимаем <Enter>.

Указываем мышкой только, что нарисованный отрезок и нажимаем <Enter>.

На запрос Начальная точка оси вращения: вводим 1200,0,700 и нажимаем <Enter>.

На запрос Конечная точка оси вращения: вводим 1200,0,0 и нажимаем <Enter>.

На запрос Угол вращения: вводим 180 и нажимаем <Enter>.

В результате получаем половину конуса. См. Рис. 19

LISP. Komandy AutoCAD.

Рис. 19.   Построение фигуры вращения.

Чтобы увидеть полный порядок действий, нажимаем на клавиатуре клавишу <F2>. Откроется  Текстовое окно AutoCAD. См. Рис. 20.

LISP. Komandy AutoCAD.

Рис. 20. Порядок действий.

Для того, чтобы вернутся к двухмерному чертежу с осями X и Y нужно на видовом кубе щелкнуть по надписи Верх. См. Рис. 21.

LISP. Komandy AutoCAD.

Рис. 21.  Переход к двухмерному чертежу.

Если вы работаете в англоязычной версии AutoCAD, то вместо команды ВРАЩАТЬ в командной строке нужно было ввести REVOLVE.

Команда _REVOLVE будет работать в обоих версиях.

В программе на языке AutoLISP построение половины конуса выглядит так:

В начале строим отрезок

(command "_line" '(1000 0 0) '(1200 0 700) "")

Затем при помощи функций setq и entlast (возвращает имя последнего нарисованного примитива)  запоминаем его в переменной line1

(setq line1 (entlast))

И в конце строим фигуру вращения

(command "_REVOLVE" line1 "" '(1200 0 700) '(1200 0 0) 180)

Все вместе в программе это выглядит так: См. Рис. 22.

LISP. Komandy AutoCAD.

Рис. 22.   AutoLISP. Построение фигуры вращения.

Для того, чтобы преобразовать нашу программу в пользовательскую функцию.

Добавим строку, в которой придумаем имя функции (scom – стандартные команды) и перечислим все временные переменные:

(defun c:scom (/ p1, p2, p3, gline, vline, duga, line1)
      <наша программа>
) ; end_defun

Окончательный вариант программы см. Рис. 23.

LISP. Komandy AutoCAD.

Рис. 23.   AutoLISP. Стандартные команды AutoCAD.

Чтобы проверить работу всей программы: удалите все примитивы и вернитесь в двухмерное пространство.

Чтобы загрузить программу, используем кнопку «Загрузить активное окно редактора». Переходим в AutoCAD, в командной строке набираем scom и нажимаем <Enter>.

На запрос: Укажите базовую точку : укажите любую точку в рабочем окне.

Результат выполнения программы должен выглядеть так. См.Рис. 24.

LISP. Komandy AutoCAD.

Рис. 24.   AutoLISP. Стандартные команды AutoCAD.

Код программы:

(defun c:scom (/ p1, p2, p3, gline, vline, duga, line1)
    (setq p1 (getpoint "\nУкажите базовую точку : "))  ; запрос координат точки р1
    (setq p2 (mapcar '+ p1 (list 400 0)))                         ; расчет координат точки p2
    (setq p3 (mapcar '+ p2 (list 0 400)))                         ; расчет координат точки p3
    (command "_line" p1 p2 "")      ; построение отрезка
    (setq gLine (entlast))                ; запоминаем имя отрезка
    (command "_line" p2 p3 "")      ; построение отрезка
    (setq vLine (entlast))                ; запоминаем имя отрезка
    (command "_arc" p1 p2 p3 "") ; построение дуги
    (setq duga (entlast))                 ; запоминаем имя дуги
    (command "_mirror" gLine vLine duga "" p2 p3 "") ; зеркалим

    (command "_circle" p3 200)                                 ; построение окружности

    (command "_-view" "_swiso" "")                          ; перевод ЮЗ изометрию
    (command "_line" '(1000 0 0) '(1200 0 700) "")   ; построение отрезка
    (setq line1 (entlast))                                             ; запоминаем имя отрезка
    (command "_REVOLVE" line1 "" '(1200 0 700) '(1200 0 0) 180) ; построение полуконуса
) ; end_defun
 Скачать программу Scom.lsp Скачать программу Scom.lsp (Размер файла: 535 bytes) 

Таким образом, мы видим, что написание стандартных команд Автокад в программе AutoLISP практически повторяют написание их в командной строке. И если Вы знаете как пользоваться стандартными командами в AutoCAD, то при наработке определенного навыка, Вы легко сможете писать свои программы, которые в значительной степени могут ускорить процесс выполнения вашей работы.  Поверьте, это не так сложно, как кажется на первый взгляд.

Как добавить нашу программу в список автоматической загрузки и создать для нее кнопку запуска рассмотрено в уроках: Простой запуск LISP программ. Создание кнопки для программы LISP.

Пишите в комментариях:

Трудно ли было выполнить этот урок?

Где у вас возникли трудности?

Была ли для Вас полезной информация, данная в этом уроке?

Если у Вас не получилось  запрограммировать стандартную функцию AutoCAD? Пишите попробуем разобраться вместе.

На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?

Я с удовольствием отвечу на ваши комментарии.

Если вы хотите получать новости с моего сайта. Оформляйте подписку.

До новых встреч.

 «Автор: Михаил Орлов»

Google

Также на эту тему Вы можете почитать:

57 комментарии на “Урок 10. AutoLISP. Стандартные команды Автокад.

  1. Мария 26.02.2016 15:46

    Здравствуйте. Не могли бы вы подсказать, как описать команду для проведения линии под определенным углом, к примеру под углом в 65 градусов?

    • Михаил Орлов 27.02.2016 16:43

      (setq p1 (getpoint "\nУкажите точку : "))
      (setq p2 (polar p1 (*(/ 65. 180) pi) 1000))
      (command "_line" p1 p2 "")

      (*(/ 65. 180) pi) — угол 65 градусов в радианах
      1000 — длина отрезка (линии)

  2. Алексей 20.04.2016 14:49

    Здравствуйте, подскажите пожалуйста.. как в Autolispe запустить программу комодом?

    • Михаил Орлов 21.04.2016 06:32

      Что значит комодом? Вопрос не совсем понятен. Программы в Автокад сначала нужно загрузить. После этого их можно запускать как стандартные команды Автокад (из командной строки, Горячие клавиши, кнопка запуска команды и т.п.). Можно сделать чтобы команда запускалась автоматически сразу после загрузки программы.

  3. Григорий 28.06.2016 15:46

    Здравствуйте! Подскажите, как присвоить новой точке р3 координату Х от введенной мною через getpoint точки р1 и координату Y от р2 ? Спасибо

    • Михаил Орлов 28.06.2016 19:46
      (setq p1 (getpoint "\nУкажите первую точку : "))
      (setq p2 (getpoint "\nУкажите вторую точку : "))
      (setq p3 (list (nth 0 p1) (nth 1 p2) 0))
      • Григорий 29.06.2016 19:17

        Благодарю! Кое-что начинает получаться )

  4. Григорий 02.07.2016 14:38

    Здравствуйте! Можно ли для функции if сравнивать переменную сразу с двумя числами (т.е. мне надо выполнить функцию только в том случае, когда «а» больше нуля но меньше 90)?

    • Григорий 02.07.2016 16:13

      разобрался
      if (> 90 a 0)

  5. VolodyaAYU 13.08.2016 11:36

    Как задать диаметр окружности из ячейки таблицы

    • Михаил Орлов 13.08.2016 17:10

      Из какой таблицы? Из таблицы AutoCAD? Из заранее известной ячейки (известен адрес ячейки)?

  6. Евгений 27.10.2016 09:47

    Как пошагово выполнить программу нм лиспе

    • Михаил Орлов 27.10.2016 15:18

      1)Выделяйте необходимый кусок кода и нажимайте на кнопку «Загрузить выделены фрагмент». 2) Установите точку останова. Запустите программу она остановиться в точке останова. Далее чтобы идти вниз пошагово нажимаем на кнопку «Шаг с заходом».

  7. Роман 17.02.2017 04:01

    Не могу найти команду, которая бы, при выполнении ее, помещала текстовую строку из МТЕКСТа в автокаде в переменную ЛИСПа. Заранее спасибо)

    • Михаил Орлов 17.02.2017 07:54

      (setq ent_obj (car(entsel "\nУкажите MText : ")))
      (setq txt (cdr (assoc 1 (entget ent_obj))))

  8. Наталья 17.04.2017 08:51

    Добрый день!
    Можете подсказать, как прописать команду, чтобы после выбора объекта (замкнутой полилинии, окружности, блока) последовало бы предложение указать точку вставки и после её указания в этом месте вставился бы текст с площадью этого объекта в кв.м.?

    • Михаил Орлов 27.04.2017 11:21

      Для полилинии, окружности:

      (vl-load-com)
      (while(not(setq ent (car(entsel "\nУкажите объект: ")))))
      (setq vla_obj (vlax-ename->vla-object ent))
      (setq S_obj (rtos (/(vla-get-Area vla_obj) 1000000) 2 2))
      
      (setq pt (getpoint "\nУкажите точку вставки текста: "))
      (command "_.text" pt 200 0 S_obj)
      

      Для блоков скорее всего нужно писать свой код и он будет зависит от того какой это блок.

      • пет 29.01.2021 20:51

        Для такого чайника, как ваш сайт самое то! ОЧень благодарен.
        В результате у меня в тексте «0» а в консоли «nil». В чем дело может быть?

  9. Ирина 28.04.2017 08:10

    Добрый день!
    Подскажите, пожалуйста, как использовать команду INSERT с учетом системной переменной INSBASE вставляемого файла, если эта переменная не 0,0,0.

    • Михаил Орлов 03.05.2017 18:47

      Возможно у Вас просто установлена Пользовательская Система Координат (ПСК).
      Перевел чертеж в Мировую Систему Координат (МСК).
      Наберите в командной строке ПСК (_UCS) и выберите или введите опцию [мир] (world)
      Возможно INSBASE станет 0,0,0.
      Если нет, тогда измените ее при помощи команды _BASE.

  10. Наталья 02.05.2017 06:39

    Спасибо большое, очень помогло.

  11. Павел 13.05.2017 14:27

    Михаил, скажите пожалуйста, есть ли на AutoLISP команда для создания усеченного конуса, и если есть,то как построить таковой? Существует ли метод или алгоритм для расчета объема призмы на AutoLISP?

    • Михаил Орлов 15.05.2017 11:01

      Для построения конуса:

      (setq bp (getpoint "\nУкажите центр основания конуса: "))
      (command "_cone" bp 10 "_t" 5 7)

      10 — радиус нижнего основания
      5 — радиус верхнего основания
      7 — высота усеченного конуса
      Определение объема любого 3Д-объекта:

      (vl-load-com)
      (while(not(setq ent (car(entsel "\nУкажите объект: ")))))
      (setq vla_obj (vlax-ename->vla-object ent))
      (setq V_obj (rtos (vla-get-Volume vla_obj) 2 2)) 
      • Павел 15.05.2017 21:18

        Огромное спасибо!Вы настоящий мастер в этом деле!

  12. Евгений 21.06.2017 06:22

    Здравствуйте, можно ли реализовать программу, которая строила бы прямоугольники по координатам одним за одним? (есть таблица с координатами точек X,Y, в ручную вбивать слишком долго для такого количества)

    • Михаил Орлов 21.06.2017 16:38

      Да, конечно.

      • Евгений 22.06.2017 13:36

        поможете мне с этим пожалуйста?

        • Михаил Орлов 23.06.2017 09:29

          В какой виде изначально сделана таблица? Пришлите мне таблицу на почту: acadprog@gmail.com

          • петр 29.01.2021 20:55

            над решение такой же задачи работаю.
            Я должен ввести значения с клавиатуры для каждого столбца таблицы (указать ширину столбцов последовательно, потом высоту строк. Автокад строит сетку=таблицу

  13. Сергей 04.09.2017 20:42

    Михаил, а что такое glisp?

    • Михаил Орлов 21.09.2017 15:26

      Что такое glisp? Я не знаю.

  14. Дмитрий 24.09.2017 20:43

    Как копировать объект так, чтоб каждый следующий был меньше предыдущего, ну и задавать это уменьшение

    • Михаил Орлов 25.09.2017 14:53

      Написать LISP-программу, которая:
      1) Попросит выбрать исходный объект
      2) Отмасштабирует его
      3) Запросит точку вставки для объекта с новым масштабом.

  15. Евгений 01.11.2017 05:01

    Есть полилиния и пересекающая её окружность. Как в команде _trim программно указать какую сторону полилинии удалять?

    • Михаил Орлов 02.11.2017 11:50

      Предварительно определяем координаты крайних точек полилинии р1 и р2

      (while(not(setq ent_circle (car(entsel "\nУкажите режущий примитив или нажмите Esc : ")))))
      (while(not(setq ent (car(entsel "\nУкажите полилинию или нажмите Esc : ")))))
      (command "_trim" ent_circle "" p1 "")

      p1 — одна из крайних точек полилинии.

  16. gn 14.01.2018 17:40

    К примеру мне необходимо произвести какие-либо действия с объектами, но для этого надо их сначала выделить. Выделять планируется вручную. Как реализовать подобный манёвр?

    • Михаил Орлов 15.01.2018 19:41

      Функция (ssget) просит выделить объектs и создает набор из указанных объектов. Сохраняем набор в переменную:

      (setq set_all (ssget))

      и далее делаем с этим набором все что захотим.

  17. Александр 16.02.2018 13:01

    Добрый день. А можно ли подвязать выполнение команды к смене вида через видовой куб? (Хотелось бы после смены вида через видовой куб автоматически устанавливать ПСК по виду).

    • Михаил Орлов 14.04.2018 15:15

      Не совсем понял вопрос. Из LISP программы можно управлять видом и ПСК.

  18. Татьяна 10.03.2018 16:19

    Добрый день, подскажите как возможно в AutoLISP построить график экспоненциальной функции в системе координат?

    • Михаил Орлов 14.04.2018 15:06
      (setq x -5)
      (setq y (exp x))
      (setq p1 (list x y))
      
      (repeat 100
        (setq x (+ x 0.1))
        (setq y (exp x))
        (setq p2 (list x y))
        (command "_line" "_none" p1  "_none" p2 "")
        (setq p1 p2)
      ); end repeat 
  19. Вадим 06.04.2018 07:20

    Здравствуйте Михаил ! Я новичок в создании модулей для AutoCAD и столкнулся с такой проблемой, мне нужно ввести с клавиатуры радиус цилиндра r1 и длину p1 после чего команда AddCylinder должна его построить. Я сделал данные точки вводимыми :
    (setq r1 (getpoint «\nУкажите радиус цилиндра : «))
    (setq p1 (getpoint «\nУкажите длину цилиндра : «))
    После чего в командной строке я задал нужные мне размеры, автокад выдаёт: ошибка: неверный тип аргумента: numberp: (52.1327 54.8704 0.0).
    Ломаю голову, не могу понять что не так. Не судите строго, если задаю глупый вопрос. Заранее огромное спасибо за ответ !

    • Михаил Орлов 14.04.2018 14:41
      (setq bp (getpoint "\nУкажите центр цилиндра: "))
      (setq r1 (getint "\nВведите радиус цилиндра: "))
      (setq p1 (getint "\nВведите высоту цилиндра: "))
      (command "_cylinder" bp r1 p1)
  20. Георгий 06.04.2018 16:36

    Подскажите я задаю программу (defun Pr_3 ( )
    (setq a (getreal «\ Введите число a: «) )
    (setq b (getreal «\ Введите число b: «))
    (setq c (+ a b)) и еще потом вывести значение с на экран? Заранее спасибо

    • Михаил Орлов 14.04.2018 14:32

      (princ с) — выведет значение «с» в командной строке
      (alert c) — выведет значение «с» в диалоговом окне.

      • Георгий 20.04.2018 16:54

        необходимо вывести текст в плоскости хуz «Сумма чисел а и b равна с»

  21. Максим 15.08.2018 04:57

    Здравствуйте, Михаил!
    Не получается написать код. Требуется нарисовать отрезок возле 3d полилинии, копировать этот отрезок с полилинией, потом повернуть полилинию относительно отрезка на — 90.
    (setq p1 (getpoint))
    (setq p2 (getpoint))

    (command «_line» p1 p2 «»)

    (command «_copy»)

    (command «_rotate3d»)

    После копирования, 3d поворот запускается не корректно. Помоги пожалуйста, разобраться с этой проблемой.

    • Михаил Орлов 27.12.2018 12:30

      Вращение вокруг оси OY:
      (setq p1 (getpoint "\nУкажите точку 1: "))
      (setq X1 (nth 0 p1))
      (setq Y1 (nth 1 p1))
      (setq Z1 (nth 2 p1))
      (setq Y2 (+ Y1 100))
      (setq p2 (getpoint p1 "\nУкажите точку 2: "))

      (command "_3dpoly" p1 p2 "")
      (setq obj (entlast))
      (command "_copy" obj "" "_none" p1 "_none" p1)
      (setq vla_obj (vlax-ename->vla-object obj))
      (vla-Rotate3D vla_obj (vlax-3D-point (list X1 Y1 Z1)) (vlax-3D-point (list X1 Y2 Z1)) (/ Pi 2))

      Про вращение можете почитать здесь: https://acad-prog.ru/3d-modelirovanie-v-autocad/
      Вторая часть статьи: «Поворот 3Д объекта»

  22. Камила 16.10.2018 19:08

    Здравствуйте , подскажите пожалуйста как в AvtoLisp соединить несколько линий ?

  23. Денис 22.11.2018 06:22

    Здравствуйте! Вроде бы внимательно просмотрел Ваши уроки. Получается задать координаты точки (пусть даже центра круга) можно только через оператор list?

    • Михаил Орлов 20.12.2018 19:16

      Да. Или верхнем апострофом ‘(0 0 0). Или указаниеv точки (setq bp (getpoint «\nУкажите точку: «))

  24. Ильшат 25.02.2019 07:34

    Добрый день! Подскажите пожалуйста как вставить результат расчета в программе написанной на autolisp в чертеж в виде многострочного текста. Интересуют атрибуты команды ; (command «_.MText» ???? ???? ….)

    • Михаил Орлов 15.05.2019 13:02


      (setq p1 (getpoint "\nУкажите точку: "))
      (setq p2 (mapcar '+ (list 400 300 0) p1))
      (setq Result (itoa (+ 4 3)))
      (command "_.MText" p1 p2 Result "")
      (setq p1 (mapcar '+ (list 0 200 0) p1))
      (setq p2 (mapcar '+ (list 400 300 0) p1))
      (setq Result2 (rtos (+ 4 7.7)))
      (command "_.MText" p1 p2 Result2 "")

  25. Сергей 13.03.2019 18:25

    Здравствуйте ) Подскажите пожалуйста, такая проблема. Рисую прямоугольник по точкам, командой _line. В отладке вижу координаты точек, все нормально. Но при уменьшении масштаба до определенной величины (когда все мелко) вертикальные стороны рисуются точками и выводится сообщение о том, что создана линия нулевой длины. Соответственно вертикальные стороны вырождаются в точки и прямоугольник вырождается в линию. Вертикальные стороны не равны тем значениям, которые указаны в координатах. При увеличении масштаба все строится нормально. В чем может быть дело ? Голову себе уже сломал.

    • Сергей 13.03.2019 18:34

      Немного поправлюсь. Не при изменении масштаба, а при изменении размеров экрана колесом мыши. Померил линейкой сторону прямоугольника при которой еще программа отрисовывает прямоугольник 40х25. Так вот, при уменьшении экрана так, что высота 25 мм равна 7 мм (померил линейкой по экрану) еще фигура строится. Если крутануть колесо и уменьшить экран на одну позицию, уже не строится. Текст программы простейший:
      (DEFUN c:excToACad (/)
      (setq a 40)
      (setq b 60)
      (setq p1 (getpoint «\nУкажите базовую точку:»))
      (setq k1 (mapcar ‘+ p1 (list a 0)))
      (setq k2 (mapcar ‘- k1 (list 0 b)))
      (setq k3 (mapcar ‘- k2 (list a 0)))
      ;;;(command «_line» p1 k1 k2 k3 p1 «»)
      (command «_line» p1 k1 «»)
      (command «_line» k1 k2 «»)
      (command «_line» k2 k3 «»)
      (command «_line» k3 p1 «»)
      )

      • Михаил Орлов 15.05.2019 12:35

        Добавьте временное отключение привязки:

        (command "_line" "_none" p1 "_none" k1 "")
        (command "_line" "_none" k1 "_none" k2 "")
        (command "_line" "_none" k2 "_none" k3 "")
        (command "_line" "_none" k3 "_none" p1 "")

    • Михаил Орлов 01.07.2019 20:55

      В момент построения привязки должны быть отключены. Например так:
      (command "_line" "none" p1 "none" p2 "")

Оставить комментарий

Ваш mail не будет опубликован.

Вы можете использовать HTML теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>