Подстановка ранее использованных значений в макросе
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Подстановка ранее использованных значений в макросе

Подстановка ранее использованных значений в макросе

Ответ
Поиск в этой теме
Непрочитано 25.02.2014, 14:25 #1
Подстановка ранее использованных значений в макросе
Alikme
 
Регистрация: 25.02.2014
Сообщений: 7

Доброго дня!
Друзья, помогите усовершенствовать макрос:

Код:
[Выделить все]
 (defun C:qadro();прямоугольник по центральной точке
	  (setq os (getvar "osmode")) 	
  	  (setq cmd (getvar "CMDECHO"))		;сохраняет текущее значение CMDECHO
  	(setvar "CMDECHO" 0)			;устанавливает CMDECHO в 0
  	(setq st1 (getvar "USERR1"))
 	(setq st2 (getvar "USERR2"))
  	(setq st1(getreal "\nДлина прямоугольника? <5> "))
   	(if (= st1 nil) (setq st1 5))
  	(setq st2(getreal "\nШирина прямоугольника? <5> "))
   	(if (= st2 nil) (setq st2 5))
  	(setq point (getpoint "Укажите центр прямоугольника:"))
  
  	(setq PX  (nth 0 point));координата X 
	(setq PY  (nth 1 point))
  
	(setq dx (/ st1 2.0))
  	(setq dy (/ st2 2.0))
  
  	(setq px1 (- PX dx))
  	(setq py1 (+ PY dy))
  	
	(setq px2 (+ PX dx))
  	(setq py2 (- PY dy))
  
  	(setq pt1 (list px1 py1))
  	(setq pt2 (list px2 py2))
  
	(setvar "osmode" 0)
  	(command "_rectang" pt1 pt2)
  	(setvar "osmode" os)
  	(setvar "CMDECHO" cmd)		;восстанавливает CMDECHO 
  	(setvar "Userr1" st1)
  	(setvar "Userr2" st2)
       )

Макрос рисует прямоугольник и размещает его центр в указанной точке.
На правой кнопке мыши у меня настроено повторение последней команды, и хотелось бы чтобы макрос при повторном использовании запоминал последние использованные значения и предлагал их автоматически.
Т.е. вместо "<5>" было предыдущее введенное пользователем значение. Это про строку (setq st1(getreal "\nДлина прямоугольника? <5> ")).

PS: сильно не ругайте, мой первый пост
Просмотров: 2348
 
Непрочитано 25.02.2014, 14:30
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Для сохранения пользовательских значений в AutoCAD есть переменные USER*, где вместо * разные буквы-цифры.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 25.02.2014, 14:35
#3
Alikme


 
Регистрация: 25.02.2014
Сообщений: 7


Про это я знаю. Но как это использовать в данном случае?
Alikme вне форума  
 
Непрочитано 25.02.2014, 14:56
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Не советую использовать USER*-переменные. Как вариант:
Код:
[Выделить все]
 (vl-load-com)

(defun c:quattro (/ fun_subst-or-append *error* adoc width height pt)

  (defun fun_subst-or-append (lst key value)
    (if (cdr (assoc key lst))
      (subst (cons key value) (assoc key lst) lst)
      (cons (cons key value) lst)
      ) ;_ end of if
    ) ;_ end of defun

  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (if (and (= (type (setq width
                           (vl-catch-all-apply
                             (function
                               (lambda ()
                                 (cond
                                   ((getdist
                                      (strcat
                                        "\nДлина прямоугольника <"
                                        (rtos (cond
                                                ((cdr (assoc "width" *global-settings*)))
                                                (t
                                                 (cdr (assoc "width"
                                                             (setq *global-settings* (fun_subst-or-append *global-settings* "width" 5.))
                                                             ) ;_ end of assoc
                                                      ) ;_ end of cdr
                                                 )
                                                ) ;_ end of cond
                                              ) ;_ end of rtos
                                        "> : "
                                        ) ;_ end of strcat
                                      ) ;_ end of getdist
                                    )
                                   (t (cdr (assoc "width" *global-settings*)))
                                   ) ;_ end of cond
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'real
              ) ;_ end of =
           (> width 0.)
           (= (type (setq height
                           (vl-catch-all-apply
                             (function
                               (lambda ()
                                 (cond
                                   ((getdist
                                      (strcat
                                        "\nШирина прямоугольника <"
                                        (rtos (cond
                                                ((cdr (assoc "height" *global-settings*)))
                                                (t
                                                 (cdr
                                                   (assoc "height"
                                                          (setq *global-settings* (fun_subst-or-append *global-settings* "height" 5.))
                                                          ) ;_ end of assoc
                                                   ) ;_ end of cdr
                                                 )
                                                ) ;_ end of cond
                                              ) ;_ end of rtos
                                        "> : "
                                        ) ;_ end of strcat
                                      ) ;_ end of getdist
                                    )
                                   (t (cdr (assoc "height" *global-settings*)))
                                   ) ;_ end of cond
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'real
              ) ;_ end of =
           (> height 0.)
           (= (type (setq pt (vl-catch-all-apply
                               (function
                                 (lambda ()
                                   (getpoint "\nЦентральная точка <Отмена> : ")
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                               ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'list
              ) ;_ end of =
           ) ;_ end of and
    (progn
      (setq *global-settings* (fun_subst-or-append *global-settings* "width" width)
            *global-settings* (fun_subst-or-append *global-settings* "height" height)
            ) ;_ end of setq
      (entmakex (append '((0 . "LWPOLYLINE")
                          (100 . "AcDbEntity")
                          (100 . "AcDbPolyline")
                          (90 . 4)
                          (70 . 1)
                          )
                        (mapcar
                          (function
                            (lambda (x)
                              (cons 10 x)
                              ) ;_ end of lambda
                            ) ;_ end of function
                          (list (list (- (car pt) (* (cdr (assoc "width" *global-settings*)) 0.5))
                                      (- (cadr pt) (* (cdr (assoc "height" *global-settings*)) 0.5))
                                      ) ;_ end of list
                                (list (- (car pt) (* (cdr (assoc "width" *global-settings*)) 0.5))
                                      (+ (cadr pt) (* (cdr (assoc "height" *global-settings*)) 0.5))
                                      ) ;_ end of list
                                (list (+ (car pt) (* (cdr (assoc "width" *global-settings*)) 0.5))
                                      (+ (cadr pt) (* (cdr (assoc "height" *global-settings*)) 0.5))
                                      ) ;_ end of list
                                (list (+ (car pt) (* (cdr (assoc "width" *global-settings*)) 0.5))
                                      (- (cadr pt) (* (cdr (assoc "height" *global-settings*)) 0.5))
                                      ) ;_ end of list
                                ) ;_ end of list
                          ) ;_ end of mapcar
                        ) ;_ end of append
                ) ;_ end of entmakex
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.02.2014, 16:04
#5
Alikme


 
Регистрация: 25.02.2014
Сообщений: 7


Ого! Спасибо!
Alikme вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Подстановка ранее использованных значений в макросе

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MIPGost. Почему шрифт не обнаруживается, хотя он находится в Support-папке? Do$ AutoCAD 40 09.04.2023 03:16
Не могу скопировать полилинии в другой чертеж _slonik_ AutoCAD 3 14.12.2011 14:36
Не работает copy-past. FAQ не помог Dust! AutoCAD 16 17.02.2011 11:47