Тема: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

Всем доброго дня суток!
Есть небольшая задачка. Надо создать диалоговое окно, где будут вводиться значения некоторых переменных(н-р: "Длина", "Ширина", "Высота"). После закрытия диалога в заранее определенное место чертежа будет вставляться текст в виде:
Длина = xxx
Ширина = ххх
Высота = ххх,
где ххх - это введенные значения переменных в диалоге.
Заранее спасибо всем, кто откликнется на мою просьбу о помощи!

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

Это что? Лабораторная?

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

Это не лабораторная. Институт я уже как 10 лет назад закончил. Просто надо немного расширить функциональные возможности одного приложения для AutoCAD, используемого на работе, причем срочно, а как реализовать это, я пока не знаю. Поэтому и обратился сюда за помощью. Создать сам диалог я смогу, а вот что делать дальше...

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

> Andrey
"Заранее определенное место" - каким образом определенное?

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

Давайте свой диалог и  "заранее определенное место" для вставки.

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

Сам диалог простенький. По нажатию "OK" текст должен выводиться в один из вьюпортов, определенных в шаблоне.

shapka : dialog {
    label = "Параметры объекта";
    : edit_box {Key = "H"; value = "0"; fixed_hight=true; alignment = center; label = "Высота  ";}
    : edit_box {Key = "B"; value = "0"; fixed_hight=true; alignment = center; label = "Глубина";}
    : edit_box {Key = "L"; value = "0"; fixed_hight=true; alignment = center; label = "Ширина ";}
    :spacer{height=1;}
    ok_cancel;
}

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

> Andrey
Я вот еще до вашего диалога сочинил кое-что.
Текст вставляется в начало координат текущим стилем и с текущещей высотой.
Диалог, файл dsizes.dcl

setsizes:dialog {
         label = "Размеры объекта";
   :column {
             :edit_box {
             label = "Длина   = ";
             width = 6;
             key = "length";
             }
             :edit_box {
             label = "Ширина = ";
             width = 6;
             key = "width";
             }
             :edit_box {
             label = "Высота  = ";
             width = 6;
             key = "height";
             }
           }
ok_cancel;
}

Программа, файл dsizes.lsp

;************* dsizes.lsp ***********************
;
;
;
(defun draw_text ( / text1 )
    (setq pt0 (list 0 0 0))
    (setq text1 (strcat "Длина = " (rtos len)
                "; " "Ширина = " (rtos wid) "; "
                   "Высота = " (rtos hei))
    ) ; setq
    (command "_TEXT" pt0 "" "" text1)
(princ)
); defun
(defun C:SIZES ( / dcl_id len wid hei done)
       (setvar "CMDECHO" 0)
       ;Загрузка диалогового окна
       (setq dcl_id (load_dialog "dsizes"))
       (if (not (new_dialog "setsizes" dcl_id)) (exit))
       ;Активизация переменных
       (action_tile "length" "(setq len (read $value))")
       (action_tile "width" "(setq wid (read $value))")
       (action_tile "height" "(setq hei (read $value))")
       (action_tile "accept" "(setq done 1)(done_dialog)")
       (action_tile "cancel" "(setq done 2) (done_dialog)")
       (start_dialog)
       (unload_dialog dcl_id)
       (if (and len wid hei (= done 1)) (draw_text)
       (princ "\n Не заданы все размеры!"))
       (if (= done 2) (princ "\n Отмена."))
    (princ)
)

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

Ну вот Владимир Громов уже успел наваять. :)

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

Огромное ему спасибо, Владимиру Громову! Посидел, разобрался. На самом деле у меня диалог побольше. Этот был для примера. Но сейчас переделываю под себя. А посему возникло два вопроса:
1. Решил использовать popup_list вместо edit_box для выбора стандартных значений из списка. В чертеж выводится только порядковый номер значения в списке, а не оно само. Наверное, должна использоваться другая функция считывания значения из поля?
2. Можно ли осуществить вывод текста не по заданным координатам, а указав точку на экране?
Заранее спасибо!

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

> Andrey
1. Надеюсь, другие товарищи помогут, времени мало у меня.
2. Да вот так, хотя бы:

(setq pt0 (getpoint "\n Укажите точку вставки текста: "))

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

Может, кто еще подскажет?
Как я понял,(см.ниже) происходит присвоение переменной len при использовании popup_list значения строки элемента списка

(action_tile "length" "(setq len (read $value))")

которое потом объединяется в строку и выводится

(defun draw_text ( / text1 )
    (setq pt0 (list 0 0 0))
    (setq text1 (strcat "Длина = " (rtos len)
                "; " "Ширина = " (rtos wid) "; "
                   "Высота = " (rtos hei))
    ) ; setq
    (command "_TEXT" pt0 "" "" text1)
(princ)
); defun

Мне необходимо получить значение самого элемета списка, строку, и вывести ее в поле чертежа.
P.S. Книги умные у меня есть, но такой объем осилить сразу не удасться sad
Если кто сможет проконсультировать, то я ему буду очень признателен...

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

