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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Можно ли использовать функцию dictsearch для поиска значения поля данных в заданном словаре?

Можно ли использовать функцию dictsearch для поиска значения поля данных в заданном словаре?

Ответ
Поиск в этой теме
Непрочитано 05.12.2022, 05:19 #1
Можно ли использовать функцию dictsearch для поиска значения поля данных в заданном словаре?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,079

Прочитал два источника по работе функции dictsearch: книгу, и сайт
Примеров мало. Когда путаюсь повторить пример, программа не работает, говорит ошибка типов в вводных данных.
Самый главный вопрос: функция ищет все словари или заданный пользователем? На каком месте вводных данных надо указывать имя словаря?
Что еще за параметр указывается в водных данных?
Пример с сайта: (setq newdictlist (dictsearch (namedobjdict) "my_way_cool_dictionary"))
Что такое (namedobjdict)? Зачем в описание одной функции добавлять другую неизвестную функцию?
Вот мой пример: (dictsearch DicStyleType "ACAD_TABLESTYLE") возвращает ошибку: ; ошибка: неверный тип аргумента: lentityp nil
Можно ли использовать функцию dictsearch для поиска значения поля данных в заданном словаре?

Последний раз редактировалось МишаИнженер, 05.12.2022 в 05:41.
Просмотров: 1995
 
Непрочитано 05.12.2022, 09:03
#2
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 470


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Зачем в описание одной функции добавлять другую неизвестную функцию?
Кто таки сказал что это неизвестная функция? Вполне себе известная.

Попробуй для начала вызвать её одну, посмотри, что она возвращает.
Потом дальше двигаться будешь.

И да - (entget) не забудь таки.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 05.12.2022, 09:17
#3
name02


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


Смотри хелп https://help.autodesk.com/view/ACD/2...5-8AC201E310EE
И смотри книги из постов https://forum.dwg.ru/showthread.php?...06#post2014806
name02 на форуме  
 
Непрочитано 05.12.2022, 09:27
#4
Сергей812


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


Offtop: имхо, после vba проще в vb.net было бы перейти, чем перестраивать мозг под списочную сущность лиспа)
Сергей812 вне форума  
 
Автор темы   Непрочитано 05.12.2022, 10:42
#5
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Пока остановился на таком коде:
Код:
[Выделить все]
 
