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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Можно примерчик диалогового окна со сменой слайдов?

Можно примерчик диалогового окна со сменой слайдов?

Ответ
Поиск в этой теме
Непрочитано 12.10.2018, 09:02 #1
Можно примерчик диалогового окна со сменой слайдов?
===AAA===
 
г. Норильск
Регистрация: 15.08.2005
Сообщений: 452

Всем привет!

Если можно, приведите примерчик (или ссылку на) фрагмента диалогового
окна и его обработки из LISP'а со следующим функционалом:

а) есть несколько "радиокнопок" (ну, скажем три штуки) и одно поле для слайда.

б) при "тычке мышью" по этим кнопкам изображение в поле (слайд из библиотеки)
меняется.

Внизу кнопки ОК и Отмена.

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

Ближайший аналог - выбор градиента "Один цвет" или "Два цвета" из диалогового
окна "Штриховка и градиент" в Автокаде. Там выбираешь радиокнопку и тут же
меняется наборка слайдов, изображающих, как будет выглядеть результат.
__________________
Счастливо, Алексей!
Просмотров: 2030
 
Непрочитано 12.10.2018, 09:52
#2
Сергей812


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Собственно, выбор радиокнопки после нажатия ОК обработать не проблема,
интересует именно механизм смены слайда при "тыкании мышью" по этим
кнопкам, пока окно на экране.
типовая задача для большинства языков, но вы же не хотите ничего кроме лиспа.. Подгружали бы функцию на Net c элементами WinForms в библиотеке *.dll, вызывали из своего кода как обыкновенную Lisp функцию c получением результата в виде индекса выбранной кнопки (а весь код по отработке взаимодействия с пользователем внутри библиотеки). Всего один дополнительный файл *.dll в программе с комплектом всех нужных диалогов.
Сергей812 вне форума  
 
Автор темы   Непрочитано 12.10.2018, 10:12
#3
===AAA===


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


Увы, я пишу "урывками" минут по 10-15 в день...
Это, скорее, "воспоминания из прошлой жизни".
Так что, уп-с...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 12.10.2018, 17:41
1 | #4
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,835
<phrase 1=


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Если можно, приведите примерчик (или ссылку на) фрагмента диалогового
окна и его обработки из LISP'а со следующим функционалом:
В программе ПРОКАТ такое есть http://forum.dwg.ru/showthread.php?t...ED%E4%F0%E0%F2
ЛИСП там немного староват, но твой случай там прекрасно работает
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 15.10.2018, 17:35
#5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Getting Started with Dcl Dialogs
Здесь много примеров с кодами
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 15.10.2018, 21:41
#6
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,835
<phrase 1=


Цитата:
Сообщение от VVA Посмотреть сообщение
Здесь много примеров с кодами
Нет там ИМХО со сменой Image в окне. Идейка в зачистке окна и вставке нового изображения.
в ПРОКАТ как раз то что надо топикстартеру
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 16.10.2018, 16:06
#7
===AAA===


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


Да, запустил ПРОКАТ, посмотрел, как меняются картинки.

Ровно то, что нужно, спасибо.

Сейчас буду разбираться, как это реализовано. Вопросы
уже есть (в частности, почти ничего на русскоязычных
ресурсах не нашёл про image_block, только на англоязычных -
странно как-то), но пока попробую разобраться сам.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 21.10.2018, 16:40
1 | #8
Сергей812


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


Ну и вариант на LISP .Net функции - вызывается как любая другая лисп-функция:

Код:
возвращая либо номер выбранной картинки, либо nil - если пользователь нажал отмену или просто закрыл форму .


Код:
[Выделить все]
// Windows
using System.Reflection;

// AutoCAD
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;

