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

Вернуться   Форум 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.
Просмотров: 1965832
 
Непрочитано 29.07.2008, 11:33
#201
andery


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


Цитата:
disable_osmode - Функция отключения режима(ов) объектной привязки
enable_osmode - Функция включения режима(ов) объектной привязки
Код:
[Выделить все]
(defun disable_osmode ()
(setvar "osmode" (+ (getvar "osmode") 16384))
)
(defun enable_osmode ()
(setvar "osmode" (- (getvar "osmode") 16384))
)
Проверил с командной строки - прошло.
andery вне форума  
 
Непрочитано 29.07.2008, 11:35
#202
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от andery Посмотреть сообщение
Переформулирую вопрос:
В нашей функции "колонна" ,если мы выставляем osnapcoord=1, в каком случае мы наступим на грабли? (в каком случае точка может "убежать")
Скорее всего, ни в каком (не проверял), но... есть ещё момент - при написании любых программ, одним из важнейших правил является минимизация вемешательства в среду исполнения, т.е. по окончании работы нашей программы, то место, где она работала (в случае АвтоЛИСПов, это Автокад) должно функционировать ровно так же, как и до запуска. В принципе, манипуляция с переменными osmode и osnapcoord вполне сопоставима - в любом случае менять их надо только на момент программного рисования и сразу по его окончании восстанавливать в первоначальное состояние, но опять же есть нюанс - традиционно для таких манипуляций используется именно osmode, в том числе потому, что управлять привязками умеет любой пользователь, а вот о osnapcoord и её действии большинство пользователей даже и не подозревает. Соответственно, если чтото пойдёт наперекосяк, а рано или поздно таки случится чтото такое, от чего не спасут самые изощрённые меры предосторожности, то пользователю гораздо проще восстановить привязки, чем управление приоритетом ввода.
Alaspher вне форума  
 
Непрочитано 29.07.2008, 11:48
#203
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от andery Посмотреть сообщение
Проверил с командной строки - прошло.
А если привязка уже отключена/включена юзером?
Alaspher вне форума  
 
Непрочитано 29.07.2008, 11:57
#204
ShaggyDoc

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


Цитата:
Можно обнулить перед вызовом _PLINE
Я бы сказал так: Нужно обнулять перед любой командой рисования, в которой отсутствует интерактив наподобие pause. И восстанавливать перед любым интерактивным действием. То есть, когда пользователь может указать точку интерактивно, он должен иметь возможность воспользоваться своим любимим набором объектных привязок. И не только при указании точки, но и в других get-функциях, потому что там также можно вводить, например, число указанием точек.

А до некомандных методов обучение еще дойдет. Там и с *error* решать иначе нужно.
ShaggyDoc вне форума  
 
Непрочитано 29.07.2008, 12:03
#205
VVA

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


andery, #201 Незачтено. Причина: читай #203
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 29.07.2008, 12:10
#206
Red Nova

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


VVA,
Цитата:
У меня еще задание. Все знают, что привязку (OSMODE) можно ОТКЛЮЧАТЬ, т.е. сохраняется перечень установленных режимов, а потом ВКЛЮЧАТЬ.
Задание для самостоятельной работы: Написать функции
disable_osmode - Функция отключения режима(ов) объектной привязки
enable_osmode - Функция включения режима(ов) объектной привязки
Это можно
Код:
[Выделить все]
(defun C:disable_osmode (/ oldOSM)
 (setq oldOSM (getvar "osmode"))
 (setvar "osmode" (+ oldOSM 16384))
)
Код:
[Выделить все]
(defun C: enable_osmode (/ oldOSM)
 (setq oldOSM (getvar "osmode"))
 (setvar "osmode" (- oldOSM 16384))
)
Было бы интересно совместить эти две функции. Алгоритм я представляю, но руки пока кривые.
Нужно функцией IF создать две ветки программы. Проверяется значение osmode, если оно меньше 16384, то выполняется первая функция, иначе вторая. Но вот как проверить это условие?

Цитата:
msg - это тоже переменная, только она расположена перед слэшем, значит это АГРУМЕНТ функции. Почитай Команда или функция?, defun, и 1.4 Соглашения по обозначениям
А вот этого понять не могу, хотя ссылки смотрел. Вижу, что msg позволяет вывести сообщение на экран, но что такое аргумент, и чем он отличен от функции не понимаю.

andery,
Главный смысл научится это все делать, лично мне тоже здесь не нужно возится с Osmode, но знать надо. Кто знает какая переменная в будущем может помешать.
__________________
Блог

Последний раз редактировалось Red Nova, 29.07.2008 в 12:30.
Red Nova вне форума  
 
Непрочитано 29.07.2008, 12:24
#207
VVA

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


