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

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

Запрос у пользователя списком

Ответ
Поиск в этой теме
Непрочитано 20.12.2015, 22:29 #1
Запрос у пользователя списком
granit201z
 
Проектировщик
 
Камышин
Регистрация: 17.08.2014
Сообщений: 118

Здравствуйте. Подскажите пожалуйста как организовать запрос данных от пользователя целым списком. То есть не какого-то 1-го ключевого слова, а сразу десятка таких слов. То есть для примера такой запрос: "Выберите группы с которыми будем работать дальше: ". И должен выпасть список наподобие:

Гр.1
Гр.2
Гр.3
...
Гр.47
Гр.48

Пользователь за раз должен выбрать из этого списка столько групп - сколько ему захочется (от одной до всех сорока восьми), причем необязательно подряд. Например он хочет выбрать с 3 по 16 и с 32 по 39, или вообще через одну

Какими средствами это осуществляется?

P.S. Если есть какие нибудь готовые куски кода, позволяющие приблизиться к выполнению этой задачи - буду весьма благодарен
Просмотров: 6767
 
Непрочитано 21.12.2015, 00:02
#2
Кулик Алексей aka kpblc
Moderator

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


На каком языке интересует решение / метода?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.12.2015, 00:06
#3
granit201z

Проектировщик
 
Регистрация: 17.08.2014
Камышин
Сообщений: 118


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
На каком языке интересует решение / метода?
Алексей, на AutoLisp
granit201z вне форума  
 
Непрочитано 21.12.2015, 00:24
#4
Кулик Алексей aka kpblc
Moderator

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


В таком случае есть несколько вариантов: либо сделать initget и в конт.меню запрашивать у пользователя "до посинения" каждый элемент (пока он не нажмет "Хватит"), либо делать диалог на том же dcl, в котором прописывать popup_list с возможностью многократного выбора.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.12.2015, 00:38
#5
granit201z

Проектировщик
 
Регистрация: 17.08.2014
Камышин
Сообщений: 118


спасибо. беда только в том, что если воспользоваться первым методом - необходимость в программе отпадает, так как вручную, пожалуй будет проще делать расчеты и чертить, а если вторым, то придется изучать все что с ним связано, так как для меня это темный лес. Тут в голову мысль бредовая пришла: Можно создать 48 примитивов MTEXT, вывести их в чертеж, заставить пользователя выбрать необходимые при помощи ssget, а после извлечь информацию о выбранных и удалить их с чертежа.
granit201z вне форума  
 
Непрочитано 21.12.2015, 00:49
#6
Кулик Алексей aka kpblc
Moderator

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


Можно и так. Просто я предпочитаю без крайней нужды не создавать временные примитивы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.12.2015, 01:10
#7
Сергей812


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


ввод строки, в ней через пробел номера позиций меню.. только настройте ввод-чтобы пробел не воспринимался как ввод

----- добавлено через ~16 мин. -----
т.е. что-то типа
Код:
[Выделить все]
 (setq s (getstring T "\nВведите позиции через пробел или группы позиций через '-'. Завершение - Ввод\n"))
а потом распарсить полученную строку по пробелам и тире.

----- добавлено через ~55 мин. -----
Ну или разбирайтесь с DCL. Ничего сложного там нет:
Код:
[Выделить все]
 dd_toggle : dialog 
{
 	label = "Выберите рабочие группы";
	fixed_height = true;
	// Размещаем в строке нужное количество чекбоксов, меняя лишь значения key и label
	:row
	{
		:toggle // Задаем чекбокс
 		{ 
			key = "tog01"; 
			value = "0"; 
			fixed_height = true; 
			alignment = center; 
			label = "Гр.01"; 
		} 
		:toggle 
 		{ 
			key = "tog02"; 
			value = "0"; 
			fixed_height = true; 
			alignment = center; 
			label = "Гр.02"; 
		}
		:toggle 
 		{ 
			key = "tog03"; 
			value = "0"; 
			fixed_height = true; 
			alignment = center; 
			label = "Гр.03"; 
		}

	}
	// Повторяем предыдущий код столько раз - сколько нужно строк с чекбоксами. При этом значения key должны быть уникальные!

	: row 
 	{
 		ok_button;
 		cancel_button;
 	}
}
как работать с диалогами - на вышеуказанной ссылке все есть.
Сергей812 вне форума  
 
