Автоматизация проектирования.

Одним из эффективных способов автоматизации процесса проектирования в Автокад,  может послужить создание своих программ на языке LISP.

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

Примером автоматизации проектирования систем вентиляции, может послужить диалоговое окно, созданное в уроке: «Диалоговое окно Автокад». См. Рис. 1.

Диалоговое окно Автокад

Рис. 1. Диалоговое окно.

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

В предыдущей  статье мы подробно, рассмотрели возможный вариант управления диалоговым окном из LISP программы.  Но осталось еще несколько идей по усовершенствованию программы.  Этим мы и займемся в этом уроке

Напомню, что при нажатии на кнопку ОК, наша диалоговое окно закрывалось, и программа просила указать две точки, по которым строилась мультилиния (круглый или прямоугольный воздуховод).

См. Рис. 2.

Управление диалоговым окном.

Рис. 2. Мультилиния.

В этом уроке мы научимся:

Откройте AutoCAD.

Запустите редактор Visual LISP.

Откройте программу pr_uch.lsp, созданную в предыдущем уроке: «Управление диалоговым окном».

Сохраните ее под другим именем: pr_uch2.lsp

Серия воздуховодов.

Было бы хорошо, если бы наша программа рисовала не один, а сразу несколько воздуховодов одного сечения.

Построение прямого участка воздуховода у нас происходить  в пользовательской функции Vml. См. Рис. 3

Автоматизация проектирования

Рис. 3. Функция в ставки мультилинии.

С изменения этой функции мы и начнем.

Переместите строку с запросом второй точки:

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

Ниже к строке, которая рисует мультилинию:

(command "_mline" "_J" "_Z" "_S" Di p1 p2 "")

Добавьте строку, где координаты второй точки присваиваются первой:

(setq p1 p2)

И заключите эти строки в массив при помощи функции while:

(while
  (setq p2 (getpoint "\nУкажите вторую точку :" p1))
  (command "_mline" "_J" "_Z" "_S" Di p1 p2 "")
  (setq p1 p2)
)

Функция while будет многократно повторять выражения внутри массива, пока переменная р2 не примет значение nil.

Как только, р2 примет значение nil, функция while прекратит свою работу и программа пойдет дальше.

Подставим вышесказанное в программу. См. Рис. 4.

Автоматизация проектирования

Рис. 4. Многократное повторение построения мультилинии.

Нажмите на кнопку: «Загрузить активное окно редактора«;

Перейдите в Автокад;

В командной строке введите pr_ush и нажмите <Enter>.

Откроется диалоговое окно. Если хотите, можете поменять исходные данные. См. Рис. 5.

Автоматизация проектирования

Рис. 5. Диалоговое окно.

Затем нажимаем кнопку ОК.

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

На запрос «Укажите вторую точку:» — укажите следующую точку.

И снова появиться запрос: «Укажите вторую точку:» — укажите еще одну точку.

Запрос: «Укажите вторую точку:» будет повторятся бесконечное количество раз, пока мы не прекратим выполнение программы нажав <Enter>  (или <Esc>).

Если нажать <Enter>  функция getpoint вернет nil, цикл while прервется и выполнение программ пойдет дальше.

Программа нарисует сеть воздуховодов.  См. Рис. 6.

Автоматизация проектирования

Рис. 6. Сеть воздуховодов.

Если нажать <Esc>  прервется выполнение всей программы. В командной строке появится сообщение об ошибке. См. Рис. 7.

Автоматизация проектирования

рис. 7. Прерывание программы при помощи «Esc»

Последняя строка функции Vml

(setvar "CMLSTYLE" Cml)

будет не выполнена.

Чтобы строка

(setvar "CMLSTYLE" Cml)

Была выполнена в любом случаи, добавляем функцию обработки ошибок:

(defun *error* (msg)
  (princ msg)
  (setvar "CMLSTYLE" Cml)
)

Функция  *error* будет выполнена при возникновении любой ошибки

Она запишет в переменную msg название ошибки.

Далее мы печатаем название ошибки в командной строке:

(princ msg)

И возвращаем, начальный стиль мультилинии:

(setvar "CMLSTYLE" Cml)

Чтобы не возникло ошибки, если пользователь нажмет «Esc» при запросе первой точки, опускаем строку:

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

