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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP Как вернуться к выполнению предыдущей функции ?

LISP Как вернуться к выполнению предыдущей функции ?

Ответ
Поиск в этой теме
Непрочитано 16.01.2014, 14:46 #1
LISP Как вернуться к выполнению предыдущей функции ?
Raznouh
 
Баку, Азербайджан
Регистрация: 13.09.2011
Сообщений: 114

Здравствуйте.
Например,такой код:

Код:
[Выделить все]
 (defun c:cr ()
(setq a (entsel "Select circle:"))
(if (=(cdr(assoc 0(entget( car a)))) "CIRCLE")
(command "_circle" (cdr(assoc 10(entget( car a)))) (- (cdr(assoc 40(entget( car a)))) 1) "")
(????????????)
  ))
Хотелось бы ,чтоб если указанный объект оказался не окружностью,вернуться к выполнению функции entsel,и так далее пока не выберу окружность или не нажму Enter,чтобы выйти.Как это реализовать - не знаю.Подскажите кто может.
Просмотров: 4275
 
Непрочитано 16.01.2014, 15:22
1 | #2
Кулик Алексей aka kpblc
Moderator

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


Вариант 1: запрашивать не примитив, а набор, который потом и преобразовывать
Код:
[Выделить все]
 (defun tt1 (/ ss ent)
  (if (and (not (vl-catch-all-error-p
                  (setq ss (vl-catch-all-apply
                             (function
                               (lambda ()
                                 (ssget "_+.:S:E:L" '((0 . "CIRCLE")))
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             ) ;_ end of vl-catch-all-apply
                        ) ;_ end of setq
                  ) ;_ end of vl-catch-all-error-p
                ) ;_ end of not
           ss
           ) ;_ end of and
    (progn
      (setq ent (ssname ss 0))
      ;; ...
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
Вариант 2: входить в "бесконечный" цикл, из которого можно выйти только через Esc.
Код:
[Выделить все]
 (defun tt2 (/ ent f)
  (while (and (not f)
              (not
                (vl-catch-all-error-p
                  (setq ent (vl-catch-all-apply (function (lambda () (car (entsel "\nSelect circle <Cancel> : "))))))
                  ) ;_ end of vl-catch-all-error-p
                ) ;_ end of not
              ) ;_ end of and
    (if (/= (cdr (assoc 0 (entget ent))) "CIRCLE")
      (princ "\nSelected entity is not circle!")
      (setq f t)
      ) ;_ end of if
    ) ;_ end of while
  (if f
    (progn
      (princ "\nOK")
          ;...
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
Лично я предпочитаю первый вариант как более гибкий
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.01.2014, 15:54
1 | #3
Дима_

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


строка 5 вместо (?????????) - (c:cr)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 16.01.2014, 16:05
#4
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Дима_,красиво.Но не годится если например до
Код:
[Выделить все]
 (setq a (entsel "Select circle:"))
(if (=(cdr(assoc 0(entget( car a)))) "CIRCLE")
(command "_circle" (cdr(assoc 10(entget( car a)))) (- (cdr(assoc 40(entget( car a)))) 1) "")
(????????????))
есть какая то часть кода - какие то построения геометрические ,вычисления и тп.

----- добавлено через ~14 мин. -----
Еще наверно так можно тожеЖ
Код:
[Выделить все]
  (defun c:cr ()
(function (lambda (q) ((setq a (entsel "\n Select circle:"))))
(terpri)
(if (=(cdr(assoc 0(entget( car a)))) "CIRCLE")
(command "_circle" (cdr(assoc 10(entget( car a)))) (- (cdr(assoc 40(entget( car a)))) 1) "")
(apply q))
  )
----- добавлено через ~29 мин. -----
Но почему то строчка не пропускается - "Select circle:Select circle:Select circle".Не пойму почему.
Raznouh вне форума  
 
Непрочитано 16.01.2014, 17:07
#5
Дима_

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


У Вас пример с нечетным количеством скобок - то есть не рабочий - но налицо непонимание основных принципов лисп взаимодействия функций - ничего попытайтесь сами еще - не будет получаться спросите. Этот пример личше просто начните писать заново - там полная каша - например q во второй и 6 строке у Вас никак не связанны - то есть в 6 Вы в лучшем случае ничего не вызываете (в худшем, то что записанно в q до этого).
По поводу не годится - для этого надо именновать необходимую часть кода с нужной точки.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 16.01.2014, 17:12
#6
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Дима_,спасибо.Поковыряюсь.Но как не странно,этот код в акаде работает
Raznouh вне форума  
 
Непрочитано 16.01.2014, 17:33
#7
Дима_

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


Этот в акад даже не загрузиться - не хватает скобки
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 16.01.2014, 17:53
#8
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


точно .попутал я что то. сорри.
Raznouh вне форума  
 
Непрочитано 16.01.2014, 22:32
#9
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от Дима_ Посмотреть сообщение
пример с нечетным количеством скобок - то есть не рабочий
Цитата:
Сообщение от Raznouh Посмотреть сообщение
Но как не странно,этот код в акаде работает
Цитата:
Сообщение от Raznouh Посмотреть сообщение
точно .попутал я что то
На самом деле код "работал" только потому, что функция уже была определена в текущем чертеже. То есть ранее был загружен рабочий код (ну по крайней мере, с правильным количеством скобок). А командная строка по-любому ругалась на неверно сформированный список на входе, но если в ней меньше трех строк, то этой ругани можно и не заметить.
Цитата:
Сообщение от Raznouh Посмотреть сообщение
Но почему то строчка не пропускается - "Select circle:Select circle:Select circle".
Потому и не пропускалась. В коде появились символы "\n", но в сеанс они не загрузились.
skkkk на форуме  
 
Автор темы   Непрочитано 16.01.2014, 23:52
#10
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Цитата:
По поводу не годится - для этого надо именновать необходимую часть кода с нужной точки.
Дима_,а Вы не могли бы на примере показать как это делается?Только ,желательно,на таком,чтоб было понятно человеку который всего месяц назад autolisp начал изучать.

Цитата:
На самом деле код "работал" только потому, что функция уже была определена в текущем чертеже. То есть ранее был загружен рабочий код (ну по крайней мере, с правильным количеством скобок). А командная строка по-любому ругалась на неверно сформированный список на входе, но если в ней меньше трех строк, то этой ругани можно и не заметить
skkkkСпасибо, я уж было подумал,что у меня галлюцинации - автокад перезагрузил,тот код работать действительно перестал.
Raznouh вне форума  
 
Непрочитано 17.01.2014, 11:42
1 | #11
Дима_

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


Могу
Код:
[Выделить все]
 (defun c:cr()
  ;(здесь делаете свои "одноразовые" построения)
  ((lambda (get-circle); "загружаем" get-circle
     ((lambda (lst);получаем DXF список круга и создаем новый с диаметром - 1
        (entmakex (list '(0 . "circle") (assoc 10 lst) (cons 40 (1- (cdr (assoc 40 lst)))))))
      (get-circle)))
    (lambda ();get-circle функция циклически повторяет выбор пока не выберешь круг - возращает DXF список
      ((lambda (ent); смотрим выбор
         (if (and ent; если выбор сделан
                 (= "CIRCLE" (cdr (assoc 0 (entget (car ent)))))) ; и это круг
             (entget (car ent)); возращаем список
             (get-circle))); или по новой
        (entsel "\nВыберите круг: ")))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 17.01.2014, 13:40
#12
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Дима_,спасибо.Только он не работает.Или я что то не так понял.
Raznouh вне форума  
 
Непрочитано 17.01.2014, 13:50
#13
Дима_

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


Ну по крайней мере у меня точно работает - пробуйте еще раз. Если "не работает" - пишите лог ком.строки
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 17.01.2014, 14:21
#14
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Цитата:
Ну по крайней мере у меня точно работает - пробуйте еще раз. Если "не работает" - пишите лог ком.строки
; warning: local variable used as function: GET-CIRCLE
Raznouh вне форума  
 
Непрочитано 17.01.2014, 14:40
#15
Дима_

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


Цитата:
Сообщение от Raznouh Посмотреть сообщение
; warning: local variable used as function: GET-CIRCLE
Это где Вы такое увидели - лог ком. строки выполнения надо.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 17.01.2014, 15:25
#16
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Дима_,вот тут
Increase Size Decrease Size Нажмите для просмотра
http://plasmon.rghost.ru/51718734/image.png
----- добавлено через ~1 мин. -----


----- добавлено через ~3 мин. -----
Увидев это я в акад грузить не стал,а сейчас загрузил - работает.Это предупреждение - нормально?
Raznouh вне форума  
 
Непрочитано 17.01.2014, 15:38
#17
Дима_

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


Цитата:
Сообщение от Raznouh Посмотреть сообщение
.Это предупреждение - нормально?
Вопрос риторический... По мне так нормально.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.01.2014, 16:25
#18
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Offtop: Так-тааак... Кажется, Дима_ заподозрен в дискредитации VLIDE в пользу Notepad++
skkkk на форуме  
 
Непрочитано 17.01.2014, 16:40
#19
Дима_

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


Я уже не раз писал - vlide не использую (для чего-то быстрого - notepad++, для побольше - редактор racket'a).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 20.01.2014, 22:24
#20
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Я уже не раз писал - vlide не использую (для чего-то быстрого - notepad++, для побольше - редактор racket'a).
Дима_,если уж Вы пользуетесь notepad++ ,можно поинтересоваться :где можно найти файл xml с ключевыми словами языка AutoLISP (для подсветки функций в редакторе)?Я вчера нашел один,но в нем не отмечены некоторые ф-ции activex.Или же,можно этот самый файл как то выудить из акадовского VLIDE ?Тоже пытался,но безуспешно, наощупь ,не зная директории и имени файла.
Raznouh вне форума  
 
Непрочитано 21.01.2014, 00:26
1 | #21
Дима_

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


Цитата:
Сообщение от Raznouh Посмотреть сообщение
можно поинтересоваться :где можно найти файл xml с ключевыми словами языка AutoLISP
Есть замечательная функция - (atoms-family...) - которая возвращает все объявленные имена - как их перевести в XML нужного формата - это Вам интресное домашнее задание. Помните что vla-имена подгружаются после (vl-load-com) - то есть можете загрузить все имена, либо сравнить списки до загрузки и после, и загрузить только vla.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.01.2014, 01:49
#22
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Дима_ сделал,может топорно,но так
Код:
[Выделить все]
 (read(acad_strlsort(atoms-family 1 )
  ))
скопировал из консоли VLIDE в ворд , где убрал ковычки.Оттуда скопировал этот текст (название функций через пробелы) в свой языковой файл autolisp.xml,предварительно открытый с помощью блокнота(вставил в общий список ключевых слов),сохранил(см.вложение).
Все равно не подсвечивает.
Вложения
Тип файла: zip AutoLISP.zip (8.0 Кб, 28 просмотров)
Raznouh вне форума  
 
Автор темы   Непрочитано 23.01.2014, 00:19
#23
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Дима_ ,очень извиняюсь.Удалил и снова установил программу,прописал файл подсветки синтаксиса - работает,подсвечивает.Еще раз спасибо за помощь!
Raznouh вне форума  
 
Непрочитано 23.01.2014, 11:06
#24
Дима_

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


Цитата:
Сообщение от Raznouh Посмотреть сообщение
Дима_ ,очень извиняюсь
За что?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 23.01.2014, 23:22
#25
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Цитата:
Все равно не подсвечивает.
За это:второй раз по невнимательности или недосоображовывания пишу неверную инфу.
Raznouh вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP Как вернуться к выполнению предыдущей функции ?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP Опции функции. rocker-serj LISP 4 17.10.2013 17:29
Как не выводить в командную строку результат выполнения функции (lisp)? Иванов Дмитрий LISP 6 28.11.2010 17:54
Почему в lisp отсутствует аналог функции (arxload ...) для .NET сборок. Pastor LISP 16 17.11.2010 13:15
Аналог функции EVAL (LISP) в Exele kp+ LISP 11 01.04.2010 16:52