Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 243
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 2048077
 
Непрочитано 23.12.2024, 09:23
#4841
name02


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
А какую ошибку будем ловить в лиспе #4837, выход по Esc?
В русском автокаде нажатие Esc выводит сообщение "Функция прервана."
А уж что делать в случае этой ошибки сам решай - удалять все что создано с момента запуска или ничего или еще что-то
name02 вне форума  
 
Непрочитано 23.12.2024, 11:03
#4842
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
В русском автокаде нажатие Esc выводит сообщение "Функция прервана."
А уж что делать в случае этой ошибки сам решай - удалять все что создано с момента запуска или ничего или еще что-то
Если бы знал, что делать, не спрашивал бы...
Во многих программах нет отлова ошибок... потому что не все функции этого требуют? или по другим причинам?
Ingpro вне форума  
 
Непрочитано 23.12.2024, 11:23
1 | 1 #4843
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


потому что красивое окончание/прерывание программы практически не влияет на результат её выполнения.
__________________
K Lisp
koMon вне форума  
 
Непрочитано 23.12.2024, 11:25
1 | #4844
Кулик Алексей aka kpblc
Moderator

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


Вопрос - что будет, если пользователь на запрос имени комнаты нажмет Esc? Или при запросе точки?
ИМХО код условия в while должен быть наподобие
Код:
[Выделить все]
 and 
 (= 
   (type 
     (setq Roomname (vl-catch-all-apply 
                      (function 
                        (lambda () 
                          (getstring t "\nEnter room name: ")
                        )
                      )
                    )
     )
   )
   'str
 )
 (/= roomname "")
 (= 
   (type 
     (setq fc (vl-catch-all-apply 
                (function 
                  (lambda () 
                    (getpoint "\nFirst point <Cancel> : ")
                  )
                )
              )
     )
   )
   'list
 )
 fc
 (= 
   (type 
     (setq nc (vl-catch-all-apply 
                (function 
                  (lambda () 
                    (initget 32)
                    (getcorner fc "\nPick Next corner")
                  )
                )
              )
     )
   )
   'list
 )
 nc
    )
Код не проверял, если что
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.12.2024, 13:15
#4845
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
потому что красивое окончание/прерывание программы практически не влияет на результат её выполнения.
Т.е. чисто визуальная красота и никакого сбоя программы?

