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

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

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

Ответ
Поиск в этой теме
Непрочитано 28.02.2020, 17:18 1 | #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. Причина: Добавил решение
Просмотров: 5740
 
Непрочитано 28.02.2020, 17:19
#2
Кулик Алексей aka kpblc
Moderator

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


Возможно, он на самом деле 6, просто с другой стороны списка?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.02.2020, 17:23
#3
tsetse

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Возможно, он на самом деле 6, просто с другой стороны списка?
В списке params 37 элементов, поэтому к 6 никак не приходим(
tsetse вне форума  
 
Непрочитано 28.02.2020, 18:03
#4
Кулик Алексей aka kpblc
Moderator

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


Тогда пример файла и код получения в студию.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.02.2020, 19:21
#5
tsetse

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тогда пример файла и код получения в студию.
Обновил тему
tsetse вне форума  
 
Непрочитано 28.02.2020, 21:03
#6
Кулик Алексей aka kpblc
Moderator

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


Идеи кончились. Пробовал фильтровать по типу данных, видимости - все мимо. Лично у меня решения нет. Возможно, кто-то еще заинтересуется, с удовольствием посмотрю на решение. Просто из интересу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.02.2020, 21:45
#7
tsetse

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Идеи кончились. Пробовал фильтровать по типу данных, видимости - все мимо. Лично у меня решения нет. Возможно, кто-то еще заинтересуется, с удовольствием посмотрю на решение. Просто из интересу.
Я вот думаю, может проблема в том, что для динамических блоков создаются анонимные определения при вставке и изменении аттрибутов?
Думаю стоит попробовать обратиться к эффективному имени блока, и проверить, какие там номера у параметров...... Как считаете?
tsetse вне форума  
 
Непрочитано 28.02.2020, 22:29
#8
Кулик Алексей aka kpblc
Moderator

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


Не уверен, что вариант сработает. Можно, конечно, попробовать - но проблема (как мне кажется) в том, что дин.параметры просто так не получить. В свое время Supermax пытался разработать программу, реализовывающую несколько параметров видимостей, но потом Autodesk что-то там поменял и софт работает, кажется, только до ACAD2016 - в последующих уже не срабатывает. На сайте Полещука, по-моему, даже был разбор кода.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.02.2020, 22:55
#9
Boxa

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


Так, чисто для справки, в выложенном файле, в первом сообщении, динамического параметра с именем "Длина", просто нет.... "Длина_стержня", "Длина отгиба", "Длина_распределения", "Длина лапки", "Длина полки" вот это всё есть , а "Длина" нет. Продолжаем гадать по фотографии...
А вот аттрибут "Длина" есть, и у него как раз индекс 6 (начиная с 0).

Соответственно, думаю ТС просто путает теплое и мягкое.
Boxa вне форума  
 
Непрочитано 28.02.2020, 23:09
#10
koMon


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


недопечатал тс, но поле в теме и в примере ссылается именно на длину_стержня. так что гадание по фото отменяется)
koMon вне форума  
 
Непрочитано 29.02.2020, 00:30
#11
Сергей812


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


А параметр выбора Вид вообще Parameter(115)
Сергей812 вне форума  
 
Непрочитано 29.02.2020, 22:01
#12
koMon


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


это или очередная автокадская замануха или нужно копать глубже. если посмотреть на dxf этого примера в разделе описания динамического блока, то можно найти искомый параметр с групповым номером 91
Код:
[Выделить все]
100
AcDbBlockLinearParameter
305
Длина_стержня
306

140
2500.0
307

 96
        5
141
0.0
142
0.0
143
5.0
175
     0
1001
ACAD
1000
AcDbBlockParameterOrder
1070
     3
1001
ACAUTHENVIRON
1010
-3259.094651958521
1020
1918.86748592361
1030
0.0
  0
BLOCKLINEARGRIP
  5
284
330
27D
100
AcDbEvalExpr
 90
        7
 98
       33
 99
      157
100
AcDbBlockElement
300
End Grip
 98
       33
 99
      157
1071
        0
100
AcDbBlockGrip
 91
        8
 92
        9
1010
0.0
1020
2900.0
1030
0.0
280
     1
 93
       -1
100
AcDbBlockLinearGrip
140
0.0
141
2900.0
142
0.0
  0
BLOCKGRIPLOCATIONCOMPONENT
  5
285
330
27D
100
AcDbEvalExpr
 90
        8
 98
       33
 99
      157
  1

 70
    40
140
1.797693134862314E+99
100
AcDbBlockGripExpr
 91
        6
koMon вне форума  
 
Непрочитано 02.03.2020, 10:17
#13
Сергей812


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


кстати, похоже) Но поскольку это все в недокументированных DXF кодах - то вполне реально может повториться
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В свое время Supermax пытался разработать программу, реализовывающую несколько параметров видимостей, но потом Autodesk что-то там поменял и софт работает, кажется, только до ACAD2016 - в последующих уже не срабатывает.
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.03.2020, 11:16
#14
tsetse

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


Цитата:
Сообщение от koMon Посмотреть сообщение
это или очередная автокадская замануха или нужно копать глубже. если посмотреть на dxf этого примера в разделе описания динамического блока, то можно найти искомый параметр с групповым номером 91
Код:
[Выделить все]
100
AcDbBlockLinearParameter
305
Длина_стержня
306

