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

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

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

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

Недавно купил книгу. Полный сборник команд Lisp с их описанием.
Но на этом все и кончилось. Никаких примеров для начинающих.
Если кто знает, с чего начинать изучение Lisp медленно и шаг за шагом , подскажите пожалуйста.
Просмотров: 73615
 
Непрочитано 30.05.2008, 11:42
#41
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Читаю САПР как это делается, там ваще ж-а AutoLisp, VisualLisp, VBA, ActiveX, ObjectARX.
AutoLisp = LISP (на этом форуме). AutoLisp - диалект языка ЛИСП, есть еще Common Lisp и т.п.
Расширение языка AutoLISP, использующее объектную модель Автокада или любого другого com сервера - Visual LISP
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 02.06.2008 в 10:30. Причина: Орфография
VVA вне форума  
 
Непрочитано 30.05.2008, 15:07
#42
Рyslan


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


Мдя, два разных способа. Если методом Command еще что-то понятно, то VL методом ваще темный лес
Рyslan вне форума  
 
Непрочитано 30.05.2008, 15:18
#43
Кулик Алексей aka kpblc
Moderator

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


Я ж говорил, что смесь жуткая
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.05.2008, 15:28
#44
Рyslan


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


да уж, без поллитры не разберешься
Рyslan вне форума  
 
Непрочитано 30.05.2008, 15:36
#45
Рyslan


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


VVA, ты вот в лиспе сверху вставил мой алгоритм, а перед ними точки с запятыми аж три штуки. эти записи тоже участвуют в программе? вот тут есть пункт (initget7). Это ссылка на пункт 7?
Рyslan вне форума  
 
Непрочитано 30.05.2008, 15:40
#46
Кулик Алексей aka kpblc
Moderator

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


См. форматирование, комментарии и описание функции (initget)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.05.2008, 15:53 to VVA
#47
Рyslan


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


Привет! Я тут сегодня практикуюсь вот написал прогу, но не работает она. Не посмотришь, что я не правильно сделал. Делал по аналогии твоей программы Отвод

;;;Рисование концентрического перехода по ГОСТ
;;;1. View-->Front
;;;2. Pline" "0,0" "0,R" "L,r" "L,0" "0,0" "_close"
;;;3. Revolve
;;;4. View-->SW Isometric
;;;R- радиус большой
;;;r- радиус маленький
;;;L- длина перехода

(defun C:PEREKHOD (Рисование концентрического перехода по ГОСТ)
(setq R (getdist "\nРадиус большой:")) ; Задаем большой радиус перехода
(setq r (getdist "\nРадиус маленький:")) ; Задаем маленький радиус перехода
(setq L (getdist "\nДлина перехода:")) ; Задаем длину перехода
(Command "_.View" "_Front")
(Command "_.Pline" "0,0" "0,R" "L,r" "L,0" "0,0" "_close") ; Рисуем профиль перехода
(Command "_.Revolve" "Objects" "Enter" "X" "Y" "Enter") ; Поворачиваем профиль вокруг выбранной оси
(Command "_.View" "_SW")
(princ) ; Выход
)
Рyslan вне форума  
 
Непрочитано 31.05.2008, 17:04
#48
Рyslan


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


только укажи на ошибку, попробую сам исправить
Рyslan вне форума  
 
Непрочитано 31.05.2008, 17:53
#49
Рyslan


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


Вот это по-моему правильно, тока все равно не работает

;;;Рисование концентрического перехода по ГОСТ
;;;1. View-->Front
;;;2. Pline" "0,0" "0,R" "L,r" "L,0" "0,0" "_close"
;;;3. Revolve
;;;4. View-->SW Isometric
;;;R- радиус большой
;;;r- радиус маленький
;;;L- длина перехода

(defun C:PEREKHOD (/R,r,L,Pline); Рисование концентрического перехода по ГОСТ
(initget7)
(setq R (getdist "\nРадиус большой:")) ; Задаем большой радиус перехода
(initget7)
(setq r (getdist "\nРадиус маленький:")) ; Задаем маленький радиус перехода
(initget7)
(setq L (getdist "\nДлина перехода:")) ; Задаем длину перехода
(Command "_.View" "_Front")
(Command "_.Pline" "0,0" "0,R" "L,r" "L,0" "0,0" "_close") ; Рисуем профиль перехода
(setq Pline (entlast))
(Command "_.Revolve" "Pline" "Enter" "X" "Y" "Enter") ; Поворачиваем профиль вокруг выбранной оси
(Command "_.View" "_SW")
(princ) ; Выход
)
Рyslan вне форума  
 
Непрочитано 01.06.2008, 19:17
#50
Рyslan


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


