Реклама 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.
Просмотров: 1971755
 
Непрочитано 17.01.2017, 09:15
#3221
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от mkung Посмотреть сообщение
как программно вставить блок "Block1" из файла "C:\Drawings\Drawing.dwg"? Имена известны.
Выполнять копирование описания блока из одного документа в другой. См. vla-copyobjects
Цитата:
Сообщение от mkung Посмотреть сообщение
Как проверить наличие блока "Block1" в файле "C:\Drawings\Drawing.dwg"?
Открыть файл, пройтись по коллекции блоков. Один из вариантов решения - ObjectDBX
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.01.2017, 13:03
1 | #3222
skkkk


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


Цитата:
Сообщение от mkung Посмотреть сообщение
Подскажите, как программно вставить блок "Block1" из файла "C:\Drawings\Drawing.dwg"? Имена известны.
Нужна функция импорта блока из файла
skkkk вне форума  
 
Непрочитано 18.01.2017, 07:22
1 | #3223
VVA

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Подскажите, как программно вставить блок "Block1" из файла "C:\Drawings\Drawing.dwg"? Имена известны
Добавил в тему ссылку на Steal from Drawing
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 18.01.2017, 10:58
#3224
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 165


Всем спасибо! Примеров более чем достаточно.
mkung вне форума  
 
Непрочитано 18.01.2017, 11:40
#3225
skkkk


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


VVA, познакомился я как-то с этим "стилом" - выяснил один не очень приятный момент. Пробовал я "выкрасть" из файла типы линий, так он почему-то принимает имена типов линий только "в лоб" - в чистом виде, в кавычках и прямо, только строку - переменную как символ мне ему скормить мне не удалось. Это когда я допиливал программу для копирования объектов из внешней ссылки в файл. Она вылетала при попытке скопировать линию, тип которой не определен в текущем файле. Так и пришлось "красть" все типы линий. Надо будет, кстати, выложить получившееся чудо в соответствующей теме....
Offtop: VVA, кстати, цитата - не моя .
skkkk вне форума  
 
Непрочитано 22.01.2017, 13:04
#3226
kurstep


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


Подскажите функцию на ЛИСП по сравнению сложных списков (вложенных и не не обязательно цифровых) (например такого типа как на рисунке)
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.PNG
Просмотров: 40
Размер:	4.1 Кб
ID:	182396  
kurstep вне форума  
 
Непрочитано 22.01.2017, 15:30
#3227
Кулик Алексей aka kpblc
Moderator

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


А что ты собираешься сравнивать? Если на индентичность - то equal и вперед.

----- добавлено через ~3 мин. -----
Хотя, возможно, удастся обойтись и простым "="
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.01.2017, 15:40
#3228
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,035


а еще есть vl-every, хотя она вложенные списки не обрабатывает, похоже
Сергей812 вне форума  
 
Непрочитано 22.01.2017, 19:57
#3229
kurstep


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


Да, спасибо уже разобрался, equal подходит)
kurstep вне форума  
 
Автор темы   Непрочитано 28.01.2017, 03:50
#3230
Red Nova

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