Red Nova, #206 Незачет
1. Я просил фукции, а не команды
2. Уж если и команда, то enable_osmode определена неправильно.
3.
Цитата:
Проверяется значение osmode, если оно меньше 16384, то выполняется первая функция, иначе вторая
Нет. В самой ф-ции проверяется значение OSMODE и если оно устраивает, то выполняются ее действия или не выполняются.
Цитата:
msg - это тоже переменная, только она расположена перед слэшем, значит это АГРУМЕНТ функции
А вот этого понять не могу, хотя ссылки смотрел
В метро есть турникет, чтобы через него пройти нужно бросить жетон.
Так вот жетон - это АРГУМЕНТ функции ТУРНИКЕТ. Т.е. АРГУМЕНТ - ОБЯЗАТЕЛЬНО ПЕРЕДАВАЕМЫЙ ПАРАМЕТР функции.
(турникет жетон) - вошли в метро
(турникет) - ошибка, мало передано параметров
(турникет жетон сумка) -ошибка, много передано параметров. Нужен только жетон
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.07.2008, 12:26
#208
andery


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


Red Nova,
У Вас при вызове этих функций привязка включиться и выключится внутри функции а результат фунции будет такойже как и до ее вызова.
И действительно надо проверить на включение привязку.
andery вне форума  
 
Автор темы   Непрочитано 29.07.2008, 12:34
#209
Red Nova

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


VVA,
Цитата:
Уж если и команда, то enable_osmode определена неправильно.
Поправил кое что
Цитата:
Я просил функции, а не команды
А разве мы до сих пор писали функции? Вроде как только команды писали. А функции писать я не умею. (Или умею?)
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 29.07.2008, 12:35
#210
Red Nova

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


andery,
Цитата:
результат фунции будет такойже как и до ее вызова.
Как раз заметил.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.07.2008, 12:40
#211
VVA

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


Цитата:
А разве мы до сих пор писали функции? Вроде как только команды писали. А функции писать я не умею. (Или умею?)
Я в #196 просил тебя почитать Команда или фукция?. Прочти и ответь на свой вопрос сам.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.07.2008, 13:25
#212
andery


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


Щас напишем..........
andery вне форума  
 
Непрочитано 29.07.2008, 13:30
#213
VVA

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


andery, Это условие (= (getvar "osmode") (- (getvar "osmode") 16384)) ВСЕГДА будет ложь (nil). Поэтому рисать if не имеет смысла.
Этот вариант будет всегда делать то же, что и твой
Код:
[Выделить все]
(defun c:disable_osmode ()
"Привязка уже выключена"
)
PS
1. Если хочешь напечатать в командную строчку - используй ф-цию princ
2. Господа, я просил ФУНКЦИЮ, а не КОМАНДУ
PPS
Напишите мне словами алгоритм работы функции disable_osmode.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.07.2008, 14:02
#214
andery


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


VVA,
Так я сразу удалил
Вот окончательный вариант:
Код:
[Выделить все]
(defun c:disable_osmode ()
(if (<= (- (getvar "osmode") 1684) 0)
  (setvar "osmode" (+ (getvar "osmode") 16384))
  "Привязка уже выключена"
)
)
  
(defun c:enable_osmode ()
(if (> (- (getvar "osmode") 1684) 0)
  (setvar "osmode" (- (getvar "osmode") 16384))
  "Привязка уже включена"
)
)
andery вне форума  
 
Непрочитано 29.07.2008, 14:46
#215
VVA

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


andery, Это уже кое-что
Только нужно учесть PS №1 и 2 из #213
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.07.2008, 14:51
#216
andery


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


Вроде так тогда:
Код:
[Выделить все]
(defun disable_osmode ()
(if (<= (- (getvar "osmode") 1684) 0)
  (setvar "osmode" (+ (getvar "osmode") 16384))
  (prompt "Привязка уже выключена")
)
)
(defun enable_osmode ()
(if (> (- (getvar "osmode") 1684) 0)
  (setvar "osmode" (- (getvar "osmode") 16384))
  (prompt "Привязка уже включена")
)
)
тока с princ чтот не могу разобраться....
код поправил решивши использовать prompt

Последний раз редактировалось andery, 29.07.2008 в 15:07.
andery вне форума  
 
Автор темы   Непрочитано 29.07.2008, 14:53
#217
Red Nova

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


VVA,
Можно попробовать и без переменных.
Код:
[Выделить все]
(defun disable_osmode ()
    (if (< (getvar "osmode") 16384) 
      (setvar "osmode" (+ getvar "osmode" 16384)) 
    )
)
(defun enable_osmode ()
    (if (> (getvar "osmode") 16383) 
      (setvar "osmode" (- getvar "osmode" 16384)) 
    )
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.07.2008, 15:00
#218
Кулик Алексей aka kpblc
Moderator

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


Ага. А теперь еще сюда же добавить clayer, celtscale, celtype и до кучи еще пару-тройку переменных. И подумать, как нарисовать код покороче.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.07.2008, 15:05
#219
Red Nova

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


Кулик Алексей aka kpblc, Расшифруй.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.07.2008, 15:05
#220
VVA

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


Red Nova, Синтаксис Пушкин должен соблюдать?
Если внимательно посмотреть на коды режимов объектной привязки, то можно заметить, что там идет степень двойки. Т.е. устанавливается в 0 или 1 соответвующий бит. Тогда ф-ции можно записать так
Код:
[Выделить все]
(defun disable_osmode ()
  (setvar "osmode" (logior (getvar "OSMODE") 16384)))
(defun enable_osmode ()
  (setvar "osmode"(boole 2 (getvar "OSMODE") 16384)))
Но это так, лирическое отступление
__________________
Как использовать код на Лиспе читаем здесь
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