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

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

DCL урок на примере.

Ответ
Поиск в этой теме
Непрочитано 02.11.2011, 09:39 #1
DCL урок на примере.
Pavel_GP
 
Инженер-гидрограф
 
г.г. Ленинград
Регистрация: 15.09.2011
Сообщений: 170

Здравствуйте.
прошу Вас дать урок по созданию DCL и запуску его
Пример:
Код:
[Выделить все]
 (defun c:test()
  (setvar "cmdecho" 0)
  (setvar "blipmode" 0)
  (vl-cmdf "_.osnap" "_none")
  (setq X (getreal "\nВведите значение X: "))
  (setq Y (getreal "\nВведите значение Y: "))
  (setq ......)
  (setq ......)
  (setq ......)
  (defun dtr (a)    ;функция
    .....
    .....
    )
   (setq ......)
   (setq ......)
  (setq a (getreal "\nВведите значение a: "))
  (setq b (getreal "\nВведите значение b: "))
  (setq ....)
  (setq ....)
  (setq c (getreal "\nВведите значение с: "))
  (setq d (getreal "\nВведите значение d: "))
  (setq ....)
  (setq ....)
  (setq f (getreal "\nВведите значение f: "))
  (setq e (getreal "\nВведите значение e: "))
  (setq ....)
  (setq ....)
  ;различные вычисления
  ....
  ....
  ....
  );kонец lisp


Что знаю сам:
DCL
Код:
[Выделить все]
 test: dialog{label="тест";
:edit_box{label="Введите значение X:";}
:edit_box{label="Введите значение Y:";}
:edit_box{label="Введите значение a:";}
:edit_box{label="Введите значение b:";}
:edit_box{label="Введите значение c:";}
:edit_box{label="Введите значение d:";}
:edit_box{label="Введите значение e:";}
:edit_box{label="Введите значение f:";}
ok_button;
}
как дальше пока нет, вот и у Вас прошу урока.
Как запрос в лиспе разместить?
Что необходимо еще ввести в DCL?
Как потом сам DCL запустить? Так же как создаешь кнопку для Lisp ^C^C_?

спс

Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 180
Размер:	37.8 Кб
ID:	68840  


Последний раз редактировалось Pavel_GP, 02.11.2011 в 09:46.
Просмотров: 7421
 
Непрочитано 02.11.2011, 09:56
#2
Makswell

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


http://web2.airmail.net/terrycad/Tut.../MyDialogs.htm
Makswell вне форума  
 
Автор темы   Непрочитано 02.11.2011, 10:01
#3
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Цитата:
Сообщение от Makswell Посмотреть сообщение
спс попробую разобраться.
Pavel_GP вне форума  
 
Непрочитано 02.11.2011, 12:06
#4
Do$

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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Как потом сам DCL запустить? Так же как создаешь кнопку для Lisp ^C^C_?
Можно посмотреть внешний вид диалога в редакторе VLIDE (встроенный в AutoCAD LISP-редактор). Как - см. скрин.
Миниатюры
Нажмите на изображение для увеличения
Название: УрокDCL.jpg
Просмотров: 161
Размер:	47.6 Кб
ID:	68854  
Do$ вне форума  
 
Автор темы   Непрочитано 02.11.2011, 13:05
#5
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Допустим DCL написан, Lisp тоже.
Дальше что? как запустить? Запустить Lisp и появится окно диалога?
Pavel_GP вне форума  
 
Непрочитано 02.11.2011, 13:10
#6
Кулик Алексей aka kpblc
Moderator

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


В справке, load_dialog, start_dialog, unload_dialog.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.11.2011, 13:33
#7
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Снова к примеру, подставил для себя из примера http://web2.airmail.net/terrycad/Tut.../MyDialogs.htm

