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

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

Как прочитать свойства блока

Ответ
Поиск в этой теме
Непрочитано 04.07.2023, 11:41 #1
Как прочитать свойства блока
alexmntmnk
 
Регистрация: 30.06.2023
Сообщений: 43

Продолжаю рабираться с блоками
Мне надо заменить атрибуты у всех блоков с name=my_bl или которые находятся в слое bl_layer
Для начала пробую прочитать эти свойства на одном блоке, который вытащил из списка и ни чего не выходит

Код:
[Выделить все]
  (vl-load-com)
  (setq acad_obj (vlax-get-acad-object))
  (setq active_document (vla-get-activedocument acad_obj))
  (setq blokList (vla-get-blocks active_document))
  (setq curBlock (vla-Item blokList 0));
  (setq LAYERNAME (vla-get-Layer curBlock))
  (setq p_name (vlax-get-property curBlock 'Name))
vla-get-Layer ругается "неизвестное имя: Layer"
vlax-get-property получаю "Model_Space"
Просмотров: 1222
 
Непрочитано 04.07.2023, 12:20
#2
Кулик Алексей aka kpblc
Moderator

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


У тебя путаница между вхождениями и определениями блоков.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.07.2023, 12:29
#3
alexmntmnk


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
У тебя путаница между вхождениями и определениями блоков.
а что не так?
получаю все блоки документа
Код:
[Выделить все]
(setq blokList (vla-get-blocks active_document))
получаю первый блок по индексу
Код:
[Выделить все]
(setq curBlock (vla-Item blokList 0))
alexmntmnk вне форума  
 
Непрочитано 04.07.2023, 12:44
#4
Сергей812


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


что собираетесь править то - атрибуты в определениях блоков или все-таки уже вставленные блоки в чертеже с заполненными актуальной информацией атрибутами?
Сергей812 вне форума  
 
Автор темы   Непрочитано 04.07.2023, 13:35
#5
alexmntmnk


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
что собираетесь править то - атрибуты в определениях блоков или все-таки уже вставленные блоки в чертеже с заполненными актуальной информацией атрибутами?
на чертеже имеется n-кол-во блоков, из них у m-блоков необходимо изменить атрибуты.
Но чтобы их поменять, мне надо однозначно идентифицировать каждый блок.
Как выделить m-блоков из общего кол-ва n-блоков еще не знаю, но пока вижу два варианта
1. расположить все m блоков в отдельном слое, у меня так с текстовыми примитивами реализовано, но я пока не знаю как получить все блоки определенного слоя
2. если на первый вариант не найду решения то можно попробовать по именам блоков, например я заранее знаю, что эти блоки имеют имена bl_1, bl_2, ... этот ваориант хуже, т.к. на разных чертежах их будет разное кол-во и имена могут отличаться. Поэтому хотелось бы найти решение по первому варианту.
alexmntmnk вне форума  
 
Непрочитано 04.07.2023, 13:48
1 | #6
Сергей812


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


Цитата:
Сообщение от alexmntmnk Посмотреть сообщение
на чертеже имеется n-кол-во блоков, из них у m-блоков необходимо изменить атрибуты.
значит, все-таки вставки блоков. Читайте по ssget, например Lee Mac или тут. Получаете набор вставок блоков по определенному фильтру и с ним работаете дальше. Таблица определений блоков в данном случае не нужна.
Сергей812 вне форума  
 
Автор темы   Непрочитано 04.07.2023, 16:07
#7
alexmntmnk


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
значит, все-таки вставки блоков. Читайте по ssget, например Lee Mac или тут. Получаете набор вставок блоков по определенному фильтру и с ним работаете дальше. Таблица определений блоков в данном случае не нужна.
Попробовал через ssget
Код:
[Выделить все]
(setq setBlock (ssget "_x" (list '(0 . "BLOCK") layer)))
в итоге получаю nil
Хотя с другими примитивами, типа TEXT, LINE все работает
alexmntmnk вне форума  
 
Непрочитано 04.07.2023, 16:50
1 | #8
Сергей812


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


Алексей же писал в другой ветке
Код:
[Выделить все]
 (entget (car (entsel)))
вставили в комстроку акада и выбрав примитив, посмотрели его дамп. А не подбирали бы на удачу) В данном случае INSERT будет, вставка блока же.

----- добавлено через ~8 мин. -----
и в фильтре у имени слоя dxf группа 8, а не просто значение слоя
Сергей812 вне форума  
 
Автор темы   Непрочитано 07.07.2023, 11:25
#9
alexmntmnk


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


Вот я получил набор блоков
Код:
[Выделить все]
(setq setBlock (ssget "_x" (list '(0 . "INSERT") layer)))
Подскажите как мне теперь перебрать блоки в этом списке, чтобы добрать до атрибутов каждого из них
alexmntmnk вне форума  
 
Непрочитано 07.07.2023, 12:19
#10
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от alexmntmnk Посмотреть сообщение
Вот я получил набор блоков
Не получил.
Цитата:
Сообщение от alexmntmnk Посмотреть сообщение
теперь перебрать блоки в этом списке
Это не список, а набор. Его сначала надо преобразовать в список (на форуме решения были).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.07.2023, 12:15
#11
alexmntmnk


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это не список, а набор. Его сначала надо преобразовать в список (на форуме решения были).
Можно его сразу в цикле обработать
Код:
[Выделить все]
(setq setBlock (ssget "_x" (list '(0 . "INSERT") layer)))
(repeat (setq item (sslength setBlock))
    (setq curBlock (entget(ssname setBlock (setq item (1- item)))))
    (setq vla_obj (vlax-ename->vla-object curBlock)) ; переводим в vla-object
)
Но только не пойму как достучаться до атрибутов у примитива?
Попробовал преобразовать его в vla - получаю ошибку
alexmntmnk вне форума  
 
Автор темы   Непрочитано 08.07.2023, 14:32
#12
alexmntmnk


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


Нашел на форуме код как получить список vla-объектов из набора

Код:
[Выделить все]
(defun lib:conv-pickset-to-list (value / item lst)
       (repeat (setq item (sslength value)) ;_ end setq
         (setq lst (cons (ssname value (setq item (1- item))) lst))
         ) ;_ end repeat
  lst
) 

(defun lib:conv-pickset-to-vlalist(selset) 
  (if selset 
    (mapcar 'vlax-ename->vla-object
            (lib:conv-pickset-to-list selset) 
            ))) ;_ end of defun
Пробую на основе этих функций вытащить vla-объект
Код:
[Выделить все]
(setq setBlock (ssget "_x" (list '(0 . "INSERT") layer))) ; Набор из блоков на слое
(setq lst-vla (lib:conv-pickset-to-vlalist setBlock))
(vlax-for i lst-vla
    (setq obj-name (vla-get-objectname i))
)
В итоге получаю ошибку
Код:
[Выделить все]
error: bad argument type: VLA-object collection:
alexmntmnk вне форума  
 
Непрочитано 08.07.2023, 15:51
#13
koMon


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


Код:
[Выделить все]
 
(setq block_attributes_assoc_list nil)
(vlax-map-collection (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
	'(lambda (object)
	 	(cond
			(
				(and
			 		(= "AcDbBlockReference" (vla-get-objectname object))
					(minusp (vlax-get object 'hasattributes))
				)
			 		(setq block_attributes_assoc_list (append block_attributes_assoc_list
										   (list
										   	(list (vla-get-effectivename object)
											      (mapcar '(lambda (attribute) (list (vla-get-tagstring (setq attribute_object attribute))
															         (vla-get-textstring attribute)
																 attribute
														           )
												       )
												       (vlax-invoke object 'getattributes)
													 
											      )
											)
										   )
									   )
					)
			)
			(
			 	t
			)
		)
   	)
)
(print block_attributes_assoc_list) 
__________________
K Lisp

Последний раз редактировалось koMon, 08.07.2023 в 16:21.
koMon вне форума  
 
Автор темы   Непрочитано 08.07.2023, 16:48
#14
alexmntmnk


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Код:
[Выделить все]
 
(setq block_attributes_assoc_list nil)
(vlax-map-collection (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
	'(lambda (object)
	 	(cond
			(
				(and
			 		(= "AcDbBlockReference" (vla-get-objectname object))
					(minusp (vlax-get object 'hasattributes))
				)
			 		(setq block_attributes_assoc_list (append block_attributes_assoc_list
										   (list
										   	(list (vla-get-effectivename object)
											      (mapcar '(lambda (attribute) (list (vla-get-tagstring (setq attribute_object attribute))
															         (vla-get-textstring attribute)
																 attribute
														           )
												       )
												       (vlax-invoke object 'getattributes)
													 
											      )
											)
										   )
									   )
					)
			)
			(
			 	t
			)
		)
   	)
)
(print block_attributes_assoc_list) 

я только не пойму как с его помощью атрибуты искать только в блоках расположенных в слое layer

Последний раз редактировалось alexmntmnk, 08.07.2023 в 16:58.
alexmntmnk вне форума  
 
Непрочитано 08.07.2023, 18:27
1 | #15
koMon


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


Код:
[Выделить все]
 
(and
	(= "AcDbBlockReference" (vla-get-objectname object))
  	(= "Layer" (vla-get-layer object)		; в слое "Layer"
	(= "Block_Name" (vla-get-effectivename object))	; с именем "Block_Name"
	(minusp (vlax-get object 'hasattributes))
)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 09.07.2023, 17:19
#16
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от alexmntmnk Посмотреть сообщение
я только не пойму как с его помощью атрибуты искать только в блоках расположенных в слое layer
https://forum.dwg.ru/showthread.php?...F0%E8%E1%F3%F2
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.07.2023, 17:42
#17
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


alexmntmnk,
Не
Код:
[Выделить все]
 (setq setBlock (ssget "_x" (list '(0 . "INSERT") layer))) ; Набор из блоков на слое
а
Код:
[Выделить все]
 (setq setBlock (ssget "_x" (list '(0 . "INSERT") (cons 8 layer)))) ; Набор из блоков на слое
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как прочитать свойства блока



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как задать зависимость поля в атрибуте блока от значения атрибута блока в котором находится этот блок? Nacichaj Динамические блоки 6 13.07.2022 12:44
Как вывести длину линии в свойства динамического блока? МишаИнженер Динамические блоки 1 24.06.2022 08:47
VBA. Не работает групповой код 2 (имя блока) DXF в изменённых динамических блоках. Кудахтыч Программирование 10 04.02.2019 05:33
Как обновить атрибуты блока не смещая их в начальную точку? Tregart AutoCAD 15 04.07.2018 07:52
Имеется ли возможность ссылаться изнутри при создании блока на его же будущий номер ObjId ? Tyhig AutoCAD 6 14.08.2017 17:56