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

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

Ламерские вопросы по LISP и DCL

Закрытая тема
Поиск в этой теме
Непрочитано 06.09.2007, 15:10 #1
Ламерские вопросы по LISP и DCL
TheBuTeK
 
преподавание
 
Москваград
Регистрация: 28.09.2005
Сообщений: 131

Пытаюсь в срочном порядке освоить LISP, да что-то не так просто идет освоение...
Имеется dcl-файл и программа, которая должна по введеннным в этом окне параметрам построить полилинию и кольцо. Но, увы, она этого не делает. Хочется разобраться, почему.

LISP

Код:
[Выделить все]
(defun privod1 ()
  ;/ wi he a b c)
; Вопрос 1.
;Надо ли в описании функции описывать какие-то переменные? И если да, то какие?
Код:
[Выделить все]
 (princ "ПРИВОД!!!")	
    (setq dv wi)
    (setq lv he)
    (setq pv (getpoint "\n Укажите точку вставки блока : "))
    (setq p1 (list (car pv) (- (cadr pv) (/ dv 2))))
    (setq p2 (list (car pv) (+ (cadr pv) (/ dv 2))))
    (setq p3 (list (+ (car pv) lv) (+ (cadr pv) (/ dv 2))))
    (setq p4 (list (+ (car pv) lv) (- (cadr pv) (/ dv 2))))
    (command "_PLINE" p1 p2 p3 p4 "_CL")
    (command "_PLINE" p2 p1 "_CL")
    (setq p24 (list (/ (+ (car p2) (car p4)) 2) (/ (+ (cadr p2) (cadr p4)) 2)))
    (command "_DONUT" "0" "2" pv)
); defun


(defun C:klapan ( / slt dcl_id wi he v1 v2 v3)
; Вопрос 2.
; Для чего перед именем функции пишется C: и в каких случаях это надо писать, а в каких - не надо.
Код:
[Выделить все]
(setvar "CMDECHO" 0)
       (setq slt (getvar "CLAYER"))
       (setq dcl_id (load_dialog "block001"))
       (if (not (new_dialog "block001" dcl_id)) (exit))
       (action_tile "w" "(setq wi (read $value))")
       (action_tile "h" "(setq he (read $value))")   
       (action_tile "v1" "(setq a (read $value))")
       (action_tile "v2" "(setq b (read $value))")
       (action_tile "v3" "(setq c (read $value))")
       (action_tile "accept" "(setq done 1)(done_dialog)")
       (action_tile "cancel" "(setq done 2)(done_dialog)")
       (start_dialog)
       (unload_dialog dcl_id)
       (if (and w h (= done 1)) (privod1) )
       (if (= done 2) (princ "Отмена!"))
       (setvar "CLAYER" slt)
    (princ)
)
; Вопрос 3. Результат.
; Функция выводит на экран окно, запрашивающее данные (DCL-файл прилагается),
; а потом даже не заходит в функцию privod1 и не запрашивает точку. Где ошибка?

DCL (вроде бы правильный)

Код:
[Выделить все]
block001:dialog {
         label = "Параметры блока:";
   :column {
        :row {
             :image {
                color = black;
                acpect_ratio = 0.0;
                width = 18;
                height =4;
                key = "slide";
                    } //закрыли картинку
             :boxed_row {
                label = "Размеры в мм";
                    :column {
                         fixed_width = true;
             : edit_box {
                          edit_width = 4;
                          edit_limit = 6;
                          label = "Ширина = ";
                          key = "w";
                         } //закрыли поле ввода
             : edit_box {
                          edit_width = 4;
                          edit_limit = 6;
                          label = "Высота = ";
                          key = "h";
                         }  //закрыли поле ввода            
                             } //закрыли столбец
             } //закрыли строку окна
           } //закрыли основной столбец
          :row {
             :boxed_row {
             label = "Отобразить";
                    :row {
                        : toggle {
                        label = "Вид 1";
                        key = "v1";
                        }  //закрыли галочку
                        : toggle {
                        label = "Вид 2";
                        key = "v2";
                        } //закрыли галочку
                        : toggle {
                        label = "Вид 3";
                        key = "v3";
                        } //закрыли галочку
                    }//закрыли строку
             }//закрыли ряд галочек
       } //закрыли строку окна

   }//закрыли основной столбец
ok_cancel;
}//закрыли столбец
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
Просмотров: 4311
 
Непрочитано 06.09.2007, 16:08
#2
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Держи
Код:
[Выделить все]
(defun privod1 (dv lv / pv p1 p2 p3 p4 p24)
  (princ "ПРИВОД!!!")
  (initget 1)
  (setq pv (getpoint "\n Укажите точку вставки блока : "))
  (setq p1 (list (car pv) (- (cadr pv) (/ dv 2))))
  (setq p2 (list (car pv) (+ (cadr pv) (/ dv 2))))
  (setq p3 (list (+ (car pv) lv) (+ (cadr pv) (/ dv 2))))
  (setq p4 (list (+ (car pv) lv) (- (cadr pv) (/ dv 2))))
  (command "_PLINE" "_none" p1 "_none" p2 "_none" p3 "_none" p4	"_C")
  (command "_PLINE" "_none" p2 "_none" p1 "_C")
  (setq	p24 (list (/ (+ (car p2) (car p4)) 2)
		  (/ (+ (cadr p2) (cadr p4)) 2)
	    )
  )
  (command "_DONUT" "0" "2" "_none" pv "")
)						  ; defun 

