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

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

Autolisp ограничить ввод для пользователя

Ответ
Поиск в этой теме
Непрочитано 02.08.2018, 10:07 #1
Autolisp ограничить ввод для пользователя
protorgovec
 
газо- нефтепереработка
 
Уфа
Регистрация: 22.07.2015
Сообщений: 98

Добрый день форумчане. Подскажите пожалуйста. Нужно заставить пользователя выбрать один из предложенных вариантов:
Код:
[Выделить все]
 (initget 1 "01 02 03 04 11 21")
(setq Tip (atof (getkword "\n Тип фланца 01, 02, 03, 04, 11, 21 Tip >: ")))
все работает, но есть одна загвоздка. Если пользователь вводит 1, то присваивается 11, а если 2 то присваивается 21. Воспринимает сокращения. Как мне заставить пользователя прописывать только предложенные варианты, без сокращений? Заранее благодарю.
Просмотров: 7089
 
Непрочитано 02.08.2018, 10:15
#2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от protorgovec Посмотреть сообщение
Как мне заставить пользователя прописывать только предложенные варианты, без сокращений? Заранее
никак. У нормального пользователя не заложено писать лидирующие нули в числах) Сделайте диалог нормальный.
Сергей812 вне форума  
 
Непрочитано 02.08.2018, 10:20
1 | #3
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (initget 1 "101 102 103 104 111 112")
(getkword "\nВыберите тип [101/102/103/104/111/112] <Отмена> : ")
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.08.2018, 10:23
#4
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
никак. У нормального пользователя не заложено писать лидирующие нули в числах) Сделайте диалог нормальный.
Но у меня есть варианты именно такие. Перелопатил Полищука, но не нашел команды, которая бы воспринимала ввод пользователя без вариантов сокращения.
А как например тогда с такой строчкой:
Код:
[Выделить все]
 (initget 1 "10 12 100 120 1000 1200")
(setq Dy (atof (getkword "\n Длина, мм Dy >: ")))
введя 1, он примет первую по счету, т.е. 10, а у пользователя просто не нажалась вторая клавиша 2.
Как сделать что бы не воспринимал сокращения.
protorgovec вне форума  
 
Непрочитано 02.08.2018, 10:26
#5
Кулик Алексей aka kpblc
Moderator

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


Делай dcl - это будет проще всего.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.08.2018, 10:29
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


сделайте диалог.. на DCL в данном случае. Ну не будет пользователь в процессе реальной работы думать - в какой последовательности ему что нажимать. Голова у него совершенно другим занята в данный момент.
Сергей812 вне форума  
 
Непрочитано 02.08.2018, 10:40
#7
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от protorgovec Посмотреть сообщение
А как например тогда с такой строчкой:
Код:
(initget 1 "10 12 100 120 1000 1200")
(setq Dy (atof (getkword "\n Длина, мм Dy >: ")))
А вот так:
Код:
[Выделить все]
(initget 7)
(setq Dy (getint "\n Длина, мм Dy >: ")))
Setvar вне форума  
 
Автор темы   Непрочитано 02.08.2018, 10:42
#8
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код:
[Выделить все]
 (initget 1 "101 102 103 104 111 112")
(getkword "\nВыберите тип [101/102/103/104/111/112] <Отмена> : ")
Спасибо. Отличный вариант!

----- добавлено через ~1 ч. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код:
[Выделить все]
 (initget 1 "101 102 103 104 111 112")
(getkword "\nВыберите тип [101/102/103/104/111/112] <Отмена> : ")
Подскажите пожалуйста. У меня после всех запросов определяются все величины. Как сделать, что бы после того, как сделались все вычисления и определенная величина (например (= Mb nil)), то программа прописывая, что данной конфигурации не существует, возвращалась к самому началу программы и начанала заново делать запросы?
protorgovec вне форума  
 
Непрочитано 02.08.2018, 12:10
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


переменная-флаг и цикл
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.08.2018, 12:17
#10
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
переменная-флаг и цикл
Спасибо. Структуру то я понял. Просто никогда не приходилось зацикливать программу, поэтому не понимаю что за функции использовать
protorgovec вне форума  
 
Непрочитано 02.08.2018, 12:20
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


просто большой цикл вокруг ввода данных и расчета, если расчет удался - флаг сбросили и очередной итерации не будет.
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.08.2018, 12:26
#12
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
просто большой цикл вокруг ввода данных и расчета, если расчет удался - флаг сбросили и очередной итерации не будет.
я никогда ничего не зацикливал писал только для себя, и всегда точно знал что нужно вводить. А теперь коллеги просят для них, я в принципе не могу пока понять как зациклить
protorgovec вне форума  
 
Непрочитано 02.08.2018, 12:39
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Код:
[Выделить все]
 (setq lFlagErr 1)
