dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Не могу взорвать вложенные блоки

Lisp. Не могу взорвать вложенные блоки

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 30.09.2016, 17:19 #1
Lisp. Не могу взорвать вложенные блоки
Composter
 
Отопление и вентиляция
 
Москва
Регистрация: 31.10.2008
Сообщений: 363

Composter вне форума Вставить имя

Хочу сделать так чтобы можно было взравть блоки по маске , в том числе вложенные
но в результате липа, внутри блока искомый блок взрывается (так как под ним образуются примитивы из которых он состоит) но сам остается на месте
Код:
[Выделить все]
 (defun zd144 ( ish_name  /  )
(vlax-for block_name (vla-get-blocks(vla-get-activedocument(vlax-get-acad-object)))
	(vlax-for vlog_block_name block_name
		(if (vlax-property-available-p vlog_block_name 'EffectiveName)
			(if
				(wcmatch  (vla-get-EffectiveName vlog_block_name) (strcat "*" ish_name "*"))
				(vla-Explode vlog_block_name )
			)
		);_end_of_if
	);_end_of_vlax-for
);_end_of_vlax-for
(vlax-for block_name (vla-get-blocks(vla-get-activedocument(vlax-get-acad-object)))
		(if (vlax-property-available-p block_name 'EffectiveName)
			(if
				(wcmatch  (vla-get-EffectiveName block_name) (strcat "*" ish_name "*"))
				(vla-Explode block_name )
			)
		);_end_of_if
);_end_of_vlax-for
(princ)
)
Просмотров: 1479
 
Непрочитано 30.09.2016, 18:42
#2
Дима_

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


Это стандартное поведение vla-explode. Если вхождение блока больше не нужно - его надо удалить.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 30.09.2016, 18:52
#3
frostmourn


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


По-моему, не о том вопрос - там второй vlax-for пытается взорвать определение блока. И у него это вполне ожидаемо не получается.
Composter, попробуйте так
Код:
[Выделить все]
 
(vlax-for space (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object)))
	(vlax-for block_name (vla-get-Block space)
		(and
			(= (vla-get-objectname block_name) "AcDbBlockReference")
			(= (vla-get-IsDynamicBlock block_name) :vlax-true)
			(wcmatch (vla-get-EffectiveName block_name) (strcat "*" ish_name "*"))
			(vla-Explode block_name)
		)
	)
)
frostmourn вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 30.09.2016, 19:04
#4
Кулик Алексей aka kpblc
Moderator

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


А если внутри блока солиды... А если он вставлен еще и не с равными масштабами... Уже разбирал: http://autolisp.ru/2014/07/29/explode-vs-vla-explode/
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 30.09.2016, 19:11
#5
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 363


