Серия обучающих вебинаров по nanoCAD
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,970
Отправить сообщение для Red Nova с помощью Skype™

Red Nova вне форума Вставить имя

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1467658
 
Автор темы   Непрочитано 27.07.2008, 08:21
#161
Red Nova

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


Олег К.,
Теперь понял. А я все пытался enter всунуть.
Наконец заработало.
Код:
[Выделить все]
 (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)
;продолжение
)
Цитата:
Еще есть такая функция vl-cmdf,
Я пока функций начинающихся на vl боюсь.

Vova,
Цитата:
Он бы и сам допер до некоторых вещей, что было-бы более ценно.
Сильно льстишь. Не допер бы.

Кулик Алексей aka kpblc,
Вот сообщение от Alan
Цитата:
(defun с:cсс (/ tl)
;;; запомнили
;;; и так для всех изменяемых
(setq tl (getvar "CELTYPE"))
;;; Назначили тип
(setvar "CELTYPE" "bylayer")
;;; делаем что-то............

(vl-cmdf "_pline")
;;; делаем что-то............

;;; вернули
(setvar "CELTYPE" tl)
) ;_ конец defun
В чем связь между Osmode и Celtype?
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 27.07.2008, 08:25
#162
Red Nova

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


Пора усложнить лисп. Научится вводить размеры колонны с экрана, Запоминать значение введенное последним. Дайте список функций, которые нужно для этого изучить. Постараюсь сам навоять.
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.07.2008, 09:49
#163
Кулик Алексей aka kpblc
Moderator

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


> #161 : лично я стараюсь не давать русских наименований ни переменным, ни функциям. Возможно, это тянется еще с VB3.0 и его ограничений.
Вся разница между (command) и (vl-cmdf) в том, что (command) всегда возвращает nil (независимо ни от чего), а vl-cmdf при успешном (или корректном) завершении команды вернет T. Это утверждение гарантированно работает только для полного AutoCAD, для LT и IntelliCAD'a это уже не факт.
Цитата:
Вот сообщение от Alan
Цитата:
(defun с:cсс (/ tl)
;;; запомнили
;;; и так для всех изменяемых
(setq tl (getvar "CELTYPE"))
;;; Назначили тип
(setvar "CELTYPE" "bylayer")
;;; делаем что-то............

(vl-cmdf "_pline")
;;; делаем что-то............

;;; вернули
(setvar "CELTYPE" tl)
) ;_ конец defun
В чем связь между Osmode и Celtype?
А в том, что и osmode, и celtype есть системные переменные. Посмотри еще раз на код Alan'a, там же все написано:
Код:
[Выделить все]
(defun с:cсс (/ tl)
;;; запомнили
;;; и так для всех изменяемых
(setq tl (getvar "CELTYPE"))
;;; Назначили <...>
(setvar <...>)
;;; делаем что-то............
;;; вернули
(setvar <...>)
) ;_ конец defun
То есть - сначала запоминаешь старое значение системной переменной, потом его устанавливаешь, после этого работаешь как хочется. В последнюю очередь - восстановить старые значения. Попробуй абстрагироваться от конкретного кода, ищи в нем логику и обобщай ее. Без этого научиться, по-моему, невозможно.
> #162 : Я б на твоем месте сначала с *error* разобрался. А экранный ввод уже потом. Хотя как знаешь. Для ввода с экрана см. getdist и (или) getcorner. Для всего остального функции lisp'a уже не требуются.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 27.07.2008, 14:32
#164
Red Nova

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


А что на счет error? Что означает "Разобраться с ним", в каких целях это вообще делать?
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.07.2008, 15:25
#165
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,767
Отправить сообщение для Alan с помощью ICQ


Цитата:
Сообщение от Red Nova Посмотреть сообщение
А что на счет error? Что означает "Разобраться с ним", в каких целях это вообще делать?
Для простоты объяснения...
Лучше всего посмотреть уже упоминавшуюся книгу "САПР на базе..." стр.286
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.07.2008, 16:30
#166
Кулик Алексей aka kpblc
Moderator

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


В дополнение: http://www.arcada.com.ua/forum/viewtopic.php?t=445
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.07.2008, 22:47
#167
VVA

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