(while (= lFlagErr 1)
... Ввод данных
... Вычисление
... Если получен неправильный результат, то сообщение пользователю. Иначе  (setq lFlagErr 0)
) ; Завершение цикла
... Вывод результата правильного расчета
только по нормальному пользователю еще надо давать возможность выхода до завершения ввода всех данных (иначе превращается в квест), но диалогов вы боитесь, видимо)
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.08.2018, 13:12
#14
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Код:
[Выделить все]
 (setq lFlagErr 1)
(while (= lFlagErr 1)
... Ввод данных
... Вычисление
... Если получен неправильный результат, то сообщение пользователю. Иначе  (setq lFlagErr 0)
) ; Завершение цикла
... Вывод результата правильного расчета
только по нормальному пользователю еще надо давать возможность выхода до завершения ввода всех данных (иначе превращается в квест), но диалогов вы боитесь, видимо)
Большое спасибо. Получилось.
Код:
[Выделить все]
 (setq Rez 1)
(while (= Rez 1)
ввод данных
вычисления
(if (/= Mb nil) (setq Rez 0)))
Да, он просто перескакивает на начало программы если нет существующей конструкции. Ну, было бы не плохо перед этим что бы высвечивалось например что данной конструкции не существует, для продолжения нажмите интер. Но для меня это темный лес
protorgovec вне форума  
 
Непрочитано 02.08.2018, 13:20
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от protorgovec Посмотреть сообщение
высвечивалось например что данной конструкции не существует
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если получен неправильный результат, то сообщение пользователю
Код:
[Выделить все]
 (if (= Mb nil)(alert "Данной конструкции не существует!"))
я то на лиспе не пишу, а вам то эти все базовые конструкции надо знать - чтобы не изобретать велосипеды в коде каждый раз)
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.08.2018, 13:23
#16
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Код:
[Выделить все]
 (if (= Mb nil)(alert "Данной конструкции не существует!"))
я то на лиспе не пишу, а вам то эти все базовые конструкции надо знать - чтобы не изобретать велосипеды в коде каждый раз)
Спасибо. Я знаю все эти конструкции. Но у нас проектировщики тетки работают, сейчас гост поменялся, они в панике, программно могут ввести не существующие данные для этого и ограничиваю их возможности
protorgovec вне форума  
 
Непрочитано 02.08.2018, 13:30
#17
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от protorgovec Посмотреть сообщение
программно могут ввести не существующие данные
что-то сильно сомневаюсь, что тети-проектировщицы программно вообще чего то введут..) А вот чтобы в программу они не могли ввести левые значения - для этого и нужны нормальные диалоги, а не пошаговая стратегия в командной строке)
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.08.2018, 14:12
#18
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
что-то сильно сомневаюсь, что тети-проектировщицы программно вообще чего то введут..) А вот чтобы в программу они не могли ввести левые значения - для этого и нужны нормальные диалоги, а не пошаговая стратегия в командной строке)
Я не программист нормальные диалоги для меня темный лес пытаюсь сварганить на основании своих минимальных знаниях
protorgovec вне форума  
 
Непрочитано 02.08.2018, 14:31
#19
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от protorgovec Посмотреть сообщение
Я не программист
А хто тут программист?)

Цитата:
Сообщение от protorgovec Посмотреть сообщение
нормальные диалоги для меня темный лес
Ну так пришла пора - азы в картинках: тыц тыц
поверьте - проще разобраться с диалогами в лиспе, чем с тетями-проектировщиками - у которых вдруг что-то стало работать не так как раньше...
Сергей812 вне форума  
 
Автор темы   Непрочитано 03.08.2018, 08:07
#20
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А хто тут программист?)


Ну так пришла пора - азы в картинках: тыц тыц
поверьте - проще разобраться с диалогами в лиспе, чем с тетями-проектировщиками - у которых вдруг что-то стало работать не так как раньше...
Посмотрел, но тут же появилась загвоздка. По примеру все сделал, но при попытке просмотра DCL из редактора получаю в ответ:
предупреждение:не удается создать временный файл для DCL: "C:/Program Files/Autodesk/AutoCAD 2015/$vld$.dcl"
Что это означает? Сделал один в один как в уроке все
protorgovec вне форума  
 
Непрочитано 03.08.2018, 08:15
#21
Кулик Алексей aka kpblc
Moderator

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


Это означает, что локальных прав недостаточно. Ты ж не локальный админ, верно?

----- добавлено через ~1 мин. -----
У сисадминов попроси права на запись в каталог C:/Program Files/Autodesk/AutoCAD 2015 - тогда сможешь тестировать dcl спокойно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.08.2018, 08:21
#22
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это означает, что локальных прав недостаточно. Ты ж не локальный админ, верно?

----- добавлено через ~1 мин. -----
У сисадминов попроси права на запись в каталог C:/Program Files/Autodesk/AutoCAD 2015 - тогда сможешь тестировать dcl спокойно.
Спасибо. Но тогда вопрос. Когда я сделаю и передам для других пользователей, то им тоже нужно будет доступ к этой папке? Или же этот доступ нужен только для тестирования мне?
protorgovec вне форума  
 
Непрочитано 03.08.2018, 08:25
#23
Кулик Алексей aka kpblc
Moderator

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