namespace DialogExample
{
    public class CommandsClass
    {
        /// <summary>
        /// Задаем LISP-подобную функцию
        /// </summary>
        /// <param name="aArgs">Аргументы функции</param>
        /// <returns>Результат вызова функции</returns>
        [LispFunction("ShowDialog1")]
        public TypedValue ShowDialog1(ResultBuffer aArgs)
        {
            // Создаем форму, передавая в ее конструктор полное имя загруженной сборки
            Dialog1 lDlg = new Dialog1(Assembly.GetExecutingAssembly().Location);
            // Показываем форму в контексте AutoCAD. Если пользователь подтвердил выбор картинки
            if (Application.ShowModalDialog(lDlg) == System.Windows.Forms.DialogResult.OK)
            {
                // Возвращаем индекс выбранной картинки
                return new TypedValue((int)LispDataType.Int16, lDlg.NumSelectImage);
            }
            else
            {
                // Если пользователю картинки не понравились, то возвращаем nil
                return new TypedValue((int)LispDataType.Nil);
            }
        }

    }
}



Один раз разобравшись в синтаксисе объявления LISP функции на .Net - остальные будут писать за пару минут методом копипасте с незначительными правками.


Код:
[Выделить все]
// Windows
using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;

namespace DialogExample
{
    public partial class Dialog1 : Form
    {
        /// <summary>
        /// Путь к картинкам
        /// </summary>
        private string _Path;

        /// <summary>
        /// Индекс выбранной картинки (с единицы)
        /// </summary>
        private int _NumSelectImage;


        /// <summary>
        /// Конструктор формы
        /// </summary>
        /// <param name="aNameDLLFile">Полное имя файла сборки</param>
        public Dialog1(string aNameDLLFile)
        {
            // Инициализируем компоненты
            InitializeComponent();
            // Задаем путь к картинкам
            _Path = Path.Combine(Path.GetDirectoryName(aNameDLLFile), "IMAGES");
            
        }


        /// <summary>
        /// Выбор первой радиокнопки (обратите внимание, что меняется лишь имя файла
        /// картинки и цифра индекса выбора в обработчиках радиокнопки - копипаст рулит)
        /// </summary>
        /// <param name="sender">Радиокнопка - источник сообщения</param>
        /// <param name="e">Дополнительные аргументы</param>
        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            // Если выбрана радиокнопка
            if ((sender as RadioButton).Checked)
            {
                // То загружаем соответствующую картинку
                pictureBox1.Image = Image.FromFile(Path.Combine(_Path, "Котик1.jpg"));
                // И задаем соответствующий индекс
                _NumSelectImage = 1;
            }
        }


        /// <summary>
        /// Выбор второй радиокнопки
        /// </summary>
        /// <param name="sender">Радиокнопка - источник сообщения</param>
        /// <param name="e">Дополнительные аргументы</param>
        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            // Если выбрана радиокнопка
            if ((sender as RadioButton).Checked)
            {
                // То загружаем соответствующую картинку
                pictureBox1.Image = Image.FromFile(Path.Combine(_Path, "Котик2.jpg"));
                // И задаем соответствующий индекс
                _NumSelectImage = 2;
            }
        }


        /// <summary>
        /// Выбор третьей радиокнопки
        /// </summary>
        /// <param name="sender">Радиокнопка - источник сообщения</param>
        /// <param name="e">Дополнительные аргументы</param>
        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            // Если выбрана радиокнопка
            if ((sender as RadioButton).Checked)
            {
                // То загружаем соответствующую картинку
                pictureBox1.Image = Image.FromFile(Path.Combine(_Path, "Котик3.jpg"));
                // И задаем соответствующий индекс
                _NumSelectImage = 3;
            }
        }


        /// <summary>
        /// Свойство: Получение индекса выбранной картинки (с единицы) 
        /// </summary>
        public int NumSelectImage
        {
            get { return _NumSelectImage; }
        }

    }
}


На форму накиданы мышкой три радиокнопки radioButton1, 2 и 3, бокс изображений pictureBox1, и две кнопки "ОК" и "Отмена". Последним присвоены одноименные модальные значения, этим кнопкам даже кода писать не надо - сами закроют при нажатии форму с возвратом соответствующего значения. Код тоже хорошо поддается копипастингу, не говоря уже о том - что сама среда программирования (любая бесплатная visual studio) на порядок дружественнее редакторов Lisp либо VBA.
Сергей812 вне форума  
 
Непрочитано 24.10.2018, 14:48
1 | #9
koMon


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Если можно, приведите примерчик (или ссылку на) фрагмента диалогового
окна и его обработки из LISP'а
Пример на лиспе.

