Последние сообщения

Последние сообщения

Страницы: [1] 2 3 ... 10
1
AutoCAD .NET API / Re: Перерисовка Jig из окна Window?
« Последний ответ от Вильдар 20-10-2018, 14:54:20 »
Дмитрий Загорулькин, да, так подходит. Немного дергается окно.
2
AutoCAD .NET API / Re: Перерисовка Jig из окна Window?
« Последний ответ от Дмитрий Загорулькин 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. пришлось добавить небольшое смещение курсора, чтобы гарантированно запустилась перерисовка.
3
AutoCAD .NET API / Re: еще один новичковый вопрос про Transaction
« Последний ответ от simson43 19-10-2018, 19:38:22 »
так все неоднозначно..
Спасибо!
4
И когда все таки следует использовать каждую транзакцию?
Когда хочешь тогда и используй. А можешь вообще не использовать, как я показывал. Разницу между транзакциями я уже объяснял. В твоём случае скорее всего AutoCAD вызывает неявно FlushGraphics в момент, когда ты запрашиваешь очередной сегмент (т.е. при вызове Editor.GetXXX)
5
AutoCAD .NET API / Re: еще один новичковый вопрос про Transaction
« Последний ответ от simson43 19-10-2018, 17:59:55 »
Помните недавно я в каждом цикле открывал транзакцию менял ширину сегмента полилинии, закрывал транзакцию и по новой.
Поменял на транзакцию бд перерисовка ширины все равно происходит (так и надо). В чем же тогда суть того метода в транзакции документа, который перерисовывает обьекты?
И когда все таки следует использовать каждую транзакцию?
6
Если я использую DrawJig для модификации объекта, то возможно ли во время работы DrawJig "спрятать" объект-исходник?
Что-то я не понимаю идею. DrawJig как раз для того и сделан, чтобы показывать объект во время модификации. Если этого не нужно делать - значит не надо просто использовать DrawJig. Зачем он тогда нужен? Или в изначальном вопросе не описан какой-то нюанс?
В самом вопросе есть и код и gif'ка, показывающая результат его работы. Там видно, что происходит.
Вообще, вопрос 3-х летней давности))
7
Если я использую DrawJig для модификации объекта, то возможно ли во время работы DrawJig "спрятать" объект-исходник?
Что-то я не понимаю идею. DrawJig как раз для того и сделан, чтобы показывать объект во время модификации. Если этого не нужно делать - значит не надо просто использовать DrawJig. Зачем он тогда нужен? Или в изначальном вопросе не описан какой-то нюанс?
8
Пробовал применить acedInvoke, но при вызове получал access violation. Не стал разбираться, вернулся к acedEvaluateLisp.
И правильно сделал.
9
Хотя CommandFlags.Redraw - не то же самое сделает?
Это совсем из другой оперы. Этот флаг для работы с набором предварительного выбора.
10
AutoCAD .NET API / Re: еще один новичковый вопрос про Transaction
« Последний ответ от avc 19-10-2018, 14:08:06 »
Я как раз и имел ввиду, что вместе с коммитом будут существенные задержки на отображение объектов, которые могут быть в экстремальных случаях больше, чем вся работа внутри транзакции. Так что смысла обращаться к такой транзакции не вижу. Лучше уж явно вызвать перерисовку в самом конце обработчика событий или команды. И то надо еще проверить - во многих случаях Автокад сам все переририсовывает без лишних намеков.
Можно использовать транзакции документа для отдельных простых команд с одной транзакцией. Хотя CommandFlags.Redraw - не то же самое сделает?
Внутри сложных методов, где имеет смысл заводить отдельную транзакцию (если вообще имеет смысл), однозначно предпочтительней не обращаться к документу и к его менеджеру транзакций. Потом такой метод можно будет применить, не открывая документа. Да еще и производительность оказывается выигрывает.
Страницы: [1] 2 3 ... 10