Им это не понадобится. Ты же проверял, как диалог выглядит, через VLIDE?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.08.2018, 08:26
#24
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это означает, что локальных прав недостаточно. Ты ж не локальный админ, верно?

----- добавлено через ~1 мин. -----
У сисадминов попроси права на запись в каталог C:/Program Files/Autodesk/AutoCAD 2015 - тогда сможешь тестировать dcl спокойно.
Вроде спокойно зашел в эту папку. Доступ есть. В чем еще может быть причина?
protorgovec вне форума  
 
Непрочитано 03.08.2018, 08:30
1 | 1 #25
Кулик Алексей aka kpblc
Moderator

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


Зайти в папку и создать в ней файл - немного разные вещи
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.08.2018, 09:23
#26
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Вообще то по первой ссылке в посте №19 в статье даже ссылка есть - "Что делать если диалоговое окно DCL не отображается?" )
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.08.2018, 09:13
#27
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А хто тут программист?)


Ну так пришла пора - азы в картинках: тыц тыц
поверьте - проще разобраться с диалогами в лиспе, чем с тетями-проектировщиками - у которых вдруг что-то стало работать не так как раньше...
Добрый день. Почитал про DCL. Во многом разобрался. Есть один вопрос. Возможно ли в диалоговом окне делать замороженные окна. И если пользователь задает определенный параметр, то окно размораживалось? Не могу понять как сделать. Может есть какой нибудь пример со сложным DCL окном?
protorgovec вне форума  
 
Непрочитано 09.08.2018, 09:15
#28
Кулик Алексей aka kpblc
Moderator

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


Ставишь enabled = false, а в callback-функции меняешь это свойство.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.08.2018, 09:19
#29
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ставишь enabled = false, а в callback-функции меняешь это свойство.
А есть какой нибудь пример? Если конечно не сложно
protorgovec вне форума  
 
