Не работает ввод значения с клавиатуры

Автор Тема: Не работает ввод значения с клавиатуры  (Прочитано 7090 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вот так незамысловато я назвал тему) А теперь опишу проблему:
Имеется функция, которая запрашивает три точки. Первые две в теле основной функции, а третью - в классе Jig. Если при запросе второй точки я введу с клавиатуры число, то точка задастся на указанном расстоянии в направлении курсора. А вот при указании третьей точки эта "фишка" почему-то не срабатывает  :-\
Вроде все уже поперепробовал, но результата нужного не добился. Хотя, уверен, что проблема как всегда где-то на поверхности и я хожу рядом с ней и мимо))
Полный код функции прилагается:
Извините, вам запрещён просмотр содержимого спойлеров.

Отмечено как Решение Александр Пекшев aka Modis 22-06-2016, 00:28:03

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если в двух словах, то ты не туда поместил создание полилинии. WordDraw у тебя не вызывается при указании направления и расстояния.
Ну а вот исправленный код (кое-что пришлось подрихтовать лишнее, т.к. в очередной раз проявилась твоя невнимательность и ты показал не весь необходимый код для компиляции).
Код - C# [Выбрать]
  1. [CommandMethod("ModPlus", "mpPl-Rect3Pt", CommandFlags.Redraw)]
  2. public static void mpPl_Rect3Pt()
  3. {
  4.   var doc = AcApp.DocumentManager.MdiActiveDocument;
  5.   var db = doc.Database;
  6.   var ed = doc.Editor;
  7.   try
  8.   {
  9.     // first point
  10.     var ppo = new PromptPointOptions("\nУкажите первую точку: ")
  11.     {
  12.       UseBasePoint = false,
  13.       AllowNone = true
  14.     };
  15.  
  16.     var ppr = ed.GetPoint(ppo);
  17.     if (ppr.Status != PromptStatus.OK) return;
  18.     //var fPt = ModPlus.MpCadHelpers.UcsToWcs(ppr.Value);
  19.     var fPt = ppr.Value;
  20.     // second point
  21.     ppo = new PromptPointOptions("\nУкажите вторую точку: ")
  22.     {
  23.       UseBasePoint = true,
  24.       BasePoint = fPt,
  25.       UseDashedLine = true,
  26.       AllowNone = true
  27.     };
  28.  
  29.     ppr = ed.GetPoint(ppo);
  30.     if (ppr.Status != PromptStatus.OK) return;
  31.     var sPt = ppr.Value;
  32.     using (var tr = db.TransactionManager.StartTransaction())
  33.     {
  34.       // jig
  35.       var jig = new Rect3PtJig();
  36.       var jr = jig.StartJig(fPt, sPt);
  37.  
  38.       if (jr.Status != PromptStatus.OK) return;
  39.       // draw pline
  40.       var pline = jig.Poly();
  41.       var btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false);
  42.       btr.AppendEntity(pline);
  43.       tr.AddNewlyCreatedDBObject(pline, true);
  44.       tr.Commit();
  45.     }
  46.   }
  47.   catch (System.Exception exception)
  48.   {
  49.     ed.WriteMessage(exception.ToString());
  50.   }
  51. }
  52.  
  53. class Rect3PtJig : DrawJig
  54. {
  55.   private Point3d _prevPoint;
  56.   private Point3d _currPoint;
  57.   private Point3d _fPoint;
  58.   private Point3d _sPoint;
  59.   private Polyline _polyline;
  60.   private Editor ed;
  61.   public PromptResult StartJig(Point3d fPt, Point3d sPt)
  62.   {
  63.     _fPoint = fPt;//ModPlus.MpCadHelpers.UcsToWcs(fPt);
  64.     _sPoint = sPt;//ModPlus.MpCadHelpers.UcsToWcs(sPt);
  65.     _prevPoint = sPt;
  66.     _polyline = new Polyline();
  67.     ed = AcApp.DocumentManager.MdiActiveDocument.Editor;
  68.     PromptResult rs = ed.Drag(this);
  69.     if (rs.Status == PromptStatus.OK)
  70.     {
  71.       CalcPline();
  72.     }
  73.     return rs;
  74.  
  75.   }
  76.  
  77.   public Polyline Poly()
  78.   {
  79.     return _polyline;
  80.   }
  81.  
  82.   protected override SamplerStatus Sampler(JigPrompts prompts)
  83.   {
  84.     var jppo = new JigPromptPointOptions("\nУкажите третью точку: ")
  85.     {
  86.       UserInputControls = UserInputControls.Accept3dCoordinates |
  87.                           UserInputControls.NullResponseAccepted,
  88.  
  89.       BasePoint = _sPoint,
  90.       UseBasePoint = true,
  91.       Cursor = CursorType.RubberBand
  92.     };
  93.  
  94.     var ppr = prompts.AcquirePoint(jppo);
  95.  
  96.     if (ppr.Status != PromptStatus.OK)
  97.       return SamplerStatus.Cancel;
  98.  
  99.     if (ppr.Status == PromptStatus.OK)
  100.     {
  101.       _currPoint = ppr.Value;
  102.  
  103.       if (CursorHasMoved())
  104.       {
  105.         _prevPoint = _currPoint;
  106.         return SamplerStatus.OK;
  107.       }
  108.       return SamplerStatus.NoChange;
  109.     }
  110.        
  111.     return SamplerStatus.NoChange;
  112.   }
  113.  
  114.   void CalcPline()
  115.   {
  116.     // Строим временный отрезок из точки 1 в точку 2
  117.     var tmpLine = new Line(_fPoint, _sPoint);
  118.     // Строим три вспомогательных вектора
  119.     var vecCurrentToFirst = _currPoint - _fPoint;
  120.     var vecCurrentToSecond = _currPoint - _sPoint;
  121.     var vecSecondToFirst = _sPoint - _fPoint;
  122.     /* Определим катет в треугольнике, которй образуется текущей точкой и второй точкой
  123.     через угол между векторами
  124.     */
  125.     var katet = Math.Sin(vecCurrentToSecond.GetAngleTo(vecSecondToFirst)) * vecCurrentToSecond.Length;
  126.     // Найдем угол между вектором из текущей точки к первой точке и вспомогательной линией
  127.     var angleOnToTmpLinePlane = vecCurrentToFirst.GetAngleTo(vecSecondToFirst, tmpLine.Normal);
  128.     // Получим знак (направление) в зависимости от угла (изменим знак переменной "катет")
  129.     if (angleOnToTmpLinePlane < Math.PI)
  130.       katet = -katet;
  131.     // Получим 3 точку по направлению и катету и вектор
  132.     var thPoint = _sPoint + vecSecondToFirst.GetPerpendicularVector().GetNormal() * katet;
  133.     var vecThirdToSecond = thPoint - _sPoint;
  134.     // Получим 4 точку по тому-же принципу. Для откладывания длины использовать абс.значение!
  135.     Point3d fourPoint;
  136.     if (angleOnToTmpLinePlane < Math.PI)
  137.       fourPoint = thPoint - vecThirdToSecond.GetPerpendicularVector().GetNormal() * tmpLine.Length;
  138.     else fourPoint = thPoint + vecThirdToSecond.GetPerpendicularVector().GetNormal() * tmpLine.Length;
  139.     _polyline.Reset(true, 4);
  140.     _polyline.AddVertexAt(0, new Point2d(_fPoint.X, _fPoint.Y), 0.0, 0.0, 0.0);
  141.     _polyline.AddVertexAt(1, new Point2d(_sPoint.X, _sPoint.Y), 0.0, 0.0, 0.0);
  142.     _polyline.AddVertexAt(2, new Point2d(thPoint.X, thPoint.Y), 0.0, 0.0, 0.0);
  143.     _polyline.AddVertexAt(3, new Point2d(fourPoint.X, fourPoint.Y), 0.0, 0.0, 0.0);
  144.     _polyline.SetDatabaseDefaults();
  145.     _polyline.Closed = true;
  146.   }
  147.   protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  148.   {
  149.     CalcPline();
  150.     draw.Geometry.Draw(_polyline);
  151.     return true;
  152.   }
  153.   private bool CursorHasMoved()
  154.   {
  155.     return _currPoint.DistanceTo(_prevPoint) > Tolerance.Global.EqualPoint;
  156.   }
  157. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
т.к. в очередной раз проявилась твоя невнимательность
Невнимательность - мое проклятие  :-[
Если в двух словах, то ты не туда поместил создание полилинии. WordDraw у тебя не вызывается при указании направления и расстояния
Вроде понял. Получается, было так:
1. Я поместил курсор в какую-то часть экрана. Сработал метод WordDraw
2. Я ввел значение с клавиатуры. Jig завершилась, но полилиния вернулась неправильной, т.к. WordDraw больше не сработал
Т.е. получается, что значение расстояния (третьей точки) получалось как нужно, просто возвращалась неверная полилиния. Таким образом я пытался найти ошибку не там, где нужно было искать... Эххх...
Александр, в очередной раз огромное вам спасибо!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Таким образом я пытался найти ошибку не там, где нужно было искать... Эххх...
Угу. А если бы ты проанализировал _currPoint после выхода из jig, то понял бы это сам.
Кстати, у тебя в коде многократно создавалась полилиния и нигде не уничтожалась - жуткая утечка памяти.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Кстати, у тебя в коде многократно создавалась полилиния и нигде не уничтожалась - жуткая утечка памяти
Чувствую, что нужно выделить пару дней и перепроверить все Jig в моих функциях на условие этой "беды" ))