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

Статьи => Опубликованные статьи => Тема начата: Александр Ривилис от 04-08-2013, 17:04:42

Название: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Александр Ривилис от 04-08-2013, 17:04:42
Как определить что свойства примитива изменены при помощи Панели Свойств? (http://adn-cis.org/kak-opredelit-chto-svojstva-primitiva-izmenenyi-pri-pomoshhi-paneli-svojstv.html)
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Дмитрий Загорулькин от 10-12-2018, 16:26:01
А на .NET есть аналог? Если нет, то можно ли как-то из .NET использовать этот инструмент?
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Александр Ривилис от 10-12-2018, 16:47:29
А на .NET есть аналог? Если нет, то можно ли как-то из .NET использовать этот инструмент?
Шесть лет назад я уже отвечал на этот вопрос: https://forums.autodesk.com/t5/net/can-t-find-modelessoperationwill-start-event-in-dot-net/td-p/3444281
Без ObjectARX тут не обойтись.


Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Дмитрий Загорулькин от 10-12-2018, 17:04:14
Спасибо!
Мда уж... Сложный костыль. Буду думать как по-другому сделать.
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Александр Ривилис от 10-12-2018, 17:09:11
Мда уж... Сложный костыль. Буду думать как по-другому сделать.
Как вариант можно проверять:
Код - C# [Выбрать]
  1. DocumentCollection.DocumentLockModeWillChange
  2. DocumentCollection.DocumentLockModeChanged
Эти события тоже возникают при редактировании из Панели свойств. Но так как имени команды нет, то быть уверенным, что это из OPM нельзя.
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Дмитрий Загорулькин от 10-12-2018, 17:15:06
Да, я посмотрел события через MGDDBG. При изменении свойства объекта блокировка документа меняется 8 раз:
[Doc Mgr Event] : Document Lock Mode Will Change : Чертеж1.dwg
    Global Command Name  :
    Current Mode         : NotLocked
    My Current Mode      : NotLocked
    My New Mode          : ProtectedAutoWrite
[Doc Mgr Event] : Document Lock Mode Changed : Чертеж1.dwg
    Global Command Name  :
    Current Mode         : ProtectedAutoWrite
    My Current Mode      : NotLocked
    My Previous Mode     : ProtectedAutoWrite
Команда:
[Doc Mgr Event] : Document Lock Mode Will Change : Чертеж1.dwg
    Global Command Name  : PARTIALREGEN
    Current Mode         : NotLocked
    My Current Mode      : NotLocked
    My New Mode          : Write
[Doc Mgr Event] : Document Lock Mode Will Change : Чертеж1.dwg
    Global Command Name  : #
    Current Mode         : AutoWrite
    My Current Mode      : AutoWrite
    My New Mode          : NotLocked
[Doc Mgr Event] : Document Lock Mode Changed : Чертеж1.dwg
    Global Command Name  : #
    Current Mode         : NotLocked
    My Current Mode      : AutoWrite
    My Previous Mode     : NotLocked
[Doc Mgr Event] : Document Lock Mode Changed : Чертеж1.dwg
    Global Command Name  : PARTIALREGEN
    Current Mode         : Write
    My Current Mode      : NotLocked
    My Previous Mode     : Write
[Doc Mgr Event] : Document Lock Mode Will Change : Чертеж1.dwg
    Global Command Name  : #PARTIALREGEN
    Current Mode         : Write
    My Current Mode      : Write
    My New Mode          : NotLocked
[Doc Mgr Event] : Document Lock Mode Changed : Чертеж1.dwg
    Global Command Name  : #PARTIALREGEN
    Current Mode         : NotLocked
    My Current Mode      : Write
    My Previous Mode     : NotLocked
Тоже как-то громоздко для проверки.
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Александр Ривилис от 10-12-2018, 18:05:13
А что ты скажешь на это:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Internal.PropertyInspector;
  5.  
  6. // This line is not mandatory, but improves loading performances
  7. [assembly: CommandClass(typeof(Rivilis.OPMReactors))]
  8.  
  9. namespace Rivilis
  10. {
  11.   public class OPMReactors
  12.   {
  13.  
  14.     [CommandMethod("OPMReactorsStart")]
  15.     public void OPMReactorsStart()
  16.     {
  17.       Document doc = Application.DocumentManager.MdiActiveDocument;
  18.       if (doc == null) return;
  19.       Editor ed = doc.Editor;
  20.       PropertyInspectorEventManager pim = PropertyInspectorEventManager.Instance();
  21.       pim.propertyWillChange += propertyWillChange;
  22.       pim.propertyChanged += propertyChanged;
  23.     }
  24.  
  25.     [CommandMethod("OPMReactorsStop")]
  26.     public void OPMReactorsStop()
  27.     {
  28.       PropertyInspectorEventManager pim = PropertyInspectorEventManager.Instance();
  29.       pim.propertyWillChange -= propertyWillChange;
  30.       pim.propertyChanged -= propertyChanged;
  31.     }
  32.  
  33.     private void propertyChanged(object sender, PropertyInspectorEventArgs e)
  34.     {
  35.       Document doc = Application.DocumentManager.MdiActiveDocument;
  36.       if (doc == null) return;
  37.       Editor ed = doc.Editor;
  38.       ed.WriteMessage("\npropertyChanged");
  39.     }
  40.  
  41.     private void propertyWillChange(object sender, PropertyInspectorEventArgs e)
  42.     {
  43.       Document doc = Application.DocumentManager.MdiActiveDocument;
  44.       if (doc == null) return;
  45.       Editor ed = doc.Editor;
  46.       ed.WriteMessage("\npropertyWillChanged");
  47.     }
  48.   }
  49. }


Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Дмитрий Загорулькин от 10-12-2018, 18:22:41
Так ведь это как раз то, что нужно! Спасибо! :)
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Александр Ривилис от 10-12-2018, 18:24:21
Так ведь это как раз то, что нужно! Спасибо! :)
Надо будет опубликовать как статью. Я вижу что это должно работать как минимум с AutoCAD 2012.
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Дмитрий Загорулькин от 10-12-2018, 18:29:06
Можно в эту же добавить - она уже давно должна быть проиндексирована всеми поисковиками.
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Александр Ривилис от 10-12-2018, 18:31:14
Можно в эту же добавить - она уже давно должна быть проиндексирована всеми поисковиками.
Неа. Эта статья - перевод ADN-овской. А та чисто моё творчество. :-) Ничего подобного в интернете не нашел. Перекрестные ссылки конечно сделаю.
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Дмитрий Загорулькин от 10-12-2018, 18:58:00
Ну это уже Вам решать! Главное для меня - что я теперь могу отловить и обработать изменение объекта через палитру свойств и у меня теперь приложение не разваливается от этого действия! Ещё раз спасибо за такое простое решение и за то что Вы его быстро нашли! :)
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Алексей Кузин от 20-12-2018, 23:47:58
Ух ты ж!!! Большое вам человеческое спасибо!  ::) ::) ::)
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Алексей Кузин от 21-12-2018, 13:57:33
Рано обрадовался.  :( Обнаружены падения автокада. Пользуюсь Autocad MEP 2019.

Вылеты происходят когда щелкаю на свойства, которые вызывают открытие диалогового окна. Например для "Takeoff Position", "Connection details".

Цитировать
Application does not support just-in-time (JIT)
debugging. See the end of this message for details.

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
   at Autodesk.AutoCAD.Internal.PropertyInspector.PropertyInspectorEventManager.FirepropertyDialogInvoked(IUnknown* pProp, tagVARIANT* pValue, IntPtr pParent, Int32 mode)
   at Autodesk.AutoCAD.Internal.PropertyInspector.AcEdPropertyInspectorReactorImpl.propertyDialogInvoked(AcEdPropertyInspectorReactorImpl* , IUnknown* pProp, tagVARIANT* pValue, HWND__* hParent, Int32 mode)
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Александр Ривилис от 21-12-2018, 14:00:18
Рано обрадовался.  :( Обнаружены падения автокада. Пользуюсь Autocad MEP 2019.
Код обработчика события?
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Алексей Кузин от 21-12-2018, 14:20:53
Цитировать
Код обработчика события?
Пустой. Туда даже не доходит. Код подписки прям как у вас, только за исключением, что я подписываюсь при инициализации в IExtensionApplication
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Александр Ривилис от 21-12-2018, 14:26:34
А если подписаться на propertyDialogInvoked и propertyDialogDismissed ?
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Алексей Кузин от 21-12-2018, 14:35:33
Цитировать
А если подписаться на propertyDialogInvoked и propertyDialogDismissed ?
Теперь работают диалоговые свойства, но падение происходит на простых.

В общем вроде нормально, если есть все 4 подписки. Я даже не думал что от этого может что то зависеть.
Вопрос теперь в том, откуда можно ещё ждать подводных камней, если использовать данный функционал.
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Александр Ривилис от 21-12-2018, 14:37:51
В общем вроде нормально, если есть все 4 подписки.
Вот!
Я даже не думал что от этого может что то зависеть.
Видимо не контролируют была подписка или нет. Ну и возникает исключение. Нужно будет дополнить статью.
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: Алексей Кузин от 21-12-2018, 14:39:14
Спасибо большое, Александр.
Название: Re: Как определить что свойства примитива изменены при помощи Панели Свойств?
Отправлено: alz от 22-06-2023, 09:26:49
Можно апнуть темку, на данный момент ModelessOperationEnded и ModelessOperationWillStart доступны в .net, с какой версии появились не скажу, но в net 4.7 с 2021 автокадом работают, случайно на них наткнулся в эвентах документа, когда начал решать вопрос с изменением свойств через окно, и .CommandEnded это не вылавливало. Решил почитать что это конкретно за событие и наткнулся на эту тему, оказывается раньше в .net оно было недоступно.