Диалог "Slide_Select.dcl"

Код:
[Выделить все]
 
Slide_Select : dialog {
			label = "Выбор слайда";
				: boxed_column
						{
							: row {
									height = 4;
									: radio_column
											{ key = "Slide_Selected";
												: radio_button {
															label = "Слайд 1";
															alignment = left;
															height = 1.5;
															key = "Slide_1";
															value = "1";
													       }
												: radio_button {
															label = "Слайд 2";
															alignment = left;
															height = 1.5;
															key = "Slide_2";
													       }
												: radio_button {
															label = "Слайд 3";
															alignment = left;
															height = 1.5;
															key = "Slide_3";
													       }
										        }
									spacer_1;
									: column {
											: image {
													key = "Slide_Preview";
													is_tab_stop = false;
													color = black;
													alignment = centered;
													width = 20;
												}
										 }
							      }
							      : spacer
							      		{
							      			height = 0.2;
							      		}
						}
				spacer_1;
				ok_cancel;
			}
Лисп
установить в files_path реальный путь к файлу диалога и библиотеке слайдов из архива.

Код:
[Выделить все]
 
;************************************************************************************************************************************

(setq files_path "ДИСК:\\КАТАЛОГ\\КАТАЛОГ\\")

;************************************************************************************************************************************

(defun draw_slide_preview (parsed_slidelib_slide_full / )
	(start_image "Slide_Preview")
		(fill_image 0 0 (dimx_tile "Slide_Preview") (dimy_tile "Slide_Preview") 0)
		(slide_image 0 0 (dimx_tile "Slide_Preview") (dimy_tile "Slide_Preview") parsed_slidelib_slide_full)
	(end_image)
)

;************************************************************************************************************************************

(defun slide_select ()
	(setq dcl_filename_full (strcat files_path "Slide_Select.dcl")
		  	  ss_dcl_id (load_dialog dcl_filename_full)
			  slide_selected "Slide_1"
	)
		(if (not ss_dcl_id)
			(progn
				(alert "Ошибка загрузки DCL файла!")
				(exit)
			)
			(progn
				(if (not (new_dialog "Slide_Select" ss_dcl_id))
					(progn
						(alert "Ошибка загрузки DCL файла!")
						(exit)
					)
					(progn
						(action_tile "OK" "(done_dialog 1)")
						(action_tile "Cancel" "(done_dialog 2)")
						(action_tile "Slide_Selected" "(cond
															(
																(= $value \"Slide_1\")
																	(draw_slide_preview (strcat files_path \"Slides(Slide_1)\"))
															)
															(
																(= $value \"Slide_2\")
																	(draw_slide_preview (strcat files_path \"Slides(Slide_2)\"))
															)
															(
																(= $value \"Slide_3\")
																	(draw_slide_preview (strcat files_path \"Slides(Slide_3)\"))
															)
													   )
													   (setq slide_selected $value)
													   "
						)
						(draw_slide_preview (strcat files_path "Slides(Slide_1)"))
						(setq diag_result (start_dialog))
						(unload_dialog ss_dcl_id)
						(cond
								(
									(= diag_result 1)
										(princ "\nОК нажат")
										(print slide_selected)
								)
								(
									t
										(princ "\nEsc нажат")
								)
						)
					)
				)
			)
		)
		(princ)
)
Вложения
Тип файла: rar Slides.rar (1.7 Кб, 15 просмотров)
koMon на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Можно примерчик диалогового окна со сменой слайдов?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск диалогового окна через "WScript.Shell" "PopUp" в скрытом режиме kosmi LISP 3 24.05.2018 07:58
Как в макросе прописать выбор диалогового окна? DmAK Программирование 2 20.09.2016 08:59
Электрика: можно ли делать окна и въезды в здание со стороны ЛЭП? Kikin Электроснабжение 14 20.04.2009 15:20
Диалоговые окна за пределами экрана (не FILEDIA) kosmax AutoCAD 7 30.03.2009 16:30
Медленное открытие диалогового окна PLOT AutoCAD 2006 VladD AutoCAD 20 08.06.2006 14:58