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

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

Как создать свой выпадающий список?

Ответ
Поиск в этой теме
Непрочитано 18.02.2013, 17:32 #1
Как создать свой выпадающий список?
tibidcp
 
Регистрация: 21.01.2013
Сообщений: 13

Добрый день. Подскажите пожалуйста как создать(или где хоть почитать об этом можно) свой выпадающий список наподобие того, который выпадает при двойном клике на полилинию(редактирование полилинии)?
Просмотров: 7859
 
Непрочитано 18.02.2013, 17:53
#2
Кулик Алексей aka kpblc
Moderator

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


На каком языке хоть писать собираешься? Под какое ПО (или свое создаешь)?
И почему сразу в заголовке это было не указать?..
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.02.2013, 18:02
#3
tibidcp


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


Мне нужно штриховать чертеж различными цветами, каждый цвет обозначает свой площадной объект, цветов более 50, штриховка solid. Я хотел написать лисп, который сразу запускает команду нужной мне штриховки и предлагает выбрать внутреннюю точку для заливки объекта, цвета хотел выбирать как раз из выпадающего списка. Знания в лисп и в программировании вообще, очень скудные, только начал изучать.
tibidcp вне форума  
 
Непрочитано 18.02.2013, 18:08
#4
Кулик Алексей aka kpblc
Moderator

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


Еще раз повторю вопрос: на каком языке решение не получается?
Если на autolisp - то можно использовать acad_colordlg.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.02.2013, 18:10
#5
tibidcp


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Еще раз повторю вопрос: на каком языке решение не получается?
Если на autolisp - то можно использовать acad_colordlg.
да, autolisp, спасибо большое за ответ, буду разбираться.

Update: acad_colordlg понял что такое, но мне надо чтобы выдавался мой список, моих цветов с названием которое я им задам(например газон будет зеленым и в списке он будет называться "газон", а дорога черной и называться будет "дорога"), мне кажется, что с помощью такого выпадающего списка про который я писал выше это было бы очень удобно, насколько это сложно не знаю. Я пробовал сделать это с помощью инструментальной палитры, но там это не так удобно, как могло бы быть, если бы я воплотил вышесказанное...

Последний раз редактировалось tibidcp, 18.02.2013 в 18:25.
tibidcp вне форума  
 
Непрочитано 18.02.2013, 19:21
#6
gomer

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


палитры инструментов, неа? doslib может?
gomer вне форума  
 
Непрочитано 18.02.2013, 19:57
#7
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от gomer Посмотреть сообщение
палитры инструментов, неа? doslib может?
поддерживаю. палитра самое простое и эффективное решение.
Boxa вне форума  
 
Непрочитано 18.02.2013, 20:13
#8
alan303

Руководитель отдела
 
Регистрация: 18.02.2013
Житомир
Сообщений: 1


Спасибо за подсказку
alan303 вне форума  
 
Непрочитано 18.02.2013, 20:46
#9
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


tibidcp может пригодится
Код:
[Выделить все]
 
;|
*********** MYDCL **************************************************************
Запрос варианта выбора через диалоговое окно
Диалоговое окно (dcl) формируется программно
Программно же и удаляется
zagl - заголовок окна
info-list - список строковых значение

(setq zagl		"Окно выбора"
      info-list		( list "Вариант1" "Вариант2" "Вариант3" "Вариант4")
      str_illumination	"2"
)

