Перерисовка Jig из окна Window?

Автор Тема: Перерисовка Jig из окна Window?  (Прочитано 3620 раз)

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Привет.
Делаю jig с окном настроек. Окно настроек открываю немодальное в процессе отрисовки.
Проблема: при изменениях в окне - нужно отвести мышку на чертеж, тогда сработает перерисовка jig.
Вопрос: как запустить перерисовку, когда мышка на окне?
Пробую вызвать самостоятельно jig.WorldDraw - но ничего не происходит  :-\

Тестовый пример ниже.


Извините, вам запрещён просмотр содержимого спойлеров.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Перерисовка Jig из окна Window?
« Ответ #1 : 12-10-2018, 21:24:53 »
Вильдар
Ну как минимум Utils.SetFocusToDwgView() нужен. Без этого ничего в Jig меняться не будет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Перерисовка Jig из окна Window?
« Ответ #2 : 13-10-2018, 13:26:31 »
Вильдар
Ну как минимум Utils.SetFocusToDwgView() нужен. Без этого ничего в Jig меняться не будет.
Это первое, что мы попробовали. Но автокаду этого мало - в момент вызова метода курсор находится над окном, а не в пространстве модели, и в итоге не срабатывает джига. Я предполагаю, что джиге нужно как-то сообщить, что сработало движение мышкой. Но как - мы не придумали

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Перерисовка Jig из окна Window?
« Ответ #3 : 13-10-2018, 15:51:20 »
Я предполагаю, что джиге нужно как-то сообщить, что сработало движение мышкой. Но как - мы не придумали
P/Invoke для SetCursorPos. Возможно есть аналог и в .NET
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Перерисовка Jig из окна Window?
« Ответ #4 : 17-10-2018, 16:10:02 »
Я подумал и решил, что идея с немодальным окном, в котором можно менять какие-то параметры для Jig - это неправильное решение. Правильным решением было бы использовать ключевое слово, по которому бы открывался модальный диалог и в котором уже можно было бы изменить всё что нужно. После этого запускается Jig по новой (Editor.Drag), но с новыми установками. IMHO.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Re: Перерисовка Jig из окна Window?
« Ответ #5 : 17-10-2018, 16:27:22 »
Да можно так сделать.
В окошке много настроек и каждое влияет на отрисовку, удобно, когда сразу видно что получается, и не нужно по-нескольку раз запускать окно настроек.
В целом, сейчас работает норм. И было бы еще "круче" без отведения мышки с окна для перерисовки.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Перерисовка Jig из окна Window?
« Ответ #6 : 19-10-2018, 20:11:42 »
Я подумал и решил, что идея с немодальным окном, в котором можно менять какие-то параметры для Jig - это неправильное решение. Правильным решением было бы использовать ключевое слово, по которому бы открывался модальный диалог и в котором уже можно было бы изменить всё что нужно. После этого запускается Jig по новой (Editor.Drag), но с новыми установками. IMHO.
Согласен! С точки зрения работы в AutoCAD - это как раз "традиционный" подход.
Если не обращать внимания на мелькание окна, то можно так сделать:
Код - C# [Выбрать]
  1. protected override bool WorldDraw(WorldDraw draw)
  2. {
  3.     view?.Restore();
  4.     if (draw == null)
  5.         return false;          
  6.     return
  7.         draw.Geometry.Circle
  8.         (pt,
  9.         view.Value ? 100 : 500,
  10.         Vector3d.ZAxis);
  11. }
  12.  
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Internal;
  2. using System;
  3. using System.Runtime.InteropServices;
  4. using System.Windows;
  5. using System.Windows.Input;
  6.  
  7. namespace AcadTest
  8. {
  9.     /// <summary>
  10.     /// Interaction logic for Window1.xaml
  11.     /// </summary>
  12.     public partial class Window1 : Window
  13.     {
  14.         [DllImport("User32.dll")]
  15.         private static extern bool SetCursorPos(int X, int Y);
  16.  
  17.         [DllImport("user32.dll")]
  18.         [return: MarshalAs(UnmanagedType.Bool)]
  19.         internal static extern bool GetCursorPos(ref Win32Point pt);
  20.  
  21.         [StructLayout(LayoutKind.Sequential)]
  22.         internal struct Win32Point
  23.         {
  24.             public Int32 X;
  25.             public Int32 Y;
  26.         };
  27.         public static Point GetMousePosition()
  28.         {
  29.             Win32Point w32Mouse = new Win32Point();
  30.             GetCursorPos(ref w32Mouse);
  31.             return new Point(w32Mouse.X, w32Mouse.Y);
  32.         }
  33.  
  34.         private readonly JigView jig;
  35.         private bool _value;        
  36.  
  37.         public Window1(JigView jig)
  38.         {
  39.             this.jig = jig;
  40.             InitializeComponent();
  41.         }
  42.  
  43.         bool _isTmpHidden;
  44.  
  45.         public bool Value
  46.         {
  47.             get => _value;
  48.             set
  49.             {
  50.                 _value = value;
  51.                 Point pt = GetMousePosition();
  52.                 SetCursorPos((int)pt.X + 1, (int)pt.Y + 1);
  53.                 this.Visibility = Visibility.Hidden;                
  54.                 _isTmpHidden = true;
  55.             }
  56.         }      
  57.  
  58.         public void Restore()
  59.         {
  60.             if (_isTmpHidden)
  61.             {
  62.                 this.Visibility = Visibility.Visible;
  63.                 _isTmpHidden = false;
  64.             }
  65.         }
  66.  
  67.         private void Window1_OnMouseLeave(object sender, MouseEventArgs e)
  68.         {
  69.             Utils.SetFocusToDwgView();
  70.         }
  71.     }
  72. }
  73.  
В целом, сейчас работает норм.
Ух, шикарно!

P.S. пришлось добавить небольшое смещение курсора, чтобы гарантированно запустилась перерисовка.
« Последнее редактирование: 19-10-2018, 20:43:04 от Дмитрий Загорулькин »

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Re: Перерисовка Jig из окна Window?
« Ответ #7 : 20-10-2018, 14:54:20 »
Дмитрий Загорулькин, да, так подходит. Немного дергается окно.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Перерисовка Jig из окна Window?
« Ответ #8 : 22-10-2018, 12:09:31 »
Видимо, добавили перемещение курсора на последнее его положение в чертеже при исчезновении окна? У меня не так красиво получалось. Центр окружностей всегда был под чекбоксом.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Re: Перерисовка Jig из окна Window?
« Ответ #9 : 22-10-2018, 16:05:48 »
Да, подхимичил немного  8)