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

Вернуться   Форум 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.
Просмотров: 1965754
 
Автор темы   Непрочитано 22.07.2008, 16:40
#61
Red Nova

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


Кулик Алексей aka kpblc, Ну ты хотя бы намеки давай какого типа функцию искать. Это же для меня планета Марс.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 16:47
#62
Shoorup


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


А почему у меня не получается такой код?
Код:
[Выделить все]
(cdr (assoc 41(entget (entsel))))
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 16:52
#63
Кулик Алексей aka kpblc
Moderator

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


Red Nova, см. (getcorner)
Shoorup, еще раз внимательно посмотри, что возвращает (entsel).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.07.2008, 16:52
#64
VVA

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


Red Nova,
Хорошо. Пока будем считать, что пользователь вводит нужные нам данные с клавиатуры.
В ответ на запрос
(setq width (getreal "Введите ширину колонны <Выход>: "))
пользователь может ввести:
1. Пустой ввод (клавиша Enter)
2. 0
3. Положительное число
4. Отрицательное число
Мы должны запретить вводить ему п. №№ 1;2;4. Т.е. только полижительные числа.
Подсказка: см. ф-цию initget
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.07.2008, 17:06
#65
Shoorup


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


Кулик Алексей aka kpblc, entsel выдает имя выбранного объекта и координаты точки которые я указал на этом объекте. Получается мне мешают эти координаты?
т.е мне нужно сделать так
Код:
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 17:10
#66
Shoorup


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


Получилось!!!
надо так:
Код:
[Выделить все]
(cdr (assoc 41(entget(car(entsel)))))
Теперь хочется внести изменения в однострочный текст в точечную пару. Как?
__________________
Поезд который устал от ржавого здравомыслия рельсов...

Последний раз редактировалось Shoorup, 22.07.2008 в 17:16.
Shoorup вне форума  
 
Автор темы   Непрочитано 22.07.2008, 17:16
#67
Red Nova

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


VVA, Из справки

Цитата:
initget
Establishes keywords for use by the next user-input function call
bits
A bit-coded integer that allows or disallows certain types of user input. The bits can be added together in any combination to form a value between 0 and 255. If no bits argument is supplied, zero (no conditions) is assumed. The bit values are as follows:
1 (bit 0) Prevents the user from responding to the request by entering only ENTER.
2 (bit 1) Prevents the user from responding to the request by entering zero.
4 (bit 2) Prevents the user from responding to the request by entering a negative value.
8 (bit 3) Allows the user to enter a point outside the current drawing limits. This condition applies to the next user-input function even if the AutoCAD system variable LIMCHECK is currently set.
Следовательно нам нужно значение 1+2+4=7
То есть где-то мы должны написать
Код:
Но где не пойму.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 17:43
#68
VVA

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


Red Nova, #67
1. Initget действует на 1 запрос get* (getint, getreal и т.п. в helpe есть табличка)
2. Вытекает из п.1 перед каждым getreal.
Запусти эти 2 строчки в VLIDE на выполнение и попробуй ввести что-нибудь недопустимое (кроме ESC)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 22.07.2008, 17:55
#69
Red Nova

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


