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

Вернуться   Форум 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.
Просмотров: 1965735
 
Автор темы   Непрочитано 31.07.2008, 17:10
#281
Red Nova

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


VVA,
Цитата:
Цитата:
Но ведь и без progn работает.
Не работает.
А у меня работает, но раз надо, то поправлю.
Цитата:
Твоя команда нарушает п.5 задания. Я даже специяльно обратил на это внимание.
Меня это предложение смутило
Цитата:
При этом блок с указанными размерами должен "висеть" на курсоре и ждать своей дальнейшей участи.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 17:22
#282
VVA

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Меня это предложение смутило
При этом блок с указанными размерами должен "висеть" на курсоре и ждать своей дальнейшей участи.
А что тут такого. Куда повел курсор - туда и блок полетел, причет с указанными ранее размерами.
(подсказа: команда _-INSERT опции _X и _Y)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 31.07.2008, 17:24
#283
Red Nova

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


Вот что-то подобное. Смущает то, что блок сперва в исходном масштабе висит на курсоре, и только в конце принимает нужный масштаб. А еще не знаю как сюда впихнуть координату вставки по умолчанию 0.0.
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base oldOSM OldLAY)

 (defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if oldOSM (setvar "OSMODE" oldOSM)) 
 ) 

 (setq OldLAY (getvar "clayer"))

 (setq oldOSM (getvar "osmode"))

 (setvar "osmode" 0)

 (initget 7)
 (setq dimensionX (getreal "Введите ширину колонны: "))
 (initget 7)
 (setq dimensionY (getreal "Введите толщину колонны: "))


 (if (tblsearch "block" "Колонна")
 
   (command "_-insert" "Колонна" pause dimensionX dimensionY pause)

   ( progn (command "_-layer" "_set" "0" "")
           (command "_rectang" "-0.5,-0.5" "0.5,0.5")
           (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
           (command "_-block" "Колонна" "0,0" "_last" "")
           (command "_-insert" "Колонна" pause dimensionX dimensionY pause)
   )
 )

 (setvar "clayer" OldLAY)

 (setvar "osmode" oldOSM)
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 17:26
#284
VVA

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


Red Nova,
Цитата:
Смущает то, что блок сперва в исходном масштабе висит на курсоре,
См. подсказку в #282

*** Добавлено
И логика хромает. Получается если блока нет, то он создается. Но чтобы его вставить нужно повторно выполнить команду.
Нужно так
Код:
[Выделить все]
(if БЛОКА НЕТ?
 (progn
  ДА БЛОКА НЕТ. СОЗДАЕМ БЛОК
 );_конец progn
  );_<- ЗАКОНЧИЛИ IF
INSERT блок в ЛЮБОМ случае
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 31.07.2008, 17:42
#285
Red Nova

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


VVA,
На сколько я понял у -insert есть определенная последовательность.
Сначала запрашивается имя блока, после его ввода блок и до указания мышкой точки вставки блок будет висеть на курсоре в исходном масштабе, потом уже запрашиваются параметры X и Y. Может можно сделать так, чтобы параметры X и Y запрашивались до вставки блока?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 18:01
#286
VVA

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


Цитата:
На сколько я понял у -insert есть определенная последовательность.
Если сомневаешься проверь на практике. Тем более вроде как ученый и научный метод (метод тыка) должен быть известен. Создай блок (например с именем 1 из круга).
В командной строке введи _-insert, затем 1 (имя блока) и не указывая точку вставки введи _X, затем 2 и посмотри что будет висеть на курсоре.
А так же там есть опции _PX, _PY
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 31.07.2008, 19:28
#287
Red Nova

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


Тогда так
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base oldOSM OldLAY)

 (defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if oldOSM (setvar "OSMODE" oldOSM)) 
 ) 

 (setq OldLAY (getvar "clayer"))

 (setq oldOSM (getvar "osmode"))

 (setvar "osmode" 0)

 (initget 7)
 (setq dimensionX (getreal "Введите ширину колонны: "))
 (initget 7)
 (setq dimensionY (getreal "Введите толщину колонны: "))


 (if (tblsearch "block" "Колонна")
 
   (command "_-insert" "Колонна" "_x" dimensionX "_y" dimensionY pause)

   ( progn (command "_-layer" "_set" "0" "")
           (command "_rectang" "-0.5,-0.5" "0.5,0.5")
           (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
           (command "_-block" "Колонна" "0,0" "_last" "")
           (command "_-insert" "Колонна" "_x" dimensionX "_y" dimensionY pause)
   )
 )

 (setvar "clayer" OldLAY)

 (setvar "osmode" oldOSM)
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 20:04
#288
VVA

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


Прочитай ***Добавлено в # 284 + ты не закончил команду _-INSERT: у тебя пауза на точку вставки, а там есть еще запрос угла поворота
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 31.07.2008, 20:37
#289
Red Nova

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


VVA,
Цитата:
у тебя пауза на точку вставки, а там есть еще запрос угла поворота
Может ты имеешь в виду что pause надо два раза писать? У меня и так все работает нормально.
Цитата:
Получается если блока нет, то он создается. Но чтобы его вставить нужно повторно выполнить команду.
Можно и так
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base oldOSM OldLAY)

 (defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if oldOSM (setvar "OSMODE" oldOSM)) 
 ) 

 (setq OldLAY (getvar "clayer"))

 (setq oldOSM (getvar "osmode"))

 (setvar "osmode" 0)

 (initget 7)
 (setq dimensionX (getreal "Введите ширину колонны: "))
 (initget 7)
 (setq dimensionY (getreal "Введите толщину колонны: "))


 (if (tblsearch "block" "Колонна")
 
   ()

   ( progn (command "_-layer" "_set" "0" "")
           (command "_rectang" "-0.5,-0.5" "0.5,0.5")
           (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
           (command "_-block" "Колонна" "0,0" "_last" "")
   )
 )

 (command "_-insert" "Колонна" "_x" dimensionX "_y" dimensionY pause)

 (setvar "clayer" OldLAY)

 (setvar "osmode" oldOSM)
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 21:08
#290
VVA

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


Цитата:
Может ты имеешь в виду что pause надо два раза писать? У меня и так все работает нормально.
Это пока.
Восстанавливаем круг.
После вставки блока "Колонна" нужно отрисовать круг с цетром в точке вставки колонны и радиусом = размер по X
(Подстазка - переменная LASTPOINT)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 31.07.2008, 22:15
#291
Red Nova

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


VVA,
Цитата:
Цитата:
Может ты имеешь в виду что pause надо два раза писать? У меня и так все работает нормально.
Это пока.
Понял в чем подвох.
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base oldOSM OldLAY)

 (defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if oldOSM (setvar "osmode" oldOSM)) 
 ) 

 (setq OldLAY (getvar "clayer"))

 (setq oldOSM (getvar "osmode"))

 (setvar "osmode" 0)

 (initget 7)
 (setq dimensionX (getreal "Введите ширину колонны: "))
 (initget 7)
 (setq dimensionY (getreal "Введите толщину колонны: "))


 (if (tblsearch "block" "Колонна")
 
   ()

   ( progn (command "_-layer" "_set" "0" "")
           (command "_rectang" "-0.5,-0.5" "0.5,0.5")
           (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
           (command "_-block" "Колонна" "0,0" "_last" "")
   )
 )

 (command "_-insert" "Колонна" "_x" dimensionX "_y" dimensionY pause pause)

 (command "_circle" (getvar "lastpoint") (/ dimensionX 2) "")

 (setvar "clayer" OldLAY)

 (setvar "osmode" oldOSM)
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 01.08.2008, 09:18
#292
Alaspher


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


Подобная конструкция
Цитата:
Сообщение от Red Nova Посмотреть сообщение
Код:
[Выделить все]
 (if (tblsearch "block" "Колонна")
 
   ()
 
   ( progn (command "_-layer" "_set" "0" "")
           (command "_rectang" "-0.5,-0.5" "0.5,0.5")
           (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
           (command "_-block" "Колонна" "0,0" "_last" "")
   )
 )
в ЛИСПе не принята.

Если единственным условием для отработки участка кода является отсутствие искомого значения, лучше использовать такую запись:
Код:
[Выделить все]
(if (not (tblsearch "block" "Колонна"))
  (progn
    (command "_-layer" "_set" "0" "")
    (command "_rectang" "-0.5,-0.5" "0.5,0.5")
    (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
    (command "_-block" "Колонна" "0,0" "_last" "")
  )
)
Alaspher вне форума  
 
Автор темы   Непрочитано 01.08.2008, 09:48
#293
Red Nova

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


Я и не знал про not
__________________
Блог
Red Nova вне форума  
 
Непрочитано 01.08.2008, 10:28
#294
Кулик Алексей aka kpblc
Moderator

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


Стандартная функция "отрицания"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.08.2008, 11:15
#295
VVA

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


Red Nova В #284 Когда писал это
Цитата:
Сообщение от VVA Посмотреть сообщение
Red Nova,
*** Добавлено
И логика хромает. Получается если блока нет, то он создается. Но чтобы его вставить нужно повторно выполнить команду.
Нужно так
Код:
[Выделить все]
(if БЛОКА НЕТ?
 (progn
  ДА БЛОКА НЕТ. СОЗДАЕМ БЛОК
 );_конец progn
  );_<- ЗАКОНЧИЛИ IF
INSERT блок в ЛЮБОМ случае
И имел ввиду, что
БЛОКА НЕТ? = (not (tblsearch "block" "Колонна"))
В остальном гораздо лучше чем в начале темы, но
  1. Блок не вставляется на слой Колонна
  2. В конце и при ошибке предыдущий слой не сосстанавливается
  3. При отрисовке колонны не восстанавливаются предыдущие слой, цвет и тип линии. В результате круг рисуется со свойствами "Поблоку"
*** Добавлено
Когда я начинал изучать Лисп (это был или 1991 или 1992 год) то интернета не было, но у нас был официально куплен Автокад R10, был справочник по AutoLISP и никто его не знал . Я ставил перед собой маленькую задачу типа: "Нужно запросить у пользователя точку", брал справочник и читая описание каждой ф-ции искал подходящую, найдя - пробывал.
Это я про
Цитата:
Я и не знал про not
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 01.08.2008 в 11:24.
VVA вне форума  
 
Автор темы   Непрочитано 01.08.2008, 13:05
#296
Red Nova

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


VVA,
Тогда так
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY oldOSM OldLAY)

 (defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if oldOSM (setvar "osmode" oldOSM)) 
 (if OldLAY (setvar "clayer" OldLAY)) 
 ) 

 (setq OldLAY (getvar "clayer"))

 (setq oldOSM (getvar "osmode"))

 (setvar "osmode" 0)

 (initget 7)
 (setq dimensionX (getreal "Введите ширину колонны: "))
 (initget 7)
 (setq dimensionY (getreal "Введите толщину колонны: "))

 (if (not (tblsearch "block" "Колонна"))
   (progn
     (command "_-layer" "_set" "0" "")
     (command "_rectang" "-0.5,-0.5" "0.5,0.5")
     (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
     (command "_-block" "Колонна" "0,0" "_last" "")
   )
 )

 (command "_-layer" "_make" "Колонна" "")

 (command "_-insert" "Колонна" "_x" dimensionX "_y" dimensionY pause pause)

 (setvar "clayer" OldLAY)

 (command "_circle" (getvar "lastpoint") (/ dimensionX 2) "")

 (setvar "osmode" oldOSM)
)
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 01.08.2008, 17:03
#297
Red Nova

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


Хочу новое задание
__________________
Блог
Red Nova вне форума  
 
Непрочитано 01.08.2008, 20:51
#298
VVA

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


Ну тогда так:
Хочу задать длину и ширину и вставлять колонны-БЛОКИ пока не посинею или мышь не задымится
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 01.08.2008, 21:01
#299
Red Nova

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


А подсказки не будет?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 01.08.2008, 22:03
#300
Кулик Алексей aka kpblc
Moderator

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


Еще задача - подсчитать количество колонн, с сортировкой по габаритам. Типа "400х600 - 20 шт; 200х800 - 1 шт."
__________________
Моя библиотека 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