• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Кнопка стоп в компасе

Автор TheHZ, 13.10.15, 11:41:40

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

TheHZ

Доброго времени суток. У меня вопрос может кто сталкивался, возможно ли отследить нажатие кнопки стоп в компасе? Например ЕСЛИ (нажата кнопка стоп) ТО....

Смотрите пример Step12.
IPropertyManagerNotify.ButtonClick - нажата кнопка спец панели.
+ Благодарностей: 2

TheHZ

Спасибо, тупанул, не смотрел почему то step12... 

TheHZ

В step12 он отслеживает нажатие на панели которую сам и создает, причем не действует на нажатия на стандартной панеле...(  А на стандартной панели можно отследить нажатие кнопки стоп?)

Стандартную панель нужно подписать на обработку событий, тогда будет отслеживать.
pProcessParam:=KompasApi7.CreateProcessParam;
NewPropertyManagerEvent(IDispatch(pProcessParam),pProcessParam.Reference);
...
Doc.ksCursorEx(Info,X,Y,PhantomK,pProcessParam);

TheHZ

Не понимаю как подписываться на события стандартной панели(((  если не сложно можете подробней написать...

Пример Step12 функция PropertyManagerEvent.
Стандартная от библиотечной отличается только содержанием.

TheHZ

Взаранее извиняюсь, возможно где-то по страшному туплю... Но хоть убей не вижу как можно подписаться на события стандартной панели...
из класса PropertyManagerEvent нашел только функцию которая может посмотреть насчет выполнения условия:

public bool ButtonClick(int buttonID)
      {         
                  if (buttonID == (int)SpecPropertyButtonEnum.pbEsc)
                     MessageBox.Show("Реагирует на стоп)");
      return true;
      }

а откуда взять, чтобы приходило это значение buttonID не могу понять(

После подписки, когда Вы вызовите запрос к системе Doc.ksCursorEx(Info,X,Y,PhantomK,pProcessParam), то тут помимо использования функции обратной связи, есть параметр, где передаётся указатель на интерфейс параметров процесса, соответственно запрос запустится в рамках данного процесса и при подписке будет генерировать события нажатия кнопок спец панели - свойство IProcessParam.SpecToolbar - специальная панель.

Дмитрий22

 Перехватываю нажатие клавиши Enter и закрываю стандартную панель:
     public class PropertyManagerEvent : BaseEvent, ksPropertyManagerNotify
{
          ProcessParam p1;
                public PropertyManagerEvent(object manager) : base(manager, typeof(ksPropertyManagerNotify).GUID)
{
                 p1 = (ProcessParam)manager;
                 Advise();
}
                public bool ButtonClick(int buttonID)
{
                 if (buttonID == (int)SpecPropertyButtonEnum.pbEnter)
                    {
                      p1.Application.StopCurrentProcess(true);
                    }
                 return true;
                 }
          }

В чертеже работает как надо, а в эскизах (3D) функция p1.Application.StopCurrentProcess(true) не закрывает панель.
Может, кто знает, как ее закрыть в эскизе по нажатию клавиши Enter?

Вы считаете, что по данному куску кода, все сейчас, Вам помогут?
Закрываете, что, какую панель, процесс?

Дмитрий22

Цитата: Sabahs от 13.08.18, 21:10:49
Вы считаете, что по данному куску кода, все сейчас, Вам помогут?
Закрываете, что, какую панель, процесс?
Да. процесс, стандартную панель Компас:

ProcessParam processParam = App.CreateProcessParam();
processParam.SpecToolbar = SpecPropertyToolBarEnum.pnEnterEscHelp;
new PropertyManagerEvent(processParam);
....
info.SetCallBackP("CALLBACKPROCPLACEMENT", 0, this);
Doc.ksPlacementEx(info, ref X, ref Y, ref ang, phantom, processParam);


Непонятно зачем рубить процесс StopCurrentProcess, если по нажатию Enter, он должен завершиться сам, хотя StopCurrentProcess должна его вырубить, если он у Вас не зациклен.
Если он у Вас зациклен, то выйти из цикла по подтверждению.
Хотя какой процесс у Вас непонятно, он у Вас статический или динамический?

Дмитрий22

Да, он зациклен. Выйти из цикла могу, и выхожу когда нужно. Мне так же нужно перехватить нажатия кнопок на стандартной панели и я их перехватываю. Но проблема в том, что StopCurrentProcess закрывает панель только в чертежах и фрагментах. Почему в эскизах эта же команда не работает? Ведь эскиз это тот же фрагмент. По поводу статический или динамический уточню вечером.

Что мешает добавить флаг, при нажатии на кнопку в обработчике установили нужное значение, прежде чем идти повторно в цикл, проверили флаг.
Ваш процесс уже является под процессом, т.к. основной это редактирование эскиза, оптимальный вариант всё в отладчике покрутить.

Дмитрий22

Цитата: Sabahs от 14.08.18, 07:34:28
Что мешает добавить флаг, при нажатии на кнопку в обработчике установили нужное значение, прежде чем идти повторно в цикл, проверили флаг.
Ваш процесс уже является под процессом, т.к. основной это редактирование эскиза, оптимальный вариант всё в отладчике покрутить.
Можно попробовать. Но для этого необходимо добавить глобальную переменную. Я их страсть, как не люблю. Это противоречит ООП. Странно, почему StopCurrentProcess в эскизах не работает.

Можно любить, а можно не любить, дело хозяйское, а в остальном отладчик, но тут сложнее отлаживать, нужно отлавливать обработчик события, Ваш цикл и функцию обратной связи.
Чтобы отлавливать события в процессе то помимо событий панели, ещё использовать и события для процесса 2D - IProcess2DNotify.
+ Благодарностей: 1