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

Вернуться   Форум 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.
Просмотров: 1972494
 
Непрочитано 13.04.2011, 10:33
#1401
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


alex8888, если правильно понял Твой вопрос, то
Код:
[Выделить все]
 
(mapcar '(lambda(x) (distof (vl-string-subst "." "," x) 2)) (list a b c d))
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 13.04.2011, 11:14
#1402
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


TararykovDG,

спасибо, именно то что нужно.

А если немного по другому, можно ли обойтись вообще без составления списка? Например, имею переменные, а,б,в,г и тд, в которые записаны строковые значения из полей диалогового окна (на DCL). Хочу эти значения получить числами, при этом без разницы, введены ли они с разделителем - запятой или точкой и записать их в те же переменные.
Как я говорил, по отдельности труда не составляет использовать конструкцию типа (distof (vl-string-subst "." "," x) 2).
Как работать со списком теперь тоже понятно. Но из списка снова нужно восстанавливать эти переменные, той же nth.
Есть другие алгоритмы решения задачи?
alex8888 вне форума  
 
Непрочитано 13.04.2011, 11:17
#1403
VVA

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


alex8888,
Код:
[Выделить все]
(setq a "355,6" b "320.4" c "10,8" d "22.14")
(mapcar '(lambda(x)(set x (read (vl-string-subst "." "," (eval x)))))
        (list 'a 'b 'c 'd)
        )
Вместо read можно использовать distof
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 13.04.2011, 11:26
#1404
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


VVA

Спасибо, так намного лучше.
alex8888 вне форума  
 
Непрочитано 13.04.2011, 11:45
#1405
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


alex8888, все-таки я не до конца правильно понял что было нужно и хотя VVA уже написал как надо, вот еще вариант, хотя те же "..." только сбоку
Код:
[Выделить все]
 
(setq a "355,6" b "320.4" c "10,8" d "22.14") 
(foreach x (list 'a 'b 'c 'd) (set x (distof (vl-string-subst "." "," (eval x)) 2)))
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 13.04.2011, 12:12
#1406
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


TararykovDG,

а это как раз то, что пытался изобразить я, но никак не врубался, куда же "ваучер засунуть" (гусары-молчать!).

Оказывается, просто надо было докопаться до (eval x), остальное, вроде бы как и правильно начинал делать.

Еще раз спасибо.
alex8888 вне форума  
 
Непрочитано 13.04.2011, 12:40
#1407
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Оказывается, просто надо было докопаться до (eval x), остальное, вроде бы как и правильно начинал делать.
Еще обрати внимание, что используется set x..., а не setq x ... . Иначе работать не будет, так как функция setq x ... присваивает некоторое значение переменной x, а set x ... присваивает значение символу, на который ссылается x, в нашем случает x поочередно ссылается на переменные a b c d и как раз им уже и присваиваются значения полученные выражением (distof (vl-string-subst "." "," (eval x)) 2)
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 13.04.2011, 12:44
#1408
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Например, имею переменные, а,б,в,г и тд, в которые записаны строковые значения из полей диалогового окна (на DCL). Хочу эти значения получить числами, при этом без разницы, введены ли они с разделителем - запятой или точкой и записать их в те же переменные.
А вообще, является ли введёно значение числом тебе тоже без разницы?
Я бы проверял значение ещё при его вводе в диалоге
Код:
[Выделить все]
 (action_tile
  "key"
  (vl-prin1-to-string
    (quote
      (if (not (setq key_value
		      (distof
			(vl-string-subst
			  "."
			  ","
			  (vl-string-subst
			    ""
			    " "
			    $value
			  )
			)
		      )
	       )
	  )
	(progn
	  (alert "\n Не верное число"
	  )
	  (mode_tile "key" 2)
	)
      )
    )
  )
)
Причём, как видно из кода, я бы ещё поубирал пробелы, потому что (distof "5 000") -> 5. И использовать нужно именно distof, потому что (read\atof "100 , нет лучше 500") -> 100 , не смотря на то, что пользователь всё же хотел 500, а вот distof в такой ситуации вернёт nil, и попросит пользователя быть более корректным.
__________________
Почему все вдруг становятся умными, когда уже не надо?

Последний раз редактировалось Disney, 13.04.2011 в 13:18.
Disney вне форума  
 
Непрочитано 13.04.2011, 13:21
#1409
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Offtop: В аргументе функции alert "\n" - лишнее.
Do$ вне форума  
 
Непрочитано 13.04.2011, 14:10
#1410
ShaggyDoc

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


Цитата:
Я бы проверял значение ещё при его вводе в диалоге
Разумеется, проверку надо делать как можно раньше. Если логикой предусмотрен ввод именно числа, то диалог не должен отработать OK, пока не будет введено именно число. Причем, возможно - число в допустимом диапазоне.
Такую (или любую другую) проверку лучше прятать в библиотечную функцию, чтобы не писать в каждой конкретной программе. Эта функция должна блокировать какой-то при "tile" при неверных параметрах ввода. Сообщение об ошибке должно быть как можно более информативным. Можно и в alert вывести (что проще), а можно и в специальный элемент самого диалога.

Вот пример такой функции

Код:
[Выделить все]
 (defun ru-dcl-check-tile-param
       (tile_name txt nmin nmax old dec locked_tile / val tmp res key)
  ;;nmin     - минимум
  ;;nmax     - максимум
  ;;old      - старое значение
  ;;dec      - точность отображения
  ;;locked_tile  - ключ кнопки, которую заблокировать при ошибке
  (if (setq tmp (atof (get_tile tile_name)))
    (progn
      (setq res "")
      (mode_tile locked_tile 0)
      (if (> tmp nmax)
        (setq res (strcat txt
                          " "
                          (rtos tmp 2 dec)
                          " больше "
                          (rtos nmax 2 dec)
                  ) ;_ end of strcat
        ) ;_ end of setq
      ) ;_ end of if
      (if (< tmp nmin)
        (setq res (strcat txt
                          " "
                          (rtos tmp 2 dec)
                          " меньше  "
                          (rtos nmin 2 dec)
                  ) ;_ end of strcat
        ) ;_ end of setq
      ) ;_ end of if
      ;;(set_tile "error" res)
      (if (/= res "")
        (progn
          (mode_tile tile_name 3)
          (ru-msg-alert res)
          (setq tmp old)
        ) ;_ end of progn
      ) ;_ end of if
      (set_tile tile_name (rtos tmp 2 dec))
    ) ;_ end of progn
  ) ;_ end of if
  tmp
) ;_ end of defun
ShaggyDoc вне форума  
 
Непрочитано 13.04.2011, 14:28
#1411
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


До "суровой" проверки руки пока не дошли, по простому, считаем, что вводится число, хотя и уже без разницы в виде с "," или "." Если будет не число, то программа не сработает - покажет ошибку, хотя и неизвестно где конкретно.
А вот action_tile в виде библиотечной функции что то не получается создать - есть ли тут какие-то подводные камни и подвохи?
В качестве примера попытка создать модуль на основе кода 1408:
Код:
[Выделить все]
(action_tile "eb1"  (at_input_value ring_d1))
(action_tile "eb1"  (at_input_value ring_d1))
Код:
[Выделить все]
(defun at_input_value (key_value / )
  
      (vl-prin1-to-string
      (quote
        (if (not (setq key_value
                        (distof
                          (vl-string-subst
                            "."
                            ","
                            (vl-string-subst
                              ""
                              " "
                              $value
                            )           ;vl-string-subst
                          )             ;vl-string-subst
                        )               ;distof
                 )                      ;setq
            )                           ;not
          (progn
            (alert "\n Íå âåðíîå ÷èñëî"
            ) ;_ end of alert
            (mode_tile "key" 2)
          )                             ;progn else
        )                               ;if
      )                                 ;quote
    )                                   ;vl-prin1-to-string

)
Не работает, хотя в виде:
Код:
[Выделить все]
(action_tile
    "eb1"
    (vl-prin1-to-string
      (quote
        (if (not (setq ring_d1
                        (distof
                          (vl-string-subst
                            "."
                            ","
                            (vl-string-subst
                              ""
                              " "
                              $value
                            )           ;vl-string-subst
                          )             ;vl-string-subst
                        )               ;distof
                 )                      ;setq
            )                           ;not
          (progn
            (alert "\n Íå âåðíîå ÷èñëî"
            ) ;_ end of alert
            (mode_tile "key" 2)
          )                             ;progn else
        )                               ;if
      )                                 ;quote
    )                                   ;vl-prin1-to-string
  )
очень даже как.
alex8888 вне форума  
 
Непрочитано 13.04.2011, 15:43
#1412
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Прошу подсказать, как программно переопределить описание блока в файле? Чтобы при _.insert уже вставлялся обновленный блок.

Файл вставляю из библиотеки блоков функцией от VVA:

Код:
[Выделить все]
(lib:add-block-to-doc-from-lib "MIP_LIB_DYN" "MIP_WELL_DYN_P")
Frigate вне форума  
 
Непрочитано 13.04.2011, 15:48
#1413
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


1. открыть описание блока в текущем файле и внести изменения
2. открыть описание блока в файле-библиотеке, внести изменения и сохранить.

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

P.S. Хотя, если использовать ToolPalettes, то там есть возможность повторного импорта указанного блока (с возможностью переопределения), насколько мне помнится.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 13.04.2011, 16:15
#1414
VVA

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


"MIP_LIB_DYN" - имя dwg файла библиотеки
"MIP_WELL_DYN_P" - имя блока в библиотеке
Frigate, В этой ф-ции используется команда _-insert, отсюда нюансы:
1. В текущем чертеже не должно быть блока и именем, совпадающем с именем файла библиотеки. Если такой блок есть, нужно дать ему новое имя.
2. Если хочешь обновить сам блок, так же дай ему новое имя. Тогда после insert вставится обновленный блок
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 13.04.2011, 20:24
#1415
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Не работает
Читаем внимательно справку
action_tile
vl-prin1-to-string
quote
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 14.04.2011, 09:15
#1416
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Disney, перечитал справку, книгу Полещука по нескольку раз в указанных местах и так ничего не понял, на что ты советовал обратить внимание, извини.
По action_tile наверное, что выражение надо писать в кавычках вот так:
Код:
[Выделить все]
(action_tile "eb1"  "(at_input_value ring_d1)")
vl-prin1-to-string просто переводит аргумент в строку, у нас используя
quote для обработки выражения без вычисления.
Ну а теперь как связать все воедино? Получается, что в action_tile мы передаем Лисп-выражение в виде строки. Но почему нельзя передать вместо нее вызов функции с той же строкой внутри? Или надо как то по другому записать? Если не лень, можешь разжевать поподробнее ?
alex8888 вне форума  
 
Непрочитано 14.04.2011, 10:28
1 | #1417
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


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


Цитата:
Сообщение от alex8888 Посмотреть сообщение
можешь разжевать поподробнее
Я честно наверно минут 30 пытался ответить не разжёвывая, так, намёками, чтоб сам разбирался, но ни фига не получилось.
Вот так будет работать, разбирайся:
Код:
[Выделить все]
 
(action_tile
  "eb1"
  "(setq ring_d1(at_input_value $key))"
)
		    ;
(defun at_input_value (key / temp)
  (if (not (setq temp
		  (distof
		    (vl-string-subst
		      "."
		      ","
		      (vl-string-subst
			""
			" "
			(get_tile key)
		      )
		    )
		  )
	   )
      )
    (progn
      (alert "Тут сообщение о не верном вводе")
      (mode_tile key 2)
    )
  )
  temp
)

__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 14.04.2011, 10:31
#1418
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Цитата:
Сообщение от Disney Посмотреть сообщение
вводить 58 необязательных аргументов тоже не хочется.
А зачем 58? Не проще ли сделать один аргумент, но списком? http://autolisp.ru/2009/10/21/lisp-overloading/
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 14.04.2011, 10:58
#1419
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Лиспер, да я в курсе, и тема недавно подобная была.
Конкретный пример, есть у меня в диалоге 4 edit_box, допустимые значения:
  1. Цело, причём я не хочу чтобы "34 попугая" - считалось целым числом 34
  2. Целое, но только положительное
  3. Вещественное, при чём допускается префикс\суффикс
  4. Вещественное, причём очень важно введено просто положительное или именно со знаком "+"
Чисто теоретически, конечно можно написать одну функцию, которая будет проверять все введённые значения на допустимость, но оно надо?
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 14.04.2011, 19:10
#1420
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Disney Посмотреть сообщение
о оно надо?
Надо!
зы п.3 почти противоречит п1
gomer вне форума  
Ответ
Вернуться   Форум 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