(setq Dictionary (dictsearch (entget (namedobjdict)) "ACAD_TABLESTYLE"))
Но функция dictsearch выдает ошибку:
ошибка: неверный тип аргумента: lentityp ((-1 . <Имя объекта: 46ab2548c0>) (0 . "DICTIONARY") (330 . <Имя объекта: 0>) и т.д.
Почему неправильно вызывается функция dictsearch? Вроде все по справке, имя библиотеки на последнем месте.
Почему неотфильтровывается библиотека "ACAD_TABLESTYLE"?
МишаИнженер вне форума  
 
Непрочитано 05.12.2022, 11:00
#6
Кулик Алексей aka kpblc
Moderator

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


Справку внимательно прочитай. Что там надо в dictsearch-то подсовывать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.12.2022, 11:05
1 | #7
koMon


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


Код:
[Выделить все]
 (setq Dictionary (dictsearch (namedobjdict) "ACAD_TABLESTYLE"))
__________________
K Lisp
koMon вне форума  
 
Непрочитано 05.12.2022, 11:10
1 | #8
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 470


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
И да - (entget) не забудь таки.
Это я писал, чтобы ты смог увидеть на экране, что возвращает функция.

И только.

Зачем же эти данные пытаться скормить функции (dictsearch … ) ?!
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 05.12.2022, 11:21
#9
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Цитата:
Сообщение от koMon Посмотреть сообщение
(setq Dictionary (dictsearch (namedobjdict) "ACAD_TABLESTYLE"))
Работает! Спасибо большое!
Библиотека получена. А какая функция позволяет получить из этой библиотеки значение стиля таблицы?
Раньше я думал что поиск в библиотеке делает функция dictsearch. Оказалось наоборот эта функция ищет саму библиотеку.
А как теперь найти нужное значение в самой библиотеке?
МишаИнженер вне форума  
 
Непрочитано 05.12.2022, 11:44
#10
koMon


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


стиль таблицы можно найти гораздо проще:
Код:
[Выделить все]
 (vla-get-stylename (vlax-ename->vla-object (car (entsel))))
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 05.12.2022, 12:20
#11
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Цитата:
Сообщение от koMon Посмотреть сообщение
(vla-get-stylename (vlax-ename->vla-object (car (entsel))))
Спасибо большое! Добавил ваш код к себе в программу:
Код:
[Выделить все]
 
(while (setq el (car (entsel "\n Выбери объект:")))
;entsel выдает имя объекта и все остальное, car - Извлекает первый элемент из списка: имя объекта
;команды которые должны выполняться в цикле пока не будет пустой ввод
  (setq dan (entget el));получает список с характеристиками примитива
  (setq name0 (assoc 0 dan)) ;получаем имя объекта
  (setq name (cdr name0))
  (princ name)
;;;  (alert (strcat "Был выбран " name))
  (princ (strcat "Был выбран " name))
  (setq cLayer0 (assoc 8 dan)) ;получаем имя объекта
  (setq cLayer (cdr cLayer0))
  (setq cLWeight0 (assoc 370 dan)) ;получаем текущий вес линии
  (setq cLWeight (cdr cLWeight0))
  (setq cLType0 (assoc 6 dan)) ;получаем текущий тип линии
  (setq cLType (cdr cLType0))  
  (setq cLTypeScale0 (assoc 48 dan)) ;получаем текущий масштаб типа линии
  (setq cLTypeScale (cdr cLTypeScale0))
  (setq cColor0 (assoc 62 dan)) ;получаем текущий цвет
  (setq cColor (cdr cColor0))
  (setq cThick0 (assoc 39 dan)) ;получаем текующую толщину
  (setq cThick (cdr cThick0))
  
;Назначим текущим слой выбранного объекта (setvar "clayer" <имя слоя>)
  (setvar "clayer" cLayer)
  (princ (strcat (chr 10) "Был назначен текущий слой " (chr 34) cLayer (chr 34)))
;Назначим текущий вес линий
  (cond ((eq cLWeight nil)
		(setvar "CELWEIGHT" -1)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоСлою" (chr 34)))
		)
	((eq cLWeight -2)
		(setvar "CELWEIGHT" -2)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоБлоку" (chr 34)))
		)
	((eq cLWeight -3)
		(setvar "CELWEIGHT" -3)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоУмолчанию" (chr 34)))
		)
	(t 
		(setvar "CELWEIGHT" cLWeight)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) (rtos (/ cLWeight 100.0)) (chr 34)))
	)
   )
;Назначим текущий тип линии
  (cond ((eq cLType nil)
		(setvar "CELTYPE" "ByLayer")
		(princ (strcat (chr 10) "Был назначен текущий тип линий " (chr 34) "ПоСлою" (chr 34)))
		)
	(t 
		(setvar "CELTYPE" cLType)
		(princ (strcat (chr 10) "Был назначен текущий тип линий " (chr 34) cLType (chr 34)))
	)
   )
;Назначим текущий масштаб типа линии
  (cond ((eq cLTypeScale nil)
		(setvar "CELTSCALE" 1)
		(princ (strcat (chr 10) "Был назначен текущий масштаб типа линий " (chr 34) "1" (chr 34)))
		)
	(t 
		(setvar "CELTSCALE" cLTypeScale)
		(princ (strcat (chr 10) "Был назначен текущий масштаб типа линий " (chr 34) (rtos cLTypeScale) (chr 34)))
	)
   )
