Тема: Как отследить окончание работы команды "pan"?
есть форма
на ней батон
нажимаем на батон - прячем форму, запускаем команду pan
ThisDrawing.SendCommand "_pan" & vbCrLf
спрашивается как отследить конец панировки, чтобы снова показать форму?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Как отследить окончание работы команды "pan"?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
есть форма
на ней батон
нажимаем на батон - прячем форму, запускаем команду pan
ThisDrawing.SendCommand "_pan" & vbCrLf
спрашивается как отследить конец панировки, чтобы снова показать форму?
Не ответ на вопрос, но предложение, а может сделать форму не модальной?
Ести принципиально, чтоб форма была модальной, то можно по таймеру опрашивать нажата ли кнопка ескапе, через API.
GetAsyncKeyState
GetKeyState
да, этот вариант (опрос клавы) давно напршивается, но хотел найти чего попроще, тем более выход из панировки предусматривается не только нажатием esc
нижеприведенный код получает координаты точки, указанной юзером, при этом форма скрывается и до того, как нажата лкм есть возможность выйти в режим pan по правой кнопке, потом два ескапа и снова форма. Никак не могу выйти в пан напрямую, минуя сложые телодвижения нажатия пкм, выбор пан, лкм...
Dim pnt As Variant
zFrm.hide
On Error Resume Next
Err.Clear
pnt = ThisDrawing.Utility.GetPoint(, "Укажите центр")
tbxCx.Text = Round(pnt(0), 5)
tbxCy.Text = Round(pnt(1), 5)
tbxCz.Text = Round(pnt(2), 5)
drawThePoint (pnt)
ThisDrawing.Application.Update
zFrm.Show
> Виктор
Можно привязать хот кей. Как на форму, но видимо они будут работать, когда форма активна (что не есть хорошо), либо на сделать хоткей на уровне системы тогда будут работать всегда и везде :) (что тоже не приятно). Может можно привязать хоткеи к Автокаду :) Можно это сделать это программным путем, а можно и в acad.mns . Поглядите как там объявляются ***ACCELERATORS.
по-видимому остановлюсь на немодальной форме - наименьшие потери сил и времени
> Виктор
А если до и после команды _PAN проверять значение переменной VIEWCTR? И если изменилась, то показывать форму.
А вот так будет наверно красивее, ну все зависит от вашей специфики и размеру формы. Если формочка занимает пару % от экрана, то можно сделать ее onTop и прозрачной, тогда бутоны навиду с функциональной формой, и для пана сразу видно есть ли, что то важное под формой и стоит ли тянуть.
Про VIEWCTR не может быть и речи, к примеру вам необходимо воспользоваться паном несколько раз, ну находится интересуемый Вас объект через несколько экранов, так что лицезреть на форму и нажимать на бутон несколько раз?
А может еще проще взглянуть. На фоме есть кнопка, которая прячет форму и запускает пан. На мой взгляд можно пан не запускать. Он и так привязан к mouse3, и в тулах и в попапе прописать вызов процедурки, которая развернет форму. Что это нам дает мы не ограниченны в действиях, т.е. свернули форму делаем все, что необходимо, а не только паним. Да и сделать комманду SF (Show Form) для command line тоже пригодилось бы
> SmeL
Ладно (хотя в начальной постановке задачи стоял вопрос об однократном запуске PAN)
А если анализировать cmdactive и cmdnames ?
Про cmdnames, это мы должны вызвать команду отличную от пам, чтоб доказать, что мы с памом закончили? или сброс действия (в нашем случае пам) ACAD воспринимает тоже как команда?
> SmeL
Если команда PAN закончила свою работу, то переменная cmdnames не будет ее содержать (не важно началась ли другая команда или не началась). Кроме того можно воспользоваться командным реактором для получения информации о том, что PAN завершила свою работу.
Тогда как лучше во Вашему Александр Ривилис? таймер с cmdnames или работать с командным редактором?
> SmeL
Я не работаю с VBA и поэтому не в курсе насколько хорошо и удобно в нем реализованы командные реакторы. Если хорошо - то лучше через реактор (меньше должно тормозить).
Я даже и не подзреваю, как с ним работать в VBA, если у редактора есть Event -ы, то лучше через редактор. Надеюсь мы вывели удовлетворяющий ответ для Виктора.
> SmeL
AcadApplication.EndCommand(command_name)
Спасибо за посильную помощь в разрешении проблемы Smel`у и Александру Ривилису.
Для интересующихся лиц - код:
в модуле формы:
Private Sub cbxPan_Click()
zFrm.Hide
ThisDrawing.SendCommand "_pan" & vbCrLf
End Sub
в модуле ThisDrawing:
Private Sub AcadDocument_EndCommand(ByVal cmdName As String)
If cmdName = "PAN" Then zFrm.Show
End Sub
евент EndCommand может оказаться полезен для отслеживания завершения других команд
так честнее:
Private Sub cbxPan_Click()
Dim PauseTime, Start
zFrm.Hide
Paning = True
ThisDrawing.SendCommand "pan" & vbCrLf
PauseTime = 0.1
Do
Start = Timer
Do While Timer < Start + PauseTime
DoEvents
If Not Paning Then zFrm.Show: Exit Sub
Loop
Loop Until False
End Sub
Private Sub AcadDocument_EndCommand(ByVal CmdName As String)
If CmdName = "PAN" And Paning Then Paning = False
End Sub
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Как отследить окончание работы команды "pan"?
Форум работает на PunBB, при поддержке Informer Technologies, Inc