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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Подскажите, существуют ли практические руководства по Lisp?

Подскажите, существуют ли практические руководства по Lisp?

Ответ
Поиск в этой теме
Непрочитано 07.03.2006, 15:51
Подскажите, существуют ли практические руководства по Lisp?
vn
 
Регистрация: 10.02.2006
Сообщений: 373

Недавно купил книгу. Полный сборник команд Lisp с их описанием.
Но на этом все и кончилось. Никаких примеров для начинающих.
Если кто знает, с чего начинать изучение Lisp медленно и шаг за шагом , подскажите пожалуйста.
Просмотров: 73719
 
Непрочитано 21.03.2009, 09:51
#181
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Рyslan, Собирай по мере отрисовки примитивы в набор
Код:
[Выделить все]
(setq ss nil ss (ssadd)) ;_Создаем пустой набор
(Command "_.Pline" pt7 pt1 "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Arc" pt1 "_E" pt4 "_R" Rdug)
(setq Arc (entlast))
(Command "_.Change" Arc "" "_p" "_lt" "ACAD_ISO04W100" "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Pline" pt4 pt8 "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.PLine" pt6 pt2 "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Pline" pt3 pt5 "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Arc" pt2 "_E" pt3 "_R" Rv)
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Arc" pt6 "_E" pt5 "_R" Rn)
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Mirror" SS "" pause pause "_N")
На будущее, чтобы не наступить в конце концов на грабли №1 (OSMODE)
При отрисовке командными методати перед указанием точки временно отключай привязку с помощью опции "_non"
Вместо
(Command "_.Arc" pt6 "_E" pt5 "_R" Rn)
Нужно
(Command "_.Arc" "_non" pt6 "_E" "_non" pt5 "_R" Rn)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.03.2009, 10:15
#182
Рyslan


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


VVA а ведь вначале мы отключаем все привязки. разве обязательно добавлять non?
(setq pt9 (polar pt1 (+ ang 0) 5)) -->добавил точку, для зеркала--> (Command "_.Mirror" SS "" pt1 pt9) -->сразу сама выбирает ось отражения, остается только выбрать Да\Нет VVA а pause pause что делает? для выхода из программы в комстроку?

Последний раз редактировалось Рyslan, 21.03.2009 в 10:39.
Рyslan вне форума  
 
Непрочитано 21.03.2009, 11:00
#183
Кулик Алексей aka kpblc
Moderator

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


1. Оформляй вызов как (defun c:мойкод() <...>), тогда его можно будет повторно вызвать на выполнение как обычную команду.
2. Либо перед выполнением mirror запоминай последний примитив через (entlast), либо используй (vla-mirror) или что-то такого типа. Сейчас заняться не могу, - уезжаю.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.03.2009, 11:26
#184
Рyslan


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


Повторный вызов команды работает, только вот данные опять нужно вводить. А если тоже самое нужно нарисовать...хотя маловероятно что за отводом будет следовать такой же отвод. Наверное это лишнее будет. Хватит и просто повтора команды
Рyslan вне форума  
 
Непрочитано 21.03.2009, 11:29
#185
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от Рyslan Посмотреть сообщение
VVA а ведь вначале мы отключаем все привязки. разве обязательно добавлять non?
Если обрабатываешь OSMODE то не нужно.
Цитата:
(setq pt9 (polar pt1 (+ ang 0) 5)) -->добавил точку, для зеркала--> (Command "_.Mirror" SS "" pt1 pt9) -->сразу сама выбирает ось отражения, остается только выбрать Да\Нет
Правильнее (Command "_.Mirror" SS "" pt1 pt9 pause)
Цитата:
VVA а pause pause что делает? для выхода из программы в комстроку?
Приостанавливает выполнение команды и ждет действия пользователя на текущий запрос.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.03.2009, 12:28
#186
Рyslan


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


VVA, спасибо!
Рyslan вне форума  
 
Непрочитано 25.03.2009, 17:23
#187
Рyslan


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


Всем привет! Есть вопрос. При рисовании вправо ортогонально, программа не работает. Автокад пишет- Укажите направление: <Орто вкл>
Значение должно быть положительным и ненулевым.
Как от этого избавиться? Еще вопрос, функция cond только одно условие выполняет?

((= D_nom 80) (= d_nom 65) (setq D1 89 D2 76 L 80 H 70))
два диаметра D1 и D2 возьмет?

Последний раз редактировалось Рyslan, 25.03.2009 в 17:30.
Рyslan вне форума  
 
