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

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

Вывод результата вычислений в окне DCL?

Ответ
Поиск в этой теме
Непрочитано 03.09.2015, 14:35 #1
Вывод результата вычислений в окне DCL?
Pavel_GP
 
Инженер-гидрограф
 
г.г. Ленинград
Регистрация: 15.09.2011
Сообщений: 170

Здравствуйте.
Собрал для себя программку, но есть проблемы, подскажите плз.:
Вопрос: Результаты вычислений не отображаются в диалоговом окне, окно закрывается после нажатия кнопки "Вычислить", как исправить?
Спасибо.
P.S. После выбора точки, пропадает значение в графе "Введите параллель".
Код:
[Выделить все]
 RAD : dialog {
label = "xxx";
: column {
: edit_box {
label="Ââåäèòå ïàðàëëåëü, xx.xxxxx°:";
key="fgs";
edit_width = 12;}
}
: row {
 : boxed_column {
	  label = "Ïåðâàÿ òî÷êà";

	: button {
	label = "Âûáðàòü òî÷êó";
	key = "P1";
	edit_width = 12;
	fixed_width = true;
	mnemonic = "Â";
	}

	: edit_box {
	key = "eb1";
	label = "&X1:";
        edit_width = 15;
	fixed_width = true;
	       	   }

	: edit_box {
	key = "eb2";
	label = "&Y1:";
        edit_width = 15;
	fixed_width = true;
	       	   }

}
: column {
 : paragraph {
        label = "Ðåçóëüòàò âû÷èñëåíèé";
        children_alignment = centered;
        width = 50;
        : text { key = "ln1"; }
        : text { key = "ln2"; }
      }
   }
 }

: row {
        fixed_height = true;
        alignment = top;
        spacer;
         : button {
          key    = "accept";    
          label  = "Âû÷èñëèòü";   
          is_default = true;
          height = 3;      
        }
 : button {
          key       = "cancel";
          label     = "Çàêðûòü";
          is_cancel = true;       
          height    = 2;
        }
        }

      : column {
        fixed_height = true;
        alignment = bottom;
        : text {  label = "xxx";  alignment=right;}
        spacer;
      }

}//dialog

Прошу прощения рус/яз не отображается...

Вложения
Тип файла: lsp RAD.lsp (3.2 Кб, 47 просмотров)

__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 03.09.2015 в 15:01.
Просмотров: 16326
 
Непрочитано 03.09.2015, 16:40
#2
trushev


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


По клавише "P1" запускать функцию выполняющую вычисления. Результат заносить в поле "ln1" не выходя из окна. Убрать (done_dialog 3).
trushev вне форума  
 
Автор темы   Непрочитано 03.09.2015, 17:08
#3
Pavel_GP

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


Если убрать (done_dialog 3), кнопка выбора точки становится не активна.
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 03.09.2015, 17:31
#4
Кулик Алексей aka kpblc
Moderator

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


После закрытия диалога понадобится снова его создавать с уже новыми данными. У Полещука все это расписано

----- добавлено через ~1 мин. -----
Заодно вспомни, что в done_dialog можно (и часто нужно) передавать соответствующие параметры.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.09.2015, 08:24
#5
trushev


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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Если убрать (done_dialog 3), кнопка выбора точки становится не активна.
Не углядел (getpoint "\nУкажите точку: "). Для семейства get-функций требуется временное закрытие окна.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
У Полещука все это расписано
Кроме этого у Кулик Алексей aka kpblc, на autolisp.ru много полезной информации по взаимодействию autolisp с dcl.
На большее пока нет времени. Думаю справитесь.
trushev вне форума  
 
Автор темы   Непрочитано 04.09.2015, 08:29
#6
Pavel_GP

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


Спс. буду разбираться с Полещуком в подлиннике.

----- добавлено через ~5 ч. -----
Спс. Кулик Алексей aka kpblc,

Я в кнопку вычислить выставил значение done_dialog 2, да теперь окно не закрывается, но недодумываю, как результат вставить в область "Результаты вычислений" ... туда сюда не получается, подкинь идейку.
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Автор темы   Непрочитано 08.09.2015, 10:42
#7
Pavel_GP

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


Я победил!

Код:
[Выделить все]
 ;-------------------Ôóíêöèÿ ïåðåâîäà êîîðäèíàò-------------------
