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

Автор Тема: Как определить что свойства примитива изменены при помощи Панели Свойств?  (Прочитано 26960 раз)

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

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А на .NET есть аналог? Если нет, то можно ли как-то из .NET использовать этот инструмент?

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А на .NET есть аналог? Если нет, то можно ли как-то из .NET использовать этот инструмент?
Шесть лет назад я уже отвечал на этот вопрос: https://forums.autodesk.com/t5/net/can-t-find-modelessoperationwill-start-event-in-dot-net/td-p/3444281
Без ObjectARX тут не обойтись.


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Спасибо!
Мда уж... Сложный костыль. Буду думать как по-другому сделать.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Мда уж... Сложный костыль. Буду думать как по-другому сделать.
Как вариант можно проверять:
Код - C# [Выбрать]
  1. DocumentCollection.DocumentLockModeWillChange
  2. DocumentCollection.DocumentLockModeChanged
Эти события тоже возникают при редактировании из Панели свойств. Но так как имени команды нет, то быть уверенным, что это из OPM нельзя.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Да, я посмотрел события через 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
Тоже как-то громоздко для проверки.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А что ты скажешь на это:
Код - 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. }


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Так ведь это как раз то, что нужно! Спасибо! :)

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Так ведь это как раз то, что нужно! Спасибо! :)
Надо будет опубликовать как статью. Я вижу что это должно работать как минимум с AutoCAD 2012.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Можно в эту же добавить - она уже давно должна быть проиндексирована всеми поисковиками.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно в эту же добавить - она уже давно должна быть проиндексирована всеми поисковиками.
Неа. Эта статья - перевод ADN-овской. А та чисто моё творчество. :-) Ничего подобного в интернете не нашел. Перекрестные ссылки конечно сделаю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Ну это уже Вам решать! Главное для меня - что я теперь могу отловить и обработать изменение объекта через палитру свойств и у меня теперь приложение не разваливается от этого действия! Ещё раз спасибо за такое простое решение и за то что Вы его быстро нашли! :)

Оффлайн Алексей Кузин

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Ух ты ж!!! Большое вам человеческое спасибо!  ::) ::) ::)

Оффлайн Алексей Кузин

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Рано обрадовался.  :( Обнаружены падения автокада. Пользуюсь 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)

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Рано обрадовался.  :( Обнаружены падения автокада. Пользуюсь Autocad MEP 2019.
Код обработчика события?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кузин

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Цитировать
Код обработчика события?
Пустой. Туда даже не доходит. Код подписки прям как у вас, только за исключением, что я подписываюсь при инициализации в IExtensionApplication

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А если подписаться на propertyDialogInvoked и propertyDialogDismissed ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кузин

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Цитировать
А если подписаться на propertyDialogInvoked и propertyDialogDismissed ?
Теперь работают диалоговые свойства, но падение происходит на простых.

В общем вроде нормально, если есть все 4 подписки. Я даже не думал что от этого может что то зависеть.
Вопрос теперь в том, откуда можно ещё ждать подводных камней, если использовать данный функционал.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В общем вроде нормально, если есть все 4 подписки.
Вот!
Я даже не думал что от этого может что то зависеть.
Видимо не контролируют была подписка или нет. Ну и возникает исключение. Нужно будет дополнить статью.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кузин

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Спасибо большое, Александр.

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 92
  • Карма: 11
Можно апнуть темку, на данный момент ModelessOperationEnded и ModelessOperationWillStart доступны в .net, с какой версии появились не скажу, но в net 4.7 с 2021 автокадом работают, случайно на них наткнулся в эвентах документа, когда начал решать вопрос с изменением свойств через окно, и .CommandEnded это не вылавливало. Решил почитать что это конкретно за событие и наткнулся на эту тему, оказывается раньше в .net оно было недоступно.