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

ADN Club => Revit API => Тема начата: Пашин Евгений от 15-10-2015, 15:29:57

Название: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 15-10-2015, 15:29:57
1. Имеется кнопка на ленте, при нажатии которой открывается форма.
2. На форме имеется кнопка, по нажатию которой хочу вывести сообщение о версии приложения.


Застрял на втором пункте ) Help, please!
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Виктор Чекалин от 15-10-2015, 15:44:26
На форме имеется кнопка, по нажатию которой хочу вывести сообщение о версии приложения.
Версию вашего приложения или версию Revit?

А загвоздка то в чем? как версию получить, или как окно отобразить и запихнуть туда текст?
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 15-10-2015, 15:49:55
Версию вашего приложения или версию Revit?

Revit.

А загвоздка то в чем? как версию получить, или как окно отобразить и запихнуть туда текст?

Если просто сделать команду, тогда получается так:

Код - vb.net [Выбрать]
  1. Imports Autodesk.Revit.DB
  2. Imports Autodesk.Revit.UI
  3. Imports Autodesk.Revit.Attributes
  4. Imports Autodesk.Revit.ApplicationServices
  5.  
  6.  
  7. <Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.ReadOnly)> _
  8. Public Class Water_Mark_Form
  9.     Implements Autodesk.Revit.UI.IExternalCommand
  10.  
  11.     Public Function Execute( _
  12.             ByVal commandData As Autodesk.Revit.UI.ExternalCommandData, _
  13.             ByRef message As String, _
  14.             ByVal elements As Autodesk.Revit.DB.ElementSet) _
  15.             As Autodesk.Revit.UI.Result _
  16.             Implements Autodesk.Revit.UI.IExternalCommand.Execute
  17.  
  18.         Dim myNewForm As New Form1
  19.  
  20.         myNewForm.Show()
  21.  
  22.         Return Autodesk.Revit.UI.Result.Succeeded
  23.     End Function
  24. End Class
  25.  

А как теперь сделать что-нибудь в Revit-е при нажатии кнопки самой формы, вот в чем загвоздка. Ну, к примеру, я прошу выдать сообщение о версии Revit-а.

PS: Загвоздка в том, что мне нужно подключиться к текущему документу в Revit-е. А затем брать из документа (семейства) нужную мне информацию.
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Виктор Чекалин от 15-10-2015, 16:09:19
Получить версию Revit - Application.VersionNumber - вернет только номер, Application.VersionName - вернет полное название.

что мне нужно подключиться к текущему документу в Revit-е
Я так понимаю вы только учитесь?:) Вопросы пока слишком простые, но в тоже время сложные для меня, так как я не очень пойму чего добиться то хотите.
До текущего документа можно добраться из параметра commandData
Код - C# [Выбрать]
  1. var document =
  2.                 commandData.Application.ActiveUIDocument.Document;
Если он нужен в форме, то его нужно передать в эту форму. Через конструктор например.

Кстати,
Код - vb.net [Выбрать]
  1.         myNewForm.Show()
открывает модальную или немодальную форму? Рекомендую пока работать только с модальными. С немодальными гораздо сложнее. Для новичка не пойдет.
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 16-10-2015, 07:00:26
Я так понимаю вы только учитесь?

Вы совершенно правы  :)

Кстати,
Код - vb.net: [Выделить]
        myNewForm.Show()
открывает модальную или немодальную форму? Рекомендую пока работать только с модальными.

Модальную.

Насчет commandData: подскажите, что нужно еще подключить (пространства имен или библиотеки), чтобы этот параметр отображался? С помощью какой команды можно совершить подключение?

этот код не работает:
Код - C# [Выбрать]
  1. var document =
  2.                 commandData.Application.ActiveUIDocument.Document;
  3.  

потому что чего-то не хватает системе.

В ленте я создал кнопку, по нажатию которой открывается форма (модально), а на форме есть кнопка, по нажатию которой хочу вывести сообщение о версии Revit-а.
В итоге, что нужно вставить внутрь, чтобы получилось вывести сообщение о версии Revit-а?