(defun rpk (/ fg ao f_ps e1 e2 sfg2 ko l1_r ll1_g ll1_m l1_g l1_m l1_s
	    mo1 f1_r ff1_g ff1_m f1_g f1_m f1_s)


  (setq dfg (atof (get_tile "fgs")))

  (defun dtr (a) (* pi (/ a 180.)))

  (defun asin (ugol)
    (atan (/ ugol (sqrt (- 1. (expt ugol 2.)))))
  )

  (defun deg (r) (/ (* r 180.) pi))
  (defun minu (d) (* (- d (fix d)) 60.))
  (defun sek (m) (* (- m (fix m)) 60.))

  (setq fg (dtr dfg))
  (setq ao 6378137.)
  (setq f_ps (/ 1. 298.25722356))
  (setq e1 0.0818191909289067)
  (setq e2 (* f_ps (- 2. f_ps)))
  (setq sfg2 (expt (sin fg) 2.))
  (setq	ko (/ (cos
		fg
	      )
	      (expt (- 1. (* e2 sfg2)) 0.5)
	   )
  )

  (defun px (x) (/ x (* ao ko)))

  (setq l1_r (px x1))
  (setq ll1_g (deg l1_r))
  (setq ll1_m (minu ll1_g))
  (setq l1_s (sek ll1_m))
  (setq l1_g (fix ll1_g))
  (setq l1_m (fix ll1_m))
  (setq l1_s (atof (rtos l1_s 2 2)))
  (set_tile "ln2"
	    (strcat "Äîëãîòà: "
		    (vl-princ-to-string l1_g)
		    "°"
		    (vl-princ-to-string l1_m)
		    "'"
		    (vl-princ-to-string l1_s)
		    "”"
	    )
  )
  (setq	mo1 (- (/ pi 2.)
	       (* 2.
		  (atan	(exp (/ (* -1. y1) (* ao ko))
			)
		  )
	       )
	    )
  )
  (setq	f1_r
	 (+ (+ (+ (+ mo1
		     (*	(sin (* 2. mo1))
			(+ (+ (+ (/ (expt e1 2.) 2.)
				 (* 5. (/ (expt e1 4.) 24.))
			      )
			      (/ (expt e1 6.) 12.)
			   )
			   (* 13. (/ (expt e1 8.) 360.))
			)
		     )
		  )			;1
		  (* (sin (* 4. mo1))
		     (+	(+ (* 7. (/ (expt e1 4.) 48.))
			   (* 29. (/ (expt e1 6.) 240.))
			)
			(* 811. (/ (expt e1 8.) 11520.))
		     )
		  )
	       )			;2
	       (* (sin (* 6. mo1))
		  (+ (* 7. (/ (expt e1 6.) 120.))
		     (* 81. (/ (expt e1 8.) 1120.))
		  )
	       )
	    )				;3
	    (* (sin (* 8. mo1))
	       (* 4279. (/ (expt e1 8.) 161280.))
	    )
	 )				;4
  )					;setq
  (setq ff1_g (deg f1_r))
  (setq ff1_m (minu ff1_g))
  (setq f1_s (sek ff1_m))
  (setq f1_g (fix ff1_g))
  (setq f1_m (fix ff1_m))
  (setq f1_s (atof (rtos f1_s 2 2)))

 (set_tile "ln1"
	    (strcat "Øèðîòà: "
		    (vl-princ-to-string f1_g)
		    "°"
		    (vl-princ-to-string f1_m)
		    "'"
		    (vl-princ-to-string f1_s)
		    "”"
	    )
  )
)					;end defun rpk
;---------------------------Îñíîâíàÿ ôóíêöèÿ----------------------
(defun C:RAD1 (/ dcl_id step pt)
  (setq dcl_id (load_dialog "RAD2.dcl"))
  (setq step 2)
  (if (null pt)
    (setq pt (list 0.0 0.0))
  )
   
  (while (>= step 2)
    (if	(null (new_dialog "RAD2" dcl_id))
      (exit)
    )
;--------------Âûâîä ðåëüòàòà èçìåðåíèé-----------------------
    (rpk)
    (action_tile "ln1" "(rpk)")
    (action_tile "ln2" "(rpk)")
;-------------------------------------------------------------    
    (set_tile "xp" (rtos (car pt) 2 5))
    (set_tile "yp" (rtos (cadr pt) 2 5))

    (mode_tile "fgs" 0)
    (mode_tile "fgs" 2)
 
    (action_tile "cancel" "(done_dialog 0)")
    (action_tile
      "accept"
      (strcat
	"(setq x1 (atof (get_tile \"xp\")))"
	"(setq y1 (atof (get_tile \"yp\")))"
	"(setq dfg (atof (get_tile \"fgs\")))"
	"(setq pt (list x1 y1))"
	"(done_dialog 2)"
       )				;strcat
    )					;action_tile


    (setq step (start_dialog))
  (cond
      ((= step 3)
	(setq pt (getpoint "\nÓêàæèòå òî÷êó: ")))
       );cond
      )					;while    
  (unload_dialog dcl_id)

  (princ)
)


