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

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

Как найти в чертеже вхождения блока по его имени?

Ответ
Поиск в этой теме
Непрочитано 26.09.2024, 15:04 #1
Как найти в чертеже вхождения блока по его имени?
===AAA===
 
г. Норильск
Регистрация: 15.08.2005
Сообщений: 616

Всем привет!

Казалось бы, чего проще?

Пусть у нас в чертеже (а мы точно об этом знаем!) есть блок по имени "БЛОК-123"

Тогда:

(ssget "_X" '((0 . "INSERT")(2 . "БЛОК-123")))

получаем набор и радуемся.

Но вот непонятный случай - блок есть (мы видим его глазами), его можно выбрать
и в таблице свойствах примитива (той, что в левой части экрана) будет честно
указано его имя: "БЛОК-123".

Хорошо, делаем:

(entget (car (entsel"\nУкажите требуемый элемент: ")))

И смотрим на его код:

((-1 . #<Имя примитива: 0000026913321C80>) (0 . "INSERT") (5 . "DEC7") (102 . "{ACAD_XDICTIONARY") (360 . #<Имя примитива: 0000026913324380>) (102 . "}") (330 . #<Имя примитива: 000002691331A040>) (100 . "AcDbEntity") (67 . 1) (410 . "ОА-ВЫПУСК") (8 . "Слой1") (62 . 1) (100 . "AcDbBlockReference") (66 . 1) (2 . "*U57") (10 391.0 5.0 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 1) (71 . 1) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

Т.е. блок почему-то стал "анонимным"...

Вопрос:

Как в этом случае найти вхождения блока "БЛОК-123" ?

Ну и попутно - обратная задача.

Как "раскрутить" имя "*U57" до оригинального "БЛОК-123" ?
__________________
Счастливо, Алексей!
Просмотров: 1692
 
Непрочитано 26.09.2024, 15:37
#2
Кулик Алексей aka kpblc
Moderator

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


1. Блок динамический.
2. Блок не только динамический, но еще и измененный
3. Поиск по форуму - тему поднимали, насколько я помню
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.09.2024, 17:34
#3
Сергей812


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Как найти в чертеже вхождения блока по его имени?
просто для информации - на .Net. Если не получится на лиспе - можно "вставку" .Net кода сделать в лиспе
Сергей812 вне форума  
 
Непрочитано 26.09.2024, 20:52
#4
Кулик Алексей aka kpblc
Moderator

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


В нанике до версии 24 нереально. Там тупо нет реализации LispFunction
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.09.2024, 21:03
1 | 1 #5
koMon


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Как "раскрутить" имя "*U57" до оригинального "БЛОК-123" ?
Код:
[Выделить все]
 
(cdr (assoc 2 (entget (cdr (assoc 340 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (car (entsel)))))))))))))))))
__________________
K Lisp
koMon вне форума  
 
Непрочитано 26.09.2024, 21:14
#6
Сергей812


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


Offtop:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В нанике до версии 24 нереально. Там тупо нет реализации LispFunction
Алексей, я помню) Ну лисп в нанокаде я вообще воспринимаю примерно так же как VBA в самом акаде - неродной внутренний ЯП, "прикрученный" уже опосля сбоку...

Последний раз редактировалось Сергей812, 26.09.2024 в 21:20.
Сергей812 вне форума  
 
Непрочитано 26.09.2024, 21:35
1 | 1 #7
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от koMon Посмотреть сообщение
Код:
[Выделить все]
 
(cdr (assoc 2 (entget (cdr (assoc 340 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (car (entsel)))))))))))))))))
Че-то мне кажется, что будет проще запросить вхождения, и потом уже через vla-get-effectivename работать
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.09.2024, 22:27
1 | 1 #8
koMon


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


я даже не думал предлагать свойство effectivename в виду его кричащей очевидности, а вот 5 entget-ов подряд как нельзя лучше подходят под формулировку раскрутить
__________________
K Lisp
koMon вне форума  
 
Непрочитано 26.09.2024, 22:31
1 | #9
Кулик Алексей aka kpblc
Moderator

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


Говорят, что где-то в глубинах можно найти код получения всех вхождений дин.блока
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.09.2024, 08:16
#10
===AAA===


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


"Обратная задача" действительно не сложная. Отдельное спасибо koMon
за творческий подход к слову "раскрутить". :-) Кстати, оказалось реально
полезно посмотреть, по каким словарям что раскладывается.

