Страница 1 из 1

Множественный выбор

СообщениеДобавлено: 20 май 2016 04:26
void
Коллеги, прошу помощи!

Функция, которая выбирает сначала геометрию(линию) на чертеже, а потом две точки.


Код: Выделить всё
void CAADrwDimDressupCmd::BuildGraph()

   _pObjectAgent1 = new CATIndicationAgent("GetFirstPoint");
   _pObjectAgent1->SetBehavior(CATDlgEngWithUndo); 


    _pObjectAgent = new CATPathElementAgent("_pObjectAgent A");
   _pObjectAgent ->SetBehavior( CATDlgEngWithPrevaluation |
                               CATDlgEngMultiAcquisition |
                               CATDlgEngWithCSO);


   _pObjectAgent ->AddElementType("IDMCircle2D");
   _pObjectAgent ->AddElementType("IDMLine2D");
   _pObjectAgent ->AddElementType("IDMCurve2D");
   _pObjectAgent ->AddElementType("IDMEllipse2D");
   _pObjectAgent ->AddElementType("IDMPoint2D");
   _pObjectAgent ->AddElementType("IDMPolyline2D");


   CATDialogState* pState1 = GetInitialState("Select any 2D geometry");
   pState1->AddDialogAgent(_pObjectAgent);

  CATDialogState *stGetPt1 = AddDialogState("Select First Point");
  stGetPt1->AddDialogAgent( _pObjectAgent1);

  CATDialogState *stGetPt2 = AddDialogState("Select Second Point");
  stGetPt2->AddDialogAgent( _pObjectAgent1);


     AddCSOClient(_pObjectAgent);
   

   AddTransition(pState1, stGetPt1, IsOutputSetCondition(_pObjectAgent),
                 Action((ActionMethod)&CAADrwDimDressupCmd::GetProduct, NULL, NULL));


   AddTransition(stGetPt1, stGetPt2, IsOutputSetCondition(_pObjectAgent1),
                 Action((ActionMethod)&CAADrwDimDressupCmd::GetPoint_1, NULL, NULL));


   AddTransition(stGetPt2, NULL, IsOutputSetCondition(_pObjectAgent1),
                 Action((ActionMethod)&CAADrwDimDressupCmd::GetPoint_2, NULL, NULL));


}



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

Код: Выделить всё

   AddTransition(pState1, pState1, IsOutputSetCondition(_pObjectAgent),
                 Action((ActionMethod)&CAADrwDimDressupCmd::GetCheck1, NULL, NULL));

   AddTransition(pState1, pState1, IsLastModifiedAgentCondition(_pObjectAgent),
                 Action((ActionMethod)&CAADrwDimDressupCmd::GetCheck, NULL, NULL));



Традиционная благодарность за любой намек!

Re: Множественный выбор

СообщениеДобавлено: 20 май 2016 20:09
Wireless_Fidelity
Намек 1. Для агента можно настроить как фильтр по типам, так и добавить произвольную функцию фильтрации. Это позволит ограничить вфбор пользователя только точкой.
2. Агент запускать в отдельном state'e. Если по окончании работы агента (и переходе в следующий state) что-то не нравится, вызываем у агента Reset и принудительно возвращаемся в предыдущее состояние (SetState у команды, вроде), где агент снова начинает работу.

Re: Множественный выбор

СообщениеДобавлено: 21 май 2016 02:59
void
Коллега,

вот зацикливаю агента

Код: Выделить всё
   AddTransition(pState1, pState1, IsLastModifiedAgentCondition(_pObjectAgent),
   Action((ActionMethod)&CAADrwDimDressupCmd::GetCheck, NULL, NULL));

     AddTransition(pState1, stGetPt1, IsOutputSetCondition(_pObjectAgent),
     Action((ActionMethod)&CAADrwDimDressupCmd::GetProduct, NULL, NULL));


в функции зацикливание
Код: Выделить всё
boolean CAADrwDimDressupCmd::GetCheck(void *)
{
      _pObjectAgent -> InitializeAcquisition();
      return TRUE;
}


Действительно, идет множественный выбор 2d геометрии.
Но не понятен механизм выхода из него:
- зацикливание
- агент ждет выбора 2d геометрии

Выбора точки он не ждет. Как ему дать понять, что выбор точки - переходим в другое состояние?
Чтобы это
AddTransition(pState1, stGetPt1,..
начало работать?

Для выбора точки там другой агент _pObjectAgent1. Вроде первоначально так логичней было...



Насчет фильтра. Он кроме фильтрации по типу на что-нибудь влияет? Вроде этот агент CATIndicationAgent _pObjectAgent1 ждет только произвольную точку... А условий для ее координат пока никаких не задано. Может и без него можно?

Re: Множественный выбор

СообщениеДобавлено: 21 май 2016 22:20
Wireless_Fidelity
Сделайте два состояния:
- pSelectionState, в котором работает агент, и по выбору элемента происходит переход во второе состояние
- pValidationState, в котором проверяется выбранная геометрия и, при необходимости, агент выбора повторно инициализируется, а команда переходит в pSelectionState

Re: Множественный выбор

СообщениеДобавлено: 23 май 2016 02:40
void
Уф, коллега, вроде получилось. Если pValidationState сразу двух агентов добавить (для линии и для точки). Посмотрим.
В любом случае, большое спасибо!
Но боюсь, что придется еще одну тему заводить...

Re: Множественный выбор

СообщениеДобавлено: 23 май 2016 09:09
Wireless_Fidelity
Функция, которая выбирает сначала геометрию(линию) на чертеже, а потом две точки


Вообще, поскольку набор входных элементов заранее определён, проще (и куда нагляднее) сделать три состояния для выбора:
- pLineSelection
- pFirstPointSelection
- pSecondPointSelection
для каждого из которых завести агента.

Re: Множественный выбор

СообщениеДобавлено: 24 май 2016 02:04
void
Насколько удалось понять\разобраться, достаточно двух агентов, т.к. два вида выбираемой геометрии. Один для линий, другой для точек. И трех состояний (ждем выбор линии, ждем выбор или линии, или точки, ждем выбор точки). Одно событие (напримр, pValidationState) должно одновременно ждать отклика двух агентов. Который сработал, в то состояние и переходим. Если агент линии, переходим\остаемся в том же состоянии. Если агент точки, переходим в состояние ожидающее точку...
Имхо, как-то так. Пока работает... А там не знаю.