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

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

прервать (command... не прерывая программу

Ответ
Поиск в этой теме
Непрочитано 03.11.2003, 13:05 #1
прервать (command... не прерывая программу
DronT
 
Сообщений: n/a

давно на лиспе сочиняю, но вот надобности не возникло ещё...

надо двигать блок [(command "move" "0.0.0" pause)] но блин хотелось бы так, чтоб при нажатии правой мыши лисп бы не прерывался а продолжался- предлагал движение но с другой базовой точкой

насколько это просто? какие мысли есть у кого?
Просмотров: 12032
 
Непрочитано 03.11.2003, 14:10
#2
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


Надо полагать, ты хочешь двигать блок и при этом в динамике видеть его будущую позицию?
Pilot вне форума  
 
Непрочитано 03.11.2003, 14:43
#3
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


С ходу ниче более оригинального не приходит на ум, кроме как визуализировать обекты при помощи grdraw или grvecs, а мышку контролировать grread и vlr-mouse-reactr. Последний пригодится, чтоб правую кнопку отследить.

ГЕММММММОРНО!!!!
vk вне форума  
 
Непрочитано 03.11.2003, 15:10
#4
DronT


 
Сообщений: n/a


2Pilot да
2vk вот и я о том- же
Sha... короче который ЛохматыйДок об этом много писал в своё время, но тогда мне это было не нужно и потому неинтересно... Мож кто помнит?

короче суть в чём. Вставился блок (сам собой на линию, в точку например "0.752,0,0"). Его (command "move" "l" "0,0,0" pause). Если он не двигался, при move юзер нажал правую мышь, то(getvar "lastpoint") равно "0,752,0,0" и дальше(command "move" "l" "140,0,0" pause) к примеру- двигать из другой базовой точки. Но вот как сделать чтоб при правй мыши прогу не обрывать без реакторов и вижуальности?
 
 
Непрочитано 03.11.2003, 18:43
#5
Андрей С.

Архитектор
 
Регистрация: 25.08.2003
Москва
Сообщений: 307


2 DronT
Насчет Дока - см. http://www.gis.kurgan.ru/datacad/lisp/m_insert.htm
Но вроде это не совсем то...
Андрей С. вне форума  
 
Непрочитано 03.11.2003, 21:47
#6
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Есть такая мысль (не более). Возможно, бредовая.

По правой кнопке вызывется контекстное меню. Так вот в это меню добавить пунктик с "прозрачной" командой на перемещение набора объектов под курсором.
vk вне форума  
 
Непрочитано 04.11.2003, 11:54
#7
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


А обязательно ли
Цитата:
так, чтоб при нажатии правой мыши
Нельзя ли изменить алгоритм, исключив правую кнопку в движении? Примерно так: тащит юзер объект... не понравилась точка привязки - бросил где попало, нажал правую кнопку, выбрал "изменить привязку" и дальше потащил.... или "OK" выбрать, если все встало на свои места.
vk вне форума  
 
Непрочитано 04.11.2003, 14:55
#8
DronT


 
Сообщений: n/a


для меня это уже слишком...

ладно, будет небольшой диалог
 
 
Непрочитано 06.11.2003, 23:35
#9
SAV


 
Сообщений: n/a


Может так пойдет? Вставляешь блок (вращение я оставил), если положение не устраивает. жмешь правую кнопку, он снова двигаеться (удаляется и вставляеться). Как только жмешь левую, значит все OK, блок остаеться на месте.

(defun c:mbl (/)
(command "_.insert" "test_block" "_s" "1" pause pause)
(setq block (entlast))
(while (/= move_stop_flag 25)
(setq move_stop_flag (car (grread nil 2 0)))
(if (= move_stop_flag 3)
(progn
(command "_.erase" (entlast) "")
(command "_.insert" "test_block" "_s" "1" pause pause)
);end progn
);end if
);end while
(princ)
); end mbl
 
 
Непрочитано 06.11.2003, 23:38
#10


 
Сообщений: n/a


Ну конечно (setq block (entlast)) лишнее. Какие то неясные идеи кружились в моей голове...
 
 
Непрочитано 07.11.2003, 00:16
#11
SAV


 
Сообщений: n/a


Извините DronT! Я слишком много выпил пива. Переменная move_stop_flag должна конечно же быть локальной, иначе функция обречена работать 1 раз. Не буду больше после пива на форум.

(defun c:mbl (/
move_stop_flag
)
(setvar "cmdecho" 0)
(command "_.insert" "test_block" "_s" "1" pause pause)
(while (/= move_stop_flag 25)
(setq move_stop_flag (car (grread nil 2 0)))
(if (= move_stop_flag 3)
(progn
(command "_.erase" (entlast) "")
(command "_.insert" "test_block" "_s" "1" pause pause)
);end progn
);end if
);end while
(princ)
); end mbl
 
 
Непрочитано 07.11.2003, 16:09
#12
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


>SAV
А как же (см. первый постинг) "другая базовая точка"?
Имхо, без _.move (вместо _.erase и второго _.insert) тут не обойтись. Да и для замороченной (grread...) требуется тщательная проверка, клавиатуру, например, требуется исключать...
vk вне форума  
 
Непрочитано 07.11.2003, 19:35
#13
SAV


 
Сообщений: n/a


>VK

Пускай посмотрит автор, постинга, иногда в результате ничего больше и не нужно. В дальнейшем можно доработать, отлавливать точку вставки, ну и вперед... А насчет клавы, так она в данном случае ни при чем, ведь отлавливаються только 3 и 25, на остальное нет никакой реакции.

>DronT

Кнопки мыши я тоже перепутал, вместо правой- левая и наоборот. Впрочем можно поменять 3 на 25.
 
 
Непрочитано 08.11.2003, 12:30
#14
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Идея SAV с кодом 25 натолкнула на мысли о таком алгоритме:
сначала (command "_.insert " block_name)
затем фиксируем точку вставки вроде (setq resp (grread 1))
здесь возможны варианты первого элемента значения resp 25 - правая кнопка, 3 - левая кнопка, 5 - перемещение мышки.
Что делать при 3 - понятно...
При 5 - вставляем блок в точку, указанную во втором элементе списка resp с масштабом 1 и углом поворота 0, а далее цикл - анализируем аналогичный запрос (grread 1) и при помощи (command "_.move" ...) двигаем сию вставку блока от одной точки к другой, до тех пор, пока очередная (grread 1) не вернет первым элементом 3 или 25.
В случае, если 3 - трем то что двигали и заново (command "_.insert .... ) но с известной точкой вставки (если, конечно, нужно получить от пользователя указание масштаба и поворота, в противном случае можно не тереть - и так все готово).
В случае, если 25 - вычисляем новую исходную точку для (command "_.move" ...) и продолжаем цикл, как при 5.

Вот, вроде бы так должно получиться. Надеюсь, вечером будет время - тогда попробую написать код.

>SAV
Действительно, с клавиатурой я поспешил.

Только вот... описания кода 25 в хелпе найти не удалось сходу.... И значение (второй элемент) у него какое-то странное, похоже на координату X и все... Надо бы в надежности убедиться....
vk вне форума  
 
Непрочитано 09.11.2003, 01:08
#15
SAV


 
Сообщений: n/a


Ну конечно, функция grread возвращает список: 1-й член код устройства ввода, 2- й текущие координаты курсора. Я это и имел ввиду, в точке вставки запоминать координаты курсора, затем использовать их как новую точку вставки. Единственное лучше не использовать эту функцию два раза подряд. В смысле:

(setq a (car (grread ......)
(setq b (cadr (grread .....)

координаты курсора, могут быть уже другие (из опыта). Надо сохранить в переменоой весь список, а затем выделить устройство и координату.
 
 
Непрочитано 09.11.2003, 01:19
#16


 
Сообщений: n/a


Ну вот опять поспешил. Все было бы хорошо, если бы мы не тащили по экрану блок. Все вышесказанное верно, за исключением того что при перетаскивании блока никакие координаты отследить с помощью grread (тьфу уже оскомину набила) невозможно. Придеться брать точку вставки из DFX вставленного (на время) блока. И вообще пора уже написать этот код.
 
 
Непрочитано 09.11.2003, 15:33
#17
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Все именно так. И даже работает вроде.... Но!
- Очень непривычная "тянучка" объекта за курсором (по крайней мере на моем P2 433MHz)
- Задать точку вставки, набрав координаты непосредственно с клавиатуры уже не получится
- Не пробовал, но есть сомнения в использовании привязок.

Код пока не публикую - запутался в смещениях точки вставки. :roll: Наверно много пива выпил.
vk вне форума  
 
Непрочитано 09.11.2003, 18:58
#18
SAV


 
Сообщений: n/a


Вообще как говорит моя жена: "Все сильно проще".
Код:
[Выделить все]
(defun c:mbl(/ move_stop_flag)
  (setvar "cmdecho" 0)
    (command "_.insert" "test_block" "_s" "1" pause "0")
  (while (/= move_stop_flag 25)
(terpri)
(princ "*** {Left click} to Move with new base point or {Right click} to Stop ***")
(terpri)
      (setq move_stop_flag (car (grread nil 2 0)))
(if (= move_stop_flag 3)
	  (command "_.move" (entlast) "" (getpoint ">>> Specify new base point ") pause)
	);end if
);end while
(princ)
	 ); end mbl
Вставляешь блок в первый раз, после чего оно тебя спрашивает: "Левый клик для продолжения движения с новой базовой точкой или Правый для остановки". Затем запрашивает новую базовую точку и снова двигаем и вставляем сколько угодно пока не надоест или случайно не нажмешь правую кнопку мыши.[/code][/b]
 
 
Непрочитано 09.11.2003, 22:06
#19
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


>SAV
Так я и предложил сделать в своем постинге от (Вт Ноя 04, 2003 12:54) Это самый простой способ, однако здесь спокойно можно обойтись без (grread) и использовать обычное (getkword) или (getpoint), чтоб сохранилась полная совместимость и с клавиатурой и, при необходимости, с макросами на кнопках.


Но, задача несколько иная.... И реально для такого алгоритма требуется прервать работу (command.... pause ...), а потом продолжить с того же места. В принципе, это может быть и реально (вспомним применение команд в прозрачном режиме '_.zoom ), но далеко не все команды выполняются в прозрачном режиме. Пишут, можно создавать такие в VLX, но не пробовал.
vk вне форума  
 
Непрочитано 10.11.2003, 01:48
#20
SAV


 
Сообщений: n/a


Из постинга, не совсем понятно, нужен ли реальный "прозрачный" режим, или только иммитация. Похоже что достаточно иммитации, главное чтобы только программа не прерывалась. И потом человек хочет "по правой кнопке мыши", вот я и сделал по кнопке, правда по левой, ну поменяет 25 на 3 и будет по правой. Да, наверное он и сам уже все сделал, а мы тут чего то обсуждаем...
 
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > прервать (command... не прерывая программу

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

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