ADN Open CIS
Сообщество программистов Autodesk в СНГ

10/12/2018

Как определить что свойства примитива изменены при помощи Панели Свойств в .NET?

Вопрос: В ObjectARX как мы знаем есть возможность узнать, что свойства примитива изменены в Панели свойств (OPM). Этому посвящена статья Как определить что свойства примитива изменены при помощи Панели Свойств? А как можно это же сделать используя только средства .NET API?

Ответ: В AutoCAD .NET API есть недокументированное пространство имён Autodesk.AutoCAD.Internal.PropertyInspector, содержащее класс PropertyInspectorEventManager, который позволяет подписаться на события propertyWillChange (которое происходит перед началом изменения свойства) и propertyChanged (которое происходит сразу после изменения свойства). Им мы и воспользуемся для решения нашей задачи.
Внимание! Подписываться необходимо на все четыре события, так как в противном случае возникают исключения в неподписаных событиях.

Ниже готовый код:

Код - C#: [Выделить]
  1.  
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Internal.PropertyInspector;
  6.  
  7. // This line is not mandatory, but improves loading performances
  8. [assembly: CommandClass(typeof(Rivilis.OPMReactors))]
  9.  
  10. namespace Rivilis
  11. {
  12.   public class OPMReactors
  13.   {
  14.  
  15.     [CommandMethod("OPMReactorsStart")]
  16.     public void OPMReactorsStart()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       if (doc == null) return;
  20.       Editor ed = doc.Editor;
  21.       PropertyInspectorEventManager pim = PropertyInspectorEventManager.Instance();
  22.       pim.propertyDialogInvoked += propertyDialogInvoked;
  23.       pim.propertyDialogDismissed += propertyDialogDismissed;
  24.       pim.propertyWillChange += propertyWillChange;
  25.       pim.propertyChanged += propertyChanged;
  26.     }
  27.  
  28.     [CommandMethod("OPMReactorsStop")]
  29.     public void OPMReactorsStop()
  30.     {
  31.       PropertyInspectorEventManager pim = PropertyInspectorEventManager.Instance();
  32.       pim.propertyDialogInvoked -= propertyDialogInvoked;
  33.       pim.propertyDialogDismissed -= propertyDialogDismissed;
  34.       pim.propertyWillChange -= propertyWillChange;
  35.       pim.propertyChanged -= propertyChanged;
  36.     }
  37.  
  38.     private void propertyChanged(object sender, PropertyInspectorEventArgs e)
  39.     {
  40.       Document doc = Application.DocumentManager.MdiActiveDocument;
  41.       if (doc == null) return;
  42.       Editor ed = doc.Editor;
  43.       ed.WriteMessage("\npropertyChanged value = {0}", e.Value);
  44.       ed.PostCommandPrompt();
  45.     }
  46.  
  47.     private void propertyWillChange(object sender, PropertyInspectorEventArgs e)
  48.     {
  49.       Document doc = Application.DocumentManager.MdiActiveDocument;
  50.       if (doc == null) return;
  51.       Editor ed = doc.Editor;
  52.       ed.WriteMessage("\npropertyWillChanged value = {0}", e.Value);
  53.       ed.PostCommandPrompt();
  54.     }
  55.     private void propertyDialogInvoked(object sender, PropertyInspectorEventArgs e)
  56.     {
  57.       Document doc = Application.DocumentManager.MdiActiveDocument;
  58.       if (doc == null) return;
  59.       Editor ed = doc.Editor;
  60.       ed.WriteMessage("\npropertyDialogInvoked value = {0}", e.Value);
  61.       ed.PostCommandPrompt();
  62.     }
  63.  
  64.     private void propertyDialogDismissed(object sender, PropertyInspectorEventArgs e)
  65.     {
  66.       Document doc = Application.DocumentManager.MdiActiveDocument;
  67.       if (doc == null) return;
  68.       Editor ed = doc.Editor;
  69.       ed.WriteMessage("\npropertyDialogDismissed value = {0}", e.Value);
  70.       ed.PostCommandPrompt();
  71.     }
  72.   }
  73. }
  74.  

 

Автор: Александр Ривилис
Опубликовано 10.12.2018
Отредактировано 21.12.2018 в 15:19:09