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

Вернуться   Форум 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.
Просмотров: 1972550
 
Непрочитано 30.07.2008, 11:48
#241
Alaspher


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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
VVA,
Вот вариант команды одновременно и отключающей и включающей привязки. Работает.
Код:
[Выделить все]
(defun c:disable_enable_osmode ()
    (if (< (getvar "osmode") 16384) 
      (setvar "osmode" (+ (getvar "osmode") 16384)) 
      (setvar "osmode" (- (getvar "osmode") 16384))
    )
)
Тогоже результата можно добиться без предварительной проверки значения:
Код:
[Выделить все]
(defun demo ()
      (setvar "osmode" (boole 6 16384 (getvar "osmode")))
)
но полезность такого решения весьма сомнительна - лично я ни разу не сталкивался с ситуацией, когда наличие привязки надо было бы изменить на пртивоположное. Как правило, надо бывает выключить привязку в нужное время и вернуть в первоначальное состояние, по окончании. В редких случаях бывает надо включить конкретную привязку, но опять же вне зависимости от её состояния ДО начала выполнения программы.
Alaspher вне форума  
 
Автор темы   Непрочитано 30.07.2008, 11:50
#242
Red Nova

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


Олег К.,
А как командами это сделат? Хоть намекни что надо использовать.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 30.07.2008, 12:51
#243
VVA

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Олег К.,
А как командами это сделат? Хоть намекни что надо использовать.
Если хочешь обучаться, тщательно штудируй оставленные тебе сообщения.
#235 для кого писалось?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.07.2008, 13:57
#244
Олег К.

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


Цитата:
А как командами это сделат? Хоть намекни что надо использовать.
А как ты полилинию и окружность делал? Набираешь в командной строке и смотришь, какие запросы идут. Потом пробуешь повторить это лиспом. Что набирать уже сказано в #235.
Вас тут двое обучающихся, но даже если сообщение адресуется одному, другому тоже рекомендуется читать.
Олег К. вне форума  
 
Непрочитано 30.07.2008, 14:23
#245
andery


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


Если с полилинией, кругом понятно, т.к. запросы идут в командной строке, более менее догататься можна.
А вот _layer вызывает диалоговое окно....
Где можна найти подробной описание команд ?
andery вне форума  
 
Непрочитано 30.07.2008, 14:38
#246
VVA

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


andery, Разве в #235 написано _layer? Там написано _-layer
Найди разницу и почитай предпоследний пост здесь.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.07.2008, 14:40
#247
andery


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


Протупил...не читаем предыдущий пост
andery вне форума  
 
Автор темы   Непрочитано 30.07.2008, 16:19
#248
Red Nova

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


VVA,
Цитата:
Если хочешь обучаться, тщательно штудируй оставленные тебе сообщения.
#235 для кого писалось?
Дык #235 было адресовано andery, вот я и пропустил.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 30.07.2008, 16:21
#249
andery


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


Получилось вот такое:

