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

Вернуться   Форум 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.
Просмотров: 1965708
 
Непрочитано 25.07.2008, 10:54
#141
Кулик Алексей aka kpblc
Moderator

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


Н.Н.Полещук - любая книга по AutoLISP и VisualLISP.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.07.2008, 11:07
#142
Red Nova

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


VVA
Проверку не прошел. Загрузил такой лисп
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base R object)
(initget 7)
(setq dimensionX (getreal "Введите ширину колонны: "))
(initget 7)
(setq dimensionY (getreal "Введите толщину колонны: "))
(setq base 
    (cond
         (getpoint "\Введите точку вставки колонны <0,0,0> :")
         (t '(0. 0. 0.)))
     ) 
(setq pt1
     ( list ( - ( car base ) ( / dimensionX  2.0 ) )
            ( - (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(setq pt2
     ( list ( - ( car base ) ( / dimensionX  2.0 ) )
            ( + (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(setq pt3
     ( list ( + ( car base ) ( / dimensionX  2.0 ) )
            ( + (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(setq pt4
     ( list ( + ( car base ) ( / dimensionX  2.0 ) )
            ( - (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(Setq  R  ( / dimensionX  2.0 ))
(command "_pline" pt1 pt2 pt3 pt4 "_c")
(Setq object (entlast))
(command "_circle" R)
(command "_rotate" object "" base pause)
;продолжение
)
Результат
Цитата:
Command: КОЛОННА
Введите ширину колонны: 200
Введите толщину колонны: 200
; error: bad argument type: consp "Введите точку вставки колонны <0,0,0> :"

Command:
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 25.07.2008, 11:10
#143
Red Nova

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


Кулик Алексей aka kpblc,
Ты про
Цитата:
САПР на базе AutoCAD - как это делается
?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 11:17
#144
Кулик Алексей aka kpblc
Moderator

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


Нет, я про Visual LISP и секреты адаптации AutoCAD и AutoLISP и Visual LISP в среде AutoCAD (+ CD-ROM)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2008, 11:23
#145
VVA

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
P.S. А есть перечень команд аутолисп с пояснением на русском. Я хоть с инглишем в ладах, но все же хелп лучше иметь не русском.
А #51 я для кого выкладывал?
2-я ссылка сверху. Скачать все. Оттуда можно попасть сюда:
entlast в главе 5
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.07.2008, 11:33
#146
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


>> Red Nova
А скобки кто проверять будет? У тебя же в COND два условия используются, так почему второе в скобках, а первое без?
Код:
[Выделить все]
(setq base 
    (cond
         ((getpoint "\Введите точку вставки колонны <0,0,0> :"))
         (t '(0. 0. 0.))
    )
)
И сразу учись правильно расставлять скобки: если "(" и соответствующая ей ")" расположены на разных строках, то должны быть строго друг под другом - самому же потом легче разбираться будет.

>> VVA
Все ждал когда ученики сообразят с выделением колонны, наверное уже можно отвечать?
Пока нашел только три способа: командой создать именованный набор, использовать ssget с несколькими фильтрами, запомнить имя функцией entlast.
Entlast'ом проще и надежнее, но с ssget'ом тоже интересно повозиться.
Получилось такое: (ssget "W" (list (- x1 1) (- y1 1)) (list (+ x3 1) (+ y3 1)) '((0 . "lwpolyline")))
но это только для данного случая и предварительно отключив привязки.

PS: самому иногда интересно решить поставленные задачи, можно узнать что-нибудь новое.

Последний раз редактировалось Олег К., 25.07.2008 в 12:01.
Олег К. вне форума  
 
Автор темы   Непрочитано 25.07.2008, 11:33
#147
Red Nova

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


VVA,
Проглядел.
От туда
Цитата:
5. 3. 2.(entlast)

Эта функция возвращает имя последнего неудаленного главного примитива в базе данных. Эта функция часто применяется , чтобы дать имя новому примитиву, который только что был прибавлен через функцию COMMAND. Примитив не нужно выводить на экран, и также не нужно выбирать уровень.
Но я все равно не понемаю что я делаю не так.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 11:42
#148
VVA

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


Цитата:
Проверку не прошел. Загрузил такой лисп
На лиспе из #142 будем учиться искать ошибки.
Делаем следующее
  1. Набираем в командной строке VLIDE. (Открывается Visual LISP редактор)
  2. File->New File (открывается новый файл). В него копируем код из #142
  3. Если он сохранен как lsp файл, то File->Open
  4. Меню Debug (Отладка)->Stop once (Останов) Должна остаться птичка
  5. Дальше Tools (Сервис) -> Load text in editor (Загрузить текст в редактор) (или Ctrl+Alt+E)
  6. Возвращаемся в Автокад. Набираем в командной строке Колонна
  7. После этого автоматом вернемся в Visual LISP редактор. Текст будет подсвечен синим.
  8. После этого открываем окно контрольных значений (там можно смотреть состояние переменных) Меню View (Вид)->Watch window (Окно контрольных значений) или Ctrl+Shift+W. Должно открыться окно Watch с значением *LAST-VALUE* В нем будут отражаться последние вычисленные значения
  9. Меню Debug (Отладка)->Step into (Шаг с заходом) или F8
  10. Пошагово выполняя код ищем ошибку и исправляем ее.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 26.07.2008 в 22:17.
VVA вне форума  
 
Непрочитано 25.07.2008, 11:47
#149
VVA

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


Red Nova, Там же открываешь Главу 4 и смотришь как правильно писать cond
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.07.2008, 13:48
#150
ShaggyDoc

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


В процесс обучения не вмешиваюсь, но
Цитата:
Пока нашел только три способа: командой создать именованный набор, использовать ssget с несколькими фильтрами, запомнить имя функцией entlast.
Entlast'ом проще и надежнее, но с ssget'ом тоже интересно повозиться.
Получилось такое: (ssget "W" (list (- x1 1) (- y1 1)) (list (+ x3 1) (+ y3 1)) '((0 . "lwpolyline")))
но это только для данного случая и предварительно отключив привязки.
Когда все рисование нескольких примитивов выполняется твоей программой, то самое надежное - до рисования создать пустой набор, а потом, при каждом добавлении примитива, добавлять в него последний через (entlast).

При неконтролируемом рисовании можно до него запомнить последний примитив в переменной через (entlast) а потом использовать функцию наподобие

Код:
[Выделить все]
 
(defun ru-ss-select-after-ent (ent_name / selection)
  (setq selection (ssadd))
  (while (and ent_name (setq ent_name (entnext ent_name)))
    (ssadd ent_name selection)
  ) ;_ end of while
  (if (zerop (sslength selection))
    nil
    selection
  ) 
)
Например где-то в программе:

Код:
[Выделить все]
 
(setq ent (entlast))
;;;Что-то долго рисуем
(setq ss (ru-ss-select-after-ent ent))
;;; теперь что-то делаем с этим набором
Использование выбора рамкой ненадежно. Тут глюк в том, что все, входящее в рамку, должно быть видимым. Да и отсеивать всякую нечисть надо. Там ведь может и всяких левых lwpolyline полно оказаться.
ShaggyDoc вне форума  
 
Непрочитано 25.07.2008, 15:28
#151
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


ShaggyDoc, не скромничайте, Ваши замечания всегда полезны начинающим (и не только).
Кажется, я малость ошибся, в первом случае имелись в виду группы (command "group"), постоянно путаю их с наборами (ssget). Нечто вот такое:
Код:
[Выделить все]
Command: l LINE Specify first point:
Specify next point or [Undo]:
Specify next point or [Undo]:
Command: -group
Enter a group option [?/Order/Add/Remove/Explode/REName/Selectable/Create] <Create>: c
Enter a group name or [?]: 12
Enter a group description:
Select objects: (entlast)
<Entity name: 7ef6c6e0>
1 found
Select objects:
Command:
А Вы заодно показали четвертый способ, хотя они в общем-то похожи.
Про выбор рамкой я не зря сказал "только для данного случая", когда на чертеже только квадрат полилинией и круг. Сам всегда долго думаю как составить фильтр, чтобы отсеять все ненужное.
Олег К. вне форума  
 
Автор темы   Непрочитано 25.07.2008, 16:25
#152
Red Nova

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


Олег К.,
Внес твою поправку. Ты и раньше говорил, а я забыл...
VVA,
По поводу отслеживания ошибок, спасибо за пояснения. Принцип ясен. Но понять почему радиус не принимается равным переменной R это не помогло. Я исправил cond, но как уже сказал с радиусом неполадка. А квадрат рисуется нормально.
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base R object)
(initget 7)
(setq dimensionX (getreal "Введите ширину колонны: "))
(initget 7)
(setq dimensionY (getreal "Введите толщину колонны: "))
(setq base 
    (cond
         ((getpoint "\Введите точку вставки колонны <0,0,0> :"))
         (t '(0. 0. 0.)))
     ) 
(setq pt1
     ( list ( - ( car base ) ( / dimensionX  2.0 ) )
            ( - (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(setq pt2
     ( list ( - ( car base ) ( / dimensionX  2.0 ) )
            ( + (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(setq pt3
     ( list ( + ( car base ) ( / dimensionX  2.0 ) )
            ( + (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(setq pt4
     ( list ( + ( car base ) ( / dimensionX  2.0 ) )
            ( - (cadr base ) ( / dimensionY  2.0 ) )
     )
)
(Setq  R  ( / dimensionX  2.0 ))
(command "_pline" pt1 pt2 pt3 pt4 "_c")
(Setq object (entlast))
(command "_circle" base "" R "")
(command "_rotate" object "" base pause)
;продолжение
)
P.S. А с entlast я правлиьно делаю?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 16:40
#153
Кулик Алексей aka kpblc
Moderator

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


А osmode кто отслеживать будет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.07.2008, 16:55
#154
Red Nova

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


Кулик Алексей aka kpblc,
Цитата:
А osmode кто отслеживать будет?
Ну пока наверное тебя попрошу за мена отслеживать А вот как объяснишь как это делать, то уже я буду.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 16:59
#155
Кулик Алексей aka kpblc
Moderator

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


http://www.caduser.ru/cgi-bin/f1/board.cgi?t=43426Wu
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2008, 17:00
#156
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Red Nova, это из командной строки:
Код:
[Выделить все]
Command: ci CIRCLE
Specify center point for circle or [3P/2P/Ttr (tan tan radius)]: 0,0,0
Specify radius of circle or [Diameter] <96.20>: 20
Command:
а теперь смотрим, что у тебя в программе написано и думаем (или хотя бы сравниваем)
Олег К. вне форума  
 
Автор темы   Непрочитано 25.07.2008, 17:24
#157
Red Nova

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


Кулик Алексей aka kpblc,
Может там и описывается нужная операция, но слова osmode там нету, я пока в ауте. Что вообще означает отследить osmode?
Олег К., Неа, не понимаю.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 18:15
#158
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Ну ладно, тогда по буквам:
(command "_circle" base "" R "")
1. сначала говорим какую команду используем ["_circle"], это равнозначно Command: ci CIRCLE
2. далее нужно указать точку центра или выбрать опцию [base] = Specify center point for circle or [3P/2P/Ttr (tan tan radius)]: 0,0,0
3. потом следует ввести радиус [Specify radius of circle or [Diameter] <96.20>: 20], а у нас в программе зачем-то пустой ввод [""]
4-5. все, запросы команды закончились, а мы задаем еще R и "".
Энтер или пробел нужно нажимать только если вводишь данные с клавиатуры. При программном вводе подтверждение ввода совсем не нужно.

В рабочем варианте: (command "_circle" base R).
Еще есть такая функция vl-cmdf, почитай о ней, посмотри чем отличается от command.
Олег К. вне форума  
 
Непрочитано 25.07.2008, 20:36
#159
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


По-моему, при такой интенсивности обучения у RED Nova не остается времени на домашнюю аналитическую работу. Он бы и сам допер до некоторых вещей, что было-бы более ценно. Предложение такое: класс по программированию работает, например, по пятницам. Или дважды в неделю. И все-учителя и ученики - ждали бы с нетерпением
Vova вне форума  
 
Непрочитано 26.07.2008, 19:48
#160
Кулик Алексей aka kpblc
Moderator

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


Red Nova, а я зря дал ссылку в #155, что ли? Пост Alan'a прочти.
__________________
Моя библиотека 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