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

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

Помогите изменить программу поиска и замены отдельных блоков на их глобальную замену

Ответ
Поиск в этой теме
Непрочитано 24.03.2024, 12:06 #1
Помогите изменить программу поиска и замены отдельных блоков на их глобальную замену
lexa_CAD
 
Регистрация: 07.02.2024
Сообщений: 7

Есть найденная на форуме программа №1 поиска и замены выборочных блоков common_block_replacing v00.lsp (добавил в нее только копирование угла поворота). Она работает.
Есть найденная на просторах интернета программа №2 выбора всех вхождений выбранного блока в чертеже. prog-same-block-select.lsp Тоже рабочая.

Не удается "скрестить" эти программы, чтобы производить замену всех вхождений выбранных блоков.
Насколько понимаю, для этого необходимо поместить в переменную substituted_inserts_sset (из программы №1 в строке 100) набор из переменной "е" из программы №2.

(setq substituted_inserts_sset e)

Но, почему-то, результата нет.
Прошу помощи у Гуру в AutoLISP !

Код:
[Выделить все]
 ;**********функция выбора всех вхождений выбранного блока***********
(defun sb    (/ e name n out ss x rjp-getblockname)
;;;(vl-load-com)
(prompt "\n   Pick BLOCK to acquire its instances in the drawing...") 
 (defun rjp-getblockname (obj)
   (if    (vlax-property-available-p obj 'effectivename)
     (vla-get-effectivename obj)
     (vla-get-name obj)
   )
 )
 (if (setq x     (ssget '((0 . "INSERT")))
       x     (ssname x 0)
       name (rjp-getblockname (vlax-ename->vla-object x))
       ss     (ssget "_X" '((0 . "INSERT")))
       n     -1
       out     (ssadd)
     )
   (while (setq e (ssname ss (setq n (1+ n))))
     (if (= (rjp-getblockname (vlax-ename->vla-object e)) name)
   (ssadd e out)
   
     )
   )
   (setq substituted_inserts_sset e) ;;; копирование полученного набора во внешнюю переменную
 )

 (princ)
 (sssetfirst nil out)

)
участок кода, в который пытаюсь вставлять результат работы функции sb. Если я правильно понимаю, я должен вызвать SB и потом присвоить набору substituted_inserts_sset значение e:
(setq substituted_inserts_sset e) :

Код:
[Выделить все]
 (
					(= 1 init_step)
						(prompt "Выберите заменяемые блоки:")
						(setvar 'nomutt 1)
						(setq ignore_empty_sset (and
							   						(null command_terminated)
							   						(while (null (setq substituted_inserts_sset (vl-catch-all-apply 'ssget (list '((0 . "insert")))))))
						  			)
							substituted_inserts_sset (cond
							  							(
															(vl-catch-all-error-p substituted_inserts_sset)
																(setq command_terminated t)
														)
														(
															t
																substituted_inserts_sset
														)
										)
						)
						(setvar 'nomutt 0)
						(if command_terminated
								(setq initiating nil
									  substituted_inserts_sset (princ "\nОтмена")
									  substituted_inserts_sset (ssadd)
								)
								(setq init_step (1+ init_step)
									  active_space_object (vlax-ename->vla-object (cdr (assoc -1 (entget (cdr (assoc 330 (entget (ssname substituted_inserts_sset 0))))))))
								)
						)
				)
Верно? Что может пойти не так?

Вложения
Тип файла: lsp prog-same-block-select.lsp (1.5 Кб, 7 просмотров)
Тип файла: lsp common_block_replacing v00.lsp (9.7 Кб, 10 просмотров)


Последний раз редактировалось lexa_CAD, 25.03.2024 в 16:25.
Просмотров: 1648
 
Непрочитано 26.03.2024, 08:23
1 | #2
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Код:
[Выделить все]
  (setq substituted_inserts_sset e) ;;; копирование полученного набора во внешнюю переменную
Здесь е - не набор, а имя элемента. набор - out.
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 26.03.2024 в 08:31.
===AAA=== вне форума  
 
Автор темы   Непрочитано 26.03.2024, 15:05
#3
lexa_CAD


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


Спасибо!

Беру теперь набор из out, преобразовав имя объекта предварительно обратно в "классическое".
Теперь программа sb не работает. ;(

Код:
[Выделить все]
 ;**********функция выбора всех вхождений выбранного блока***********
(defun sb    (/ e name n out ss x rjp-getblockname)
(vl-load-com)
(prompt "\n   Pick BLOCK to acquire its instances in the drawing...") 
 (defun rjp-getblockname (obj)
   (if    (vlax-property-available-p obj 'effectivename)
     (vla-get-effectivename obj)
     (vla-get-name obj)
   )
 )
 (if (setq x     (ssget '((0 . "INSERT")))
       x     (ssname x 0)
       name (rjp-getblockname (vlax-ename->vla-object x))
       ss     (ssget "_X" '((0 . "INSERT")))
       n     -1
       out     (ssadd)
     )
   (while (setq e (ssname ss (setq n (1+ n))))
     (if (= (rjp-getblockname (vlax-ename->vla-object e)) name)
   (ssadd (vlax-vla-object->ename e) out) ;;;преобразование имени объекта в "стандартное" (для ssget )
   
     )
   )
   (setq substituted_inserts_sset out) ;;; копирование полученного набора во внешнюю переменную
 )

 (princ)
  
 ;;;(sssetfirst nil out)

)
Как вставить правильно этот кусок в код ниже?

Миниатюры
Нажмите на изображение для увеличения
Название: common block replacing-changing.jpg
Просмотров: 127
Размер:	141.1 Кб
ID:	262322  

Последний раз редактировалось lexa_CAD, 28.03.2024 в 09:33.
lexa_CAD вне форума  
 
Непрочитано 27.03.2024, 19:40
1 | #4
Кулик Алексей aka kpblc
Moderator

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


Чтобы передать набор (если что код не смотрел), вместо (princ) в конце должно быть out. И насколько надо передавать именно набор - я не знаю. Я бы передавал, наверное, список.
И насчет "классических" имен я бы поспорил
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.03.2024, 19:58
1 | #5
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Цитата:
(setq substituted_inserts_sset out) ;;; копирование полученного набора во внешнюю переменную
И почему эта строка стоит, как false в if - тоже непонятно.

Может быть, её в progn спрятать нужно?

Код - если что - смотрел "по диагонали".

... или просто эту строку вообще за if убрать нужно, т.е. на одну строку
ниже опустить...
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 28.03.2024 в 11:00.
===AAA=== вне форума  
 
Непрочитано 30.03.2024, 16:52
1 | #6
name02


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


Вот тут https://www.cadforum.cz/en/download.asp?fileID=1019 программу, которая делает почти все что ты указал.

RIblock.zip
name02 вне форума  
 
Непрочитано 01.04.2024, 12:11
1 | #7
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от lexa_CAD Посмотреть сообщение
Помогите изменить программу поиска и замены отдельных блоков
за сына педро ничего не скажу, от себя могу предложить вариант глобальной замены.
Вложения
Тип файла: lsp common_block_replacing_2.lsp (8.5 Кб, 15 просмотров)
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 02.04.2024, 16:05
#8
lexa_CAD


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


Спасибо огромное, что подключились, koMon !
Работает ! Можно сделать выбор сразу нескольких заменяемых блоков группой (рамкой или иными стандартными способами)?

Причём, замена должна быть действительно глобальной (блоки внутри других блоков тоже должны замениться)

Последний раз редактировалось lexa_CAD, 04.04.2024 в 15:50.
lexa_CAD вне форума  
 
Автор темы   Непрочитано 03.04.2024, 10:15
#9
lexa_CAD


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


name02, Спасибо, попробовал. Но по какой то причине не работает выбор по маске. Выбирается только часть блоков.
lexa_CAD вне форума  
 
Непрочитано 04.04.2024, 07:46
#10
name02


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


Цитата:
Сообщение от lexa_CAD Посмотреть сообщение
Можно сделать выбор сразу нескольких заменяемых блоков группой (окном)?
Можно - в строке 96 удали текст "_X"
name02 вне форума  
 
Автор темы   Непрочитано 04.04.2024, 15:54
#11
lexa_CAD


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Можно - в строке 96 удали текст "_X"
К сожалению, предложенное изменение не работает.
Видимо, в данный набор (запрашиваемый в строке 96) должен попадать только один-единственный объект.
Ранее я прикладывал программу для выбора всех блоков с одинаковым именем. Точнее, почти всех, так как вложенные блоки не обрабатываются, что печально.
lexa_CAD вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите изменить программу поиска и замены отдельных блоков на их глобальную замену



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пропадают динамические свойства блоков Stas_S Динамические блоки 6 15.01.2024 14:07
LISP. Очистка рисунка от "пустых" блоков Makswell Готовые программы 15 26.10.2022 15:24
Почему в Автокад нет команды обновления структуры блоков при вставке блоков через буфер обмена? МишаИнженер AutoCAD 6 21.11.2012 12:07
Необходимость замены оконных блоков при кап. ремонте olga6352 Прочее. Архитектура и строительство 4 07.09.2012 15:10
VBA: утечка памяти при вставке блоков Mikha Программирование 13 03.04.2009 09:18