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

Вернуться   Форум 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.
Просмотров: 1973757
 
Непрочитано 06.03.2012, 16:57
#1821
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Не выходит построение текста из выплывающего списка.
dcl:
Код:
[Выделить все]
...
:popup_list {label="Ввод:"; key="b1s";
 list=
 "куст\nдерево\nдом";
 edit_width=40;
 edit_limit=24;}
...
lsp:
Код:
[Выделить все]
...
(action_tile "accept" "(setq b1 (get_tile \"b1s\"))")
...
(setq x_p (+ x0 50.))
  (setq y_p (- y0 15.))
  (setq pt (list x_p y_p))
  (setq ang 0)
  (setq h 3.)
  (vl-cmdf "_.text" "_j" "_m" pt h ang b1)
спс за Помощь.
Pavel_GP вне форума  
 
Непрочитано 06.03.2012, 17:00
#1822
Кулик Алексей aka kpblc
Moderator

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


Потому что в выпадающем списке возвращается не значение, а индекс выбранного элемента, насколько я помню.
И, кстати, построение текста будет выполняться некорректно, если у текущего текстового стиля установлена фиксированная высота.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.03.2012, 18:10
1 | #1823
gomer

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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Не выходит построение текста из выплывающего списка.
заполняйте в лиспе ваш список, а потом используйте nth
gomer вне форума  
 
Непрочитано 06.03.2012, 18:17
#1824
baaba

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Из выступлений Евгения Елпанова на форумах Autodesk:
Алексей, спасибо! Лиспик работает, на сколько быстрее - точно не скажу, но намного -)))
baaba вне форума  
 
Непрочитано 07.03.2012, 10:11
#1825
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Цитата:
Сообщение от gomer Посмотреть сообщение
заполняйте в лиспе ваш список, а потом используйте nth
Подскажите на примере.
спс.
Pavel_GP вне форума  
 
Непрочитано 07.03.2012, 20:15
1 | #1826
gomer

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


как-то так...
Код:
[Выделить все]
// test.dcl

test : dialog {

  key = "dlg";

  : list_box {
    label = "Выберите из списка:";
    key   = "lst";
  }
  spacer;
  ok_cancel_err;

}
Код:
[Выделить все]
 ;;; test.lsp