----- добавлено через ~13 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вопрос - что будет, если пользователь на запрос имени комнаты нажмет Esc? Или при запросе точки?
ИМХО код условия в while должен быть наподобие
Код работает, но пишет в ком. строке:
Enter room name: *Прервано*
First point <Cancel> : *Прервано*
; ошибка: неверный тип аргумента: consp #<%catch-all-apply-error%>
Код:
[Выделить все]
  (defun c:RoomLabel3 (/  Roomname fc nc h v str p) 
  (while 
   (and 
(= 
  (type 
    (setq Roomname (vl-catch-all-apply 
                     (function 
                       (lambda () 
                         (getstring t "\nEnter room name: ")
                       )
                     )
                   )
    )
  )
  'str
)
(/= roomname "")
(= 
  (type 
    (setq fc (vl-catch-all-apply 
               (function 
                 (lambda () 
                   (getpoint "\nFirst point <Cancel> : ")
                 )
               )
             )
    )
  )
  'list
)
fc
(= 
  (type 
    (setq nc (vl-catch-all-apply 
               (function 
                 (lambda () 
                   (initget 32)
                   (getcorner fc "\nPick Next corner")
                 )
               )
             )
    )
  )
  'list
    )
nc
)

    (setq h (abs (- (car fc) (car nc)))
          v (abs (- (cadr fc) (cadr nc)))
    )
    (setq str (strcat (strcase Roomname) 
                      "\\P"
                      (rtos h 2 2)
                      " x "
                      (rtos v 2 2)
                                    )
    )
    (setq p (mapcar (function (lambda (a b) (/ (+ a b) 2.))) fc nc))
    (entmakex 
      (list (cons 0 "MTEXT") 
            (cons 100 "AcDbEntity")
            (cons 100 "AcDbMText")
            (cons 10 (trans p 1 0))
            (cons 1 str)
            (cons 41 (- (car p) (car p)))
            (cons 71 5)
            (cons 72 5)
            (cons 73 1)
            (cons 7 (getvar 'TextStyle))
      )
    )
  )
  (princ)
)
че-то по Esc не выходит вообще, приходится принудительно выключать AutoCad...

Последний раз редактировалось Ingpro, 23.12.2024 в 15:02.
Ingpro вне форума  
 
Непрочитано 23.12.2024, 13:33
#4846
Кулик Алексей aka kpblc
Moderator

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


А нечего просто копировать код ) Скобку перед and Пушкин ставить будет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.12.2024, 13:45
#4847
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А нечего просто копировать код ) Скобку перед and Пушкин ставить будет?
Скобку Пушкин поставил, код #4845 исправил
(while
( and
......
теперь в ком. строке:
Enter room name: *Прервано*
Это красиво?
Ingpro вне форума  
 
Непрочитано 23.12.2024, 13:50
1 | #4848
Кулик Алексей aka kpblc
Moderator

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


Вот только не надо - ты зачем строку 16 закомментировал?

----- добавлено через ~3 мин. -----
Скопируй свой код в VLIDE и там проверяй, где какая конструкция начинается и заканчивается.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.12.2024, 13:54
1 | #4849
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Т.е. чисто визуальная красота и никакого сбоя программы?
не, ну если начать нажимать что попало, например esc посерёд программы, то это естественно вызовет аварийное завершение, которое сбоем назвать можно с натяжкой. а если обходится без предыдущего, то вполне себе да)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 23.12.2024, 14:06
#4850
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вот только не надо - ты зачем строку 16 закомментировал?
Да это не надо, AutoCad писал про лишнюю скобку, но сейчас нормально...
А *error* добавлять? Где про это почитать?..
Ingpro вне форума  
 
Непрочитано 23.12.2024, 14:41
1 | #4851
Кулик Алексей aka kpblc
Moderator

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


https://autolisp.ru/2009/09/13/error-catch/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.12.2024, 14:47
#4852
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
https://autolisp.ru/2009/09/13/error-catch/
Я там был, но...
"Что и где применять - в принципе, каждый решает сам..."
В каких конкретно функциях применять
Код:
[Выделить все]
 (defun *error* (msg)
      (princ (strcat "\n fun_func-2 error : " msg))
      (princ)
      ) ;_ end of defun
Вместо fun_func-2 нужно ставить что-то другое?
Ingpro вне форума  
 
Непрочитано 23.12.2024, 14:48
1 | #4853
Кулик Алексей aka kpblc
Moderator

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


Лично я предпочитаю *error* не трогать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.12.2024, 16:29
#4854
Ingpro


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


В данном случае можно применить такую комбинацию с *error*: ???
Код:
[Выделить все]
  (defun c:RoomLabel-err (/  *error* Roomname fc nc h v str p) 
(defun *error* (msg)
 (if (not
  (member msg '("Function cancelled" "quit / exit abort"))
  )
  (princ msg)
 )
)
  (while 
    (and 
      (setq Roomname (getstring t "\nEnter room name: "))
      (setq fc (getpoint "\nPick first corner"))
      (null (initget 32))
      (setq nc (getcorner fc "\nPick Next corner"))
    )
    (setq h (abs (- (car fc) (car nc)))
          v (abs (- (cadr fc) (cadr nc)))
    )
    (setq str (strcat (strcase Roomname) 
                      "\\P"
                      (rtos h 2 2)
                      " x "
                      (rtos v 2 2)
                                )
    )
    (setq p (mapcar (function (lambda (a b) (/ (+ a b) 2.))) fc nc))
    (entmakex 
      (list (cons 0 "MTEXT") 
            (cons 100 "AcDbEntity")
            (cons 100 "AcDbMText")
            (cons 10 (trans p 1 0))
            (cons 1 str)
            (cons 41 (- (car p) (car p)))
            (cons 71 5)
            (cons 72 5)
            (cons 73 1)
            (cons 7 (getvar 'TextStyle))
      )
    )
  )
  (princ)
)
в ком. строке после Esc:
Enter room name: *Прервано*
Функция отменена
Prettily?
Ingpro вне форума  
 
Непрочитано 25.12.2024, 18:49
#4855
Ingpro


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


Я хочу выбрать рамкой отдельные тексты и преобразовать в отдельные мтексты.
Express-команда TXT2MTX объединяет выбранные тексты в один мтекст.
Если просто набрать в комстроке TXT2MTX (или _.txt2mtx) это работает.
Код:
[Выделить все]
 (defun c:t2mt ( / ss i )
(vl-load-com)
		(setq ss (ssget '((0 . "TEXT"))) i -1)
		(while (< (setq i (1+ i)) (sslength ss))
		 (vl-cmdf "_.txt2mtx" (ssname ss i) "")
	)
		(princ)
)
Почему-то не узнается команда
Неизвестная команда "TXT2MTX".
<имя объекта: FF824700>
Как можно исправить, плз?
Ingpro вне форума  
 
Непрочитано 25.12.2024, 20:29
1 | #4856
Кулик Алексей aka kpblc
Moderator

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


Попробуй использовать handent
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.12.2024, 20:31
#4857
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Попробуй использовать handent
А это куда?
Ingpro вне форума  
 
Непрочитано 25.12.2024, 20:44
1 | #4858
Кулик Алексей aka kpblc
Moderator

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


(ssname ss i)
преобразуется в (handent (cdr(assoc 5 (entget (ssname ss i)))))
Как-то так примерно
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.12.2024, 21:13
#4859
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(ssname ss i)
преобразуется в (handent (cdr(assoc 5 (entget (ssname ss i)))))
Код:
[Выделить все]
 (defun c:t2mt ( / ss i )
(vl-load-com)
		(setq ss (ssget '((0 . "TEXT"))) i -1)
		(while (< (setq i (1+ i)) (sslength ss))
		 ;(vl-cmdf "_.txt2mtxt" (ssname ss i) "")
(vl-cmdf "_.txt2mtxt" (handent (cdr(assoc 5 (entget (ssname ss i))))) "")
	)
		(princ)
)
Неизвестная команда "TXT2MTX".
<имя объекта: FF824860>

Последний раз редактировалось Ingpro, 25.12.2024 в 23:14. Причина: txt2mtxt исправлено
Ingpro вне форума  
 
Непрочитано 25.12.2024, 21:15
#4860
Кулик Алексей aka kpblc
Moderator

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


Ты со скобками в строке 6 не ошибся?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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