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

Вернуться   Форум 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.
Просмотров: 1965811
 
Непрочитано 28.08.2012, 08:49
#1881
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


ПРосто в поиске гугла или яндекса, да даже этого сайта, вбей свой вопрос "извлечь значения атрибута из блока" и читай, изучай

Offtop: обалдеть, когда я начинал изучать ЛИСП, то скачал много разных учебников, перерыл этот сайт и другие схожие... что за лень у человека?

По поводу справки - есть в автокаде главное меню -> Справка -> Дополнительные ресурсы -> Справка для разработчиков.
ВОт ееродимую и изучай, ЛИСП, потом объектную модель.
Конкретно для тебя - объект BlockRef (т.е. вставка блока). Там прописаны возможные методы и свойства этого объекта. Один из методов - getAttributes. Но прописано для VBA. В лиспе ты добавляешь vla- к таким методам. И будет у тебя vla-getAttributes. А аргументы этой функции уже сам найдешь при поиске.
Второй момент - тебе нужно, чтобы вставлялся блок с именем, соответствующим значению атрибута. Здесь возможны разные варианты вставки блока. Так же ищи в поиске "вставить блок".

Также советую эту тему с первых страниц читать, не обязательно всю, но первые страниц 10-20 тебе будут полезны.
Frigate вне форума  
 
Непрочитано 28.08.2012, 12:35
#1882
Никита Ремизов


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


Гораздо легче было бы изучать имея перед собой кусок кода, выполняющий конкретно эти действия, а в информации, которую нахожу через гугл черт ногу сломит. А изучать весь автолиса ради такой элементарной узкой задачки не очень хочется, но похоже придется(
Никита Ремизов вне форума  
 
Непрочитано 28.08.2012, 12:42
#1883
Кулик Алексей aka kpblc
Moderator

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


Никита Ремизов, в поиске по vla-getattributes примеров полно. Всяких и разных. Я ж ссылку давал!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.08.2012, 15:27
#1884
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Кулик Алексей aka kpblc,


хочетя наподобие старого деда поворчаить типа "Эх, молодеш, молодеш..."
Frigate вне форума  
 
Непрочитано 28.08.2012, 20:33
#1885
Никита Ремизов


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


Кулик Алексей aka kpblc, так я ведь и не говорю, что там недостаточно примеров, просто вы на секундочку представьте, как человеку не владеющему лиспом в них быстро разобраться (когда там vla-getattributes где-нибудь в середине находится и бог его знает, что происходило до и происходит после). В любом случае спасибо всем за помощь
Никита Ремизов вне форума  
 
Непрочитано 28.08.2012, 23:00
#1886
Кулик Алексей aka kpblc
Moderator

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


Последний раз: http://forum.dwg.ru/showthread.php?t=22653 + http://forum.dwg.ru/showthread.php?t=54116
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.09.2012, 16:31
#1887
dirge


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


Всем привет! Есть ли способ процедурно взорвать объекты MagiCAD с сохранением оригинала на лиспе?

Есть комманда "_magiexplode", но не нравится, что каждый раз выскакивает модальное окно с ворнингом, объекты будут удаленны и т.д, а потом просит выбрать объекты. Заранее выбрать объекты, а потом использовать комманду тоже не получается. Есть ли способы решения какие-то?
dirge вне форума  
 
Непрочитано 26.09.2012, 16:30
#1888
Aminka

проектировщик CТБ
 
Регистрация: 03.03.2009
Сообщений: 28


Доброго всем времени суток!

Господа, вопрос, пожалуй, дурацкий, но чайникам можно и такое.
Есть у меня блок, который я посредством автолиспа explode-ом разбиваю на линии и пытаюсь найти его геометрический центр. При разбитии получаю вариант с безопасным массивом, который преобразую в список сылок на объекты. Потом мне надо из эотого списка выделить сключительно линии, проигнорировав атрибуты и тексты.
То есть все выглядит просто - берем каждый элемент списка и проверяем его на причастность к линиям. Но найти функцию такую в Axtive-X не могу. Текст, написанный на лиспе - длинный и пугающий, приходится применять функции преобразования.


(setq temp (vla-explode (vlax-ename->vla-object (entlast))))
(setq temp_list (vlax-safearray->list (vlax-variant-value temp)))

(setq points_list nil)
(foreach s temp_list (if (= (cdr(assoc 0 (entget (vlax-vla-object->ename s)))) "LINE")) (progn (setq p1 (cdr(assoc 10 (entget (vlax-vla-object->ename s))))) (setq p2 )cdr(assoc 12 (entget (vlax-vla-object->ename s)))) (setq point_list (list point_list p1 p2))))))


Есть ли vla-функции, которые идеентичны " (= (assoc 0 (entget (vlax-vla-object->ename s))) (0. "LINE"))" т.е. позволяют вытащить тип т вла-объекта?

Последний раз редактировалось Aminka, 26.09.2012 в 17:11.
Aminka вне форума  
 
