|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
22.07.2020, 15:17 | #1 | |
LISP. Получение значения ID пользовательского атрибута динамического блока
Регистрация: 15.04.2019
Сообщений: 58
|
||
Просмотров: 8457
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833
|
А зачем тебе ID, если уже указатель можешь получить?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,095
|
Цитата:
Если первое - то лучше _dwgru-block-get-attr-by-mask не придумаешь, а если второе - можно так: Код:
Вторая строчка проверяет, что выбран именно атрибут, а не графический примитив блока, например. Дальше можно получить "эффективное имя" дин. блока, перевести указатель в удобоваримую форму, ... соль, перец по вкусу Последний раз редактировалось kp+, 22.07.2020 в 17:54. |
|||
|
||||
Регистрация: 15.04.2019
Сообщений: 58
|
Так потом я эти ID (объекта и атрибута) буду использовать при создании полей. А именно, применяя функцию от VVA copyToclipboard, сразу отправлю в буфер обмена поля с нужными мне значениями в нужном формате, чтобы потом просто Ctrl-V в таблицах, тексте или где только это может потребоваться.
Вот такого плана: %<\AcObjProp.16.2 Object(%<\_ObjId [<ЗДЕСЬ ID ОБЪЕКТА>]>%).Parameter(56).UpdatedDistance \f "%lu2%ds44%zs8">% %<\AcObjProp Object(%<\_ObjId [<ЗДЕСЬ ID АТРИБУТА>]>%).TextString>% Грубо говоря, хочу тыком по объекту получать в буфере обмена строку с полями, которую потом просто вставлять куда может потребоваться. А для этого нужны как раз значения ID объекта и ID атрибута. И, если я правильно понимаю, в виде текста. ----- добавлено через ~14 мин. ----- Цитата:
Так в том-то и дело, что не понимаю я, как увязать переменную obj, которую задаю через (setq obj (car (entsel)), с переменной block-ref, которая обрабатывается функцией _dwgru-block-get-attr-by-mask Простите, я, наверное, очень непонятно объясняю, потому как неграмотно... Но, надеюсь, смысл донести, всё-таки, получилось))) Проще говоря, я не понимаю, как склеить в рамках одной команды с одним только тыком по объекту две функции: извлечение ID объекта через Get-ObjectID-x86-x64 и извлечение ID скрытого атрибута с заранее известным тэгом через _dwgru-block-get-attr-by-mask. Понимание того, как далее использовать эти две переменные чтобы составить поля и отправить их при помощи copyToclipboard в буфер обмена у меня, вроде как, уже есть. По крайней мере, поля с ID объекта уже сформировал. Остались только поля с ID скрытого атрибута. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833
|
(copyToclipboard (get-objectid-x86-x64 (car (_dwgru-block-get-attr-by-mask (car (entsel)) "RequiredTag"))))
Примерно так. Без проверок. P.S. Мог бы и сам сообразить, как соединять функции
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 15.04.2019
Сообщений: 58
|
Цитата:
Да только вот проверить работу кода не получается, т.к. в теме DwgRuLispLib: Получение указателей на атрибуты вхождения блока ссылка на функцию _dwgru-is-ent-block-reference оказалась битая (((( То есть собрать _dwgru-block-get-attr-by-mask целиком не выйдет ((( Тем не менее, в надежде, что функцию _dwgru-is-ent-block-reference удастся таки найти, я покорпел над кодом (ну на сколько хватило интуиции) с учётом подсказки Алексея Кулика aka kpblc, и вот, что сейчас получается. Но, боюсь, я всё-таки накосячил с применением _dwgru-block-get-attr-by-mask при присвоении значения переменной attrID. Код:
_dwgru-conv-ent-to-vla _dwgru-conv-value-to-list _dwgru-is-ent-block-reference (подскажите, где её найти?) И ещё, Алексей, такой вопрос. Судя по всему, переменные block-ref и mask используются далее в трёх следующих функциях _dwgru-conv-<...>, поэтому они и объявлены как глобальные, я правильно понял? Насколько это критично, что они забивают собой память после отработки всех процедур? Может, их можно как-то выгрузить после выполнения команды getIDs? Или "обернуть" всё это ещё одной функцией, в которой обозначить эти переменные как локальные (но тогда теряюсь, как же её вызывать)? Последний раз редактировалось modest-bp, 23.07.2020 в 02:30. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833
|
Нет, неправильно. Это просто параметры вызова.
По поводу битой ссылки - я не понял, как такое произошло. ПРимерный код: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833
|
modest-bp, ты про какие функции говоришь?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Цитата:
|
|||
|
||||
Регистрация: 15.04.2019
Сообщений: 58
|
Оффтоп.
Цитата:
Вот тут пишут, цитирую: Цитата:
А в документации пишут, что в этом случае "ххх" будет уже аргументом. И вот сейчас, почитав документацию и ещё раз перечитав следующую лекцию по первой ссылке, понимаю, что это - действительно аргумент, а ни фига не глобальная переменная. То есть, выходит, до слеша - аргумент, после - локальная переменная, а вне функции - глобальная переменная. Но тогда что ж за муть написана по ссылке, цитату из которой я привёл? Но это оффтоп и отчаянье. Два дня уже из этих учебников не вылезаю из-за одной единственной кнопочки, которую я загорелся сделать, и пока без толку (((( Последний раз редактировалось modest-bp, 24.07.2020 в 01:06. |
|||
|
||||
Регистрация: 20.03.2008
Сообщений: 2,653
|
|
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Цитата:
а глобальная переменная - это когда она (переменная) объявлена вне функции: либо в явном виде Код:
это проблема не лиспа уже) |
|||
|
||||
Регистрация: 15.04.2019
Сообщений: 58
|
Ненене))) Спасибо))) Корявенько в учебнике написали))) А то цитату-то я привёл, а ссылкой подкрепить забыл.
Но с объявлением функций при сращивании нескольких у меня всё ещё есть проблемы. Сейчас доковыряю - выложу (если не заработает). А и если заработает - тоже выложу!) ----- добавлено через ~43 мин. ----- Собрал пока команду для извлечения из вхождения дин. блока ID пользовательского атрибута (скрытого) с тэгом "ТИП" Судя по тому, что в результате обработки получаю Цитата:
Код сейчас выглядит так: Код:
Но так и не понимаю, как мне срастить эти функции, потому как в них повсюду применяются переменные/аргументы block-ref, в то время как мне нужно повсюду брать значение переменной obj, заданной выбором объекта в самом начале (я же дальше планирую ещё одну функцию прикрутить - собирающую ObjID вхождения блока, а там, как раз, всюду именно эта obj используется). Помогите, пожалуйста, задымил уже))) |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833
|
Offtop: Че-т я начинаю подумывать об организации общего репа на гитхабе на предмет подобных функций... Заодно поэкспериментировать и поучиться можно
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
не надо заниматься ерундой по сращиванию костей / наращиванию ногтей)
Код:
Последний раз редактировалось koMon, 24.07.2020 в 16:34. |
||||
|
||||
Регистрация: 20.03.2008
Сообщений: 2,653
|
Цитата:
В функции _dwgru-is-ent-block-reference, к примеру, в комментарии указано: то есть, в коде этой функции происходит проверка на тип указателя (vla или ename) и приведение его к нужному типу, поэтому в качестве аргумента можно использовать и то и другое. Аналогично с _dwgru-block-get-attr-by-mask, хоть в комментариях явно это и не указано. Но возвращает она как раз vla-object. - тут не нужно было менять аргумент на obj. В описании функции [(defun _dwgru-block-get-attr-by-mask (block-ref mask /......] block-ref - аргумент, и он имеет для удобства понятное название (вхождение блока - block-reference), потому что в роли этого вхождения у нас выступает ранее полученная переменная obj. Иными словами, переменная полученная при помощи другой функции, не важно - пользовательской или встроенной лисповской (в нашем случае - [(car (entsel))]) - необязательно должна совпадать своим названием с аргументом той функции, которой она скармливается (функции второго уровня) - главное, чтоб у нее был нужный, подходящий тип (если нужен vla-объект, то он, если, например, строка - то она, если число, то оно) Цитата:
В общем, код должен выглядеть как-то так: Код:
Код:
Код:
Код:
Для таких своих библиотечных функций разумно делать свой собсвтенный префикс, например: modest_getobjID А затем пишем оболочку: Код:
Если при выполнении кода появится сообщение об отсутствии в чертеже описания какой-то функции, вроде того Код:
А учиться лучше по нашей великолепнейшей "Азбуке" от Николая Полещука и Петра Лоскутова - "AutoLISP и Visual LISP в среде AutoCAD". Довольно старая Вещь, но актуальная до сих пор. И все еще есть на Озоне в формате pdf - и совсем недорого. Ну и тема "Научите лиспу на примере..." - тоже весьма полезна, хоть и довольно ёмкая по размеру. Удачи в постижении Для начала это будет трудновато, на мой взгляд. Если не невозможно. |
|||
|
|||||||
Регистрация: 15.04.2019
Сообщений: 58
|
Большое спасибо, koMon, skkkk!
Сегодня вечером засяду разбираться с вашими подсказками! ----- добавлено через ~5 ч. ----- Цитата:
То есть загнали мы в "какую-то" переменную некие данные. Кроме этой переменной данные этого же типа могут лежать в любом количестве других переменных. Далее нам надо эти данные именно из этой переменной использовать в работе какой-то процедуры, выполняющей какую-то функцию. Каким образом эта функция узнаёт, из какой именно переменной ей брать данные, если я ей это не укажу? Вот, следуя этой логике, я и указал в аргументе _dwgru-block-get-attr-by-mask, что речь идёт об объекте, указатель на который лежит в переменной obj (ну, судя по разъяснениям, вы догадались, чего я этим всем имел в виду). Цитата:
----- добавлено через ~5 ч. ----- Цитата:
Дальняя перспекива - это получить два ID: самого объекта и пользовательского атрибута. С получением идентификатора объекта я уже разобрался. Сейчас у меня забота как раз про получение ID невидимого атрибута (в этом конкретном случае - с тэгом "ТИП"). А саааамый дальний предел - получать ещё и ссылки на параметры выбранного блока по их имени. Но это для меня сейчас настолько высокий пилотаж, что пока не разберусь с этими двумя задачами - туда и не сунусь. Так вот. Именно по этой причине (т.е. с пристрелкой к дальнейшему объединению процедур, извлекающих два этих ID) я и сделал команду, которая всего лишь выбирает объект, после чего будет запускать функции, извлекающие идентификаторы из выбранного командой объекта. Ну а ниже по коду планирую просто дописать эти самые функции. Поэтому, наверное, оборачивать командой все эти функции было бы не лучшим выбором (с точки зрения простоты последующего расширения функционала этой вызываемой команды). Или я вас неправильно понял? ----- добавлено через ~6 ч. ----- Цитата:
Да, это сделал. Вот, что в итоге получилось (на случай, если с такой же проблемой столкнётся ещё кто-то, кроме меня): Код:
Цитата:
Цитата:
Спасибо огромное! Вы очень помогли! Спасибо всем, кто проявил внимание к теме и помогал мне в поиске решения! Далее примусь за новый уровень: попробую извлечь из блока ссылки на параметры (или как оно называется), которые будут определяться по имени параметра. Чтобы аналогичную процедуру можно было бы применять ко всем блокам, у которых есть параметры с нужным именем. И, похоже, не смогу обойтись без того, чтобы создать здесь новую тему ----- добавлено через ~12 ч. ----- koMon, всё работает, но, не понимая, как оно работает, успокоиться не могу)))) Попробовал разобрать код, и вот, какие вопросы возникли (в комментариях написал): Код:
|
||||||
|
||||
Регистрация: 20.03.2008
Сообщений: 2,653
|
Цитата:
Код:
Код:
Вероятно, koMon не увидит этого дополнения, потому что оно не покажется, как новое сообщение в теме, поэтому отвечу вместо него. По логике этого кода данная переменная используется в качестве аргумента-условия для функции создания цикла (while). По-русски это значит, что пока ("while" так и переводится - "пока", "до тех пор, пока") переменная имеет значение (не nil), то всё, что внутри скобок функции while будет выполнятся циклически. Если в начале одного из следующих циклов этой переменной не будет присвоено значение, то цикл прервется, равно как и при назначении ей nil сознательно, например, в случае, если это не блок или поймалась какая-то ошибка. |
|||
|
Опции темы | Поиск в этой теме |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Значение атрибута в текстовое поле динамического блока | zekatyumen | Динамические блоки | 19 | 28.01.2023 09:26 |
Как установить значения атрибутов динамического блока? | Diam Finn | .NET | 3 | 14.01.2020 18:30 |
LISP. Помогите с лиспом по переименованию нескольких вхождений динамического блока в значение его атрибута. | kirillwu | LISP | 43 | 09.07.2018 13:29 |
Изменение атрибута блока , который находится в блоке (из пространства модели) | konservnii | LISP | 17 | 28.03.2017 15:22 |
Lisp. Как добраться до подсказки атрибута блока | молодой человек | LISP | 8 | 25.11.2010 09:20 |