спасибо .сделал так
Код:
[Выделить все]
 (defun zd144 ( ish_name  /  )
(vlax-for block_name (vla-get-blocks(vla-get-activedocument(vlax-get-acad-object)))
	(vlax-for vlog_block_name block_name
		(if (vlax-property-available-p vlog_block_name 'EffectiveName)
			(if
				(wcmatch  (vla-get-EffectiveName vlog_block_name) (strcat "*" ish_name "*"))
				(progn
					(vl-catch-all-apply '(lambda () (vla-Explode vlog_block_name )))
					(vl-catch-all-apply '(lambda () (vla-erase vlog_block_name)))
				)
			)
		);_end_of_if
	);_end_of_vlax-for
);_end_of_vlax-for
(vlax-for block_name (vla-get-blocks(vla-get-activedocument(vlax-get-acad-object)))
		(if (vlax-property-available-p block_name 'EffectiveName)
			(if
				(wcmatch  (vla-get-EffectiveName block_name) (strcat "*" ish_name "*"))
				(progn
					(vl-catch-all-apply '(lambda () (vla-Explode block_name )))
					(vl-catch-all-apply '(lambda () (vla-erase block_name)))
				)
			)
		);_end_of_if
);_end_of_vlax-for
(princ)
)
(defun C:zd144()(zd144))
Composter вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 30.09.2016, 19:39
#6
Кулик Алексей aka kpblc
Moderator

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


Ты не учитываешь вариант, что разбития не произошло. И все равно удаляешь вхождение. Точнее, пытаешься: мне достаточно будет заблокировать слои - и программа работать не будет.
Кстати, а зачем ты два раза повторяешь одно и то же?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 02.10.2016, 16:59
#7
frostmourn


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


Цитата:
Сообщение от Composter Посмотреть сообщение
спасибо .сделал так
А это так и задумано, что обрабатываются и статические, и динамические блоки?
frostmourn вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 03.10.2016, 10:36
#8
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 363


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Кстати, а зачем ты два раза повторяешь одно и то же?
в перый раз ропверяет вложенные элементы в блоках, во второй ищет сам блок.
Цитата:
Сообщение от frostmourn Посмотреть сообщение
А это так и задумано, что обрабатываются и статические, и динамические блоки?
если у этих блоков один префикс, то тем более они не нужны )
Composter вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 03.10.2016, 11:18
#9
Кулик Алексей aka kpblc
Moderator

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


Меня ты явно не услышал. В блок загони 3Д-солид, вставь его с неравными масштабами внутрь другого блока и выполни свою функцию. Это раз. Второе: есть такая штука, repeat называется. Третье: попробуй пошагово выполнить свой код. Что-то я подозреваю, что во второй цикл (точнее, в vla-explode) ты и не зайдешь. И последнее: слои пофигу? Ошибки выполнения тоже?
В качестве первого приближения, написано без тестирования, исключительно в иллюстративных целях (поэтому критика не принимается, вот такая я дрянь ):
Код:
[Выделить все]
 (vl-load-com)

(defun dwgru-explode-and-erase (block-name / doc layers err name lastent sysvar)
  (setq sysvar (vl-remove nil
                          (mapcar (function (lambda (x / tmp)
                                              (if (setq tmp (getvar (car x)))
                                                (progn (setvar (car x) (cdr x)) (cons (car x) tmp))
                                                ) ;_ end of if
                                              ) ;_ end of lambda
                                            ) ;_ end of function
                                  '(("sysmon" . 0) ("explmode" . 1))
                                  ) ;_ end of mapcar
                          ) ;_ end of vl-remove
        ) ;_ end of setq
  (vlax-for item (vla-get-layers (setq doc (vla-get-activedocument (vlax-get-acad-object))))
    (setq layers (cons (cons item
                             (mapcar (function (lambda (prop / tmp)
                                                 (setq tmp (vlax-get-property item prop))
                                                 (vl-catch-all-apply (function (lambda () (vlax-put-property item prop :vlax-false))))
                                                 (cons prop tmp)
                                                 ) ;_ end of lambda
                                               ) ;_ end of function
                                     '("freeze" "lock")
                                     ) ;_ end of mapcar
                             ) ;_ end of cons
                       layers
                       ) ;_ end of cons
          ) ;_ end of setq
    ) ;_ end of vlax-for
  (if (vl-catch-all-error-p
        (setq err (vl-catch-all-apply
                    (function
                      (lambda (/ _err)
                        (vlax-for blk_def (vla-get-blocks doc)
                          (if (and (not (wcmatch (strcase (vla-get-name blk_def)) (strcase block-name)))
                                   (equal (vla-get-isxref blk_def) :vlax-false)
                                   ) ;_ end of and
                            (vlax-for subent blk_def
                              (if (and (wcmatch (strcase (vla-get-objectname subent)) "*BLOCK*")
                                       (setq name (cond ((vlax-property-available-p subent 'effectivename) (vla-get-effectivename subent))
                                                        ((vlax-property-available-p subent 'name) (vla-get-name subent))
                                                        ) ;_ end of cond
                                             ) ;_ end of setq
                                       (wcmatch (strcase name) (strcase block-name))
                                       ) ;_ end of and
                                (progn (setq lastent (entlast))
                                       (if (or (vl-catch-all-error-p (setq _err (vl-catch-all-apply (function (lambda () (vla-explode subent))))))
                                               (equal lastent (entlast))
                                               ) ;_ end of or
                                         (princ (strcat "\n** error explode block \""
                                                        name
                                                        "\" inside block \""
                                                        (vla-get-name blk_def)
                                                        "\" : "
                                                        (vl-catch-all-error-message _err)
                                                        ) ;_ end of strcat
                                                ) ;_ end of princ
                                         (if (vl-catch-all-error-p (setq _err (vl-catch-all-apply (function (lambda () (vla-erase subent))))))
                                           (princ (strcat "\n** error erasing block \""
                                                          name
                                                          "\" inside blocks \""
                                                          (vla-get-name blk_def)
                                                          "\" : "
                                                          (vl-catch-all-error-message _err)
                                                          ) ;_ end of strcat
                                                  ) ;_ end of princ
                                           ) ;_ end of if
                                         ) ;_ end of if
                                       ) ;_ end of progn
                                ) ;_ end of if
                              ) ;_ end of vlax-for
                            ) ;_ end of if
                          ) ;_ end of vlax-for
                        ) ;_ end of lambda
                      ) ;_ end of function
                    ) ;_ end of vl-catch-all-apply
              ) ;_ end of setq
        ) ;_ end of vl-catch-all-error-p
    (princ (strcat "\n** error ** : " (vl-catch-all-error-message err)))
    ) ;_ end of if
  (foreach item layers
    (foreach prop (cdr item)
      (vl-catch-all-apply (function (lambda () (vlax-put-property item (car prop) (cdr prop)))))
      ) ;_ end of foreach
    ) ;_ end of foreach
  (foreach item sysvar (setvar (car item) (cdr item)))
  ) ;_ end of defun
----- добавлено через ~7 ч. -----
Ну, а очистку сам сделаешь
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.12.2017, 11:19
#10
ServantosS


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
исключительно в иллюстративных целях
Алексей, а могли бы прокомментировать, тема интересная. У меня этот код не выполняется, появляется сообщение:
Команда: (dwgru-explode-and-erase)
; ошибка: слишком мало аргументов

Что может быть не так?
запускаю в AutoCAD 2014 SP1
ServantosS вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.12.2017, 11:23
#11
Кулик Алексей aka kpblc
Moderator

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


Так а имя блока кто будет указывать?
http://dwg.ru/pub/9
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.12.2017, 13:57
#12
ServantosS


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Так а имя блока кто будет указывать?
Не понимаю, как это делается. В программировании в лиспе я 0. Как лиспы использовать читал, другие устанавливал без проблем. Но коды в этой теме какие-то особые, похоже, не полные. Как прикрутить к ним нужные блоки не понимаю.
ServantosS вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.12.2017, 14:11
#13
Кулик Алексей aka kpblc
Moderator

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


(dwgru-explode-and-erase (vla-get-effectivename (vlax-ename->vla-object (car (entsel "\nSelect block : ")))))
Примерно так
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.12.2017, 15:55
#14
ServantosS


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(dwgru-explode-and-erase (vla-get-effectivename (vlax-ename->vla-object (car (entsel "\nSelect block : ")))))
Примерно так
Выбор работает хорошо. Спасибо. Но вот с лиспом (или с моим автокадовским файлом) что-то не так. После выполнения лиспа блок 1 уровня взорван, внутренние блоки остались целыми и часть элементов просто исчезает. А хочется, чтобы взрывались все внутренние блоки (в том числе с многоуровневым вложением), как статичные, так и динамические, блок 1 уровня оставался целым. И совсем было бы круто обрабатывать все блоки в чертеже за раз. Вот такая у меня мечта.
Вложения
Тип файла: dwg
DWG 2013
деблок_тест.dwg (451.2 Кб, 2 просмотров)
ServantosS вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Не могу взорвать вложенные блоки

Инженерные консультации
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бетонные блоки у дороги - расстояние Apelsinov Прочее. Отраслевые разделы 9 10.09.2014 11:29
Autolisp Шифрование LISP файлов mikls LISP 4 07.06.2014 16:16
Динамические блоки при копировании перестают быть динамическими. *Voland* AutoCAD 11 04.07.2012 10:51
LISP. Не могу поставить диаметр окружности Буджум LISP 7 21.10.2009 09:54
Lisp. Изменение свойств у ячеек таблицы. Не могу докопаться до vla объекта. Kirzaa LISP 2 21.09.2009 10:32

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||