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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Рекурсия. перевод блока со всеми вложениями в слой "0".

Рекурсия. перевод блока со всеми вложениями в слой "0".

Ответ
Поиск в этой теме
Непрочитано 23.02.2014, 18:56 #1
Рекурсия. перевод блока со всеми вложениями в слой "0".
nolte
 
спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188

Осваиваю рекурсию и для задачи взялся за решение перевода блока со всеми вложениями в слой "0", но чего то не то делаю. В этой версии, лисп просто выбивает автокад. Кто то может подсказать в чем затыка.
Код:
[Выделить все]
 
(defun c:33 () ;(/ doc bls new_set i lst n)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(setq bls (vla-get-blocks doc))
(setq new_set (ssget "_W" (getpoint "\nPOINT 1") (getpoint "\nPOINT2")))
(setq i -1 n 0)
; получил список только блоков из набора
(repeat (sslength new_set)
	(if (wcmatch (vla-get-objectname (vlax-ename->vla-object (ssname new_set (setq i (1+ i))))) "AcDbBlo*")
		(setq lst (cons (vlax-ename->vla-object (ssname new_set i)) lst))
	)
)
; запустил рекурсию
(l:chan_bl_lay lst n)
)

; функция рекурсии
(defun l:chan_bl_lay (lst n)
(mapcar '(lambda (x)
		(setq bl (vla-item bls (vla-get-name x)))

; пробежал по вхождениям блока и если вхождение не блок (простой примитив типа линии)
;то поменял слой и цвет примитива по слою.
;если вхождение блок, то запустил функцию заново
		(vlax-for i bl
			(if (not (= (vla-get-objectname i) "AcDbBlockReference"))
				(progn
					(vla-put-layer i "0")
					(vla-put-color i 256)
				)
				(l:chan_bl_lay (list x) n)
			)

; если блок содержит атрибуты, то снова перенес на слой "0" и цвет bylayer
			(if (= (vla-get-hasattributes x) :vlax-true)
				(mapcar '(lambda (a)
                                                 (vla-put-color a 256) (vla-put-layer a "0")
                                              )
					(vlax-safearray->list (vlax-variant-value (vla-getattributes x)))
				)
			)
; обновил блок
			(vla-update x)
		) ; end vlax-for
	) ; end lambda
; список для каждого вхожда в рекурсию свой со своим именем
	(set (read (strcat "lst" (itoa (setq n (1+ n))))) lst)
) ; end mapcar
) ; end func
без рекурсии все работает чудно, но только для первого вхождения.
__________________
Знание лисп: со справочником Н. Полещука

Последний раз редактировалось Кулик Алексей aka kpblc, 23.02.2014 в 22:06.
Просмотров: 2520
 
Непрочитано 23.02.2014, 20:05
#2
Дима_

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


Цитата:
Сообщение от nolte Посмотреть сообщение
чего то не то делаю.
Вот это справедливое утверждение, а соответственно понять что ты имел в виду своим уникальным алгоритмом тоже не просто. Либо закомментируй пошагово, что ты хочешь получить от своих строк (ведь делает он явно не то что ты хочешь), либо поищи схожий рабочий пример и делай по аналогии.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 23.02.2014, 22:08
#3
Кулик Алексей aka kpblc
Moderator

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


Есть тема в "Готовых", кажется: "Нормализация блоков". Там, насколько я помню, рекурсия в полный рост. Есть еще одна: "подготовка подосновы". Там тоже без рекурсии не обошлось.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Рекурсия. перевод блока со всеми вложениями в слой "0".

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мои макрокоманды zenon Программирование 1009 сегодня 13:59
Линии электрических соединений Shoorup Программирование 23 07.02.2015 15:13
Проблема с базовой точкой блока и вхождением блока в DXF nogaems Программирование 5 29.08.2013 15:46
Перевод имени блока в имя переменной и обратно Supermax Программирование 11 14.12.2009 23:26