Список работ

AutoLISP в задаче создания графической модели элемента электрической схемы

Содержание

ВВЕДЕНИЕ

Рассматриваются методы программирования на AutoLISP на примере создания графического обозначения библиотечного элемента электрической схемы (резистора, конденсатора, диода и пр.).
Библиотечный элемент сохраняется в файле как блок Автокада, который может быть применен (вставлен) при создании чертежа, например, принципиальной электрической схемы. Для библиотечных элементом предусмотрена директория C:/pls/, имя которой хранит глобальная переменная $pdir, задаваемая при инициализации приложения.
Все созданные AutoLISP-функции собраны в одном файле и загружаются при запуске Автокада.
Основная цель работы - это знакомство с функциями Автолиспа, обеспечивающими доступ к примитивам и таблицам Автокада.
Разработка выполнена средствами англоязычной студенческой версии Автокада (AutoCAD Student Version).

ГРАФИЧЕСКАЯ МОДЕЛЬ ЭЛЕМЕНТА ЭЛЕКТРИЧЕСКОЙ СХЕМЫ

Графическая модель элемента электрической схемы состоит из приведенных в табл. 1 компонентов.

Таблица. 1. Компоненты графической модели элемента электрической схемы.

КомпонентСлойОбразующие примитивы
 Условное графическое обозначение элемента  GATE  DRAW-примитивы Автокада 
 Вывод  PINCON  Вставленный блок $pin 
 Номер вывода  PINNUM  Атрибут модели элемента 
 Позиционное обозначение элемента  REFDES  Атрибут модели элемента 

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

Модель резистора в Автокаде

Рис. 1. Графическое представления резистора

Номера выводов и позиционные обозначения элементов используются, в частности, при генерации списка соединений электрической схемы
В библиотеке резистор хранится как блок Автокада. При вставке блока в чертеж электрической схемы определяются его атрибуты: номера выводов и позиционное обозначение элемента (рис. 2).

Выполнена команда INSERT

Рис. 2. Элемент в чертеже электрической схемы

Для задания значений атрибутов может быть употреблена команда DDATTE (рис. 3).

DDATTE диалог редактирования атрибутов блока

Рис. 3. Редактирование атрибутов блока R

Блок $pin, вставляемый в рисунок в качестве вывода элемента, создается на слое PINCON на основе примитива DONUT и имеет на слое PINPOS предопределенный атрибут PP (рис. 4), хранящий индекс вывода.

Создание блока с предопределенным атрибутом PP

Рис. 4. Блок $pin с атрибутом PP

Индексы выводов визуально не отображаются, но используются функцией PN при задании тега атрибута-номера вывода.
Если же элемент вставляется для редактирования, то он разрушается под действием команды EXPLODE.

ИНИЦИАЛИЗАЦИЯ СРЕДЫ РАЗРАБОТКИ

Перед созданием символа элемента необходимо задать нужные слои и следующие параметры приложения:

Кроме того, на слое PINCON формируется блок $pin с атрибутом PP. Блок употребляется для создания вывода элемента. Описанные действия выполняет функция ST.