Ниже строки:

(setq Cml (getvar "CMLSTYLE"))

Текст запроса второй точки меняем на более понятный:

(setq p2 (getpoint "\nУкажите следующую точку или Enter для завершения:" p1))

Добавляем все вышесказанное в программу. См. Рис. 8.

Автоматизация проектирования

Рис. 8. Функция Vml с обработчиком ошибок.

Как запомнить последний построенный воздуховод?

Было бы хорошо, если бы наша программа при повторном запуске, отображала в диалоговом окне данные последнего, построенного воздуховода. Его форму сечения, расход и размер.

Чтобы это происходило, нам нужно где-то хранить эти данные, пока диалоговое окно закрыто.

Предлагаю, хранить их в vla-объекте пространства модели. Для этого нам понадобятся функции расширения языка  LISP.

Добавим строку:

(vl-load-com)

которая загружает функции расширения языка  LISP.

Затем  получим имя vla-объекта самой программы AutoCAD и сохраним его в переменной acad_object:

(setq acad_object (vlax-get-acad-object))

Далее определяем имя активного документа и сохраним его в переменной active_document:

(setq active_document (vlax-get-activedocument acad_object))

И наконец  имя vla-объекта пространства модели, которое сохраняем в переменной model_space :

(setq model_space (vlax-get-modelspace active_document))

Добавим эти строки в основную программу. См. рис. 9.

Автоматизация проектирования

Рис. 9 . Добавления в основную программу.

Пока диалоговое окно открыто, мы можем прочитать значение радиокнопки «Круглый» (код «rb_K»):

(get_tile "rb_K")

И затем при помощи функции vlax-ldata-put сохранить его в пространстве модели:

(vlax-ldata-put model_space "ms_rb_K" (get_tile "rb_K"))
model_space - VLA-объект к которому добавляются данные (пространство модели);
"ms_rb_K" – код, при помощи которого эти данные можно будет прочитать;
(get_tile "rb_K") – значение радиокнопки «Круглый» (код "rb_K"), которое мы сохраняем в пространстве модели.

Аналогичным образом, запоминаем в пространстве модели:

Значение радиокнопки «Прямоугольный» (код «rb_P»):

(vlax-ldata-put model_space "ms_rb_P" (get_tile "rb_P"))

Значение поля  «Расход  м3/ч» (код «еb_L»):

(vlax-ldata-put model_space "ms_eb_L" (get_tile "eb_L"))

И номер текущего элемента в раскрывающемся списке  «Размер мм» (код «рор1»):

(vlax-ldata-put model_space "ms_pop1" (get_tile "pop1"))

Создадим для записи данных из диалогового окна в пространство модели, пользовательскую функцию do_get:

(defun do_get (/)
  (vlax-ldata-put model_space "ms_rb_K" (get_tile "rb_K"))
  (vlax-ldata-put model_space "ms_rb_P" (get_tile "rb_P"))
  (vlax-ldata-put model_space "ms_eb_L" (get_tile "eb_L"))
  (vlax-ldata-put model_space "ms_pop1" (get_tile "pop1"))
)

И чтобы она выполнялась, перед самым закрытием диалогового окна, в основной программе добавим ее в строчку нажатия кнопки ОК:

(action_tile "accept" "(done_dialog 1)")

В результате получим:

(action_tile "accept" "(do_get) (done_dialog 1)")

Добавляем вышесказанное в программу. См. рис. 10.

Автоматизация проектирования

Рис. 10 . Функция записи данных из диалогового окна в пространство модели.

Теперь данные, которые были в диалоговом окне последними, хранятся в пространстве модели.

И нам остается их просто извлечь оттуда при повторном открытии диалогового окна

Для извлечения данных используется функция vlax-ldata-get:

Извлечем значение радиокнопки «Круглый» (код в пространстве модели  «za_rb_K»)

(vlax-ldata-get model_space "za_rb_K" "1"))
model_space - VLA-объект из которого извлекаются данные;
"za_rb_K" – код  данных
"1" – значение, которое вернет функция vlax-ldata-get, если данных с кодом "za_rb_K" в VLA-объекте нет ("1" – радиокнопка включена).

И при помощи функции set_tile присвоим извлеченное значение радиокнопки «Круглый» (код «rb_K»):

