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

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

Программное создание lookup table

Ответ
Поиск в этой теме
Непрочитано 10.07.2025, 10:13 #1
Программное создание lookup table
Ax3
 
Programming, automation, CADs, GISs. СибМИР
 
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 315

Привет, браться по каду.
Программно создать сам lookup могу через (vl-cmdf "_.bparameter" ...).
Программно создать lookup table к нему (vl-cmdf "_.baction") не получается, в момент создания lookupaction (AcDbBlockLookupActionEntity) выскакивает визуальная форма для заполнения lookup table, и никак её не подавить.
Программу для заполнения lookup table из экселя на форуме видел, но даже она требует предварительно создать колонки lookup table пользователем в визуальном интерфейсе.

какой-нибудь бы аналог entmakex, но для lookupactions...
буду признателен за идеи.
__________________
На LISPе можно мыслить!
Просмотров: 1169
 
Автор темы   Непрочитано 10.07.2025, 18:24
#2
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


нашёл вот это:
https://forum.abok.ru/index.php?showtopic=14612&st=573

и вот это:
https://forum.dwg.ru/showthread.php?p=182362#post182362

разбираюсь...

п.с. и вот это ещё:
https://forum.dwg.ru/showthread.php?t=14519
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 13.07.2025 в 01:01.
Ax3 вне форума  
 
Автор темы   Непрочитано 11.07.2025, 14:06
#3
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


в общем, по результатам осмысления наработок Kpblc и Supermax наваял на основе программы Supermax-а (по записи лукапов из экселя, у меня с ходу не заработала, пришлось разбираться) некую версию, которая выдаёт следующий результат:
(eval_graf_output)
("n18=" ((-1 . <Entity name: 1f260db1a60>) (0 . "BLOCKLOOKUPACTION") (330 . <Entity name: 1f260db1900>) (5 . "7F9296") (100 . "AcDbEvalExpr") (90 . 11) (98 . 33) (99 . 202) (100 . "AcDbBlockElement") (300 . "Lookup1") (98 . 33) (99 . 202) (1071 . 0) (100 . "AcDbBlockAction") (70 . 0) (71 . 0) (1010 121.607 -73.3569 0.0) (100 . "AcDbBlockLookupAction") (92 . 1) (93 . 1) (301 . "") (302 . "123") (303 . "") (94 . 5) (95 . 1) (96 . 0) (282 . 1) (305 . "Custom") (281 . 1) (304 . "lookupString") (280 . 1)))
("n18new=" ((-1 . <Entity name: 1f260db1a60>) (0 . "BLOCKLOOKUPACTION") (330 . <Entity name: 1f260db1900>) (5 . "7F9296") (100 . "AcDbEvalExpr") (90 . 11) (98 . 33) (99 . 202) (100 . "AcDbBlockElement") (300 . "Lookup1") (98 . 33) (99 . 202) (100 . "AcDbBlockAction") (70 . 0) (71 . 0) (100 . "AcDbBlockLookupAction") (92 . 1) (93 . 1) (301 . "") (302 . "123") (303 . "") (94 . 5) (95 . 1) (96 . 0) (282 . 1) (305 . "Custom") (281 . 1) (304 . "lookupString") (280 . 1)))
("(entmod n18new)=" nil)
("n22=" ((-1 . <Entity name: 1f260db1a60>) (0 . "BLOCKLOOKUPACTION") (330 . <Entity name: 1f260db1900>) (5 . "7F9296") (100 . "AcDbEvalExpr") (90 . 11) (98 . 33) (99 . 202) (100 . "AcDbBlockElement") (300 . "Lookup1") (98 . 33) (99 . 202) (100 . "AcDbBlockAction") (70 . 0) (71 . 0) (100 . "AcDbBlockLookupAction") (92 . 1) (93 . 1) (301 . "") (302 . "000") (303 . "") (94 . 5) (95 . 1) (96 . 0) (282 . 1) (305 . "Custom") (281 . 1) (304 . "lookupString") (280 . 1)))
("(entmod n22):" nil)
("(entupd (cdr (car n22))):" nil)

