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

ADN Club => Другие продукты Autodesk => Navisworks API => Тема начата: wingsdraw от 24-11-2021, 12:50:12

Название: Автоматизация Navisworks
Отправлено: wingsdraw от 24-11-2021, 12:50:12
Доброго времени! С какой целью выполняется проверка .IsAutomated?

Код - C# [Выбрать]
  1. if(!Autodesk.Navisworks.Api.Application.IsAutomated)
  2.                     {
  3. PluginRecord pluginRecord = Autodesk.Navisworks.Api.Application.Plugins.FindPlugin("DockPanel.DP12");
  4.                        
  5. if (pluginRecord is DockPanePluginRecord && pluginRecord.IsEnabled)
  6.                         {
  7. DockPanePlugin docPanel = (DockPanePlugin)(pluginRecord.LoadedPlugin ?? pluginRecord.LoadPlugin());
  8.                             docPanel.ActivatePane();
  9.                         }    
  10.                     }

Такую проверку нет необходимости выполнять в этом случае (создание кнопки на панели инструментов):

Код - C# [Выбрать]
  1. public override int Execute(params string[] parameters)
  2.         {
  3.             MessageBox.Show("Box", "Title");
  4.  
  5.             return 0;
  6.         }

Где можно узнать подробнее про суть этого режима автоматизации?
Название: Re: Автоматизация Navisworks
Отправлено: Александр Ривилис от 24-11-2021, 17:43:15
Вот что говорит документация:
(https://live.staticflickr.com/65535/51702249638_9092b00c69_o.png)
Т.е. если это свойство true - не следует создавать диалоги, так как они прервут процесс автоматизации.


Название: Re: Автоматизация Navisworks
Отправлено: wingsdraw от 25-11-2021, 19:21:29
Спасибо за ответ! Вы смотрите "NET API.chm"? Документация по API c 2018 года совсем не менялась?

По этой строчке,

Код - C# [Выбрать]
  1. if (pluginRecord is DockPanePluginRecord && pluginRecord.IsEnabled)

 как такое может быть, что

Код - C# [Выбрать]
  1. pluginRecord is DockPanePluginRecord


ведь ссылаясь на https://www.bestprog.net/ru/2019/03/09/run-time-type-information-statements-is-as-examples-ru/ (https://www.bestprog.net/ru/2019/03/09/run-time-type-information-statements-is-as-examples-ru/)

Код - C# [Выбрать]
  1.  
  2. class BaseClass
  3. {
  4.     public int d;
  5. }
  6.  
  7. // производный класс от базового класса
  8. class DerivedClass:BaseClass
  9. {
  10.     public int dd;
  11. }
  12.  
  13. BaseClass bc = new BaseClass();
  14. DerivedClass dc = new DerivedClass();
  15. if (bc is DerivedClass)
  16.     Console.WriteLine("Объект bc есть совместим с DerivedClass");

"значение условия в операторе if равное false, так как объект базового класса не может быть совместим с производным классом. Однако, наоборот, объект производного класса есть совместим с базовым, так как, производный класс расширяет возможности базового класса."
Название: Re: Автоматизация Navisworks
Отправлено: Александр Ривилис от 25-11-2021, 19:34:27
Вы смотрите "NET API.chm"?
Да.
Документация по API c 2018 года совсем не менялась?
Нет.
как такое может быть, что
Что здесь не так, если Autodesk.Navisworks.Api.Application.IsAutomated == false, т.е. интерфейс есть и соответственно можно работать с панелями?
Название: Re: Автоматизация Navisworks
Отправлено: wingsdraw от 25-11-2021, 19:40:59
Цитировать
Что здесь не так, если Autodesk.Navisworks.Api.Application.IsAutomated == false, т.е. интерфейс есть

* В каком случае интерфейса может не быть?

* На сайте указанном выше говорится, что "объект базового класса не может быть совместим с производным классом" тогда почему такое возможно?

Код - C# [Выбрать]
  1. pluginRecord is DockPanePluginRecord
Название: Re: Автоматизация Navisworks
Отправлено: Александр Ривилис от 25-11-2021, 19:50:00
* В каком случае интерфейса может не быть?
Когда запущено через Automation:

(https://live.staticflickr.com/65535/51704272221_f047105528_o.png)

* На сайте указанном выше говорится, что "объект базового класса не может быть совместим с производным классом" тогда почему такое возможно?

Код - C# [Выбрать]

    pluginRecord is DockPanePluginRecord

Потому что в действительности pluginRecord не может быть просто экземпляром PluginRecord, так как это абстрактный класс:
Код - C# [Выбрать]
  1. public abstract class PluginRecord
В действительности pluginRecord экземпляр одного из классов наследников (в том числе может быть и DockPanePluginRecord)
Название: Re: Автоматизация Navisworks
Отправлено: wingsdraw от 26-11-2021, 17:42:30
Спасибо, что указали, что класс абстрактный, получается действительно, что что мы не приравниваем базовый класс к производному классу. Но как в этом разобраться,

Код - C# [Выбрать]
  1. В действительности pluginRecord экземпляр одного из классов наследников (в том числе может быть и DockPanePluginRecord)

* как можно точно понять какого класса этот экземпляр?

* Смотря на иерархию наследования, DockPanePluginRecord является производным от PluginRecord

(https://i.ibb.co/xJs96cw/IH.png) (https://imgbb.com/)

Из документации известно, что

(https://i.ibb.co/1J40FcP/prr.png) (https://ibb.co/mFPRfp2)
Название: Re: Автоматизация Navisworks
Отправлено: wingsdraw от 26-11-2021, 18:00:40
Как можно посмотреть конструктор?

(https://i.ibb.co/sPwhzDJ/13.png) (https://ibb.co/GJ2XN13)

В метадате похоже нет такой информации по возможным конструкторам

(https://i.ibb.co/LCtQJgD/cons.png) (https://imgbb.com/)
Название: Re: Автоматизация Navisworks
Отправлено: Александр Ривилис от 26-11-2021, 20:01:20
Как можно посмотреть конструктор?
Если нет своего конструктора, то смотри нет ли конструктора в родительском классе. Хотя вполне возможно, что конструктора нет ни у него, ни у родительского класса. И вообще через конструктор он не создаётся.
Название: Re: Автоматизация Navisworks
Отправлено: Александр Ривилис от 26-11-2021, 20:21:06
* как можно точно понять какого класса этот экземпляр?
Например, pluginRecord.GetType().FullName вернёт полное имя класса.