(set_tile "rb_K" (vlax-ldata-get model_space "ms_rb_K" "1"))

Аналогичным образом, считываем из пространства модели и присваиваем значения:

Радиокнопке «Прямоугольный» (код «rb_P»):

(set_tile "rb_P" (vlax-ldata-get model_space "ms_rb_P" "0"))

Полю  «Расход  м3/ч» (код «еb_L»):

(set_tile "eb_L" (vlax-ldata-get model_space "ms_eb_L"))

Раскрывающемуся списку  «Размер мм» (код «рор1»):

(set_tile "pop1" (vlax-ldata-get model_space "ms_pop1" "0"))

Обратим внимание на то, что мы не можем присвоить значение  раскрывающемуся списку  «Размер мм» (код «рор1»), пока о не заполнен.

Поэтому, перед строкой

(set_tile "pop1" (vlax-ldata-get model_space "ms_pop1" "0"))

Вызываем функцию заполнения раскрывающегося списка iz_sech:

(iz_sech)

Создадим для записи данных из пространства модели в диалоговое окно, пользовательскую функцию do_put:

(defun do_put (/)
  (set_tile "rb_K" (vlax-ldata-get model_space "ms_rb_K" "1"))
  (set_tile "rb_P" (vlax-ldata-get model_space "ms_rb_P" "0"))
  (set_tile "eb_L" (vlax-ldata-get model_space "ms_eb_L"))
  (iz_sech)
  (set_tile "pop1" (vlax-ldata-get model_space "ms_pop1" "0"))
)

В основной программе выполним эту функцию сразу после открытия диалогового окна:

(do_put)

Поскольку функция  (iz_sech), будет выполнена при вызове (do_put), из основной программы ее нужно убрать.

Добавляем все вышесказанное. См. Рис. 11.

Автоматизация проектирования

Рис. 11. Функция записи данных из пространства модели в диалоговое окно.

Нажмите на кнопку: «Загрузить активное окно редактора«;

Перейдите в Автокад;

В командной строке введите pr_ush и нажмите <Enter>.

Откроется диалоговое окно. Несколько раз поменяйте форму сечения: круглое на прямоугольное и наоборот.

Тем самым мы меняет содержимое раскрывающегося списка. На некотором шаге программа не знает, какой элемент списка нужно делать текущем.

См. Рис. 12.

Автоматизация проектирования

Рис. 12. Текущее значение раскрывающегося списка пусто.

Нажмите кнопку «Отмена», окно закроется.

Чтобы, это исправить добавляем в пользовательскую функцию изменения формы сечения iz_sech строку:

(set_tile «pop1» (vlax-ldata-get model_space «ms_pop1» «0»))

См. Рис. 13.

Автоматизация проектирования

Рис. 13. Функция изменения формы сечения.

Эта строка возьмет номер элемента из пространства модели (если его там пока нет, возьмет значение «0» — первый элемент списка)  и сделает его текущим в раскрывающемся списке.

Нажмите на кнопку: «Загрузить активное окно редактора«;

Перейдите в Автокад;

В командной строке введите pr_ush и нажмите <Enter>.

Откроется диалоговое окно.

Поменяйте форму сечения на «Прямоугольный»; Измените «Расход м3/ч» на 750; Выберите «Сечение мм» 250х200 и нажмите ОК. См. Рис. 14.

Автоматизация проектирования

Рис. 14. Диалоговое окно.

Укажите три точки, чтобы построить пару воздуховодов. См. Рис. 15.

Автоматизация проектирования

Рис. 15. Воздуховоды.

Нажмите <Enter>, чтобы завершить выполнение программы.

И снова нажмите <Enter>, чтобы повторить команду.

Откроется диалоговое окно с данными последнего построенного воздуховода. См. Рис. 16.

Автоматизация проектирования

Рис. 16. Диалоговое окно.

Как добавить к воздуховоду, дополнительные данные?

При создании программ на языке LISP, часто возникает потребность, добавить к построенному объекту (примитиву) дополнительные данные. Чтобы они хранились в нем, и по мере необходимости имелась  возможность, их оттуда извлечь.

Сделать это можно несколькими способами. Но в данной статье мы рассмотрим, на мой взгляд, самый простой из них.

