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

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

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


Возможно, он на самом деле 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
С.-Петербург
Сообщений: 40,406


Тогда пример файла и код получения в студию.
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 40,406


Идеи кончились. Пробовал фильтровать по типу данных, видимости - все мимо. Лично у меня решения нет. Возможно, кто-то еще заинтересуется, с удовольствием посмотрю на решение. Просто из интересу.
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 40,406


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

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


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

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


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


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


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


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


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


это или очередная автокадская замануха или нужно копать глубже. если посмотреть на 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,499


кстати, похоже) Но поскольку это все в недокументированных 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,499


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


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


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
Просмотров: 41
Размер:	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
С.-Петербург
Сообщений: 40,406


Цитата:
Сообщение от 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 вне форума  
 
Непрочитано 02.03.2020, 13:33
| 1 #21
Boxa

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


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,809


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
С.-Петербург
Сообщений: 40,406


Большое количество полей почти гарантированно затормозит обработку чертежа. Я бы, наверное, воспользовался не полями, а отдельной командой, которая "проставит" значения обычными выносками или чем-нибудь наподобие (кстати, в качестве аннотации для выноски можно и блоки использовать). А всю маркировку поместить на отдельный слой. Ну что-нибудь такого типа.
__________________
Моя библиотека 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,809


Цитата:
Сообщение от 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,809


Цитата:
Сообщение от 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
Сообщений: 60


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

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

В локальных переменных пропустили (не объявили) 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