;Назначим ткущий цвет чертежа
  (cond ((eq cColor nil)
		(setvar "CECOLOR" "ByLayer")
		(princ (strcat (chr 10) "Был назначен текущий цвет " (chr 34) "ПоСлою" (chr 34)))
		)
	((eq cColor 0)
		(setvar "CECOLOR" "ByBlock")
		(princ (strcat (chr 10) "Был назначен текущий цвет " (chr 34) "ПоБлоку" (chr 34)))
		)
	(t 
		(setvar "CECOLOR" (rtos cColor))
		(princ (strcat (chr 10) "Был назначен текущий цвет " (chr 34) (rtos cColor) (chr 34)))
	)
   )
;Назначаем текущую толщину
  (cond ((eq cThick nil)
		(setvar "THICKNESS" 0)
		(princ (strcat (chr 10) "Была назначена текущая толщина " (chr 34) "0" (chr 34)))
		)
	(t 
		(setvar "THICKNESS" cThick)
		(princ (strcat (chr 10) "Была назначена текущая толщина " (chr 34) (rtos cThick) (chr 34)))
	)
   )
;Назначим особые свойства для сложных объектов
  (setq TypeObj (strcase name)) 
  (cond 
	((eq TypeObj "ACAD_TABLE")

	 	(setq StyleTable (vla-get-stylename (vlax-ename->vla-object (car dan))))

		(setvar "CTABLESTYLE" (rtos StyleTable))
		(princ (strcat (chr 10) "Был назначен текущий стиль таблиц " (chr 34) (rtos StyleTable) (chr 34)))
	)
  )
)
Но почему-то строка (setq StyleTable (vla-get-stylename (vlax-ename->vla-object (car dan))))
(в самом конце программы)
выдает ошибку ; ошибка: неверный тип аргумента: lentityp (-1 . <Имя объекта: 46ac317f60>)
Что там неправильно?
МишаИнженер вне форума  
 
Непрочитано 05.12.2022, 12:29
1 | #12
name02


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


vlax-ename->vla-object преобразует объект в vla-объект. Соответственно ему нужно подсовывать объект, а у тебя подсовывается список - применяй к списку cdr
И еще раз - читай справку https://help.autodesk.com/view/ACD/2...A-3C27E89A0AD4
name02 на форуме  
 
Непрочитано 05.12.2022, 12:31
1 | #13
koMon


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


д.б. или (cdr dan) или el

----- добавлено через ~5 мин. -----
(rtos StyleTable) - StyleTable - строка, а не вещественное число
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 05.12.2022, 13:10
#14
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Цитата:
Сообщение от name02 Посмотреть сообщение
vlax-ename->vla-object преобразует объект в vla-объект
Спасибо большое!
У меня все заработало вот в таком виде:
Код:
[Выделить все]
 
(while (setq el (car (entsel "\n Выбери объект:")))
;entsel выдает имя объекта и все остальное, car - Извлекает первый элемент из списка: имя объекта
;команды которые должны выполняться в цикле пока не будет пустой ввод
  (setq dan (entget el));получает список с характеристиками примитива
  (setq name0 (assoc 0 dan)) ;получаем имя объекта
  (setq name (cdr name0))
  (princ name)
;;;  (alert (strcat "Был выбран " name))
  (princ (strcat "Был выбран " name))
  (setq cLayer0 (assoc 8 dan)) ;получаем имя объекта
  (setq cLayer (cdr cLayer0))
  (setq cLWeight0 (assoc 370 dan)) ;получаем текущий вес линии
  (setq cLWeight (cdr cLWeight0))
  (setq cLType0 (assoc 6 dan)) ;получаем текущий тип линии
  (setq cLType (cdr cLType0))  
  (setq cLTypeScale0 (assoc 48 dan)) ;получаем текущий масштаб типа линии
  (setq cLTypeScale (cdr cLTypeScale0))
  (setq cColor0 (assoc 62 dan)) ;получаем текущий цвет
  (setq cColor (cdr cColor0))
  (setq cThick0 (assoc 39 dan)) ;получаем текующую толщину
  (setq cThick (cdr cThick0))
  
;Назначим текущим слой выбранного объекта (setvar "clayer" <имя слоя>)
  (setvar "clayer" cLayer)
  (princ (strcat (chr 10) "Был назначен текущий слой " (chr 34) cLayer (chr 34)))
;Назначим текущий вес линий
  (cond ((eq cLWeight nil)
		(setvar "CELWEIGHT" -1)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоСлою" (chr 34)))
		)
	((eq cLWeight -2)
		(setvar "CELWEIGHT" -2)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоБлоку" (chr 34)))
		)
	((eq cLWeight -3)
		(setvar "CELWEIGHT" -3)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоУмолчанию" (chr 34)))
		)
	(t 
		(setvar "CELWEIGHT" cLWeight)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) (rtos (/ cLWeight 100.0)) (chr 34)))
	)
   )
