Не могу передать переменной значение поля из диалога
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Не могу передать переменной значение поля из диалога

Не могу передать переменной значение поля из диалога

Ответ
Поиск в этой теме
Непрочитано 11.07.2013, 20:38 #1
Не могу передать переменной значение поля из диалога
НеВа64
 
Регистрация: 21.11.2009
Сообщений: 14

Вот код диалогового окна:
Код:
[Выделить все]
 np_tpos: dialog{label="Исходные данные для кривошипно-шатунного механизма";
  :edit_box{label="Звено ОА";key="ZvOA";value="0.07";edit_width=6;}
  :edit_box{label="Звено АВ";key="ZvAB";value="0.52";edit_width=6;}
  :edit_box{label="Звено AC";key="ZvAC";value="0.22";edit_width=6;}
  :edit_box{label="е";key="Rast_e";value="0.022";edit_width=6;}
  :edit_box{label="Угловая скорость ОА - w";key="w";value="9";edit_width=6;}
  :edit_box{label="Угол фи";key="U_fi";value="45";edit_width=6;}
  :spacer{height=1;}
  ok_cancel;
}// конец np_tpos
Затем лисп-код с использованием этого диалога:
Код:
[Выделить все]
 (if (< (setq dcl_id (load_dialog "кривошип.dcl")) 0)(exit))
