Как определить что свойства примитива изменены при помощи Панели Свойств в .NET?
Вопрос: В ObjectARX как мы знаем есть возможность узнать, что свойства примитива изменены в Панели свойств (OPM). Этому посвящена статья Как определить что свойства примитива изменены при помощи Панели Свойств? А как можно это же сделать используя только средства .NET API?
Ответ: В AutoCAD .NET API есть недокументированное пространство имён Autodesk.AutoCAD.Internal.PropertyInspector, содержащее класс PropertyInspectorEventManager, который позволяет подписаться на события propertyWillChange (которое происходит перед началом изменения свойства) и propertyChanged (которое происходит сразу после изменения свойства). Им мы и воспользуемся для решения нашей задачи.
Внимание! Подписываться необходимо на все четыре события, так как в противном случае возникают исключения в неподписаных событиях.
Ниже готовый код:
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Internal.PropertyInspector;
- // This line is not mandatory, but improves loading performances
- [assembly: CommandClass(typeof(Rivilis.OPMReactors))]
- namespace Rivilis
- {
- public class OPMReactors
- {
- [CommandMethod("OPMReactorsStart")]
- public void OPMReactorsStart()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Editor ed = doc.Editor;
- PropertyInspectorEventManager pim = PropertyInspectorEventManager.Instance();
- pim.propertyDialogInvoked += propertyDialogInvoked;
- pim.propertyDialogDismissed += propertyDialogDismissed;
- pim.propertyWillChange += propertyWillChange;
- pim.propertyChanged += propertyChanged;
- }
- [CommandMethod("OPMReactorsStop")]
- public void OPMReactorsStop()
- {
- PropertyInspectorEventManager pim = PropertyInspectorEventManager.Instance();
- pim.propertyDialogInvoked -= propertyDialogInvoked;
- pim.propertyDialogDismissed -= propertyDialogDismissed;
- pim.propertyWillChange -= propertyWillChange;
- pim.propertyChanged -= propertyChanged;
- }
- private void propertyChanged(object sender, PropertyInspectorEventArgs e)
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Editor ed = doc.Editor;
- ed.WriteMessage("\npropertyChanged value = {0}", e.Value);
- ed.PostCommandPrompt();
- }
- private void propertyWillChange(object sender, PropertyInspectorEventArgs e)
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Editor ed = doc.Editor;
- ed.WriteMessage("\npropertyWillChanged value = {0}", e.Value);
- ed.PostCommandPrompt();
- }
- private void propertyDialogInvoked(object sender, PropertyInspectorEventArgs e)
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Editor ed = doc.Editor;
- ed.WriteMessage("\npropertyDialogInvoked value = {0}", e.Value);
- ed.PostCommandPrompt();
- }
- private void propertyDialogDismissed(object sender, PropertyInspectorEventArgs e)
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Editor ed = doc.Editor;
- ed.WriteMessage("\npropertyDialogDismissed value = {0}", e.Value);
- ed.PostCommandPrompt();
- }
- }
- }
Опубликовано 10.12.2018
Отредактировано 21.12.2018 в 15:19:09