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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Не работает команда _overkill с определенным динамическим блоком

Не работает команда _overkill с определенным динамическим блоком

Ответ
Поиск в этой теме
Непрочитано 10.10.2022, 12:45 #1
Не работает команда _overkill с определенным динамическим блоком
psvnadwgru
 
Регистрация: 10.10.2022
Сообщений: 10

Здравствуйте. В файле есть скопированные друг на друга одинаковые динамические блоки с одинаковыми атрибутами. Но команда _overkill не удаляет дубликат. Файл с блоком прилагаю. Помогите решить проблему? AutoCAD 2019 — Русский (Russian). На других объектах команда работает исправно.

Вложения
Тип файла: dwg
DWG 2010
динблок.dwg (222.7 Кб, 11 просмотров)

Просмотров: 2341
 
Непрочитано 10.10.2022, 13:39
#2
Сергей812


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


а другие блоки удаляет дубликаты?)
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.10.2022, 13:54
#3
psvnadwgru


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


Да другие блоки удаляет. проблема именно в этом блоке. в нем присутствует какая-то гиперссылка. может дело в ней?
psvnadwgru вне форума  
 
Непрочитано 10.10.2022, 14:19
#4
AMDen

Инженер-проектировщик
 
Регистрация: 07.07.2016
Санкт-Петербург
Сообщений: 759


Значения параметров отличаются. Видимо на какие-то микроны. Возможно это из-за масштабирования в дюймах и округления.
AMDen вне форума  
 
Автор темы   Непрочитано 10.10.2022, 14:31
#5
psvnadwgru


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


Не должно быть никаких отличий, потому что блок копируется в ту же точку из которой был взят. А Вы пробовали удалить дубликат? у Вас тоже не удаляется? Можете попробовать перекопировать сами куда угодно, хоть в другой файл.
psvnadwgru вне форума  
 
Непрочитано 10.10.2022, 14:58
#6
Сергей812


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


Если два раза вставить блок с одинаковым значением атрибута - то оверкилом удаляется дубликат. А вот если скопировать - то команда игнорирует эти блоки.
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.10.2022, 15:05
#7
psvnadwgru


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


Требуется удалить скопированные дубликаты. Может всё-таки есть какое-то решение. Вручную очень долго. Причем это было замечено совершенно случайно. Дело в том, что из этих блоков формируется спецификация на производство. И заказчик может тупо вернуть все лишнее.
psvnadwgru вне форума  
 
Непрочитано 10.10.2022, 15:39
#8
Oleg T


 
Регистрация: 27.12.2011
Сообщений: 1,456


