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

Вернуться   Форум 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.
Просмотров: 2048936
 
Непрочитано 04.08.2016, 20:00
#2961
frostmourn


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


Пока разбирался тут с ssget-ом, заметил, что фактические цвета рамки выбора (переменные windowareacolor и crossingareacolor) не соответствуют таковым в окне выбора цвета, видимо, из-за прозрачности. После экспериментов со сменой цвета и проверкой в паинте выяснилось, что величины RGB компонент меньше примерно в 4 раза. Но если пробовать вычислять цвет так, то на некоторых значениях отличается на несколько единиц, а хочется, конечно, точно. Так вот, как определить "настоящий" цвет заливки?
frostmourn вне форума  
 
Непрочитано 07.08.2016, 14:12
#2962
ZloyEjik

Алюминиевые фасадные системы (Инженер-Конструктор)
 
Регистрация: 29.07.2009
Санкт-Петербург
Сообщений: 2
<phrase 1=


Есть имя переменной взятое из файла (пр. "SAPsto")
Есть значение переменной взятое из файла (пр. "KRF-107")
Вопрос:
Как в LISP составить команду (setq SAPsto "KRF-107") ?
Имя переменной получается из файла и может меняться.
Попробовал (atoi "(setq SAPsto "KRF-107")") - не получилось.

Или другой вариант той же проблемы:
Есть цикл, в нем N = N+1
В первом повторении цикла должны получить (setq testN 1), где testN = test1
Во втором (setq testN 1), где testN = test2

Последний раз редактировалось ZloyEjik, 07.08.2016 в 14:24.
ZloyEjik вне форума  
 
Непрочитано 07.08.2016, 15:36
1 | #2963
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от ZloyEjik Посмотреть сообщение
Есть имя переменной взятое из файла (пр. "SAPsto")
Есть значение переменной взятое из файла (пр. "KRF-107")
Вопрос:
Как в LISP составить команду (setq SAPsto "KRF-107") ?
Имя переменной получается из файла и может меняться.
Попробовал (atoi "(setq SAPsto "KRF-107")") - не получилось.

Или другой вариант той же проблемы:
Есть цикл, в нем N = N+1
В первом повторении цикла должны получить (setq testN 1), где testN = test1
Во втором (setq testN 1), где testN = test2
С циклом - на верном пути, в принципе: открываете файл, считываете в цикле оттуда построчно значения и присваиваете их testN.
Сергей812 вне форума  
 
Непрочитано 07.08.2016, 16:02
#2964
ZloyEjik

Алюминиевые фасадные системы (Инженер-Конструктор)
 
Регистрация: 29.07.2009
Санкт-Петербург
Сообщений: 2
<phrase 1=


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
С циклом - на верном пути, в принципе: открываете файл, считываете в цикле оттуда построчно значения и присваиваете их testN.
Тут вопрос по поводу возможности изменения переменной. Возможно ли записать кучу переменных через цикл.
(setq test1 "1")
(setq test2 "1")
(setq test3 "1")
(setq test4 "1")
...
(setq testN "1")
Другими словами, чтобы имя переменной тоже было переменно

Другими способами я уже решил задачу. (1ая через cond):
(while (setq stroka (read-line sett))
(cond
( (wcmatch stroka "*SAPsto*") (setq SAPsto (substr stroka 1 (vl-string-position (ascii ";") stroka)))) ; Стойка
( (wcmatch stroka "*SAPrigF*") (setq SAPrigF (substr stroka 1 (vl-string-position (ascii ";") stroka)))) ; Ригель с фрезеровкой
....
))
(2ую можно записывать не одну переменную а добавлять в один список (list) все переменные, а потом считывать)

Но интересно, можно ли решить задачу через изменение имени переменной.
ZloyEjik вне форума  
 
Непрочитано 07.08.2016, 16:32
1 | #2965
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


не усложняйте себе задачу, потом при попытке что-то изменить сами запутаетесь) автоматизировать надо то-что невозможно или затруднено сделать стандартными средствами программы. Со списком правильная мысль, в "нормальных" ЯП были бы массивы.
Сергей812 вне форума  
 
