Тема: Нажатие кнопок в Jig...

Не подскажите что рыть что бы понять как отследить в Sampler
нажатие кнопок, хоть и идет запрос в нем на точку...
PromptPointResult dres = prompts.AcquirePoint(jigOpts);
Хочу динамически точку привязки сменить...

Re: Нажатие кнопок в Jig...

> Mx
Каких кнопок?

Re: Нажатие кнопок в Jig...

Например в режиме Jig (запрос точки)
нажимаю на кнопки "1" или кнопки "2".
Выставить что нить типа
if (dres.Value == "1") ...
и обработать
НО не выходит Акад упорно ждет точку на входе... -(

Re: Нажатие кнопок в Jig...

А в jigOpt ты указал строку ключевых слов и/или флаг UserInputControls.AcceptOtherInputString?

Re: Нажатие кнопок в Jig...

Как раз пытаюсь -) список появляетса но не реагирует на ввод...
...
| UserInputControls.AcceptOtherInputString);
...
jigOpts.Keywords.Add("1");
            jigOpts.Keywords.Add("2");
            PromptPointResult dres = prompts.AcquirePoint(jigOpts);
            if (dres.Value.ToString() == "1")
            {

Re: Нажатие кнопок в Jig...

Вроде как уловил -)
...
if (dres.Status == PromptStatus.Keyword)
            {
                if (dres.StringResult == "1")
                {

Re: Нажатие кнопок в Jig...

Вроде как улови -)
if (dres.Status == PromptStatus.Keyword)
            {
                if (dres.StringResult == "1")
                {

Re: Нажатие кнопок в Jig...

//.......
    protected override SamplerStatus Sampler(JigPrompts prompts)
    {
      AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor;
      JigPromptPointOptions jigOpts = new JigPromptPointOptions();
      jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates
        | UserInputControls.NoZeroResponseAccepted
        | UserInputControls.NoNegativeResponseAccepted);
      jigOpts.Message = "\nEnter insert point: ";
      jigOpts.Keywords.Add("1");
      jigOpts.Keywords.Add("2");
      jigOpts.Keywords.Add("3");
      PromptPointResult dres = prompts.AcquirePoint(jigOpts);
      if (dres.Status == PromptStatus.Keyword) {
        ed.WriteMessage("\nResult={0}",dres.StringResult);
      } else if (mActualPoint.DistanceTo(dres.Value) <= FUZZ)
      {
        return SamplerStatus.NoChange;
      }
      else
      {
        mActualPoint = dres.Value;
      }
      return SamplerStatus.OK;
    }
//.......

Re: Нажатие кнопок в Jig...

Но тут есть заминка команда прекращает свое выполнение, мне надо прекращение только если точка введна, при чем прекращает выполнение даже если
...
if (dres.StringResult == "1")
                {
                    return SamplerStatus.NoChange;
и удален флаг AcceptOtherInputString

Re: Нажатие кнопок в Jig...

Спасибо Александр, набросал тоже, но прекращает выполнение функция... -( а мне б надоб что бы только по точке
почему то return SamplerStatus.NoChange;
не выполняетса...

Re: Нажатие кнопок в Jig...

//---------------------------------
    protected override SamplerStatus Sampler(JigPrompts prompts)
    {
      AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor;
      JigPromptPointOptions jigOpts = new JigPromptPointOptions();
      jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates
        | UserInputControls.NoZeroResponseAccepted
        | UserInputControls.NoNegativeResponseAccepted);
      jigOpts.Message = "\nEnter insert point: ";
      jigOpts.Keywords.Add("1");
      jigOpts.Keywords.Add("2");
      jigOpts.Keywords.Add("3");
      PromptPointResult dres;
      do
      {
        dres = prompts.AcquirePoint(jigOpts);
        if (dres.Status == PromptStatus.Keyword) {
          ed.WriteMessage("\nResult={0}",dres.StringResult);
        } else if (mActualPoint.DistanceTo(dres.Value) <= FUZZ)
        {
          return SamplerStatus.NoChange;
        }
        else
        {
          mActualPoint = dres.Value;
          return SamplerStatus.OK;
        }
      } while (dres.Status == PromptStatus.Keyword);
      return SamplerStatus.OK;
    }
//---------------------------------

Re: Нажатие кнопок в Jig...

Спасибо Александр, но все же странно -)

Re: Нажатие кнопок в Jig...

А так будет правильнее:

    static string nPoint = "1";
    protected override SamplerStatus Sampler(JigPrompts prompts)
    {
      AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor;
      JigPromptPointOptions jigOpts = new JigPromptPointOptions();
      jigOpts.Keywords.Add("1"); jigOpts.Keywords.Add("2"); jigOpts.Keywords.Add("3"); jigOpts.Keywords.Add("4");
      jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates
        | UserInputControls.NoZeroResponseAccepted
        | UserInputControls.NoNegativeResponseAccepted);
      PromptPointResult dres;
      do
      {
        jigOpts.Message = "\nEnter insert point <" + nPoint + ">: ";
        dres = prompts.AcquirePoint(jigOpts);
        if (dres.Status == PromptStatus.Keyword) {
          // ed.WriteMessage("\nResult={0}",dres.StringResult);
          nPoint = dres.StringResult;
        } else {
          if (dres.Status == PromptStatus.None) {
            return SamplerStatus.Cancel;
          } else {
            if (mActualPoint.DistanceTo(dres.Value) <= FUZZ) {
              return SamplerStatus.NoChange;
            } else {
              mActualPoint = dres.Value;
              return SamplerStatus.OK;
            }
          }
        }
      } while (dres.Status != PromptStatus.Error && dres.Status != PromptStatus.Cancel);
      return SamplerStatus.OK;
    }

А что именно странно? Вроде все очевидно...

Re: Нажатие кнопок в Jig...

Да -) но пустой цикл приходитса гонять -) хотя по логике NoChange, должна нас избавить от этого.
А точка привязки у ДЖИГ не меняетса ? что то я не найду как ее поменять , или всегда нижний левый угол ?

