Изменение значений в панели Свойств

Автор Тема: Изменение значений в панели Свойств  (Прочитано 8945 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Здравствуйте.
Вопрос Александру Ривилису, вы выложили интересную статью "Как определить что свойства примитива изменены при помощи Панели Свойств в .NET?". Хорошая штука, но вот может вы ее доработаете, как определить имя поля в Панели свойств и категорию в которой это свойство находится. Иначе не воспользоваться этим примером на практике. А штука полезная.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
С категорией не получается - этой информации в событии нет. А свойства можно в событии получить: e.Property. Вот только это COM-объект, до которого не достучаться. Так что не зря этот класс Internal.
« Последнее редактирование: 03-11-2020, 16:21:31 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я написал в ADN DevHelp - может что-то и подскажут.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
как определить имя поля в Панели свойств и категорию в которой это свойство находится
Если определишь имя свойства, то можешь определить категорию.
Но придется делать это через рефлексию, извлекать информацию из типа.

Код - C# [Выбрать]
  1. public class DBText : Entity
  2. {
  3.         public DBText();
  4.         protected internal DBText( IntPtr unmanagedObjPtr, bool autoDelete );
  5.  
  6.         public bool IsDefaultAlignment { get; }
  7.         public Vector3d Normal { get; set; }
  8.         [Category( "Text" )]
  9.         [UnitType( UnitType.Distance )]
  10.         public double Thickness { get; set; }
  11.         [Category( "Text" )]
  12.         [UnitType( UnitType.AngleNotTransformed )]
  13.         public double Oblique { get; set; }
  14.  

[Category( "Text" )] Это и есть категория: Но определена не для каждого свойства. И в не локализованном виде.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Ну вот мне надо отследить изменение свойств OD (это свойства map3d)


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну вот мне надо отследить изменение свойств OD (это свойства map3d)
Без ответа от ADN DevHelp подсказать ничего не смогу. И не уверен, что их ответ будет распространятся на свойства OD. Скорее всего это будут только стандартные свойства примитива.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Ну вот мне надо отследить изменение свойств OD (это свойства map3d)
Насколько помню, свойства OD это присоединенные свойства со своим API.
Лучше поискать информацию об Object Data (OD)  в MAP 3D API https://knowledge.autodesk.com/ru/support/autocad-map-3d/getting-started/caas/simplecontent/content/map-3d-documentation.html
Возможно быстрее по OD подскажут в теме Civil 3D API

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Привалов Дмитрий,
Вопрос поставлен так: "Как узнать имя и категорию изменяемого свойства в панели свойств?". Так что та ссылка никак не поможет...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Вопрос поставлен так: "Как узнать имя и категорию изменяемого свойства в панели свойств?". Так что та ссылка никак не поможет...
Возможно в MAP 3D API есть события на изменения OD? Тогда можно будет получить и имя и категорию.

...немного вспомнил...уточняю. OD храняться не в объекте, а в "Object Data Dictionary". возможно нужно отслеживать изменения "Object Data Dictionary"
Когда разбирался, читать список OD (имя и значение) приходилось через MAP 3D API.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Я почему за этот пример зацепился... Мне показалось что он работает именно с окном свойств, мне не нужны другие события. Зная какое поле было изменено и значение поля, я бы мог производить манипуляции с выбранными объектами, например автоматически менять значение этого свойство в таблице. Это я для примера привёл OD, есть еще Наборы характеристик и многое другое.
Решение очень простое. Кстати, это событие отлично реагирует на изменение данных OD. Осталось получить имя поля.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Возможно в MAP 3D API есть события на изменения OD? Тогда можно будет получить и имя и категорию.
Согласен. Тоже считаю, что правильнее будет смотреть изменения в первоисточнике. А вот уже если это окажется невозможно, тогда использовать "окружной путь" через панель свойств.

Отмечено как Решение Александр Ривилис 28-11-2020, 21:06:15

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как определить что свойства примитива изменены при помощи Панели Свойств в .NET?

А вот и подсказка от ADN DevHelp:
1. Нужно создать Interop из acpi16.tlb из ObjectARX SDK\inc-64 (или из ObjectARX SDK\inc-Win32 - зависит от разрядности AutoCAD) (при помощи утилиты tlbimp.exe acpi16.tlb)
2. Подключить полученный ACPILib.dll как ссылку (Copy Local = False)
3. Добавить using ACPILib;

Итого:

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

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

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Спасибо Александр. Все отлично работает.   Причем на любых свойствах и на сивиловских пользовательских данных и на map3d. Думаю сработает и на PropertySet. Причем самое интересное я скачал сдк на 2020 а сборку подключил к 2018. И все работает. Спасибо