Ясно... На вариант "блок уже есть в чертеже" код достаточно быстро написан (на самом деле один из множества вариантов):
(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