Ну что ж. Начнем наступать на ГРАБЛИ №1 (OSMODE)
  1. За основу берем лисп #161.
  2. Скачиваем файл Грабли N1.dwg
  3. Загружаем команду Колонна из #161
  4. Устанавливаем переменную OSMODE = 33 (равносильно включенной привязке "Конточка" и "Пересечение"
    Устанавливаем переменную OSNAPCOORD = 0
  5. Ширина и высота колонны = 400
  6. Точка вставки колонны - точка пересечения красных отрехков
  7. Выполняем команду, смотрим результат, делаем выводы.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08.
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 28.07.2008, 09:33
#168
Red Nova

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


VVA,
Подозреваю, что ты имел в виду необходимость отключить привязки на момент действия лиспа, так как при запросе угла поворота они могут помешать.
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.07.2008, 10:19
#169
VVA

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
VVA,
Подозреваю, что ты имел в виду необходимость отключить привязки на момент действия лиспа, так как при запросе угла поворота они могут помешать.
Ну положим мешать они начинают значительно раньше: как только какой-либо команде Автокада начинаешь передавать точки. В твоем случае здесь
Код:
[Выделить все]
(command "_pline" pt1 pt2 pt3 pt4 "_c")
То, что может получиться ты должен был видеть на примере.
Отсюда еще пару мельких наводящих заданий:
  1. Узнать в какой системной переменной хранятся привязки
  2. Описать эту переменную в Справочнике команд
  3. Как можно влиять на включение / отключение привязки при отрисовке, например, отрезков если нельзя:
  • нажимать мышкой на кнопку "Привязка" ("OSNAP")
  • нажимать на F3
  • набирать Ctrl+F
  • во время указания точки держать нажатым комбинацию Shift+D
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 28.07.2008, 11:11
#170
Red Nova

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


VVA,
Цитата:
Ну положим мешать они начинают значительно раньше: как только какой-либо команде Автокада начинаешь передавать точки. В твоем случае здесь

Код:
(command "_pline" pt1 pt2 pt3 pt4 "_c")

То, что может получиться ты должен был видеть на примере.
А у меня казусов не было. Все прошло довольно гладко.

Цитата:
Узнать в какой системной переменной хранятся привязки
Ну это легко - OSMODE

Цитата:
Описать эту переменную в Справочнике команд
Это тоже можно.
http://dwg.ru/f/showthread.php?p=271243
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.07.2008, 12:22
#171
VVA

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


Red Nova, Ты хочешь сказать, что из поста #167 открыв файл "Грабли N1", установив OSMODE=33, задав ширину и высоту колонны = 400 и точку вставки- пересение красных отрезков получил колонну прямоугольную ?
Еще остался вопрос N3 из #169
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 28.07.2008, 12:53
#172
Red Nova

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


Цитата:
Ты хочешь сказать, что из поста #167 открыв файл "Грабли N1", установив OSMODE=33, задав ширину и высоту колонны = 400 и точку вставки- пересение красных отрезков получил колонну прямоугольную ?
Смотри файл.
Цитата:
Еще остался вопрос N3 из #169
Запомнить Osmode, обнулить, потом вернуть.
__________________
Блог

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08.
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.07.2008, 13:26
#173
andery


 
Регистрация: 27.12.2007
Сообщений: 132
Отправить сообщение для andery с помощью ICQ


Я так подозреваю должена быть в коде такая конструкция:

Код:
[Выделить все]
(setq old_osmode (getvar "osmode"))
(setvar "osmode" 33)
; программа
(setvar "osmode" old_osmode)
А как указать точку вставки - пока без понятия....
andery вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 28.07.2008, 13:31
#174
Red Nova

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


andery,
Скорее всего "osmode" 0
Код:
[Выделить все]
(setq old_osmode (getvar "osmode"))
(setvar "osmode" 0)
; программа
(setvar "osmode" old_osmode)
Цитата:
А как указать точку вставки - пока без понятия....
Посмотри справку про getpoint
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.07.2008, 13:49
#175
andery


 
Регистрация: 27.12.2007
Сообщений: 132
Отправить сообщение для andery с помощью ICQ


Цитата:
Точка вставки колонны - точка пересечения красных отрехков
Вот как эту точку указать?
andery вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.07.2008, 15:07
#176
VVA

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


Red Nova,
Цитата:
А у меня казусов не было. Все прошло довольно гладко.
Отредактировал условия в #167. Попробуй снова
andery,
Это все надо делать руками. См. #167. Это просто пимер того, что может произойти, если не обрабатывать OSMODE
Red Nova,
Цитата:
Запомнить Osmode, обнулить, потом вернуть.
Хочу увидеть это лиспом, а не словами
И это один вариант.
Я хочу услышать ответ как без ЛИСПА, F3 и проч. при черчении отменить
действие установленных объектных привязок. (Подсказка: временная объектная привязка или SHIFT + Правая кнопка мыши)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 28.07.2008 в 15:18.
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.07.2008, 15:10
#177
andery


 
Регистрация: 27.12.2007
Сообщений: 132
Отправить сообщение для andery с помощью ICQ


Может профи подскажут в каком направлении надо искать на чертеже пересечение всех красных линий, или я неправильно понял задачу?
andery вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.07.2008, 15:18
#178
VVA

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


andery, Ты не правильно понял задачу. Это не задача вовсе, а попытка показать пример, что может быть, если не обрабатывать OSMODE
Отредактировал условия в #167. Это все нужно просто выполнить на своем компьютере и посмотреть на результат.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 28.07.2008, 15:42
#179
Red Nova

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


VVA,
Цитата:
Отредактировал условия в #167. Попробуй снова
Теперь понятно.

Цитата:
Я хочу услышать ответ как без ЛИСПА, F3 и проч. при черчении отменить
действие установленных объектных привязок
SHIFT + Правая кнопка мыши, а дальше none
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.07.2008, 15:51
#180
andery


 
Регистрация: 27.12.2007
Сообщений: 132
Отправить сообщение для andery с помощью ICQ


Выполнил #167
Получилось вот что:
Код такой:
Код:
[Выделить все]
(defun c:колонна (/)
  	(setq old_osmode (getvar "osmode"))
	(setvar "osmode" 33)
  	(setq old_osnapcoord (getvar "osnapcoord"))
  	(setvar "osnapcoord" 0)
	;(initget (+ 1 2 4))
	(setq a 400) ;(getdist"\nВведите ширину колонны:"))
	;(initget (+ 1 2 4))
	(setq b 400) ;(getdist"\nВведите высоту колонны:"))
	(setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
	;(if (null p) (setq p (quote (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)))

  	(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 "osmode" old_osmode)
	(setvar "osnapcoord" old_osnapcoord)
  )

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08.
andery вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 261 04.05.2018 12:45
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||