Код:
[Выделить все]
 RAD2 : dialog {label = "Íàçâàíèå ïðîãðàììû";
: column {
: text {label = "Ñèñòåìà êîîðäèíàò WGS-84";
}
: edit_box {
label = "Ââåäèòå ïàðàëëåëü, xx.xxxxx°:";
key = "fgs";
edit_width = 15;
 value = "75";
          }//end edit_box
}//end column
 : spacer{height=1;}

 :row {
:column {
 :edit_box{
 label="X:";
 value="0";
 key="xp";
 width = 15;
 }
 :edit_box{
 label="Y:";
 value="0";
 key="yp";
 width = 15;
 }
 }//end column
 :button{
 label="Óêàçàòü <";
 key="mousep";
 height=6;
 fixed_width=true;
  action="(done_dialog 3)";
  }//end button

  
  : paragraph {
        label = "Ðåçóëüòàò âû÷èñëåíèé";
        children_alignment = centered;
        width = 30;
        height = 3; 
        : text { key = "ln1"; }
        : spacer {height=1;}
        : text { key = "ln2"; }
      }//end paragraph
      }//end row


: row {
        fixed_height = true;
        alignment = top;
        spacer;
         : button {
          key    = "accept";    
          label  = "Âû÷èñëèòü";   
          is_default = true;
          height = 3;      
        }
 : button {
          key       = "cancel";
          label     = "Çàêðûòü";
          is_cancel = true;       
          height    = 2;
        }
        }//end row

      : column {
        fixed_height = true;
        alignment = bottom;
        : text {  label = "xxx";  alignment=right;}
        spacer;
      }//end column

}//end dialog


----- добавлено через ~1 ч. -----
Где-то недочет...
Если изменить значение ключа "fgs" (по умолчанию 75), а потом выбрать точку, то значение "fgs" скидывается обратно на 75.
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 08.09.2015 в 15:54.
Pavel_GP вне форума  
 
Непрочитано 09.09.2015, 01:13
1 | #8
gomer

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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Где-то недочет...
Чтобы понять где ваши недочеты, хотя бы приведите ваш код в удобоваримый вид
gomer вне форума  
 
Автор темы   Непрочитано 09.09.2015, 08:33
#9
Pavel_GP

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


Цитата:
Сообщение от gomer Посмотреть сообщение
Чтобы понять где ваши недочеты, хотя бы приведите ваш код в удобоваримый вид
Посмотри плз.

Победы нет, черт...
Функция выбора точки с временным закрытием диалогового окна (взята мною из руководства Полещука), при загрузки диалога она всегда предлагает выбрать точку (команда while). Но для меня требуется чтобы выбор точки был не конечный результат (чтоб программа временно прерывалась), а при нажатии на кнопку "Вычислить" появлялись результаты основной функции. (set_tile "ln1" "ln2").
Вложения
Тип файла: zip RAD.zip (2.1 Кб, 14 просмотров)
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 09.09.2015 в 12:44.
Pavel_GP вне форума  
 
Непрочитано 09.09.2015, 12:50
#10
trushev


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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Где-то недочет...
Вставить перед циклом (setq dfg "75"),
вставить перед или сразу после (rpk) (set_tille "fgs" dfg).
И не следует засорять память глобальными переменными.
trushev вне форума  
 
Автор темы   Непрочитано 09.09.2015, 14:06
#11
Pavel_GP

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


Цитата:
Сообщение от trushev Посмотреть сообщение
Вставить перед циклом (setq dfg "75"),
вставить перед или сразу после (rpk) (set_tille "fgs" dfg).
И не следует засорять память глобальными переменными.
1. М.б. не так выразился, но проблема не в том чтоб 75 всегда появлялась, а в том что 75 нельзя изменить на другое значение (при новом выборе точки значение опять становиться 75 )
2. Поправьте если я неправ, я как раз память очищаю закинув переменные defun (/ ......), или я не так понял.
спс.
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 09.09.2015, 15:05
#12
trushev


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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Поправьте если я неправ
У Вас после присвоения переменной dfg значения поля "fgs" происходит временное закрытие окна. Естественно, что после нового открытия, полю присваивается значение по умолчанию.
trushev вне форума  
 
Автор темы   Непрочитано 09.09.2015, 15:21
#13
Pavel_GP

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


Цитата:
Сообщение от trushev Посмотреть сообщение
У Вас после присвоения переменной dfg значения поля "fgs" происходит временное закрытие окна. Естественно, что после нового открытия, полю присваивается значение по умолчанию.
1. Так это мне, как раз понятно было Что прописать чтоб после временного закрытия значения поля "fgs", сохраняло своё вновь введённое значение, а не откатывалось к значению по умолчанию?
2. После запуска программы в окне результат вычислений сохранены последние результаты, а хотелось бы чтоб было пусто. (см. вложение)
3. После перезагрузки AUTOCad, программа не запускается "Команда: RAD1
; ошибка: неверный тип аргумента: numberp: nil" (сам лисп загружен), приходиться удалить код
Код:
[Выделить все]
 (rpk)
    (action_tile "ln1" "(rpk)")
    (action_tile "ln2" "(rpk)")
