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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,980

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 1965735
 
Непрочитано 23.07.2008, 18:07
#101
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


знак деления только другой
и скобка одна лишняя после list
Олег К. вне форума  
 
Непрочитано 23.07.2008, 19:01
#102
VVA

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


Ты с cond разобрался? Еще можно было использовать оператор if
По поводу точек. В общем все правильно, за исключением ошибок, на которые указал Олег К.,
Мой вопрос красным
Код:
[Выделить все]
  ( setq pt1
            ( list ( ;<= Что ты имел ввиду ставя эту скобку
                     ( - ( car base ) (/ dimensionX  2 ) )
                     ( - (cadr base ) (/ dimensionY  2 ) )
                   ) ;<= Что ты имел ввиду ставя эту скобку
            )
 )
*** Вдогонку
Здесь нужно учитывать особенности лисп при приведении типов
Выполни у себя в редакторе и сделай выводы
Код:
[Выделить все]
(/ 1 2)
(/ 1 2.0)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.07.2008, 10:09
1 | #103
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


VVA,
Про вопрос красным.
Я ошибочно полагал, что содержимое List должно находится в скобках.
Цитата:
Выполни у себя в редакторе и сделай выводы
Код:
(/ 1 2)
(/ 1 2.0)
Пока не понял. В редакторе на первое ответ 0, на второе 0,5. Почему так происходит не понимаю. Может все цифры надо записывать с десятичными? Но в таком случае почему 1 не записывается как 1,0
__________________
Блог
Red Nova вне форума  
 
Непрочитано 24.07.2008, 10:33
#104
VVA

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


Здесь я дал задание. Оно относится и к тебе. Внимательно почитай про функции.
"Красный" вопрос пока остается. Почитай (с разбором каждой главы в vlide) и попробуй еще раз ответить.
По поводу (/ 1 2) и (/ 1 2.0) - здесь вопрос приведения типов.
1. Если ЦЕЛОЕ делится (умножается) на ЦЕЛОЕ, то получается ЦЕЛОЕ (целое от 0.5 - 0)
2. Если ЦЕЛОЕ делится (умножается) на ВЕЩЕСТВЕННОЕ, то получается ВЕЩЕСТВЕННОЕ (это то, которое real)
Это я к тому, что в этом месте
Код:
[Выделить все]
(/ dimensionX  2 )
программист (то есть ты) должен быть абсолютно уверен, что dimensionX всегда должно быть вещественным (real). В данном случае так и есть. См.
Код:
[Выделить все]
(setq dimensionX (getreal "Введите ширину колонны: "))
Но если ты не уверен, то можно явно привести к типу REAL
Код:
[Выделить все]
(/ dimensionX  2.0 )
(* dimensionX  0.5 )
(/ dimensionX  2 1.0 )
Те же куриные продукты, только сбоку.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 11:06
#105
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


С делением и я разобрался а с этими чертовыми списками чтото туплю...
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 24.07.2008, 11:24
#106
ShaggyDoc

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


И вообще для колонн размер надо задавать сразу REAL. Мало ли что чаще всего они выражаются в целом количестве миллиметров. А если понадобится работать в единицах "метры"? Если на плане сетей надо будет колонну поставить? Да и вводить данные удобнее - можно getdist использовать.
ShaggyDoc вне форума  
 
Непрочитано 24.07.2008, 14:24
#107
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


>> Shoorup
Выполни в редакторе вот такие выражения:
(list ((* 5 2) (/ 8 4)))
(list (* 5 2) (/ 8 4))
(list '(* 5 2) '(/ 8 4))
и посмотри чем отличаются результаты.
При вычислениях лучше перебдеть (ведь пока нет отлова ошибок?) и делать явно задаваемые числа вещественными.
Не помню, говорили ли здесь, в vlisp'e есть хорошие возможности проверки кода на ошибки. Самые простые на панельке "Tools" (в стандартном виде - третья слева во второй строке). На код из #100 точно бы 2 раза ругнулся.
Олег К. вне форума  
 