;Назначим текущий тип линии
  (cond ((eq cLType nil)
		(setvar "CELTYPE" "ByLayer")
		(princ (strcat (chr 10) "Был назначен текущий тип линий " (chr 34) "ПоСлою" (chr 34)))
		)
	(t 
		(setvar "CELTYPE" cLType)
		(princ (strcat (chr 10) "Был назначен текущий тип линий " (chr 34) cLType (chr 34)))
	)
   )
;Назначим текущий масштаб типа линии
  (cond ((eq cLTypeScale nil)
		(setvar "CELTSCALE" 1)
		(princ (strcat (chr 10) "Был назначен текущий масштаб типа линий " (chr 34) "1" (chr 34)))
		)
	(t 
		(setvar "CELTSCALE" cLTypeScale)
		(princ (strcat (chr 10) "Был назначен текущий масштаб типа линий " (chr 34) (rtos cLTypeScale) (chr 34)))
	)
   )
;Назначим ткущий цвет чертежа
  (cond ((eq cColor nil)
		(setvar "CECOLOR" "ByLayer")
		(princ (strcat (chr 10) "Был назначен текущий цвет " (chr 34) "ПоСлою" (chr 34)))
		)
	((eq cColor 0)
		(setvar "CECOLOR" "ByBlock")
		(princ (strcat (chr 10) "Был назначен текущий цвет " (chr 34) "ПоБлоку" (chr 34)))
		)
	(t 
		(setvar "CECOLOR" (rtos cColor))
		(princ (strcat (chr 10) "Был назначен текущий цвет " (chr 34) (rtos cColor) (chr 34)))
	)
   )
;Назначаем текущую толщину
  (cond ((eq cThick nil)
		(setvar "THICKNESS" 0)
		(princ (strcat (chr 10) "Была назначена текущая толщина " (chr 34) "0" (chr 34)))
		)
	(t 
		(setvar "THICKNESS" cThick)
		(princ (strcat (chr 10) "Была назначена текущая толщина " (chr 34) (rtos cThick) (chr 34)))
	)
   )
;Назначим особые свойства для сложных объектов
  (setq TypeObj (strcase name)) 
  (cond 
	((eq TypeObj "ACAD_TABLE")
	 	(setq StyleTable (vla-get-stylename (vlax-ename->vla-object el)))
		(setvar "CTABLESTYLE" StyleTable)
		(princ (strcat (chr 10) "Был назначен текущий стиль таблиц " (chr 34) StyleTable (chr 34)))
	)

  )
)
Все работае! Ещё раз спасибо!
МишаИнженер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Можно ли использовать функцию dictsearch для поиска значения поля данных в заданном словаре?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не обновляются значения атрибутов внутри блока (поля свойств подшивки) Trust Me AutoCAD 4 17.05.2022 10:30
Можно ли в формуле поля или в таблицы использовать условие "если" staer AutoCAD 9 11.06.2019 12:37
Можно ли использовать привозную воду для временного водоснабжения строительной площадки? Iren1605 Технология и организация строительства 16 21.03.2014 09:53
Можно ли использовать наружную металлическую лестницу для эвакуации? Arisrtarh Архитектура 2 03.03.2014 11:04
Можно ли использовать трубы НПВХ в системе подачи воздуха в аэраторы в аэротенк? Базыль Инженерные сети 1 18.02.2014 13:37