В темах про динамические блоки ("Мои динамические блоки" и "Мои динамические блоки 2"), где это обсуждалось, не могу отписаться, т.к. обе закрыты.
Я так понял, что смысл выполняемых преобразований сводится к тому, чтобы в dxf-списке словаря, отвечающего за таблицу значений лукапа, заменить 302 группы на пары, содержащие нужные значения, попутно удалив группы 1071 и 1010, и сделать entmod по модифицированному списку.
Но, видимо, всё сложнее, т.к. у меня entmod не отрабатывает, возвращает nil, соответственно и содержимое lookup table не меняется...

Kpblc, Supermax, если заглянете в эту тему, буду благодарен за подсказки, куда дальше копать.

П.С. На появляющуюся при создании lookupaction визуальную форму я вообще забил, думаю, скажу пользователям, чтоб просто тыкали OK и ничего в ней не делали. Если получится программно скорректировать lookup table, конечно.
П.П.С. У меня параметр lookup1, к нему присоединена таблица lookup table с одним возможным значением "123" (вывод значения n18 это показывает в группе (302."123")), я пытаюсь это значение заменить на "000" (в выводе значения n22 видно (302."000"))
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 11.07.2025 в 14:33.
Ax3 вне форума  
 
Автор темы   Непрочитано 13.07.2025, 01:00
#4
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


Понятно. В AutoCAD 2007 (entmod) для BLOCKLOOKUPACTION работает, и работало у supermax-а соответственно. В AutoCAD 2018 уже не работает.
Ради интереса проверял в ACAD2018 вручную несколько версий урезанных списков, сработал только один вариант, не содержащий вообще никаких кодов, кроме entity name:
;(entmod (list (cons -1 (handent "7E5993")))) ;- ok
;(entmod (list (cons -1 (handent "7E5993")) (cons 302 "123"))) ; - nok
;(entmod (list (cons -1 (handent "7E5993")) (cons 302 "000"))) ; - nok
;(entmod (list (cons -1 (handent "7E5993")) (cons 301 "000") (cons 302 "000") (cons 303 ""))) ; - nok
;(entmod (list (cons -1 (handent "7E5993")) (cons 92 1) (cons 301 "000") (cons 302 "000") (cons 303 ""))) ; - nok
;(entmod (list (cons -1 (handent "7E5993")) (cons 305 "Custom"))) ; - nok
;(entmod (list (cons -1 (handent "7E5993")) (cons 0 "BLOCKLOOKUPACTION"))) ; - ok
;(entmod (list (cons -1 (handent "7E5993")) (cons 0 "BLOCKLOOKUPACTION") (cons 330 (handent "7E5984")) )) ; - nok
;(entmod (list (cons -1 (handent "7E5993")) (cons 0 "BLOCKLOOKUPACTION") (cons 5 "7E5993") )) ; - nok
;(entmod (list (cons -1 (handent "7E5993")) (cons 0 "BLOCKLOOKUPACTION") (cons 100 "AcDbEvalExpr"))) ; - nok
;(entmod (list (cons -1 (handent "7E5993")) (cons 0 "BLOCKLOOKUPACTION") (cons 90 9))) ; - nok
;(entmod (list (cons -1 (handent "7E5993")) (cons 0 "BLOCKLOOKUPACTION") (cons 300 "Lookup1"))) ; - nok
;(entmod (list (cons -1 (handent "7E5993")) (cons 0 "BLOCKLOOKUPACTION") (cons 305 "Custom"))) ; - nok

Ладно, буду дальше копать...
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 13.07.2025, 18:02
#5
Кулик Алексей aka kpblc
Moderator

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


Насколько я помню, в 2016 версии что-то там поменяли, и коды SuperMax'а работать перестали. А так-то открытого API для подобной модификации дин.блоков вроде бы нет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.07.2025, 23:37
#6
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


ну в общем, шляпа полная.
почитал ещё здесь:
http://poleshchuk.spb.ru/cad/2009/tainypod12.htm
пишут, что вроде у них в 2016-м каде заработало, но у меня в 2018-м ничего не заработало.
Вывод: entmod работает с acad_evaluation_graph, но не работает с blocklookupaction.

Короче, единственное решение, которое вижу - экспортировать блок в dxf и уже в dxf-файле находить BLOCKLOOKUPACTION и править его коды: 92 - количество позиций в lookup table, 302 - значения позиций.
Попробовал вручную откорректировать dxf-файл блока - работает, модифицированный dxf-файл открывается и отображает три позиции в lookup table, которые я задал.

