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

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

Повтор команды макроса для выполнения lisp

Ответ
Поиск в этой теме
Непрочитано 26.07.2011, 00:35 #1
Повтор команды макроса для выполнения lisp
maratovich
 
г. Самара
Регистрация: 12.07.2009
Сообщений: 2,437

Написал лисп, повесил на кнопку макрос, команда выполняется 1 раз. Хочу чтобы был повтор после выполнения, но стандартная *^C^C зацикливает лисп. Подскажите как обеспечить повтор лиспа.
Макрос на кнопке :
^C^C(LOAD "D:/AUTOCAD/Ось_Трубы.lsp") Ось_Трубы

Сам лисп :
Код:
[Выделить все]
 ;;Осевые
(defun c:Ось_Трубы (/ a p r d p1 p2 p3 p4 )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setvar "celweight" -1);;;;;;;;ПоСлою Толщина линии
(setvar "celtype" "ByLayer");;;;;;;;ПоСлою Тип линии
(setvar "cecolor" "ByLayer");;;;;;;;ПоСлою Цвет линии
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (vl-load-com)
  (vl-cmdf "_.-Layer" "_Make" "Осевые";;;;;;;;Создать слой с параметрами
      "_Ltype" "Осевая" "";;;;;;;;Тип линии
      "_Color" 30 "";;;;;;;;Цвет линии
      "_LWeight" 0.2 "";;;;;;;;Толщина линии
      "_On" "";;;;;;;;Видимый
      "_Thaw" "";;;;;;;;ХЗ но надо
      "_Plot" "";;;;;;;;Печатаемый
      "_Unlock" "";;;;;;;;НЕ блокированный
      );_vl-cmdf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Для Отключение привязок
   ;;Запоминаем текущие состояния режимов ORTO, SNAP, OSNAP, ANGBASE
  (setq old_ortho (getvar "ORTHOMODE")
	old_snap (getvar "SNAPMODE")
	old_osnap (getvar "OSMODE")
	old_autosnap (getvar "AUTOSNAP")
	old_angbase (getvar "ANGBASE")
	) ;_end of setq
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq a  (entget (car (entsel "\nВыбери круг...")))
      p  (cdr (assoc 10 a))
      r  (cdr (assoc 40 a))
      d  (+ r 3) ; 3-вылет за круг
      p1 (polar p pi d)
      p2 (polar p 0  d)
      p3 (polar p (* pi 0.5) d)
      p4 (polar p (* pi 1.5) d)
);setq
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Для Отключение привязок
      ;;Подавляем эхо
      (setvar "CMDECHO" 0)
      ;;Обнуляем режимы ORTO, SNAP, OSNAP
      (setvar "ORTHOMODE" 0)
      (setvar "SNAPMODE" 0)
      (setvar "OSMODE" 0)
      (setvar "AUTOSNAP" 0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(command "_line" p1 p2 "")
(command "_line" p3 p4 "")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Для Отключение привязок
      ;;Восстанавливаем состояния режимов ORTO, SNAP, OSNAP, ANGBASE
      (setvar "ORTHOMODE" old_ortho)
      (setvar "SNAPMODE" old_snap)
      (setvar "OSMODE" old_osnap)
      (setvar "AUTOSNAP" old_autosnap)
      (setvar "ANGBASE" old_angbase)
      ;;Включаем эхо
      (setvar "CMDECHO" 1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
);defun

Последний раз редактировалось Кулик Алексей aka kpblc, 26.07.2011 в 08:59.
Просмотров: 5260
 
Непрочитано 26.07.2011, 01:55
#2
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,010


Добавь в конце программы (c:Ось_Трубы) и сойдет..
Nike вне форума  
 
Непрочитано 26.07.2011, 08:29
#3
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


А просто Enter нажать после завершения работы программы?
Profan вне форума  
 
Непрочитано 26.07.2011, 10:55
1 | #4
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


можно и зациклить с помощью while
mamuk вне форума  
 
Непрочитано 26.07.2011, 16:31
#5
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
можно и зациклить с помощью while
И это единственно правильный совет. А уж "просто Enter" - это для того, чтобы еще раз цикл повторить. Или для штатных команд.
ShaggyDoc вне форума  
 
Непрочитано 26.07.2011, 19:11
#6
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Автор темs упоминает просто повтор, а не многократный повтор. Читать разучились?
Profan вне форума  
 
Автор темы   Непрочитано 26.07.2011, 20:21
#7
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от mamuk Посмотреть сообщение
можно и зациклить с помощью while
СПАСИБО !!!!
Заработало как надо.
Сделал так
(while
(setq a (entget (car (entsel "\nВыбери круг...")))
........
......


);_ end of while;;;;;;;;;;;;Конец повтора команды
);defun
;;усё


Вопрос в догонку - смотрел примеры обработчиков ошибок но никак не получается ловить ошибку если не попал по кругу :
Выбери круг...; ошибка: неверный тип аргумента: lentityp nil
P.S. С лиспом столкнулся впервые (пишу на vb6).

Последний раз редактировалось maratovich, 26.07.2011 в 20:28.
maratovich вне форума  
 
Непрочитано 26.07.2011, 20:32
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от maratovich Посмотреть сообщение
Выбери круг...; ошибка: неверный тип аргумента: lentityp nil
Проверяй что возращает (entsel), а не (entget (car (entsel)))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.07.2011, 21:50
#9
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
но никак не получается ловить ошибку если не попал по кругу
Да, это распространенная ситуация. Для надежной работы с учетом "промазал" нужна специальная функция с обработкой ERRNO.

Код:
[Выделить все]
 (defun _ru-get-entsel-no-error (message / ent)
  ;; (_ru-get-entsel-no-error "Выбери объект, но не промахнись!")
  (setvar "errno" 0)
  (while
    (and
      (not (setq ent (entsel (strcat "\n" message)))) 
      (equal 7 (getvar "errno"))
      ;;Ошибка указания при выборе
    ) 
     (setvar "errno" 0)
  ) 
  (cond
    ((equal (getvar "errno") 52)
     ;; пустой ответ
     nil
    )
    (t
     (list (car ent) (trans (cadr ent) 1 0))
    )
  ) 
)
Да и это надо ещё оборачивать дополнительными функциями (допустимость прерывания по ESC, допустимость выбора объекта на блокированном слое, дополнительные ключевые слова).
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 26.07.2011, 22:35
#10
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Спасибо за подсказки !
Буду изучать.... думать....
maratovich вне форума  
 
Непрочитано 26.07.2011, 22:37
#11
Кулик Алексей aka kpblc
Moderator

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


Если приглашение "ехало-болело", можно и так сделать:
Код:
[Выделить все]
 (if (= (type (setq ent (vl-catch-all-apply '(lambda() (ssname (ssget "_.+:S:E:L" '((0 . "CIRCLE"))) 0))))) 'ename)
; Здесь чего-то делаем
);_ end of if
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Повтор команды макроса для выполнения lisp



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перестала работать кнопка выполнения макроса LAmyk AutoCAD 6 26.09.2014 12:56
"Торможение" мыши возле палитры инстументов в момент выполнения команды hwd AutoCAD 14 25.01.2013 11:43
Запуск Lisp команды в новом документе BlackHarp LISP 1 26.03.2009 23:06
Принудительный повтор команды. Makartetsky Программирование 12 18.11.2007 21:04
Можно ли подсветить грипсы во время выполнения команды? Torino Программирование 9 18.11.2004 19:38