не смотрите, тут все неправильно. единственно сегодня что получилось, так это трапецию сделал по точкам (профиль перехода), только мне так не нравится, аж 5 точек вводить надо. будем думать дальше как ввести только 2 диаметра и длину перехода.
Рyslan вне форума  
 
Непрочитано 01.06.2008, 23:00
#51
Рyslan


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


Вот это работает, но вводить столько точек запаришься!
(defun C:Profile (/
pt1
pt2
pt3
pt4
pt5
)
(setq pt1 (getpoint "\nПервая точка:")) ; Задаем первую точку профиля
(setq pt2 (getpoint "\nВторая точка:")) ; Задаем вторую точку профиля
(setq pt3 (getpoint "\nТретья точка:")) ; Задаем третью точку профиля
(setq pt4 (getpoint "\nЧетвертая точка:")) ; Задаем четвертую точку профиля
(setq pt5 (getpoint "\nПятая точка:")) ; Задаем пятую точку профиля
(Command "_.Pline" pt1 pt2 pt3 pt4 pt5)
(Command "close")
(princ)
)

А вот эта не хочет никак работать!
(defun C:PEREKHOD (/
R
r
L
)
(setq R (getdist "\nРадиус большой:")) ; Задаем большой радиус перехода
(setq r (getdist "\nРадиус маленький:")) ; Задаем маленький радиус перехода
(setq L (getdist "\nДлина перехода:")) ; Задаем длину перехода
(Command "_.Pline" '(0 0) '(0 D) '(L d) '(L 0) '(0 0))
(Command "close")
(princ)
)
Пишет неизвестная команда С
Рyslan вне форума  
 
Непрочитано 02.06.2008, 08:52
#52
Рyslan


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


Алексей, ты тут? Почему последнняя программка не работает? Что не правильно? Подскажи, пожалуйста
Рyslan вне форума  
 
Непрочитано 02.06.2008, 09:06
#53
ShaggyDoc

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


Pyslan, если хочешь научиться программировать, придется много работать самому. Иначе все время будешь спрашивать про "три точки с запятыми" и удивляться - "Вот это по-моему правильно, тока все равно не работает ". Это обычное дело, когда автор думает, что "все правильно".

Вот пишешь "Читаю САПР как это делается, там ваще ж-а AutoLisp, VisualLisp, VBA, ActiveX, ObjectARX". Это про книгу "САПР на базе AutoCAD - как это делается"?

Если это так, то хоть название пиши правильно - а не "и так сойдет". Иначе "и так сойдет" будет и в програмах. А тыкать носом в каждую мелочь желающих мало будет.

Но книгу надо прочитать, и прочитать внимательно. Тема-то ветки про практические руководства, а не про то, как переход нарисовать. Это твое частное дело.

Если уж начал с элементов трубопроводов, прочитай главу 29. Там как раз эти задачи описаны, а в примерах кода прямо решены.
Например, листинг 29.15 - рисование вообще любого 2D-элемента (прямой участок, переход и т.п.). А в листинге 29.17 - рисование как раз концентричного перехода в 2D. В результате в меню конкретный переход с заданными размерами записывается очень просто:

Код:
[Выделить все]
 
(ru-pipe-draw-any (quote ru-pipe-reducer-concentr) (list 100.0 200.0 95.0)"Начало перехода" "Направление потока")
И здесь нет никакого ввода 5 точек, будет запрошено только начало и направление движения среды. Причем, при указании начала можно опционально привязаться к уже нарисованному элементу, не прицеливаясь. Да и ввод этих точек сделан надежно, а не просто через getpoint. Getpoint легко прервать нештатно и далее вся программа посыпется.

Можешь обернуть это в программу (команду), назвав ее, например

Код:
[Выделить все]
(defun C:ПЕРЕХОД_КОНЦЕНТР_100х200 ()
(ru-pipe-draw-any (quote ru-pipe-reducer-concentr) (list 100.0 200.0 95.0)"Начало перехода" "Направление потока") 
)
Только замучаешься таким программам имена давать - типоразмеров-то тьма. Поэтому в книге показано, как сделать, чтобы эти команды
просто отображались в иллюстрированном меню. В книге полно иллюстраций, в частности, рис. 29.13.

За 3D сразу лучше не браться. Научись сначала самое простое делать. Попытка просто сделать revolve наивна. Да и элементарной техники пока у тебя нет, даже в написании команд - отсюда и вопросы.

Читай упомянутую книгу - там все расписано. Особенно главу 10 - там самые основы.

Следуя принципам, изложенным в книге, можно и к 3D перейти. Сформировав библиотеку функций, в которым самым основным является ввод точек в пространстве и вычисление координат в пространстве, можно и 3D-переходы (и всё прочее) делать.

Концентрический 3D-переход на уровне меню может быть описан так:

Код:
[Выделить все]
 
(ru-3d-pipe-draw-any (quote ru-3d-pipe-reducer-concentr) (list 108.0 89.0 80.0 4.0) "Начало перехода" "Направление потока" 80.0)
Такой подход позволяет избежать нудного программирования однотипных изделий. Меню может редактировать "негр", и если ему понадобится
несуществующий переход 3000х50 длиной 6м, он может вписать

Код:
[Выделить все]
(ru-3d-pipe-draw-any (quote ru-3d-pipe-reducer-concentr) (list 3000.0 50.0 6000.0 4.0) "Начало перехода" "Направление потока" 6000.0)
и это тоже будет работать. А можно переход, манипулируя размерами, превратить во что-то иное, например в зонт.

От примера для 2D он отличается используемыми функциями. Например, ru-3d-pipe-draw-any делает твердотельную модель любого "трубоподобного" элемента, а ru-3d-pipe-reducer-concentr - конкретно перехода. Могу её и привести:

Код:
[Выделить все]
 
(defun ru-3d-pipe-reducer-concentr (start_pnt pnt_orient param_lst)
  (ru-3d-pipe-reducer-conc-draw
    start_pnt
    pnt_orient
    (list (nth 0 param_lst)
          (nth 1 param_lst)
          (nth 2 param_lst)
          (* 0.1 (nth 2 param_lst))
          (nth 3 param_lst)
    ) ;_ end of list
  ) ;_ end of ru-3d-pipe-reducer-conc-draw
  
) ;_ end of defun
(defun ru-3d-pipe-reducer-conc-draw (start_pnt   pnt_orient
                                     param_lst   /
                                     ang_draw    d_end
                                     d_start     ent_last
                                     l           l1
                                     old_layer   pnt1
                                     pnt11       pnt2
                                     pnt21       pnt3
                                     pnt31       pnt4
                                     pnt41       pnt_end
                                     pnt_end_reducer
                                     pnt_start_reducer
                                     region      s
                                     ss          vla-array solid
                                    )
  (setq
    d_start (ru-conv-millimeter-to-unit (nth 0 param_lst))
    ;; диаметр входа
    d_end   (ru-conv-millimeter-to-unit (nth 1 param_lst))
    ;; диаметр выхода
    l       (ru-conv-millimeter-to-unit (nth 2 param_lst))
    ;; длина общая
    l1      (ru-conv-millimeter-to-unit (nth 3 param_lst))
    ;; длина прямого участка
    s       (ru-conv-millimeter-to-unit (nth 4 param_lst))
            ;;ТОлщина стенки
  ) ;_ end of setq
  (setq d_start           (* d_start 0.5)
        d_end             (* d_end 0.5)
        pnt_start_reducer (ru-3d-point-by-2-points-and-dist
                            start_pnt
                            pnt_orient
                            l1
                          )   ; _ end of
                              ; ru-3d-point-by-2-points-and-dist
        ;; начало перехода - конец прямого
        pnt_end_reducer   (ru-3d-point-by-2-points-and-dist
                            start_pnt
                            pnt_orient
                            (- l l1 l1)
                          )   ; _ end of
                              ; ru-3d-point-by-2-points-and-dist
        pnt_end           (ru-3d-point-by-2-points-and-dist
                            start_pnt
                            pnt_orient
                            l
                          )   ; _ end of
                              ; ru-3d-point-by-2-points-and-dist
                          ;;конец патрубка фланца
  ) ;_ end of setq
  (setq old_layer (getvar "CLAYER"))
  (ru-layer-current (ru-3d-axes-layer-name old_layer))
  (ru-line-add start_pnt pnt_end 0 (ru-ltype-axes))
  (ru-layer-current old_layer)
  (setq
    ent_last (entlast)
    ang_draw (ru-geom-go-right (angle start_pnt pnt_orient))
    pnt1     (polar
               start_pnt
               ang_draw
               d_start
             ) ;_ end of polar
    pnt11    (polar
               start_pnt
               ang_draw
               (- d_start s)
             ) ;_ end of polar
    pnt2     (polar
               pnt_start_reducer
               ang_draw
               d_start
             ) ;_ end of polar
    pnt21    (polar
               pnt_start_reducer
               ang_draw
               (- d_start s)
             ) ;_ end of polar
    pnt3     (polar
               pnt_end_reducer
               ang_draw
               d_end
             ) ;_ end of polar
    pnt31    (polar
               pnt_end_reducer
               ang_draw
               (- d_end s)
             ) ;_ end of polar
    pnt4     (polar
               pnt_end
               ang_draw
               d_end
             ) ;_ end of polar
    pnt41    (polar
               pnt_end
               ang_draw
               (- d_end s)
             ) ;_ end of polar
  ) ;_ end of setq
  ;; Вернет точку, надо получить массив объектов
  (ru-line-add-multi
    (list pnt1 pnt2 pnt3 pnt4 pnt41 pnt31 pnt21 pnt11) ;_ end of list
    t
    (ru-lw-current)
    nil
  ) ;_ end of ru-line-add-multi
  (setq
    ss        (ru-ss-select-after-ent ent_last)
    vla-array (ru-ss-to-vla-array ss)
  ) ;_ end of setq
  (ru-3d-set-last start_pnt pnt_end)
  (if vla-array
    (progn
      (setq region (ru-obj-make-region-from-vla-array vla-array))
      (setq solid (vla-addrevolvedsolid
        (ru-obj-active-space)
        region
        (vlax-3d-point start_pnt)
        (vlax-3d-point
          (ru-3d-vector-by-2-points
            start_pnt
            pnt_orient
          ) ;_ end of ru-3d-vector-by-2-points
        ) ;_ end of vlax-3d-point
        (* pi 2.0)
      ) ;_ end of vla-AddRevolvedSolid
      )      
      (ru-obj-ent-ss-erase region)
      (ru-obj-ent-ss-erase ss)
    ) ;_ end of progn
  ) ;_ end of if
solid
) ;_ end of defun
Получится показанное на прилагаемом рисунке.
Это именно для примера, чтобы показать "как это делается". Внутри используется множество дополнительных библиотечных функций. Как их делать и зачем нужны - тоже в упомянутой книге.

Так как тема всё-таки про литературу, рекомендую обзавестись и книгой "AutoLISP и Visual LISP в среде AutoCAD" Петра Лоскутова и Николая Полещука. Это лучшее в настоящее время справочное пособие.
Миниатюры
Нажмите на изображение для увеличения
Название: 3d_perx_ks.jpg
Просмотров: 185
Размер:	3.0 Кб
ID:	7043  
ShaggyDoc вне форума  
 
Непрочитано 02.06.2008, 09:24
#54
Рyslan


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


спасибо конечно, за науку. я и не собираюсь дергать народ все время, только я про свой "шедевр" спрашивал (последний). А книга у меня есть. Вот скажи мне, зачем ты мне свой код написал? Я хочу чтобы прога вырисовывала переход как я его рисую. То есть профиль, потом повернуть и создать тело и все. Задавать всего три размера, 2 диаметра и длину. Вот ты говоришь что надо с простого начинать с 2D, а я что делаю!? Профиль перехода то двухмерный, это ж прост четырехугольник.
Рyslan вне форума  
 
Непрочитано 02.06.2008, 09:27
#55
Кулик Алексей aka kpblc
Moderator

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


Рyslan, найди отличия
Код:
[Выделить все]
(defun c:perekhod2 (/ r r l *error* _osmode)
  (defun *error* (msg)
    (if _osmode
      (setvar "osmode" _osmode)
      ) ;_ end of if
    (princ msg)
    (princ)
    ) ;_ end of defun

  (if (and (setq r (getdist "\nРадиус большой:"))
          ; Задаем большой радиус перехода
           (setq r (getdist "\nРадиус маленький:"))
          ; Задаем маленький радиус перехода
           (setq l (getdist "\nДлина перехода:")) ; Задаем длину перехода
           ) ;_ end of and
    (progn
      (setq _osmode (getvar "osmode"))
      (setvar "osmode" 0)
      (command "_.Pline"
               '(0. 0.)
               (list 0. d)
               (list l d)
               (list l 0.)
               '(0. 0.)
               "_close"
               ) ;_ end of command
      (setvar "osmode" _osmode)
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2008, 09:42
#56
Рyslan


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


Ладно, все ясно с вами, буду сам ипаться дальше
Рyslan вне форума  
 
Непрочитано 02.06.2008, 09:47
#57
Рyslan


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


кстати твоя прога вот что пишет- Really want to discard all changes to drawing? <N> после того как введешь размеры
Рyslan вне форума  
 
Непрочитано 02.06.2008, 09:56
#58
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Рyslan Посмотреть сообщение
кстати твоя прога вот что пишет- Really want to discard all changes to drawing? <N> после того как введешь размеры
Попробуй заменить "_close" на "_c".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2008, 10:08
#59
Рyslan


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


теперь пишет неизвестная команда С. вот такая же фигня у меня вчера была, про что я писал. не хочет он замыкать полилинию командой close, и так писал "_C" тоже
Рyslan вне форума  
 
Непрочитано 02.06.2008, 10:10
#60
Рyslan


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


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

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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