, а потом опять его вставить обратно.

спс.
Миниатюры
Нажмите на изображение для увеличения
Название: rad1.png
Просмотров: 66
Размер:	18.3 Кб
ID:	156641  
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 09.09.2015 в 15:32.
Pavel_GP вне форума  
 
Непрочитано 10.09.2015, 09:02
1 | #14
trushev


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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
1. Так это мне, как раз понятно было Что прописать чтоб после временного закрытия значения поля "fgs", сохраняло своё вновь введённое значение, а не откатывалось к значению по умолчанию?
В дополнение к посту 10.
1. Изменения касаются строк кода 114 - 121
2. Разобраться с переменной dfg. В строке 136 ей присваивается тип STR, а в строке 6 функции rpk переменная переопределяется на тип REAL. Разберитесь с глобальными и локальными переменными.

Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
2. После запуска программы в окне результат вычислений сохранены последние результаты, а хотелось бы чтоб было пусто
При самом первом пуске должны быть результаты по умолчанию. Очистку результатов можно производить дополнив действия по клавише УКАЗАТЬ.

Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
3. После перезагрузки AUTOCad, программа не запускается "Команда: RAD1
Включите трассировку и определите точку и причину сбоя.
trushev вне форума  
 
Автор темы   Непрочитано 10.09.2015, 14:39
#15
Pavel_GP

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


Всё, что смог изменил, но вопросы так и остались от #13.
1. Прошу загадками для меня не писать. Если можете вставить нужную функцию там где нужно вставьте плз. (большое Вам спасибо)
2. Причина сбоя думаю в том, что при загрузки диалога функция (rpk) не читается, а где именно проблема для меня это долгая дума.
Вложения
Тип файла: zip RAD.zip (2.1 Кб, 12 просмотров)
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 10.09.2015, 15:22
#16
gomer

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


И как по вашему это должно работать?
Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
(action_tile "ln1" "(rpk)")
(action_tile "ln2" "(rpk)")
gomer вне форума  
 
Автор темы   Непрочитано 10.09.2015, 15:42
#17
Pavel_GP

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


Цитата:
Сообщение от gomer Посмотреть сообщение
И как по вашему это должно работать?
Привет.

Я предполагаю, что при нажатии на кнопку "Вычислить" происходят вычисления по функции (rpk) и результаты заносятся в значения "ln1 ln2".

Есть какие-то замечания по всему коду ещё?

Какой-то баг в функции (rpk), основная функция её не читает. По идее должно быть так
Код:
[Выделить все]
 
; ---------Osnovnaya fun---------
 (rpk)
 (action_tile "(rpk)")
(while (...))
 
, и тогда были бы вычисления, но ошибка: неверный тип аргумента: numberp: nil
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 10.09.2015 в 15:55.
Pavel_GP вне форума  
 
Непрочитано 10.09.2015, 16:11
#18
trushev


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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
1. Прошу загадками для меня не писать. Если можете вставить нужную функцию там где нужно вставьте плз. (большое Вам спасибо)
2. Причина сбоя думаю в том, что при загрузки диалога функция (rpk) не читается, а где именно проблема для меня это долгая дума.
Не хочется отнимать победу.
trushev вне форума  
 
Автор темы   Непрочитано 10.09.2015, 16:22
#19
Pavel_GP

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


Цитата:
Сообщение от trushev Посмотреть сообщение
Не хочется отнимать победу.
=) Да всё правильно.

Грызу дальше...до победы!
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 10.09.2015, 16:46
1 | #20
Кулик Алексей aka kpblc
Moderator

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


Добро пожаловать в пошаговую отладку. А заодно и в области видимости

----- добавлено через ~3 мин. -----
Дополнительно: вход в vlide, меню tools - Environment options - General Options. На закладке Diagnostics установить все флажки. Нажать ОК.
Открыть lsp-код и нажать сочетание клавиш Ctrl+Shift+C. Внимательно проанализировать выводимые сообщения.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вывод результата вычислений в окне DCL?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ваши сканы, наша обработка и перевод в DJVU. Armin Поиск литературы, чертежей, моделей и прочих материалов 3866 02.04.2025 09:21
Как сосчитать сумму цифр из отдельных мтекстов (и лисп для подсчета спецификаций) Red Nova LISP 666 07.06.2023 14:00