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

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

Как узнать номер параметра в динамическом блоке?

Ответ
Поиск в этой теме
Непрочитано 28.02.2020, 17:18 1 |
Как узнать номер параметра в динамическом блоке?
tsetse
 
Инженер-конструктор
 
Москва
Регистрация: 25.12.2015
Сообщений: 77

Добрый день. Имеется динамический блок. Строка-поле ссылающяяся на какой либо параметр в этом блоке имеет вид %<\AcObjProp Object(%<\_ObjId 3755813568>%).Parameter(6).UpdatedDistance \f "%lu2%pr0">%. Как програмно узнать номер параметра, чтобы сгенерировать строку?
В моем примере параметр 6 называется "Длина_стержня".
Таким образом я достаю все параметры
Код:
[Выделить все]
 (setq params (vlax-invoke (vlax-ename->vla-object (car (entsel))) 'getdynamicblockproperties))
Перебирая params я нахожу, что параметр "Длина_стержня" в этом списке не 6, а 3.
Код:
[Выделить все]
 (vla-get-propertyname (nth 2 params))
.
В этом собственно и вопрос, как получить искомый номер 6, чтобы сгенерировать поле?
Ниже код.
Код:
[Выделить все]
 (setq params (vlax-invoke (vlax-ename->vla-object (car (entsel))) 'getdynamicblockproperties))
(setq len_name (vla-get-propertyname (nth 2 params)))
(setq len_val (vlax-get (nth 2 params) 'value))
.
Решение проблемы. Спасибо koMon и всем заинтересованным.
Запуск (get-param_number (car(entsel)) "Длина_стержня")
Код:
[Выделить все]
 (defun get-param_number (blk param / dyn_param_found dyn_block_table_dxf_data dict_record dyn_block_params param_name param_num flag)
(if (= (type blk) 'ENAME)
	(setq blk (vlax-ename->vla-object blk))
)
(setq flag nil)
(setq dyn_block_table_dxf_data (entget (vlax-vla-object->ename (vla-item (vla-get-blocks (vla-get-Activedocument (vlax-get-acad-object))) (vla-get-effectivename blk)))))
(setq dict_record (entget (cdr (assoc 360 (member (assoc 360 dyn_block_table_dxf_data) dyn_block_table_dxf_data)))))
(setq dyn_block_params (entget (cdr (assoc 360 (member '(3 . "ACAD_ENHANCEDBLOCK") dict_record)))))
(setq dyn_block_params (cdr (member (assoc 95 dyn_block_params) dyn_block_params)))
(while
	(and
(member (assoc 95 dyn_block_params) dyn_block_params)
		(null dyn_param_found)
	)
	(if (assoc 305 (entget (cdr (assoc 360 dyn_block_params)))) 
		(progn
			(setq param_name (cdr (assoc 305 (entget (cdr (assoc 360 dyn_block_params))))))
			(setq param_num (cdr (assoc 90 (entget (cdr (assoc 360 dyn_block_params))))))
			(if (= (strcase param_name) (strcase param))
				(setq flag param_num dyn_param_found t)
			)
		)
	)
	(setq dyn_block_params (cdr (member (assoc 95 dyn_block_params) dyn_block_params)))
)
flag
) ;end of defun

Вложения
Тип файла: dwg
DWG 2007
для_dwg.dwg (115.0 Кб, 36 просмотров)


Последний раз редактировалось tsetse, 13.08.2020 в 17:55. Причина: Добавил решение
Просмотров: 5739
 
Непрочитано 02.03.2020, 13:33
| 1 #21
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


AndruxaZ, Вам почти удалось..
Но лучше вот так:

Handel: 283 Это искомый параметр, у него в XData указано, что он 3 по порядку, и в общем списке имеет индекс в коллекции 6,

дополнительно посмотрел по "Привязка_распределения" handel 27E, который по индексу в коллекции 1, по порядку 2 и равен 1500.
и если в текст вставить %<\AcObjProp Object(%<\_ObjId 165450432>%).Parameter(1).UpdatedDistance \f "%lu2%pr0">%, то получится 1500.
Все сходится.

Откуда взялась 6 теперь понятно... а вот как ее достать в Лисп... не знаю.
Boxa на форуме  
 
Непрочитано 02.03.2020, 14:50
2 | 1 #22
koMon


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


tsetse,
а если так:
Код:
[Выделить все]
 
(setq dyn_block_table_dxf_data (entget (vlax-vla-object->ename (vla-item (vla-get-blocks (vla-get-Activedocument (vlax-get-acad-object))) (vla-get-effectivename (vlax-ename->vla-object (car (entsel))))))))
(setq dict_record (entget (cdr (assoc 360 (member (assoc 360 dyn_block_table_dxf_data) dyn_block_table_dxf_data)))))
(setq dyn_block_params (entget (cdr (assoc 360 (member '(3 . "ACAD_ENHANCEDBLOCK") dict_record)))))
(setq dyn_block_params (cdr (member (assoc 95 dyn_block_params) dyn_block_params)))
(while (member (assoc 95 dyn_block_params) dyn_block_params)
	(if (assoc 305 (entget (cdr (assoc 360 dyn_block_params)))) 
		(progn
			(print (assoc 305 (entget (cdr (assoc 360 dyn_block_params))))) 
			(print (assoc 90 (entget (cdr (assoc 360 dyn_block_params))))) 
		)
	)
	(setq dyn_block_params (cdr (member (assoc 95 dyn_block_params) dyn_block_params)))
)
Код:
[Выделить все]
Select object:
"Привязка_распределения"
1
"Длина_стержня"
6
"Длина отгиба"
16
"Длина_распределения"
22
"Привязка_стержня"
36
"Отражение стрелки 1"
51
"Отражение стрелки 2"
57
"Длина лапки"
64
"Поворот полки"
79
"Отражение стержня"
84
"Длина полки"
91
"Flip state1"
98
"Custom"
119
"Custom"
124
"Custom"
135
"Custom"
136
"Custom"
153
"Для видимости"
154
"Для прямоугольника"
161
"Для выноски"
168

Последний раз редактировалось koMon, 02.03.2020 в 15:34.
koMon вне форума  
 
Автор темы   Непрочитано 03.03.2020, 12:02
1 | 1 #23
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от koMon Посмотреть сообщение
tsetse,
а если так:
Код:
[Выделить все]
 
(setq dyn_block_table_dxf_data (entget (vlax-vla-object->ename (vla-item (vla-get-blocks (vla-get-Activedocument (vlax-get-acad-object))) (vla-get-effectivename (vlax-ename->vla-object (car (entsel))))))))
(setq dict_record (entget (cdr (assoc 360 (member (assoc 360 dyn_block_table_dxf_data) dyn_block_table_dxf_data)))))
(setq dyn_block_params (entget (cdr (assoc 360 (member '(3 . "ACAD_ENHANCEDBLOCK") dict_record)))))
(setq dyn_block_params (cdr (member (assoc 95 dyn_block_params) dyn_block_params)))
(while (member (assoc 95 dyn_block_params) dyn_block_params)
	(if (assoc 305 (entget (cdr (assoc 360 dyn_block_params)))) 
		(progn
			(print (assoc 305 (entget (cdr (assoc 360 dyn_block_params))))) 
			(print (assoc 90 (entget (cdr (assoc 360 dyn_block_params))))) 
		)
	)
	(setq dyn_block_params (cdr (member (assoc 95 dyn_block_params) dyn_block_params)))
)
Код:
[Выделить все]
Select object:
"Привязка_распределения"
1
"Длина_стержня"
6
"Длина отгиба"
16
"Длина_распределения"
22
"Привязка_стержня"
36
"Отражение стрелки 1"
51
"Отражение стрелки 2"
57
"Длина лапки"
64
"Поворот полки"
79
"Отражение стержня"
84
"Длина полки"
91
"Flip state1"
98
"Custom"
119
"Custom"
124
"Custom"
135
"Custom"
136
"Custom"
153
"Для видимости"
154
"Для прямоугольника"
161
"Для выноски"
168
Спасибо большое! Отлично работает! Основное изменение от предыдущего, как я понял заключается в том, что поиск параметров идет в расширенном словаре блока "ACAD_ENHANCEDBLOCK". Надеюсь этот код в дальнейшем поможет кому-либо еще. В ближаешее время модифицирую (если вы это не сделаете раньше), чтобы выводилось конкретное значение для конкретного параметра например (test "Длина_стержня") -> 6.
Теперь объясню, зачем мне это нужно. На планах армирования в большом количестви присутствуют данные блоки. Некоторые коллеги (неопытные), часто сбивают этот аттрибут. Вот и пришла в голову мысль, восстановить. Просто вписать значение проблем не вызывает, задача была именно сделать поле. Еще раз спасибо!

----- добавлено через ~1 ч. -----
Оформленный как функция
Запуск (get-param_number (car(entsel)) "Длина_стержня")
Код:
[Выделить все]
 (defun get-param_number (blk param / dyn_block_table_dxf_data dict_record dyn_block_params param_name param_num flag)
(if (= (type blk) 'ENAME)
	(setq blk (vlax-ename->vla-object blk))
)
(setq flag nil)
(setq dyn_block_table_dxf_data (entget (vlax-vla-object->ename (vla-item (vla-get-blocks (vla-get-Activedocument (vlax-get-acad-object))) (vla-get-effectivename blk)))))
(setq dict_record (entget (cdr (assoc 360 (member (assoc 360 dyn_block_table_dxf_data) dyn_block_table_dxf_data)))))
(setq dyn_block_params (entget (cdr (assoc 360 (member '(3 . "ACAD_ENHANCEDBLOCK") dict_record)))))
(setq dyn_block_params (cdr (member (assoc 95 dyn_block_params) dyn_block_params)))
(while (member (assoc 95 dyn_block_params) dyn_block_params)
	(if (assoc 305 (entget (cdr (assoc 360 dyn_block_params)))) 
		(progn
			(setq param_name (cdr (assoc 305 (entget (cdr (assoc 360 dyn_block_params))))))
			(setq param_num (cdr (assoc 90 (entget (cdr (assoc 360 dyn_block_params))))))
			(if (= (strcase param_name) (strcase param))
				(setq flag param_num)
			)
		)
	)
	(setq dyn_block_params (cdr (member (assoc 95 dyn_block_params) dyn_block_params)))
)
flag
) ;end of defun

Последний раз редактировалось tsetse, 03.03.2020 в 14:03.
tsetse вне форума  
 
Непрочитано 03.03.2020, 13:19
#24
Кулик Алексей aka kpblc
Moderator

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


Большое количество полей почти гарантированно затормозит обработку чертежа. Я бы, наверное, воспользовался не полями, а отдельной командой, которая "проставит" значения обычными выносками или чем-нибудь наподобие (кстати, в качестве аннотации для выноски можно и блоки использовать). А всю маркировку поместить на отдельный слой. Ну что-нибудь такого типа.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.03.2020, 13:26
#25
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Большое количество полей почти гарантированно затормозит обработку чертежа. Я бы, наверное, воспользовался не полями, а отдельной командой, которая "проставит" значения обычными выносками или чем-нибудь наподобие (кстати, в качестве аннотации для выноски можно и блоки использовать). А всю маркировку поместить на отдельный слой. Ну что-нибудь такого типа.
Да, я понимаю. Просто при работе нагляднее использовать регенерацию, расставил дополнительную арматуру на участке, обновил чертеж, проверил. Данный блок при числе в одном файле до 500 не замедляет работу (неощутимо замедляет по крайней мере на наших машинах). Больше 500 бывают трудности, преодолимые fieldeval 0)
tsetse вне форума  
 
Непрочитано 03.03.2020, 13:36
1 | 2 #26
koMon


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


Цитата:
Сообщение от tsetse Посмотреть сообщение
Код:
[Выделить все]
 (if (= param_name param)
лучше наверное подровнять
Код:
[Выделить все]
 (if (= (strcase param_name) (strcase param)
koMon вне форума  
 
Автор темы   Непрочитано 03.03.2020, 13:38
#27
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от koMon Посмотреть сообщение
лучше наверное подровнять
Код:
[Выделить все]
 (if (= (strcase param_name) (strcase param)
Согласен, исправит проблемы невнимательности и упростит ввод.
tsetse вне форума  
 
Непрочитано 03.03.2020, 14:19
1 | 2 #28
koMon


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


Цитата:
Сообщение от tsetse Посмотреть сообщение
Код:
[Выделить все]
 (member (assoc 95 dyn_block_params) dyn_block_params)
и досрочное окончание цикла сделать
Код:
[Выделить все]
 (and
      (member (assoc 95 dyn_block_params) dyn_block_params)
      (null dyn_param_found)
)
Код:
[Выделить все]
 (setq flag param_num dyn_param_found t)
koMon вне форума  
 
Автор темы   Непрочитано 03.03.2020, 14:27
#29
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от koMon Посмотреть сообщение
и досрочное окончание цикла сделать
Код:
[Выделить все]
 (and
      (member (assoc 95 dyn_block_params) dyn_block_params)
      (null dyn_param_found)
)
Код:
[Выделить все]
 (setq flag param_num dyn_param_found t)
Спасибо большое! Учел, внес в шапку.
tsetse вне форума  
 
Непрочитано 29.07.2020, 15:52
1 | #30
modest-bp


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


Большое спасибо ТС и всем, кто ему помогал в создании функции! Мне она очень пригодилась)

Только вот кучу времени убил, пока разбирался, от чего же код (в шапке который) работает через пень-колоду)))))
Но нашёл)

В локальных переменных пропустили (не объявили) dyn_param_found , а в теле процедуры стоит
Цитата:
13 (null dyn_param_found)
В итоге процедура становится "одноразовой": единожды выдаёт правильный ответ, а при повторном вызове- nil, и хоть ты тресни.

Шапку, наверное, стоит поправить

Ещё раз благодарю коллективного автора этой функции за неоценимую помощь в моей работе!
modest-bp вне форума  
 
Автор темы   Непрочитано 13.08.2020, 17:56
#31
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Готово! Спасибо за замечание!
Цитата:
Сообщение от modest-bp Посмотреть сообщение
Большое спасибо ТС и всем, кто ему помогал в создании функции! Мне она очень пригодилась)

Только вот кучу времени убил, пока разбирался, от чего же код (в шапке который) работает через пень-колоду)))))
Но нашёл)

В локальных переменных пропустили (не объявили) dyn_param_found , а в теле процедуры стоит


В итоге процедура становится "одноразовой": единожды выдаёт правильный ответ, а при повторном вызове- nil, и хоть ты тресни.

Шапку, наверное, стоит поправить

Ещё раз благодарю коллективного автора этой функции за неоценимую помощь в моей работе!
tsetse вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как узнать номер параметра в динамическом блоке?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка параметра видимости в блоке случайным образом Volodich Программирование 11 01.02.2023 09:20
Ограничение линейного перемещения в динамическом блоке nimberlink Динамические блоки 1 20.12.2016 10:49
Массивы в динамическом блоке valerik88 Динамические блоки 3 13.12.2016 09:34
Помогите узнать номер строки в котрой произошла ошибка в программе на VBA МишаИнженер Программирование 3 27.05.2012 23:27