Re: Нажатие кнопок в Jig...

> Mx
Первую строку оставлю без коментария - ты не понял логику работы метода Sampler.
А точку привязки ты можешь поменять без проблем. Только разберись с логикой.

Re: Нажатие кнопок в Jig...

Нет уж позвольте -)))))))) в АРХ есть диаграмка в которой черным по белому нарисован и так пустой цикл по параметру NoChange...
и если я принудительно его ставлю то он должен выполнитса...

Re: Нажатие кнопок в Jig...

    static bool nChanged = false;
    static string nPoint = "1";
    protected override SamplerStatus Sampler(JigPrompts prompts)
    {
      AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor;
      JigPromptPointOptions jigOpts = new JigPromptPointOptions();
      jigOpts.Keywords.Add("1"); jigOpts.Keywords.Add("2"); jigOpts.Keywords.Add("3");
      jigOpts.Keywords.Add("4"); jigOpts.Keywords.Add("5");
      jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates
        | UserInputControls.NoZeroResponseAccepted
        | UserInputControls.NoNegativeResponseAccepted);
      PromptPointResult dres;
      do
      {
        jigOpts.Message = "\nEnter insert point <" + nPoint + ">: ";
        dres = prompts.AcquirePoint(jigOpts);
        if (dres.Status == PromptStatus.Keyword) {
          // ed.WriteMessage("\nResult={0}",dres.StringResult);
          nPoint = dres.StringResult;
          nChanged = true;
        } else {
          if (dres.Status == PromptStatus.None) {
            return SamplerStatus.Cancel;
          } else {
            if (mActualPoint.DistanceTo(dres.Value) <= FUZZ) {
              return SamplerStatus.NoChange;
            } else {
              mActualPoint = dres.Value;
              return SamplerStatus.OK;
            }
          }
        }
      } while (dres.Status != PromptStatus.Error && dres.Status != PromptStatus.Cancel);
      return SamplerStatus.OK;
    }
    protected override bool Update()
    {
      mCenterPt = mActualPoint;
      BlockReference bRef = GetEntity() as BlockReference;
      Extents3d ext = bRef.GeometricExtents;
      double x = (ext.MaxPoint-ext.MinPoint).X;
      double y = (ext.MaxPoint-ext.MinPoint).Y;
      if (bRef != null && (bRef.Position.DistanceTo(mCenterPt) > FUZZ || nChanged))
      {
        nChanged = false;
        switch (nPoint)
        {
            case "2":
            bRef.Position = mCenterPt + new Vector3d(0,-y/2,0);
                break;
            case "3":
            bRef.Position = mCenterPt + new Vector3d(+x/2,0,0);
                break;
            case "4":
            bRef.Position = mCenterPt + new Vector3d(0,+y/2,0);
                break;
          case "5":
            bRef.Position = mCenterPt + new Vector3d(-x/2,0,0);
            break;
          default:
            bRef.Position = mCenterPt;
                break;
        }
        return true;
      } else {
        return false;
      }
    }

