LISPSYS и dcl “на лету”
Никак мне не дает покоя LISPSYS и ее значения. Особенно в области dcl и их создания "на лету". То, что нарыл и собственные выводы - ниже.
Если хочется поржать и посмотреть на динамику ситуации - добро пожаловать на ролик на YouTube
Кому интереснее читать текст - добро пожаловать
Собственно стало интересно - что будет, если при различных значениях LISPSYS написать код, создающий диалог "на лету" и его вызвать? Попробую расковырять.
Код, последовательность тестирования, подробный вывод
Итак, пишем один-единственный код, который тупо создает dcl, его вызывает и каким-то там манером обрабатывает, плюс команду на его вызов, и плюс вывод в ком.строку, что код загружен:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| (defun lisp-cs-create-and-proceed-dcl (/ fun_callback file handle dcl_id dcl_res dcl_lst res) ;|
* Создание dcl-файла и начало работы с ним
* Параметры вызова:
нет
* Возвращает строку фильтрации для ssget либо nil
* Примеры вызова:
(lisp-cs-create-and-proceed-dcl)
|;
(defun fun_callback (key value ref-list)
(set ref-list (subst (cons key value) (assoc key (eval ref-list)) (eval ref-list)))
) ;_ end of defun
(setq file (strcat (vl-string-right-trim "\\" (getenv "temp")) "\\dlg.dcl")
handle (open file "w")
) ;_ end of setq
(foreach str '("dlg:dialog{label=\"Фильтр выбора\";fixed_width=true;"
" :row{" " :column{"
" :toggle{key=\"LINE\";label=\"Отрезки\";width=30;}"
" :toggle{key=\"LWPOLYLINE\";label=\"Полилинии\";width=30;}"
" }" " :column{"
" :toggle{key=\"INSERT\";label=\"Блоки\";width=30;}"
" :toggle{key=\"CIRCLE\";label=\"Окружности\";width=30;}"
" }" " }"
" :row{fixed_width=true;alignment=right;" " ok_cancel;"
" }" " }"
)
(write-line str handle)
) ;_ end of foreach
(close handle)
(setq dcl_lst '(("LINE" . "1") ("LWPOLYLINE" . "1") ("INSERT" . "1") ("CIRCLE" . "1")))
(setq dcl_id (load_dialog file))
(new_dialog "dlg" dcl_id "(fun_callback $key $value 'dcl_lst)")
(foreach item dcl_lst (set_tile (car item) (cdr item)))
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq dcl_res (start_dialog))
(unload_dialog dcl_id)
(if (= dcl_res 1)
(progn
(if (setq res (mapcar (function car) (vl-remove-if (function (lambda (x) (= (cdr x) "0"))) dcl_lst)))
(strcat (car res)
(apply (function strcat) (mapcar (function (lambda (x) (strcat "," x))) (cdr res)))
) ;_ end of strcat
) ;_ end of if
) ;_ end of progn
) ;_ end of if
) ;_ end of defun
(defun c:make-dcl () (lisp-cs-create-and-proceed-dcl))
((lambda () (princ "\nНормальная загрузка") (princ)))
(defun make-fas (/ file prj)
(if (setq file (findfile (setq prj (strcat "\\\\vmware-host\\Shared Folders\\Share\\make-dcl\\make-dcl"
(itoa (atoi (vl-string-trim "VLISUAP " (strcase (ver)))))
(if (getvar "lispsys")
(strcat "lispsys" (itoa (getvar "lispsys")))
""
) ;_ end of if
".prj"
) ;_ end of strcat
) ;_ end of setq
) ;_ end of findfile
) ;_ end of setq
(progn (alert (strcat "Сборка " file)) (vlisp-make-project-fas file))
(alert (strcat "Не найден " prj))
) ;_ end of if
) ;_ end of defun |
На основе этого коротенького лиспа создаются prv (для vlx) и prj (для fas) файлы для компиляции всех возможных вариантов. Естественно, vlx создается в общем именном пространстве. Естественно, все компилируется без обмана и проверяется тоже без обмана.
Последовательность действий как она мне видится:
- Последовательно компилируем все fas / vlx в ACAD 2019 и ACAD 2022 (со всеми возможными значениями LISPSYS)
- Проверяем работу в ACAD 2019
- Проверяем работу в ACAD 2022, последовательно меняя LISPSYS
Последовательность муторная, поэтому здесь ее и записал.
Собственно сводный “отчет” по моим экспериментам:
Файл и условия компиляции |
Работа в ACAD2019 |
ACAD 2022, LISPSYS = 0 |
ACAD 2022, LISPSYS = 1 |
ACAD 2022, LISPSYS = 2 |
fas 2019 |
Корректно |
Корректно |
Корректно |
Корректно |
vlx 2019 |
Корректно |
Корректно |
Корректно |
Корректно |
fas 2022, LISPSYS = 0 |
Корректно |
Корректно |
Корректно |
Корректно |
vlx 2022, LISPSYS = 0 |
Корректно |
Корректно |
Корректно |
Корректно |
fas 2022, LISPSYS = 1 |
Невозможно загрузить |
Невозможно загрузить |
Корректно |
Корректно |
vlx 2022, LISPSYS = 1 |
Невозможно загрузить |
Невозможно загрузить |
Корректно |
Корректно |
fas 2022, LISPSYS = 2 |
Корректно |
|
Корректно |
Корректно |
vlx 2022, LISPSYS = 2 |
Корректно |
|
Корректно |
Корректно |
Если коротко, то при сборке компилированного кода ни в коем случае нельзя использовать lispsys = 1. Ну или готовьтесь к неработающему коду
Лично я для себя сделал следующие выводы:
- Вариант создания dcl на лету немного заканчивается
- Постепенно Autodesk выдавливает всех лиспописателей в область .NET / WPF / WinForms etc
- Если все же оставаться на dcl, то понадобится весьма длительное тестирование на предмет (как минимум!) как работают диалоги - и в старых версиях, и в новых
Как всегда, все сказанное - личное, кривое, косое, неправильное и лысое мнение
P.S. Совсем забыл, что с кодировками записываемых файлов уже игрался. Правда, не в полном объеме: напрочь забыл про lispsys=2. Если интересно продолжение, сообщите в комментариях - либо здесь, либо на YouTube.
Похожее