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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Диалоговое окно - выпадающий список

Диалоговое окно - выпадающий список

Ответ
Поиск в этой теме
Непрочитано 10.04.2025, 10:47 #1
Диалоговое окно - выпадающий список
slbne
 
Регистрация: 10.04.2025
Сообщений: 5

Добрый день , пытаюсь освоить диалоговое окно и сильно туплю .
как пример хотелось бы создать диалоговое окно с выпадающим списком по номеру детали, вот мой код:

Код:
[Выделить все]
(DEFUN tr_1 (/ p1 p2 p3 L h ) ; начало функции
; Ввод значений гипотенузы и угла
(setq L 300
H 100
)
  (setq x 50 y 50)
(setq p1 (list x y )) ; Запрос координат базовой точки
(setq p2 (polar p1 0 L)) ; определение координат точки p2
(setq p3 (polar p2 (/ pi 2) h)) ; определение координат точки p3
(command "_line" p1 p2 p3 p1 "") ; рисуем треугольник
 
)
 
(DEFUN tr_2 (/ p1 p2 p3 L h ) ; начало функции
; Ввод значений гипотенузы и угла
(setq L 200
H 90
)
  (setq x 50 y 50)
(setq p1 (list x y )) ; Запрос координат базовой точки
(setq p2 (polar p1 0 L)) ; определение координат точки p2
(setq p3 (polar p2 (/ pi 2) h)) ; определение координат точки p3
(command "_line" p1 p2 p3 p1 "") ; рисуем треугольник
 
)
 
 
(DEFUN tr_3 (/ p1 p2 p3 L h ) ; начало функции
; Ввод значений гипотенузы и угла
(setq L 100
H 50
)
  (setq x 50 y 50)
(setq p1 (list x y )) ; Запрос координат базовой точки
(setq p2 (polar p1 0 L)) ; определение координат точки p2
(setq p3 (polar p2 (/ pi 2) h)) ; определение координат точки p3
(command "_line" p1 p2 p3 p1 "") ; рисуем треугольник
 
)
  (setq dcl_id (load_dialog "eokno.dcl"))
(new_dialog "examokno" dcl_id)
  (if (not (new_dialog "examokno" dcl_id))(exit))
  (action_tile "accept" "(done_dialog 1)")
  (action_tile "cancel" "(done_dialog 0)")
  (setq ddi (start_dialog))
(if (= ddi 1) (tr_1))
(princ)
Вот код диалогового окна

Код:
[Выделить все]
examokno : dialog {label = "Построение детали" ;
    : spacer{height=1;} 
    
    : spacer{height=1;} 
    :popup_list{label="Выберете № чертежа детали";
     key="pop1";
     list="1" "\n2" "\n3" ;
     edit_width=15;
     }
     : spacer{height=1;} 
    ok_cancel;
}
Тут я хотя бы хочу реализовать что бы при нажатии кнопки "ОК" рисовал треугольник tr_1.
tr_1,tr_2,tr_3 простые программы которые без каких либо вводных строят треугольники.
Конечно в идеале хочу понять как сделать, что-бы при выборе 1 - рисовал tr_1 , при выборе 2 - рисовал tr_2, при выборе 3 - рисовал tr_3
Но пока даже без выборки при нажатии на кнопку "Ок" пытаюсь хоть что-то изобразить , но автокад при нажатии на кнопку "Ок" висит замертво, помогите найти ошибку

Последний раз редактировалось slbne, 10.04.2025 в 10:54.
Просмотров: 478
 
Непрочитано 10.04.2025, 13:47
#2
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 613


Неверно обрабатываешь нажатия кнопок. Нужно примерно так:

(action_tile "accept" "(done_dialog) (setq p0 3)")

Затем проверяешь, чему стала равна p0 - и погнал дальше...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 10.04.2025, 13:57
#3
Кулик Алексей aka kpblc
Moderator

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


М-да... Совет как минимум вредный.
(action_tile "accept" "(done_dialog 1)")
(setq dcl_res (start_dialog))
(unload_dialog dcl_id)
(if (= dcl_res 1)
; ...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.04.2025, 14:13
#4
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 613


Я в своё время остановился на этом варианте.
Почему - уже не помню. :-)

Но всё работает стабильно.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 10.04.2025, 14:40
#5
Кулик Алексей aka kpblc
Moderator

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


А на фига вводить дополнительные переменные? Да еще и с настолько информативными именами?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.04.2025, 14:44
#6
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 613


Ох, полез смотреть, вспоминать...

Итог.

Всё это тянется у меня ещё с DOS-версии Автокада.

Видимо, возврат функцией (start_dialog) какого-нибудь
значения ввели позже. А далее - классика.
Работает - не трогай.

Я и не трогал. :-)))

Что касается информативности - у меня такой стиль.

Если переменная нужна в десятке-другом строчек кода,
помещающихся на один экран, я называю их p, p1, p2.

