|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
03.11.2003, 13:05 | #1 | |
прервать (command... не прерывая программу
Сообщений: n/a
|
||
Просмотров: 12032
|
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
|
С ходу ниче более оригинального не приходит на ум, кроме как визуализировать обекты при помощи grdraw или grvecs, а мышку контролировать grread и vlr-mouse-reactr. Последний пригодится, чтоб правую кнопку отследить.
ГЕММММММОРНО!!!! |
|||
|
||||
Сообщений: 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) к примеру- двигать из другой базовой точки. Но вот как сделать чтоб при правй мыши прогу не обрывать без реакторов и вижуальности? |
|||
|
||||
Архитектор Регистрация: 25.08.2003
Москва
Сообщений: 307
|
2 DronT
Насчет Дока - см. http://www.gis.kurgan.ru/datacad/lisp/m_insert.htm Но вроде это не совсем то... |
|||
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
|
А обязательно ли
Цитата:
|
|||
|
||||
Сообщений: 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 |
|||
|
||||
Сообщений: 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 |
|||
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
|
>SAV
А как же (см. первый постинг) "другая базовая точка"? Имхо, без _.move (вместо _.erase и второго _.insert) тут не обойтись. Да и для замороченной (grread...) требуется тщательная проверка, клавиатуру, например, требуется исключать... |
|||
|
||||
Сообщений: n/a
|
>VK
Пускай посмотрит автор, постинга, иногда в результате ничего больше и не нужно. В дальнейшем можно доработать, отлавливать точку вставки, ну и вперед... А насчет клавы, так она в данном случае ни при чем, ведь отлавливаються только 3 и 25, на остальное нет никакой реакции. >DronT Кнопки мыши я тоже перепутал, вместо правой- левая и наоборот. Впрочем можно поменять 3 на 25. |
|||
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
|
Идея 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 и все... Надо бы в надежности убедиться.... |
|||
|
||||
Сообщений: n/a
|
Ну конечно, функция grread возвращает список: 1-й член код устройства ввода, 2- й текущие координаты курсора. Я это и имел ввиду, в точке вставки запоминать координаты курсора, затем использовать их как новую точку вставки. Единственное лучше не использовать эту функцию два раза подряд. В смысле:
(setq a (car (grread ......) (setq b (cadr (grread .....) координаты курсора, могут быть уже другие (из опыта). Надо сохранить в переменоой весь список, а затем выделить устройство и координату. |
|||
|
||||
Сообщений: n/a
|
Ну вот опять поспешил. Все было бы хорошо, если бы мы не тащили по экрану блок. Все вышесказанное верно, за исключением того что при перетаскивании блока никакие координаты отследить с помощью grread (тьфу уже оскомину набила) невозможно. Придеться брать точку вставки из DFX вставленного (на время) блока. И вообще пора уже написать этот код.
|
|||
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
|
Все именно так. И даже работает вроде.... Но!
- Очень непривычная "тянучка" объекта за курсором (по крайней мере на моем P2 433MHz) - Задать точку вставки, набрав координаты непосредственно с клавиатуры уже не получится - Не пробовал, но есть сомнения в использовании привязок. Код пока не публикую - запутался в смещениях точки вставки. :roll: Наверно много пива выпил. |
|||
|
||||
Сообщений: n/a
|
Вообще как говорит моя жена: "Все сильно проще".
Код:
|
|||
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
|
>SAV
Так я и предложил сделать в своем постинге от (Вт Ноя 04, 2003 12:54) Это самый простой способ, однако здесь спокойно можно обойтись без (grread) и использовать обычное (getkword) или (getpoint), чтоб сохранилась полная совместимость и с клавиатурой и, при необходимости, с макросами на кнопках. Но, задача несколько иная.... И реально для такого алгоритма требуется прервать работу (command.... pause ...), а потом продолжить с того же места. В принципе, это может быть и реально (вспомним применение команд в прозрачном режиме '_.zoom ), но далеко не все команды выполняются в прозрачном режиме. Пишут, можно создавать такие в VLX, но не пробовал. |
|||
|
||||
Сообщений: n/a
|
Из постинга, не совсем понятно, нужен ли реальный "прозрачный" режим, или только иммитация. Похоже что достаточно иммитации, главное чтобы только программа не прерывалась. И потом человек хочет "по правой кнопке мыши", вот я и сделал по кнопке, правда по левой, ну поменяет 25 на 3 и будет по правой. Да, наверное он и сам уже все сделал, а мы тут чего то обсуждаем...
|
|||