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

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

Гашение элементов выпадающего списка

Ответ
Поиск в этой теме
Непрочитано 04.02.2011, 11:06 #1
Гашение элементов выпадающего списка
Nitrogenium
 
инженер
 
Санкт-Петербург
Регистрация: 02.03.2010
Сообщений: 69

Суть проблемы в следующем: в диалоговом окне есть выпадающий список и кнопка. Требуется, чтобы при нажатии кнопки выбранный элемент списка гасился (становился недоступным) или исключался из списка. Погасить весь список получается, а вот отдельный элемент нет =(
Просмотров: 3486
 
Непрочитано 04.02.2011, 11:10
#2
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


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

Поясню...
Варианты:
1. Lisp (DCL)
2. Delphi (тут я не в курсе)
3. DotNet:
3.1 WinForms
3.2 WPF
3.3 Gtk#
4.И т.д.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 04.02.2011 в 11:20. Причина: Добавил пояснение для автора, т.к. он похоже не понял замечания...
hwd вне форума  
 
Автор темы   Непрочитано 04.02.2011, 11:23
#3
Nitrogenium

инженер
 
Регистрация: 02.03.2010
Санкт-Петербург
Сообщений: 69
<phrase 1=


Вот такое окно
Код:
[Выделить все]
dial:dialog
{label="Настройка названий";
    :column
    {label="";
        :popup_list{label="Номер цвета"; key="pl_numcol";}
        :edit_box{label="Название"; key="ebx_name";}
        :edit_box{label="Сокращение"; key="ebx_abbr";}
        :button{label="Сохранить"; key="bt_save";}
    }
    spacer_1;
    :column
    {label="Образец цвета"; height=4; width=5;
        :image{key="im_obr"; width=3; height=2;}
    }
    ok_cancel;
}
Вот лисп
Код:
[Выделить все]
(vl-load-com)
(setq actdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq obj1 (vla-get-ModelSpace actdoc))
(defun C:dialog (/ allpoly lennab j obj ncolor zsp)
    ;||;
    (setq allpoly (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 "Layer001"))));набор полилиний (всех)
    (setq lennab (sslength allpoly))
    (setq j -1 spis nil)
    (repeat lennab
        (setq j (1+ j))
        (setq obj (vlax-ename->vla-object (ssname allpoly j)))
        (setq spis (cons (vla-get-Color obj) spis))
    )
    (setq ncolor (length (vl-sort spis '<)));общее число цветов
    (setq spiscolor (vl-sort spis '<));список цветов сортированый
    (setq k -1 spisstrcolor nil)
    (repeat ncolor
        (setq k (1+ k))
        (setq str (itoa (nth k spiscolor)))
        (setq spisstrcolor (cons str spisstrcolor))
    )
    (setq spisstrcolor (reverse spisstrcolor))
    ;||;
    (if (< (setq dcl_id (load_dialog "C:\\LSP\\dial.dcl")) 0)
        (exit)
    )
    (if (not (new_dialog "dial" dcl_id))
        (exit)
    )
    (start_list "pl_numcol")
    (mapcar 'add_list spisstrcolor)
    (end_list)
    ;||;
    (start_image "im_obr")
    (fill_image 0 0 200 100 (atoi (nth 0 spisstrcolor)))
    (end_image)
    (action_tile "pl_numcol"
        (strcat
        "(start_image \"im_obr\")"
        "(setq zsp (fill_image 0 0 200 100 (atoi (nth (atoi $value) spisstrcolor))))"
        "(end_image)"
        )
    )
    (setq zsp (atoi (nth 0 spisstrcolor)))
    (setq x_sp1 nil x_sp2 nil x_sp0 nil)
    (action_tile "bt_save"
        (strcat
        "(setq x_sp0 (cons zsp x_sp0))"
        "(setq x_sp1 (cons (get_tile \"ebx_name\") x_sp1))"
        "(setq x_sp2 (cons (get_tile \"ebx_abbr\") x_sp2))"
        "(setq x_all (list x_sp0 x_sp1 x_sp2))"
    ;    "(vl-remove \"161\" spisstrcolor)"
        )
    )
    ;||;
    (start_dialog)
    (unload_dialog dcl_id)
    (princ)
)
DCL имеется ввиду
Nitrogenium вне форума  
 
Непрочитано 04.02.2011, 11:33
#4
Кулик Алексей aka kpblc
Moderator

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


Отдельный элемент в DCL не "погасить". Можно только перестроить список полностью.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.02.2011, 11:46
#5
Nitrogenium

инженер
 
Регистрация: 02.03.2010
Санкт-Петербург
Сообщений: 69
<phrase 1=


Может быть все-таки есть какое-то решение: например чтобы при нажатии кнопки список пересоздался только без выбранного ранее элемента
Nitrogenium вне форума  
 
Непрочитано 04.02.2011, 16:33
1 | #6
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Вариант с удалением.

Код:
[Выделить все]
(vl-load-com)

(defun c:dialog (/ allpoly lennab j spis obj ncolor spiscolor k spisstrcolor str dcl_id zsp x_sp1 x_sp2 x_sp0 x_all)
  (setq allpoly (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 "Layer001"))));набор полилиний (всех)
  (setq lennab (sslength allpoly))
  (setq j -1 spis nil)
  (repeat lennab
    (setq j (1+ j))
    (setq obj (vlax-ename->vla-object (ssname allpoly j)))
    (setq spis (cons (vla-get-Color obj) spis))
  )
  (setq spiscolor (vl-sort spis '<) ncolor (length spiscolor))
  (setq k -1 spisstrcolor nil)
  (repeat ncolor
    (setq k (1+ k))
    (setq str (itoa (nth k spiscolor)))
    (setq spisstrcolor (cons str spisstrcolor))
  )
  (setq spisstrcolor (reverse spisstrcolor))
  ;||;
  (if (< (setq dcl_id (load_dialog "C:\\LSP\\dial.dcl")) 0) (exit))
  (if (not (new_dialog "dial" dcl_id "(dial-callback)")) (progn (unload_dialog dcl_id) (exit)))
  ; Инициализация полей:
  (start_list "pl_numcol") 
  (mapcar 'add_list spisstrcolor)
  (end_list)
  (setq zsp (atoi (nth 0 spisstrcolor)))
  (start_image "im_obr")
  (fill_image 0 0 (dimx_tile "im_obr") (dimy_tile "im_obr") (atoi (nth 0 spisstrcolor)))
  (end_image)
  
  ; Передача управления диалоговому окну:
  (start_dialog)
  (unload_dialog dcl_id)
  x_all; возвращаемое значение.
)

; Обработчик событий диалогового окна.
; Выполняется в контексте функции c:dialog. 
; Все локальные переменные функции c:dialog являются доступными внутри dial-callback, 
; если они не экранируются одноименными локальными переменными внутри самой dial-callback (в данном случае таких нет).
(defun dial-callback ( / )
  (cond
    ((= $key "pl_numcol"); событие выбора пунка выпадающего списка:
     (start_image "im_obr")
     (setq zsp (fill_image 0 0 (dimx_tile "im_obr") (dimy_tile "im_obr") (atoi (nth (atoi $value) spisstrcolor))))
     (end_image)
    )
    ((= $key "bt_save"); событие щелчка по кнопке "сохранить"
     (setq x_sp0 (cons zsp x_sp0))
     (setq x_sp1 (cons (get_tile "ebx_name") x_sp1))
     (setq x_sp2 (cons (get_tile "ebx_abbr") x_sp2))
     (setq x_all (list x_sp0 x_sp1 x_sp2))
     (setq spisstrcolor (vl-remove (itoa zsp) spisstrcolor))
     (start_list "pl_numcol") 
     (mapcar 'add_list spisstrcolor)
     (end_list)
     (start_image "im_obr")
     (setq zsp (fill_image 0 0 (dimx_tile "im_obr") (dimy_tile "im_obr") (atoi (nth 0 spisstrcolor))))
     (end_image)
    )
    ((= $key "accept") (done_dialog)); OK
    ((= $key "cancel") (setq x_all nil) (done_dialog)); Cancel
  )
);
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 05.02.2011 в 20:20.
Pastor вне форума  
 
Автор темы   Непрочитано 04.02.2011, 22:33
#7
Nitrogenium

инженер
 
Регистрация: 02.03.2010
Санкт-Петербург
Сообщений: 69
<phrase 1=


спасибо, это работает!
Правда обнаружил странную особенность - не удаляется первый либо второй элемент списка. то есть вот например такой список (2 4 5 7 8 13 34 161) и 4 или 2 не удаляется(в зав-ти от того, какой сначала выбрать)

Последний раз редактировалось Nitrogenium, 04.02.2011 в 22:43.
Nitrogenium вне форума  
 
Непрочитано 04.02.2011, 22:58
#8
Кулик Алексей aka kpblc
Moderator

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


Достаточно заменить
Код:
[Выделить все]
 (start_list "pl_numcol") 
на
Код:
[Выделить все]
 (start_list "pl_numcol" 3)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.02.2011, 23:05
#9
Nitrogenium

инженер
 
Регистрация: 02.03.2010
Санкт-Петербург
Сообщений: 69
<phrase 1=


Заменил - не помогло =((
все равно не пропадает второй элемент
Nitrogenium вне форума  
 
Непрочитано 04.02.2011, 23:09
#10
Кулик Алексей aka kpblc
Moderator

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


А на момент вызова start_list что хранится в добавляемом списке? Может, проблема именно в нем?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.02.2011, 23:14
#11
Nitrogenium

инженер
 
Регистрация: 02.03.2010
Санкт-Петербург
Сообщений: 69
<phrase 1=


ну сначала формируется список spisstrcolor (список цветов по возрастанию)
еще заметил, что список x_all неверно формируется
..а вот если именно выбирать элемент, тогда работает

Последний раз редактировалось Nitrogenium, 05.02.2011 в 00:14.
Nitrogenium вне форума  
 
Непрочитано 05.02.2011, 10:32
#12
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
все равно не пропадает второй элемент
Прикрепи файл, с которым код неправильно работает, посмотрим.
Цитата:
еще заметил, что список x_all неверно формируется
Список формируеся так, как представлено в посте №3. Если надо группировать по другому, скажи как.
Цитата:
..а вот если именно выбирать элемент, тогда работает
Мне не понятно, о чем идет речь. Требуется пояснение.

p.s.
"Но есть у нас еще предположение..."(с)

Список цветов формируется заново всякий раз при вызове c:dialog.
Если требуется, чтобы в предлагаемый список не попадали цвета, сохраненные в предыдущих вызовах c:dialog, то требуется внести некоторые несложные изменения:
1. переменную x_all сделать глобальной.
2. после формирования переменной spiscolor исключить из неё цвета, присутствующие в x_all.
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 05.02.2011 в 10:46.
Pastor вне форума  
 
Автор темы   Непрочитано 05.02.2011, 12:20
#13
Nitrogenium

инженер
 
Регистрация: 02.03.2010
Санкт-Петербург
Сообщений: 69
<phrase 1=


Вот вчера немного доделал свой код:
Код:
[Выделить все]
;;;(load "C:\\LSP\\Dialog")
(vl-load-com)
(setq actdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq obj1 (vla-get-ModelSpace actdoc))
(defun C:dialog (/ allpoly lennab j obj ncolor zsp)
	;||;
	(setq allpoly (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 "Layer001"))));набор полилиний (всех)
	(setq lennab (sslength allpoly))
	(setq j -1 spis nil)
	(repeat lennab
		(setq j (1+ j))
		(setq obj (vlax-ename->vla-object (ssname allpoly j)))
		(setq spis (cons (vla-get-Color obj) spis))
	)
	(setq ncolor (length (vl-sort spis '<)));общее число цветов
	(setq spiscolor (vl-sort spis '<));список цветов сортированый
	(setq k -1 spisstrcolor nil)
	(repeat ncolor
		(setq k (1+ k))
		(setq str (itoa (nth k spiscolor)))
		(setq spisstrcolor (cons str spisstrcolor))
	)
	(setq spisstrcolor (reverse spisstrcolor))
	;||;
	(if (< (setq dcl_id (load_dialog "C:\\LSP\\dial.dcl")) 0)
		(exit)
	)
	(if (not (new_dialog "dial" dcl_id))
		(exit)
	)
	(start_list "pl_numcol")
	(mapcar 'add_list spisstrcolor)
	(end_list)
	;||;
	(start_image "im_obr")
	(fill_image 0 0 (dimx_tile "im_obr") (dimy_tile "im_obr") (atoi (nth 0 spisstrcolor)))
	(end_image)
	(action_tile "pl_numcol"
		(strcat
		"(start_image \"im_obr\")"
		"(setq zsp (fill_image 0 0 (dimx_tile \"im_obr\") (dimy_tile \"im_obr\") (atoi (nth (atoi $value) spisstrcolor))))"
		"(end_image)"
		)
	)
	(setq zsp (atoi (nth 0 spisstrcolor)))
	(setq x_sp1 nil x_sp2 nil x_sp0 nil)
	(action_tile "bt_save"
		(strcat
		"(setq x_sp0 (cons zsp x_sp0))"
		"(setq x_sp1 (cons (get_tile \"ebx_name\") x_sp1))"
		"(setq x_sp2 (cons (get_tile \"ebx_abbr\") x_sp2))"
		"(setq x_all (list x_sp0 x_sp1 x_sp2))"
		"(if (/= (length spisstrcolor) 1) (progn"
		"(setq spisstrcolor (vl-remove (itoa zsp) spisstrcolor))"
		"(start_list \"pl_numcol\")" 
		"(mapcar 'add_list spisstrcolor)"
		"(end_list)"
		"(start_image \"im_obr\")"
		"(fill_image 0 0 (dimx_tile \"im_obr\") (dimy_tile \"im_obr\") (atoi (nth 0 spisstrcolor)))"
		"(end_image)"
		") (mode_tile \"pl_numcol\" 1))"
		)
	)
	;||;
	(start_dialog)
	(unload_dialog dcl_id)
	(princ)
	x_all
	;|
немного черновой правда
тут одна проблема
чтобы все работало, приходится именно выбирать из выпадающего списка цветов, например:
вот такой список цветов сформировался (2 3 5 8 23 67)
первым идет 2 - она уже видна в диал. окне в списке. нажимаем на список, выбираем скажем 5, нажимаем сохранить, 5 пропадает, первым опять показывается 2. если сейчас нажать на кнопку, то 2 не пропадет, а если нажать на список и выбрать ее (двойку) - все нормально. как мог объяснил=)
Файл: просто несколько полилиний разных цветов в слое Layer001.
В итоге всего этого должен получиться список ((тут номера цветов) (тут названия) (тут сокращения)), причем номера цветов не должны повторяться, чего я и пытаюсь добиться. то есть чтобы пользователь не смог сформировать неправильный список.
Nitrogenium вне форума  
 
Непрочитано 05.02.2011, 20:24
1 | #14
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


См. пост №6, в функции обработки событий исправлено (добавлено) красным.
Цитата:
должен получиться список ((тут номера цветов) (тут названия) (тут сокращения))
Именно так он и формируется в посте №6.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Автор темы   Непрочитано 05.02.2011, 20:31
#15
Nitrogenium

инженер
 
Регистрация: 02.03.2010
Санкт-Петербург
Сообщений: 69
<phrase 1=


Спасибо! как я сам не додумался...
Nitrogenium вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Гашение элементов выпадающего списка

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Документация Проектировщику на Torrents DEM Разное 262 24.02.2024 17:19
Порекомендуйте литературу для повышения квалификации(грунты, геотехника) acid Поиск литературы, чертежей, моделей и прочих материалов 6 13.05.2015 22:14
Исключение элементов одного списка из другого по маске Кулик Алексей aka kpblc Программирование 3 18.09.2006 17:31
Как выделить часть элементов из списка? kolobrod Программирование 6 09.09.2006 15:51
Номера позиций повторяющихся элементов списка CB Программирование 24 02.03.2006 17:11