Непрочитано 09.08.2018, 09:35
#30
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun test (/ dcl_file dcl_handle dcl_res dcl_id dcl_lst)
  (defun fun_callback (key value ref-list)
    (cond ((= key "txt")
           (set ref-list (subst (cons "txt" value) (assoc "txt" (eval ref-list)) (eval ref-list)))
           )
          ((= key "chk")
           (mode_tile "txt" (atoi value))
           (set ref-list (subst (cons "chk" value) (assoc "chk" (eval ref-list)) (eval ref-list)))
           )
          ) ;_ end of cond
    ) ;_ end of defun
  (setq dcl_file   (strcat (vl-string-right-trim "\\" (getenv "temp")) "\\dlg.dcl")
        dcl_handle (open dcl_file "w")
        ) ;_ end of setq
  (foreach item '("dlg:dialog{label=\"test\";" "	:toggle{key=\"chk\";label=\"check\";}" "	:edit_box{key=\"txt\";}" "	ok_cancel;" "	}")
    (write-line item dcl_handle)
    ) ;_ end of foreach
  (close dcl_handle)
  (setq dcl_lst '(("chk") ("txt"))
        dcl_id  (load_dialog dcl_file)
        ) ;_ end of setq
  (new_dialog "dlg" dcl_id "(fun_callback $key $value 'dcl_lst)")
  (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 вне форума  
 
Автор темы   Непрочитано 09.08.2018, 09:45
#31
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код:
[Выделить все]
 (defun test (/ dcl_file dcl_handle dcl_res dcl_id dcl_lst)
  (defun fun_callback (key value ref-list)
    (cond ((= key "txt")
           (set ref-list (subst (cons "txt" value) (assoc "txt" (eval ref-list)) (eval ref-list)))
           )
          ((= key "chk")
           (mode_tile "txt" (atoi value))
           (set ref-list (subst (cons "chk" value) (assoc "chk" (eval ref-list)) (eval ref-list)))
           )
          ) ;_ end of cond
    ) ;_ end of defun
  (setq dcl_file   (strcat (vl-string-right-trim "\\" (getenv "temp")) "\\dlg.dcl")
        dcl_handle (open dcl_file "w")
        ) ;_ end of setq
  (foreach item '("dlg:dialog{label=\"test\";" "	:toggle{key=\"chk\";label=\"check\";}" "	:edit_box{key=\"txt\";}" "	ok_cancel;" "	}")
    (write-line item dcl_handle)
    ) ;_ end of foreach
  (close dcl_handle)
  (setq dcl_lst '(("chk") ("txt"))
        dcl_id  (load_dialog dcl_file)
        ) ;_ end of setq
  (new_dialog "dlg" dcl_id "(fun_callback $key $value 'dcl_lst)")
  (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
Спасибо. Только как я понял, что в самом DCL окне все окна активные. А уже непосредственно в lisp я заставляю замораживать и размораживать окна ,в зависимости что выберет пользователь?
protorgovec вне форума  
 
Непрочитано 09.08.2018, 10:22
#32
Кулик Алексей aka kpblc
Moderator

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


Почти все контролы в диалоге по умолчанию активные. Это уже программист решает, что активно, а что нет. И почему
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.08.2018, 13:29
#33
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Почти все контролы в диалоге по умолчанию активные. Это уже программист решает, что активно, а что нет. И почему
Составил короткий dcl
Код:
[Выделить все]
 GOST332592015: dialog {label = "Исходные данные"; key = "t1";
    : spacer{height=1;}
    : popup_list {label = "Тип фланца:"; key = "eb_Tip"; edit_width=3; list=" \n01\n02\n03\n04\n11\n21";}
    : popup_list {label = "Материал фланца:"; key = "eb_Mat"; edit_width=13; list=" \n1 - сталь\n2 - серый чугун\n3 - ковкий чугун";}
    : spacer{height=1;}
    ok_cancel;
}
Все равно не могу понять как заставить второе окно активироваться только в одном варианте. Если тип фланца любой кроме 21, то материал фланца не нужен. А если тип 21, то материал фланца активировался. Не по галочке, а именно смотря что ввести в тип

----- добавлено через ~1 ч. -----
Помогите кто может!!! Не понимаю я!
Есть у меня программно:
Код:
[Выделить все]
 (initget 1 "01 02 03 04 11 21")
(setq Tip (atof (getkword "\n Тип фланца [01/02/03/04/11/21] Tip >: ")))

(initget 1 "1 2 3")
(if (= Tip 21) (setq Mat (atof (getkword "\n Материал [1 - сталь/2 - серый чугун/3 - ковкий чугун] Mat >: "))))
Все хорошо. Но вот не могу я сделать это диалоговым окном.
Получается только так
Код:
[Выделить все]
 GOST332592015: dialog {label = "Исходные данные"; key = "t1";// наименование диалога

    : spacer{height=1;} // вставка одной пустой строки
    
    : popup_list {label = "Тип фланца:"; key = "eb_Tip"; edit_width=3; list=" \n01\n02\n03\n04\n11\n21";}
    : popup_list  {label = "Материал фланца:"; key = "eb_Mat"; edit_width=13; list=" \n1 - сталь\n2 - серый чугун\n3 - ковкий чугун";}

    : spacer{height=1;}   // вставка пустой строки

    ok_cancel;   // добавление кнопок ОК и Отмена
}  // окончание диалога
И когда открываю это диалоговое окно
Код:
[Выделить все]
 (setq dcl_id (load_dialog "GOST332592015.dcl")) ;загружаем файл DCL
(if (not (new_dialog "GOST332592015" dcl_id)) (exit)) ;проверка существования диалога
(action_tile "ok" "(dannie) (done_dialog 1)") ;если нажата кнопка "ok"
(action_tile "cancel" "(done_dialog 0)") ;если нажата кнопка "cancel"
(setq ddi (start_dialog))
(unload_dialog dcl_id) ;выгружаем диалоговое окно
(defun dannie ()
(setq Tip (atoi (get_tile "eb_Tip")))
(setq Mat (atoi (get_tile "Mat")))
)
Переменные Tip и Mat он не определяет, пишет что не известно, пишет что неверный тип аргумента. Хотя все по примеру сделал который мне присылали.
protorgovec вне форума  
 
Непрочитано 09.08.2018, 15:12
#34
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Имхо, хотите нормальные динамические диалоги:
1. Делайте диалоги на других языках и вызывайте их из лиспа.
2. Слезайте с лиспа - ваши задачи стали выходить за его пределы.
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.08.2018, 15:16
#35
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Имхо, хотите нормальные динамические диалоги:
1. Делайте диалоги на других языках и вызывайте их из лиспа.
2. Слезайте с лиспа - ваши задачи стали выходить за его пределы.
Например? Какой язык тогда мне более подходит? Хотя, наверное любой, так как я в лиспе то не бум бум, а остальные меня с ума сведут
protorgovec вне форума  
 
Непрочитано 09.08.2018, 15:22
#36
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Естественно, рекомендовал бы .Net Но даже VBA с контролами чуть ли не 20-летней давности дает готовые стандартные средства для вашей задачи - накидываете на форму, связываете с данными и обвешиваете обработчиками событий.
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.08.2018, 15:22
#37
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Имхо, хотите нормальные динамические диалоги:
1. Делайте диалоги на других языках и вызывайте их из лиспа.
2. Слезайте с лиспа - ваши задачи стали выходить за его пределы.
Мне программа для автокада нужна, как я с лиспа слезу?
protorgovec вне форума  
 
Непрочитано 09.08.2018, 15:26
#38
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от protorgovec Посмотреть сообщение
Мне программа для автокада нужна, как я с лиспа слезу?
в акаде альтернатива VBA (с установкой энаблера при необходимости), вне акада - .Net и ObjectARX в сторонних средствах разработки (visual studio) с подгрузкой готовых *.dll/*.arx в акад.
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.08.2018, 15:26
#39
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Естественно, рекомендовал бы .Net Но даже VBA с контролами чуть ли не 20-летней давности дает готовые стандартные средства для вашей задачи - накидываете на форму, связываете с данными и обвешиваете обработчиками событий.
а что за .net?
protorgovec вне форума  
 
Непрочитано 09.08.2018, 15:31
#40
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от protorgovec Посмотреть сообщение
а что за .net?
Посмотрите - огромное количество готовых функций, на базе которых можно реализовать уже свои непосредственные задачи. А не искать очередной велосипед. Этот Фреймворк есть на любом компе - без него акад просто не запустится.

----- добавлено через ~13 мин. -----
Ну и сам Net Api для акада.
Есть официальный русскоязычный сайт разработчиков.
Сергей812 вне форума  
 
Непрочитано 10.08.2018, 14:18
#41
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


Цитата:
Сообщение от protorgovec Посмотреть сообщение
Помогите кто может!!!
диалог Flange_Select.dcl

Код:
[Выделить все]
 
Flange_Dialog : dialog {
				label = "Выбор фланца";
					: boxed_row {
							height = 5;
							: column  {
									width = 15;
									: text_part  {
											label = "Тип";
											alignment = centered;
										     }
									: row {
										spacer_0;
    										: popup_list {
												key = "Flange_Type";
												edit_width = 5;
												list = "\n01\n02\n03\n04\n11\n21";
												value = "0";
												alignment = left;
											     }
										spacer_1;
									      }
									spacer_1;

								}
							: column {
									width = 15;
									: text_part  {
											label = "Материал";
											alignment = centered;
										     }
									spacer_0;
    									: list_box   {
											key = "Flange_Material";
											list = "\n  Cталь  \n  Cерый чугун  \n  Ковкий чугун  ";
											width = 15;
											height = 4;
											is_enabled = false;
											value = "0";
										     }
								}
						    }
					spacer_1;
    					ok_cancel;
			}

лисп flange_selecting.lsp

ПУТЬ К ДИАЛОГУ поменять на реальный путь

Код:
[Выделить все]
 
(defun flange_selecting ()
	(setq dcl_filename_full "ПУТЬ К ДИАЛОГУ\\Flange_Select.dcl"
		  	  fs_dcl_id (load_dialog dcl_filename_full)
			  flange_type "0"
			  flange_material "0"
	)
		(if (not fs_dcl_id)
			(progn
				(alert "Ошибка загрузки DCL файла!")
				(exit)
			)
			(progn
				(if (not (new_dialog "Flange_Dialog" fs_dcl_id))
					(progn
						(alert "Ошибка загрузки DCL файла!")
						(exit)
					)
					(progn
						(action_tile "OK" "(done_dialog 1)")
						(action_tile "Cancel" "(done_dialog 2)")
						(action_tile "Flange_Type" "(if (= \"5\" $value)
															(progn
																(mode_tile \"Flange_Material\" 0)
																(set_tile \"Flange_Material\" flange_material)
															)
															(mode_tile \"Flange_Material\" 1)
													)
													(setq flange_type $value)
												   "
						)
						(action_tile "Flange_Material" "(setq flange_material $value)")
						(set_tile "Flange_Type" flange_material)
						(setq diag_result (start_dialog))
						(unload_dialog fs_dcl_id)
						(cond
								(
									(= diag_result 1)
										(princ (strcat "\nВыбран " (cadr (assoc flange_type '(("0" "01") ("1" "02") ("2" "03") ("3" "04") ("4" "11") ("5" "21")))) " тип фланца"))
										(if (= "5" flange_type)
											(princ (strcat "\nМатериал фланца " (cadr (assoc flange_material '(("0" "Сталь") ("1" "Серый чугун") ("2" "Ковкий чугун"))))))
										)
								)
								(
									t
										(princ "\nEsc нажат")
								)
						)
					)
				)
			)
		)
		(princ)
)
----- добавлено через ~33 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
2. Слезайте с лиспа - ваши задачи стали выходить за его пределы.
да как бы нет)

Последний раз редактировалось koMon, 10.08.2018 в 16:16.
koMon вне форума  
 
Непрочитано 10.08.2018, 15:34
| 1 #42
gomer

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


Цитата:
Сообщение от protorgovec Посмотреть сообщение
Переменные Tip и Mat он не определяет, пишет что не известно, пишет что неверный тип аргумента.
Анекдот. Пришел мужик на авторынок за запорожцем. Мялся-мялся, наконец купил, залез, вставил ключ, провернул, а машина не заводится. Мужик вылез и наехал на продавца, мол, обманул, мол, машина не заводится. А продавец ему и говорит, мол, покупай мерседес, там все с пол-оборота заводится. Мужик почесал репку и пошел пешком домой.
Мораль сего проста: нечего ключ зажигания в прикуриватель тыкать
gomer вне форума  
 
Автор темы   Непрочитано 15.08.2018, 09:50
#43
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от koMon Посмотреть сообщение
диалог Flange_Select.dcl

Код:
[Выделить все]
 
Flange_Dialog : dialog {
				label = "Выбор фланца";
					: boxed_row {
							height = 5;
							: column  {
									width = 15;
									: text_part  {
											label = "Тип";
											alignment = centered;
										     }
									: row {
										spacer_0;
    										: popup_list {
												key = "Flange_Type";
												edit_width = 5;
												list = "\n01\n02\n03\n04\n11\n21";
												value = "0";
												alignment = left;
											     }
										spacer_1;
									      }
									spacer_1;

								}
							: column {
									width = 15;
									: text_part  {
											label = "Материал";
											alignment = centered;
										     }
									spacer_0;
    									: list_box   {
											key = "Flange_Material";
											list = "\n  Cталь  \n  Cерый чугун  \n  Ковкий чугун  ";
											width = 15;
											height = 4;
											is_enabled = false;
											value = "0";
										     }
								}
						    }
					spacer_1;
    					ok_cancel;
			}

лисп flange_selecting.lsp

ПУТЬ К ДИАЛОГУ поменять на реальный путь

Код:
[Выделить все]
 
(defun flange_selecting ()
	(setq dcl_filename_full "ПУТЬ К ДИАЛОГУ\\Flange_Select.dcl"
		  	  fs_dcl_id (load_dialog dcl_filename_full)
			  flange_type "0"
			  flange_material "0"
	)
		(if (not fs_dcl_id)
			(progn
				(alert "Ошибка загрузки DCL файла!")
				(exit)
			)
			(progn
				(if (not (new_dialog "Flange_Dialog" fs_dcl_id))
					(progn
						(alert "Ошибка загрузки DCL файла!")
						(exit)
					)
					(progn
						(action_tile "OK" "(done_dialog 1)")
						(action_tile "Cancel" "(done_dialog 2)")
						(action_tile "Flange_Type" "(if (= \"5\" $value)
															(progn
																(mode_tile \"Flange_Material\" 0)
																(set_tile \"Flange_Material\" flange_material)
															)
															(mode_tile \"Flange_Material\" 1)
													)
													(setq flange_type $value)
												   "
						)
						(action_tile "Flange_Material" "(setq flange_material $value)")
						(set_tile "Flange_Type" flange_material)
						(setq diag_result (start_dialog))
						(unload_dialog fs_dcl_id)
						(cond
								(
									(= diag_result 1)
										(princ (strcat "\nВыбран " (cadr (assoc flange_type '(("0" "01") ("1" "02") ("2" "03") ("3" "04") ("4" "11") ("5" "21")))) " тип фланца"))
										(if (= "5" flange_type)
											(princ (strcat "\nМатериал фланца " (cadr (assoc flange_material '(("0" "Сталь") ("1" "Серый чугун") ("2" "Ковкий чугун"))))))
										)
								)
								(
									t
										(princ "\nEsc нажат")
								)
						)
					)
				)
			)
		)
		(princ)
)
----- добавлено через ~33 мин. -----

да как бы нет)
Огромное спасибо. Сам бы в жизни не допер.
protorgovec вне форума  
 
Автор темы   Непрочитано 16.08.2018, 08:21
#44
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от koMon Посмотреть сообщение
диалог Flange_Select.dcl

Код:
[Выделить все]
 
Flange_Dialog : dialog {
				label = "Выбор фланца";
					: boxed_row {
							height = 5;
							: column  {
									width = 15;
									: text_part  {
											label = "Тип";
											alignment = centered;
										     }
									: row {
										spacer_0;
    										: popup_list {
												key = "Flange_Type";
												edit_width = 5;
												list = "\n01\n02\n03\n04\n11\n21";
												value = "0";
												alignment = left;
											     }
										spacer_1;
									      }
									spacer_1;

								}
							: column {
									width = 15;
									: text_part  {
											label = "Материал";
											alignment = centered;
										     }
									spacer_0;
    									: list_box   {
											key = "Flange_Material";
											list = "\n  Cталь  \n  Cерый чугун  \n  Ковкий чугун  ";
											width = 15;
											height = 4;
											is_enabled = false;
											value = "0";
										     }
								}
						    }
					spacer_1;
    					ok_cancel;
			}

лисп flange_selecting.lsp

ПУТЬ К ДИАЛОГУ поменять на реальный путь

Код:
[Выделить все]
 
(defun flange_selecting ()
	(setq dcl_filename_full "ПУТЬ К ДИАЛОГУ\\Flange_Select.dcl"
		  	  fs_dcl_id (load_dialog dcl_filename_full)
			  flange_type "0"
			  flange_material "0"
	)
		(if (not fs_dcl_id)
			(progn
				(alert "Ошибка загрузки DCL файла!")
				(exit)
			)
			(progn
				(if (not (new_dialog "Flange_Dialog" fs_dcl_id))
					(progn
						(alert "Ошибка загрузки DCL файла!")
						(exit)
					)
					(progn
						(action_tile "OK" "(done_dialog 1)")
						(action_tile "Cancel" "(done_dialog 2)")
						(action_tile "Flange_Type" "(if (= \"5\" $value)
															(progn
																(mode_tile \"Flange_Material\" 0)
																(set_tile \"Flange_Material\" flange_material)
															)
															(mode_tile \"Flange_Material\" 1)
													)
													(setq flange_type $value)
												   "
						)
						(action_tile "Flange_Material" "(setq flange_material $value)")
						(set_tile "Flange_Type" flange_material)
						(setq diag_result (start_dialog))
						(unload_dialog fs_dcl_id)
						(cond
								(
									(= diag_result 1)
										(princ (strcat "\nВыбран " (cadr (assoc flange_type '(("0" "01") ("1" "02") ("2" "03") ("3" "04") ("4" "11") ("5" "21")))) " тип фланца"))
										(if (= "5" flange_type)
											(princ (strcat "\nМатериал фланца " (cadr (assoc flange_material '(("0" "Сталь") ("1" "Серый чугун") ("2" "Ковкий чугун"))))))
										)
								)
								(
									t
										(princ "\nEsc нажат")
								)
						)
					)
				)
			)
		)
		(princ)
)
----- добавлено через ~33 мин. -----

да как бы нет)
Подскажите: немного изменил под себя.
Код:
[Выделить все]
 GOST_33259_2015 : dialog {
                label = "Исходные данные"; //название диалогового окна
                    : boxed_row { //блок из двух данных, тип и материал
                            height = 4; //высота блока
                            : column  { //расставление диалога в столбик
                                    width = 30; //ширина блока
                                    : text_part  {
                                            label = "Тип";
                                            alignment = centered;
                                             }
                                    : row { //средство объединение тип и материал в ряд
                                        spacer_0;
                                            : popup_list {
                                                key = "eb_Tip";
                                                edit_width = 5; //ширина видимой части редактируемого поля Тип
                                                list = " \n01\n02\n03\n04\n11\n21";
                                                value = "0";
                                                alignment = left;
                                                 }
                                        spacer_1;
                                          }
                                    spacer_1;
 
                                }
                            : column {
                                    width = 20; //размер видимой части редактируемого поля Материал
                                    : text_part  {
                                            label = "Материал";
                                            alignment = centered;
                                             }
                                    spacer_0;
                                        : popup_list   {
                                            key = "eb_Mat";
                                            list = " \n1 - сталь\n2 - серый чугун\n3 - ковкий чугун";
                                            width = 10; //ширина видимой части редактируемого поля Материал
                                            height = 4;
                                            is_enabled = false;
                                            value = "0";
                                             }
                                }
                            }
                    spacer_1;
                        ok_cancel;
            }
Получается окошко:

Почему редактируемое окно материала стоит ниже, не могу найти как его сделать на одном уровне с редактируемым окном для типа
Вложения
Тип файла: docx Результат.docx (473.0 Кб, 10 просмотров)
protorgovec вне форума  
 
Непрочитано 16.08.2018, 09:34
#45
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


Цитата:
Сообщение от protorgovec Посмотреть сообщение
Почему редактируемое окно материала стоит ниже, не могу найти как его сделать на одном уровне с редактируемым окном для типа
нужно убрать spacer_0; после : text_part { label = "Материал"; alignment = centered; }
и добавить spacer_1; после : popup_list {...}
koMon вне форума  
 
Непрочитано 16.08.2018, 09:38
#46
trushev


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


Цитата:
Сообщение от koMon Посмотреть сообщение
нужно убрать spacer_0; после : text_part { label = "Материал"; alignment = centered; }
Это 31 строка, или добавить между 10 и 11 строками.
trushev вне форума  
 
Непрочитано 16.08.2018, 09:45
#47
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


как-то так
Миниатюры
Нажмите на изображение для увеличения
Название: Untitled-1.jpg
Просмотров: 19
Размер:	128.0 Кб
ID:	205411  Нажмите на изображение для увеличения
Название: Untitled-2.jpg
Просмотров: 20
Размер:	42.8 Кб
ID:	205414  
koMon вне форума  
 
Автор темы   Непрочитано 17.08.2018, 06:52
#48
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от koMon Посмотреть сообщение
как-то так
Огромнейшее спасибо!!!!!!!

----- добавлено через ~8 ч. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
как-то так
koMon? Добрый день. Подскажи:

В свой блок решил завести еще одну кнопку
Код:
[Выделить все]
 GOST_33259_2015 : dialog {
                label = "Исходные данные"; //название диалогового окна
                
                //первый блок
                    : boxed_row { //блок из двух данных, тип и материал
                            height = 4; //высота блока
                            : column  { //расставление диалога в столбик
                                    width = 15; //ширина блока
                                    : text_part  {
                                            label = "Тип";
                                            alignment = centered;
                                             }
                                    : row { //средство объединение тип и материал в ряд
                                        spacer_0;
                                            : popup_list {
                                                key = "Tip";
                                                edit_width = 5; //ширина видимой части редактируемого поля Тип
                                                list = " \n01\n02\n03\n04\n11\n21";
                                                value = "0";
                                                alignment = left;
                                                 }     
                                        spacer_1;
                                          }
                                    spacer_1;
 
                                }
                            : column {
                                    width = 20; //размер видимой части редактируемого поля Материал
                                    : text_part  {
                                            label = "Материал";
                                            alignment = centered;
                                             }
                                        : popup_list   {
                                            key = "Mat";
                                            list = " \n1 - сталь\n2 - серый чугун\n3 - ковкий чугун";
                                            width = 10; //ширина видимой части редактируемого поля Материал
                                            height = 4;
                                            is_enabled = false;
                                            value = "0";
                                             }
                                             spacer_1;
                                }
                                : column {
                                    width = 5; //размер видимой части редактируемого поля Исполнение
                                    : text_part  {
                                            label = "Исполнение";
                                            alignment = centered;
                                             }
                                        : popup_list   {
                                            key = "Isp";
                                            list = " \nA\nB\nC\nD\nE\nF\nJ\nK\nL\nM";
                                            width = 10; //ширина видимой части редактируемого поля Исполнение
                                            height = 4;
                                            is_enabled = false;
                                            value = "0";
                                             }
                                             spacer_1;
                                }





                                
                            }
                    spacer_1;
                    ok_cancel;
            }
Все хорошо. Но в ней третье окно должно активироваться если выбирают тип 03. Написал код для активации, но похоже я не понял всех операций, которые были в твоем коде.

Код:
[Выделить все]
 (defun flange_selecting ()
    (setq dcl_filename_full "U:\\Автоматизация проекта\\Lisp\\Замороженное окно.dcl"
              fs_dcl_id (load_dialog dcl_filename_full)
              Tip "0"
              Mat "0"
	      Isp "0"
    )
        (if (not fs_dcl_id)
            (progn
                (alert "Ошибка загрузки DCL файла!")
                (exit)
            )
            (progn
                (if (not (new_dialog "GOST_33259_2015" fs_dcl_id))
                    (progn
                        (alert "Ошибка загрузки DCL файла!")
                        (exit)
                    )
                    (progn
                        (action_tile "OK" "(done_dialog 1)")
                        (action_tile "Cancel" "(done_dialog 2)")
                        (action_tile "Tip" "(if (= \"6\" $value)
                                                            (progn
                                                                (mode_tile \"Mat\" 0)
                                                                (set_tile \"Mat\" Mat)
                                                            )
                                                            (mode_tile \"Mat\" 1)
                                                    )
                                                    (setq Tip $value)
                                                   "
                        )
                        (action_tile "Mat" "(setq Mat $value)")
                        (set_tile "Tip" Mat)
		      (setq diag_result (start_dialog))



		      (action_tile "Tip" "(if (= \"3\" $value)
                                                            (progn
                                                                (mode_tile \"Isp\" 0)
                                                                (set_tile \"Isp\" Isp)
                                                            )
                                                            (mode_tile \"Isp\" 1)
                                                    )
                                                    (setq Tip $value)
                                                   "
                        )
                        (action_tile "Isp" "(setq Isp $value)")
                        (set_tile "Tip" Isp)
		      (setq diag_result1 (start_dialog))





		      
                        
                        (unload_dialog fs_dcl_id)
                        (cond
                                (
                                    (= diag_result 1)
                                        (princ (strcat "\nВыбран " (cadr (assoc Tip '(("0" "")("1" "01") ("2" "02") ("3" "03") ("4" "04") ("5" "11") ("6" "21")))) " тип фланца"))
                                        (if (= "6" Tip)
                                            (princ (strcat "\nМатериал фланца " (cadr (assoc Mat '(("0" "") ("1" "Сталь") ("2" "Серый чугун") ("3" "Ковкий чугун"))))))
                                        )
                                )
				(
				(= diag_result1 1)
				(if (= "3" Tip)
                                            (princ (strcat "\nИсполнение " (cadr (assoc Isp '(("0" "") ("1" "A") ("2" "B") ("3" "C") ("4" "D") ("5" "E") ("6" "F") ("7" "J") ("8" "K") ("9" "L") ("10" "M") )))))
                                        )
				 )
				 
                                (
                                    t
                                        (princ "\nEsc нажат")
                                )
                        ) 
                    ) 
                )
            )
        )
        (princ)
)




Можешь помочь, что я не до понял.
И еще
Код:
[Выделить все]
 (
                                    t
                                        (princ "\nEsc нажат")
                                )
Объясни что за операция. Я как понял, что если не выбрано нужного типа, то это как будто нажатие Esc для замороженного окна?
protorgovec вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp ограничить ввод для пользователя



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Autolisp: как получить последний ввод (команду, координаты точек)? studentarh LISP 52 04.12.2024 12:15
Ввод объекта в эксплуатацию andrew.g Прочее. Архитектура и строительство 7 12.07.2013 16:28
DYNMODE (Системная переменная динамический ввод) sdv79 Справочник команд 0 10.06.2012 17:17
Приямок ("кессон") скважины водоснабжения. Гидроизоляция, ввод трубы. Андрей О Конструкции зданий и сооружений 2 27.05.2011 23:52
Динамический ввод или демонический ввод? TheBuTeK Динамические блоки 20 13.10.2005 09:36