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

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

Форма для ввода данных в LISP

Ответ
Поиск в этой теме
Непрочитано 05.05.2009, 12:59 #1
Форма для ввода данных в LISP
HooDRooK
 
Регистрация: 11.03.2009
Сообщений: 33

Вопрос. Необходимо начертить, например, прямоугольник со сторонами a и b. Длины сторон необходимо вводить с формы, проверяя одновременно, ну например, чтобы введённые величины не были больше максимальной.
Вот я не знаю есть ли в ЛИСПе такая возможность?...Было бы в VB вопросов бы не было, но надо чтобы чертился прямоугольник именно с помощью ЛИСПа...
Может есть возможность обмена данными ЛИСПа с VB? Например форма и проверка делается на VB, затем проверенные данные передаются в ЛИСП?...
Помогите.

С Уважением!
Просмотров: 5535
 
Непрочитано 05.05.2009, 13:04
#2
Кулик Алексей aka kpblc
Moderator

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


1. Если разговор именно про VB, то можно попытаться сделать свой СОМ-сервер, который зарегистрировать в системе и обращаться к нему из-под лиспа.
2. Если разговор про VBA, то на форуме была тема про обмен данными между VBA и LISP.
3. Я бы задумывался о dcl-окне, где на каждый text_box прописывается свой action_tile.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.05.2009, 13:10
#3
HooDRooK


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


Алексей я с ЛИСПом только в последнее время более менее начал общаться (так мельком только в универе изучал), так что если можно, опиши по подробнее про dcl окна.
HooDRooK вне форума  
 
Непрочитано 05.05.2009, 13:26
#4
-mavlin-


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


http://aco.ifmo.ru/~nadinet/html/lectures/dcl_tile.html
-mavlin- вне форума  
 
Автор темы   Непрочитано 05.05.2009, 13:30
#5
HooDRooK


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


А киньте кто нить пример как это можно сделать?...самый простой, чтоб разобраться спокойно...
HooDRooK вне форума  
 
Непрочитано 05.05.2009, 13:49
#6
-mavlin-


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


Вот содержимое dcl файла 000.dcl

Код:
[Выделить все]
name: dialog{label="Название диалога";
:text{label="какойто текст";key="a";alignment=left;}
:edit_box{label="значение";key="b";value="начальное значение";}
ok_only;}
А вот содержимое файла lsp
Код:
[Выделить все]
(defun c:dialog ( / dn zn)
  (setq dn(LOAD_DIALOG "000.dcl"))
  (new_dialog "name" dn "") 
  (setq zn (GET_TILE "b"))
  (ACTION_TILE "b" "(setq zn $value)")
  (START_DIALOG) 
  (UNLOAD_DIALOG dn)
  (princ zn))

Последний раз редактировалось Кулик Алексей aka kpblc, 15.05.2009 в 10:36.
-mavlin- вне форума  
 
Непрочитано 05.05.2009, 14:08
#7
Кулик Алексей aka kpblc
Moderator

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


