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

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

написание диалога на лиспе

Ответ
Поиск в этой теме
Непрочитано 05.07.2005, 14:38 #1
написание диалога на лиспе
Александер
 
Регистрация: 15.06.2005
Сообщений: 184

начал разбираться как написать диалог на лиспе, возникла проблема:
Popup_box - пишет элемент с таким именем не определен, может есть у кого примеры написания диалогов с использованием этого элемента?
еще вопрос модно ли вставить графический объект (например слайд автокада) прямо в диалоговое окно, примерно так:
чтобы слева получилась колонка кнопок с надписями, а справа отображался графический объект, в зависимости от нажатой кнопки в левой кононке.
и последнее использование кнопок ок_canсel можно что-то одно написать, например только ок, а к cancel привязать не выход из диалога, а возврат в предидущий диалог?
заранее спасибо
Просмотров: 6461
 
Непрочитано 05.07.2005, 20:50
#2
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Действительно среди основных полей данный элемент и не может быть. Выбирай либо list_box либо popup_list
fixo вне форума  
 
Непрочитано 05.07.2005, 23:49
#3
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


А это для разминки:

dcl_settings : default_dcl_settings { audit_level = 0; }
dialog1 : dialog {
label = "ЗАГОЛОВОК ДИАЛОГА #1";
: row {
: column {
: text_part {value = " СЛАЙД РИСУНКА";
alignment = children_alignment; }
: image { key = "dwg_image";
color = graphics_foreground;
width = 36; height = 12;}
}
: column {
: radio_button {
label = "Первый";
key = "rad1";
value = "1";}
: radio_button {
label = "Второй";
key = "rad2";
value = "0";}
: radio_button {
label = "Третий";
key = "rad3";
value = "0";}
: radio_button {
label = "Десятый";
key = "rad10";
value = "0";}
}}
spacer;
: row {
: button {label = "Временный выход";
key = "for";
action = "(Функция вызова второго окна диалога)";}

//или action = "(done_dialog 10)";}
//тогда в функции вызова диалога "action_tile"
//этой кнопки должен иметь вид:
//(action_tile "for" "(done_dialog 10)")
ok_cancel;
}}
dialog2 : dialog {
label = "ЗАГОЛОВОК ДИАЛОГА #2";
spacer_1;
: column {
:list_box {
key = "alist";
label = "СПИСОК ЧЕГО-ТО ПЕРВОГО";
width = 30;
multiple_select=false;
}
opup_list {
key = "blist";
label = "СПИСОК ЧЕГО-ТО ДРУГОГО";
width = 30;
}
}

spacer;
: row {
: button {label = "Возврат обратно";
key = "back";
action = "(Функция вызова первого окна диалога)";}
//или action = "(done_dialog 11)";}
//тогда в функции вызова диалога "action_tile"
//этой кнопки должен иметь вид:
//(action_tile "back" "(done_dialog 11)")
ok_cancel;
}}

Успехов
fixo вне форума  
 
Непрочитано 06.07.2005, 00:25
#4
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


А вообще мне лично больше нравится чтобы диалоги
сами создавались из лиспа (это на любителя)