Возвращает выбранную строку или nil, если нажата клавиша отмена
Пример
(mydcl "Пример использования" '("Вариант1" "Вариант2" "Вариант3" "Вариант4") nil)
(mydcl "Пример использования" '("Вариант1" "Вариант2" "Вариант3" "Вариант4" "Вариант5") "2")
********************************************************************************
|;

(defun mydcl (
	      zagl		; "Окно выбора"
	      info-list		; ( list "Вариант1" "Вариант2" "Вариант3" "Вариант4")
	      str_illumination	; строка номер подсветки или nil
	      /
	       fl
	       ; ret		; EXIT результат выбора
	       dcl_id
	      )
 (cond ((null zagl)(setq zagl "Окно выбора") )) ;/ cond если нет zagl
 (setq	fl  (vl-filename-mktemp "mip" nil ".dcl")
 	ret (open fl "w")
 ) ;/ serq
 (mapcar
  (function(lambda (x) (write-line x ret))) ;/ function
  (list "mip_msg : dialog { "
        (strcat "label=\"" zagl "\";")
        " :list_box {"
        "alignment=top ;"
        "width= 10 ;" ; ширина
        (if(>(length info-list) 24) ; если больше 24 эл. списка- появляется ползунок
    ;|1|;"height= 24 ;"
    ;|2|;(strcat "height= " (itoa (+ 3 (length info-list))) ";")
        ) ;/ if
        "is_tab_stop = false ;"
        "key = \"info\";}"
        "ok_cancel;}"
  ) ;/ list
 ) ;/ mapcar
 (setq ret (close ret))
 (cond
  ((and
    (setq dcl_id (load_dialog fl))
    (new_dialog "mip_msg" dcl_id)
  ) ;/ and
   (start_list "info")
   (mapcar 'add_list info-list)
   (end_list)
   (if str_illumination
;|1|;(progn 
      (set_tile "info" str_illumination) 		 ; подсвечиваем нужную строку
      (setq ret (nth (atoi str_illumination) info-list)) ; запоминаем нужныую строку
     ) ;/ progn
;|2|;(progn 
      (set_tile "info" "0")
      (setq ret (car info-list))
     ) ;/ progn
   ) ;/ if
   (action_tile "info"	 "(setq ret (nth (atoi $value) info-list))")
   (action_tile "cancel" "(progn(setq ret nil)(done_dialog 0))")
   (action_tile "accept" "(done_dialog 1)")  
   (start_dialog)
  )) ;/ cond
  (unload_dialog dcl_id)
  (vl-file-delete fl) ; после успешного удаления выдает T
  ;ret
  (princ) ; гасим T или nil
) ;/ (mydcl)

sdv79 вне форума  
 
Автор темы   Непрочитано 19.02.2013, 03:14
#10
tibidcp


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


Цитата:
Сообщение от sdv79 Посмотреть сообщение
tibidcp может пригодится
Вполне себе пригодится, я бы даже сказал то что надо Спасибо большое! Только вот в автокаде лисп не запускается , выдает ошибку "; ошибка: слишком мало аргументов". Не могу понять в чем дело...
tibidcp вне форума  
 
Непрочитано 19.02.2013, 04:28
#11
gomer

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


Цитата:
Сообщение от sdv79 Посмотреть сообщение
может пригодится
Хоть бы постеснялись такое выкладывать
gomer вне форума  
 
Непрочитано 19.02.2013, 10:28
#12
hwd

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


Цитата:
Сообщение от tibidcp Посмотреть сообщение
Вполне себе пригодится, я бы даже сказал то что надо Спасибо большое!
Как определил, что это "то что надо", если тут же пишешь:
Цитата:
Сообщение от tibidcp Посмотреть сообщение
Только вот в автокаде лисп не запускается , выдает ошибку "; ошибка: слишком мало аргументов". Не могу понять в чем дело...
? Обычно "то, что надо" - это когда ещё и работает...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 19.02.2013, 10:54
#13
tibidcp


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


Цитата:
Сообщение от hwd Посмотреть сообщение
Как определил, что это "то что надо", если тут же пишешь:
Согласен выглядит странно)) В общем я дополнил немного код из #9 и загрузил выделенный фрагмент(без объявления переменных) в автокад из vlide, всё работает именно как мне надо, но когда пытаюсь через командную строку вызвать командой, вылетает ошибка. Знаю что что-то не так делаю, но не пойму что. В autolisp начал вникать неделю назад, так что сильно не бейте. Вот код:
Код:
[Выделить все]
  
;|
*********** MYDCL **************************************************************
Запрос варианта выбора через диалоговое окно
Диалоговое окно (dcl) формируется программно
Программно же и удаляется
zagl - заголовок окна
info-list - список строковых значение

(setq zagl		"Окно выбора"
      info-list		( list "Вариант1" "Вариант2" "Вариант3" "Вариант4")
      str_illumination	"2"
)

Возвращает выбранную строку или nil, если нажата клавиша отмена
Пример
(mydcl "Пример использования" '("Вариант1" "Вариант2" "Вариант3" "Вариант4") nil)
(mydcl "Пример использования" '("Вариант1" "Вариант2" "Вариант3" "Вариант4" "Вариант5") "2")
********************************************************************************
|;

(defun c:mydcl (
	      zagl		; "Окно выбора"
	      info-list		; ( list "Вариант1" "Вариант2" "Вариант3" "Вариант4")
	      str_illumination	; строка номер подсветки или nil
	      /
	       fl
	       ret		; EXIT результат выбора
	       dcl_id
	      old_color
	      col
	      )
  (setq str_illumination "0")
  (setq info-list (list "Вариант1" "Вариант2" "Вариант3" "Вариант4" ))
 (cond ((null zagl)(setq zagl "Окно выбора") )) ;/ cond если нет zagl
 (setq	fl  (vl-filename-mktemp "mip" nil ".dcl")
 	ret (open fl "w")
 ) ;/ setq
 (mapcar
  (function(lambda (x) (write-line x ret))) ;/ function    
  (list "mip_msg : dialog { "
        (strcat "label=\"" zagl "\";")
        " :list_box {"
        "alignment=top ;"
        "width= 10 ;" ; ширина
        (if(>(length info-list) 24) ; если больше 24 эл. списка- появляется ползунок
    ;|1|;"height= 24 ;"
    ;|2|;(strcat "height= " (itoa (+ 3 (length info-list))) ";")
        ) ;/ if
        "is_tab_stop = false ;"
        "key = \"info\";}"
        "ok_cancel;}"
  ) ;/ list
 ) ;/ mapcar
 (setq ret (close ret))
 (cond
  ((and
    (setq dcl_id (load_dialog fl))
    (new_dialog "mip_msg" dcl_id)
  ) ;/ and
   (start_list "info")
   (mapcar 'add_list info-list)
   (end_list)
   (if str_illumination
;|1|;(progn 
      (set_tile "info" str_illumination) 		 ; подсвечиваем нужную строку
      (setq ret (nth (atoi str_illumination) info-list)) ; запоминаем нужныую строку
     ) ;/ progn
;|2|;(progn 
      (set_tile "info" "0")
      (setq ret (car info-list))
     ) ;/ progn
   ) ;/ if
   (action_tile "info"	 "(setq ret (nth (atoi $value) info-list))")
   (action_tile "cancel" "(progn(setq ret nil)(done_dialog 0))")
   (action_tile "accept" "(done_dialog 1)")  
   (start_dialog)
  )) ;/ cond
  (unload_dialog dcl_id)
  (vl-file-delete fl) ; после успешного удаления выдает T
 (setq col
  (cond
    ((eq ret "Вариант1") "5")
    ((eq ret "Вариант2") "6")
    ((eq ret "Вариант3") "7")
    ((eq ret "Вариант4") "8")
   );cond
  )
 (setq old_color (getvar "CECOLOR"))
 (setvar "CECOLOR" col)
 (vl-cmdf "_-hatch" "_p" "_solid" pause)
 (setvar "CECOLOR" old_color)
     
  (princ) ; гасим T или nil
) ;/ (mydcl)
tibidcp вне форума  
 
Непрочитано 19.02.2013, 17:23
1 | #14
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от tibidcp Посмотреть сообщение
как создать(или где хоть почитать об этом можно) свой выпадающий список наподобие того, который выпадает при двойном клике на полилинию(редактирование полилинии)?
Цитата:
Сообщение от tibidcp Посмотреть сообщение
мне надо чтобы выдавался мой список, моих цветов с названием которое я им задам(например газон будет зеленым и в списке он будет называться "газон", а дорога черной и называться будет "дорога"
Я ошибаюсь, или автор имел в виду нечто вроде такого:
Код:
[Выделить все]
(defun C:test ( / kword)
    (initget 1 "Газон Дорога") 
    (setq kword (getkword "\nВыберите элемент ландшафта: [Газон/Дорога]"))
    (cond 
        ((= kword "Газон")
         (command "_-HATCH" "_P" "SOLID" pause "" "_CHANGE" "_L" "" "_P" "_COLOR" 3 "")
        )
        ((= kword "Дорога")
         (command "_-HATCH" "_P" "SOLID" pause "" "_CHANGE" "_L" "" "_P" "_COLOR" 255 "")
        )
    )
)
Ну и на всякий случай Как использовать лисп, опубликованный на форуме
skkkk вне форума  
 
Автор темы   Непрочитано 19.02.2013, 23:36
#15
tibidcp


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Я ошибаюсь, или автор имел в виду нечто вроде такого:
Не ошибаетесь, именно это и имел ввиду, спасибо. Видимо плохо объяснил)
tibidcp вне форума  
 
Автор темы   Непрочитано 22.02.2013, 21:42
#16
tibidcp


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


Подскажите пожалуйста как сделать так чтобы можно было указывать внутренние точки для заливки до бесконечности? В коде ниже можно указать только одну точку, я знаю только один способ, это многократное повторение pause. Может есть другой способ?
Код:
[Выделить все]
  (setq old_color (getvar "CECOLOR"))
 (setvar "CECOLOR" col)
 (vl-cmdf "_-hatch" "_p" "_solid" pause "")
 (setvar "CECOLOR" old_color)

Последний раз редактировалось tibidcp, 22.02.2013 в 21:50.
tibidcp вне форума  
 
Непрочитано 23.02.2013, 15:56
#17
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


tibidcp, можно сделать так:
Код:
[Выделить все]
(setq old_color (getvar "CECOLOR"))
(setvar "CECOLOR" col)
(while t
(command "_-hatch" "_p" "_solid" pause "")
)
(setvar "CECOLOR" old_color)
команда while зацикливает последующее выражение, но почему-то с vl-cmdf зависает, а вот с command работает нормально. В данном случае будет выход по Escape, и чтоб избежать появления в командной строке сообщения об ошибке ("; ошибка: Функция прервана"), в лисп надо добавить описание функции *error*, например. Попользуй поиск по словам Обработчик ошибок, *error*. Разобраться там несложно.

Последний раз редактировалось skkkk, 23.02.2013 в 16:19.
skkkk вне форума  
 
Непрочитано 23.02.2013, 16:19
#18
Кулик Алексей aka kpblc
Moderator

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


Как один из многих вариантов:
(while (/= (getvar "cmdactive") 0) (command pause))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.02.2013, 18:46
#19
tibidcp


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


Я извиняюсь, забыл уточнить, что штриховка должна быть объединенная, с while мы получаем отдельные штриховки, то есть в пределах одной команды нужно чтобы работал цикл, а не команда повторялась многократно. Ну еще есть вариант после цикла объединить штриховки, но пока мне страшно даже думать об этом
tibidcp вне форума  
 
Непрочитано 23.02.2013, 20:34
#20
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Тогда нужно просто убрать двойные кавычки в конце:
Код:
[Выделить все]
(command "_-hatch" "_p" "_solid" pause)
Подтверждение выбора - правой кнопкой или по Enter/Пробел - в зависимости от настроек правой кнопки мыши. Двойные кавычки в функции command как раз и означают Enter.
skkkk вне форума  
 
Автор темы   Непрочитано 24.02.2013, 00:12
#21
tibidcp


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


Код:
[Выделить все]
 (setq old_color (getvar "CECOLOR"))
 (setvar "CECOLOR" col)
 (command "_-hatch" "_p" "_solid" pause)
 (setvar "CECOLOR" old_color)
Ну в данном случае, как я понял, после первого действия пользователя лисп завершает работу, а комманда _-hatch нет, и в итоге цвет штриховки не меняется. Ну в принципе мне нужно ограниченное число штриховок(в пределах 10), так что если написать в коде pause 10 раз, то всё работает, просто думал есть способ по-красивее, например на случай, если бы повторений было бы куда больше
tibidcp вне форума  
 
Непрочитано 24.02.2013, 00:43
#22
Кулик Алексей aka kpblc
Moderator

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


tibidcp, найди лисп от VVA (рисование подобных, кажется) - там используется очень интересный подход.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2013, 01:58
#23
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от tibidcp Посмотреть сообщение
и в итоге цвет штриховки не меняется
чтоб менялся, можно после отрисовки штриховки добавить команду _change с опцией "_L" (last)
Код:
[Выделить все]
(command "_-hatch" "_p" "_solid" pause)
(command "_change" "_L" "" "_COLOR" .......)
ну и так далее...
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как создать свой выпадающий список?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в окне адаптации выпадающий список отображается некорректно o_krasa AutoCAD 2 12.03.2012 16:10
Как с помощью LISP создать выноску и заполнить ее данными YuryK LISP 5 18.01.2012 14:16
Как создать свой тип примитива? mental Программирование 8 30.10.2007 23:34
Хочу создать свой раскрывающийся список в меню ACAD maxw AutoCAD 10 19.12.2005 06:42
Помогите создать свой тип линии......... red AutoCAD 8 02.06.2004 17:14