Непрочитано 21.12.2015, 07:14
#8
Do$

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


http://www.lee-mac.com/listboxsync.html
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 21.12.2015, 09:18
#9
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


48 переключателей в одной строке или в одном столбце - это не годится. Нужна матрица, скахем, 6х8.
Profan вне форума  
 
Непрочитано 21.12.2015, 09:55
#10
Сергей812


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


Цитата:
Сообщение от Profan Посмотреть сообщение
48 переключателей в одной строке или в одном столбце - это не годится. Нужна матрица, скахем, 6х8.
Так и показал в примере - как разбить чекбоксы по строкам и столбцам.. решение в лоб.. не хочет человек глубоко влезать в DCL, пускай занимается копипастингом с незначительными корректировками) Можно, как показывал Алексей Кулик на autolisp.ru - делать файл dcl динамически и забивать в цикле значения. Можно на том же NetApi написать lisp-функцию и подключить и т.д.
Сергей812 вне форума  
 
Автор темы   Непрочитано 21.12.2015, 10:31
#11
granit201z

Проектировщик
 
Регистрация: 17.08.2014
Камышин
Сообщений: 118


спасибо за ответы. буду разбираться

Цитата:
как показывал Алексей Кулик на autolisp.ru - делать файл dcl динамически и забивать в цикле значения
а можно ссылку на эту страницу. скорее всего это наиболее подходящий вариант, т.к. 48 групп это не статичная цифра. в зависимости от конкретной ситуации их может быть и 6, и 80, и т.д.
granit201z вне форума  
 
Непрочитано 21.12.2015, 11:31
#12
Кулик Алексей aka kpblc
Moderator

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


Наверное, эта: http://autolisp.ru/2010/03/15/dcl-dialogs-create/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.12.2015, 12:03
#13
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,992


granit201z, функция dos_multilist из DOSLib не подойдет?
Миниатюры
Нажмите на изображение для увеличения
Название: 2015-12-21 11-01-34 Скриншот экрана.png
Просмотров: 45
Размер:	75.9 Кб
ID:	162645  
Nike вне форума  
 
Автор темы   Непрочитано 21.12.2015, 12:38
#14
granit201z

Проектировщик
 
Регистрация: 17.08.2014
Камышин
Сообщений: 118


Nike, пожалуй идеально подойдет. Но что такое DOSLib. И где можно подробнее ознакомиться с его практическим применением

----- добавлено через ~5 мин. -----
и еще вопрос. эта функция будет работать только на компе где этот самый DOSLib имеется?
granit201z вне форума  
 
Непрочитано 21.12.2015, 12:50
#15
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,992


granit201z, библиотека функций чья-то
http://www.en.na.mcneel.com/doslib.htm

Естественно, будет работать там, где имеется и заранее подгружена.
Вложения
Тип файла: zip doslib901arx.zip (3.87 Мб, 9 просмотров)
Nike вне форума  
 
Непрочитано 21.12.2015, 13:38
#16
gomer

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


Цитата:
Сообщение от granit201z Посмотреть сообщение
эта функция будет работать только на компе где этот самый DOSLib имеется?
Более того, раз в 2-3 года нужно будет обновлять код, чтоб включить поддержку новых версий дослиб, поддерживающих новые версии автокада.
gomer вне форума  
 
Автор темы   Непрочитано 21.12.2015, 13:53
#17
granit201z

Проектировщик
 
Регистрация: 17.08.2014
Камышин
Сообщений: 118


Сергей 812, спасибо за код. Получилось создать и запустить из лиспа диалог с тремя флажками в ряд. Но тут одна загвоздка. Чтобы активировать (деактивировать) флажок по нему нужно щелкнуть индивидуально - то есть не получается сразу выделить кучку близлежащих флажков рамкой, потом нажать например CTRL и выделить еще одну кучку близлежащих флажков. Можно ли с помощью DCL сделать окно подобное тому, которое нарисовано в скриншоте, который прислал Nike, описывая DOSLib
granit201z вне форума  
 
Непрочитано 21.12.2015, 14:09
#18
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,992


granit201z, глянь тут еще http://web2.iadfw.net/terrycad/Tutor...m#MyMultiLists
Nike вне форума  
 
Непрочитано 21.12.2015, 15:11
#19
trushev


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