(defun make-dial ()
;;;(setq fname (vl-filename-mktemp "lesson.dcl"))
(setq fname (strcat (getvar "dwgprefix") "lesson2.dcl"))
(setq fn (open fname "w"))
(write-line "dcl_settings : default_dcl_settings { audit_level = 0; }" fn)
(write-line "dialog1 : dialog {" fn)
(write-line (strcat "label = " "\"" "ЗАГОЛОВОК ДИАЛОГА #1" "\"" ";") fn)
(write-line ": row {" fn)
(write-line ": column {" fn)
(write-line (strcat ": text_part {value = " "\"" " СЛАЙД РИСУНКА" "\"" ";") fn)
(write-line "alignment = children_alignment; }" fn)
(write-line (strcat ": image { key = " "\"" "dwg_image" "\"" ";") fn)
(write-line "color = graphics_foreground;" fn)
(write-line "width = 36; height = 12;}" fn)
(write-line "}" fn)

(write-line ": column {" fn)
(write-line ": radio_button {" fn)
(write-line (strcat "label = " "\"" "Первый" "\"" ";") fn)
(write-line (strcat "key = " "\"" "rad1" "\"" ";") fn)
(write-line "value = \"1\";}" fn)
(write-line ": radio_button {" fn)
(write-line (strcat "label = " "\"" "Второй" "\"" ";") fn)
(write-line (strcat "key = " "\"" "rad2" "\"" ";") fn)
(write-line "value = \"0\";}" fn)
(write-line ": radio_button {" fn)
(write-line (strcat "label = " "\"" "Третий" "\"" ";") fn)
(write-line (strcat "key = " "\"" "rad3" "\"" ";") fn)
(write-line "value = \"0\";}" fn)
(write-line ": radio_button {" fn)
(write-line (strcat "label = " "\"" "Десятый" "\"" ";") fn)
(write-line (strcat "key = " "\"" "rad10" "\"" ";") fn)
(write-line "value = \"0\";}" fn)
(write-line "}}" fn)
;;И так далее
(write-line "spacer;" fn)
(write-line ": column {" fn)
(write-line (strcat ": button {label = " "\"" "Временный выход" "\"" ";") fn)
(write-line (strcat "key = " "\"" "for" "\"" ";") fn)
(write-line (strcat "action = " "\"" "(done_dialog 10)" "\"" ";}") fn)
(write-line "ok_cancel; " fn)
(write-line "}}" fn)

;;

(write-line "dialog2 : dialog {" fn)
(write-line (strcat "label = " "\"" "ЗАГОЛОВОК ДИАЛОГА #2" "\"" ";") fn)
(write-line ": column {" fn)
(write-line ": list_box {" fn)
(write-line (strcat "label = " "\"" "СПИСОК #1" "\"" ";") fn)
(write-line (strcat "key = " "\"" "list1" "\"" ";") fn)
(write-line "width = 30; height = 12;}" fn)
(write-line (strcat ": text_part {value = " "\"" "СПИСОК #2" "\"" ";}") fn)
(write-line ": popup_list {" fn)
(write-line (strcat "key = " "\"" "list2" "\"" ";") fn)
(write-line "width = 30;}" fn)
(write-line "}" fn)
(write-line "spacer;" fn)
(write-line ": column {" fn)
(write-line (strcat ": button {label = " "\"" "Возврат обратно" "\"" ";") fn)
(write-line (strcat "key = " "\"" "back" "\"" ";") fn)
(write-line (strcat "action = " "\"" "(done_dialog 11)" "\"" ";}") fn)
(write-line "ok_cancel; " fn)
(write-line "}}" fn)
(close fn)
)
;Вызов: (make-dial)
fixo вне форума  
 
Непрочитано 06.07.2005, 00:56
#5
ZZZ

электрик
 
Регистрация: 11.03.2005
Киев
Сообщений: 157


>Fatty (05 Июл 2005 22:25)
Идея не плоха. Есть возможность с лиспа менять некоторые параметры окон до запуска.
Если Вам так удобно, то чтобы не писать сто раз
Код:
[Выделить все]
(write-line "..." fn)
оформте dcl файл как список (разбитый на строки) и заганяйте его функцией mapcar. Смотрится посолиднее.
ZZZ вне форума  
 
Непрочитано 06.07.2005, 01:08
#6
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Я собственно так и делаю, а человек как я понял только начинает
работать с DCL...
fixo вне форума  
 
Непрочитано 06.07.2005, 04:04
#7
Startrek

AutoCAD/AutoLISP
 
Регистрация: 27.08.2003
Seattle/USA
Сообщений: 1,133


Александер

http://www.cadgineering.ca/Downloads.html
Скачай PROTOBOX очень простая и удбная програмка, попробуй
демо, если понравится у меня есть полная версия.
Startrek вне форума  
 
Автор темы   Непрочитано 06.07.2005, 08:50
#8
Александер


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


<Fatty спасибо, то что нужно, немного переделать и подойдет.
Да, правильно заметил, я недавно dcl осваиваю

<Startrek если не трудно скинь программку на:
[email protected]
посмотрел -программка хороша

спасибо всем.
Александер вне форума  
 
Автор темы   Непрочитано 06.07.2005, 12:01
#9
Александер


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


<Fatty
: image { key = "dwg_image";
color = graphics_foreground;
width = 36; height = 12;}
}
можно здесь немного рассказать поподробнее?
где указывать граф. объект.
например если я хочу чтобы в окне отображался слайд, например slide1, находящийся в библиотеке слайдов slides?
как это сделать?
Александер вне форума  
 
Непрочитано 06.07.2005, 15:18
#10
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Очень сложно понять чтo нужно вслепую,
но попробуй проиграть такой кусок, естественно,
что аргументы нужны свои, единственно, что здесь
обязательно, это одинаковые названия для рисунка и
соответствующего слайда, т. е.:
bolt.dwg и bolt.sld, и те и другие лежат в одной
папке
Не забудь прописать свой путь к директории блоков
Мне лично эта рутина не очень нравится, но нет
мотивации переделывать...

