AutoLisp и getkword + getstring
В скрипте нужно выбрать слой из списка в консоли и динамическом меню.
При наличии слоёв начинающихся на одну букву выбор слоя getkword приводит каждый раз к выбору одного из них независимо от желания пользователя. А getstring передаёт только одну букву.
;; Получаем активный документ
(setq acadObject (vlax-get-acad-object))
(setq doc (vla-get-activedocument acadObject))
;; Получаем коллекцию слоев чертежа
(setq layers (vla-get-layers doc))
;; Создаем список имен слоев и строку для отображения пользователю
(setq layerNames "")
(setq promptString "")
(vlax-for layer layers
(setq name (vla-get-name layer))
(setq layerNames (strcat layerNames name " "))
(setq promptString (strcat promptString name "/"))
)
;; Убираем последний разделитель из строки promptString
(setq promptString (vl-string-left-trim "/" (vl-string-right-trim "/" promptString)))
;; Используем initget и getkword для выбора слоя
(initget 1 layerNames)
(setq layerName (getkword (strcat "\nВыберите слой [" promptString "]: ")))
;; Проверяем, существует ли введенное имя слоя в списке
(setq layerName (vl-string-left-trim " " layerName))
(princ (strcat "\nВы выбрали слой: " layerName))
В автокаде этот скрипт себя ведёт так же. Как решить задачу?
И кстати тут код не вставляется блоком?
Ответы
-
Все имена переводи в верхний регистр. И как будут обрабатываться знаки подчеркивания лично я не знаю.
Тому, кто разрабатывал и тестировал (если тестировал!) движок форума, нужно оторвать все что шевелится. Чтоб даже почкованием не размножался! На раздел подписка оформлена - а письма ни фига не приходят. Код не вставить, предпросмотра навскидку не видать и теде.
Код не проверял от слова совсем.
(vl-load-com)
(defun c:get-layer (/ adoc layer_list fun_conv-list-to-string answer)(defun fun_conv-list-to-string (lst sep)
(strcat (car lst)
(apply
(function strcat)
(mapcar
(function
(lambda (x)
(strcat sep x)
)
)
(cdr lst)
)
)
)
)(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vlax-for item (vla-get-layers adoc)
(setq layer_list (cons (strcase (vla-get-name item)) layer_list))
)
(setq layer_list (vl-sort layer_list (function <)))
(initget 1 (fun_conv-list-to-string layer_list " "))
(setq answer (getkword (strcat "\nSelect layer name ["
(fun_conv-list-to-string layer_list "/")
"] <Cancel> : "
)
)
)
(princ (strcat "\nSelected name is "" answer """))
(princ)
)1
Разделы
- Все разделы
- 50 Общие вопросы
- 47 Работа nanoCAD в ОС Linux
- 367 Платформа nanoCAD
- 14 nanoCAD GeoniCS
- 85 nanoCAD BIM Строительство
- 42 nanoCAD Механика PRO
- 52 nanoCAD BIM Электро
- 11 nanoCAD BIM Вентиляция
- 11 nanoCAD BIM ВК
- 1 nanoCAD BIM Отопление
- 6 nanoCAD BIM СКС
- 44 nanoCAD BIM ОПС
- 2 nanoCAD Стройплощадка
- 3 nanoCAD Металлоконструкции
- 2 nanoCAD Конструкции PS
- 3 TDMS Фарватер
- 1 Облака точек
- NSR Specification
- Учебным заведениям и учащимся
- 3 nano360