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

ADN Club => Inventor API => Тема начата: R.I.Chernov от 21-03-2017, 16:16:26

Название: BrowserPane.Update()
Отправлено: R.I.Chernov от 21-03-2017, 16:16:26
Доброго времени суток. уважаемые форумчане. Помогите пожалуйста разобраться, как работает метод BrowserPane.Update(). Ситуация такая, меняю имена вхождений (+ добавляю новые) в папках браузера. Заметил. что не всегда корректно отображается содержимое папок в юраузере (если сохраняешь, закрываешь, открываешь --> отображается все ок). Стал разбираться, как это исправить. Нашел метод BrowserPane.Update(). Не пойму, то ли это, что мне надо? В частности мне не понятна такая вот фраза из описания "Should be used after changing browser node status (e.g. DisplayState)" Что это за статус? Что он означает? Как всегда рад любому совету / предположению.
Название: Re: BrowserPane.Update()
Отправлено: Александр Ривилис от 21-03-2017, 17:16:56
Что это за статус? Что он означает? Как всегда рад любому совету / предположению.
Вот что я нашёл: http://adndevblog.typepad.com/manufacturing/2012/12/inventor-displaystate-property-of-browsernodedefinition.html
Только не "Статус", а "Состояние".
Название: Re: BrowserPane.Update()
Отправлено: R.I.Chernov от 21-03-2017, 17:55:56
Вот что я нашёл: http://adndevblog.typepad.com/manufacturing/2012/12/inventor-displaystate-property-of-browsernodedefinition.html
Спасибо вам, Александр. Но то ли английский меня подводит, то ли владение программированием, яснее не стало:
Сначала вроде все понятно, что статус DisplayState  показывает состояние BrowserNodeDefinition. Он либо стоит "по умолчанию" kDefaultDisplayState, либо меняется, если было вмешательство с помощью API. Но код, который за этим следует, его смысл я совсем не понял. На выходе перебираются все вхождения, и выводится в дебагер их имена и то, включена ли в них адаптивность... Но как это связано с DisplayState?
Название: Re: BrowserPane.Update()
Отправлено: Александр Ривилис от 21-03-2017, 17:58:11
На выходе перебираются все вхождения, и выводится в дебагер их имена и то, включена ли в них адаптивность... Но как это связано с DisplayState?
Ну да. Чтобы посмотреть какие состояния DisplayState у BrowserNode в файле.
Название: Re: BrowserPane.Update()
Отправлено: R.I.Chernov от 21-03-2017, 18:06:48
Ну да. Чтобы посмотреть какие состояния DisplayState у BrowserNode в файле.
Не могли бы вы пояснить, каким образом мы смотрим это состояние? Адаптивность вхождений с ними же никак не связана?
Название: Re: BrowserPane.Update()
Отправлено: Александр Ривилис от 21-03-2017, 18:15:15
Похоже я влез не в свою тему.
Название: Re: BrowserPane.Update()
Отправлено: R.I.Chernov от 21-03-2017, 18:24:17
Похоже я влез не в свою тему.
Жаль :( В любом случае большое спасибо за участие. Попытаюсь еще разок осмыслить вашу ссылку, Владимир Николаевич обычно ерунды не пишет. :)
Название: Re: BrowserPane.Update()
Отправлено: Александр Ривилис от 21-03-2017, 18:39:37
У меня возникло подозрение, что если изменить для нода его DisplayState на kUpdateRequiredDisplayState, то BrowserPane.Update() обновит этот нод.
Название: Re: BrowserPane.Update()
Отправлено: R.I.Chernov от 21-03-2017, 19:16:55
У меня возникло подозрение, что если изменить для нода его DisplayState на kUpdateRequiredDisplayState, то BrowserPane.Update() обновит этот нод.
Имеете ввиду, что после изменения содержимого папки вручную менять свойство? Звучит резонно, быть может в инвенторе баг, и свойство само не всегда меняется, когда должно, из за чего и браузер не обновляется командой  BrowserPane.Update().
Название: Re: BrowserPane.Update()
Отправлено: R.I.Chernov от 21-03-2017, 22:21:27
У меня возникло подозрение, что если изменить для нода его DisplayState на kUpdateRequiredDisplayState, то BrowserPane.Update() обновит этот нод.

Не смог это сделать, может что посоветуете? Пробовал так:
Код - C# [Выбрать]
  1. oPane_ZKS.TopNode.BrowserNodes["TEST"].BrowserNodeDefinition.DisplayState = kUpdateRequiredDisplayState;
  2. // или
  3. oPane_ZKS.TopNode.BrowserNodes["TEST"].BrowserNodeDefinition.DisplayState = 46857;

В обоих строках компилятор выдает ошибку. Не могу вкурить, какой нужен синтаксис?