Цитата:
Сообщение от psvnadwgru Посмотреть сообщение
Здравствуйте. В файле есть скопированные друг на друга одинаковые динамические блоки с одинаковыми атрибутами. Но команда _overkill не удаляет дубликат. Файл с блоком прилагаю. Помогите решить проблему? AutoCAD 2019 — Русский (Russian). На других объектах команда работает исправно.
В приложенном файле блоки определяются как анонимные с разными именами, потому и не удаляются:
: (entget (car (entsel)))
Укажите объект: ((-1 . <Entity name: 7758f860>) (0 . "INSERT") (2 . "*U480")
: (entget (car (entsel)))
Укажите объект: ((-1 . <Entity name: 7758f860>) (0 . "INSERT") (2 . "*U455")

Это происходит после каких-либо действий, произведенных с динблоком (изменение размеров, например).
До этих действий имя блоков (2 . "Panel") не меняется и команда отрабатывает нормально
Oleg T вне форума  
 
Автор темы   Непрочитано 10.10.2022, 15:51
#9
psvnadwgru


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


У меня теперь работает команда. Лишние блоки удаляются. Как Вы это сделали? Гиперссылку редактировали? Точно также копирую в одну и туже точку и все лишнее удаляется.

Oleg T, как Вы это сделали? Теперь работает команда. Вы что-то с гиперссылкой сделали?

Последний раз редактировалось Кулик Алексей aka kpblc, 10.10.2022 в 15:56.
psvnadwgru вне форума  
 
Непрочитано 10.10.2022, 16:39
#10
Oleg T


 
Регистрация: 27.12.2011
Сообщений: 1,456


Цитата:
Сообщение от psvnadwgru Посмотреть сообщение
Oleg T, как Вы это сделали? Теперь работает команда. Вы что-то с гиперссылкой сделали?
Что я сделал? В выложенном файле с теми двумя блоками у меня команда тоже не работает, и я написал, в чём может быть причина.
Когда меняем длину в параметрах, блок становится анонимным. Программно его имя определяется как *U480 *U481 и т.п.
Теперь его нужно использовать только копированием, чтобы не менялось это имя, и в случае чего команда overkill сработает.
Если же поменяем длину (выставим такую же) у другого блока, то при их наложении overkill уже бесполезен.
Так что в случае с динблоками, насколько я понимаю, нужно или работать
максимально аккуратно, или искать другой надёжный способ удаления дубликатов.

Последний раз редактировалось Oleg T, 10.10.2022 в 16:49.
Oleg T вне форума  
 
Автор темы   Непрочитано 10.10.2022, 16:54
#11
psvnadwgru


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


Нет. Всё-таки не работает. Когда один блок копируется на другой такой же, то дубликат не удаляется. Если копировать один блок на него же, то удаляется. Я кажется понял: это команда NDB переименовывает все блоки даже с одинаковыми параметрами. Получается нужно пользоваться командой удаления дубликатов до команды NDB. Так что ли?
psvnadwgru вне форума  
 
Непрочитано 10.10.2022, 17:02
#12
Oleg T


 
Регистрация: 27.12.2011
Сообщений: 1,456


Кстати, проверить и найти расположение совпадающих блоков можно через извлечение данных (сортировать при необходимости в электронных таблицах по координатам), т.к. они различаются дескриптором.
Вот извлечение в исходном файле:
Миниатюры
Нажмите на изображение для увеличения
Название: Сохраненное изображение 2022-10-10_16-58-46.911.jpg
Просмотров: 35
Размер:	45.5 Кб
ID:	250424  
Oleg T вне форума  
 
Автор темы   Непрочитано 10.10.2022, 17:10
#13
psvnadwgru


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


Цитата:
Сообщение от Oleg T Посмотреть сообщение
Кстати, проверить и найти расположение совпадающих блоков можно через извлечение данных (сортировать при необходимости в электронных таблицах по координатам), т.к. они различаются дескриптором.
Вот извлечение в исходном файле:
Хорошая идея - спасибо
psvnadwgru вне форума  
 
Непрочитано 10.10.2022, 17:44
#14
Сергей812


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


"забавная" реализация копирования динблока - вместо того, чтобы сделать вставку уже существующего анонимного определения блока (как в случае классической вставки блоков) - делает еще и копию анонимного определения блока.
Сергей812 вне форума  
 
Непрочитано 11.10.2022, 08:09
#15
Oleg T


 
Регистрация: 27.12.2011
Сообщений: 1,456


Кстати, вполне можно написать плагин для удаления таких блоков через сравнение их списков. Они отличаются всего 4-мя элементами:

1-й блок из исходного файла
((-1 . <Entity name: 4539b820>) (0 . "INSERT") (5 . "19D267") (102 . "{ACAD_XDICTIONARY") (360 . <Entity name: 4539b8a0>) (102 . "}") (330 . <Entity name: 4538fe60>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "динблок") (48 . 100.0) (100 . "AcDbBlockReference") (66 . 1) (2 . "*U480") (10 3430214.77210817 -187272.916133985 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

2-й блок
((-1 . <Entity name: 4539b760>) (0 . "INSERT") (5 . "19D225") (102 . "{ACAD_XDICTIONARY") (360 . <Entity name: 4539bbe0>) (102 . "}") (330 . <Entity name: 4538fe60>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "динблок") (48 . 100.0) (100 . "AcDbBlockReference") (66 . 1) (2 . "*U455") (10 3430214.77210817 -187272.916133985 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

Последний раз редактировалось Oleg T, 11.10.2022 в 08:36.
Oleg T вне форума  
 
Непрочитано 11.10.2022, 09:25
#16
Сергей812


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


И сколько времени будет сравнивать по остальным кодам? Вроде первые варианты Overkill были на лиспе написаны и отличались неторопливостью в работе)
Сергей812 вне форума  
 
Непрочитано 11.10.2022, 10:00
#17
Oleg T


 
Регистрация: 27.12.2011
Сообщений: 1,456


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
И сколько времени будет сравнивать по остальным кодам? Вроде первые варианты Overkill были на лиспе написаны и отличались неторопливостью в работе)
Не знаю. Я для раскладки прямоугольников использую разномасштабные по осям блоки с автоматической нормализацией атрибутов, там Overkill все находит. Насчет неторопливости соглашусь.
Oleg T вне форума  
 
Непрочитано 11.10.2022, 11:11
#18
Сергей812


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


Даже на том же .Net навскидку алгоритм:
1. Выбрать фильтром вставки блоков;
2. Собрать в список List записи вида
{ имя блока (эффективное),
координаты точки вставки,
ObjectID вставки блока либо ссылка на сам объект (если требования к памяти не критичны),
признак необходимости удаления блока};
3. Отсортировать по имени блока.
4. Находить диапазоны каждого имени блока в списке.
5. Внутри каждого диапазона сравнить элементы по точке вставки по определенному "зазору". Если найдены совпадающие по точке вставки блоки с одинаковыми эффективными именами - сравнить атрибуты и динапараметры. Если и это совпало - поставить признак необходимости удаления блока в соответствующей записи списка.
6. Пройтись по списку и удалить необходимые блоки.

т.е. до фига кода с явными или скрытыми вложенными циклами
Сергей812 вне форума  
 
Непрочитано 11.10.2022, 11:38
#19
Oleg T


 
Регистрация: 27.12.2011
Сообщений: 1,456


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
т.е. до фига кода с явными или скрытыми вложенными циклами
Вообще то для данного конкретного случая всё вообще очень просто, и списки сравнивать не нужно. Вспомнил про свой очень давний лиспик
удаления дублирующихся текстов и блоков по точке вставки.
Изолируем блоки по слою и вперед, всё сработает.
Код:
[Выделить все]
 ;Удаление дублей текстов и блоков с совпадающей точкой вставки
;---------------------------------------------------------------------
(defun c:kill_txt()
	(if (= delta_1 nil)(setq delta_1 1))
	(prompt "\n Погрешность координат точки вставки:    ")
	(prin1 delta_1)
	(setq delta_2 (getint "\nНовое значение погрешности или ENTER:    "))
	(if (= delta_2 nil)
		(setq delta delta_1)
		(setq delta delta_2)
	)
	(setq nab (ssget))
	(setq kol (sslength nab))
	(setq nab1 (ssadd))
	(setq nab2 (ssadd))
	(setq nab3 (ssadd))
	(setq nab4 (ssadd))
	(setq n -1)
	(repeat kol
		(setq n (+ n 1))
		(setq pr (ssname nab n))
		(setq pr_ (cdr(assoc '0(entget pr))))
		(if (= pr_ "TEXT")(ssadd pr nab1))
		(if (= pr_ "INSERT")(ssadd pr nab2))
	)
	(setq kol (sslength nab1))
	(if (/= kol 0)
		(progn
			(setq go_ nil)
			(while (/= go_ 1)
				(setq pr (ssname nab1 0))
				(setq x1 (nth 1(assoc '10(entget pr))))
				(setq y1 (nth 2(assoc '10(entget pr))))
				(setq z1 (nth 3(assoc '10(entget pr))))
				(ssdel pr nab1)
				(setq kol (sslength nab1))
				(if (= kol 0)(setq go_ 1)
					(progn
						(setq n -1)
						(setq go__ nil)
						(repeat kol
							(setq n (+ n 1))
							(setq pr (ssname nab1 n))
							(setq dx (abs(- x1(nth 1(assoc '10(entget pr))))))
							(setq dy (abs(- y1(nth 2(assoc '10(entget pr))))))
							(setq dz (abs(- z1(nth 3(assoc '10(entget pr))))))
							(if (<= dx delta)(if (<= dy delta)(if (<= dz delta)(ssadd pr nab3))))
						)
					)
				)
			)
		)
	)
	(setq kol (sslength nab2))
	(if (/= kol 0)
		(progn
			(setq go_ nil)
			(while (/= go_ 1)
				(setq pr (ssname nab2 0))
				(setq x1 (nth 1(assoc '10(entget pr))))
				(setq y1 (nth 2(assoc '10(entget pr))))
				(setq z1 (nth 3(assoc '10(entget pr))))
				(ssdel pr nab2)
				(setq kol (sslength nab2))
				(if (= kol 0)(setq go_ 1)
					(progn
						(setq n -1)
						(setq go__ nil)
						(repeat kol
							(setq n (+ n 1))
							(setq pr (ssname nab2 n))
							(setq dx (abs(- x1(nth 1(assoc '10(entget pr))))))
							(setq dy (abs(- y1(nth 2(assoc '10(entget pr))))))
							(setq dz (abs(- z1(nth 3(assoc '10(entget pr))))))
							(if (<= dx delta)(if (<= dy delta)(if (<= dz delta)(ssadd pr nab3))))
						)
					)
				)
			)
		)
	)
	(command "_erase" nab3 "")
	(setq kol (sslength nab3))
	(prompt "\n Удалено дубликатов текстов и блоков     ")
	(prin1 kol)
	(princ)
)
Oleg T вне форума  
 
Непрочитано 11.10.2022, 11:49
#20
Сергей812


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


Цитата:
Сообщение от Oleg T Посмотреть сообщение
Вообще то для данного конкретного случая всё вообще очень просто, и списки сравнивать не нужно.
и писать свой вариант для каждого конкретного случая?) И сильно сомневаюсь, что ТС будет этим заниматься... Ему, имхо, проще научиться не пользоваться копированием - если не хотят попадать на деньги за лишние элементы. А здесь одновременно и хотят быстрый результат (копирование элементов группами с появляющимися при этом дубликатами) и чтобы еще без ошибок.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Не работает команда _overkill с определенным динамическим блоком



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает команда block edit в autocad hha AutoCAD 0 21.02.2017 09:13
Проблема с динамическим блоком при регенерации модели Scorpio_1986 Динамические блоки 4 26.11.2012 08:21
При включенном F8 (орто) не работает команда "перенести" по горизонтали. ПОчему?? sizhik AutoCAD 7 23.04.2012 13:57
Не работает команда SHELL Torino AutoCAD 3 12.02.2009 21:08
не работает команда mtedit Nikolays AutoCAD 8 21.11.2007 09:46