Код - vb.net [Выбрать]
  1.  
  2. Imports Autodesk.Revit.DB
  3. Imports Autodesk.Revit.UI
  4. Imports Autodesk.Revit.Attributes
  5. Imports Autodesk.Revit.ApplicationServices
  6.  
  7. Public Class Form1
  8.  
  9.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  10.  
  11.         ' Что сюда вставить, чтобы отобразить версию revit-а?
  12.  
  13.     End Sub
  14. End Class
  15.  
  16.  


Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 16-10-2015, 07:43:45
Смотрю на Revit_LookUp и понимаю, что мне хочется научиться создавать вещи не хуже, а может и по-интереснее. Не знаю кто автор этого модуля, но хочется сказать ему спасибо. Все свойства вижу как на ладони.

В общем, задача сводится к тому, чтобы научиться создавать что-то типа Revit_LookUp. А потом можно и к следующей задаче переходить.
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Виктор Чекалин от 16-10-2015, 08:02:45
Евгений,
Если только учитесь, то почему используете VB.Net, а не C#? Все таки C# гораздо распространеннее.
Понятно, что есть всякие конвертеры и т.п., но это только в крайнем случае.
От меня по крайней мере кода на VB.Net вы не увидите:)
Так что если объективных причин использовать VB.Net - нет, то пока не поздно, лучше переключитесь на C#.

Насчет commandData: подскажите, что нужно еще подключить (пространства имен или библиотеки), чтобы этот параметр отображался? С помощью какой команды можно совершить подключение?

этот код не работает:
Все уже подключено. Код не работает скорей всего потому, что я написал его на C#.
commandData - это параметр метода Execute(). Это объект класса ExternalCommandData. У этого объекта есть свойства, в т.ч. и свойство Application, у которого в свою очередь есть свойство ActiveUIDocument и т.п.
Это базовые вещи программирования. А как до них добраться и как объявлять переменные в конкретном языке программирования, в данном случае VB.Net - вы должны знать:)
Наверное что то типа
Код - vb.net [Выбрать]
  1. Dim doc As Document
  2. doc = commandData.Application.ActiveUIDocument.Document
Модальную.
Пока скажу просто - используйте модальную.


' Что сюда вставить, чтобы отобразить версию revit-а?
Версию можно получить взяв соответствующее свойство у объекта Application, а его можно получить только от объекта commandData, который у вас есть в при вызове метода Execute. Передаете  commandData в конструкторе формы и затем используете его в форме.
Могу часть на C# привести:
Код - C# [Выбрать]
  1. class Form1 : Form
  2. {
  3.     //переменная хранит объект commanData    
  4.     private CommanData _commandData ;
  5.    
  6.      public Form1(CommandData commandData)
  7.      {
  8.            _commandData = commandData;
  9.      }
  10.  
  11.      public void Button1_OnClick(...)
  12.      {
  13.               var app = commandData.Application;
  14.               var version = app.VersionNumber;
  15.               MessageBox.Show(version);
  16.      }
  17. }
  18.  
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Виктор Чекалин от 16-10-2015, 08:03:39
задача сводится к тому, чтобы научиться создавать что-то типа Revit_LookUp
Слишком подняли вы планку:) Revit_Lookup далеко не легкое приложение для новичка.
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 16-10-2015, 08:25:46
Если только учитесь, то почему используете VB.Net, а не C#? Все таки C# гораздо распространеннее.

Не спорю. Я понимаю и C# и VB. Мне по-большому счету просто нравится VB. Я вырос, можно сказать, на нем  :) Я пока на стадии изучения C#. Быстро не получается по ряду причин, но я не стою на месте. По крайней мере обучение по Revit API я проходил на C# и поверьте у меня все получалось, в рамках обучения.

От меня по крайней мере кода на VB.Net вы не увидите:)

За это не переживайте, я сумею тоже самое сотворить и на VB (пока окончательно не перейду на C#).
Вы пишите мне на C#, а я буду переделывать на VB. За меня не переживайте.

Слишком подняли вы планку:) Revit_Lookup далеко не легкое приложение для новичка.
Слава богу, что Вы не сказали, что это «НЕВОЗМОЖНО»  :)
Передо мной стоят несколько задач, которые должны быть выполнены до Нового года... их сложность меня нисколько не беспокоит. Я знаю, что придется выложиться на 100%.