;* ВСТАВКА БЛОКОВ ИЗ БИБЛИОТЕКИ * ВЫЗОВ: NBB *

; 4/13/05 8:20 AM ;


//////////// ////////////
//////////// /////////////
///// ///// /////
///// ///// /////
///// //////////////
///// /////////////
///// ///// ////
///// ///// ////
//////// ///// ////// ////
/////// ///// ///// ////




;;;;=========================================================
;;;; | my-block-lib-dcl.lsp | Copyright (c) 2005 Fatty |
;;;;=========================================================

(defun make-lib-dial ()
(setq fname (vl-filename-mktemp "libris.dcl"))
;;; (setq fname (strcat (getvar "dwgprefix") "librys.dcl"))
(setq fn (open fname "w"))
(write-line "libres : dialog {" fn)
(write-line (strcat "label = " "\"" "СПИСОК БИБЛИОТЕК" "\"" ";") fn)
(write-line ": row {" fn)
(write-line ": column {" fn)
(write-line ": list_box {" fn)
(write-line (strcat "label = " "\"" "Выбрать файл" "\"" ";") fn)
(write-line (strcat "key = " "\"" "dwg_list" "\"" ";") fn)
(write-line "width = 20; height = 8;}" fn)
(write-line "}" fn)
(write-line ": column {" fn)
(write-line ": list_box { label = \"Выбрать блок\";" fn)
(write-line (strcat "key = " "\"" "slides" "\"" ";") fn)
(write-line "width = 16; height = 8;}" fn)
(write-line "}" fn)
(write-line "}" fn)
(write-line ": column {" fn)
(write-line (strcat ": text_part {value = " "\"" " Слайд блока" "\"" ";") fn)
(write-line "alignment = children_alignment; }" fn)
(write-line (strcat ": image { key = " "\"" "dwg_image" "\"" ";") fn)
(write-line "color = graphics_foreground;" fn)
(write-line "width = 36; height = 12;}" fn)
(write-line "}" fn)
(write-line "spacer;" fn)
(write-line "ok_cancel; " fn)
(write-line "}" fn)
(close fn)
)
;;;(make-lib-dial);ok

; browser from Tony Tanzillo (yada man) ;

