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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как заставить прозрачную команду на ЛИСП возвращать значение

Как заставить прозрачную команду на ЛИСП возвращать значение

Ответ
Поиск в этой теме
Непрочитано 01.05.2014, 14:16 #1
Как заставить прозрачную команду на ЛИСП возвращать значение
480725
 
Москва
Регистрация: 06.10.2007
Сообщений: 132

Попытался создать прозрачную команду на Лисп с помощью (vlax-add-cmd)
Все получилось, только полученный программой, преобразованной в прозрачную крманду, результат не передается ни в команду автокада ни в лисп, хотя прозрачная команда полностью проработала.

Для иллюстрации привожу специально написанную короткую программу получения ссылки:

(deFun rxy()
(setQ osm(getVar "osmode" ))
(setVar "osmode"55)
(setQ p1(getpoint "\n┴рчютр* Єюўър: "))
(setQ dx(getDist "\n╨рёёЄю*эшх яю ╒:<0> "))
(If (not dx)(setQ dx 0));if
(setQ dy(getDist "\n╨рёёЄю*эшх яю ╒:<0> "))
(If (not dy)(setQ dy 0));if
(setVar "osmode"osm )
(If (caddr p1)
(list (+ (car p1)dx)(+ (cadr p1)dy)(caddr p1))
(list (+ (car p1)dx)(+ (cadr p1)dy))
);if
);defun


Сама программа работает без проблем:

Команда: _line Первая точка: (rxy)
Базовая точка:
Расстояние по Х:<0> 4000
Расстояние по Х:<0>
Следующая точка или [Отменить]:

