AutoLisp и getkword + getstring

Иван
Раздел: API

В скрипте нужно выбрать слой из списка в консоли и динамическом меню.

При наличии слоёв начинающихся на одну букву выбор слоя 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)
    )