Непрочитано 24.07.2008, 14:53
#108
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Добрый день, полезная тема, тоже как раз начал изучать лисп.
Прделагаю начать с самого простого а потом усложнять.
А то для начинающих сложно освоить все сразу.
Давайте вернемся к простой задаче
Цитата:
Сообщение от VVA Посмотреть сообщение
Red Nova, Не с того конца подходишь. Для тебя пока vl-* и vla-* функции табу. Задание попроще:
1. Название команды - Колонна
2. Запрашивается у пользователя длина A и ширина B
3. Запрашивается точка вставки Pt
4. Точка вставки Pt считается центром прямоугольника AxB
Пиши команду, рисующую колонну. Как минимум на одни грабли наступишь.
Вот мое решение:
Код:
[Выделить все]
(defun c:колонна (/ a b p x1 y1 x2 y2)

	(setq a (getreal"\nВведите ширину колонны:"))
	(setq b (getreal"\nВведите высоту колонны:"))
	(setq p (getpoint"\nУкажите центр колоны:"))
	(setq x1 (- (car p) (/ a 2))) 
	(setq y1 (- (car (cdr p)) (/ b 2)))
	(setq x2 (+ (car p) (/ a 2)))
	(setq y2 (+ (car (cdr p)) (/ b 2)))
	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
	)
)
Понимаю что можна было - бы обойтись без переменных х1,х2,у1,у2 - но для начала можна и использовать.
Теперь можна усложнять.
Постепенно.
andery вне форума  
 
Непрочитано 24.07.2008, 15:20
#109
VVA

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


Нужно подождать пока Red Nova и Co подтянуться. А тебе пока нужно
1. На запрос ширины и длинны запретить пустой ввод,ввод отрицательных чисел и 0
2. На запрос точки на ввод по умолчанию принять координату 0,0,0.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 16:27
#110
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Цитата:
Сообщение от VVA Посмотреть сообщение
Нужно подождать пока Red Nova и Co подтянуться. А тебе пока нужно
1. На запрос ширины и длинны запретить пустой ввод,ввод отрицательных чисел и 0
2. На запрос точки на ввод по умолчанию принять координату 0,0,0.
Может криво, но вроде работает
+заментил getreal на getdist, чтоб ширину и высоту можна было на экране указать, нормально будет?
Код:
[Выделить все]
(defun c:колонна (/ a b x1 y1 x2 y2)
	(initget (+ 1 2 4))
	(setq a (getdist"\nВведите ширину колонны:"))
	(initget (+ 1 2 4))
	(setq b (getdist"\nВведите высоту колонны:"))
	(setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
	(if (= p nil) (setq p (quote (0 0 0)))
	)
	(setq x1 (- (car p) (/ a 2))) 
	(setq y1 (- (car (cdr p)) (/ b 2)))
	(setq x2 (+ (car p) (/ a 2)))
	(setq y2 (+ (car (cdr p)) (/ b 2)))
	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
	)
)
andery вне форума  
 
Непрочитано 24.07.2008, 16:55
#111
VVA

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