Преобразовываю программу в прозрачную команду
Команда: (vl-load-com)
Команда: (vlax-add-cmd "rxy"'rxy"rxy" 1)
"rxy"

И повторяю действие с прозрачной командой
Команда: _line Первая точка:'rxy
>>Базовая точка:
>>Расстояние по Х:<0> 4000
>>Расстояние по Х:<0>
Возобновляется команда ОТРЕЗОК.
Первая точка:
Т.е. результат не воспринят как ответ на запрос и проигнорирован (снова спрашивает первую точку).

Пожалуйста, подскажите, как добиться, чтобы результат воспринимался.
Просмотров: 3058
 
Непрочитано 13.05.2014, 21:19
#2
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Здравствуйте.
При вызове прозрачной команды , основная команда блокируется и возобновляется только после того , как прозрачная команда завершиться и выдаст свой результат. (т.е. результат не попадает в командную строку на запрос "Первая точка").

Последний раз редактировалось Эдуард, 13.05.2014 в 21:50.
Эдуард вне форума  
 
Непрочитано 13.05.2014, 22:43
#3
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


вместо
Код:
[Выделить все]
 (vlax-add-cmd "rxy"'rxy"rxy" 1)
используй
Код:
[Выделить все]
 (defun c:rxy () (rxy))
Vov.Ka вне форума  
 
Автор темы   Непрочитано 15.05.2014, 13:26
#4
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
используй
Код:
[Выделить все]
 (defun c:rxy () (rxy))
Я именно так изначально и написал. В этом случае получается прозрачность на фоне команд Автокада, но не на фоне программ на ЛИСП. Та конструкция, которую я использую сейчас - абсолютно законная и по описанию Автодеск должна дать тот результат, на который я расчитываю. Но не дает.

----- добавлено через ~14 мин. -----
Цитата:
Сообщение от Эдуард Посмотреть сообщение
При вызове прозрачной команды , основная команда блокируется и возобновляется только после того , как прозрачная команда завершиться и выдаст свой результат. (т.е. результат не попадает в командную строку на запрос "Первая точка").
Я не очень понял.. Вы намекаете, что прозрачность не предполагает передачи результата фоновой команде? Увы, похоже правда на вашей стороне. Автокадские привязки и ссылка - прямой аналог моей программы - не являются прозрачными командами (вызываются без '). А прозрачные не возвращают значение, а только производят действие... Получается сделать программу - аналог привязки и ссылки, работающую на фоне как команд Автокада, так и программ ЛИСП невозможно?
480725 вне форума  
 
Непрочитано 15.05.2014, 15:33
#5
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Цитата:
Вы намекаете, что прозрачность не предполагает передачи результата фоновой команде?
Именно так.
Команда по сути своей и не должна возвращать значения. Для этого существуют функции. Ну и используйте свою функцию (rxy) подставив ее в команду на запрос первой точки как у Вас показано выше. Чем этот вариант плох?
Эдуард вне форума  
 
Непрочитано 15.05.2014, 15:40
#6
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


А если попробовать так:
Код:
[Выделить все]
 (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "_line (rxy) ")
skkkk вне форума  
 
Непрочитано 16.05.2014, 02:04
#7
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Цитата:
Сообщение от 480725 Посмотреть сообщение
Получается сделать программу - аналог привязки и ссылки, работающую на фоне как команд Автокада, так и программ ЛИСП невозможно?
даже автокадовский 'cal, по сути, не возвращает результат напрямую текущей команде
он просто "впечатывает" результат в командную строку
мы тоже так можем

вот так будет работать для твоего примера
Код:
[Выделить все]
 (vla-SendCommand
    (vla-get-ActiveDocument (vlax-get-acad-object))
    (strcat (substr (apply 'strcat
			   (mapcar (function (lambda (e) (strcat "," (rtos e 2 16))))
				   (If (caddr p1)
				     (list (+ (car p1) dx) (+ (cadr p1) dy) (caddr p1))
				     (list (+ (car p1) dx) (+ (cadr p1) dy))
				   )
			   )
		    )
		    2
	    )
	    " "
    )
  )
Vov.Ka вне форума  
 
Непрочитано 16.05.2014, 06:55
#8
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Надо было сразу прочитать справку по функции vlax-add-cmd. Никакого "полезного" значения она не вернет - только свое же имя.

Цитата:
Return Values

The global-name argument, if successful. The function returns nil if acedRegCmds->addCommand(...) returns an error condition.
А вообще-то придумывать вставку внутрь другой функции прозрачную команду не имеет смысла. Если надо что-то сделать "прозрачно" пользвоатель это сделает сам. А указание точек надо делать другими способами - проверенными и надежными.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 16.06.2014, 19:31
#9
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Эдуард Посмотреть сообщение
Чем этот вариант плох?
Есть программы. Хотелось бы не внося в них изменения расширить возможность указания точки. Такая функция применялась бы и для программ (моих и чужих) и для команд Автокада. Аналог ссылки в Автокаде, только более продвинутый. Я привел только небольшой фрагмент.

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
вот так будет работать для твоего примера
Спасибо: Попробую и отпишусь!

----- добавлено через ~8 мин. -----
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А указание точек надо делать другими способами - проверенными и надежными.
Если не трудно, подскажите этот проверенный и надежный способ. Для откомпилированной программы стороннего разработчика.
480725 вне форума  
 
Непрочитано 16.06.2014, 20:16
#10
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Если не трудно, подскажите этот проверенный и надежный способ. Для откомпилированной программы стороннего разработчика.
Проверенный и надежный способ - писать свои правильные программы. Т.е. надежно работающие, в том числе и с расширенными возможностями указания.
В чужую откомпилированную программу все равно не воткнуть "расширение указания точки". Тем более не надо мечтать о отм, что какая-то (пусть своя) дополнительная "прозрачная" команда что-то вернет в чужую программу. Достаточно просто почитать документацию. И штатные прозрачные команды Автокада ничего не возвращают - они просто позволяют выполнить какое-то действие, например во время ожидания ввода.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 17.06.2014, 01:43
#11
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Проверенный и надежный способ - писать свои правильные программы. Т.е. надежно работающие, в том числе и с расширенными возможностями указания.
Каюсь, программы писал чужие, ненадежно работающие, с суженными возможностями указания..
Если серьезно, то расширенные возможности предусматривались там, где были признаны необходимыми, однако программ много, а сейчас появился соблазн увеличения этих расширенных возможностей, и появился новый очень привлекательный механизм их реализации. Но внедрять это все через редактирование программ ( они писались еще с конца прошлого века и реализация механизма не повсюду решена через подпрограммы) очень трудоемко, тестирование тоже потребует много сил.. А все и так работает и жалоб от пользователей нет.. И остается мечта о прозрачной программе, мечта увы, похоже призрачная, т.к. реализация по принципу автокадовского 'cal предложеная уважаемым Vov.Ka) неудобна для пользователя, ибо требует неочевидного нажатия на Enter, которое нет необходимости делать при решении внутри программ. В общем, такая призрачная прозрачность, или прозрачная призрачность.

Последний раз редактировалось 480725, 19.06.2014 в 03:07.
480725 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как заставить прозрачную команду на ЛИСП возвращать значение

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Создание поля (field), ссылающегося на текстовое значение ячейки таблицы. skkkk Готовые программы 141 24.11.2023 15:49
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Проблемы с расчетом Ж/Б каркаса в ANSYS derik ANSYS 457 04.07.2017 16:16
Лисп. Как выполнить команду по завершении предыдущей? BetinS LISP 14 19.06.2014 03:25