(if (not (new_dialog "np_tpos" dcl_id)) (exit))
(start_dialog)
;;;(setq zAB (get_tile "ZvAB"))
;;;(setq zAC (get_tile "ZvAC"))
;;;(setq ze (get_tile "Rast_e"))
(action_tile "accept" "(setq zAB (get_tile \"ZvAB\"))
 (setq zAC (get_tile \"ZvAC\"))
 (setq ze (get_tile \"Rast_e\"))
 (setq zOA (get_tile \"ZvOA\"))
 (setq zFi (get_tile \"U_fi\"))
 (setq act T)(done_dialog)"
 );конец 'accept'

Сначала я тупо через get_tile пытался. Не выходит, выдаёт nil для всех переменных. Закоментировал эти строки.
Потом через action_tile "accept". Один фиг, не выходит каменный цветок. nil и всё тут.
Чо не так?
Просмотров: 4660
 
Непрочитано 11.07.2013, 20:58
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


action_tile прописывай на каждый контрол - это в твоем случае самое простое по реализации решение (не самое удобное в плане дальнейшего масштабирования и минимизации количества переменных, но зато самое простое).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.07.2013, 21:08
#3
НеВа64


 
Регистрация: 21.11.2009
Сообщений: 14


Сделал так:
Код:
[Выделить все]
 (if (< (setq dcl_id (load_dialog "кривошип.dcl")) 0)(exit))
(if (not (new_dialog "np_tpos" dcl_id)) (exit))
(start_dialog)
(action_tile "accept" "(setq zAB (get_tile \"ZvAB\"))")
(action_tile "accept" "(setq zAC (get_tile \"ZvAC\"))")
(action_tile "accept" "(setq ze (get_tile \"Rast_e\"))")
(action_tile "accept" "(setq zOA (get_tile \"ZvOA\"))")
(action_tile "accept" "(setq zFi (get_tile \"U_fi\"))")
Ничего не изменилось
НеВа64 вне форума  
 
Непрочитано 11.07.2013, 21:33
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Я сказал - на каждый контрол. Т.е.
Код:
[Выделить все]
(action_tile "ZvOA" "(setq zvoa (get_tile \"ZvOa\")")
Или наподобие.
P.S. Лично я давно уже решаю подобные вопросы совсем по-другому, так что советую посмотреть чужие коды, которые завязаны на диалоги - их и в Download, и в "Программировании" полно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.07.2013, 23:18
#5
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


kpblc, не путайте ребенка, вы же знаете, чем чревато то, что вы написали. Ребенок, почитай книгу Полещука, нельзя на одну кнопку навесить несколько действий, не объединяя их, например так:
Код:
[Выделить все]
 (action_tile "accept"
  (strcat
   "(setq zAB (get_tile \"ZvAB\")"
         "zAC (get_tile \"ZvAC\")"
         "ze  (get_tile \"Rast_e\")"
         "zOA (get_tile \"ZvOA\")"
         "zFi (get_tile \"U_fi\"))"
  )
)
gomer вне форума  
 
Непрочитано 11.07.2013, 23:35
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


gomer, я уже не помню подробностей, но несколько раз подобные конструкции у меня почему-то не срабатывали. Так что я с настороженностью отношусь к таким действиям.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.07.2013, 23:45 Гы. Ребёнку 49 уже
#7
НеВа64


 
Регистрация: 21.11.2009
Сообщений: 14


Последний раз программировал на автолиспе лет 25 назад. Ещё в Автокаде 10.
А щас решил вспомнить молодость, чтобы помочь детям-студентам тех.вуза.
С удовлетворением отметил, что лисп он и в африке лисп, однако никаких диалогов тогда и в помине не было.
После диалогов ВБА диалоги лиспа это нечто ужасно неуклюжее. Впрочем это конечно дело навыка.

Что касается моей проблемы, то она таки решилась. Причём довольно просто.
Перетащил (start_dialog) ниже блока присваивания. И всё заработало.
Полещука купил в бумажном варианте и скачал в электронном. Возможно для тех, кто уже понимает это неплохой справочник, но для начинающего книга и толстовата и сложновата. Грызу потихоньку. Ну и надеюсь на помощь молодых и рьяных.
НеВа64 вне форума  
 
Непрочитано 12.07.2013, 01:12
1 | #8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от НеВа64 Посмотреть сообщение
С удовлетворением отметил, что лисп он и в африке лисп, однако никаких диалогов тогда и в помине не было.
Не правда, были

Цитата:
Сообщение от НеВа64 Посмотреть сообщение
После диалогов ВБА диалоги лиспа это нечто ужасно неуклюжее. Впрочем это конечно дело навыка.
не правда, ну, право
Цитата:
Сообщение от НеВа64 Посмотреть сообщение
Перетащил (start_dialog) ниже блока присваивания. И всё заработало.
жара, я совсем не соображаю, собственно я же вам ваш код и написал Естественно после (start_dialog) все действия игнорируются...

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
я уже не помню подробностей, но несколько раз подобные конструкции у меня почему-то не срабатывали. Так что я с настороженностью отношусь к таким действиям.
(action_tile "accept" "(accept_clk)") никто не отменял. назначать действия текстбоксам не имеет смысла, более того, в таком случае каждый текстбокс нужно "прокликать", чтобы собрать все переменные, иначе неизбежно получим ошибку, ну или как вариант назначать дефолтные значения, что тоже не айс.
Код:
[Выделить все]
field : edit_box { edit_width = 6; }

np_tpos: dialog {
  label="Расчет кривошипно-шатунного механизма";
  : row {
   : boxed_column {
     label="Схема";
     : image {width = 50; aspect_ratio = 0.57; color = 9;}
   }
   : column {
      : boxed_column {
      label="Геометрия звеньев";
      : field {key="ZvOA";  label="Звено ОА, м: "; value="0.07";}
      : field {key="ZvAB";  label="Звено АВ, м: "; value="0.52";}
      : field {key="ZvAC";  label="Звено AC, м: "; value="0.22";}
      : field {key="Rast_e";label="Эксцентриситет e, м: "; value="0.022";}
      spacer;
    }
    : boxed_column {
      label="Кинематика механизма";

      : field {key="w";     label="Угловая скорость ОА (w), об/мин: ";value="9";    }
      : field {key="U_fi";  label="Угол фи, град: ";                  value="45";   }
      spacer;
    }
    ok_cancel;
    }
  }
} // конец np_tpos
Вот вам не идеальный, но уже на что-то похожий диалог для вашего шатуна
gomer вне форума  
 
Автор темы   Непрочитано 12.07.2013, 10:00
#9
НеВа64


 
Регистрация: 21.11.2009
Сообщений: 14


Хм....Насчёт диалогов в acad10.
Я конечно никогда не был программистом, а был конструктором, который применял лисп в своей работе, поэтому могу и не знать достоверно. Понятно, что диалог был, как же без него. Но в виде "запрос-ответ". Это есть и сегодня, но это не совсем то, о чём мы сейчас говорим. Всё работало под ДОС. Какие там "окна" диалогов?

Но даже сегодня, неуклюжесть .dcl кода и его обработки по сравнению с ВБА совершенно очевидна. Нету в Вижуал Лиспе никакого "вижуал" в плане диалогов. Одно дело конструировать диалог как Лего в ВБА и другое дело городить скобочки, кавычечки, описания полей, задавать размеры и положения элементов в .dcl.
Ну может программиста хлебом не корми, но дай поизвращаться с кодом , а простому юзеру, лишь слегка продвинутому в программировании, но пытающемуся облегчить себе жизнь с помощью макросов, это совершенно ни к чему.

Цитата:
жара, я совсем не соображаю, собственно я же вам ваш код и написал
Да, я видел конечно. Спасибо. Выглядит он немного изящнее моего. И я сделал зарубочку. Однако он, по сути, ровно такой же как и мой исходный. Собственно, это даже не мой код, а тупо копирнутый из Полещука

Цитата:
Естественно после (start_dialog) все действия игнорируются...
Ну для меня это оказалось не естественным, после прочтения Полещука. Из его описания (start_dialog) этого никак не следует.

Цитата:
Вот вам не идеальный, но уже на что-то похожий диалог для вашего шатуна
Спасибо большое. Утащил.
Это уже почти готовый на продажу диалог, а не для себя.
Сразу видно, что диалоги .dcl не являются для Вас чем-то загадочным или неуклюжим.

Последний раз редактировалось НеВа64, 12.07.2013 в 10:05.
НеВа64 вне форума  
 
Непрочитано 12.07.2013, 10:17
#10
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Сообщение от gomer Посмотреть сообщение

(action_tile "accept" "(accept_clk)") никто не отменял.
Поподробнее плиз, что за accept_clk такая? С чем едят?
alex8888 вне форума  
 
Непрочитано 12.07.2013, 10:37
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Как вариант:
Код:
[Выделить все]
(defun test (/ dcl_file dcl_handle dcl_id loc:subst dcl_res dcl_lst)

  (defun loc:subst (lst key value)
    (if (cdr (assoc key lst))
      (subst (cons key value) (assoc key lst) lst)
      (cons (cons key value) lst)
      ) ;_ end of if
    ) ;_ end of defun

  (setq dcl_lst    '(("Звено ОА" "ZvOA" "0.07")
                     ("Звено АВ" "ZvAB" "0.52")
                     ("Звено AC" "ZvAC" "0.22")
                     ("е" "Rast_e" "0.022")
                     ("Угловая скорость ОА - w" "w" "9")
                     ("Угол фи" "U_fi" "45")
                     )
        dcl_handle (open (setq dcl_file (strcat (vl-string-right-trim "\\" (getenv "temp")) "\\dlg.dcl")) "w")
        ) ;_ end of setq
  (foreach item (append '(" np_tpos: dialog{label=\"Исходные данные для кривошипно-шатунного механизма\";")
                        (mapcar
                          (function
                            (lambda (x)
                              (strcat "  :edit_box{label=\""
                                      (car x)
                                      "\";key=\""
                                      (cadr x)
                                      "\";value=\""
                                      (caddr x)
                                      "\";edit_width=6;}"
                                      ) ;_ end of strcat
                              ) ;_ end of lambda
                            ) ;_ end of function
                          dcl_lst
                          ) ;_ end of mapcar
                        '("  :spacer{height=1;}"
                          "  ok_cancel;"
                          "}// конец np_tpos"
                          )
                        ) ;_ end of append
    (write-line item dcl_handle)
    ) ;_ end of foreach
  (close dcl_handle)
  (setq dcl_lst (mapcar (function (lambda (x) (cons (cadr x) (caddr x)))) dcl_lst)
        dcl_id  (load_dialog dcl_file)
        ) ;_ end of setq
  (new_dialog "np_tpos" dcl_id "(setq dcl_lst (loc:subst dcl_lst $key $value))")
  (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)
    dcl_lst
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.07.2013, 12:00
1 | #12
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Алексей, это очень высокий уровень, ИМХО, значительно выше знаний топикстартера. Да еще и без комментариев...
Можно начать с простого - замена action_tile на функции отклика.

Код:
[Выделить все]
 ;;Функция отклика диалога
(defun dia-action-fun (key value)
  (cond ((= key "accept")
         (setq zAB (get_tile "ZvAB")
               zAC (get_tile "ZvAC")
               ze  (get_tile "Rast_e")
               zFi (get_tile "U_fi")
               act T
         ) ;_ end of setq
         (done_dialog 1)
        )
        ;;Просто для демонстрации
        ((= key "cancel")
         (done_dialog 0)
         (alert "Отмена!")
        )
  ) ;_ end of cond
) ;_ end of defun

(if
  (< (setq dcl_id (load_dialog "кривошип.dcl")) 0)
   (exit)
) ;_ end of if

(if (not (new_dialog
           "np_tpos"
           dcl_id
           ;;В качестве аргумента функции NEW_DIALOG прописываем вызов функции отклика
           "(dia-action-fun $key $value)"
         ) ;_ end of new_dialog
    ) ;_ end of not
  (exit)
) ;_ end of if
(start_dialog)

;;Проверка значений:
(alert (strcat "zAB = "
               (vl-princ-to-string zAB)
               "\nzAC = "
               (vl-princ-to-string zAC)
               "\nze = "
               (vl-princ-to-string ze)
               "\nzFi = "
               (vl-princ-to-string zFi)
       ) ;_ end of strcat
) ;_ end of alert
Do$ вне форума  
 
Непрочитано 12.07.2013, 12:02
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Do$, извини, но у меня реально сейчас нет никакого времени расписывать комментарии.
P.S. Только что для темы http://forum.dwg.ru/showthread.php?t=22894 установил статус "Важная". Может быть, там желающие научиться лиспу чего-то да найдут
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.07.2013, 12:30
#14
НеВа64


 
Регистрация: 21.11.2009
Сообщений: 14


Спасибо, ребята.
Собственно, я сразу втюхал, как передать значения переменным из диалога стандартным методом с помощью action_tile.
Фокус не удавался из-за моего непонимания роли и места (start_dialog).
Два последних листинга понятны, но мудрёны. В том смысле, что непонятно зачем сыр бор, если action_tile "accept" прекрасно и без затей работает.
НеВа64 вне форума  
 
Непрочитано 12.07.2013, 15:52
#15
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от НеВа64 Посмотреть сообщение
Это уже почти готовый на продажу диалог, а не для себя.
А где ш ындульгенция?
Цитата:
Сообщение от alex8888 Посмотреть сообщение
что за accept_clk такая? С чем едят?
не едят, а пишут. ручками.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Как вариант:
ох, не люблю я эти многокилометровые коды, ради чего? лисп должен быть компилированным точка.
Насчет вижуальности, так есть просмотр диалогов, но для простых диалогов это и не требуется
gomer вне форума  
 
Непрочитано 12.07.2013, 16:13
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Цитата:
Сообщение от gomer Посмотреть сообщение
лисп должен быть компилированным
Компилируй, кто мешает-то?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.07.2013, 16:58
#17
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от НеВа64 Посмотреть сообщение
В том смысле, что непонятно зачем сыр бор
Понимание приходит с опытом
Цитата:
Сообщение от gomer Посмотреть сообщение
ох, не люблю я эти многокилометровые коды
Тоже хотел бы, чтобы было меньше буковок, соответственно и телодвижений. Но, как правило, "схалтурив" на таком уровне, собираешь шишки потом, когда приложение разрастается до серьезных размеров.
Do$ вне форума  
 
Непрочитано 12.07.2013, 20:17
#18
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Читал долго все комментарии,
курите dcl callback functions, там возможно
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Не могу передать переменной значение поля из диалога



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Значение переменной Imageframe "-1" надо 1 Nikkola AutoCAD 7 26.06.2008 11:19
Как получить значение системной переменной (аналог getvar)? mmmx Программирование 2 06.08.2007 15:02
Как вставить значение переменной в текстовую строку??? Bredx Программирование 7 05.04.2006 11:06
Как узнать и изменить значение системной переменной AutoCAD? Tramp Программирование 2 02.03.2006 16:17