Непрочитано 25.03.2009, 21:05
#188
Кулик Алексей aka kpblc
Moderator

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


Избавиться? По идее надо код перелопачивать. Начинается самое интересное
cond "возьмет", если ты сравнивать будешь корректно. Функция and где?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.03.2009, 21:30
#189
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Автокад пишет- Укажите направление: <Орто вкл>
Значение должно быть положительным и ненулевым
См. ключи initget перед запросом
Цитата:
Еще вопрос, функция cond только одно условие выполняет?
Да. Но если нужно проверить несколько значений, то можно воспользоваться логическими операторами OR или AND или их сочетанием.
Код:
[Выделить все]
((or (= D_nom 80) (= d_nom 65)) (setq D1 89 D2 76 L 80 H 70))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.03.2009, 16:41
#190
Рyslan


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


Код:
[Выделить все]
(cond
((= D_nom 80) and (= d_nom 80) (setq D1 89 D2 76 L 80 H 70))
((= D_nom 80) and (= d_nom 65) (setq D1 89 D2 76 L 80 H 70))
)
VVA, Алексей, вот так правильно? Только не работает ни черта.
вычисляется только первое выражение. VVA, поменял (initget 7) на (initget 1) - теперь все работает, спасибо за подсказку.
Рyslan вне форума  
 
Непрочитано 28.03.2009, 17:18
#191
ShaggyDoc

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


Рyslan, "Это же вам не лезгинка, а твист!" (С) Это не бейсик, а LISP.

and - это функция, и надо вызывать функцию and:
Код:
[Выделить все]
(and (= D_nom 80)  
       (= d_nom 80)
)
VVA ведь показал в #189 функцию or, а ты захотел and. Так же и надо писать - в виде вызова функции and.

Но D_nom и d_nom для LISP - это одна и та же переменная. К регистру он нечувствителен. Сравнения бессмысленные. Думай над логикой. Правильно называй переменные.
ShaggyDoc вне форума  
 
Непрочитано 28.03.2009, 20:15
#192
Рyslan


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


Верно про Бэйсик подметили Кстати, была мысль про регистр. Попробую еще.

Код:
[Выделить все]
(cond
((and (= Dim_bol 40) (= Dim_mal 40)) (setq D1 45 D2 45 L 40 H 40))
((and (= Dim_bol 50) (= Dim_mal 40)) (setq D1 57 D2 45 L 50 H 45))
((and (= Dim_bol 65) (= Dim_mal 50)) (setq D1 76 D2 57 L 65 H 60))
((and (= Dim_bol 65) (= Dim_mal 40)) (setq D1 76 D2 45 L 65 H 60))
)
Вот теперь вроде как работает. А с OR - вычислял некорректно. Спасибо VVA, Shaggy_Doc

Последний раз редактировалось Рyslan, 28.03.2009 в 21:25.
Рyslan вне форума  
 
Непрочитано 03.04.2009, 18:06
#193
Рyslan


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


---

Последний раз редактировалось Рyslan, 04.04.2009 в 22:41.
Рyslan вне форума  
 
Непрочитано 06.04.2009, 11:25
#194
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Это один из примеров построения отвода трубопровода в "Классическом" AutoLisp-е. В данном примере ПСК привязывается к торцу трубы и вычисление координат точек значительно упрощается. Отзеркаливание в данном случае не требуется.

С уважением, Евгений Дегтярев.