А впрочем, мы его уже рассмотрели чуть выше, когда сохраняли данные в vla-объекте пространства модели.

Дело в том, что таким способом можно хранить данные в любом vla-объекте.

Чтобы, добавить дополнительные данные к мультилинии (воздуховоду):

При помощи функция entlast извлекает имя последнего нарисованного примитива (мультилинии):

(entlast)

Затем, при помощи функции vlax-ename->vla-object преобразуем ее в vla-объект:

(vlax-ename->vla-object (entlast))

Строка вернем имя vla-объекта.

Запомним его в переменной vla_puch

(setq vla_puch (vlax-ename->vla-object (entlast)))

Теперь, давайте добавим к нашему vla-объекту размер сечения. Снова используем функцию vlax-ldata-put:

(vlax-ldata-put vla_puch "Razmer" <размер сечения>)
vla_puch -  имя VLA-объекта, к которому добавляются данные;
"Razmer" – код, при помощи которого эти данные можно будет прочитать;
<размер сечения>  – данные, которые будут добавлены.

Давайте найдем, в какой переменной у нас хранится размер сечения.

Эта переменная у нас находится в пользовательской программе расчета скорости ras_v.

А если точнее, то таких переменных две:

Raz – для круглого сечения воздуховода;
RazР – для прямоугольного сечения воздуховода.

См. Рис. 17.

Автоматизация проектирования

рис. 17. Две переменные с размером сечения.

Давайте немного изменим программу, чтобы переменные совпадали. Заменим строку:

(setq Raz (atoi (nth (atoi (get_tile "pop1")) plist_K)))

На строки:

(setq RazP (nth (atoi (get_tile "pop1")) plist_K))
(setq Raz (atoi RazР))

Да и не забудьте убрать L и RazР  из списка временных переменных. Они будут использоваться за пределами функции ras_v.

См. Рис. 18.

Автоматизация проектирования

Рис. 18. Функция расчета скорости.

Теперь, функция добавления размера сечения к нашему vla-объекту, будет выглядеть так:

(vlax-ldata-put vla_puch "Razmer" RazP)
vla_puch -  имя VLA-объекта, к которому добавляются данные;
"Razmer" – код, при помощи которого эти данные можно будет прочитать;
RazP  – переменная, в которой хранится размер сечения.

Аналогично, добавляем значение расхода воздуха:

(vlax-ldata-put vla_puch "Rashod" L)
vla_puch -  имя VLA-объекта, к которому добавляются данные;
"Rashod" – код, при помощи которого эти данные можно будет прочитать;
L – переменная, в которой хранится расход воздуха.

Добавляем строки:

(setq vla_puch (vlax-ename->vla-object (entlast)))
(vlax-ldata-put vla_puch "Razmer" RazP)
(vlax-ldata-put vla_puch "Rashod" L)

В пользовательскую функцию Vml, сразу после строки построения мультилинии. См. Рис. 19.

Автоматизация проектирования

Рис. 19. Функция вставки мультилинии.

И так дополнительные данные добавлены.

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

Автоматизация проектирования

Рис. 20. Основная программа.

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

Автоматизация проектирования

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

Давайте проверим, все ли у нас правильно работает

Нажмите на кнопку: «Загрузить активное окно редактора«;

Перейдите в Автокад;

В командной строке введите pr_ush и нажмите <Enter>.

Откроется диалоговое окно.

Введите «Расход м3/ч» 1000.

Выберите «Сечение мм» 300х150 и нажмите ОК. См. Рис. 22.

Автоматизация проектирования

Рис. 22. Диалоговое окно.

Укажите две точки. Программа построить воздуховод. См. Рис. 23.

Автоматизация проектирования

Рис. 23. Воздуховод.

Чтобы, проверить есть ли в нем дополнительные данные, которые мы добавили.

Перейдите в редактор Visual LISP.

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

Читаем и преобразуем в VLA-объект последний построенный объект:

(setq vla_puch (vlax-ename->vla-object (entlast)))

Извлекаем из него данные под кодом «Razmer»:

(vlax-ldata-get vla_puch "Razmer")

Извлекаем из него данные под кодом «Rashod»:

(vlax-ldata-get vla_puch "Rashod")

