LISPSYS и dcl “на лету”
            	
                
			
		   Никак мне не дает покоя LISPSYS и ее значения. Особенно в области dcl и их создания "на лету". То, что нарыл и собственные выводы - ниже.
Если хочется поржать и посмотреть на динамику ситуации - добро пожаловать на ролик на YouTube
Кому интереснее читать текст - добро пожаловать 
Собственно стало интересно - что будет, если при различных значениях LISPSYS написать код, создающий диалог "на лету" и его вызвать? Попробую расковырять.
Код, последовательность тестирования, подробный вывод
Итак, пишем один-единственный код, который тупо создает dcl, его вызывает и каким-то там манером обрабатывает, плюс команду на его вызов, и плюс вывод в ком.строку, что код загружен:
| 12
 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.
	
Похожее