Тема: Как правильно организовать заполнение popup_list?

Как правильно организовать заполнение popup_list?
Четыре popup_list  "p1"..."p4" нужно заполнить списком.
сount равно 3

!list_fde
(("1" "b1" "Ширина шпоночного паза" "15.0") ("2" "t1" "Глубина шпоночного паза"
"12.0") ("3" "r3" "Диаметр вала" "22.0"))
(setq i -1)
(repeat count
  (setq i (1+ i))
 (print i)
  (if (setq fde1 (nth i list_fde))
    (print fde1)
        (progn
        (start_list (strcat "p" (itoa (1+ i))))
        (add_list (nth i fde1)); По-видимому здесь все прекращается
       ;(mapcar 'add_list fde1)
       (print start_list "p1")
      (end_list)
        );progn
  );if
  ;(start_dialog)
);repeat
Результат
0
("1" "b1" "Ширина шпоночного паза" "15.0")
1
("2" "t1" "Глубина шпоночного паза" "12.0")
2
("3" "r3" "Диаметр вала" "22.0") ; error: bad argument type: fixnump: nil

Re: Как правильно организовать заполнение popup_list?

(start_list (strcat "p" (itoa (1+ i))))
(mapcar 'add_list fdel)
(end_list)

Re: Как правильно организовать заполнение popup_list?

Известный книжный код с этими моими данными  (печать которых специально поставлена) не проходит: список не заполняется, а при зкрытии окна появляется сообщение

error: bad argument type: fixnump: nil

Даже один элемент не добавляется к списку. Это при том, что тип fde1 и list_fde -  LIST.
Нужно, чтобы в "p1" записывались 1,2,3, в "p2" - b1,t1 b r3 в "p3" - Ширина...,Глубина..., Диаметр..., в "p4" - 15.0, 12.0, 22.0. Но не проходит даже простое заполнение - всегда эта же ошибка.

Re: Как правильно организовать заполнение popup_list?

> novic
Так у тебя же первый элемент списка строка: "1", "2", "3". А ты пытаешься сделать ей (itoa ...). Здешь ошибка и возникает!

Re: Как правильно организовать заполнение popup_list?

> novic
Упс. Так ты не написал код, который выполняется при закрытии окна.

Re: Как правильно организовать заполнение popup_list?

> novic
При такой постановке нельзя одну и ту же переменную i использовать и как счетчик по элементам списка list_fde (их 3), и как счетчик по popup-спискам окна (их 4).
Лучше сначала сформировать другой список: (("1" "2" "3") ("b1" "t1" "r3") ("Ширина шпоночного паза" "Глубина шпоночного паза" "Диаметр вала") ("15.0" "12.0" "22.0")), а затем по известному книжному коду выполнить repeat c count=4.

Re: Как правильно организовать заполнение popup_list?

> Александр Ривилис
(itoa )применяется к i.
Код для OK существует и работает, но смысловой нагрузки пока не несет:

(action_tile "accept"
  (strcat
     "(alert\"Hi\")"
     "(done_dialog))"
  );strcat
);action-tile accept
       (start_dialog)
       (unload_dialog dcl_id)

Alert появляется, после нажатия на OK в его окне в командной строке появляется описанная ошибка.
Проблема в том, что цикл выполняется, а popup_list не заполняются. (Start_list "p1") как и "p2" и пр. возвращают nil, а нет "список, который будет редактироваться".

Re: Как правильно организовать заполнение popup_list?

> Н.Н.Полещук
Так и есть. Введение четвертого  размера  и элемента списка ("4" "ob" "Отладочный бессмысленный" "33.0") ситуацию не изменило и придется думать. Появились сомнения, что реально написать код, который при выборе элемента списка "p1" выводит его значение в edit_box, а во все остальные "pn" соответствующие элементы fde1.
Тем не менее, спасибо.

Re: Как правильно организовать заполнение popup_list?

> Н.Н.Полещук
Оставляю счетчики и циклы до лучших времен:

(if (setq fde1 (nth 1 list_param))
       (print fde1)
            (progn
       (start_list "p2")
         (mapcar 'add_list fde1)
         (print start_list)
       (end_list)
        );progn
  );if

И даже это с моими данными не работает. Список не заполняется и не выводится на экран. Ошибка та же.

Command: !list_param
(("1" "2" "3" "4") ("b1" "t1" "r3" "ob")
("Ширина паза" "Глубина паза" "Радиус вала" "Отладочный бессмысленный")
("12.23" "12.0" "22.0" "33.0"))
Command: !fde1
("b1" "t1" "r3" "ob")

Тип

Command: (type fde1)
LIST

Как просмотреть созданный start_list?

Re: Как правильно организовать заполнение popup_list?

> novic
Неправильно использован if:

(if (setq fde1 (nth 1 list_param))
; Это выполняется
  (print fde1)
; А это, естественно, нет !!
   (progn
       (start_list "p2")
         (mapcar 'add_list fde1)
         (print start_list)
       (end_list)
   );progn
);if

Поставьте progn перед print.

Re: Как правильно организовать заполнение popup_list?

И ещё один момент:

(action_tile "accept"
  (strcat
     "(alert\"Hi\")"
     "(done_dialog))"
  );strcat
);action-tile accept
       (start_dialog)
       (unload_dialog dcl_id)

Если не ошибаюсь, в action_tile должно присутствовать единственное lisp-выражение. Как-то так:

(action_tile "accept" "(progn (alert\"Hi\")(done_dialog))")
);

Re: Как правильно организовать заполнение popup_list?

Пастух пишет:

Если не ошибаюсь, в action_tile должно присутствовать единственное lisp-выражение.

Нет, это неверно (т.е. progn лишняя).

Re: Как правильно организовать заполнение popup_list?

> novic

Command: (print start_list)
#<SUBR @096af8f8 START_LIST> 

Я так понимаю, что цель не в этом? start_list - это имя встроенной функции и смысла в ее печати я не вижу никакого.

> Пастух

> Н.Н.Полещук
Без progn можно обойтись (хотя я бы поставил). Есть нюанс, что если в action_tile несколько скобочных выражений, то они не должны разделяться пробелами (возможно в последних версиях это уже не обязательное условие) - иначе выполнится только первое выражение.

Re: Как правильно организовать заполнение popup_list?

> Н.Н.Полещук
Спасибо.  Конечно, дело в if. Прошу прощения за мою невнимательность,отнимающую время на такие глупости. И все-таки вопрос о отм, что возвращает start_list и как это проверить остается.

Re: Как правильно организовать заполнение popup_list?

> novic

(start_list "p2")

возвращает

"p2"

- не очень это интересно. Проверить можно c помощью функций печати, например:

(princ (start "p2"))

> Александр Ривилис
Сейчас пробелы в

action_tile

не препятствуют работе.

Re: Как правильно организовать заполнение popup_list?

> Н.Н.Полещук
Ни я  ни мой ACAD 2004 не знаем функции start и,

(princ (start "p2"))

разумеется, не проходит. В то время, как

(princ (start_list "p2")) 

выдает p2, что также не похоже на "список, который будет редактироваться" (стр.357).
Впрочем, все формирующий так, как мне нужно

(setq i -1)
(repeat 4
  (setq i (1+ i))
  (if (setq fde1 (nth i list_param))
            (progn
              (setq j (1+ i))
              (start_list (strcat "p" (itoa j)))
                 (mapcar 'add_list fde1)
                 (end_list)
             );progn
   );if
 );repeat

позволяет все списки увидеть на форме.
Так и бог с ним. Любопытно, конечно, но все будем переживать "по мере поступления".
Большое спасибо за помощь.

Re: Как правильно организовать заполнение popup_list?

> Александр Ривилис
Такое тоже было получено и мало обрадовало.
Смысл в том, чтобы просмотреть "возвращаемое значение - список, который будет редактироваться" (с.357), то есть попытка действовать по инструкции (как я ее понимаю).

Re: Как правильно организовать заполнение popup_list?

> novic
Опечатка. Имелось в виду

(princ (start_list "p2"))

Список посмотреть нельзя, только в окне. Но он в принципе аналогичен fdel.
На с.357 нечеткость - имеется в виду код элемента (списка). В новой книге подправлено.

Re: Как правильно организовать заполнение popup_list?

Пытаюсь изменить содержимое списка popup_list, отредактировав его в edit_box c key "edit" в этом же сеансе с помощью add_list. Не проходит. Кроме того, не понятно, как add_list определяет, нужно добавить элемент (строку) к списку или изменить его. Или нужно изменять список list_param и как-то перечитывать окно? Словом, HELP, если можно.

(action_tile "p2"
   (strcat
 "(set_tile \"edit\" (nth (atoi $value) (nth 1 list_param)))"
   " (add_list "p2" (get_tile \"edit\"))" ); strcat p2
);action_tile "p2"

Re: Как правильно организовать заполнение popup_list?

add_list всегда только добавляет (заменять она не умеет). Если тебе нужно отредактировать popup_lis, то нужно очистить список и внести новые значения.

Re: Как правильно организовать заполнение popup_list?

> Александр Ривилис

(start_list "pop" 1 2)
(add_list "New Value")
(end_list)

произведет замену строки N2 (третья сверху).

Re: Как правильно организовать заполнение popup_list?

> Пастух
Упс... :( Видать давно я не использовал DCL и зря полез со своими советами... :)

Re: Как правильно организовать заполнение popup_list?

> novic
По моему опыту: хотя add_list и умеет заменять элементы в popup_list, лучше корректировать в памяти основной список list_fde (или fde1), а затем обновлять весь список p1 в окне. Все равно по выходе из окна придется анализировать выбор пользователя и обращаться к list_fde.