Тема: Как создать свою клавишу меню?

Кратко ситуация: по сотне раз на дню использую команду "перемещение" и постоянно на одну и ту же величину 50. Можно ли сделать кнопку меню "перемещение на 50" к примеру, после чего указать объект (или выделить его до нажатия кнопки меню) и задать направление мышой? раздражает набивать 50 enter:(...

Re: Как создать свою клавишу меню?

> lloyd
Было бы легче, если перемещать объект нужно было только по оси X или Y. В данном случае смущает неопределенность направления перемещения. Простой макрос, IMHO, здесь не получится, видимо, необходимо написать программку на AutoLisp'е, но я пока не знаю, как подступиться.

Re: Как создать свою клавишу меню?

> Владимир Громов
Пока получилось только это: ^C^C_move \50\
Направление задаётся также, как и при простом перемещении, но подтверждается перемещение правой кнопкой мыши, а не левой:(. И не знаю, куда положить пиктограмму, но это сам найду:). Спасибо.

Re: Как создать свою клавишу меню?

Ещё один минус - объект должен быть выделен до выполнения команды, а иначе белиберда какая-то получается...

Re: Как создать свою клавишу меню?

Как вариант:

(defun C:MOVE50 ( / osm obj pp1 pp2 pp3)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq obj (entsel "\n Выберите объект (можно с объектной привязкой): "))
(setq pp1 (nth 1 obj))
(setq pp2 (getpoint pp1 "\n Укажите точку направления перемещения: "))
(vl-cmdf "_UCS" "_3" pp1 pp2 "")
(setq pp3 (list (+ (car pp1) 50) (cadr pp1)))
(vl-cmdf "_MOVE" obj "" pp1  pp3)
(vl-cmdf "_UCS" "_WORLD")
(setvar "OSMODE" osm)
(princ)
)

Код сохранить в файле move50.lsp на пути доступа AutoCAD'а к файлам поддержки.
Возможный макрос для кнопки или пункта меню:

^C^C(if (not C:MOVE50) (load "move50")) MOVE50

Re: Как создать свою клавишу меню?

> Владимир Громов
Всё работает, Владимир. Спасибо огромное!:) И повтор работает. Здорово! Получается только, что по-любому надо выбирать объект, вне зависимости от того, выбран он до этого или нет. И двигать можно только один объект за раз. В лиспе не понимаю ничего:(. Не хочу лишний раз критиковать, просто когда чертишь объект, то это происходит на автоматизме и очень быстро. Типа выделил объект(ы), нажал клавишу меню, щёлкнул на пустом месте раз и на пустом месте в нужном направлении - два, и обект передвинут, а тут надо попасть точно в объект по-любому:).

Re: Как создать свою клавишу меню?

> Владимир Громов
кстати, и все привязки выключаются:(.

Re: Как создать свою клавишу меню?

> Владимир Громов

> lloyd
Наверное так было бы правильней:

(defun C:MOVE50 ( / osm obj pp1 pp2 pp3)
 (if (and (setq obj (entsel "\n Выберите объект: "))
          (setq pp1 (cadr obj) obj (car obj))
          (setq pp2 (getpoint pp1 "\n Укажите точку направления перемещения: ")))
  (progn
    (setq pp3 (polar pp1 (angle pp1 pp2) 50))
    (setq osm (getvar "OSMODE"))
    (setvar "OSMODE" 0) ;; привязку имеет смысл убирать только здесь
    (vl-cmdf "_.MOVE" obj "" pp1  pp3)
    (setvar "OSMODE" osm)
  )
 )
 (princ)
)

Re: Как создать свою клавишу меню?

> lloyd
А разве при предварительном выборе не надо попасть точно в объект? Привязки я убрал для того, чтобы объект выбирался с помощью прицела выбора объектов и только в необходимом случае - с помощью объектных привязок, которые можно выбрать в контекстном меню или в панели привязок. В данном случае применение функции (entcel) позволяет не указывать базовую точку, она определяется при выборе объекта, но, к сожалению (в данном случае), позволяет выбрать только один объект. Я думаю, что усложнив код, можно сделать и множественный выбор объектов. По поводу предварительного выбора объектов. Я вот, например, предпочитаю сначала определиться с тем, какую команду я хочу выполнить, а уж потом - какие объекты выбрать для этой команды. Но это не догма, можно предусмотреть и возможность предварительного выбора. Мне самому мой вариант программы с изенением ПСК не очень нравится, делал первое, что в голову пришло. У Александра Ривилиса, естественно, получилось лучше, только я не совсем понимаю, почему понадобилось для (if) задавать одновременно три условия.

Re: Как создать свою клавишу меню?

Владимир Громов пишет:

только я не совсем понимаю, почему понадобилось для (if) задавать одновременно три условия.

Защита от непопадания в примитив и/или пустого ввода точки.

Re: Как создать свою клавишу меню?

> Александр Ривилис
Я это сообразил, пока отправлял сообщение, но подумал - пусть Александр Ривилис, все-таки, объяснит.
Чуть-чуть добавил в код:

(defun C:MOVE50 ( / osm obj pp1 pp2 pp3)
 (if (and (setq obj (entsel "\n Выберите объект: "))
          (setq pp1 (cadr obj) obj (car obj))
          (setq pp2 (getpoint pp1 "\n Укажите точку направления перемещения: ")))
  (progn
    (setq pp3 (polar pp1 (angle pp1 pp2) 50))
    (setq osm (getvar "OSMODE"))
    (setvar "OSMODE" 0)
    (vl-cmdf "_.MOVE" obj "" pp1  pp3)
    (setvar "OSMODE" osm)
  )
  (princ "\n Объект не выбран или отказ.")
 )
 (princ)
)

Re: Как создать свою клавишу меню?

> Владимир Громов
"Попасть точно в объект" - это может я не совсем точно выразился. Извиняюсь. Имею ввиду, что если работаешь быстро, то лично я для скорости работы не стремлюсь попасть в объект одним нажатием, а выделяю область, в котором этот объект находится. То бишь получается два клика мышой вместо одного, зато быстрее. Также если надо сдвинуть несколько объектов - точно также выделить, понимаете?:) Мне более привычнее сначала выделить эти объекты, потом произвести действие.

Re: Как создать свою клавишу меню?

> Владимир Громов

> Александр Ривилис
Спасибо за помощь в любом случае! Для сдвига одного объекта буду пользоваться Вашим лиспом, а нескольких - по старинке:). Надо просто привыкнуть для этого лиспа сначала нажимать каманду, потом выделять объект, но это не проблема:).