Тема: Ошибка в программе. Popup_list.

Всем доброго дня!
Пожалуйста, помогите найти ошибку.
Если из меню выбирать какой-либо пункт, то работает.
Если сразу нажимать ОК, то ничего не происходит.
Помогите, пожалуйста!
И еще в этой программе я делаю вызов Help'а. Как сделать так чтобы открывалась не начальная страница, а нужный пункт меню (подменю)?
Всем заранее спасибо!
--------------
MySl.dcl
--------------

 MySl: dialog {
label = "Рабочие параметры чертежа.";
 : row {
        : boxed_column {
            label = "Установить";
            children_fixed_width = true;
              : boxed_column {
                label="Слои";
                   fixed_width = true;
                   : popup_list {
                   key = "sloi";
                   edit_width = 20;
                   }
        }
    }
 }
            ok_cancel_help;
}

--------------
MySl.lsp
--------------

;;***************** MySl.lsp ************************
;;   Программа установки слоев из выпадающего меню  *
;;***************************************************
(defun do_sloi  ()
(cond
    ((= sloi 0)
 (progn
  (command "_LAYER" "_N" "Спецификация"    "_C" 1 "Спецификация" "")
  (command "_LAYER" "_N" "Экспликация" "_C" 7 "Экспликация" "")
 ))
    ((= sloi 1)
 (progn
   (command "_LAYER" "_N" "Оси" "_C" 1 "ОСИ" "")
   (command "_LAYER" "_N" "КИП" "_C" 4 "КИП" "")
 ))
   ((= sloi 2)
 (progn
  (command "_LAYER" "_N" "Отметки" "_C" 7 "Отметки" "")
  (command "_LAYER" "_N" "Текст" "_C" 7 "Текст" "")
 ))
 );end cond
)
(defun get_sloi ()
  (setq  My_sloi (list " Схемы" " Компоновки" " Монтажные"))
  (cond
    (setq sl_lst "0")
    (setq sl_lst "1")
    (setq sl_lst "2")
  )
  (start_list "sloi")
  (mapcar 'add_list My_sloi)
  (end_list)
  (if (not sl_lst) (setq sl_lst "0"))
  (set_tile "sloi" sl_lst)
  (mode_tile "sloi" 2)
)
(defun do_help ()
(help "AcadInst.chm")
)
;-----------------------------------------------------------
(defun C:MySl  ()
      (setvar "cmdecho" 0)
      (command "_osnap" "_none")
      (setq dcl_id (load_dialog "MySl.dcl"))
      (if
        (not (new_dialog "MySl" dcl_id))
        (exit)
      )
      (get_sloi)
(action_tile "sloi" "(setq sloi (read (setq sl_lst $value)))" )
      (action_tile "accept" "(setq done 1) (done_dialog)")
      (action_tile "cancel" "(setq done 2) (done_dialog)")
      (action_tile "help" "(do_help)")
      (start_dialog)
      (unload_dialog dcl_id)
       (do_sloi)
    (command "_LAYER" "_S" "0" "")
(if (= done 1)
    (progn
     (princ "\n Слои установлены. \n")
    )
)
(if (= done 2) (princ "\n Отмена."))
    (princ)
)

Re: Ошибка в программе. Popup_list.

Привет. Ну с начала:
1. Конструкция:

(cond
    (setq sl_lst "0")
    (setq sl_lst "1")
    (setq sl_lst "2")
  )

не имеет смысла, т.к. cond работает по условию. Нет условий, значит sl_lst всегда "0".
2. Второе:

(action_tile "sloi" "(setq sloi (read (setq sl_lst $value)))" )

Избегай определния переменных sloi и ключа action_tile списка.
Зачем так сложно?

(action_tile "sloi" "(setq sl_lst $value)" )

В sl_lst возвращается строка!!!!
3. Соответственно do_sloi примет вид

(defun do_sloi  ()
(cond
    ((= sl_lst "0")
 (progn
     ..........
 ))
    ((= sl_lst "1")
 (progn
     ..........
 ))
   ((= sl_lst "2")
 (progn
     ..........
 ))
 );end cond

И все работает.
И воследнее используемые переменные лучше определить, как локальные.
Что-то типа

(defun MySl  ( / sl_lst dcl_id )

Успехов.

Re: Ошибка в программе. Popup_list.

Забыл про (help "AcadInst.chm").
Справка из AutoLISP:

Invokes the Help facility
(help [helpfile [topic [command]]])
Arguments
helpfile
A string naming the Help file. The file extension is not required with the helpfile argument. If a file extension is provided, AutoCAD looks only for a file with the exact name specified.
If no file extension is provided, AutoCAD looks for helpfile with an extension of .chm. If no file of that name is found, AutoCAD looks for a file with an extension of .hlp.
topic
A string identifying a Help topic ID. If you are calling a topic within a CHM file, provide the file name without the extension; AutoCAD adds an .htm extension.
command
A string that specifies the initial state of the Help window. The command argument is a string used by the uCommand (in HTML Help) or the fuCommand (in WinHelp) argument of the HtmlHelp() and WinHelp() functions as defined in the Microsoft Windows SDK.
For HTML Help files, the command parameter can be HH_ALINK_LOOKUP or HH_DISPLAY_TOPIC. For Windows Help files, the command parameter can be HELP_CONTENTS, HELP_HELPONHELP, or HELP_PARTIALKEY.
Return Values
The helpfile string, if successful; otherwise nil. If you use help without any arguments, it returns an empty string ("") if successful, and nil if it fails.
The only error condition that the help function returns to the application is the existence of the file specified by helpfile. All other error conditions are reported to the user through a dialog box.
Examples
The following code calls help to display the information on MYCOMMAND in the Help file achelp.chm:
(help "achelp.chm" "mycommand")

Re: Ошибка в программе. Popup_list.

2 Юрий
Огромное спасибо! Все заработало.
По поводу

(cond
    (setq sl_lst "0")
    (setq sl_lst "1")
    (setq sl_lst "2")
  )

В данном случае эта конструкция имеет смысл.
Т.к. если писать просто (setq .... то в списке первой ставится строка 2. И приходится тогда формировать в порядке 2,1,0. Что не очень удобно.
Касательно
(help "achelp.chm" "mycommand").
На примере acad161.chm
как мне сделать так, чтобы при нажатии на кнопку открывалось бы:
Command Reference->Utilities->Attach Digital Signatures->Attach Digital Signatures Dialog Box
????

Re: Ошибка в программе. Popup_list.

Алексиус пишет:

Т.к. если писать просто (setq .... то в списке первой ставится строка 2. И приходится тогда формировать в порядке 2,1,0. Что не очень удобно.

Совершенно не въехал. Список формируется группой команд:

(start_list "sloi")
  (mapcar 'add_list My_sloi)
  (end_list)

Попробуй закоментарь (cond ....) и получишь правильный список.
В твоей конструкции выполняется только (setq st_lst "0") и все. Пользуйся отладчиком. Прежде, определи программу как функцию, а не как команду.
Что касается help. Результат достигается путем: (help "acad.chm" "Attach_Digital_Signature"). Во втором параметре указывается "string identifying a Help topic ID". Я открыл acad.chm в листере и тупо искал нужное сочетание слов. Подходящее взял в качестве ID. Для конкретного случая получил: attach_digital_signature. Не лучший способ, но (help) очень хороша, если сам пишешь файлы, тогда все индексы знаешь и переходами владеешь.

Re: Ошибка в программе. Popup_list.

Попробуй закоментарь (cond ....) и получишь правильный список.
Т.к. если писать просто (setq .... то в списке первой ставится строка 2. И приходится тогда формировать в порядке 2,1,0.
Тем не менее это так.
Спасибо за объяснения по хелпу!

Re: Ошибка в программе. Popup_list.

Та же самая проблема, но уже с radio_button.
Поэтому новую тему создавать не стал.
В программе никак не получается взять значение по умолчанию (должны быть засечки)для 1й radio_button.
Помогите, плз. Перепробовал кучу способов - не помогат ничего. Не могу понять в чем дело.
З.Ы. Если не трудно, скажите какая переменная отвечает за масштаб в размерном стиле? Чтобы он не переопределялся, а менял начение с 1 на 5, 25,...(любое число).

;*************************************
; MyScale.dcl                        *
;*************************************
MyScale : dialog {
label = "Установка размерного стиля.";
 : row {
            label = "Установить";
            children_fixed_width = true;
              : boxed_column {
                label="Масштаб";
                   fixed_width = true;
                   : popup_list {
                   key = "Scale";
                   edit_width = 20;
                   }
        }
: boxed_column {
: radio_button {
key = "Zas";
label = "Засечки";
}
: radio_button {
key = "Arr";
label = "Стрелки";
}
}
 }
            ok_cancel_help;
}
;;***************** MyScale.lsp ***********
;;   Программа установки размерного стиля *
;;*****************************************
(defun set_razstyle ()
           (if (not (tblsearch "style" "ArialItlk")) ; Создание стиля текста.
(entmake (list
       (cons 0 "STYLE")
       (cons 100 "AcDbSymbolTableRecord")
       (cons 100 "AcDbTextStyleTableRecord")
       (cons 2 "ArialItlk")
       (cons 70 0)
       (cons 40 0)        ;Visota
       (cons 50 0)
       (cons 71 0)
       (cons 42 0)
       (cons 3 "ariali.ttf")
       (cons 4 "")
       (cons 41 1)
       (cons 70 0)
     )
  )
)
(if (tblsearch "dimSTYLE" "Alex_01")     ; Создание размерного стиля.
(progn                     
  (set_var)
  (command "_dimSTYLE" "_save" "Alex_01" "_y")
 )
 (progn                     
  (set_var)
  (command "_dimSTYLE" "_save" "Alex_01")
 )
)
)
(defun set_var ()                ; Задание размерных переменных.
  (setvar "DIMASSOC" 1)                  ; Ассоциативные размеры включены
  (setvar "DIMLUNIT" 2)                  ; Десятичная система единиц
  (setvar "DIMASZ" (* s 2.5))           ; Размер стрелки (засечки)
  (setvar "DIMDEC" 0)                  ; Число знаков после запятой
  (setvar "DIMTXSTY" "ArialItlk")              ; Стиль размерного текста
  (setvar "DIMTXT" (* s 2.5))           ; Высота размерного текста
  (setvar "DIMTOFL" 1)                  ; Разм. линия всегда рисуется между выносными линиями
  (setvar "DIMTIH" 0)                  ; Разм. текст параллелен размерной линии (внутри)
  (setvar "DIMTOH" 0)                  ; Разм. текст параллелен размерной линии (снаружи)
  (setvar "DIMTIX" 1)                  ; Разм. текст всегда размещается между выносными линиями
  (setvar "DIMDLE" 0)                  ; Разм. линия выступает за выносную на 0 единиц
  (setvar "DIMTAD" 1)                  ; Текст над размерной линией
  (setvar "DIMGAP" (* s 2.5))           ; Текст выше разм. линиии на N единиц
  (setvar "DIMEXO" 0)                  ; Смещение выносных линий относительно заданных точек равно нулю
  (setvar "DIMEXE" (* s 2.5))           ; Выносные линии выступают за размерные на N единиц
  (setvar "DIMTMOVE" 2)                  ; Размерный текст перемещается свободно
  (setvar "DIMSE1" 0)                ;Подавление первой выносной линии. (Откл)
  (setvar "DIMSE2" 0)                ;Подавление второй выносной линии. (Откл)
)
(defun do_Scale  ()
  (cond
    ((= sl_lst "0") (setq s 1))
    ((= sl_lst "1") (setq s 5))
    ((= sl_lst "2") (setq s 10))
 )
)
(defun get_Scale ()
  (setq  My_Scale (list " 1:1" " 1:5" " 1:10" ))
  (cond
    (setq sl_lst "0")
    (setq sl_lst "1")
    (setq sl_lst "2")
  )
 (start_list "Scale")
 (mapcar 'add_list My_Scale)
 (end_list)
 (if (not sl_lst) (setq sl_lst "0"))
 (set_tile "Scale" sl_lst)
 (mode_tile "Scale" 2)
)
(defun do_help ()
(help "AcadInst.chm")
)
;-----------------------------------------------------------
(defun C:MyScale  ()
      (setvar "cmdecho" 0)
      (setq dcl_id (load_dialog "MyScale.dcl"))
      (if (not (new_dialog "MyScale" dcl_id)) (exit))
    (get_Scale)
      (action_tile "Scale" "(setq sl_lst $value)" )
; (set_tile "Zas" "1")
      (action_tile "Zas" "(setq Zs (read $value))")
      (action_tile "Arr" "(setq Ar (read $value))")
      (action_tile "accept" "(setq done 1) (done_dialog)")
      (action_tile "cancel" "(setq done 2) (done_dialog)")
      (action_tile "help" "(do_help)")
      (start_dialog)
      (unload_dialog dcl_id)
    (command "_LAYER" "_S" "0" "")
(if (= done 1)
    (progn
    (if (= Zs 1) (setvar "DIMBLK" "_Oblique"))     ; Вместо стрелок — засечки ("Oblique")
    (if (= Ar 1) (setvar "DIMBLK" "."))        ; Стрелки (".")
    (do_Scale)
    (set_razstyle)
    (princ "\n Размерный стиль установлен. \n")
    )
)
(if (= done 2) (princ "\n Отмена."))
(setq Zs nil Ar nil sl_lst nil)
    (princ)
)