В развитие #4 Кулик Алексей aka kpblc,
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
либо делать диалог на том же dcl, в котором прописывать popup_list с возможностью многократного выбора.
При замене popup_list на list_box при multiple_select = true; многократно используя (action_tile "sp" "(setq s $value)")
в s, выделяя строки (блоки строк) загруженного списка, можно сформировать любую строку (список) номеров строк разделенных пробелами.
trushev вне форума  
 
Непрочитано 21.12.2015, 15:19
#20
Кулик Алексей aka kpblc
Moderator

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


Вот черт, старею... Перепутал popup_list и list_box. Позор!!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.12.2015, 15:48
#21
granit201z

Проектировщик
 
Регистрация: 17.08.2014
Камышин
Сообщений: 118


Цитата:
granit201z, глянь тут еще http://web2.iadfw.net/terrycad/Tutor...m#MyMultiLists
там есть такие строки:

(set_tile "Title" " My Multi Lists")
(set_tile_list "List1" List1@ Value1$);*Included
(set_tile_list "List2" List2@ Value2$);*Included

у меня лисп вылетает и пишет:

Цитата:
Команда: MYMULTILISTS

MyMultiLists; ошибка: no function definition: SET_TILE_LIST
то есть насколько я понимаю (set_tile) он глотает, а на (set_tile_list) давится. А что это за функции такие? Насколько я понимаю это какие-то пользовательские функции? или нет?

----- добавлено через ~25 мин. -----
хотя нет не пользовательские. в учебнике Полищука нашел описание функции set_tile. А вот с функцией set_tile_list по прежнему неясно что за функция и почему на ней lisp выдает ошибку
granit201z вне форума  
 
Непрочитано 21.12.2015, 19:10
#22
Сергей812


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


Вы на dwg.ru - где все разжевывают и в ротик кладут - совсем разучились информацию искать) Если это неопределенная функция, то забиваем в поисковик "(defun set_tile_list" - чтобы получить описание функции, а не ссылку на нее в коде
Сергей812 вне форума  
 
Автор темы   Непрочитано 21.12.2015, 19:21
#23
granit201z

Проектировщик
 
Регистрация: 17.08.2014
Камышин
Сообщений: 118


все разобрался. Это действительно пользовательская функция.

На стороне LISP код будет выглядеть следующим образом


Код:
[Выделить все]
 ;----------------------------------------------------------------------------------------------------------