Re: Нажатие кнопок в Jig...

Александр -) сразу же наровите отделатса примеров -) вместо диалога -)))
Я по предыдущим вашим постам загрузил ДОКУ АКАД и прочитал целиком статейку в АРХ на ДЖИГ с диаграмкрой. И как я понял цикл там есть -)
ПС. Спасибо за пример, я понял что надо пересетить координаты , что привязка имеет свою систему координаты, у меня face.

Re: Нажатие кнопок в Jig...

> Mx
Я всегда предпочитаю конкретные работающие примеры, а не пустую болтовню ("диалог"). Так вот в примерах с ключевыми словами цикл есть. smile

Re: Нажатие кнопок в Jig...

А возможно в ввод 1.2.3.... внести динамику, что бы не вводить а только нажимать эти символы ? -)
ПС. Меня удивляет Ваша динамика, я другой раз даже хелп не успеваю загрузить -)

Re: Нажатие кнопок в Jig...

> Mx
Какую динамику? Что такое "что бы не вводить а только нажимать эти символы?"?
P.S.: Мне, честно говоря, начало надоедать угадывать что тебе нужно...

Re: Нажатие кнопок в Jig...

В командной строке не нажимать 1<Enter>,
а просто нажать 1 (без Enter).
Мне каждый раз приходится вводить значение.

Re: Нажатие кнопок в Jig...

> Mx
Так нельзя. Но можно через контекстное меню (по правой кнопке мыши).

Re: Нажатие кнопок в Jig...

ок -) спасибо

(изменено: Вильдар, 10 октября 2011г. 10:23:29)

Re: Нажатие кнопок в Jig...

Добрый вечер. Подскажите, как перерисовать Entity (в моем случае таблицу) в методе Sampler?
Мне нужно организовать возможность менять масштаб таблицы при ее вставке.
Вот, что пока сделал:

protected override SamplerStatus Sampler(JigPrompts prompts)
      { 
         JigPromptPointOptions ppopt = new JigPromptPointOptions("Укажите точку вставки таблицы");
         ppopt.Keywords.Add("1");
         ppopt.Keywords.Add("5");
         ppopt.Keywords.Add("10");
         ppopt.Keywords.Add("15");
         ppopt.Keywords.Add("50");
         ppopt.Keywords.Add("100");
         ppopt.Keywords.Add("200");

         PromptPointResult ppres;
         do {
            ppres = prompts.AcquirePoint(ppopt);

            switch (ppres.Status) {
               case PromptStatus.Cancel:
                  return SamplerStatus.Cancel;
                  break;
               
               case PromptStatus.Keyword:
                  _scale = double.Parse(ppres.StringResult);
                  //
                  //Изменить масштаб таблицы и перерисовать?
                  //...
                  break;
               
               case PromptStatus.OK:
                  if (_cpos.DistanceTo(ppres.Value) < 0.001) {
                     return SamplerStatus.NoChange;
                  }
                  break;               
            }
         } while (ppres.Status == PromptStatus.Keyword ); 
            
         _cpos = ppres.Value;
         return SamplerStatus.OK;          
      }

Ни keyword запросы, ни jig раньше не делал.
А по идее, должно быть просто.
Почти то, что мне нужно, происходит при стандартной вставке блока (_insert), только там можно выбрать ключевое слово масштаб и в доп.запросе ввести число масштаба. После чего, блок масштабируется и продолжается запрос указания точки.

И еще, мне тоже не понятно, что дает SamplerStatus.NoChanges. Из диаграммы (Drag Loop, в док. ObjectArx) следует, как я понимаю, повторение запроса. Т.е. если не возвращать NoChanges, то примитив будет обновлятся (перерисовываться) постоянно, даже если курсор на месте будет находится. Кажись дошло.

upd
Вопрос решил. Неуверен, что на 100% верно.
В самплере нужно просто запоминать выбранный масштаб. А в апдейте масштабировать таблицу.
Я неверно делел масштаб таблицы. Table.ScaleFactors не меняет масштаб таблицы. Нужно делать TransformBy (Matrix3d.Scaling(scale/oldscale, table.Position).