Своеобразный индикатор временности.

Вычислил попридержал в памяти, обработал и забыл.

Кстати, тоже с тех времён привычка, когда компы были
медленными и памяти мало было. А переменная с именем
не более 6 символов позволяла в одной ячейке АвтоЛиспа
хранить и имя переменной и её значение.

А память "на всё и про всё" в килобайтах измерялась. :-)
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 10.04.2025 в 14:53.
===AAA=== вне форума  
 
Автор темы   Непрочитано 10.04.2025, 14:48
#7
slbne


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
М-да... Совет как минимум вредный.
(action_tile "accept" "(done_dialog 1)")
(setq dcl_res (start_dialog))
(unload_dialog dcl_id)
(if (= dcl_res 1)
; ...
Не могу увидеть разницу между моим кодом и вашим , вы просто мою переменную ddi заменили на dcl_res, суть не поменялась , видимо эту часть кода я правильно понимаю, по факту мы задаем при нажатии на "ОК" значение 1, при нажатии на "Отмена" значение 0.,
потом считываем в переменную в вашем коде в dcl_res и вот если уже dcl_res у нас 1 , то выполняем программу tr_1 , это и есть уже оператор if видимо в нем я и косячу, в принципе сейчас написал новое диалоговое окно просто с кнопками , и разобрался как нажимая на кнопку изображать рисунок, теперь возвращаюсь к списку и начинаю думать о нем., в этой части кода я должен оставить все так-же если отмена то 0 , если ОК то 1, далее если у нас 1 , то необходимо опять сравнение, нужно вытащить из диалогового окна значение которое выбрал пользователь, преобразовать его в инт и уже его сравнивать - если 1 то tr_1 если 2 то tr_2 и тп., саму суть я полностью понимаю но откодировать не получается
slbne вне форума  
 
Непрочитано 10.04.2025, 14:59
#8
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 613


Это делается примерно так:

(action_tile "pop1" "(setq p12 $value)")

У меня - "пещерного человека" :-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 10.04.2025, 15:04
#9
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от slbne Посмотреть сообщение
Не могу увидеть разницу между моим кодом и вашим , вы просто мою переменную ddi заменили на dcl_res, суть не поменялась , видимо эту часть кода я правильно понимаю, по факту мы задаем при нажатии на "ОК" значение 1, при нажатии на "Отмена" значение 0.,
потом считываем в переменную в вашем коде в dcl_res и вот если уже dcl_res у нас 1 , то выполняем программу tr_1 , это и есть уже оператор if видимо в нем я и косячу, в принципе сейчас написал новое диалоговое окно просто с кнопками , и разобрался как нажимая на кнопку изображать рисунок, теперь возвращаюсь к списку и начинаю думать о нем., в этой части кода я должен оставить все так-же если отмена то 0 , если ОК то 1, далее если у нас 1 , то необходимо опять сравнение, нужно вытащить из диалогового окна значение которое выбрал пользователь, преобразовать его в инт и уже его сравнивать - если 1 то tr_1 если 2 то tr_2 и тп., саму суть я полностью понимаю но откодировать не получается
Я отвечал на бегу, разрываясь между 3 проектами одновременно и полностью твой код не видел, сорри. И отвечал я ===ААА===, еще раз извини, что не уточнил.
Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
(action_tile "pop1" "(setq p12 $value)")
callback-функцию из принципа не пользуешь?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.04.2025, 15:22
#10
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 613


Использую, конечно. :-)

Если нужно, скажем, заблокировать какую-нибудь кнопку
диалогового окна или слайд поменять после выбора
радиокнопки/переключателя. Куда же без неё-то...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 10.04.2025, 15:40
#11
slbne


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Это делается примерно так:

(action_tile "pop1" "(setq p12 $value)")

У меня - "пещерного человека" :-)
Такой командой в p12 сразу в инт придет значение выбранное пользователем ? или текстовое
slbne вне форума  
 
Непрочитано 10.04.2025, 15:45
#12
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 613


Текстовое.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 10.04.2025, 16:13
#13
slbne


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Текстовое.
Дописал код , что бы можно было вызывать программку с раб поля автокада