Код:
[Выделить все]
(defun c:колонна (/)
      	(initget (+ 1 2 4))
	(setq a (getdist"\nВведите ширину колонны:"))
	(initget (+ 1 2 4))
	(setq b (getdist"\nВведите высоту колонны:"))
	(setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
	(if (null p) (setq p '(0 0 0))
	)
	(setq x1 (- (car p) (/ a 2))) 
	(setq y1 (- (car (cdr p)) (/ b 2)))
	(setq x2 (+ (car p) (/ a 2)))
	(setq y2 (+ (car (cdr p)) (/ b 2)))

  

	(setq oldOsnapcoord (getvar "osnapcoord"))
	(setq oldLayer (getvar "clayer"))
	(setvar "osnapcoord" 1)       
  	(command "_.-layer" "_make" "колонна" "_color" "_red" "" "_L" "continuous" "" "")  

    	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
	)
    	(Setq object (entlast))
  	(command "_circle" p (/ a 2))
 	(command "_rotate" object "" p pause)
  	(setvar "clayer" oldLayer)
	(setvar "osnapcoord" oldOsnapcoord)  
  )
andery вне форума  
 
Непрочитано 30.07.2008, 16:29
#250
VVA

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


andery, В общем хорошо кроме одного: если при запросе угла поворота нажать ESC, то не восстановится ни слой, ни osnapcoord
Прочитай пост #192 , пример #194 и 196. Хочу чтобы кодга нажму ESC все осталось как было.

*** Добавлено
Еще хочу чтобы круг был синим. См. команды _CHANGE и _CHPROP
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 30.07.2008 в 17:25.
VVA вне форума  
 
Непрочитано 30.07.2008, 17:20
#251
andery


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


VVA,
Спасибо, я пока сознательно не применяю *error*
Вот так можна пока в нашем случае пока обойтись без эррора (я так думаю).
Круг синий.
Код:
[Выделить все]
 
(defun c:колонна (/)
      	(initget (+ 1 2 4))
	(setq a (getdist"\nВведите ширину колонны:"))
	(initget (+ 1 2 4))
	(setq b (getdist"\nВведите высоту колонны:"))
	(setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
	(if (null p) (setq p '(0 0 0))
	)
	(setq x1 (- (car p) (/ a 2))) 
	(setq y1 (- (car (cdr p)) (/ b 2)))
	(setq x2 (+ (car p) (/ a 2)))
	(setq y2 (+ (car (cdr p)) (/ b 2)))

	(setq oldOsnapcoord (getvar "osnapcoord"))
	(setq oldLayer (getvar "clayer"))
	(setvar "osnapcoord" 1)       
  	(command "_.-layer" "_make" "колонна" "_color" "_red" "" "_L" "continuous" "" "")  

    	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
	)
    	(Setq object (entlast))
  	(command "_circle" p (/ a 2))
  	(command "_change" (entlast) "" "_P" "_C" "_blue" "")
  	(setvar "clayer" oldLayer)
	(setvar "osnapcoord" oldOsnapcoord)  
 	(command "_rotate" object "" p pause)
  
  )
andery вне форума  
 
Непрочитано 30.07.2008, 17:39
#252
VVA

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


andery, Зачтено.
Теперь синим пусть будут и полилиния и круг. Будем учиться работать с наборами. Наборы - это коробочка с именами примитивов (типа entlast), которую тоже можно указывать в ответ на запрос "Выберите объекты". Туда можно по мере отрисовки примитивов их складывать, чтобы скормить какой-либо команде за один раз.
В общем с наборами работают следующие ф-ции лиспа:
ssadd , ssdel ,sslength, ssname
Нам здесь понадобится ssadd
Код:
[Выделить все]
(setq ss (ssadd)) ;_ Создаем пустой набор
(ssadd (entlast) ss) ;_Помещаем в ss последний отрисованный примитив
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.07.2008, 17:57
#253
andery


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


Вроде так:
Код:
[Выделить все]
(defun c:колонна (/)
      	(initget (+ 1 2 4))
	(setq a (getdist"\nВведите ширину колонны:"))
	(initget (+ 1 2 4))
	(setq b (getdist"\nВведите высоту колонны:"))
	(setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
	(if (null p) (setq p '(0 0 0))
	)
	(setq x1 (- (car p) (/ a 2))) 
	(setq y1 (- (car (cdr p)) (/ b 2)))
	(setq x2 (+ (car p) (/ a 2)))
	(setq y2 (+ (car (cdr p)) (/ b 2)))

	(setq oldOsnapcoord (getvar "osnapcoord"))
	(setq oldLayer (getvar "clayer"))
	(setvar "osnapcoord" 1)       
  	(command "_.-layer" "_make" "колонна" "_color" "_red" "" "_L" "continuous" "" "")
  	(setq nabor (ssadd)) 
	(command "_circle" p (/ a 2))
  	(ssadd (entlast) nabor)
    	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
	)
    	
  	(ssadd (entlast) nabor)
  	(command "_change" nabor "" "_P" "_C" "_blue" "")
  	(setvar "clayer" oldLayer)
	(setvar "osnapcoord" oldOsnapcoord)  
 	(command "_rotate" (entlast) "" p pause)
  
  )
andery вне форума  
 
Автор темы   Непрочитано 31.07.2008, 09:26
#254
Red Nova

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


Пока я справлял день рождения вы ушли вперед. Будем догонять.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 09:57
#255
Рyslan


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


учиться, учиться и учиться!
Рyslan вне форума  
 
Непрочитано 31.07.2008, 10:02
#256
andery


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


Вот эту строчку
(command "_rotate" (entlast) "" p pause)
можна заменить вот этой.
(command "_rotate" (ssname nabor 1) "" p pause)
andery вне форума  
 
Автор темы   Непрочитано 31.07.2008, 10:25
#257
Red Nova

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


VVA,
Вот код по заданию с #230

Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base R object 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 "Введите толщину колонны: "))
 (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 "_-LAYER" "_make" "Колонны" "_color" "red" "" "ltype" "" "" "_set" "Колонны" "")

 (command "_pline" pt1 pt2 pt3 pt4 "_c")

 (Setq object (entlast))

 (command "_circle" base R)

 (command "_rotate" object "" base pause)

 (setvar "clayer" OldLAY)

 (setvar "osmode" oldOSM)
)
Тут меня смущает только undo. После выполнения команды, если нажать undo, то действия отменяются пошагово. Видел как это сделать при помощи vla команд, но Autolisp - ом не умею.
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 31.07.2008, 10:35
#258
Red Nova

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


Догоняю дальше. Вот с заданием кругу синего цвета.
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base R object 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 "Введите толщину колонны: "))
 (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 "_-layer" "_make" "Колонны" "_color" "red" "" "ltype" "" "" "_set" "Колонны" "")

 (command "_pline" pt1 pt2 pt3 pt4 "_c")

 (Setq object (entlast))

 (command "_circle" base R)

 (command "_chprop" "_l" "" "_color" "blue" "")

 (command "_rotate" object "" base pause)

 (setvar "clayer" OldLAY)

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

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


До undo еще дойдем. В этой строке (пост #257)
Код:
[Выделить все]
(command "_-LAYER" "_make" "Колонны" "_color" "red" "" "ltype" "" "" "_set" "Колонны" "")
ты ДВАЖДЫ нарушил п.2 правил В локализованной версии работать не будет.
И еще:
1. Опция _make команды _-LAYER создает слой и делает его текущим. Позтому _set можно не применять
2. Тип линии слою мы не задаем. Тогда зачем вызывать опцию ltype да еще с нарушением п.2 правил
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 31.07.2008, 11:08
#260
andery


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


Цитата:
2. Тип линии слою мы не задаем.
Почему? Если у нас уже существовал слой "колонна" с другим типом линии, а нам надо тип линии "continuous", то если не задавать тип линии - тип будет такой как был у существовавшего слоя колонна.

....
Можна усложнять дальше...
andery вне форума  
Ответ
Вернуться   Форум 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