По поводу CommanData: у меня имеется ExternalCommandData - это подойдет?
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Виктор Чекалин от 16-10-2015, 08:48:40
По поводу CommanData: у меня имеется ExternalCommandData - это подойдет?
Да, естественно. Я код на память писал, ошибся в названии класса. Нужен объект класса ExternalCommandData, а как он называется - это уже второстепенный вопрос.

что это «НЕВОЗМОЖНО» 
Совсем невозможного практически нет ничего. Просто некоторые вещи слишком трудоемки и не совсем не целесообразны)

несколько задач, которые должны быть выполнены до Нового года
Отлично. В таком случае жду еще большое количество вопросов на форуме
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 16-10-2015, 08:55:20
Отлично. В таком случае жду еще большое количество вопросов на форуме

Мы оживим этот раздел  :D
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 16-10-2015, 10:58:16
Ну что же могу сказать: решение задачи найдено! Это было трудно... похоже, такова судьба НОВИЧКА!

Off-Topic: показать
Жесть, просто геморрой. Я думал в Revite проще все будет. Ошибался! Биться над этой задачей больше 3 часов - болезненно переношу!


Итак, чтобы это сделать, нужно:

1. Создать класс с командой, которая запускает пользовательскую форму (свойство TopMost=True).

Код - vb.net [Выбрать]
  1. <Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.ReadOnly)> _
  2. Public Class Water_Mark_Form
  3.  
  4.     Implements Autodesk.Revit.UI.IExternalCommand
  5.  
  6.     Public Function Execute(ByVal commandData As Autodesk.Revit.UI.ExternalCommandData, ByRef message As String, ByVal elements As Autodesk.Revit.DB.ElementSet) _
  7.             As Autodesk.Revit.UI.Result Implements Autodesk.Revit.UI.IExternalCommand.Execute
  8.  
  9.         Dim myNewForm As New Form1(commandData)
  10.         myNewForm.Show()  ' можно и myNewForm.ShowDialog()
  11.         Return Autodesk.Revit.UI.Result.Succeeded
  12.     End Function
  13. End Class
  14.  



2. Создать форму, установить на нее кнопку и прописать код.

Код - vb.net [Выбрать]
  1. Imports Autodesk.Revit
  2. Imports Autodesk.Revit.UI
  3.  
  4. Public Class Form1
  5.  
  6.     Private myCD As ExternalCommandData
  7.  
  8.     Public Sub New(ByVal commandData As ExternalCommandData)
  9.         MyBase.New()
  10.         InitializeComponent()
  11.         myCD = commandData
  12.     End Sub
  13.  
  14.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  15.         ' Что сюда вставить, чтобы отобразить версию revit-а?
  16.         Dim App As Autodesk.Revit.UI.UIApplication = myCD.Application
  17.         MsgBox(App.Application.VersionNumber)
  18.     End Sub
  19.  
  20. End Class
  21.  


Работает на Revit 2015!


Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Виктор Чекалин от 16-10-2015, 11:14:54
Я думал в Revite проще все будет. Ошибался! Биться над этой задачей больше 3 часов - болезненно переношу!
На самом деле то что вы делали - по большому счету вообще к Revit отношения не имеет. Здесь из  Revit API - только свойство, которое возвращает номер версии.
Создание форм, открытие, конструктор, события, параметры - это все общие принципы программирования.
А работать с Revit API одно удовольствие, по сравнению с тем же AutoCAD API. Хотя это дело привычки:)
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 16-10-2015, 11:22:32
Вам с вершины виднее  :D

Дело в том, что даже если к Revit это не имеет никакого отношения, но суть остается таковой, что форма, открытая в Revit-е должна быть инициализирована с Revit-ом  с самого начала!

Откуда же я мог это знать? Думал, что создание формы и подключение к приложению (как а AutoCAD-е) можно выполнять отдельно.

Теперь будем знать, что в Revit-е это работает иначе.

Перебрал все, что только мог, а итоге все оказалось проще:

Код - vb.net [Выбрать]
  1.     Private myCD As ExternalCommandData
  2.  
  3.     Public Sub New(ByVal commandData As ExternalCommandData)
  4.         MyBase.New()
  5.         InitializeComponent()
  6.         myCD = commandData
  7.     End Sub
  8.  