test.lsp
Код:
[Выделить все]
 (defun c:test (/ dcl.id)
  (princ "\ntest")(princ)
  ; Set Default Variables
  (if (not *test@);Unique global variable name to store dialog info
    (setq *test@ (list nil "" "" ""))
  );if
  (setq Edit1$ (nth 1 *test@)
        Edit2$ (nth 2 *test@)
        Edit3$ (nth 3 *test@)
    Edit4$ (nth 4 *test@)
  );setq
  ; Load Dialog
  (setq Dcl_Id% (load_dialog "D:\\Program Files\\Autodesk\\AutoCAD Civil 3D 2012\\Lisp\\test.dcl"))
  (new_dialog "test" Dcl_Id%)
  ; Set Dialog Initial Settings
  (set_tile "Title" "test")
  (set_tile "Text1" "Введите x:")
  (set_tile "Edit1" Edit1$)
  (set_tile "Text2" "Введите y:")
  (set_tile "Edit2" Edit2$)
  (set_tile "Text3" "Введите a:")
  (set_tile "Edit3" Edit3$)
  (set_tile "Text4" "Введите b")
  (set_tile "Edit4" Edit4$)
  ; Dialog Actions
  (action_tile "Edit1" "(setq Edit1$ $value)")
  (action_tile "Edit2" "(check_editint \"Edit2$\")");*Included
  (action_tile "Edit3" "(check_editreal \"Edit3$\")");*Included
  (action_tile "Edit4" "(check_editreal \"Edit4$\")");*Included
  (setq Return# (start_dialog))
   ; Unload Dialog
  (unload_dialog Dcl_Id%)
  (setq *test@ (list nil Edit1$ Edit2$ Edit3$ Edit4$))
  (princ)
  (setvar "cmdecho" 0)
  (setvar "blipmode" 0)
  (vl-cmdf "_.osnap" "_none")
  (setq x (getreal "\nВведите x: "))
  (setq y (getreal "\nВведите y: "))
  (setq a (getreal "\nВведите a: "))
  (setq b (getreal "\nВведите b: "))
  (setq pxy (list x y))
  (setq pab (list a b))
  (vl-cmdf "_.Zoom" pxy pab "")
  (vl-cmdf "_.Limits" pxy pab "")
  (vl-cmdf "_.LWDISPLAY" 1)
  (vl-cmdf "_.LWeight" 0.15)
  (vl-cmdf "_.rectang" pxy pab)
    )
test.dcl
Код:
[Выделить все]
 test : dialog {
  key = "Title";
  label = "test";//Title$ from lsp file
  initial_focus = "Edit1";
  spacer;
  : row {//<
    fixed_width = true;
    : column {
      width = 50;
      fixed_width = true;
      spacer;
      : text {
        key = "Text1";
        label = "Введите x:";//Text1$ from lsp file
      }
    }
    : edit_box {
      key = "Edit1";//Edit1$ from lsp file
      edit_width = 9.;
      fixed_width = true;
    }
  }//>
  : row {//<
    fixed_width = true;
    : column {
      width = 50;
      fixed_width = true;
      spacer;
      : text {
        key = "Text2";
        label = "Введите y:";//Text2$ from lsp file
      }
    }
    : edit_box {
      key = "Edit2";//Edit2$ from lsp file
      edit_width = 9.;
      fixed_width = true;
    }
  }//>
  : row {//<
    fixed_width = true;
    : column {
      width = 50;
      fixed_width = true;
      spacer;
      : text {
        key = "Text3";
        label = "Введите a:";//Text3$ from lsp file
      }
    }
    : edit_box {
      key = "Edit3";//Edit3$ from lsp file
      edit_width = 9.;
      fixed_width = true;
    }
    }//>
  : row {//<
    fixed_width = true;
    : column {
      width = 50;
      fixed_width = true;
      spacer;
      : text {
        key = "Text4";
        label = "Введите b:";//Text4$ from lsp file
      }
    }
    : edit_box {
      key = "Edit4";//Edit4$ from lsp file
      edit_width = 9.;
      fixed_width = true;
    }
    }//>
  spacer;
  ok_only;
}//test
Где-то допускаю ошибку, потому что не запускается лисп (выдает ошибку test; ошибка: неверный тип аргумента: stringp nil), => не вылезает окно диалога...
Pavel_GP вне форума  
 
Непрочитано 02.11.2011, 13:51
1 | #8
Do$

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


Список *test@: (nil "" "" "")
Код:
[Выделить все]
(setq Edit1$ (nth 1 *test@)
       Edit2$ (nth 2 *test@)
       Edit3$ (nth 3 *test@)
   Edit4$ (nth 4 *test@) );setq
Edit4$ пытается получить значение пятого элемента списка, а список только из 4-х элементов. Следовательно, Edit4$=nil, (set_tile "Edit4" Edit4$) - ошибка.
Do$ вне форума  
 
Автор темы   Непрочитано 02.11.2011, 14:20
#9
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Спс.

я удалил строку set_tile "Edit4" Edit4$, правильно?

Идем дальше. построение происходит, как обычно по лиспу через командную строку. Диалогового окна нет (DCL) хм...?

Последний раз редактировалось Pavel_GP, 02.11.2011 в 14:36.
Pavel_GP вне форума  
 
Непрочитано 02.11.2011, 15:34
#10
Do$

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


А зачем в этом коде диалог вообще? Введенные в нем данные потом нигде не используются. Диалог должен появиться, но вылетит с ошибкой, если набрать значение для Y A или B, т.к. не определена функция check_editint. Вообще, проанализируйте код еще раз, что в нем и для чего делается...
Do$ вне форума  
 
Автор темы   Непрочитано 02.11.2011, 16:09
#11
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Я предполагал, что это код будет строить прямоугольник через диалоговое окно (по данным x y a b).
Должно происходить примерно так:
команда: TEST (команда для lisp)
;появляется окно DCL
ввожу данные для построения прямоугольника (4 точки)
потом работает функция построения прямоугольника.
все.
Pavel_GP вне форума  
 
Непрочитано 02.11.2011, 16:54
#12
Do$

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


Ну тогда приведите код LISP в соответствие: уберите get- запросы, добавьте нужные присвоения переменным.
Do$ вне форума  
 
Непрочитано 02.11.2011, 17:42
#13
gomer

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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Снова к примеру
Все это трахомудие (от начала и до конца) отправьте в топку, это не пример для подражания, ибо в ЭТОМ нарушены как минимум десяток правил построения диалоговых окон... неужели стандартной справкой нельзя воспользоваться, примером из туториала?????
gomer вне форума  
 
Автор темы   Непрочитано 03.11.2011, 10:54
#14
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Создаю сам.
test.dcl
Код:
[Выделить все]
 test : dialog {label="Тест";
 :edit_box {label="X:"; key="xk";
 edit_width=12;
 edit_limit=24;}
 :edit_box {label="Y:"; key="yk";
 edit_width=12;
 edit_limit=24;}
 :edit_box {label="A:"; key="ak";
 edit_width=12;
 edit_limit=24;}
 :edit_box {label="B:"; key="bk";
 edit_width=12;
 edit_limit=24;}
:row{//label="Готово_Отмена";
      fixed_width=true; //Минимальная ширина по объектам внутри
      alignment = right;//Выровнен по правому краю
    :button{      //Левая кнопка
      key="bt_Accept";    //Имя кнопки в LISP-программе
      label="Готово";    //Надпись на кнопке
      is_default=true;    //Срабатывает, если нажат Enter
      is_cancel =false; //Срабатывает, если нажат Х в правом верхнем углу
      is_tab_stop = true;//Фокус переключается между кнопками клавишей Tab
      fixed_width = true;//Ширина кнопки - по ширине надписи
    }//конец кнопки bt_Accept
    :button{    //Правая кнопка
      key="bt_Cancel";    //Имя кнопки
      label="Отмена";  //Надпись на кнопке
      is_default=false;  //Не срабатывает, если нажат Enter
      is_cancel=true;  //Срабатывает, если нажат Х –крестик или Esc
      is_tab_stop = true;//Фокус переключается между кнопками клавишей Tab
      fixed_width = true;//Ширина кнопки - по ширине надписи.
    }//конец кнопки bt_Cancel
   }//конец Row
  }//конец диалога test
test.lsp
Код:
[Выделить все]
 (defun c:test (/ dcl.id)
 (setq dcl_id (load_dialog "D:\\Program Files\\Autodesk\\AutoCAD Civil 3D 2012\\Lisps\\test.dcl"))
(if (not (new_dialog "test" dcl_id)
    ); конец not
    (exit);если не обнаружен диалог - выход
); конец if
  (action_tile "xk" "(setq X (get_tile \"xk\"))")
  (action_tile "yk" "(setq Y (get_tile \"yk\"))")
  (action_tile "ak" "(setq A (get_tile \"ak\"))")
  (action_tile "bk" "(setq B (get_tile \"bk\"))")
  (start_dialog)        ;Показать Диалоговое окно
  (unload_dialog dcl_id)  ;Закрыть Диалоговое окно
(princ)
 (setvar "cmdecho" 0)
 (setvar "blipmode" 0)
 (vl-cmdf "_.osnap" "_none")
 (setq pxy (list X Y))
 (setq pab (list A B))
 (vl-cmdf "_.Zoom" pxy pab "")
 (vl-cmdf "_.Limits" pxy pab "")
 (vl-cmdf "_.LWDISPLAY" 1)
 (vl-cmdf "_.LWeight" 0.15)
 (vl-cmdf "_.rectang" pxy pab)
   )
Все вводится, но построений нет.
Пытаюсь разобраться, не получается =(
Подскажите где ошибка, в каком конкретно месте.
спс.

Последний раз редактировалось Pavel_GP, 03.11.2011 в 11:07.
Pavel_GP вне форума  
 
Непрочитано 03.11.2011, 11:00
#15
Кулик Алексей aka kpblc
Moderator

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


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

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


да так русский переводит - через некоторое время все нормально станет. (нужно перезапустить страницу)
Pavel_GP вне форума  
 
Непрочитано 03.11.2011, 11:10
#17
Кулик Алексей aka kpblc
Moderator

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


Замени (get_tile <...>) на $value и посмотри, что получится. Учти, что передаваться будут строки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.11.2011, 11:23
#18
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


(action_tile "xk" "(setq X $value)")
....
....

Выдает ошибку после ввода значений: Ошибка приложения: Неверный список объектов/точек.
Pavel_GP вне форума  
 
Непрочитано 03.11.2011, 11:39
#19
Кулик Алексей aka kpblc
Moderator

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


Без проверок:
Код:
[Выделить все]
 (defun c:test (/ dcl_id x y a b)
  (setq dcl_id (load_dialog "D:\\Program Files\\Autodesk\\AutoCAD Civil 3D 2012\\Lisps\\test.dcl"))
  (if (not (new_dialog "test" dcl_id)
           ) ; конец not
    (exit) ;если не обнаружен диалог - выход
    )     ; конец if
  (action_tile "xk" "(setq X $value)")
  (action_tile "yk" "(setq Y $value)")
  (action_tile "ak" "(setq A $value)")
  (action_tile "bk" "(setq B $value)")
  (start_dialog) ;Показать Диалоговое окно
  (unload_dialog dcl_id) ;Закрыть Диалоговое окно
  (princ)
  (setvar "cmdecho" 0)
  (setq pxy (list x y))
  (setq pab (list a b))
  (vl-cmdf "_.Zoom" pxy pab "")
  (vl-cmdf "_.Limits" pxy pab "")
  (vl-cmdf "_.LWDISPLAY" 1)
  (vl-cmdf "_.LWeight" 0.15)
  (vl-cmdf "_.rectang" "_none" (mapcar (function atof) (list x y)) "_none" (mapcar (function atof) (list a b)))
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.11.2011, 12:03
#20
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Спс. все строится.
Вопрос: Почему мы строим именно так, как в строке 21, при этом строки 15-18 не нужны.?
Разве построить прямоугольник по обычному пути нельзя? Используя
(setq pxy (list x y))
(setq pab (list a b))
(vl-cmdf "_.rectang" pxy pab) ?
Pavel_GP вне форума  
 
Непрочитано 03.11.2011, 12:12
#21
dimitriy_popov


 
Регистрация: 27.07.2010
Сообщений: 25
Отправить сообщение для dimitriy_popov с помощью Skype™


Попробуй использовать "OpenDCL" - бесплатно и видешь что получается, плюс много возможностей.
__________________
Конструктор КМД, Lisp
dimitriy_popov вне форума  
 
Непрочитано 03.11.2011, 12:32
1 | #22
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


в 21 строке происходит преобразование числа представленного строкой в вещественное число, если ты сделаешь тоже самое
в этой строке (setq pxy (list (atof x) (atof y))) то должно получится
еще необходимо учитывать опции команд
(vl-cmdf "_.rectang" "_none" pxy "_none" pab )

Последний раз редактировалось mamuk, 03.11.2011 в 12:51.
mamuk вне форума  
 
Автор темы   Непрочитано 03.11.2011, 13:20
#23
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


mamuk
спс. Заработало=)
Я так понимаю функцию atof (преобразует строку в вещественное число). лучше использовать при построениях
Pavel_GP вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > DCL урок на примере.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать диалоговое окно, описанное в DCL файле и вызванное Lisp программой, немодальным? E-degtyarev LISP 9 28.05.2010 09:10
LISP, DCL - вывод числа в поле. meisgreen LISP 1 03.12.2007 10:16
DCL & UserForm VBA Holon Программирование 21 05.10.2007 01:37
диалог dcl мах. 132 символа??? Александер Программирование 7 22.12.2006 13:47
Как связать toggle & radio button в DCL? igorokmaster Программирование 5 18.07.2005 11:28