Еще пример:
файл диалога (в коде прописан как c:\tmp.dcl)
Код:
[Выделить все]
dlg :dialog{label="Название диалога";
	:edit_box{label="Длина х, мм:";key="len_x";}
	:edit_box{label="Длина у, мм:";key="len_y";}
	ok_cancel;
}
и сам лисп
Код:
[Выделить все]
(defun test (/ fun_checklen dcl_file dcl_id dcl_res base_point tmp len_x len_y)

  (defun fun_checklen (key value)
    (if (and (setq value (atof value))
             (> value 0.)
             ) ;_ end of and
      (if (= key "len_x")
        (setq len_x value)
        (setq len_y value)
        ) ;_ end of if
      (progn
        (alert "Нельзя вводить не числа и отрицательные значения!")
        (setq value 0.)
        (if (= key "len_x")
          (setq len_x 0.)
          (setq len_y 0.)
          ) ;_ end of if
        ) ;_ end of progn
      ) ;_ end of if
    (set_tile key (rtos value))
    ) ;_ end of defun

  (if (and (setq dcl_file (findfile "c:\\tmp.dcl"))
           (setq dcl_id (load_dialog dcl_file))
           ) ;_ end of and
    (progn
      (new_dialog "dlg" dcl_id)
      (set_tile "len_x" "0.")
      (set_tile "len_y" "0.")
      (action_tile "len_x" "(fun_checklen $key $value)")
      (action_tile "len_y" "(fun_checklen $key $value)")
      (action_tile "accept" "(done_dialog 1)")
      (action_tile "cancel" "(done_dialog 0)")
      (setq dcl_res (start_dialog))
      (if (= dcl_res 1)
        (progn
          (if (setq base_point (getpoint "\nУкажите базовую точку вставки <Отмена> : "))
            (entmakex
              (list
                '(0 . "LWPOLYLINE")
                '(100 . "AcDbEntity")
                '(100 . "AcDbPolyline")
                '(90 . 4)
                '(70 . 1)
                '(43 . 0.0)
                '(38 . 0.0)
                '(39 . 0.0)
                (cons 10 (setq tmp (list (- (car base_point) (/ len_x 2.)) (- (cadr base_point) (/ len_y 2.)))))
                (cons 10 (setq tmp (polar tmp 0. len_x)))
                (cons 10 (setq tmp (polar tmp (/ pi 2.) len_y)))
                (cons 10 (polar tmp pi len_x))
                ) ;_ end of list
              ) ;_ end of entmakex
            ) ;_ end of if
          ) ;_ end of progn
        ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.05.2009, 14:45
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Здесь еще посмотри
Dcl_Tiles.lsp и Dcl_Tiles.dcl
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 15.05.2009, 08:20
#9
HooDRooK


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


Блин чего то ничего не понимаю...
Создаю 000.dcl загружаю приложение...пишу (c:dialog)...
в ответ nilnil...Как это понимать?
HooDRooK вне форума  
 
Непрочитано 15.05.2009, 09:46
#10
Кулик Алексей aka kpblc
Moderator

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


Теперь я уже ничего не понимаю. Какой 000.dcl? Какой у него код? Какой лисп запускается?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.05.2009, 10:11
#11
HooDRooK


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


Это код из поста -mavlin-...После моего по поводу какого нить примера...
HooDRooK вне форума  
 
Непрочитано 15.05.2009, 10:35
#12
Кулик Алексей aka kpblc
Moderator

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


(findfile "000.dcl") что возвращает?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.05.2009, 11:16
#13
HooDRooK


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


nil возвращает
HooDRooK вне форума  
 
Непрочитано 15.05.2009, 11:23
#14
Кулик Алексей aka kpblc
Moderator

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


Значит у тебя сам файл диалога не находится. Помещай его в любой каталог поддержки AutoCAD'a
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.05.2009, 11:35
#15
HooDRooK


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


Вроде заработало...
Так вроде всё понятно, но вот вопрос, а как например если мне надо второе окошко сделать указывать его положение на форме?...координаты как-то прописывать?

name: dialog{label="Название диалога";
:text{label="какойто текст";key="a";alignment=left;}
:edit_box{label="значение";key="b";value="начально е значение";}
ok_only;}

Последний раз редактировалось HooDRooK, 15.05.2009 в 11:42.
HooDRooK вне форума  
 
Непрочитано 15.05.2009, 11:55
#16
Кулик Алексей aka kpblc
Moderator

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


Переведи вопрос. Ничего не понял.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.05.2009, 12:00
#17
HooDRooK


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


короче где прописывается сколько окошек на открывающейся форме и как они распологаются? в коде диалога или ЛИСПа? и каким образом...например мне надо два окошка друг над другом... и чего то смотря на оба кода я как то не смог найти этого...
HooDRooK вне форума  
 
Непрочитано 15.05.2009, 12:12
#18
Кулик Алексей aka kpblc
Moderator

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


Два окошка - это два окошка. А два элемента диалога - это два элемента диалога. Хоть какой-нибудь скрин сделай (формы хоть на VBA, это сейчас неважно), чтоб понять чего хотишь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.05.2009, 12:14
#19
HooDRooK


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


Да согласен что я дурак..)))...два элемента диалога мне надо..))))
HooDRooK вне форума  
 
Непрочитано 15.05.2009, 21:59
#20
Кулик Алексей aka kpblc
Moderator

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


Так это напрямую в dcl-файле прописывается...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.05.2009, 06:26
#21
HooDRooK


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