andery, Нормально.
Для проверки на пусто (nil) есть функция null
т.е.
(if (= p nil) ... можно еще записать как (if (null p) ...
Ну и еще наиболее частые связки car и cdr уже есть ввиде отдельных функций
(car (cdr p)) = (cadr p)
Читать нужно с конца: к списку p применить cdr потом car
(cADDARr p ) = (cAr (cDr (cDr (cAr p))))
Код:
[Выделить все]
(caddar '((1 2 3)(4 5 6))) ;_Вернет 3
А так весьма неплохо.
Теперь давай запросим угол поворота и повернем колонну относительно точки P на этот угол.
PS P не объявлена в локальных переменных
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 17:01
#112
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Выполняется указание точек в чертеже. Наверное, в функции initget стоит использовать и bit 8.

VVA, вопрос.
Если использовать (if (null (setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))) (setq p '(0 0 0)))
всегда ли в условии при пустом вводе будет nil? Что-то сомнения иногда бывают.

Последний раз редактировалось Олег К., 24.07.2008 в 17:11.
Олег К. вне форума  
 
Автор темы   Непрочитано 24.07.2008, 17:10
#113
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


VVA И так на данный момент код у меня такой
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base)
(initget 7)
(setq dimensionX (getreal "Введите ширину колонны: "))
(initget 7)
(setq dimensionY (getreal "Введите толщину колонны: "))
(setq base 
    (cond
         (getpoint "\Введите точку вставки колонны <0,0,0> :")
         (t '(0. 0. 0.)))
     ) 
(setq pt1
     ( list ( - ( car base ) ( / dimensionX  2.0 ) )
            ( - (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(setq pt2
     ( list ( - ( car base ) ( / dimensionX  2.0 ) )
            ( + (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(setq pt3
     ( list ( + ( car base ) ( / dimensionX  2.0 ) )
            ( + (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(setq pt4
     ( list ( + ( car base ) ( / dimensionX  2.0 ) )
            ( - (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(command "pline" pt1 pt2 pt3 pt4)
  ;продолжение
)
Можешь давать очередное задание но колонне. Хювенена буду изучать по ходу дела. А-то остальным долго ждать.
Про вопрос красным я понял. Про реальные и вещественные вроде тоже.

P.S. А учеников у тебя все больше.

------------------------
Опоздал, уже дал задание про поворот.
Про P не понял.
Цитата:
PS P не объявлена в локальных переменных
Это значит ввести переменную P или не вводить ее?
__________________
Блог

Последний раз редактировалось Red Nova, 24.07.2008 в 17:57.
Red Nova вне форума  
 
Автор темы   Непрочитано 24.07.2008, 17:40
#114
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


Ну повернуть можно командой rotate, а как выбрать то что мы будем крутить не знаю. Поищу в книгах.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 24.07.2008, 17:42
#115
VVA

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


Олег К., Не вижу причин чтобы не работала. Хотя я предпочитаю такие конструкции (для меня нагляднее)
Код:
[Выделить все]
(or
  (setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
  (setq p '(0 0 0))
  )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 17.12.2016 в 19:52.
VVA вне форума  
 
Непрочитано 24.07.2008, 17:50
#116
VVA

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


Red Nova, У тебя код не рабочий. Читай замечания Олег К. #101,
Локальные переменные описываются после слэша при определении функции. Выделил корасным
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base)
Время их жизни ограничено временем жизни (исполнения) функции. Если переменная используется в коде, но не объявлена как локальная - то она становится глобальной, время ее жизни - пока открыт документ в Автокаде
Кстати проверить значение переменной можно, набрав в командной строке Автокада ! (восклицательный знак) и имя. Если загрузить команду Колонна, то
Цитата:
Команда: !c:колонна
#<USUBR @120c2294 C:КОЛОННА>
Демонстрация локальной и глобальной переменной
В команде TEST2 переменная rez не объявлена локальной
Код:
[Выделить все]
(defun C:TEST1 ( / A B rez )
  (initget 7)
  (setq a (getreal "\nПервое число A: "))
  (initget 7)
  (setq b (getreal "\nВторое число B: "))
  (setq rez (+ A B))
  (princ "\nСумма A + B = ")(princ rez)
  (princ)
  )

(defun C:TEST2 ( / A B)
  (initget 7)
  (setq a (getreal "\nПервое число A: "))
  (initget 7)
  (setq b (getreal "\nВторое число B: "))
  (setq rez (+ A B))
  (princ "\nСумма A + B = ")(princ rez)
  (princ)
  )
1. Загружаем команды
2. Выполняем TEST1
3. Набираем в командной строке !rez
4. Выполняем TEST2
5. Набираем в командной строке !rez
6. Смотрим на разницу и делаем выводы
Цитата:
Команда: test1
Первое число A: 1
Второе число B: 3
Сумма A + B = 4.0
Команда:
Команда: !rez
nil

Команда: test2
Первое число A: 1
Второе число B: 3
Сумма A + B = 4.0
Команда:
Команда: !rez
4.0
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 17:52
#117
VVA

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


Цитата:
как выбрать то что мы будем крутить не знаю
А как бы ты выбрал последний отрисованный элемент в команде _Rotate при условии, что нельзя пользоваться мышкой?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.07.2008, 17:55
#118
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


Цитата:
Red Nova, У тебя код не рабочий. Читай замечания Олег К. #101,
Ой тьфю, забыл совсем. Исправил.
Цитата:
А как бы ты выбрал последний отрисованный элемент в команде _Rotate при условии, что нельзя пользоваться мышкой?
набрал бы P в ком строке. Так пойдет?
----------------------
Пробую в автокаде, рисую что-то, потом команда rotate, затем ввожу p, результата нет.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 24.07.2008, 18:01
#119
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Да я тож застрял на Ротате.
Мне не понятен синтаксис вызова команды
Например
(command "_rotate _L
или
(command "_rotate "_L"
где об этом почитать можна
прочитал что _L последний нарисованный обьект....
Подскажите в каом русле двигаться....
andery вне форума  
 
Непрочитано 24.07.2008, 18:04
#120
VVA

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


Мы ее (колонны) только что отрисовали и ни одна команда редактирования с ней не работала. Предыдущего (текущего, последнего) набора нет. Так что P (Previous), он же текущий-предыдущий-последний не пойдет. Штудируйте командную строку.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46