Исчезновение объектов DrawJig при открытии формы.

Автор Тема: Исчезновение объектов DrawJig при открытии формы.  (Прочитано 3437 раз)

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

Оффлайн alzАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
В общем проблема следующая, есть группа объектов, отображаемая через DrawJig, есть форма, которая управляет параметрами этих объектов, открывается она по клику на объекте, собственно если навести мышку на объект, и не дергая ее хотя бы пол секунды кликнуть то все прекрасно, все объекты отрисованы, форма появляется. Если же кликнуть на объекте во время движения мыши, то при открытии формы вся графика, отображаемая через Jig исчезает пока форма не закроется.
Попытался решить эту проблему, открытием формы во время отрисовки, что бы успело перерисоваться перед открытием, теперь вся графика не пропадает, но появилось небольшое моргание, перед открытием формы, если курсор стоит на месте, и изменения отображаются только при следующей перерисовке, тут уже требуется подвинуть именно область видимости или масштаб, движения курсора ничего не обновляют.
В общем есть смысл пытаться тут что-то сделать, или записать в фичи и не париться? В принципе прям критического ничего нет.
Пример на видео.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Надо смотреть реализацию. Может перерисовку пореже сделать надо. Может эксепшн какой вылетает при отрисовке. А форма вызывается через автокадовские методы, надеюсь?

Оффлайн alzАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Пробовал и автокадовским и виндовым, аналогично работает, то есть аналогично багается), использую виндовый, потому что ему можно положение на месте клика задать, автокадовским постоянно где-то слева вылазит.
Частотой перерисовки я собственно и не управляю, даж хз как это сделать, знал бы просто перерисовал принудительно перед вызовом формы и не парился, тут походу при движении курсора автокад планирует перерисовку, а так как в этот момент открывается форма, и фокус на ней, потерявший фокус автокад ждет пока фокус на него вернется, для перерисовки, а это происходит только после закрытия формы.