Непрочитано 26.09.2012, 16:43
#1889
Кулик Алексей aka kpblc
Moderator

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


(= (strcase (vla-get-objectname s)) "ACDBLINE")
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.09.2012, 17:11
#1890
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


+ к тому если вдруг окажется что нужны все же не только линии, а какая-либо группа объектов, то, как вариант, использовать (vlax-property-available-p ...)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.09.2012, 17:13
#1891
Aminka

проектировщик CТБ
 
Регистрация: 03.03.2009
Сообщений: 28


спасибо, почитаю Полищука про эти функции.
Aminka вне форума  
 
Непрочитано 29.09.2012, 02:57
#1892
Serg57


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


Доброго всем дня (ночи)!
Прошу помощи в разъяснении странной ситуации, которая не дает мне спать уже вторую неделю. В своих «лиспах» я использую обработчик ошибок:
Код:
[Выделить все]
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; обработчик ошибок
  (setq OLD_ERROR *error*)
  (setq cmd (getvar "cmdecho"))
  (setq blpm (getvar "blipmode"))
  (setq apsz (getvar "aperture"))
  (setq osmd (getvar "osmode"))
  (setq cltp (getvar "celtype"))
  (setq ccol (getvar "cecolor"))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; функция ошибок

 (defun *error* (msg)
       (setvar "cmdecho" cmd)
       (setvar "blipmode" blpm)
       (setvar "celtype" cltp)
       (setvar "cecolor" ccol)
       (setvar "aperture" apsz)
       (setvar "osmode" osmd)
(if OLD_ERROR
    (setq *error* OLD_ERROR)
  ) ;_ end of if
   (princ)
      )
И столкнулся со странной вещью, на домашнем компьютере функция работает, а на рабочем нет. Стал экспериментировать с разными компьютерами и заметил, что где стоит процессор АМД все нормально, а где процессор Интел – обработчик ошибок не работает.
Может, кто встречался с подобной ситуацией?
Сейчас пытаюсь заменить функцию *error* на vl-catch-all-error-message (может это поможет), переварил кучу информации, но не могу сообразить, как ее сделать одинаковой для всех моих лиспов. Например, свою функцию *error*, я тупо копирую из одной программы в другую, мне достаточно только, чтобы восстановились перечисленные выше системные переменные при нажатии клавиши “Esc”.
Serg57 вне форума  
 
Непрочитано 29.09.2012, 09:33
#1893
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Serg57 Посмотреть сообщение
что где стоит процессор АМД все нормально, а где процессор Интел – обработчик ошибок не работает.
Offtop: за исключением пятницы 13-го?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 29.09.2012, 14:06
#1894
Serg57


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


Извините, если не по теме, просто пишу первый раз и не ориентируюсь куда обращаться, поэтому и выбрал раздел для «чайников».
Serg57 вне форума  
 
Непрочитано 29.09.2012, 16:55
#1895
VVA

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


Serg57, Используй *error* как локальную функцию, тогда отпадет необходимость восстанавливать старый обработчик ошибок
http://autolisp.ru/2009/09/13/error-catch/
http://www.lee-mac.com/errorhandling.html
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.09.2012, 21:31
#1896
gomer

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


Цитата:
Сообщение от Serg57 Посмотреть сообщение
И столкнулся со странной вещью, на домашнем компьютере функция работает, а на рабочем нет. Стал экспериментировать с разными компьютерами и заметил, что где стоит процессор АМД все нормально, а где процессор Интел – обработчик ошибок не работает.
А что собственно не работает?
gomer вне форума  
 
Непрочитано 29.09.2012, 23:34
#1897
Serg57


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


VVA спасибо, в понедельник попробую на работе, так как дома у меня АМД (еще раз простите, что не в тему) и функция *error* работает и в таком виде, как я прислал.

gomer
Ситуация, например, такая: я черчу белыми линиями (основные линии) на черном экране, линии разрезов красные линии (тонкие). На линии разрезов написал программку, которая перед простановкой разреза переключает цвет на красный и устанавливает определенные привязки, а после выполнения команды восстанавливает исходные привязки и цвет.[/FONT]
[FONT=Times New Roman]Так вот, если в момент запроса точки нажать кдавишу «Esc», то привязки и цвет не восстанавливаются (это на рабочем компьютере), а на домашнем все нормально *ERROR* срабатывает.

Последний раз редактировалось Serg57, 29.09.2012 в 23:42.
Serg57 вне форума  
 
Непрочитано 30.09.2012, 02:42
1 | #1898
gomer

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