VVA,
Тогда наверное лисп должен выглядеть так
Код:
[Выделить все]
(defun C:Колонна (/ width thickness)
  (setq width ((initget 7) (getreal "Введите ширину колонны <Выход>: ")))
  (setq thickness ((initget 7) (getreal "Введите толщину колонны <Выход>: ")))
Подозреваю что в вопросе скобок я могу ошибиться.

Цитата:
Запусти эти 2 строчки в VLIDE на выполнение и попробуй ввести что-нибудь недопустимое (кроме ESC)
Вот что получилось, наверное это хороший знак
Цитата:
Введите ширину колонны <Выход>: -100

Value must be positive and nonzero.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 17:58
#70
VVA

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


Так
Код:
[Выделить все]
(defun C:Колонна (/ width thickness)
  (initget 7)
  (setq width (getreal "Введите ширину колонны <Выход>: "))
  (initget 7)
  (setq thickness (getreal "Введите толщину колонны <Выход>: "))
  ;... Здесь будет продолжение
  )
Теперь у тебя есть команда Колонна, которая запрашивает размеры.
Дальше нужно запросить точку отрисовки и отрисовать колонну
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.07.2008, 18:04
1 | #71
ShaggyDoc

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


Молодец, Red Nova. Вопросы всё более разумные.

Совет: Сделай VLIDE своим постоянным инструментом. Может быть даже кнопочкой.

Создай в редакторе пустой файл и вставляй в него фрагменты кода. Сохрани файл в папочку, созданную в "подходящем месте" под именем, например, "эксперименты.lsp". В дальнейшем все свои Лиспы сохраняй во всякие подпапки этой папки.

Выделенные фрагменты кода из "экспериментов" отправляй на выполнение в AutoCAD кнопочкой "загрузить выделенный фрагмент". В окно "Консоль" будут возвращаться результаты. Их можно выделить и скопировать в окно программы и спрятать за комментариями. Чтоб наглядно видеть результат.

Для начала можно и код более наглядно писать. Например, вводить переменные:

Так пишет профи:

Код:
[Выделить все]
 
(cdr (assoc 41(entget(car(entsel)))))
А можно:

Код:
[Выделить все]
 
(if (setq результат_выбора (entsel "Выбери примитив:"))
(progn
(setq имя_примитива (car результат_выбора))
(print имя_примитива)
(setq данные_примитива (entget имя_примитива))
(print данные_примитива)
;;; И так далее
)
)
Потом, когда появится внутреннее понимание, такой код нужно оптимизировать - убрать все лишнее.

Успехов!
ShaggyDoc вне форума  
 
Непрочитано 22.07.2008, 18:08
#72
Shoorup


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
...Так пишет профи:

Код:
[Выделить все]
 
(cdr (assoc 41(entget(car(entsel)))))
Да ну брось ты я еще только начинаю
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Автор темы   Непрочитано 22.07.2008, 19:38
#73
Red Nova

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


VVA,
Думаю как-то так
Код:
[Выделить все]
(defun C:Колонна (/ width thickness base)
  (initget 7)
  (setq width (getreal "Введите ширину колонны <Выход>: "))
  (initget 7)
  (setq thickness (getreal "Введите толщину колонны <Выход>: "))
(setq base (getpoint "Введите точку вставки колонны <Выход>: ")) 
  ;продолжение
)
Далее надо начать строить полилинию вокруг этой точки, пока этого я не могу, пороюсь в лиспах...

ShaggyDoc,
Постараюсь работать с VLIDE, хотя пока совсем не понял что там к чему.
Цитата:
Так пишет профи:


Код:

(cdr (assoc 41(entget(car(entsel)))))
А можно:


Код:

(if (setq результат_выбора (entsel "Выбери примитив:"))
(progn
(setq имя_примитива (car результат_выбора))
(print имя_примитива)
(setq данные_примитива (entget имя_примитива))
(print данные_примитива)
;;; И так далее
)
)
Потом, когда появится внутреннее понимание, такой код нужно оптимизировать - убрать все лишнее.
Пока не понимаю не того не другого (правда хелп не смотрел). Но надеюсь это вопрос времени.
__________________
Блог

Последний раз редактировалось Red Nova, 22.07.2008 в 20:26.
Red Nova вне форума  
 
Непрочитано 22.07.2008, 20:44
#74
ShaggyDoc

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


А вообще-то надо начинать не с кодирования, а с постановки задачи. То есть с составления "плана". Его можно сразу писать в иде комментариев, а потом постепенно реализовывать. Грамотная постановка - половина дела.

Например, для колонны сразу надо решать:

1. Одна ли это колонна, или целый ряд (одна как частный случай)? Как потом одну размножать, если ряд под каким-то углом?

2. Что это за точка вставки по отношению к самой колонне? Центр? Но центр не всегда известен, может быть и колонна с нулевой привязкой к оси. Тогда центр придется как-то еще вычислять.

3. Что это за "ширина" и "толщина"? У колонны есть два размера, но их надо как-то правильно назвать. Например "размер вдоль ряда", "размер поперек ряда".

и т.д.

Пиши сначала постановку, пусть примитивно. Например:
Код:
[Выделить все]
 
 
;; 1. Запрос продольного размера с возможностью выхода
;; 2. Если размер введен, запрос второго размера без возможности прерывания, иначе выход из программы.
;; 3. В цикле, до пустого ввода, запрос точки центра колонны
 
;; если точка указана, переход к 4, иначе выход из программы.
 
;; 4. Запрос направления ряда в виде запроса точки с привязкой от заданной центральной точки
 
;; 5. рисование одной колонны
И т.д. В том числе с возможностью задать количество колонн и пролет.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 22.07.2008, 21:01
#75
Red Nova

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


ShaggyDoc,
Ну этому тоже надо еще поучиться.
Получается три из пяти пунктов уже реализованы.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 21:11
#76
Shoorup


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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Пока не понимаю не того не другого (правда хелп не смотрел). Но надеюсь это вопрос времени.
Цитата:
(cdr (assoc 41(entget(car(entsel)))))
Да тут особо понимать то нечего... готовый код гораздо проще разобрать что и зачем нежели самому написать... во всяком случае мне...
Ну попробую обьяснить что называется "от чайника чайнику"
1. Нужна книга Полещука которая упоминалась выше. Там по каждой функции мало того что можно почитать но и увидеть вполне толковый пример.
2. Лично я разбираю с внутренних функций, т.е. то что будет выполняться первым.
А первым будет выполняться (entsel). Как я писал выше этим мы получим уникальное имя и координаты туда где ткнули при выборе текста.
Для профилактики вводи в комстроке по функционально и смотри что возвращает функция.
(entget(car(entsel)))
тут entget выведет нам все "свойства" выбранного объекта, но в качестве аргумента ему нужно имя выбранного объекта. А так как у нас (entsel) дает по мимо имени еще и координаты (которые мешают - слишком много аргументов)то их можно "отсечь" вот так: (car(entsel)) - тоже попробуй ввести с carи без и посмотри что возвращается.
assoc 41эта функция вытянет нам необходимое свойство в виде точечной пары - в данном случае коэффициент сжатия.
(assoc 41(entget(car(entsel)))) - вводишь это и тебе вернется (41 . 0.8) например - это точечная пара, про точечные пары читай Полещука там все очень понятно.
Ну а так как нам нужно лишь получить коэфициент сжатия то нужно "отсечь" то что впереди. Делаем это с помощью cdr в итоге получим 0.8
Вот и всё! проще некуда Но лично я "досямкал" только с подачи Алексея так что по сути я разобрался только в том что мне написали
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 21:43
#77
Shoorup


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Из вредности:
Код:
[Выделить все]
(defun c:summtext (/ ent1 ent2 res)
  (if (and (setq ent1 (car (entsel "\nУкажи первый однострочник : ")))
           (setq ent2 (car (entsel "\nУкажи второй однострочник : ")))
           ) ;_ end of and
    (progn
      (setq res (+ (atof (cdr (assoc 1 (entget ent1))))
                   (atof (cdr (assoc 1 (entget ent2))))
                   ) ;_ end of +
            ) ;_ end of setq
      (princ (rtos res 2 4))
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
Алексей, все понятно кроме одной строчки: (princ (rtos res 2 4))
Поясни пожалуйста чайнику
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 22:28
#78
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


rtos - конвертирует число в строку
res - число
2 - режим ("десятичный")
4 - точность (число знаков после запятой)
Donhuan вне форума  
 
Непрочитано 22.07.2008, 22:45
#79
Кулик Алексей aka kpblc
Moderator

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


В дополнение к #74: раскрою "секрет", как я пишу свои лиспы. Сначала defun и придуманное имя функции. Потом в комментарии прописываю, что функция делает, какие параметры принимает, что возвращает. А там уже и код можно делать. В любой момент возвращаюсь в начало файла и смотрю - а то ли я делаю?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.07.2008, 23:07
#80
Shoorup


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


Кулик Алексей aka kpblc, ShaggyDoc, VVA, а пользуетесь ли вы блок схемами при написании программ на лиспе?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
Ответ
Вернуться   Форум 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