; функция возвращает текст из списка текстов по номеру
(defun mk_list ( readlist displist / count item retlist )
 (setq count 1)
 (while (setq item (read readlist))
        (setq retlist (cons (nth item displist) retlist))
        (while (and (/= " " (substr readlist count 1))
                    (/= "" (substr readlist count 1))
               )
               (setq count (1+ count))
        )
        (setq readlist (substr readlist count))
 )
 (car (reverse retlist))
 )

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

2 Стас
Ну и как прикрутить ее в моем случае? Если можно, то пример вызова. Где списки хранятся? В отдельных файлах или в теле диалога?

Re: Как обеспечить вывод текста в указанное места чертежа из диалогового окна?

> Andrey
Не совсем так вы поняли, совсем не так.
Переменным len, wid, hei присваиваются значения, введенные в соответствующие поля edit_box диалога, а не из popup_list, которого просто нет в том диалоге. Поскольку на тот момент не было известно, что надо делать с введенными значениями, я просто объединил их в одну текстовую строку. Точка вставки тоже была неизвестна. Ну, я и вставил текст в начало координат.
Вот пример диалога и программы вставки текстовых строк, выбранных из списка в диалоге.
Файл dd_param.dcl

param : dialog {
label = "Параметры объекта.";
          :row {
              fixed_width = true;
              : boxed_column {
                label = "Высота ";
                    fixed_width = true;
                   : popup_list {
                   key = "height";
                   edit_width =10;
                  }
              }
              : boxed_column {
                label="Глубина";
                    fixed_width = true;
                   : popup_list {
                   key = "depth";
                   edit_width = 10;
                   }
              }
              : boxed_column {
                label="Ширина";
                    fixed_width = true;
                   : popup_list {
                   key = "width";
                   edit_width = 10;
                   }
              }
          }
ok_cancel_help;
}

Файл dd_param.lsp

(defun get_height    ( / l_height)
    (setq l_height (list " Нажать" " 100" " 200" " 300" " 400" " 500" ))
    (start_list "height")
    (mapcar 'add_list l_height)
    (end_list)
    (if (not sh_indx) (setq sh_indx "0"))
    (set_tile "height" sh_indx)
    (mode_tile "height" 2)
)    
(defun do_height ( / pth)
    (cond
      ((= hei 1) (setq heigh "100"))
      ((= hei 2) (setq heigh "200"))
      ((= hei 3) (setq heigh "300"))
      ((= hei 4) (setq heigh "400"))
      ((= hei 5) (setq heigh "500"))
    )                    ;end cond
    (setq pth (getpoint "\n Укажите точку вставки высоты объекта: "))
    (command "_TEXT" pth "" "" heigh)
)
(defun get_depth    ( / l_depth)
    (setq l_depth (list " Нажать" " 100" " 200" " 300" " 400" " 500" ))
    (start_list "depth")
    (mapcar 'add_list l_depth)
    (end_list)
    (if (not sd_indx) (setq sd_indx "0"))
    (set_tile "depth" sd_indx)
    (mode_tile "depth" 2)
)    
(defun do_depth ( / ptd)
    (cond
      ((= dep 1) (setq depth "100"))
      ((= dep 2) (setq depth "200"))
      ((= dep 3) (setq depth "300"))
      ((= dep 4) (setq depth "400"))
      ((= dep 5) (setq depth "500"))
    )                    ;end cond
    (setq ptd (getpoint "\n Укажите точку вставки глубины объекта: "))
    (command "_TEXT" ptd "" "" depth)
)
(defun get_width    ( / l_width)
    (setq l_width (list " Нажать" " 100" " 200" " 300" " 400" " 500" ))
    (start_list "width")
    (mapcar 'add_list l_width)
    (end_list)
    (if (not sw_indx) (setq sw_indx "0"))
    (set_tile "width" sw_indx)
    (mode_tile "width" 2)
)    
(defun do_width ( / ptw)
    (cond
      ((= wid 1) (setq width "100"))
      ((= wid 2) (setq width "200"))
      ((= wid 3) (setq width "300"))
      ((= wid 4) (setq width "400"))
      ((= wid 5) (setq width "500"))
    )                    ;end cond
    (setq ptw (getpoint "\n Укажите точку вставки ширины объекта: "))
    (command "_TEXT" ptw "" "" width)
)
(defun do_help ()
(alert " Справка находится в разработке.")
(princ)
)
(defun C:PARAM    ( / echo dcl_id hei dep wid done)
      (setq echo (getvar "CMDECHO"))
      (setvar "cmdecho" 0)
      (setq dcl_id (load_dialog "dd_param.dcl"))
      (if     (not (new_dialog "param" dcl_id))
     (exit)
      )
(get_height)
(get_depth)
(get_width)
      (action_tile "height" "(setq hei (read (setq sh_indx $value)))")
      (action_tile "depth"  "(setq dep (read (setq sd_indx $value)))")
      (action_tile "width"  "(setq wid (read (setq sw_indx $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)
(if (and hei dep wid (= done 1))
    (progn
    (do_height)
    (do_depth)
    (do_width)
    ) ; progn
    (princ "\n Не заданы все размеры!")
) ; if
(if (= done 2) (princ "\n Отмена."))
    (setvar "CMDECHO" echo)
    (princ)
)