Код ниже, убрал куски точно к делу не относящиеся, а то не влезет в сообщение.

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.DatabaseServices;
  2. using Autodesk.AutoCAD.EditorInput;
  3. using Autodesk.AutoCAD.Geometry;
  4. using System.Collections.Generic;
  5. using CivilNetwork;
  6. using System.Windows.Forms;
  7. using System.Linq;
  8. using System;
  9.  
  10. namespace Function
  11. {
  12.     public class TypeBorderJig : DrawJig
  13.     {
  14.         //переменные из настроек
  15.         private double per = CivilNetwork.Properties.Settings.Default.typeBoxHeight;
  16.         private double theight = CivilNetwork.Properties.Settings.Default.typeTextHeight;
  17.         private bool inBlock = CivilNetwork.Properties.Settings.Default.block;
  18.         private bool rlBorder = CivilNetwork.Properties.Settings.Default.rlBorder;
  19.         private bool duBorder = CivilNetwork.Properties.Settings.Default.duBorder;
  20.         //списко элементов области данных для отрисовки и последующей вставки в чертеж
  21.         private List<Entity> finalEnt = new List<Entity>();
  22.         //класс в котором хранится строка с типом покрытия передаваемая из формы
  23.         StringLink _stringLink = new StringLink();
  24.         //эдитор
  25.         readonly Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;    
  26.         //шаг процесса в работе
  27.         private int currentFactornumber = 1;  
  28.         //точка полученная из эдитора джига
  29.         private Point3d _visiblePoint = new Point3d();
  30.         //точка полученная из обычного эдитора
  31.         private Point3d _computedPoint = new Point3d();
  32.         //окончательный вариант точки, используемый в работе
  33.         private Point3d _currentPoint = new Point3d();
  34.         //сохраняемая точка
  35.         private Point3d _savePoint = new Point3d();
  36.         //исходная трасса
  37.         private Curve _cur;
  38.         //список с точками и метками на трассе
  39.         private List<(Point3d gpoint, (Point3d tppoint, string pok, double angle))> _data = new List<(Point3d gpoint, (Point3d tppoint, string pok, double angle))> ();
  40.         //списко точек и текстов меток на трассе для отрисовки
  41.         private List<Entity> _ent = new List<Entity> ();    
  42.         //переменная для использования обычного эдитора
  43.         private bool _pm = false;
  44.         //переменная для хранения положения области
  45.         private Point3d _position = new Point3d();
  46.         //результат для возврата
  47.         private PromptResult _res;
  48.  
  49.  
  50.         public PromptResult Drow(
  51.             Curve curve,    
  52.             bool pm
  53.             )
  54.         {
  55.             _cur = curve;
  56.             _pm = pm;
  57.             if (_pm) ed.PointMonitor += new PointMonitorEventHandler(ed_PointMonitor);
  58.             AddPoint(_cur.EndPoint);    
  59.             PromptResult jigRes;
  60.             while (true)
  61.             {
  62.                 jigRes = ed.Drag(this);
  63.                 if (jigRes.Status == PromptStatus.Cancel)
  64.                 {
  65.                     if (currentFactornumber == 3)
  66.                     {        
  67.                         //отмена
  68.                         return jigRes;
  69.                     }
  70.                     if (currentFactornumber == 4)
  71.                     {
  72.                         //созхраняем объекты в базе данных
  73.                         AddFinalEntToDatabase();
  74.                         return jigRes;
  75.                     }    
  76.                     //переходим к следующему шагу
  77.                     else currentFactornumber++;
  78.                 }
  79.                 if (jigRes.Status == PromptStatus.OK)
  80.                 {
  81.                     if (currentFactornumber == 1)
  82.                     {
  83.                         //добавляем точки
  84.                         AddPoint(_currentPoint);
  85.                     }
  86.                     if (currentFactornumber == 2)
  87.                     {
  88.                         //изменяем типы
  89.                         AddType();                                        
  90.                     }
  91.                     if (currentFactornumber == 3)
  92.                     {    
  93.                          //фиксируем объекты в выбранном месте и переходим к следующему шагу
  94.                         _res = jigRes;
  95.                         _position = _currentPoint;
  96.                         currentFactornumber++;
  97.                         _stringLink.SetMenu(true);
  98.                     }
  99.                     if (currentFactornumber == 4)
  100.                     {      
  101.                         //редактируем объекты
  102.                         Red();                  
  103.                     }
  104.                 }
  105.                 //отмена
  106.                 if (jigRes.Status == PromptStatus.Keyword && currentFactornumber == 4) return _res;    
  107.             }
  108.         }
  109.         void ed_PointMonitor(object sender, PointMonitorEventArgs e)
  110.         {
  111.             if (e.Context.PointComputed && (e.Context.History & PointHistoryBits.ObjectSnapped) > 0)
  112.                 _computedPoint = e.Context.ObjectSnappedPoint;
  113.             else
  114.                 _computedPoint = e.Context.ComputedPoint;        
  115.         }      
  116.         protected override SamplerStatus Sampler(JigPrompts prompts)
  117.         {
  118.             JigPromptPointOptions jigOpts = new JigPromptPointOptions();          
  119.             switch (currentFactornumber)
  120.             {
  121.                 case 1:
  122.                     {
  123.                         jigOpts.Message = "\nВыберите точки изменения типов покрытий (Повторный выбор уберет точку, Esc - закончить выбор): ";
  124.                         break;
  125.                     }
  126.                 case 2:
  127.                     {                      
  128.                         jigOpts.SetMessageAndKeywords("\nВыберите типы покрытий на заданных интервалах(закончить установку - Esc, вернуться к установке точек - [R]):", "R");                        
  129.                         break;
  130.                     }
  131.                 case 3:
  132.                     {                      
  133.                         jigOpts.SetMessageAndKeywords("\nВыберите точку вставки (Перейти к редактированию - Esc,  вернуться к выбору покрытий - [R]:", "R");                        
  134.                         break;
  135.                     }
  136.                 case 4:
  137.                     {
  138.                         jigOpts.SetMessageAndKeywords("\nОтредактируйте если требуется(оставить в чертеже  - Esc,  вернуться к установке места вставки покрытий - R, завершить программу - S [R/S]:", "R S");    
  139.                         break;
  140.                     }
  141.                 default: break;
  142.             }          
  143.             jigOpts.UserInputControls =              
  144.                     UserInputControls.Accept3dCoordinates |
  145.                     UserInputControls.NoZeroResponseAccepted;            
  146.             var jigRes = prompts.AcquirePoint(jigOpts);
  147.             if (jigRes.Status == PromptStatus.Keyword)
  148.             {
  149.                 if (jigRes.StringResult == "R")
  150.                 {
  151.                     if (finalEnt.Count > 0) finalEnt.Clear();                    
  152.                     currentFactornumber--;
  153.                     if (currentFactornumber < 4) _stringLink.SetMenu(false);
  154.                 }              
  155.                 return SamplerStatus.NoChange;
  156.             }
  157.             var pt = jigRes.Value;
  158.             if (_pm) _visiblePoint = _computedPoint;
  159.             else _visiblePoint = pt;
  160.             if (_savePoint == pt)
  161.             {
  162.                 _savePoint = pt;
  163.                 return SamplerStatus.NoChange;
  164.             }
  165.             _savePoint = pt;
  166.             _currentPoint = _visiblePoint;
  167.             if (jigRes.Status == PromptStatus.OK)
  168.                 return SamplerStatus.OK;
  169.             return SamplerStatus.Cancel;
  170.         }
  171.         protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  172.         {          
  173.             foreach (Entity e in _ent)
  174.             {
  175.                 draw.Geometry.Draw(e);
  176.             }
  177.             switch (currentFactornumber)
  178.             {
  179.                 case 1:
  180.                     {
  181.                         break;
  182.                     }
  183.                 case 2:
  184.                     {                                            
  185.                         break;
  186.                     }
  187.                 case 3:
  188.                     {
  189.                         CreateFinalEnt(_currentPoint);
  190.                         foreach (Entity e in finalEnt)
  191.                         {
  192.                             draw.Geometry.Draw(e);
  193.                         }
  194.                         break;
  195.                     }
  196.                 case 4:
  197.                     {
  198.                         foreach (Entity e in finalEnt)
  199.                         {
  200.                             draw.Geometry.Draw(e);
  201.                         }                      
  202.                         break;
  203.                     }
  204.                 default: break;
  205.             }            
  206.             return true;            
  207.         }
  208.         private void Red()
  209.         {
  210.             if (_currentPoint.Y > _position.Y && _currentPoint.Y < (_position.Y + per) && _currentPoint.X > _position.X && _currentPoint.X < (_position.X + _cur.GetLength()))
  211.             {
  212.                 for (int i = 0; i < _data.Count; i++)
  213.                 {
  214.                     (Point3d gpoint, (Point3d tppoint, string pok, double angle)) current = _data[i];
  215.                     double distL;
  216.                     double distR = _data[i].gpoint.Z0().DistanceTo(_cur.StartPoint.Z0());
  217.                     double cdist = _currentPoint.X - _position.X;
  218.                     if (i == 0) distL = 0;
  219.                     else distL = _data[i - 1].gpoint.Z0().DistanceTo(_cur.StartPoint.Z0());
  220.                     if (cdist > distL && cdist < distR)
  221.                     {
  222.                         _stringLink.SetString(current.Item2.pok);
  223.                         _stringLink.SetangleChange(false);  
  224.                         //запуск формы
  225.                         GetType gt = new GetType(_stringLink);
  226.                         DialogResult dr = gt.ShowDialog();
  227.                         //DialogResult dr = Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(gt);
  228.                         if (dr == DialogResult.OK)
  229.                         {
  230.                             current.Item2.pok = _stringLink.GetString();
  231.                             if (string.IsNullOrEmpty(current.Item2.pok)) current.Item2.angle = 0;
  232.                             else
  233.                             {
  234.                                 if (_stringLink.GetangleChange())
  235.                                 {
  236.                                     if (current.Item2.angle == 0) current.Item2.angle = Math.PI / 2;
  237.                                     else current.Item2.angle = 0;
  238.                                 }
  239.                             }                          
  240.                             _data[i] = current;
  241.                             CreateEntities();
  242.                             CreateFinalEnt(_position);                        
  243.                         }
  244.                         break;
  245.                     }
  246.                 }
  247.             }          
  248.         }
  249.         private void AddType()
  250.         {        
  251.             double mindist = 0.2;
  252.             int ci = -1;
  253.             (Point3d gpoint, (Point3d tppoint, string pok, double angle)) closest = _data[0];
  254.             for (int i = 0; i < _data.Count; i++)
  255.             {
  256.                 (Point3d gpoint, (Point3d tppoint, string pok, double angle)) current = _data[i];
  257.                 double dist = current.Item2.tppoint.Z0().DistanceTo(_currentPoint.Z0());
  258.                 if (dist < mindist)
  259.                 {
  260.                     mindist = dist;
  261.                     closest = current;
  262.                     ci = i;
  263.                 }
  264.             }
  265.             if (ci >= 0)
  266.             {
  267.                 _stringLink.SetString(closest.Item2.pok);
  268.                 //запуск формы
  269.                 GetType gt = new GetType(_stringLink);          
  270.                 DialogResult dr = gt.ShowDialog();
  271.                 if (dr == DialogResult.OK)
  272.                 {
  273.                     closest.Item2.pok = _stringLink.GetString();
  274.                     _data[ci] = closest;
  275.                     CreateEntities();
  276.                 }    
  277.             }          
  278.         }    
  279.     }
  280. }
  281.