(defun init_list (tile lst)
;;; Функция заполнения списка
  (start_list tile)
  (mapcar 'add_list lst)
  (end_list)
)

(defun test (title lst / dcl_id dcl_rt case)
  (new_dialog
    "test"
    (setq dcl_id (load_dialog "c:/test/test.dcl"))
  )

  (set_tile "dlg" title)
  (init_list "lst" lst)

  (defun lst_clk (idx)
    (set_tile "error"
	      (strcat "Ваш выбор: " (nth (atoi idx) lst))
    )
  )
  (defun accept_clk ()
    (if	(/= "" (setq case (get_tile "lst")))
      (done_dialog 1)
      (set_tile	"error"
		"Выберите любимое животное"
      )
    )
  )

  (action_tile "lst" "(lst_clk $value)")
  (action_tile "accept" "(accept_clk)")
  (action_tile "cancel" "(done_dialog 0)")

  (setq dcl_rt (start_dialog))
  (unload_dialog dcl_id)

  (if (zerop dcl_rt)
    (alert "Вы не любите животных?")
    (alert
      (strcat (nth (atoi case) lst) " - лучший друг человека!")
    )
  )
  (princ)
)

(test "Ваше домашнее животное"
      '("Кошка" "Собака" "Попугайчик" "Черепашка")
)
gomer вне форума  
 
Непрочитано 11.03.2012, 09:04
#1827
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Цитата:
Сообщение от gomer Посмотреть сообщение
как-то так...
Ув. gomer. Далее построение текста... Я так и не понял как потом идет построение текста по вашему примеру.
спс за понимание.
Pavel_GP вне форума  
 
Непрочитано 11.03.2012, 15:04
#1828
gomer

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


Pavel_GP, что не понятного? Если выполняется условие (zerop dcl_rt), грязно ругаете пользователя, а если нет, то организовываете ввод точки вставки и рисуете текст
gomer вне форума  
 
Непрочитано 11.03.2012, 15:40
#1829
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Цитата:
Сообщение от gomer Посмотреть сообщение
Pavel_GP, что не понятного? Если выполняется условие (zerop dcl_rt), грязно ругаете пользователя, а если нет, то организовываете ввод точки вставки и рисуете текст
Я понимаю, то: Построение текста:
Код:
[Выделить все]
 (vl-cmdf "_.text" "_j" "_m" pt h ang p)
,

pt, h, ang, - мне известны

p - нет, тут должно быть значение текста. Поэтому мне и не понятно, что мне сюда вставить. Я перебрал все значения по вашему коду, выдает ошибку не правильный тип.
Pavel_GP вне форума  
 
Непрочитано 11.03.2012, 16:12
1 | #1830
AlexSheep


 
Регистрация: 08.09.2010
Москва
Сообщений: 28


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Я перебрал все значения по вашему коду, выдает ошибку не правильный тип.
Видимо, не все перебрал
Вместо строк 42-44 в коде gomer, вставь
Код:
[Выделить все]
 (vl-cmdf "_.text" "_j" "_m" pt h ang (nth (atoi case) lst))
AlexSheep вне форума  
 
Непрочитано 11.03.2012, 17:37
1 | #1831
gomer

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


Замечу, что список lst может быть ассоциативным или двухуровневый, на вкус, тогда строка может быть такая (cadr (nth (atoi case) lst))
gomer вне форума  
 
Непрочитано 15.03.2012, 10:56
#1832
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Здравствуйте Ув.
Подскажите , как объединить в Lisp коде, если несколько окон в DCL-коде
и setq pt будет иметь другие координаты
Пример (составитель fixo)
Код:
[Выделить все]
 ;;;            SingleList.lsp            ;;;
(defun C:drawtextfromlist (/ dcl_id pt tsize txt txt_list userpick)

  (setq    txt_list
     (list "alpha"       "bravo"     "charlie"   "delta"
           "echo"       "foxtrott"  "golf"       "hotel"
           "india"       "juliet"    "kilo"       "lima"
           "mike"
          )
  )
  (setq dcl_id (load_dialog "SingleList.dcl"))

  (if (not (new_dialog "textfromlist" dcl_id))
    (exit)
  )

  (start_list "lst_text")
  (mapcar 'add_list txt_list)
  (end_list)

  (action_tile "cancel" "(setq userpick nil)(done_dialog)")

  (action_tile
    "accept"
    "(progn (setq userpick T)(setq txt (nth (atoi (get_tile \"lst_text\"))txt_list))(done_dialog))"
  )

  (start_dialog)
  (unload_dialog dcl_id)


  (cond    ((= userpick nil)
     (princ "\n  Отказ пользователя... ")
    )
    ((= userpick T)
     (progn
       (if (= txt "")
         (princ "\n Забыл выбрать из списка?")
         (progn
           (princ (strcat "\n Выбран текст: " txt)

           )
           (setq pt (list 0.0 0.0))
           (setq ang 0)
           (setq h 3.)
           (vl-cmdf "_.text" pt h ang txt)
         )
       )
     )
    )
  )
  (princ)
)
Код:
[Выделить все]
 //         SingleList.dcl            //
textfromlist : dialog {label = "Вставка текста из списка" ;
  :list_box{label = "Какой-то список...";
    key="lst_text";
    multiple_select = false;
    fixed_width_font=true;
    width=24;
    height=12;
  }
     :row{
        fixed_width=true;  
        alignment = right;
     ok_cancel;
     }
   }

Спс. сам разобрался =)

Последний раз редактировалось Pavel_GP, 15.03.2012 в 11:49.
Pavel_GP вне форума  
 
Непрочитано 15.03.2012, 13:22
#1833
gomer

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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
сам разобрался =)
осталось научиться правильно указывать точку вставки
gomer вне форума  
 