Код:
[Выделить все]
 (DEFUN c:gol (/ ddi dcl_id num )
    (setq dcl_id (load_dialog "eokno.dcl"))
  (if (not (new_dialog "examokno" dcl_id))(exit))
(action_tile "pop1" "(setq num $value)")
   (princ num)
  (action_tile "accept" "(done_dialog 1)") 
  (action_tile "cancel" "(done_dialog 0)")
  (setq ddi (start_dialog))
   (unload_dialog dcl_id)
Пытаюсь хотя бы текстовое вытащить, строкой (action_tile "pop1" "(setq num $value)") даже добавил строку (princ num) выводить, то что выдает, но переменная num всего nill.......
зато сейчас все кнопки жмутся , автокад не висит замертво , нормально закрывает диалоговое окно после "ОК" "Отмена" и тп
slbne вне форума  
 
Непрочитано 10.04.2025, 16:21
#14
Кулик Алексей aka kpblc
Moderator

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


Так либо выводить внутри основной функции, либо делать переменную глобальной.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.04.2025, 16:23
#15
name02


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


Попробуй убрать num из локальных переменных
name02 вне форума  
 
Автор темы   Непрочитано 10.04.2025, 16:44
#16
slbne


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Попробуй убрать num из локальных переменных
Её уже и туда и сюда не помогает., только через сложные танцы выходит

Код:
[Выделить все]
(defun iz_sech ()
    (setq plist_K (list "1" "2" "3" "4" ))
  (start_list "pop1")
  (mapcar 'add_list plist_K)
  (end_list)
)

(defun num_kol ()
  (setq Raz (atoi (nth (atoi (get_tile "pop1")) plist_k)))
  )
 (DEFUN c:gol (/ ddi dcl_id num )
    (setq dcl_id (load_dialog "eokno.dcl"))
  (if (not (new_dialog "examokno" dcl_id))(exit))
   (iz_sech)
   (num_kol)
(action_tile "pop1" "(num_kol)")
   (princ Raz)
  (action_tile "accept" "(done_dialog 1)") 
  (action_tile "cancel" "(done_dialog 0)")
  (setq ddi (start_dialog))
   (unload_dialog dcl_id)
)
через две подфункции , в одной мы заново заполняем наш список запоминая его в plist_k , во второй вытаскиваем инт в переменную raz. Неужели нету попроще вариантов. Так робит кстати ., теперь буду над If думать
slbne вне форума  
 
Непрочитано 11.04.2025, 07:32
#17
name02


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


В первой строке ты убирал num?

Код:
[Выделить все]
 (DEFUN c:gol (/ ddi dcl_id num) ;; <-- тут убирал?
  (setq dcl_id (load_dialog "eokno.dcl"))
  (if (not (new_dialog "examokno" dcl_id))
    (exit)
  ) ;_ end of if
  (action_tile "pop1" "(setq num $value)")
  (princ num)
  (action_tile "accept" "(done_dialog 1)")
  (action_tile "cancel" "(done_dialog 0)")
  (setq ddi (start_dialog))
  (unload_dialog dcl_id)
) ;_ end of DEFUN
name02 вне форума  
 
Непрочитано 11.04.2025, 10:57
#18
koMon


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


Цитата:
Сообщение от slbne Посмотреть сообщение
создать диалоговое окно с выпадающим списком по номеру детали
Код:
[Выделить все]
 
(defun populate_list (list_key list_to_process)
	(start_list list_key 3)
		(mapcar 'add_list
				(mapcar '(lambda (list_element)
				  			(strcat "\n" list_element)
				  		 )
				  		 list_to_process
				)
		)
	(end_list)
)
(defun get_choice (/ exam_dcl_id popup_choice_list dialog_result choice)
	(setq exam_dcl_id (load_dialog "drive:\\path\\examokno.dcl")
		  popup_choice_list '("1" "2" "3")
	) 
	(if exam_dcl_id
		(if (new_dialog "examokno" exam_dcl_id)
			(progn
				(populate_list "pop1" popup_choice_list) 
				(action_tile "accept" "(setq choice (nth (atoi (get_tile \"pop1\")) popup_choice_list)) (done_dialog 1)")
				(action_tile "pop1" "(setq choice (nth (atoi $value) popup_choice_list))")  
				(setq dialog_result (start_dialog))
				(unload_dialog exam_dcl_id)
				(cond
						((= dialog_result 1) choice)
						(t (setq choice nil))
				)
			)
	 	)
	)
)
(if (setq choice_picked (get_choice))
	(cond
		((= "1" choice_picked) (tr_1)) 
		((= "2" choice_picked) (tr_2)) 
		((= "3" choice_picked) (tr_3)) 
	)
)

диалог
Код:
[Выделить все]
examokno :dialog {label = "Построение детали";
			initial_focus = "pop1";
			spacer_1; 
			:popup_list {
				   	label = "ВыберИте № чертежа детали";
    			   		key = "pop1";
    			   	}
			spacer_1; 
			ok_cancel;
		}
__________________
K Lisp
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Диалоговое окно - выпадающий список



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматизация очистки. Как убрать (можно ли?) диалоговое окно DCL из LSP? nofedosov LISP 2 13.03.2023 09:56
Solidworks 2014. Как создать выпадающий список? voverrr SolidWorks 1 18.02.2016 16:27
Как восстоновить диалоговое окно "Генератор валов" в AutoCad Mechanikal-е? Армен Грачикович Вертикальные решения на базе AutoCAD 2 11.03.2013 13:49