Выделите все три строки и нажмите на кнопку «Загрузить выделенный фрагмент». Ниже в окне «Консоль Visual LISP» отобразятся результаты выполнения этих строк. См. Рис. 24.

Автоматизация проектирования

Рис. 24. Извлекаем добавленные данные.

Первая строка вернет имя VLA-объекта;
Вторая - размер сечения;
Третья – расход воздуха.

Значит воздуховод, действительно хранит в себе дополнительные данные.

Программный код:

;---------------------- Функция изменения сечения ------------------------------
(defun iz_sech (/)
  (setq plist_K (list "100" "125" "160" "200" "250" "315" "400" "450" "500"
                 "600" "710" "800" "900" "1000" "1125" "1250" "1400" "1500"))
  (setq plist_P (list "100x100" "150x100" "150x150" "200x100" "200x150" "200x200"
                 "250x100" "250x150" "250x200" "250x250" "300x100" "300x150"))
 
  (if (eq (get_tile "rb_K") "1")
    (progn
      (start_list "pop1")
        (mapcar 'add_list plist_K);заполнение значениями из списка
      (end_list)
      (setq kodS "vozK")
    ); end progn
    (progn
      (start_list "pop1")
        (mapcar 'add_list plist_P);заполнение значениями из списка
      (end_list)
      (setq kodS "vozP")
    ); end progn
  ); end if
  (set_tile "pop1" (vlax-ldata-get model_space "ms_pop1" "0"))
); end defun
;---------------------- Функция расчета скорости -------------------------------
(defun ras_v (/ n H)
  (setq L (atoi (get_tile "eb_L")));Считываем и запоминаем расход
  (if (eq (get_tile "rb_K") "1")
    (progn 
      (setq RazP (nth (atoi (get_tile "pop1")) plist_K))
      (setq Raz (atoi RazP))
      (set_tile "eb_V" (rtos (/ (* 40000 L) 36 (* Raz Raz pi))))
    ); end progn
    (progn
      (setq RazP (nth (atoi (get_tile "pop1")) plist_P))
      (setq n (vl-string-search "x" RazP))
      (setq Raz (atoi (substr RazP 1 n))) 
      (setq H (atoi(substr RazP (+ n 2))))
      (set_tile "eb_V" (rtos (/ (* 10000 L) 36.0 (* Raz H))))
    ); end progn
  ); end if
); end defun
;----------- Функция создания стиля мильтилинии для круглого сечения -----------
(defun SMLK (/ mlDict mlList)
  (if (= nil (member (cons 3 "VENK")(dictsearch (namedobjdict) "ACAD_MLINESTYLE"))) 
    (progn
      (setq mlDict (cdr(assoc -1(dictsearch (namedobjdict) "ACAD_MLINESTYLE"))))
      (setq mlList '((0 . "MLINESTYLE")(102 . "{ACAD_REACTORS")(102 . "}")
                     (100 . "AcDbMlineStyle")
                     (2 . "VenK")
                     (70 . 272)
                     (3 . "Воздуховод") 
                     (51 . 1.5708)
                     (52 . 1.5708)
                     (71 . 3)
                     (49 . 0.5)
                     (62 . 256) 
                     (6 . "BYLAYER")
                     (49 . 0.0)
                     (62 . 6)
                     (6 . "ОСЕВАЯ")
                     (49 . -0.5)
                     (62 . 256)
                     (6 . "BYLAYER"))
      ); end setq
      (dictadd mlDict "VenK" (entmakex mlList))
    ); end progn
  ); end if
); end defun
;------ Функция создания стиля мильтилинии для прямоугольного сечения ---------
(defun SMLP (/ mlDict mlList)
  (if (= nil (member (cons 3 "VENP")(dictsearch (namedobjdict) "ACAD_MLINESTYLE"))) 
    (progn
      (setq mlDict (cdr(assoc -1(dictsearch (namedobjdict) "ACAD_MLINESTYLE"))))
      (setq mlList '((0 . "MLINESTYLE")(102 . "{ACAD_REACTORS")(102 . "}")
                     (100 . "AcDbMlineStyle")
                     (2 . "VenK")
                     (70 . 272)
                     (3 . "Воздуховод") 
                     (51 . 1.5708)
                     (52 . 1.5708)
                     (71 . 3)
                     (49 . 0.5)
                     (62 . 256) 
                     (6 . "BYLAYER")
                     (49 . 0.0)
                     (62 . 3)
                     (6 . "ОСЕВАЯ")
                     (49 . -0.5)
                     (62 . 256)
                     (6 . "BYLAYER"))
      ); end setq
      (dictadd mlDict "VenP" (entmakex mlList))
    ); end progn
  ); end if
); end defun
;----------------- Функция вставки мультилинии -------------------------------
(defun Vml ( Di / p1 p2 Cml)
  (defun *error* (msg)
    (princ msg) 
    (setvar "CMLSTYLE" Cml) 
  ); end defun
  (SMLK)
  (SMLP)
  (setq Cml (getvar "CMLSTYLE"))
  (setq p1 (getpoint "\nУкажите первую точку :"))
  (if (eq kodS "vozK") (setvar "CMLSTYLE" "VenK"))
  (if (eq kodS "vozP") (setvar "CMLSTYLE" "VenP"))
 
  (while
    (setq p2 (getpoint "\nУкажите следующую точку или Enter для завершения:" p1)) 
    (command "_mline" "_J" "_Z" "_S" Di p1 p2 "") 
    (setq vla_puch (vlax-ename->vla-object (entlast))) 
    (vlax-ldata-put vla_puch "Razmer" RazP)
    (vlax-ldata-put vla_puch "Rashod" L) 
    (setq p1 p2)
  ); end while
  (setvar "CMLSTYLE" Cml)
); end defun
;------- из диалогового окна в пространство модели ---------------------------
(defun do_get (/)
  (vlax-ldata-put model_space "ms_rb_K" (get_tile "rb_K"))
  (vlax-ldata-put model_space "ms_rb_P" (get_tile "rb_P"))
  (vlax-ldata-put model_space "ms_eb_L" (get_tile "eb_L"))
  (vlax-ldata-put model_space "ms_pop1" (get_tile "pop1")) 
)
;------- из пространства модели в диалогового окна ---------------------------
(defun do_put (/) 
  (set_tile "rb_K" (vlax-ldata-get model_space "ms_rb_K" "1"))
  (set_tile "rb_P" (vlax-ldata-get model_space "ms_rb_P" "0"))
  (set_tile "eb_L" (vlax-ldata-get model_space "ms_eb_L" "150"))
  (iz_sech)
  (set_tile "pop1" (vlax-ldata-get model_space "ms_pop1" "0")) 
)
;------------------------ Основная программа ----------------------------------
(defun c:pr_uch (/ dcl_id ddi Raz plist_K plist_P kodS RazP L vla_puch
                   acad_object active_document model_space)
  (vl-load-com)
  (setq acad_object (vlax-get-acad-object))
  (setq active_document (vla-get-activedocument acad_object))
  (setq model_space (vla-get-modelspace active_document))
  ;--------- Диалоговое окно ------------
  (setq dcl_id (load_dialog "d:/MyLisp/Vozduh.dcl")); загружаем диалог (файл DCL)
  (if (not (new_dialog "pr_uch" dcl_id))(exit)) ; проверка существования диалога
  (do_put) 
  (ras_v)
  (action_tile "rb_K" "(iz_sech) (ras_v)")
  (action_tile "rb_P" "(iz_sech) (ras_v)")
  (action_tile "pop1" "(ras_v)")
  (action_tile "eb_L" "(ras_v)")
  (action_tile "accept" "(do_get) (done_dialog 1)");Если нажата кнопка "аccept"
  (action_tile "cancel" "(done_dialog 0)");Если нажата кнопка "cancel"
  (setq ddi (start_dialog))
 
  (unload_dialog dcl_id) ; выгрузить Диалоговое окно
  ;--------------------------------------
  (if (= ddi 1) (Vml Raz))
); end defun
;--------------------------------------------------------------------------------

На этом наш урок окончен. В нем мы рассмотрели некоторые вопросы автоматизации проектирования при помощи программ написанных на языке LISP.

Если у Вас появились вопросы, задавайте их в комментариях.

Если Вы нашли что-то полезное на моем сайте не забудьте порекомендовать статью в социальных сетях.

Пишите в комментариях или мне на почту Ваши пожелания о том, какие статьи Вы хотели бы увидеть на моем сайте.

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

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

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

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

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

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

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