Непрочитано 16.03.2012, 08:50
#1834
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Цитата:
Сообщение от gomer Посмотреть сообщение
осталось научиться правильно указывать точку вставки
Код:
[Выделить все]
 (setq pt (getpoint "\n  Точка вставки: "))
в, том примере уже известны координаты точки.
Pavel_GP вне форума  
 
Непрочитано 16.03.2012, 09:11
#1835
Кулик Алексей aka kpblc
Moderator

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


Не только указывать Но и преобразовывать, и корректно запрос выполнять
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.03.2012, 17:24
#1836
baaba

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


У меня получается код примерно такого вида:
Код:
[Выделить все]
 
(defun afun (a b) (+ a b))
(defun bfun (a c) (* a c))
(defun c:cfun (a / d) (setq d 4) (+ a d))
В принципе, я бы мог обойтись без afun и bfun, но тогда было бы сложно разбираться с c:сfun. Код был бы слишком запутанным. Я делаю много маленьких функций, отрабатываю их, затем включаю их в основную функцию. Все переменные встроенные, передаются от функции к функции. Одна переменная, например, высота текста, "сквозная" для нескольких функций (в приведённом примере это переменная a). Мне это решение кажется немного кургузым. Есть ли какой-то третий путь? Что можно почитать?
Может быть просто вынести переменную "a" в глобальные?
baaba вне форума  
 
Непрочитано 16.03.2012, 20:51
#1837
Кулик Алексей aka kpblc
Moderator

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


Не советую использовать глобальные переменные, особенно с такими "информативными" названиями. Ее переопределить - как нефиг делать.
Любой даже самый простой код можно сделать запутанным, а самый сложный - достаточно легко читаемым. Ну, например:
Код:
[Выделить все]
 (defun fun_summ (lst)
                ;|
*    Выполняет суммирование параметров
*    Параметры вызова:
	lst    список чисел либо число. Наличие нечисловых значений недопустимо.
*    Примеры вызова:
(fun_summ 1) ; 1
(fun_summ '(1 2 3) ; 6
|;
  (cond
    ((listp lst)
     (apply (function +) lst)
     )
    (t
     (fun_summ (list lst))
     )
    ) ;_ end of cond
  ) ;_ end of defun

(defun fun_multi (lst)
                 ;|
*    Выполняет умножение параметров
*    Параметры вызова:
	lst    список чисел либо число. Наличие нечисловых значений недопустимо.
*    Примеры вызова:
(fun_multi 1) ; 1
(fun_multi '(1 2 3) ; 6
|;
  (cond
    ((listp lst)
     (apply (function *) lst)
     )
    (t (fun_multi (list lst)))
    ) ;_ end of cond
  ) ;_ end of defun

(defun cmd ()
  (fun_summ (mapcar (function fun_multi) '((16. 5. -5. 65.) 48 98. (-5. -6. -7.))))
  ) ;_ end of defun
Достаточно посмотреть на комментарии к каждой функции, и в принципе уже не сильно требуется вникать в ее код. Работает, возвращает что просят - и ладно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.03.2012, 21:24
#1838
Дима_

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


Цитата:
Сообщение от baaba Посмотреть сообщение
(defun c:cfun (a / d) (setq d 4) (+ a d))
Я никак не могу понять почему аболютному большинству программирующих проще "насовать" абсолютно ненужных переменных - вот зачем в этом примере d??? Надо прибавить 4 - ну так что может быть проще - возьми и прибавь 4 - (defun c:cfun (a) (+ a 4)) - ВСЕ. Суть не в конкретном примере - а в "дурной традиции" что-ли.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.03.2012, 22:51
#1839
Кулик Алексей aka kpblc
Moderator

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


Дима_, лично я вполне допускаю мысль, что приведен намеренно упрощенный пример. Возможно, даже "переупрощенный"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.03.2012, 23:58
#1840
gomer

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


я про а уже молчу
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