П.С. Кстати поэксперементировал, построил перебор BrowserNodeDefinition-ов всех "поднодов", все пишут "kDefaultDisplayState". Хотя, по идее, свойство DisplayState  не должно быть "дефолтным", так как в половине из них были изменения. Код остановлен "точкой останова" и визуально видно, что браузер еще не обновлен.
Название: Re: BrowserPane.Update()
Отправлено: R.I.Chernov от 21-03-2017, 22:50:15
С синтаксисом разобрался:
Код - C# [Выбрать]
  1. oPane_ZKS.TopNode.BrowserNodes["TEST"].BrowserNodeDefinition.DisplayState = Inventor.BrowserNodeDisplayStateEnum.kUpdateRequiredDisplayState;

Но проблемы это не решило. Рядом с папкой в браузере появляется красная молния (такая же появляется. например, когда деталь наследует свойства у другой детали, и когда вторая деталь-родитель была изменена). BrowserPane.Update() все также не работает. Более того, молния эта никуда не девается, даже после закрытия/открытия сборки - статус папки остается без изменения. Я программно все вернул, но стало мне казаться, что свойство это отвечает исключительно за визуализацию папок в браузере. Правдо непонятно, почему на него ссылаются в описании метода BrowserPane.Update(). В общем я опять в тупике.
Название: Re: BrowserPane.Update()
Отправлено: R.I.Chernov от 21-03-2017, 23:00:57
Не уверен, что до конца понял посыл автора следующей статьи, но выглядит как пример создания папок с различными визуальными эффектами:
http://spiderinnet2.typepad.com/blog/2013/07/inventor-net-ui-miscellaneous-create-custom-browser-pane-pt-3.html

Что опять таки говорит о том, быть может "BrowserNodeDefinition.DisplayState" совсем другие задачи решает?
Название: Re: BrowserPane.Update()
Отправлено: Александр Ривилис от 21-03-2017, 23:38:09
Что опять таки говорит о том, быть может "BrowserNodeDefinition.DisplayState" совсем другие задачи решает?
Похоже, что его задача лишь в установке иконки для узла.
Название: Re: BrowserPane.Update()
Отправлено: R.I.Chernov от 22-03-2017, 00:47:48
Похоже, что его задача лишь в установке иконки для узла.
Я тоже пришел к такому вывду. Но мне это не поможет. В англоязычных статьях на форумах, с вопросами на тему обновления браузера довольно часто в коде встречается метод BrowserPane.Refresh(). К сожалению, ни в 1 из топиков не было пометки "Solved". Так что разобраться толком я так и не смог, ибо непонятно, какая часть кода рабочая, какая нет. Судя по описанию, метод также может быть решением моей задачи. Но пока его использовать не получилось.
Название: Re: BrowserPane.Update()
Отправлено: R.I.Chernov от 25-03-2017, 17:04:27
Так и не нашел, как обновить браузер. После 3-4 манипуляций с вхождениями все равно начинает "глючить". B единственное, что спасает, это закрытие / открытие сборки. Решил попробовать пойти по этому пути. Создал кнопку для пользователя, с помощью которой программа быстро закрывает сборку, и снова ее открывает. Но после такой манипуляций слетают все ссылки на объекты в программе, которые были заданы при ее загрузке. Вопрос собственно такой, подскажите пожалуйста, каким образом можно заставить программу закрыться и снова себя открыть?
Название: Re: BrowserPane.Update()
Отправлено: Александр Ривилис от 25-03-2017, 21:21:38
Вопрос собственно такой, подскажите пожалуйста, каким образом можно заставить программу закрыться и снова себя открыть?
Зачем? Не проще ли заставить программу обновить свои данные? ;)
Название: Re: BrowserPane.Update()
Отправлено: R.I.Chernov от 25-03-2017, 21:28:13
Зачем? Не проще ли заставить программу обновить свои данные?
Каждый раз буду добавлять новые данные, или удалять старые, я буду вынужден менять код "обновление данных"? Рано или поздно это приведет к ошибке. Понятно, что я рассматриваю это, как план "Б". Но перезапустить программу было бы значительно проще, если это возможно
Название: Re: BrowserPane.Update()
Отправлено: Александр Ривилис от 25-03-2017, 21:32:38
Каждый раз буду добавлять новые данные, я буду вынужден менять код "обновление данных"?
Вынеси код "обновление данных" в отдельную функцию, которая обновляет данные при запуске программы и если её принудительно вызвать. Этого будет достаточно на все случаи жизни. Т.е. если у тебя данные будут добавляться, то модифицировать тебе придётся только одну эту функцию.
Название: Re: BrowserPane.Update()
Отправлено: Александр Ривилис от 25-03-2017, 21:37:18
если это возможно
Если это .NET-программа (dll-файл), то сомнительно, что ты её сможешь перезапустить. В AutoCAD это точно сделать нельзя, т.к. все программы в одном домене. В Inventor не знаю, но уверен на 99.9% что сама себя программа перезагрузить не сможет. Нужна будет другая программа, которая эту выгрузит, а потом загрузит и запустит на выполнение. Так что советую не искать приключений, а пойти по простейшему пути.