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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Список блоков с растрами

Список блоков с растрами

Ответ
Поиск в этой теме
Непрочитано 27.07.2010, 18:58 #1
Список блоков с растрами
petr.vubrikv
 
Регистрация: 14.03.2006
Сообщений: 23

Помогите пожалуйста создать на lisp список блоков чертежа, содержащих растровые картинки, если таковые имеются. Это должно быть в виде типа
((("Block1") ("Карта1")) (("Block2") ("Карта21" "Карта22")) (...) ...........)

Большое спасибо.
Просмотров: 2728
 
Непрочитано 27.07.2010, 19:10
#2
gomer

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


В справке для разработчика все написано...
gomer вне форума  
 
Непрочитано 27.07.2010, 20:31
#3
Дима_

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


Код:
[Выделить все]
(vl-load-com)
(defun listblock (obj / lst) ; возращает список примитивов во вхождении блока, либо блоке obj.
(if (or (= (type obj) 'str) (= (cod 0 obj) "INSERT"))
(progn
(if (= (type obj) 'ename) (setq obj (cod 2 obj)))
(setq obj (cdr (assoc -2 (tblsearch "BLOCK" obj))))
(while obj
(setq	lst (cons obj lst)
	obj (entnext obj)
);end of setq
);end of while
));end of progn&if
(reverse lst)
);end of listblock

(defun tblnamelist ( tbl / obj lst) ;возращает список запрашиваемых объектов: "block","layer" итп.
(setq obj (tblnext tbl T))
(while obj (setq lst (append lst (list (cdr (assoc 2 obj)))) obj (tblnext tbl)))
lst
);end of blocknamelist

(vl-remove-if-not 'cdr
(mapcar '(lambda (name)
		(cons name (vl-remove nil (mapcar '(lambda (ent)
	(if (= (cdr (assoc 0 (entget ent))) "IMAGE") (vla-get-name (vlax-ename->vla-object ent))))
	(listblock name)))))
(tblnamelist "block")))
жирный кусок "вставь" по назначению
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 27.07.2010, 20:59
#4
gomer

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


я думаю список так должен выглядить вообще-то(асоциативно т.е.):
'(("Block1" . ("Карта1")) ("Block2" . ("Карта21" "Карта22")) (...) ....)
gomer вне форума  
 
Непрочитано 27.07.2010, 22:57
#5
Дима_

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


Для ассоциативности вполне достаточно '(("block" "карта1" "карта2"...)), как впрочем и сделанно у автодеска во всех DXF длинне пары.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 28.07.2010, 16:49
#6
petr.vubrikv


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


Дима_
Ох, и не знаю как благодарить. Выручили.
И насчет ассоциативности я с Вами согласен: '(("block" "карта1" "карта2"...)) ,-самое то !
Спасибо.

Последний раз редактировалось petr.vubrikv, 28.07.2010 в 16:57.
petr.vubrikv вне форума  
 
Автор темы   Непрочитано 30.07.2010, 14:11
#7
petr.vubrikv


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


Дима_
Прошу прощения, не подскажете, что за функция такая "cod" у Вас применена ?

(defun listblock
...
(if (or (= (type obj) 'str) (= (cod 0 obj) "INSERT"))
...
(if (= (type obj) 'ename) (setq obj (cod 2 obj)))
...

Спасибо.
petr.vubrikv вне форума  
 
Непрочитано 30.07.2010, 14:30
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Отвечу за Диму. Ф-ция возвращает первое вхождение точечной пары DXF списка. Переименуй ф-цию ниже в cod
Код:
[Выделить все]
;|  ! ***************************************************************************
;; !                           lib:dxf
;; ! ***************************************************************************
;; ! Function : Returns the first occurence of a DXF dotted pair from a list
                Возвращает первое вхождение точечной пары DXF списка
;; ! Argument : 'n'     - The DXF code to check / DXF код
;; !            'lst' -    The List to check  / Список
;; ! Returns  : The value of the DXF dotted pair, if it exists else returns nil
                Значение точечной пары, если есть или nil
;; ! ****************************************************************************|;

(defun lib:dxf (n lst)(if (= (type lst) 'ENAME)(setq lst (entget lst)))(cdr (assoc n lst)))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.07.2010, 16:13
#9
Дима_

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


Когда "выдергивал" из "своей библиотеки" проглядел - в "жирном" варианте до нее не "доходит" т.к. на вход всега поподает аргумент типа 'str. В "моем оригинале" вот она:
Код:
[Выделить все]
(defun cod (cd obj) ; возращает код cd примитива obj.
(if (and obj (= (type obj) 'ename))
(cdr (assoc cd (entget obj)))
));end of cod
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 03.08.2010, 09:13
#10
petr.vubrikv


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


Большое спасибо.
petr.vubrikv вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Список блоков с растрами



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Очистка рисунка от "пустых" блоков Makswell Готовые программы 15 26.10.2022 15:24
Подсчет и сортировка блоков на текущем слое. Помогите отредактировать. Kortes Программирование 17 26.03.2010 18:46
Получить список блоков в чертеже DonVik Программирование 6 27.08.2008 15:08
как создать список блоков, содержащихся в файле Александер Программирование 10 31.10.2007 15:50
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47