у меня к сожалению амд, а на работе автокада нет, причины глюка могут быть самые разные, но все ошибки элементарно проверяются с помощью alert, если уж vlide не используется для отладки
Код:
[Выделить все]
 (defun start_cmd ()
;;; начальная функция
  (setq
	cmd  (getvar "cmdecho")
	blpm (getvar "blipmode")
	apsz (getvar "aperture")
	osmd (getvar "osmode")
	cltp (getvar "celtype")
	ccol (getvar "cecolor")

	*olderr* *error*
	*error*  temperr
  )
)
(defun end_cmd ()
;;; конечная функция
  (princ "\nВосстановление системных переменных...")
  (setvar "cmdecho"   cmd)
  (setvar "blipmode" blpm)
  (setvar "celtype"  cltp)
  (setvar "cecolor"  ccol)
  (setvar "aperture" apsz)
  (setvar "osmode"   osmd)
  (setq *error*  *olderr*)
  (princ)
)
(defun temperr (msg)
;;; обработчик ошибок
  (princ (strcat "\nОшибка: " msg))
  (end_cmd)
)
(defun c:test ( / pt1 pt2)
  (start_cmd)
  (setvar "cecolor" "8") ; вообще это очень глупая строка, только для теста
  (if
	(and (setq pt1 (getpoint "\n1я точка: "))
		 (setq pt2 (getpoint pt1 "\n2я точка: "))
	)
    (setvar "cecolor" 1) ; генерируем ошибку
  )
  (end_cmd)
)
вот попробуйте погонять простой тестовый пример, вопросы: какой цвет становится текущим, и что в командной строке будет написано

Последний раз редактировалось gomer, 30.09.2012 в 02:57.
gomer вне форума  
 
Непрочитано 04.10.2012, 14:23
#1899
Alexg-12

МК, ЖБК
 
Регистрация: 14.09.2012
Киров
Сообщений: 33
<phrase 1=


Есть код ЛИСП, написанный Кулик Алексей aka kpblc. Создания вспомогательных линий в отдельном слое. Помогите разобраться, как работает.
Возможно в теме и есть подобные примеры, но 100 стр форума - это очень много.
С книгами Полещука знаком. Читаю. Описание всех функций все нашел, но как они все вместе работают, я не понял.
Например: не понял, как условием функции IF может быть отрицание NOT. А функция "vl-catch-all-error-p" возвращает T или NILL. (if (not (vl-catch-all-error-p... - это получается что: (если (не (истина/лож)... Не понятно.
Хотелось бы построчный комментарий.
Зачем тут Lambda?

Код:
[Выделить все]
 
08                                (function 
09                                  (lambda () 
10                                    (vla-item (vla-get-layers adoc) layer) 
11                                    ) ;_ end of lambda 
12                                  ) ;_ end of function
Спасибо.
Код:
[Выделить все]
 

01    (vl-load-com) 
02     
03    (defun c:dwg-xline (/ adoc sysvar layer)
04      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
05      (setq layer  "ИмяСлоя"
06            layer  (if (not (vl-catch-all-error-p
07                              (vl-catch-all-apply
08                                (function
09                                  (lambda ()
10                                    (vla-item (vla-get-layers adoc) layer)
11                                    ) ;_ end of lambda
12                                  ) ;_ end of function
13                                ) ;_ end of vl-catch-all-apply
14                              ) ;_ end of vl-catch-all-error-p
15                            ) ;_ end of not
16                     layer
17                     (vla-get-name (vla-add (vla-get-layers adoc) layer))
18                     ) ;_ end of if
19            sysvar (mapcar
20                     (function
21                       (lambda (x / tmp)
22                         (if (setq tmp (getvar (car x)))
23                           (progn
24                             (setvar (car x) (cdr x))
25                             (cons (car x) tmp)
26                             ) ;_ end of progn
27                           ) ;_ end of if
28                         ) ;_ end of lambda
29                       ) ;_ end of function
30                     (list (cons "clayer" layer))
31                     ) ;_ end of mapcar
32            ) ;_ end of setq
33      (vl-catch-all-apply
34        (function
35          (lambda ()
36            (command "_.xline")
37            (while (/= (getvar "cmdactive") 0) (command pause))
38            ) ;_ end of LAMBDA
39          ) ;_ end of function
40        ) ;_ end of VL-CATCH-ALL-APPLY
41      (foreach item sysvar
42        (setvar (car item) (cdr item))
43        ) ;_ end of foreach
44      (vla-endundomark adoc)
45      (princ)
46      ) ;_ end of defun

Последний раз редактировалось Alexg-12, 04.10.2012 в 14:47.
Alexg-12 вне форума  
 
Непрочитано 04.10.2012, 15:58
#1900
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


if имеет 3 (или 2) аргумента - условие, действие если да, [действие если нет], соответственно если действие_ДА должно выполняться при не "выполнении" условия, его "оборачивают" в (not....). В автолиспе нет как таковых отдельных булевых типов, вместо них используються в качестве false - пустой список - это "синонимы" (), '(), nil или любой не определенный символ, а в качестве true - используется любое другое значение.
Цитата:
Зачем тут Lambda?
лямбда это функция которая возращает, а не выполняет функцию, то есть vl-catch... надо передать что (какую функцию) выполнять и с какими аргументами - понять эту разницу ИХМО некоторые не могут по очень долго.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум 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