и работает.
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Виктор Чекалин от 16-10-2015, 11:37:03
форма, открытая в Revit-е должна быть инициализирована с Revit-ом  с самого начала!
C этого места по подробней. С какого начала?
Форму можно создать инициализировать когда угодно. Работа с формой осуществляется точно также как и в любом другом приложении. Revit вообще не имеет никакого отношения к инициализации формы. Вы сами решаете когда и где ее создавать и когда показывать.


Вообще первоначально спрашивали как номер версии вывести. Про какие-то мифические проблемы инициализации формы речи не шло. Так и не понял чем вы остались недовольны, и какую проблему вы решили "простым" кодом:
    Private myCD As ExternalCommandData
 
    Public Sub New(ByVal commandData As ExternalCommandData)
        MyBase.New()
        InitializeComponent()
        myCD = commandData
    End Sub
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 16-10-2015, 12:04:40
C этого места по подробней. С какого начала?

Я может действительно не понимаю о чем идет речь, НО:
При нажатии кнопки на ленте происходит открытие формы с помощью маленького кода:

Код - vb.net [Выбрать]
  1.         Dim myNewForm As New Form1()
  2.         myNewForm.Show()
  3.  

но что в данном коде не так? Дело в том, что форма открылась, а связи с Revit-ом у нее НЕТу. Это просто форма, которая болтается, как кошка: «сама по-себе». Всеми правдами и неправдами я пытался найти способ вывести сообщение о версии приложения Revit через эту «свободную от Revit-а форму». У меня это не получилось!

Затем я решил попробовать при запуске формы передать в процедуру ее инициализации ту самую переменную CommandData:

Код - vb.net [Выбрать]
  1.         Dim myNewForm As New Form1(commandData) ' Вот эта переменная (объект)
  2.         myNewForm.Show()
  3.  

и прописал процедуру ее инициализации с входящим в нее аргументом commandData:

Код - vb.net [Выбрать]
  1.     Public Sub New(ByVal commandData As ExternalCommandData)
  2.         MyBase.New()
  3.         InitializeComponent()
  4.         myCD = commandData
  5.     End Sub
  6.  

Получилось так, что я передал форме в момент «ее рождения» тот самый объект - commandData. Типа сделал связку с Revit-ом. Понимаете о чем я? То есть я не подключал ExternalCommandData, как экземпляр класса, внутри класса формы, а получил ее извне - из той процедуры, которая создала эту форму.

И поверьте мне - другого решения я не смог найти.

Вообще первоначально спрашивали как номер версии вывести. Про какие-то мифические проблемы инициализации формы речи не шло.

Я понимаю... мне действительно стоило подробнее написать об этой задаче, но увы... Буду стараться впредь писать подробнее.

мифические проблемы

Может и так, но я реально столкнулся с тем, что объявляя переменную Private myCommandData As ExternalCommandData привело меня к тому, что Revit просто сказал мне, что нет экземпляра этого класса. И я его понимаю. Это как если бы мне сказали: «К тебе человек должен прийти и ты должен ему кое-что дать... А я бы им в ответ: какой человек? Как его зовут? Как выглядит этот человек?» и т.д.

Недоволен тем остался, что долго искал ответ. Других недовольств у меня нет.
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Виктор Чекалин от 16-10-2015, 12:39:43
но что в данном коде не так?
В коде все так. Он делает ровно столько, сколько вы написали:)

Я кажется понял в чем проблема. Есть такая штука, называется статические классы (https://msdn.microsoft.com/ru-ru/library/79b3xss3.aspx). В AutoCAD, на сколько я помню, Application является статическим классом, а значит вы можете получить к нему доступ отовсюду.
У статических классов есть, собственно как и у всего остального, свои преимущества и недостатки.
В Revit подобного нет, доступ к приложению или к документу можно получить только в определенных местах. Назвать это недостатком ни в коем случае нельзя.
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 16-10-2015, 12:41:45
Назвать это недостатком ни в коем случае нельзя.

Я бы и не посмел  :)

Назовем это - ОСОБЕННОСТЬ.  :D
Название: Re: Как по нажатию кнопки на собственной форме подключиться к текущему приложению
Отправлено: Пашин Евгений от 16-10-2015, 12:50:32
Есть такая штука, называется статические классы.

Спасибо за ссылку. Все встало на свои места.