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 создается в общем именном пространстве. Естественно, все компилируется без обмана и проверяется тоже без обмана.

Последовательность действий как она мне видится:

  1. Последовательно компилируем все fas / vlx в ACAD 2019 и ACAD 2022 (со всеми возможными значениями LISPSYS)
  2. Проверяем работу в ACAD 2019
  3. Проверяем работу в 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. Ну или готовьтесь к неработающему коду :)

Лично я для себя сделал следующие выводы:

  1. Вариант создания dcl на лету немного заканчивается
  2. Постепенно Autodesk выдавливает всех лиспописателей в область .NET / WPF / WinForms etc
  3. Если все же оставаться на dcl, то понадобится весьма длительное тестирование на предмет (как минимум!) как работают диалоги - и в старых версиях, и в новых

Как всегда, все сказанное - личное, кривое, косое, неправильное и лысое мнение ;)

P.S. Совсем забыл, что с кодировками записываемых файлов уже игрался. Правда, не в полном объеме: напрочь забыл про lispsys=2. Если интересно продолжение, сообщите в комментариях - либо здесь, либо на YouTube.



Поделитесь своим мнением


Я не робот.