А каким образом это прописывается?!...я приводил код dcl файла...и блин так и не понял где и как там это делается...
HooDRooK вне форума  
 
Непрочитано 18.05.2009, 10:01
#22
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


HooDRooK, давай так:

1. Открой Excel
2. В Excel'е Меню Сервис->Макрос->Редактор Visual Basic
3. В редакторе Visual Basic Меню Insert->User Form
4. Сконструируй форму диалога (для изменния свойств элементов формы используй окно свойств: Меню View->Properties Window)
5. Запусти это дело (при выделенной форме нажми F5)
6. Далее с помощью кнопки PrintScreen содержимое экрана в буфер.
7. Вставь картинку из буфера например в Paint (mspaint.exe), сохрани её в файл и выложи на форуме
8. ...
9. Здесь тебе выложат код формы на dcl, аналогичный твоей картинке.
Makswell вне форума  
 
Автор темы   Непрочитано 22.05.2009, 10:57
#23
HooDRooK


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


Короче мне надо получить типа вот такую вот форму...
т.е. я ввожу данные...потом нажимаю кнопку "ввести данные"...потом идёт проверка правильности ввода данных, например: а>0, b>1, с>2...
Если всё нормально ты выполняется далее лисп, а если не удовлетворяет проверке, то надо написать "ошибка" и вернуться к вводу данных...
Вот как это реализовать с помощью dcl фалйа в лиспе?...
Миниатюры
Нажмите на изображение для увеличения
Название: Форма.jpg
Просмотров: 91
Размер:	52.1 Кб
ID:	20857  
HooDRooK вне форума  
 
Непрочитано 23.05.2009, 23:18
#24
Кулик Алексей aka kpblc
Moderator

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


Ну, код dcl-файла по идее достаточно прост (если действия на каждый элемент прописывать не внутри dcl):
Код:
[Выделить все]
dlg: dialog{label="Ввод данных";
	:edit_box{key="a_value";label="a=";}
	:edit_box{key="b_value";label="b=";}
	:edit_box{key="c_value";label="c=";}
	ok_cancel;
}
А пример action я давал выше...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.05.2009, 08:28
#25
HooDRooK


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


вот не могу понять что за такое...
вот код LISPа, данный воодятся соответственно через dcl файл

(defun c:dialog2 ( / dn zn L1 L6 D1 D6 D7 N )
(setq dn(LOAD_DIALOG "0002.dcl"))
(new_dialog "dlg2" dn "")
(setq L1 (GET_TILE "L1_value"))
(ACTION_TILE "L1_value" "(setq L1 $value)")
(setq L6 (GET_TILE "L6_value"))
(ACTION_TILE "L6_value" "(setq L6 $value)")
(setq D1 (GET_TILE "D1_value"))
(ACTION_TILE "D1_value" "(setq D1 $value)")
(setq D6 (GET_TILE "D6_value"))
(ACTION_TILE "D6_value" "(setq D6 $value)")
(setq D7 (GET_TILE "D7_value"))
(ACTION_TILE "D7_value" "(setq D7 $value)")
(setq N (GET_TILE "N_value"))
(ACTION_TILE "N_value" "(setq N $value)")

(START_DIALOG)
(UNLOAD_DIALOG dn)
(princ L1)
(princ L6)
(princ D1)
(princ D6)
(princ D7)
(princ N)

(while (< L1 0) (setq L1 (getreal "\nÎøèáêà! L1<0, Ââåäèòå L1=>0")))
(if (= L1 0) (setq L6 0) (setq D1 0) (setq D6 0) (setq D7 0) (setq N 0))

(princ L1)
(princ L6)
(princ D1)
(princ D6)
(princ D7)
(princ N)

)

Так вот когда нажимаешь ок на форме, она закрывается, первые princ пишутся и всё хорошо, но почему то проверка не делается дальше!...т.е. если ввести даже L1=-1 то никакого эффекта...
HooDRooK вне форума  
 
Непрочитано 27.05.2009, 10:28
#26
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


(if (= L1 0)
(progn
(setq L6 0)
(setq D1 0)
(setq D6 0)
(setq D7 0)
(setq N 0)
)
)
E-degtyarev вне форума  
 
Автор темы   Непрочитано 27.05.2009, 10:39
#27
HooDRooK


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