140
2500.0
307

 96
        5
141
0.0
142
0.0
143
5.0
175
     0
1001
ACAD
1000
AcDbBlockParameterOrder
1070
     3
1001
ACAUTHENVIRON
1010
-3259.094651958521
1020
1918.86748592361
1030
0.0
  0
BLOCKLINEARGRIP
  5
284
330
27D
100
AcDbEvalExpr
 90
        7
 98
       33
 99
      157
100
AcDbBlockElement
300
End Grip
 98
       33
 99
      157
1071
        0
100
AcDbBlockGrip
 91
        8
 92
        9
1010
0.0
1020
2900.0
1030
0.0
280
     1
 93
       -1
100
AcDbBlockLinearGrip
140
0.0
141
2900.0
142
0.0
  0
BLOCKGRIPLOCATIONCOMPONENT
  5
285
330
27D
100
AcDbEvalExpr
 90
        8
 98
       33
 99
      157
  1

 70
    40
140
1.797693134862314E+99
100
AcDbBlockGripExpr
 91
        6
Это уже интересно. А как вы до этого докопались? Я через ArxDbg не смог найти(((
tsetse вне форума  
 
Непрочитано 02.03.2020, 11:34
#15
Сергей812


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


Цитата:
Сообщение от tsetse Посмотреть сообщение
Это уже интересно. А как вы до этого докопались?
сохраните файл в dxf)
Сергей812 вне форума  
 
Непрочитано 02.03.2020, 11:40
#16
koMon


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


absolutely)))
ну вот так навскидку можно нарыть параметры дистанции динамических свойств
Код:
[Выделить все]
 
(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 (cdr (member (assoc 360 dict_record) dict_record))))))
(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)))
)
----- добавлено через ~15 мин. -----
пробовал на своём блоке, а на темном надо опять ковырять
koMon вне форума  
 
Непрочитано 02.03.2020, 12:11
#17
AndruxaZ


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


Цитата:
Сообщение от tsetse Посмотреть сообщение
Это уже интересно. А как вы до этого докопались? Я через ArxDbg не смог найти(((
Очень длинный путь через ARXDBG. У меня вот так получилось добраться
Миниатюры
Нажмите на изображение для увеличения
Название: Image 007.jpg
Просмотров: 40
Размер:	385.1 Кб
ID:	223636  
AndruxaZ вне форума  
 
Автор темы   Непрочитано 02.03.2020, 12:16
#18
tsetse

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


Нашел что-то похожее у LeeMac
Код:
[Выделить все]
 (defun LM:getvisibilityparametername ( blk / vis )  
(if
	(and
		(vlax-property-available-p blk 'effectivename)
		(setq blk
			(vla-item
				(vla-get-blocks (vla-get-document blk))
				(vla-get-effectivename blk)
			) ;end of vla-item
		) ;end of setq
		(= :vlax-true (vla-get-isdynamicblock blk))
		(= :vlax-true (vla-get-hasextensiondictionary blk))
		(setq vis
			(vl-some
				'(lambda ( pair )
					(if
						(and
							(= 360 (car pair))
							(= "BLOCKVISIBILITYPARAMETER" (cdr (assoc 0 (entget (cdr pair)))))
						) ;end of and
						(cdr pair)
					) ;end of if
				) ;end of lambda
				(dictsearch
					(vlax-vla-object->ename (vla-getextensiondictionary blk))
					"ACAD_ENHANCEDBLOCK"
				) ;end of dictsearch
			) ;end of vl-some
		) ;end of setq
	) ;end of and
	(cdr (assoc 301 (entget vis)))
) ;end of if
) ;end of LM:getvisibilityparametername
Остается вопрос, на что заменить "BLOCKVISIBILITYPARAMETER" и какой dxf код.
В расширенной библиотеке "ACAD_ENHANCEDBLOCK" нашел коды через ArxDbg. (ArxDbg->Entity info->Extension Dict->AppDataCache).
Теперь глупый вопрос, прошу не пинать, как зная имя entity, например 15fd19f0, посмотреть его через entget?

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от AndruxaZ Посмотреть сообщение
Очень длинный путь через ARXDBG. У меня вот так получилось добраться
Спасибо! Я пошел другим путем и видимо не туда)
tsetse вне форума  
 
Непрочитано 02.03.2020, 12:25
#19
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от tsetse Посмотреть сообщение
как зная имя entity, например 15fd19f0, посмотреть его через entget?
Имя или хендл? Если у тебя оно отображается как <Ename: 15fd19f0>, то прямо на него и делай entget. Если это строка - то handent и вперед.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.03.2020, 12:40
#20
tsetse

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Имя или хендл? Если у тебя оно отображается как <Ename: 15fd19f0>, то прямо на него и делай entget. Если это строка - то handent и вперед.
Я через ArxDbg увидел имя entity и хотел его посмотреть, в качестве эксперимента через entget, вот и не знаю, как это сделать.
Т.е. мне нужно строку "<Entity name: 115fc8ac0>" превратить в entity.
Код:
Выдает
<Entity name: 115fc8ac0>
Код:
[Выделить все]
 (entget (car(entsel)))
замечательно работает.
Как заставить работать конструкцию
Код:
[Выделить все]
 (entget <Entity name: 115fc8ac0>)
.

Последний раз редактировалось tsetse, 02.03.2020 в 12:51.
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