Непрочитано 08.08.2016, 18:27
#2966
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от ZloyEjik Посмотреть сообщение
Есть имя переменной взятое из файла (пр. "SAPsto")
Есть значение переменной взятое из файла (пр. "KRF-107")
Вопрос:
Как в LISP составить команду (setq SAPsto "KRF-107") ?
Имя переменной получается из файла и может меняться.
Ассоциативный список?
Примеры функций
DwgRuLispLib: Две функции работы со списками
_dwgru-assoc и _dwgru-assoc-multi
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 11.08.2016, 16:40 setq
#2967
trushev


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


Часто возникает необходимость функцией setq присвоить значения нескольким переменным.
Какие преимущества/недостатки вариантов решения этой задачи?
(setq a 1)
(setq b 2)
...
(setq z N)
Или
(setq a 1
b 2
...
z N
);setq
trushev вне форума  
 
Непрочитано 11.08.2016, 16:49
#2968
Кулик Алексей aka kpblc
Moderator

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


Второй вариант обычно быстрее. И читается, как правило, проще.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.08.2016, 18:42
#2969
gomer

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


Цитата:
Сообщение от trushev Посмотреть сообщение
Какие преимущества/недостатки вариантов решения этой задачи?
Самый распространенный недостаток - трудность переделки кода, ты не можешь просто так скопировать/перенести определение в другое место, только в такой же блок определений
gomer вне форума  
 
Непрочитано 13.08.2016, 18:48
#2970
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


ну и комментарии писать проще - за что какая переменная отвечает. Комментарии писать очень желательно, если в дальнейшем планируется модернизация программы или использования кода из нее в других программах.
Сергей812 вне форума  
 
Непрочитано 14.08.2016, 18:49
#2971
Кулик Алексей aka kpblc
Moderator

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


Уууу, робяты, ну вы и тему подняли

Копирастинг кода - зло. Если какая-то последовательность действий выполняется больше чем 1 раз, стоит рассмотреть необходимость ее выноса в отдельную функцию. Например, функция создания слоя с различными параметрами, или функция вставки блока / ссылки, или функция открытия стороннего файла dwg, или функция сохранения лога, или... Короче, общий принцип понятен.
При таком подходе не надо комментировать код внутри функции, достаточно дать ее внятное описание, рассказать, какой параметр за что отвечает и теде. Функция (что бы она ни делала) работает так, как написано, и возвращает строго определенные типы результатов.

Постарайтесь все же найти "САПР на базе AutoCAD - как это делается" - там много интересного.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.08.2016, 19:04
#2972
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Алексей, к сожалению IDE Lisp и того же VBA уже настолько отстал от других сред разработки, что без копипастинга трудновато обойтись)
Сергей812 вне форума  
 
Непрочитано 14.08.2016, 19:08
#2973
Кулик Алексей aka kpblc
Moderator

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


Кому как, кому как ))) У меня сейчас больше 700 функций, копипастингом не занимаюсь принципиально. Вопрос в организации работы, я думаю. Ну, все, пофлудил - и будя
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.08.2016, 10:43
#2974
trushev


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