попробую придумать как это автоматизировать, если что получится - выложу здесь.
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Автор темы   Непрочитано 28.07.2025, 23:56
#7
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


файлы примера
Вложения
Тип файла: zip lookup_Hawk_v3_2025.07.28_f.2018.zip (39.7 Кб, 2 просмотров)
Тип файла: zip lookup_Hawk_v3_2025.07.28_f.2018_new2.zip (39.7 Кб, 3 просмотров)
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Автор темы   Непрочитано 29.07.2025, 16:53
#8
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


Ну как-то так. вложил архив. Корявая кривая версия, но главное достоинство - работает. Всё делается через временные дхф-файлы и временные блоки, которые сразу удаляются. Для пользователя выглядит как изменение лукапа не отходя от кассы. Текущая версия не увеличивает количество записей в лукапе, это баг, то есть если в лукапе 2 позиции, а вы хотите сделать 3 - не получится. Но это исправится в ближайшее время.
запускать можно как из модели, так и из блокэдитора. Имя блока надо задавать явно, не хочу разбираться с его автоматическим получением, это уж желающие сами как-нибудь.

Комментарий к использованию.
Открываем в каде файл lookup_Hawk_v3_2025.07.28.dwg.
Загружаем приложение hawks__edit_lookup_table__wblock_version_1_2025.07.29-2.lsp.
Вызываем функцию:
(hawks__edit_lookup_via_wblock "__[e.sch.]__+[Гидравлика]__[Сх.Авт.]__Запорно-рег арматура 2-ходовая_v2.01+" "Lookup1" "anylookup2" (list "1new" "2new"))
где
"__[e.sch.]__+[Гидравлика]__[Сх.Авт.]__Запорно-рег арматура 2-ходовая_v2.01+" - имя блока
"Lookup1" - текущее имя лукапа, который нужно править
"anylookup2" - новое имя того же лукапа, может совпадать с исходным
(list "1new" "2new") - новый список выбора для лукапа
и видим, как меняется название лукапа и содержимое его лукап-таблицы.

Важно. Вообще после изменения дхф-кодов блок с точки зрения када получается немного поломанным, поэтому в программе специально сделано несколько сохранений блока - при сохранении кад исправляет дхф-структуру блока по каким-то своим соображениям. Если этих сохранений не делать, кад может вылетать при каких-то манипуляциях с блоком.
А, и ещё важно. После выполнения программы изменённый блок, который вы видите, соответственно уже сохранён с тем же именем, которое вы указали при вызове функции, то есть исходный блок сразу перезаписывается на новый. Если надо отменить изменения блока - надо закрывать чертёж без сохранения.
Вложения
Тип файла: zip hawks__edit_lookup_table__wblock_version_1_2025.07.29-2.zip (60.5 Кб, 2 просмотров)
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 29.07.2025 в 17:01.
Ax3 вне форума  
 
Непрочитано 29.07.2025, 17:16
#9
Cfytrr

Балка на балку, кирпич на кирпич...
 
Регистрация: 09.10.2007
Питер
Сообщений: 4,909
Отправить сообщение для Cfytrr с помощью Skype™


Ax3,
Скажите а сделать копию существующего lookup table с тем же содержимым но с другим именем можно?
__________________
...переменная FILEDIA создана для привлечения пользователей к форумам.
Cfytrr вне форума  
 
Автор темы   Непрочитано 29.07.2025, 19:55
#10
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


не знаю, я такого рода магией не занимаюсь, да мне и незачем. лукапы и lookup actions прекрасно создаются через vl-cmdf, по крайней мере я в рамках своих задач так поступаю (а во всплывающее окно после создания lookup action пользователь просто должен ткнуть ОК), а дальше их можно редактировать предложенной программой, по крайней мере я так планирую.
вся эта магия с dxf, которая позволяла копировать лукапы, описана в статьях, ссылки на которые я привёл в первых постах, но всё это у меня не заработало в кадах начиная с 2018-го. А по аналогии шаманить с кодами в дхф-файлах я точно не готов.
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Автор темы   Непрочитано 29.07.2025, 20:03
#11
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