Что касается "первичной задачи", то попытка
Цитата:
где-то в глубинах можно найти код
наткнулась на "крокозяблы" на сайте

https://github.com/kpblc2000/KpblcLi...ynprop-get.lsp

Выглядит оно примерно так:

Цитата:
(defun _kpblc-block-dynprop-get (blk-ref name / blk_def blk_name)
;|
* Âîçâðàùàåò äèíàìè÷åñêîå ñâîéñòâî áëîêà ïî èìåíè ñâîéñòâà. Ñâîéñòâî ORIGIN èñêëþ÷àåòñÿ
* Ïàðàìåòðû âûçîâà:
По крайней мере, у меня в браузере. :-(
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 27.09.2024, 08:35
#11
Кулик Алексей aka kpblc
Moderator

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


Проблема в кодировке файла. Скачай, открой в кодировке Win1251 - все должно быть корректно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.09.2024, 14:40
1 | #12
koMon


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


===AAA===,
так я так и не понял в чём затык прямой задачи?
продолжаем раскрутку.
Код:
[Выделить все]
 
(defun get_insert_list (get_name / insert_sset block_name)
	(if (setq insert_sset (ssget "_x" '((0 . "insert"))))
		(vl-remove-if-not '(lambda (insert) (or (= get_name (setq block_name (cdr (assoc 2 (entget insert)))))
												(and (= "*U" (substr block_name 1 2))
													 (= get_name 
													 	(cdr (assoc 2 
																(entget (cdr (assoc 340 
																	(entget (cdr (assoc 360 
																		(entget (cdr (assoc 360 
																			(entget (cdr (assoc 360 
																				(entget insert)))
																			)
																		)))
																	)))
																)))
															 )
														 )
													 )
												)
											)
							)
							(vl-remove-if 'listp (mapcar 'cadr (ssnamex insert_sset)))
		)
	)
)
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 27.09.2024, 15:59
#13
===AAA===


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


Ага!

А так, наверное, ещё быстрее будет:

(ssget "_X" '((0 . "INSERT")(2 . "*U*")))
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 27.09.2024, 16:15
#14
Кулик Алексей aka kpblc
Moderator

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


Угу, и выберет вообще все измененные дин.блоки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.09.2024, 20:45
#15
koMon


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
быстрее будет
м.б. будет быстрее, но... если динблок вдруг не изменился, то его не выберецца.
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 27.09.2024, 21:48
#16
===AAA===


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


Да, верно!

В общем случае вхождений динамического блока
может быть несколько, при этом часть из них
может быть изменена, а часть - нет.

Выбирать и анализировать нужно все, согласен.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 27.09.2024, 21:57
#17
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Выбирать и анализировать нужно все
И в этом случае есть вопрос - а нужен ли ssget, если все равно выполнять анализ результата?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.09.2024, 08:44
#18
===AAA===


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


Цитата:
... а нужен ли ssget ...
Поясни, плиз.

Если есть какой-то альтернативный способ выбора вхождения
примитива (в данном случае - блока) в чертёж, то мне он просто
не ведом.

Как бы ssget'а всегда хватало.

Роется он в базе данных чертежа - ну и пусть роется...

Да, не всегда может создать набор "на ровном месте", приходится
отлавливать эти глюки и тыкать ему (gc), следить, чтобы наборы
были локальными переменными, скидывать их в nil вручную и
прочее, но я уже как-то и привык к этому.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 29.09.2024, 09:16
#19
koMon


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


видимо имеется в виду как вариант проходка по всей базе на предмет вхождений блоков и создание списка требуемых.
__________________
K Lisp
koMon вне форума  
 
Непрочитано 29.09.2024, 17:53
#20
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от koMon Посмотреть сообщение
видимо имеется в виду как вариант проходка по всей базе на предмет вхождений блоков и создание списка требуемых.
Именно!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как найти в чертеже вхождения блока по его имени?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При переносе вхождения блока за базовую точку, многострочный атрибут остается на месте kuraga97 AutoCAD 5 20.07.2023 08:56
Нумерация имени блоков (внутри блока атрибут) dim5678 LISP 13 28.04.2020 19:49
Как найти угол поворота блока, вставленного в ПСК, отличной от мировой 480725 Программирование 22 10.06.2018 20:27
Как применить изменения блока ко всем его копиям на чертеже? Валерий М.В. AutoCAD 5 10.05.2017 20:48
Найти объект в чертеже Алиевич Программирование 9 29.03.2011 15:28