Имеется функция:
Код:
[Выделить все]
(defun test (sp_peremen  ; список имен переменных
             sp_klpoley  ; список ключей полей диалогового окна
                         ;(количество и последовательность элементов списка sp_klpoley соответствуют списку sp_peremen)
             /
             sp_rezultat ;список результатов расчета
            )
             ;
             ;Присвоение значений переменным
             ;
            (foreach k sp_peremen
                     (set k (get_tile (car sp_klpoley)))
                     (setq sp_klpoley (cdr sp_klpoley))
            );foreach sp_peremen
             ;
             ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
             ;
             ;Выполнение вычислений с записью результатов в sp_rezultat
             ;
             ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
             ;
             ;Обнуление используемых переменных
             ;
            (foreach k sp_peremen  ; список имен переменных
                     (set k 'nil)
            );foreach k
             ;
             ;На выходе список результатов расчета
             ;
            sp_rezultat
);defun test
Как объявить локальными переменные из списка sp_peremen?

PS Вышел из отпуска, благодарю за отклики по "setq".
trushev вне форума  
 
Непрочитано 31.08.2016, 16:53
#2975
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от trushev Посмотреть сообщение
Как объявить локальными переменные из списка sp_peremen?
Может, я не совсем правильно понял, но (даже не вникая в суть кода) разве это переменная? Все, что до знака "/" - это аргументы функции, а sp_peremen, стало быть - один из них, представленный списком. И этот аргумент может стать переменной в функции более высокого уровня, и тогда его нужно локализовать в ней, но уже после "/". При этом, по-моему, придется локализовать и все остальные переменные, которые этот список будет в себя включать. Могу ошибаться, но, кажется, нельзя локализовать все переменные, локализовав одну, содержащую в себе их в виде списка.
skkkk вне форума  
 
Непрочитано 01.09.2016, 09:36
#2976
trushev


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Может, я не совсем правильно понял
Постараюсь дать более подробные пояснения.
В коде выполнена попытка унифицировать считывание данных с различных диалоговых окон. Не знаю на сколько эта идея бредовая.
sp_peremen аргумент функции test является списком произвольного числа произвольных имен переменных и может иметь вид:
(list 'ed1 'ed2 'tg1) или
(list 'ed5 'ed6 'ed7 'ls1 'tg4 'tg8) или нечто иное.
sp_klpoley аргумент функции test является списком ключей полей диалогового окна. Количество элементов списка и их последовательность
должны соответствовать списку sp_peremen. sp_klpoley может иметь вид:
(list "ed1" "ed2" "tg1") или
(list "ed5" "ed6" "ed7" "ls1" "tg4" "tg8") или нечто иное.
В цикле с использованием функции "set" (не setq) выполняется присвоение переменным значений.

Цитата:
Сообщение от skkkk Посмотреть сообщение
И этот аргумент может стать переменной в функции более высокого уровня, и тогда его нужно локализовать в ней
Агументы {все между "(" и "/"} и рабочие переменные {все между "/" и ")"} пользовательской функции объединяются в локальные переменные и дополнительной локализации не требуют.
Ничего не нашел по локализации вложенной функции. Скорее всего ее имя должно фигурировать в перечне локальных переменных основной функции. Но подтверждение этому не нашел.


Цитата:
Сообщение от skkkk Посмотреть сообщение
кажется, нельзя локализовать все переменные, локализовав одну, содержащую в себе их в виде списка
Мне тоже так кажется.
Значит без принудительного обнуления переменных из списка не обойтись. Либо искать другие варианты решения задачи.
trushev вне форума  
 
Непрочитано 01.09.2016, 13:52
#2977
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от trushev Посмотреть сообщение
Ничего не нашел по локализации вложенной функции. Скорее всего ее имя должно фигурировать в перечне локальных переменных основной функции.
Так и есть. Это легко проверить, например, загрузив в Автокад лисп, в котором будет локализованная и нелокализованная функция, выполнить его и в командной строке после восклицательного знака вбить имя сначала одной, затем другой. Локализованная вернет nil.

Цитата:
Сообщение от trushev Посмотреть сообщение
Значит без принудительного обнуления переменных из списка не обойтись.
А чем смущает такой подход? Причем, я бы даже добавил это в локальный *error* и вызывал бы его в конце выполнения кода.
skkkk вне форума  
 
Непрочитано 01.09.2016, 14:28
#2978
trushev


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
А чем смущает такой подход?
Существует вероятность, хотя и малая, совпадения имен с ранее введенной глобальной переменной.

----- добавлено через ~18 ч. -----
skkkk, спасибо за уделенное время. Приятно было пообщаться.
trushev вне форума  
 
Непрочитано 05.09.2016, 17:03
#2979
George_D


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


Добрый день, подскажите , пожалуйста, есть ли возможность с помощью Lisp преобразовать объект в блок и программно добавить к полученному блоку атрибут? Пытаюсь выполнить следующие преобразования: пользователь выбирает полилинию-полилиния преобразуется в блок-атрибут блока пользователь выбирает с помощью выпадающего DCl списка-итог, блок состоящий из полилинии с невидимым атрибутом в нем.
George_D вне форума  
 
Непрочитано 05.09.2016, 17:34
#2980
Кулик Алексей aka kpblc
Moderator

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


_.attsync или его альтернативы (написанные самостоятельно)
__________________
Моя библиотека 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