Вот попробовал вставить так, но выдаёт "неверный тип аргумента для сравнения "-1" 0"...это я так понимаю что при введении данных у меня получаются строковые величины что-ли?...если так то как правильно их вводить, чтобы это были именно цифры а не текст?...
HooDRooK вне форума  
 
Непрочитано 27.05.2009, 11:07
#28
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Да, это строки. Их нужно преобразовать в числа с помощью функций atoi или atof.
E-degtyarev вне форума  
 
Автор темы   Непрочитано 27.05.2009, 11:41
#29
HooDRooK


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


А Если можно напишите синтаксис данной функции...ну вот например
(setq D1 (GET_TILE "D1_value"))
(ACTION_TILE "D1_value" "(setq D1 $value)")
и теперь каким образом D1 преобразовать из строки в число?
HooDRooK вне форума  
 
Непрочитано 27.05.2009, 11:54
#30
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


(setq DD1 (atoi D1))
или
(setq DD1 (atof D1))

Это легко посмотреть в Help-e или спровочнике комманд.
E-degtyarev вне форума  
 
Автор темы   Непрочитано 27.05.2009, 12:56
#31
HooDRooK


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


пересохраняю данные с помощью atoi

(defun c:dialog2 ( / dn zn L1 L6 D1 D6 D7 N )
(setq dn(LOAD_DIALOG "0002.dcl"))
(new_dialog "dlg2" dn "")
(setq LL1 (GET_TILE "L1_value"))
(ACTION_TILE "L1_value" "(setq L1 $value)")
(setq LL6 (GET_TILE "L6_value"))
(ACTION_TILE "L6_value" "(setq L6 $value)")
(setq DD1 (GET_TILE "D1_value"))
(ACTION_TILE "D1_value" "(setq D1 $value)")
(setq DD6 (GET_TILE "D6_value"))
(ACTION_TILE "D6_value" "(setq D6 $value)")
(setq DD7 (GET_TILE "D7_value"))
(ACTION_TILE "D7_value" "(setq D7 $value)")
(setq NN (GET_TILE "N_value"))
(ACTION_TILE "N_value" "(setq N $value)")

(START_DIALOG)
(UNLOAD_DIALOG dn)
(setq L1 (atoi LL1))
(setq L6 (atoi LL6))
(setq D1 (atoi DD1))
(setq D6 (atoi DD6))
(setq D7 (atoi DD7))
(setq N (atoi NN))
(princ L1)
(princ L6)
(princ D1)
(princ D6)
(princ D7)
(princ N)

princ пишет все нули...?!
HooDRooK вне форума  
 
Непрочитано 27.05.2009, 13:10
#32
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Ты преобразуешь в число несуществующие строки LL1,DD1 и т.д.
Нужно примерно так:
Код:
[Выделить все]
(setq LL1 (atoi L1));здесь L1-строка, LL1-число
(setq LL6 (atoi L6));здесь L6-строка, LL6-число
(setq DD1 (atoi D1))
(setq DD6 (atoi D6))
(setq DD7 (atoi D7))
(setq NN (atoi N))
(princ LL1)
(princ LL6)
(princ DD1)
(princ DD6)
(princ DD7)
(princ NN)
Можно и так (setq D6 (atoi D6)), но при дальнейшем развитии твоей программы могут возникнуть проблемы-строка это или число, так как с одним именем будут существовать разные типы переменных.

Последний раз редактировалось E-degtyarev, 27.05.2009 в 13:20.
E-degtyarev вне форума  
 
Автор темы   Непрочитано 27.05.2009, 13:33
#33
HooDRooK


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


Заработало вроде..Спасибо...)))...счас буду дальше мучать, если ещё чё вылезит буду молить о помощи..)))...
HooDRooK вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Форма для ввода данных в LISP



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закладные лифтовых приямков винсент75 Поиск литературы, чертежей, моделей и прочих материалов 13 11.08.2009 10:16
Копирование данных для спецификаций из выносок СПДС в таблицу из мтекстов Red Nova Программирование 177 08.12.2008 11:35
LISP для AutoCAD-2009: проблемы со скобками Лентяй LISP 14 16.11.2008 02:40
Нужен LISP для заливки отверстий ilka_t AutoCAD 20 24.03.2004 16:06