(defun my-browse-folder (msg path / sh fld folderobject result)
(vl-load-com)
(setq sh (vla-getInterfaceObject (vlax-get-acad-object)
"Shell.Application"))
(setq fld (vlax-invoke-method sh 'BrowseForFolder
0
msg
512
path
)
)
(vlax-release-object sh)
(if fld
(progn
(setq folderobject (vlax-get-property fld 'Self))
(setq result (vlax-get-property FolderObject 'Path))
(vlax-release-object fld)
(vlax-release-object folderobject )
result
)
)
)
; ;

(defun my-block-files (path / lst)
(setq lst
(vl-directory-files path "*.dwg" 1))
lst
)
; ;

(defun set_list (name lst)
(start_list name)
(mapcar 'add_list lst)
(end_list))
; ;

(defun set_val (name val)
(set_tile name val))

; ;

(defun set_image (val)
(start_image "dwg_image")
(fill_image 0 0
(dimx_tile "dwg_image")
(dimy_tile "dwg_image") -2)
(slide_image 0 0
(dimx_tile "dwg_image")
(dimy_tile "dwg_image") val)
(end_image)
)
; ;

(defun add_blocks (lib_name path / )
(setq pat (vl-string-right-trim ".dwg" lib_name)
sld_lst (acad_strlsort
(vl-remove-if (function not)
(mapcar (function (lambda (x)(if
(wcmatch (substr x 1 (strlen pat)) pat) x)))
(vl-directory-files path "*.sld" 1))))))

; ;

(defun run-lib-dial ()
(setq blk_lst nil)
(setq path (my-browse-folder
"ВЫБРАТЬ ДИРЕКТОРИЮ БИБЛИОТЕКИ"
"D:\\AUTOLISP\\SAPR\\MyTips\\"))
(setq blk_lst (my-block-files path))
(setq dcl_ex (load_dialog fname))
(new_dialog "libres" dcl_ex)
(set_list "dwg_list" blk_lst)

(action_tile "dwg_list" (strcat
"(progn "
"(setq lib_name (nth (atoi $value) blk_lst))"
"(setq sld_lst (add_blocks lib_name path))"
"(set_list \"slides\" sld_lst))"))
(action_tile "slides" (strcat
"(progn "
"(setq sld (nth (atoi $value) sld_lst))"
"(set_image (strcat path \"\\\\\"
(vl-string-subst \"\" \".sld\" sld))))" ))

(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")

(setq knock (start_dialog))
(unload_dialog dcl_ex)
(done_dialog)
(vl-file-delete fname)
)

; ;
(prompt "\nВвести в командной строке: NBB для запуска программы\n")
; ;
(defun c:nbb ()

(vl-load-com)
(gc)
(make-lib-dial)
(run-lib-dial)

(if (= knock 1)
(progn
(command "_.insert" (strcat path "\\" lib_name))
(command)

(setq blk (vl-string-subst "" ".sld" sld))
(if (tblsearch "block" blk)
(vl-cmdf "_.insert" blk
(getpoint "\nPick Point:") 1 1 0)
(progn
(vla-eval (vlax-get-acad-object)
(strcat "MsgBox \"" (strcat "Блок: " blk " не найден ") "\"" ", "
"vbcritical" ", " "\"" "ПРЕДУПРЕЖДЕНИЕ:" "\""))
(princ)))))
(princ))
; ;

Если что звони
fixo вне форума  
 
Автор темы   Непрочитано 07.07.2005, 08:43
#11
Александер


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


На лиспе диалог писать лучше, спасибо за идею.

а программка работает хорошо, только почему-то блоки не вставляет...
Александер вне форума  
 
Непрочитано 07.07.2005, 09:22
#12
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Я проверил все работает, все вставляет, просто я неправильно объяснил
сам метод создания библиотеки. У меня организовано так:

Создана папка BlockLib
В этой папке находятся чертежи Fittings.dwg, Pipes.dwg и т.д
А вот уже для каждого блока чертежа создаются одноименные слайды
Fittings1.sld, Fittings2.sld, Fittings3.sld и т.д.
Естественно, что это только для обкатки, а рабочую библиотеку
нужно будет создавать по другим правилам это уже как тебе будет
удобно, просто тогда изменятся функции поиска пути, выделения
имени папки и т.д.
Звони если что
fixo вне форума  
 
Автор темы   Непрочитано 07.07.2005, 11:13
#13
Александер


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


пишет ошибку что блок ссылается сам на себя.

должны быть одинаковы имя файла dwg, слайда sld, и имя блока?
т.е. получается один файл dwg - один блок.
Александер вне форума  
 
Непрочитано 07.07.2005, 11:30
#14
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Хорошо, я сделаю тебе образец библиотеки и вышлю, а ты посмотришь как работает, только блоки создам безотносительно - только для примера
Правильно говорят:
"Нормальная программа должна работать только на компьютере автора, в его присутствии и под его наблюдением..."
fixo вне форума  
 
Автор темы   Непрочитано 07.07.2005, 11:38
#15
Александер


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


вот мой адрес:
[email protected]
Александер вне форума  
 
Автор темы   Непрочитано 07.07.2005, 13:29
#16
Александер


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


теперь понятно почему у меня работало криво
отсюда и вопросик *.cdc как его создавать и где?
Александер вне форума  
 
Непрочитано 07.07.2005, 14:21
#17
Кулик Алексей aka kpblc
Moderator

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


*.cdc - файл создается DesignCenter'ом када в момент обращения к какому-то каталогу. Чего в нем такого нужного - хрен его знает...
по поводу "блок ссылается сам на себя". Если выполняется вставка "внешнего" блока через _insert, то тут такая история:
Например, есть файл "ФайлБлока1.dwg", внутри него какие-то там примитивы. После _insert и указания в качестве имени блока этого файла в конечном файле будет новый блок ФайлБлока1.
А теперь внимание, бонус! Если внутри ФайлБлока1.dwg есть какие-то блоки, то они вставляются как составляющие ФайлБлока1 (т.е. вложенные блоки). И если, не дай боже, внутри ФайлБлока1.dwg есть блок ФайлБлока1, то что получится в конечном файле? Правильно, блок ФайлБлока1, входящий в состав ФайлБлока1. Т.е. блок ссылается сам на себя
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 07.07.2005, 15:48
#18
Александер


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


<kpblc
Спасибо гуру за подробное объяснение, теперь разобрался, а файл cdc действильно на хрен не нужен
и без него все работает прекрасно, все дело было в именах файлов и блоков.
Александер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > написание диалога на лиспе

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

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