Код:
[Выделить все]
(defun C:OTV (/ p1 p2 p3 p4 p5 p6 cen pp1 pp2 centr_ang D Rdug Rv Rn D_nominal)
  (setq osm (getvar "OSMODE"))
  (setvar "osmode" 0)
  (setq centr_ang (getint "\nЦентральный угол отвода 45/60/90:"))
  (setq centr_ang (* pi (/ centr_ang 180.0)))
  (setq D_nominal (getint "\nУсловный диаметр отвода 40/50/65/80/100:"))
  (cond
    ((= D_nominal 40)
     (setq D 45
    Rdug 60
     )
    )
    ((= D_nominal 50)
     (setq D 75
    Rdug 75
     )
    )
    ((= D_nominal 65)
     (setq D 76
    Rdug 100
     )
    )
    ((= D_nominal 80)
     (setq D 89
    Rdug 120
     )
    )
    ((= D_nominal 100)
     (setq D 108
    Rdug 150
     )
    )
  )
  (setq Rv (- Rdug (* 0.5 D)))
  (setq Rn (+ Rdug (* 0.5 D)))
  (setvar "osmode" 32)
  (setq P1 (getpoint "\nУкажите начальную точку отвода:"))
  (setvar "osmode" 512)
  (setq pp1
  (getpoint P1
     "\nУкажите точку на торце трубы в направлении отвода:"
  )
  )
  (setvar "osmode" 0)
  (setq pp2
  (getpoint P1
     "\nУкажите точку в направлении трубопровода:"
  )
  )
  (command "_ucs" "_3" p1 pp1 pp2)
  (setq p1 '(0 0 0))
  (setq cen (polar p1 0.0 Rdug))
  (setq p2 (polar p1 0.0 (* 0.5 D)))
  (setq p4 (polar p1 pi (* 0.5 D)))
  (setq p3 (polar cen (- pi centr_ang) Rv))
  (setq p5 (polar cen (- pi centr_ang) Rn))
  (setq p6 (polar cen (- pi centr_ang) Rdug))
  (Command "_line" P4 P2 "")
  (Command "_line" P3 P5 "")
  (Command "_Arc" P3 "_ce" cen p2)
  (Command "_Arc" P5 "_ce" cen P4)
  (Command "_Arc" P6 "_ce" cen P1)
  (setvar "OSMODE" osm)
  (command "_ucs" "_w")
  (princ)
)

Последний раз редактировалось E-degtyarev, 06.04.2009 в 11:34.
E-degtyarev вне форума  
 
Непрочитано 06.04.2009, 21:16
#195
Рyslan


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


Евгений Дегтярев.; ошибка: неверно сформирванный список на входе
Рyslan вне форума  
 
Непрочитано 06.04.2009, 22:13
#196
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Рyslan, Аккуратней скопируй код из #194. У меня работает
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 06.04.2009, 22:41
#197
ShaggyDoc

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


Цитата:
ПСК привязывается к торцу трубы и вычисление координат точек значительно упрощается
Точки прекрасно высчитываются в любой ПСК ("машина-то железная"), не надо пытаться упрощать вычисления "дерганием" Автокада н по делу.

Не надо приучаться переносить ПСК программно, да ещё на таких детских задачах. Это дорога для множества ошибок в будущем.
ShaggyDoc вне форума  
 
Непрочитано 07.04.2009, 09:06
#198
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Уважаемый ShaggyDoc.
Буду Вам очень признателен, если вы продемонстрируете, как в данной ситуации выполнить вычисление координат точек в мировой ПСК, чтобы
получить полный аналог по функционалу моего лиспа.

Евгений Дегтярев.
E-degtyarev вне форума  
 
Непрочитано 07.04.2009, 10:00
#199
ShaggyDoc

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


Цитата:
Сообщение от E-degtyarev Посмотреть сообщение
Уважаемый ShaggyDoc.
Буду Вам очень признателен, если вы продемонстрируете, как в данной ситуации выполнить вычисление координат точек в мировой ПСК, чтобы
получить полный аналог по функционалу моего лиспа.

Евгений Дегтярев.
Разбираться нет времени. Но для чего ПСК переносите? Чтобы при вызове polar задать "нулевую" точку и "нулевой" угол. А что мешает указать реальную точку (координаты известны)

Код:
[Выделить все]
(setq cen (polar p1 (angle p1 pp1) Rdug))
Здесь p1 не '(0 0 0), а полученная в
Код:
[Выделить все]
(setq P1 (getpoint "\nУкажите начальную точку отвода:"))
И так далее. И МСК здесь совершенно не при чем. Вы же рисуете функцией command, а точки получаете через getpoint - всё в текущей ПСК.

А вот последнее (command "_ucs" "_w") не надо вообще делать. До рисования могла быть установлена не мировая ПСК, а ту вдруг принудительный непрошеный возврат. В крайнем случае - (command "_ucs" "_p")

Точки в МСК надо передавать при рисовании объектными методами. Тогда надо использовать функцию trans.

И, очень редко, при построении 3Д-моделей, может действительно потребоваться временный перенос ПСК, но делать его надо чрезвычайно осторожно.
ShaggyDoc вне форума  
 
Непрочитано 07.04.2009, 11:31
#200
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


E-degtyarev, + ShaggyDoc, Если все же решился что-то делать с ПСК, то отслеживай и изменяй на 0 значение переменной UCSFOLLOW, а то можно получить хороший rock'n'roll на экране
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Подскажите, существуют ли практические руководства по Lisp?

Размещение рекламы