; c:MyMultiLists - Dialog for list_boxes with single and multi select examples
; Syntax: MyMultiLists
;----------------------------------------------------------------------------------------------------------
(defun c:MyMultiLists (/ Dcl_Id% List1@ List2@ Return# Value1$ Value2$)

;-------------------------------------------------------------------------------
; set_tile_list - Sets a dialog popup_list or list_box tile to a list
; Arguments: 3
;   KeyName$ = Key name of tile
;   ListName@ = The list to set in tile
;   Selected = An item in the ListNames@ or a list of items selected
; Syntax: (set_tile_list "TileName" '("A" "B" "C") "B")
;         (set_tile_list "TileName" '("A" "B" "C") '("A" "C"))
; Returns: Sets Selected items in dialog popup_list or list_box tiles.
;-------------------------------------------------------------------------------
(defun set_tile_list (KeyName$ ListName@ Selected / Item)
  (start_list KeyName$ 3)
  (mapcar 'add_list ListName@)
  (end_list)
  (foreach Item (if (listp Selected) Selected (list Selected))
   (if (member Item ListName@)
     (set_tile KeyName$ (itoa (- (length ListName@) (length (member Item ListName@)))))
   );if
  );foreach
);defun set_tile_list
;-------------------------------------------------------------------------------

;-------------------------------------------------------------------------------
; set_multilist_value - Sets SentVar$ to list of the items selected in SentList$
; Arguments: 2
;   SentList$ = String of the list variable name
;   SentVar$ = String of the variable name
; Syntax: (set_multilist_value "ListName" "Variable")
;-------------------------------------------------------------------------------
(defun set_multilist_value (SentList$ SentVar$ / SubList@)
  (setq SubList@ (eval (read SentList$)))
  (set (read SentVar$) (list (nth (atoi $value) SubList@)))
  (setq $value (substr $value (+ (strlen (itoa (atoi $value))) 2)))
  (while (/= $value "")
    (set (read SentVar$) (append (eval (read SentVar$))
      (list (nth (atoi $value) SubList@)))
    );set
    (setq $value (substr $value (+ (strlen (itoa (atoi $value))) 2)))
  );while
);defun set_multilist_value
;-------------------------------------------------------------------------------

;-------------------------------------------------------------------------------
; set_list_value - Sets SentVar$ to the item selected in SentList$
; Arguments: 2
;   SentList$ = String of the list variable name
;   SentVar$ = String of the variable name
; Syntax: (set_list_value "ListName" "Variable")
;-------------------------------------------------------------------------------
(defun set_list_value (SentList$ SentVar$ / SaveVar$ SubList@)
  (setq SubList@ (eval (read SentList$)))
  (setq SaveVar$ (eval (read SentVar$)))
  (set (read SentVar$) (nth (atoi $value) SubList@))
  (if (= (eval (read SentVar$)) "")
    (progn
      (set (read SentVar$) SaveVar$)
      (set_tile_list $key SubList@ SaveVar$)
    );progn
  );if
  (princ)
);defun set_list_value
;-------------------------------------------------------------------------------

  (princ "\nMyMultiLists")(princ)

  ; Set Default Variables

  (if (not *MyMultiLists@);Unique global variable name to store dialog info
    (setq *MyMultiLists@ (list nil "" ""))
  );if

  (setq Value1$ (nth 1 *MyMultiLists@)
        Value2$ (nth 2 *MyMultiLists@)
        List1@ (list "Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
        List2@ (list "January" "February" "March" "April" "May" "June" "July" "August" 
                     "September" "October" "November" "December")
  );setq


  ; Load Dialog

  (setq Dcl_Id% (load_dialog "D:/For_AutoCAD/My_LISP/Эксперименты с прогой/СИНХРОНИЗАЦИЯ/ДЕКАБРЬ/MLL.dcl"))
  (new_dialog "MyMultiLists" Dcl_Id%)


  ; Set Dialog Initial Settings

  (set_tile "Title" " My Multi Lists")
  (set_tile_list "List1" List1@ Value1$);*Included
  (set_tile_list "List2" List2@ Value2$);*Included


  ; Dialog Actions

  (action_tile "List1" "(set_list_value \"List1@\" \"Value1$\")");*Included
  (action_tile "List2" "(set_multilist_value \"List2@\" \"Value2$\")");*Included
  (setq Return# (start_dialog))


  ; Unload Dialog

  (unload_dialog Dcl_Id%)
  (setq *MyMultiLists@ (list nil Value1$ Value2$))

  (princ *MyMultiLists@)
);defun c:MyMultiLists

а на стороне DCL


Код:
[Выделить все]
//---------------------------------------------------------------------------------------------------------
// MyMultiLists
//---------------------------------------------------------------------------------------------------------
MyMultiLists : dialog {
  key = "Title";
  label = "";
  : boxed_column {
    label = "Select an Item";
    : list_box {
      key = "List1";//Value1$ from lsp file
      height = 6.27;
      fixed_height = true;
      width = 32.92;
      fixed_width = true;
    }
    spacer;
  }
  : boxed_column {
    label = "Multi Select Items";
    : list_box {
      multiple_select = true;
      key = "List2";//Value2$ from lsp file
      height = 6.27;
      fixed_height = true;
      width = 32.92;
      fixed_width = true;
    }
    spacer;
  }
  spacer;
  ok_only;
}//MyMultiLists

Протестировал. Работает как мне и хотелось. Дальше можно ковыряться уже в этом коде, затачивая под свои задачи. Всем большое спасибо за оказанную помощь
granit201z вне форума  
 
Непрочитано 22.12.2015, 08:38
#24
VVA

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


Тема 2013 года. Как создать свой выпадающий список? Там есть готовая функция. Строит диалог динамически.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Запрос у пользователя списком

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос имени редактировавшего при закрытии dwg файла Raznouh AutoCAD 16 02.11.2015 05:02
Не работают модули под правами ограниченного пользователя ich-frau Программирование 6 28.09.2012 10:13
Запрос об изученности геологических условий земельного участка janita Основания и фундаменты 8 08.08.2010 22:06
Пропал запрос на сохранение чертежа Nikolay 2 AutoCAD 25 07.03.2009 21:19
Сообщение об ошибке... или анимация для пользователя. KAI Программирование 13 17.03.2008 11:58