Тема: Как написать макрос?

Помогите, пожалуйста написать программу-макрос.
На какой-то из страниц нашла для плинии, а мне надо создать кнопку, при нажетии на которую:
1. Переход в определенный слой;
2. Отрисовка в нем блока с заданными в слое цветом и толщиной;
3. Возвращение в слой по умолчанию ("0").
Заранее спасибо

Re: Как написать макрос?

А слой уже гарантированно существует или его надо создавать? А имя блока как определяется? Он тоже уже в файле есть? Нужен именно макрос или лисп тоже покатит?

Re: Как написать макрос?

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

Re: Как написать макрос?

Ясно... На вариант "блок уже есть в чертеже" код достаточно быстро написан (на самом деле один из множества вариантов):

(defun ins (block-name / *error*)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (vla-startundomark *kpblc-activedoc*)
  (setq *error* kpblc-error)
  (kpblc-error-save-sysvar
    '(("cecolor" "bylayer") ("celtype" "bylayer") ("celweight" -1))
    ) ;_ end of kpblc-error-save-sysvar
  (command "_.-insert" block-name)
  (while (/= (getvar "cmdactive") 0)
    (command pause)
    ) ;_ end of while
  (kpblc-error-restore-sysvar)
  (vla-endundomark *kpblc-activedoc*)
  ) ;_ end of defun
(defun kpblc-error (message)
  (if (member message
          '("console break"          "Function cancelled"
        "Функция отменена"      "quit / exit abort"
        "выйти прервать"
        ) ;_list
          ) ;_member
    (princ "\nКоманда прервана пользователем")
    (princ
      (strcat "\ERRNO # "
          (itoa (getvar "ERRNO"))
          ": "
          message
          "\n"
          ) ;_strcat
      ) ;_princ
    ) ;_if
  (kpblc-error-restore-sysvar)
  (vla-endundomark *kpblc-activedoc*)
  (princ)
  ) ;_defun
;|=======================================================================================
*    Сохраняется текущее значение системных переменных. Список глобальный (*kpblc-sysvar-list*)
* При условии, что заданы значения, они устанавливаются.
*    Поскольку список *kpblc-sysvar-list* не обнуляется, в нем хранится история изменения
* значений переменных.
*    Параметры вызова:
*    *kpblc-sysvar-list*    список системных переменных, состояние которых надо сохранить.
*            Список состоит из подсписков (Переменная Значение)
*            В списке могут повторяться Переменные. В таком случае будет
*            установлено последнее значение.
*            Если в качестве второго параметра используется nil, то значение
*            системной переменной просто сохраняется.
*    Примеры вызова:
(kpblc-error-sysvar-list (list '("cmdecho" 0) '("blipmode") '("osmode" 503)))
(kpblc-error-sysvar-list (kpblc-get-all-sysvar-list))
=======================================================================================|;
(defun kpblc-error-save-sysvar (sysvar-list)
  (foreach item    sysvar-list
    (setq *kpblc-sysvar-list*
       (cons
         (list (car item) (getvar (car item)))
         *kpblc-sysvar-list*
         ) ;_ end of cons
      ) ;_ end of setq    
    (if    (cadr item)            ; передано устанавливаемое значение
      (if (and (vl-catch-all-error-p
         (vl-catch-all-apply 'setvar (list (car item) (cadr item)))
         ) ;_ end of VL-CATCH-ALL-ERROR-P
           (= (cadr item) "")
           (wcmatch (strcase (car item) t) "dim*")
           ) ;_ end of and
    (setvar (car item) ".")
    (setvar (car item) (cadr item))
    ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of foreach
  ) ;_ end of defun
;|=============================================================================
*    Восстанавливаются системные переменные. Значения системных переменных
* должны храниться в глобальном списке *kpblc-sysvar-list*. Если списка нет
* (nil), происходит просто выход.
*    Параметры вызова:
*    Нет
*    Примеры вызова:
(kpblc-error-restore-sysvar)
=============================================================================|;
(defun kpblc-error-restore-sysvar ()
  (if *kpblc-sysvar-list*
    (foreach item *kpblc-sysvar-list*
      (if (or (vl-catch-all-error-p
        (vl-catch-all-apply 'setvar (list (car item) (cadr item)))
        ) ;_ end of vl-catch-all-error-p
          (= (cadr item) "")
          (wcmatch (strcase (car item) r) "dim*")
          ) ;_ end of and
    (setvar (car item) ".")
    (setvar (car item) (cadr item))
    ) ;_ end of if
      ) ;_ end of foreach
    ) ;_ end of if
  (setq *kpblc-sysvar-list* nil)
  (gc)
  ) ;_ end of defun

Если файл сохранен как kpblc-ins.lsp по путям доступа када, то макрос для вызова:
вариант 1:

^C^C(if (null (ins)) (load "kpblc-ins.lsp"));(ins "[b]Имя_блока_в_кавычках[/b]");

вариант 2:

^C^C(if (not *kpblc-activedoc*) (load "kpblc-ins.lsp"));(ins "[b]Имя_блока_в_кавычках[/b]");

Например, надо вставлять блок с именем "ЭО_Розетка". Тогда выделенное полужирным надо заменить на "ЭО_Розетка".
По поводу макросов могу порекомендовать купить книгу В.Свет "AutoCAD Язык макрокоманд и создание кнопок", и почитать http://dwg.ru/art/2

Re: Как написать макрос?

Огромное спасибо за помощь!
Поко не все ясно, но сейчас буду пробовать и разбираться!
Еще раз СПАСИБО! :)