(defun C:klapan	(/ slt dcl_id wi he a b c)
  (setvar "CMDECHO" 0)
  (setq slt (getvar "CLAYER"))
  (setq dcl_id (load_dialog "d:\\test.dcl"))
  (if (and (not (minusp dcl_id))
	   (new_dialog "block001" dcl_id)
      )
    (progn
      ;; *WI* и *HE* глобальные переменные для сохранения значений
      (if (null *WI*)
	(setq *WI* 0)
      )
      (if (null *HE*)
	(setq *HE* 0)
      )
      (setq a  0
	    b  0
	    c  0
	    wi *WI*
	    he *HE*
      )
      (set_tile "w" (rtos wi 2 2))
      (set_tile "h" (rtos he 2 2))
      (action_tile "w" "(setq wi (atof $value))")
      (action_tile "h" "(setq he (atof $value))")
      (action_tile "v1" "(setq a (atof $value))")
      (action_tile "v2" "(setq b (atof $value))")
      (action_tile "v3" "(setq c (atof $value))")
      (action_tile "accept" "(done_dialog 1)")
      (action_tile "cancel" "(done_dialog 2)")
      (setq done (start_dialog))
      (setq *WI* wi
	    *HE* he
      )
						  ;(unload_dialog dcl_id) 
      (if (and (> wi 0) (> he 0) (= done 1))
	(privod1 wi he)
      )
      (if (= done 2)
	(princ "Отмена!")
      )
    )
    (alert
      "Не найден файл диалога d:\\test.dcl\nили описание диалога"
    )
  )
  (setvar "CLAYER" slt)
  (princ)
)
Измени путь в файлу dcl.
Теперь ответ
1. Надо. Все переменные, которые используются в программе за исключением глобальных. У них разное время жизни: локальные живут в пределах функции, глобальные в пределах сеанса работы.
то, что указано после / локальные переменные. см разницу между *WI* и wi
2. Читай http://dwg.ru/art/8 раздел "Команда или функция"
3. Не путай ключ поля в dcl (key) и значение поля
Код:
[Выделить все]
(action_tile "w" "(setq wi (read $value))")
Полю с ключом W присваиваем действие (setq wi (read $value)), т.е. значение поля сохраняем в переменную wi
(Попутно, надо использовать не read а atof)
А в проверке
Код:
[Выделить все]
(if (and w h (= done 1)) (privod1) )
проверяешь переменные w и h. Как говорится, почусвтвуйте разницу
VVA вне форума  
 
Автор темы   Непрочитано 10.09.2007, 09:51
#3
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Гениально!
Премного благодарен!
Теперь появилась идея эти объекты сразу рисовать в блок. И собирать блок в зависимости от указанных галочек-кнопочек из разных частей. Попробую сегодня выложить. что из этого получилось.
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 03.07.2016, 19:30
#4
AndroiD


 
Регистрация: 06.01.2008
Урал
Сообщений: 144


Почему загруженная функция show_tpos возвращает -1
Код:
[Выделить все]
 (defun show_tpos (/)
   (load_dialog "c:\\Users\\Оля\\Documents\\ACad\\Test\\d_tpos.dcl")
)
, а введенное непосредственно в командную строку (load_dialog "c:\\Users\\Оля\\Documents\\ACad\\Test\\d_tpos.dcl") возвращает 1.
Autocad 2013.
AndroiD вне форума  
 
Непрочитано 03.07.2016, 20:00
#5
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


немного не в тему, но кто будет сохранять номер загруженного файла диалога? Или функцию unload_dialog вызывать не собираетесь-фиг с ними, с утечками памяти?)
Сергей812 вне форума  
 
Непрочитано 03.07.2016, 20:10
#6
AndroiD


 
Регистрация: 06.01.2008
Урал
Сообщений: 144


Номер загруженного файла диалога сохранять конечно собираюсь. Я использую функцию show_tpos с которой многие начинают изучать язык DCL.
Почему я получаю разные результаты, в двух одинаковых действиях?
AndroiD вне форума  
 
Непрочитано 03.07.2016, 20:25
#7
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Пробуйте в таком явном виде
Код:
[Выделить все]
 (defun show_tpos ( / ) 
  (princ (load_dialog "c:\\Users\\Оля\\Documents\\ACad\\Test\\d_tpos.dcl")) 
) 
Сергей812 вне форума  
 
Непрочитано 03.07.2016, 22:15
#8
Кулик Алексей aka kpblc
Moderator

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


В отдельную тему с соблюдением правил форума.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Закрытая тема
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Ламерские вопросы по LISP и DCL

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

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