; Инициализация приложения
(defun c:ST ( / c bn dp en es ls lnm m p1)
 ; Очистка рисунка: удаляем DRAW-примитивы, атрибуты и выводы
 (aclea)
 ; Слои и их цвета
 (setq ls '(
  ("REFDES" . "_r")
  ("PINCON" . "_b")
  ("PINPOS" . "_y")
  ("PINNUM" . "_b")
  ("GATE" . "_r"))
 )
 ; Создание слоев
 ; Устраняем эхо в командной строке Автокада
 (cmd 0)
 (foreach m ls
  ; Получаем из списка ls имя (lnm) и цвет (c) очередного слоя
  (setq lnm (car m)
   c (cdr m)
  )
  ; Создаем слой, если его нет в рисунке
  ; Функция tblsearch вернет T (истина), если слой с именем lnm есть в рисунке
  (if (not (tblsearch "layer" lnm)) (command "_layer" "_m" lnm "_c" c lnm ""))
 )
 ; Блок для вывода
 (setq p1 '(20 20)
  dp 2.5
  bn "$pin"
  es ""
 )
 ; Создаем блок $pin, если такового нет в рисунке
 ; Вновь для проверки используем tblsearch, но уже с параметром "block"
 (if (not (tblsearch "block" bn))
  (progn
   (command "_layer" "_s" "pincon" ""
    "_donut" 0 dp p1 ""
   )
   ; Набор примитивов блока (вывода)
   ; Функция entlast вернет последний созданный примитив,
   ; а функция ssadd добавит его в набор es
   (setq es (ssadd (entlast)))
   ; Вводим на слое PINPOS предопределенный атрибут PP блока $pin для хранения индекса вывода
   (setvar "aflags" 8)
   (command "_layer" "_s" "pinpos" ""
    "_attdef" "" "PP" "" "" "_m" p1 5 ""
    "_layer" "_s" "pincon" ""
   )
   ; Добавляем атрибут в набор примитивов блока $pin
   (setq es (ssadd (entlast) es))
   ; Создаем на слое PINCON блок $pin
   (command "_block" bn p1 es "")
  )
 )
 ; Установки
 (command "_layer" "_s" "gate"
  "_off" "pinpos" ""
  "_limits" '(0 0) '(160 120)
  "_zoom" "_w" '(0 0) '(160 120)
  "_grid" 5
  "_grid" "_on"
  "_snap" 5
  "_snap" "_on"
  "_ortho" "_on"
  "_color" "_byl"
 )
 (cmd 1)
 (setvar "coords" 1) ; Постоянное обновление абсолютных координат указующего устройства
 (setvar "userr1" 5.0) ; Высота текста позиционного обозначения
 (setvar "userr2" 3.5) ; Высота текста номера вывода
 (setvar "userr3" dp) ; Диаметр вывода
 (setvar "useri1" 2000) ; Время паузы (используется при подсветке базовой точки блока)
 (setvar "lunits" 2) ; Десятичные единицы измерения
 (setvar "pickbox" 6) ; Размер (высота) в пикселях прицела выбора объекта
 (setvar "luprec" 2) ; Точность отображения значений линейных величин
 (setq $pdir "c:/pls/") ; Глобальная переменная с именем пути к библиотеке элементов
 (alert "Готово")
 (princ)
)

Вспомогательные функции:

; Удаляет DRAW-примитивы, блоки и атрибуты (вызывается при инициализации и при вставке блока)
(defun aclea()
 (clean '((0 . "lwpolyline")))
 (clean '((0 . "line") (8 . "gate")))
 (clean '((0 . "text")))
 (clean '((0 . "circle") (8 . "gate")))
 (clean '((0 . "arc") (8 . "gate")))
 (clean '((0 . "insert") (8 . "pincon")))
 (clean '((0 . "insert") (8 . "gate")))
 (clean '((0 . "attdef") (8 . "refdes")))
 (clean '((0 . "attdef") (8 . "pinnum")))
)
; Удаляет, используя фильтр f, собранные примитивы
(defun clean (f / en es i)
 ; Функция ssget вернет отфильтрованный набор es
 (setq es (ssget "_x" f)
  i 0
 )
 (if es
  ; Функция ssname вернет i-й примитив набора es
  (while (setq en (ssname es i))
   (setq i (1+ i))
   ; Функция entdel удалит примитив en
   (entdel en)
  )
 )
)
; a = 0 или 1
(defun cmd (a)
 (setvar "cmdecho" a)
)

Поскольку имя функции ST снабжено префиксом C:, то эта функция может быть вызвана в командной строке Автокада непосредственно по имени. Без такого префикса пришлось бы при вызове функции обрамлять ее имя круглыми скобками: (ST2).
Доступ к примитивам Автокада обеспечивается в приведенном коде функциями entdel, entlast , ssget, ssname и ssadd. Поиск в таблицах LAYER и BLOCK выполняет функция tblsearch. Краткое описание функций см. в вышеприведенном коде.

ИЗМЕНЕНИЕ ПАРАМЕТРОВ ПРИЛОЖЕНИЯ

Параметры приложения

изменяются в приведенном на рис. 5. диалоге.

DCL-диалог задания параметров

Рис. 5. Задание параметров приложения

В диалоге употреблена латиница, поскольку по умолчанию в англоязычной версии Автокада кириллица отображается неадекватно.
Форма диалога описывается в следующем DCL-файле (lmnt.dcl):

// keys (tiles): th thp dp ptm
dcl_settings : default_dcl_settings { audit_level = 0; }
prms : dialog {
 label = "Parameters";
 : row {
   : text {
   label = "RD text height";
   alignment = left;
  }
  : popup_list {
   key = "th";
   list = "3.5\n5\n7\n10";
   fixed_width = true;
   width = 4;
   alignment = right;
   }
  }
 : row {
   : text {
   label = "Pin name text height";
   alignment = left;
  }
  : popup_list {
   key = "thp";
   list = "3.5\n5\n7";
   fixed_width = true;
   width = 4;
   alignment = right;
  }
 }
 : row {
  : text {
   label = "Pin diameter";
   alignment = left;
  }
  : edit_box {
   key = "dp";
   fixed_width = true;
   width = 4;
   alignment = right;
  }
 }
 : row {
  : text {
   label = "Pause duration";
   alignment = left;
  }
  : edit_box {
   key = "ptm";
   fixed_width = true;
   width = 4;
   alignment = right;
  }
 }
 spacer_1;
 ok_cancel_err;
}

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

; Параметры приложения
(defun c:CF ( / d fl gets th thp)
 ; Обработчик нажатия на кнопку OK
 (defun gets( / dp ptm thN thpN)
  (if
   (cond
    ; Контролируем ввод числовых значений
    ((not (setq dp (ai_num (get_tile "dp") "Invalid pin diameter" 0)))
     (mode_tile "dp" 2)
     F
    )
    ((not (setq ptm (ai_num (get_tile "ptm") "Invalid pause duration" 0)))
     (mode_tile "ptm" 2)
     F
    )
    (t T)
   )
   (progn
    (setq thN (get_tile "th"))
    ; Высота текста позиционного обозначения
    (setvar "userr1"
     (cond
      ((= thN "0") 3.5)
      ((= thN "1") 5)
      ((= thN "2") 7)
      ((= thN "3") 10)
      (t 5)
     )
    )
    ; Высота текста номера вывода
    (setq thpN (get_tile "thp"))
    (setvar "userr2"
     (cond
      ((= thpN "0") 3.5)
      ((= thpN "1") 5)
      ((= thpN "2") 7)
     )
    )
    ; Диаметр вывода не может быть меньше 2.5
    (setvar "userr3" (if (< dp 2.5) 2.5 dp))
    ; Время паузы не может быть меньше 1000
    ; Функция fix возвращает целую часть своего параметра
    (setvar "useri1" (fix (if (< ptm 1000) 1000 ptm)))
    (done_dialog 1)
   )
  )
 )
 ; Загрузка диалогов из файла lmnt.dcl
 (setq d (load_dialog (strcat $pdir "lmnt")))
 ; prms - имя диалога в DCL-файле
 (if (not (new_dialog "prms" d)) (exit))
 ; Инициализация диалога
 ; Высота текста позиционного обозначения
 (setq th (getvar "userr1"))
 (set_tile "th"
  (cond ((= th 3.5) "0")
   ((= th 5) "1")
   ((= th 7) "2")
   ((= th 10) "3")
   (t "1")
  )
 )
 ; Высота текста номера вывода
 (setq thp (getvar "userr2"))
 (set_tile "thp"
  (cond ((= thp 3.5) "0")
   ((= thp 5) "1")
   ((= thp 7) "2")
   (t "0")
  )
 )
 ; Диаметр вывода
 ; Функция rtos преобразует вещественное число в строку
 (set_tile "dp" (rtos (getvar "userr3")))
 ; Время паузы
 ; Функция itoa преобразует целое число в строку
 (set_tile "ptm" (itoa (getvar "useri1")))
 ; Обработчик копки OK
 (action_tile "accept" "(gets)")
 (action_tile "cancel" "(done_dialog 0)")
 (setq dlg_res (start_dialog))
 (unload_dialog d)
 (princ)
)

Если в поле ввода dp или ptm диалога ввести нечисловое значение, то функция ai_num вернет F (nil) и в Err-строке диалога поместит сообщение, задаваемое вторым параметром функции (рис. 6).

OK_CANCEL_ERR в режиме фиксации ошибки

Рис. 6. Ошибка при задании диаметра вывода

СОЗДАНИЕ ГРАФИЧЕСКОЙ МОДЕЛИ БИБЛИОТЕЧНОГО ЭЛЕМЕНТА

Выполняется в следующей последовательности:

  1. Инициализировать приложение (функция ST).
  2. Проверить параметры приложения (функция CF).
  3. Нарисовать на слое GATE DRAW-средствами Автокада условное графическое обозначение элемента.
  4. Вставить вывода элемента (функция IP).
  5. Задать номера выводов элемента (функция PN).
  6. Задать позиционное обозначение элемента (функция RD).
  7. Сохранить в библиотеки созданный элемент (функция FS).

Приведенная последовательность иллюстрируется рис. 7.

Использованы команды RECTANGLE, INSERT и ATTDEF

Рис. 7. Последовательность создания библиотечного элемента

При выполнении функции PN нумеруемый вывод подсвечивается. Для подсветки в рисунок временно вводится примитив DONUT, залитый цветом CYAN.
Загрузка (вставка) элемента для последующего редактирования выполняется функцией LD. После загрузки и паузы элемент (вставленный блок) разрушается. Время паузы хранит целочисленная системная переменная useri1. Во время паузы подсвечивается базовая точка вставленного элемента (рис. 8).

Вставка блока с DONUT-подсветкой

Рис. 8. Элемент сразу после вставки (до разрушения)

Подсветка достигается за счет введения желтого примитива DONUT. После задержки на время паузы примитив удаляется.

ВСТАВКА ВЫВОДОВ

Вставку указанного числа выводов выполняет функция IP.

; Вставка np выводов на слой PINCON (используется блок $pin)
(defun c:IP ( / en es np p pID pm pp)
 ; Запрещаем пустой ввод, ввод нуля и отрицательного числа
 (initget 7)
 ; Проверяем, есть ли в рисунке выводы
 (setq es (ssget "_x" '((0 . "insert") (8 . "pincon")))
  pm 0
  np (getint "\nЧисло выводов: ")
 )
 (if es
  ; Находим по паре (1 . "PP") наибольший индекс ранее вставленных выводов
  (while (setq en (ssname es 0))
   ; Функции ssdel удалит примитив en из набора es
   (setq es (ssdel en es)
    ; Функция entnext вернет следующий примитив, а entget - его описание
    ; Функция atoi преобразует строку в целое число
    pp (atoi (cdr (assoc 1 (entget (entnext en)))))
    pm (if (> pp pm) pp pm)
   )
  )
 )
 (cmd 0)
 ; Активизируем слой PINCON, если он отключен
 (if (< (cdr (assoc 62 (tblsearch "layer" "pincon"))) 0) (command "_layer" "_on" "pincon" ""))
 ; Делаем слой PINCON текущим
 (command "_layer" "_s" "pincon" "")
 ; Объектная привязка (End point или Center)
 (setvar "osmode" 5)
 (while (> np 0)
  ; Запрещаем пустой ввод
  (initget 1)
  (setq p (getpoint "\nРасположение вывода: "))
  ; Вставка блока $pin
  (command "_insert" "$pin" p 1 1 "")
  (setq pm (1+ pm)
   ; Индекс добавляемого вывода
   pID (itoa pm)
   np (1- np)
   en (entnext (entlast))
  )
  ; Модифицируем значение индекса вставленного вывода
  (subval (entget en) en pID)
 )
 (cmd 1)
 (setvar "clayer" "gate")
 (setvar "osmode" 0)
 (princ)
)

Вспомогательная функция subval.

; Модифицирует пару (1 . "PP") в описании вставленного блока
(defun subval (ed en vl)
 (setq ed (subst (cons 1 vl) (assoc 1 ed) ed))
 ; Обновляем описание примитива
 (entmod ed)
 ; Обновляем примитив
 (entupd en)
 ed
)

Для доступа к примитивам рисунка использованы функции entget, entlast, entmod, entnext, entupd, ssdel , ssget и ssname.

ЗАДАНИЕ НОМЕРОВ ВЫВОДОВ

Номера выводов задаются функцией PN как предопределенные атрибуты библиотечного элемента.

; Задает номера ранее вставленных выводов
(defun c:PN ( / en es esd ess thp dp nd f i ls np pNbr pp pt)
 ; Высота текста номера вывода и диаметр вывода
 (setq thp (getvar "userr2")
  dp (getvar "userr3")
 )
 ; Набор блоков (выводов) на слое PINCON
 (setq es (ssget "_x" '((0 . "insert") (8 . "pincon")))
  f 0)
 (if es
  (progn
   ; ls - список заданных номеров выводов
   (setq ls nil
    i (1- (sslength es))
    ; Набор с номерами выводов
    ess (ssget "_x" (list (cons 0 "attdef") (cons 8 "pinnum")))
   )
   (if ess
    (progn
     ; Число элементов в наборе ess
     (setq f (sslength ess))
     (while (setq en (ssname ess 0))
      (setq ess (ssdel en ess)
       ls (cons (cdr (assoc 2 (entget en))) ls)
      )
     )
    )
   )
   ; Проверяем, все ли номера выводов заданы
   (if (/= (1+ i) f)
    (progn
     (setvar "clayer" "pinnum")
     ; Определяем значение атрибута PP вставленного вывода и формируем тег создаваемого атрибута
     (while (setq en (ssname es i))
      (setq i (1- i)
       pt (cdr (assoc 10 (entget en)))
       pp (cdr (assoc 1 (entget (entnext en))))
       ; Тег создаваемого атрибута
       np (strcat "N" pp)
      )
      (if (not (member np ls))
       (progn
        (cmd 0)
        ; Подсветка вывода
        (command "_color" "_c"
         "_donut" 0 dp pt ""
         "_color" "_byl")
        (cmd 1)
        (setq pNbr (getstring (strcat "\nНомер вывода (pp=" pp ") <" pp ">:"))
         pNbr (if (= pNbr "") pp pNbr))
        ; Запрет пустого ввода
        (initget 1)
        (setq pt (getpoint "\nРасположение (средняя точка текста): "))
        (setvar "aflags" 8)
        (cmd 0)
        (command "_attdef" "" np "" pNbr "_m" pt thp "0")
        (cmd 1)
        ; Устраняем подсветку текущего вывода (примитив DONUT),
        ; а также не штатно оставшиеся в рисунке примитивы DONUT
        (if (setq esd (ssget "_x" (list (cons 0 "lwpolyline") (cons 8 "pinnum"))))
         (while (setq en (ssname esd 0))
          (entdel en)
          (ssdel en esd)
         )
        )
        (redraw)
       )
      )
     )
     (setvar "clayer" "gate")
    )
    (alert "Выводы пронумерованы")
   )
  )
  (alert "Выводы не обнаружены")
 )
 (princ)
)

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

(if (setq esd (ssget "_x" (list (cons 0 "lwpolyline") (cons 8 "pinnum"))))
 (while (setq en (ssname esd 0))
  (entdel en)
  (ssdel en esd)
 )
)

После удаления примитива en из рисунка: (entdel en) этот примитив удаляется и из набора esd: (ssdel en esd).

ЗАДАНИЕ ПОЗИЦИОННОГО ОБОЗНАЧЕНИЯ

Позиционное обозначение вводится функций RD как предопределенный атрибут с тегом RD.

; Определяем предопределенный атрибут на слое REFDES с тегом RD и значением по умолчанию P
(defun c:RD ( / pt)
 ; Очищаем слой REFDES
 (clean '((0 . "attdef") (8 . "refdes")))
 (setq th (getvar "userr1"))
 (prompt "\nRD расположение")
 ; Запрещаем пустой ввод
 (initget 1)
 (setq pt (getpoint " (средняя точка текста): "))
 ; Предопределенный атрибут
 (setvar "aflags" 8)
 (cmd 0)
 (command "_layer" "_on" "refdes" "_s" "refdes" ""
  "_attdef" "" "RD" "" "P" "_m" pt th 0)
 (cmd 1)
 (setvar "clayer" "gate")
 (princ)
)

СОХРАНЕНИЕ БИБЛИОТЕЧНОГО ЭЛЕМЕНТА

Графическая модель элемента записывается в библиотеку функцией FS как блок. Имя директории библиотеки элементов хранит глобальная переменная $pdir.

; Запись библиотечного элемента
(defun c:FS ( / es ess fn gets les less)
 (if (ssget "_x" '((0 . "attdef") (8 . "refdes")))
  (if (setq es (ssget "_x" '((0 . "insert") (8 . "pincon"))))
   (progn
    (setq ess (ssget "_x" '((0 . "attdef") (8 . "pinnum")))
     les (if es (sslength es) -1)
     less (if ess (sslength ess) -2)
    )
    (if (= les less)
     ; По умолчанию имя библиотечного элемента имеет значение e.dwg
     (if (setq fn (getfiled "Ввод имени файла библиотечного элемента" (strcat $pdir "e") "dwg" 1))
      (saveFl fn)
     )
     (alert "Необходимо задать номера всех выводов")
    )
   )
   (alert "Нужно ввести хотя бы один вывод")
  )
  (alert "Необходимо указать позиционное обозначение")
 )
 (princ)
)

Вспомогательные функции

; Сохраняет после проверок библиотечный элемент как блок
(defun saveFl (fn / es ptb)
 (setvar "osmode" 4)
 ; Запрещаем пустой ввод
 (initget 1)
 (setq ptb (getpoint "\nБазовая точка вставки: "))
 (setq es (ssadd)
  ; Собираем примитивы на слое GATE
  es (coll es '((0 . "lwpolyline") (8 . "gate")))
  es (coll es '((0 . "line") (8 . "gate")))
  es (coll es '((0 . "circle") (8 . "gate")))
  es (coll es '((0 . "arc") (8 . "gate")))
  es (coll es '((0 . "solid") (8 . "gate")))
  es (coll es '((0 . "text") (8 . "gate")))
  ; Собираем выводы и атрибуты
  es (atcoll es)
 )
 (setvar "osmode" 0)
 (setvar "clayer" "gate")
 (cmd 0)
 ; Записываем или перезаписываем блок
 (if (findfile fn)
  (command "_wblock" fn "_y" "" ptb es "")
  (command "_wblock" fn "" ptb es "")
 )
 (cmd 1)
 (redraw)
)
; Собирает примитивы, используя фильтр f
(defun coll (es f / en esn i)
 (setq esn (ssget "_x" f)
  i 0
 )
 (if esn
  (while (setq en (ssname esn i))
   (setq i (1+ i))
   es (ssadd en es)
  )
 )
 es
)
; Собирает выводы и атрибуты
(defun atcoll (es)
 (setq es (coll es '((0 . "insert") (8 . "pincon")))
  es (coll es '((0 . "attdef") (8 . "refdes")))
  es (coll es '((0 . "attdef") (8 . "pinnum")))
 )
)

Диалог задания имени файла элемента, открываемый функцией getfiled, показан на рис. 9.

Будет выполнена команда WBLOCK

Рис. 9. Задание имени файла библиотечного элемента

Вставка библиотечного элемента

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

; Вставка элемента
(defun c:LD ( / fn)
 (setq fn (getfiled "Выбор библиотечного элемента" $pdir "dwg" 2))
 (if fn (eload fn))
 (princ)
)
; Вставка блока на слой GATE, подсветка базовой точки и разрушение после паузы библиотечного элемента
; Перед вставкой вычищаем рисунок
(defun eload (fn / bp ed en)
 (if (not (findfile (fnche fn)))
  (alert (strcat "Файл " (fnche fn) " не найден"))
  ; Файл найден
  (progn
   ; Очистка рисунка: удаляем DRAW-примитивы, атрибуты и выводы
   (aclea)
   (if (/= (getvar "clayer") "GATE") (setvar "clayer" "gate"))
   ; Помещаем базовую точку в центр видового порта
   (cmd 0)
   (command "_insert" fn (getvar "viewctr") "" "" "")
   ; Показываем базовую точку посредством примитива DONUT и затем разрушаем блок
   (setq en (entlast) ed (entget en) bp (cdr (assoc 10 ed)))
   (command "_color" "_y"
    "_donut" 0 (getvar "userr3") bp ""
    "_delay" (getvar "useri1")
    "_erase" "_l" ""
    "_explode" en
    "_color" "_byl"
   )
   (cmd 1)
  )
 )
)

Вспомогательная функция fnche.

; fnp - полное имя файла
(defun fnche (fnp / lng)
 (setq lng (strlen fnp))
 (cond
  ; Если длина fnp больше 4 и последние 4 символа не равны .dwg, то добавляем к fnp расширение DWG
  ((and (> lng 4) (not (= ".dwg" (strcase (substr fnp (- lng 3)) T))))
   (setq fnp (strcat fnp ".dwg"))
  )
  ; Добавляем к fnp расширение DWG
  ((and (> lng 0) (<= lng 4))
   (setq fnp (strcat fnp ".dwg"))
  )
  (t fnp)
 )
)

Выбор элемента обеспечивается функцией getfiled.

ЗАПУСК ПРОГРАММ

Для запуска все AutoLISP-функции помещаются в один файл, скажем c:/pls/lmnt.lsp, который можно загрузить в командной строке, например, функцией

(load "c:/pls/lmnt.lsp")

или командой APPLOAD.
После загрузки файла его команды можно вызывать в командной строке приложения.
Далее необходимо обратиться к функции ST и выполнить инициализацию среды.
Также LISP-файл будет загружен при начале работе приложения, если в диалоге (рис. 10), открываемом после выбора меню Tools-Customize-Interface, в ветви LISP files указать загружаемый файл (правая кнопка мыши - Load LISP).

Настройка загрузки LISP файлов

Рис. 10. Файл lmnt.lsp добавлен в число загружаемых LISP файлов

В этом же диалоге можно настроить и раскрывающееся меню, например, с именем Element. Но прежде в список пользовательских команд того же диалога следует добавить вновь введенные команды (рис. 11).

Диалог Custom Commands

Рис. 11. Добавление пользовательских команд

Затем в ветвь Menus перетащить в меню Element вновь добавленные пользовательские команды (рис 12).

Добавление меню в ветвь Menus диалога Customize interface

Рис. 12. Добавлено меню Element

После принятия изменений новые команды можно вызывать не только из командной строки, но и из меню Element (рис. 13).

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

Рис. 13. Выполнена команда LD

ЗАКЛЮЧЕНИЕ

Приведенные программы частично автоматизируют процесс создания графической модели элемента электрической схемы. Один из механизмов автоматизации - это применение средств Автолиспа, обеспечивающих доступ к примитивам рисунка и его таблицам (слоев и блоков).
Описание примитива, возвращаемое функцией entget, - это список точечных пар. Например, если последний введенный в рисунок примитив - это блок $pin, то

(entget (entlast))

вернет следующий список:

((-1 . <Entity name: 7ffff718040>) (0 . "INSERT") (330 . <Entity name: 7ffff7039f0>) (5 . "274") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "PINCON") (100 . "AcDbBlockReference") (66 . 1) (2 . "$pin") (10 -40.0 40.0 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

Функция entlast возвращает ссылку на последний введенный в сцену примитив.
Чтобы получить описание атрибута блока - последнего введенного в сцену примитива, понадобится следующий вызов:

(entget (entnext (entlast))):

((-1 . <Entity name: 7ffff718050>) (0 . "ATTRIB") (330 . <Entity name: 7ffff718040>) (5 . "275") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "PINPOS") (100 . "AcDbText") (10 -41.9424 37.5341 0.0) (40 . 5.0) (1 . "3") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "Standard") (71 . 0) (72 . 4) (11 -40.0 40.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (280 . 0) (2 . "PP") (70 . 8) (73 . 0) (74 . 0) (280 . 0))

Из описания видно, что атрибут имеет тег PP, значение которого равно "3". Этот атрибут используется для хранения индекса вывода.
Функция (entnext en) возвращает ссылку на примитив, следующий за примитивом en.
Точечная пара возвращается функцией assoc. Так, в рассматриваемом примере

(assoc 1 (entget (entnext (entlast))))

вернет

(1 . "3")

Для замены этой пары, скажем, на (1 . "5") можно употребить следующий код:

(setq en (entlast))
(setq ed (entget (entnext en)))
(setq dtpr (assoc 1 ed))
(setq ed (subst (cons 1 "5") dtpr ed))
; Обновляем описание примитива
(entmod ed)
; Обновляем примитив
(entupd en)

ЛИТЕРАТУРА

  1. Autodesk® AutoCAD® Help.
  2. Авдеев Е. В., Еремин А. Т., Норенков И. П, Песков М. И. Системы автоматизированного проектирования в радиоэлектронике. Справочник. - М.: Радио и связь, 1986. - 386 с.

Список работ

Рейтинг@Mail.ru