Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 85
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 2048591
 
Непрочитано 23.10.2011, 16:19
#1681
gomer

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


Цитата:
Сообщение от AMATOP Посмотреть сообщение
Вот:
бред какой-то
ВОТ:
Код:
[Выделить все]
 (if (setq ss (ssget '((0 . "LINE"))))
  (mapcar
   '(lambda (x)
	  (angle (cdr (assoc 10 x)) (cdr (assoc 11 x)))
	)
	(mapcar
	  'entget
	  (vl-remove-if
	  'listp
	  (mapcar 'cadr (ssnamex ss))
	  )
	)
  )
)
gomer вне форума  
 
Непрочитано 23.10.2011, 16:46
#1682
Li6-D


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


Цитата:
Сообщение от AMATOP Посмотреть сообщение
Извините, за тупость обильно приправленную, увы, ленью, но ... как создать пустой список?
Т.е. переменная, типа список, есть, но внутри ничего нет! Другими словами, это как перед входом в супермаркет - нужно взять тележку, но пустую. А в LISP-е у меня получаеться только тогда, когда в "тележку" какой-нибудь "мусор" закинешь!
nil - и есть пустой список во всех функциях обработки списков (такой же как '() или (list)):
(cons 0 nil) возвращает (0).
Если переменной значение еще не присваивалось, то она и есть уже готовый пустой список.
Кроме того, nil в некоторых логических функциях (<, <=, >, >=, /=) ведет себя как минус бесконечность:
(> -999999999. nil) возвращает T.
Цитата:
Сообщение от Oliver_88 Посмотреть сообщение
Код:
[Выделить все]
    (setq nabor (ssget))
    (setq kolvo (sslength nabor))
    (while (< 0 kolvo)
      (setq kolvo (1- kolvo))
      (vl-load-com)
      (setq object (ssname nabor kolvo))
      (setq spisok (cons (vlax-get-property (vlax-ename->vla-object object) 'Angle) spisok))
      )
Нет проверки того, что объекты в выборке имеют свойство 'Angle - от этого и ошибка. Надо или проверять с помощью vlax-property-available-p или использовать в ssget фильтр для примитивов нужного типа, например, отрезков (см. сообщение выше).
Зачем (vl-load-com) включать в цикл?
В третей строке раньше правильно было:
(while (<= 0 kolvo)
А еще правильней вместо while применить repeat.
Нет проверки того, что nabor не nil (если пользователь ответил пустым вводом), поэтому возможна ошибка:
Команда: (sslength (ssget))
Выберите объекты:
; ошибка: неверный тип аргумента: lselsetp nil
Без фильтра:
Код:
[Выделить все]
 ((lambda (ss / i spisok obj)
   (vl-load-com)
   (repeat (if ss (setq i (sslength ss)) 0)
     (setq i (1- i)
           obj (vlax-ename->vla-object (ssname ss i)))
     (if (vlax-property-available-p obj 'Angle)
       (setq spisok (cons (vlax-get-property obj 'Angle) spisok))
   ) )
   spisok
 )
 (ssget)
)

Последний раз редактировалось Li6-D, 23.10.2011 в 17:37.
Li6-D вне форума  
 
Непрочитано 23.10.2011, 16:51
#1683
AMATOP


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


Цитата:
Сообщение от gomer Посмотреть сообщение
бред какой-то
Во-первых спасибо, за код отвечающий всем правилам "этикета" - почерпнул для себя много полезного!Правда, не понял зачем еще этот предохранитель:
Код:
[Выделить все]
  (vl-remove-if
	  'listp
	  (mapcar 'cadr (ssnamex ss))
	  )

Во-вторых:"Мы все учились понемногу,
Чему-нибудь и как-нибудь..."
Ну и (набравшись наглости) в третьих: предлагаю блиц "Что? Где? Когда?" А именно: есть куча 3D solids. Нужно проверить каждый на соответсвие определению прямоугольного параллелепипеда. И те что не прямоугольные, снабдить расширенными данными - мол, уродцы.Буду признателен за любые алгоритмы, ну а за код не совестно и в ноги поклониться!

@ Li6-D - спасибо большущее! Для меня это важная новость.

Последний раз редактировалось AMATOP, 23.10.2011 в 17:04.
AMATOP вне форума  
 
Непрочитано 23.10.2011, 17:24
#1684
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Вот еще что-то такое
Код:
[Выделить все]
   (vl-load-com)
  (setq ssl
	 (vla-get-ActiveSelectionSet
	   (vla-get-activedocument
	     (vlax-get-acad-object)
	     )
	   )
	)
  (vla-Clear ssl)
  (setq i -1)
  (if
    (and
      (not
	(vl-catch-all-error-p
	  (vl-catch-all-apply
	    'vla-SelectOnScreen
	    (list ssl (vlax-safearray-fill
			(vlax-make-safearray
			  vlax-vbInteger
			  (cons 0  0)
			  )
			(list 0)
			)
		  (vlax-safearray-fill
		    (vlax-make-safearray
		      vlax-vbVariant
		      (cons 0  0)
		      )
		    (list "LINE")
		    )
		  )
	    )
	  )
	)
      (/= 0 (vla-get-Count ssl))
      )
    (progn
      (setq arr (vlax-make-safearray
		  vlax-vbDouble
		  (cons 0  (1- (vla-get-Count ssl)))
		  )
	    )
      (vlax-map-collection ssl
	(function
	  (lambda (x)
	    (setq i (1+ i))
	    (vlax-safearray-put-element
	      arr
	      i
	      (vla-get-Angle x)
	      )
	    )
	  )
	)
      (vlax-safearray->list arr)
      )
    )
Li-6D
Цитата:
В третей строке раньше правильно было:
(while (<= 0 kolvo)
Вот почему то именно это у меня даёт ошибку
; ошибка: неверный тип аргумента: lentityp nil
Поэтому и поменял на <.
С остальными замечаниями полностью согласен.

Последний раз редактировалось Oliver_88, 23.10.2011 в 17:40.
Oliver_88 вне форума  
 
Непрочитано 23.10.2011, 19:16
#1685
gomer

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


Цитата:
Сообщение от AMATOP Посмотреть сообщение
Правда, не понял зачем еще этот предохранитель:
это не предохранитель, а преобразователь набора в список... обычно является частью библиотечных функций... с их использованием еще все лаконичнее
Код:
[Выделить все]
 if (setq ss (ssget '((0 . "LINE"))))
  (mapcar
   '(lambda (x)
	  (angle (dxf 10 x) (dxf 11 x))
	)
	(ss->list ss)
  )
)
ваша ошибка в постановке задачи... угол не может существовать без точек + свойство Angle есть только у отрезков (зная точки можно найти угол) + куча холостых vl-load-com в цыкле и пребразований из типа в тип
Oliver_88, посмотрите на свой код и на мой... Стоит ли овчинка выделки? Не все то золото, что пропиарили... единственное преимущество вашего - реакция на Esc... с помощью библиотечных функций это делается в две строки тем более, что скорости вам иксы не прибавят, данном случае
gomer вне форума  
 
Непрочитано 23.10.2011, 19:44
#1686
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Offtop: gomer, написал как вариант. Ничего личного.
Oliver_88 вне форума  
 
Непрочитано 23.10.2011, 20:09
#1687
gomer

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


Цитата:
Сообщение от Oliver_88 Посмотреть сообщение
написал как вариант
ActiveX - вотчина vba... Там по другому нельзя! Задача же элементарная: берем отрезки и для каждого вычисляем угол...
gomer вне форума  
 
Непрочитано 23.10.2011, 23:54
#1688
AMATOP


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


Цитата:
Сообщение от gomer Посмотреть сообщение
это не предохранитель, а преобразователь набора в список...
Я имел в виду:
Код:
[Выделить все]
   (vl-remove-if
	  'listp...
Ведь mapcar уже даст на выходе список!? Зачем проверка с очисткой?
__________________
Все люди думают по-разному!
А тупят одинаково :rolleyes:
AMATOP вне форума  
 
Непрочитано 24.10.2011, 00:01
1 | #1689
Кулик Алексей aka kpblc
Moderator

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


А ты проверь
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.10.2011, 11:09
#1690
AMATOP


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


Да, поспешил! - Поленился сначала протянуть до конца строку в окне консоли.
__________________
Все люди думают по-разному!
А тупят одинаково :rolleyes:
AMATOP вне форума  
 
Непрочитано 31.10.2011, 00:41
#1691
Michael!

инженер
 
Регистрация: 29.01.2009
Тамбов
Сообщений: 63


Доброго времени суток!
Подскажите, какая команда существует в Visual Lisp для выбора последнего отрисованного элемента?
спасибо!
Michael! вне форума  
 
Непрочитано 31.10.2011, 00:46
#1692
Кулик Алексей aka kpblc
Moderator

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


entlast, кажется...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.10.2011, 00:52
#1693
Michael!

инженер
 
Регистрация: 29.01.2009
Тамбов
Сообщений: 63


я видимо не так сформулировал вопрос. я хотел через VLA. какой там синтаксис?
Michael! вне форума  
 
Непрочитано 31.10.2011, 01:03
#1694
Кулик Алексей aka kpblc
Moderator

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


Если создание объекта (черт, два литра пива дают о себе знать...) выполняется через vla-, то результат создания объекта уже и есть указатель на созданный объект. Я не очень понимаю - в чем, собственно, трудность-то?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.10.2011, 01:13
#1695
Michael!

инженер
 
Регистрация: 29.01.2009
Тамбов
Сообщений: 63


пиво в малых дозах полезно в любых количествах .
дело то вот в чем: я хочу выбрать мин и мах точки у замкнутого контура. знаю как это сделать через VLA (vla-GetBoundingBox obj 'minpoint 'maxpoint). поэтому мне нужно выбрать объект через VLA. он создается копированием. поэтому хочу взять этот OBJ так. (типо как entlast в лиспе).
Michael! вне форума  
 
Непрочитано 31.10.2011, 01:27
#1696
Кулик Алексей aka kpblc
Moderator

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


Попробуй так:
(setq res (vla-copy ....
А потом дампить res. Проверить сейчас уже не могу, спать сильно хочу. Если что - днем попробую проверить...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.10.2011, 01:28
#1697
Michael!

инженер
 
Регистрация: 29.01.2009
Тамбов
Сообщений: 63


ладно. до завтра. все равно ничего не понял
в любом случае спасибо!
Michael! вне форума  
 
Непрочитано 31.10.2011, 03:36
#1698
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Код:
[Выделить все]
 (vla-Item (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
	  (1- (vla-get-Count (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))))
	  )
Если рисуешь в листе, нужно заменить vla-get-modelspace на vla-get-paperspace.
Oliver_88 вне форума  
 
Непрочитано 31.10.2011, 08:56
#1699
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Michael! Посмотреть сообщение
поэтому хочу взять этот OBJ так. (типо как entlast в лиспе).
Ну так и возьми тупо
Код:
[Выделить все]
 
(vlax-ename->vla-object (entlast))
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 31.10.2011, 08:56
#1700
Кулик Алексей aka kpblc
Moderator

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


Вариант 1:
Код:
[Выделить все]
 (vlax-ename->vla-object (entlast))
Вариант 2:
Код:
[Выделить все]
 (setq res (vla-copy (vlax-ename->vla-object (car (entsel)))))
(vla-move res (vlax-3d-point (getpoint "\nBase point : ")) (vlax-3d-point (getpoint "\nSource point : ")))
__________________
Моя библиотека 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