Подскажите плиз, как разделить selection set на два?
Нужно выбрать один раз рамкой объекты на чертеже, затем из выбранного все блоки собрать в ssetA, а все полилинии в ssetB.
Если сделать по очереди и выбрать два раза то все понятно:
Код:
[Выделить все]
 (setq ssetA (ssget '((0 . "INSERT")(66 . 1))))
(setq ssetB (ssget '((0 . "*POLYLINE"))))
Вот только выбрать нужно один раз, а дальше фильтровать исходный sset.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.01.2017, 06:10
#3231
skkkk


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


Red Nova, пожалуй самый простой для понимания вариант - безо всяких "лямбд" (припоминаю, что ты их не очень любил) и сторонних функций - будет примерно таким:
Код:
[Выделить все]
 (setq ssetA (ssadd) ;;; создаем пустой набор для блоков
	  ssetB (ssadd) ;;; и пустой набор для полилиний
	  sset (ssget)  ;;; запрашиваем у пользователя выбор рамкой 
)
(cond 
  (	sset
	(repeat (setq i (sslength sset)) ;;; повторяем столько раз, сколько объектов в наборе
		(cond 
		  (	(and 
				(wcmatch (cdr (assoc 0 (entget (setq en (ssname sset (setq i (1- i))))))) "INSERT") ;;; если объект - блок
				(= (cdr (assoc 66 (entget en))) 1) ;;; и содержит атрибуты
			)
			(ssadd en ssetA) ;;; добавляем его к набору блоков
			(ssdel en sset)  ;;; и удаляем из общего набора, чтоб в дальнейшем заново весь набор не перебирать
		  )
		) ;;; cond
	) ;;; repeat
	(repeat (setq i (sslength sset)) ;;; аналогично - с полилиниями
		(cond 
		  (	(wcmatch (cdr (assoc 0 (entget (setq en (ssname sset (setq i (1- i))))))) "*POLYLINE")
			(ssadd en ssetB)
			(ssdel en sset)
		  )
		) ;;; cond
	) ;;; repeat
	(princ 
		(strcat
			"\nБлоков с атрибутами: " (itoa (sslength ssetA))
			"\nПолилиний: " (itoa (sslength ssetB))
		)
	)
	(princ)
  )
  (	T
	(princ "\nОбъекты не выбраны")
	(princ)
  )
) ;;; cond
Можно и поизящнее, с использованием lambda и семейства vl-remove-..., предварительно преобразовав набор в список примитивов сторонними функциями (допустим, _dwgru-conv-pickset-to-list). Но мы оставим это более опытным участникам дискуссиии
Полагаю, кто-нибудь решит эту задачку за пару-тройку строк.
skkkk вне форума  
 
Автор темы   Непрочитано 28.01.2017, 08:42
#3232
Red Nova

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


skkk, Спасибо за столь подробный ответ . Переварил, переосмыслил и вот сделал по своему.
Цитата:
Можно и поизящнее, с использованием lambda и семейства vl-remove-..., предварительно преобразовав набор в список примитивов сторонними функциями (допустим, _dwgru-conv-pickset-to-list). Но мы оставим это более опытным участникам дискуссиии
Полагаю, кто-нибудь решит эту задачку за пару-тройку строк.
Ну с лямбдой я помирился )). На самом деле когда я только начинал эту тему я тогда из за нагрузки на работе так и не вник в программирование, но за последние несколько месяцев немного освоился. А вот получать свойства entity применяя assoc пока не приходилось.
Код:
[Выделить все]
   
(defun c:test ( / )
(setq mainselection (ssget)
	blkselection (ssadd)
	Polylines (ssadd))
  (setq mainselection (LM:ss->ent mainselection))

  (foreach n mainselection
    (if
      (and
	(wcmatch (cdr (assoc 0 (entget n))) "INSERT")
	(= (cdr (assoc 66 (entget n))) 1))
      (ssadd n blkselection)
      );if
    );foreach

  (foreach n mainselection
    (if
      (wcmatch (cdr (assoc 0 (entget n))) "*POLYLINE")
      (ssadd n Polylines)
      );if
    );foreach
);defun

(defun LM:ss->ent ( ss / i l )
    (if ss
        (repeat (setq i (sslength ss))
            (setq l (cons (ssname ss (setq i (1- i))) l))
        )
    )
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.01.2017, 09:10
#3233
Дима_

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


Да уж, ну вот вам тогда "сложный" вариант:
Код:
[Выделить все]
 (vl-load-com)
(defun splitss (ss)
((lambda (ssa ssb lst)
   (mapcar '(lambda (ent)
              ((lambda (tp) (cond ((wcmatch tp "INSERT") (ssadd ent ssa))
                                  ((wcmatch tp "*POLYLINE") (ssadd ent ssb))
                                  (T nil)))
               (cdr (assoc 0 (entget ent))))) lst)
   (list ssa ssb))
 (ssadd) (ssadd)
 (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
вызов (splitss (ssget))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 29.01.2017, 09:15
#3234
Red Nova

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


Дима_ Да уж, это по сложнее будет ))
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.01.2017, 12:32
#3235
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


А как такой вариант
Код:
[Выделить все]
 
(setq ssetA nil
	    ssetB nil
	    ssetA (ssadd) ;;; создаем пустой набор для блоков
	    ssetB (ssadd) ;;; и пустой набор для полилиний
	    sset (ssget)  ;;; запрашиваем у пользователя выбор рамкой 
)
(vl-cmdf "_zoom" "_o" sset "")
(sssetfirst nil sset)
(setq ssetA (ssget '((0 . "INSERT")))) ;;; набор из блоков
(sssetfirst nil sset)
(setq ssetB (ssget '((0 . "*POLYLINE")))) ;;; набор из полилиний
(vl-cmdf "_zoom" "_p" "")

Последний раз редактировалось roaa, 29.01.2017 в 12:52.
roaa вне форума  
 
Непрочитано 30.01.2017, 11:10
#3236
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Дима_, данную структуру кода встречаю не первый раз, но каждый раз возникает вопрос
"((lambda (ssa ssb lst)..." какую функцию можно использовать между первой и второй скобкой в "((lambda...", не понимаю.
sdv79 вне форума  
 
Непрочитано 30.01.2017, 13:52
#3237
Дима_

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


(lambda ...) возвращает функцию, соответственно ((lambda ...) arg...) запускает ее с аргументами arg..., между первой и второй скобкой можно поставить любую функцию которая принимает функцию как аргумент.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 01.02.2017, 04:52
#3238
Red Nova

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


roaa
Спасибо, Коротко. Но пару вопросов.
1.
В чем смысл зуммировать?:
(vl-cmdf "_zoom" "_o" sset "")
(vl-cmdf "_zoom" "_p" "")
Работает и без этого.
2.
Правильно ли я понял что (sssetfirst nil sset) отключает выбор рамкой и ssget берет предыдущий выбор за основу?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 01.02.2017, 07:33
#3239
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Выбор ssget происходит на видимой части экрана, поэтому зуммируем выбранное (после возвращаем к исходному виду). (sssetfirst nil sset) производит выделение набора sset, а ssget подхватывает... как-то так.
В виде функции:
Код:
[Выделить все]
 ;;; (sssplit (ssget) '((0 . "INSERT")(66 . 1)))
(defun sssplit (sset splitlist) (sssetfirst nil sset)(ssget splitlist))

Последний раз редактировалось roaa, 06.02.2017 в 22:17.
roaa вне форума  
 
Автор темы   Непрочитано 02.02.2017, 03:41
#3240
Red Nova

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


Спасибо. (sssetfirst nil sset) оказалось очень полезна. Вроде как логика ясна.
Но на счет зуммирования не убежден, так как работает и без этого.
__________________
Блог
Red Nova вне форума  
Ответ
Вернуться   Форум 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