Обновил программку. Исправлен баг, теперь вроде любое желаемое новое количество строк в lookup table корректно отрабатывается.
Программу выкладываю как есть, никому не навязываю, критику соответственно тоже не принимаю, поддержку не оказываю, предложения по оптимизации, если будут, с интересом почитаю, но сильно заморачиваться по доработке этой наспех состряпанной программы пока не планирую.
За информацию о тестировании в разных версиях, с разными блоками, о багах и глюках буду признателен, но обещать быстрые исправления не могу, времени нет.
Кому пригодится - пользуйтесь, кому не надо - не пользуйтесь. Под свои задачи каждый сам дорабатывает. Я свою задачу вроде решил.

Дублирую инструкции по использованию.
запускать можно как из модели, так и из блокэдитора. Имя блока надо задавать явно, не хочу разбираться с его автоматическим получением, это уж желающие сами как-нибудь.
Открываем в каде свой файл или файл примера "lookup_Hawk_v3_2025.07.28.dwg".
Загружаем приложение из файла hawks__edit_lookup_table__wblock_version_1_2025.07.29-3.lsp.
Вызываем функцию (при необходимости параметры вписываем свои):
(hawks__edit_lookup_via_wblock "__[e.sch.]__+[Гидравлика]__[Сх.Авт.]__Запорно-рег арматура 2-ходовая_v2.01+" "Lookup1" "anylookup2" (list "1new" "2new"))
где
"__[e.sch.]__+[Гидравлика]__[Сх.Авт.]__Запорно-рег арматура 2-ходовая_v2.01+" - имя блока
"Lookup1" - текущее имя лукапа, который нужно править
"anylookup2" - новое имя того же лукапа, может совпадать с исходным
(list "1new" "2new") - новый список выбора для лукапа
и видим, как меняется название лукапа и содержимое его лукап-таблицы.

Важно. Вообще после изменения дхф-кодов блок с точки зрения када получается немного поломанным, поэтому в программе специально сделано несколько сохранений блока - при сохранении кад исправляет дхф-структуру блока по каким-то своим соображениям. Если этих сохранений не делать, кад может вылетать при каких-то манипуляциях с блоком.
А, и ещё важно. После выполнения программы изменённый блок, который вы видите, соответственно уже сохранён с тем же именем, которое вы указали при вызове функции, то есть исходный блок сразу перезаписывается на новый. Если надо отменить изменения блока - надо закрывать чертёж без сохранения.

Дополнение. С русскоязычными значениями для lookup_table есть проблема, кад ругается на dxf-файл, содержащий русскоязычные тексты для лукап таблицы.

Дополнение 2. Поскольку я не редактирую раздел Evaluation graph в dxf-файле (не овладел пока этой магией), лукапы после такого программного редактирования при вставке могут не отображаться или могут не меняться их значения на выбранные пользователем. Бороться с этим можно двумя способами: 1. При вставке к вашему лукапу lookup action в открывающемся окне заполнения lookup table указать хотя бы одно значение, тогда eval_graph автоматически подхватывает лукап с непустой таблицей; 2. Для уже созданных лукапов с отредактированными программно lookup tables при необходимости я делаю вручную "Display lookup table" и OK для каждого лукапа, после этого ACAD_EVALUATION_GRAPH чинится сам, и лукапы вставленного экземпляра блока отображаются и корректно работают. Когда-нибудь с этим тоже, надеюсь, разберусь.
#todo: dxf-коды 281 и ACAD_EVALUATION_GRAPH
Вложения
Тип файла: zip hawks__edit_lookup_table__wblock_version_1_2025.07.29-3.zip (60.7 Кб, 1 просмотров)
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 12.08.2025 в 15:28.
Ax3 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Программное создание lookup table



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программное создание мультивыноски Makswell Программирование 64 06.02.2025 19:39
Программное создание сплайна Fedorino Программирование 5 01.04.2014 11:06
Редактор блоков - Lookup table не редактируется Acad2006 ытя AutoCAD 12 17.10.2011 18:00
программное создание размеров в dxf файле _Oleg_ Программирование 4 01.02.2011 16:36
Программное создание стиля для mleader AutoCAD 2008 swkx Программирование 6 15.04.2010 20:11