Как по нажатию кнопки на собственной форме подключиться к текущему приложению

Автор Тема: Как по нажатию кнопки на собственной форме подключиться к текущему приложению  (Прочитано 14608 раз)

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

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
1. Имеется кнопка на ленте, при нажатии которой открывается форма.
2. На форме имеется кнопка, по нажатию которой хочу вывести сообщение о версии приложения.


Застрял на втором пункте ) Help, please!

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
На форме имеется кнопка, по нажатию которой хочу вывести сообщение о версии приложения.
Версию вашего приложения или версию Revit?

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Версию вашего приложения или версию 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-е. А затем брать из документа (семейства) нужную мне информацию.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Получить версию Revit - Application.VersionNumber - вернет только номер, Application.VersionName - вернет полное название.

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

Кстати,
Код - vb.net [Выбрать]
  1.         myNewForm.Show()
открывает модальную или немодальную форму? Рекомендую пока работать только с модальными. С немодальными гораздо сложнее. Для новичка не пойдет.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Я так понимаю вы только учитесь?

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

Кстати,
Код - 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.  



Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Смотрю на Revit_LookUp и понимаю, что мне хочется научиться создавать вещи не хуже, а может и по-интереснее. Не знаю кто автор этого модуля, но хочется сказать ему спасибо. Все свойства вижу как на ладони.

В общем, задача сводится к тому, чтобы научиться создавать что-то типа Revit_LookUp. А потом можно и к следующей задаче переходить.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Евгений,
Если только учитесь, то почему используете 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.  

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
задача сводится к тому, чтобы научиться создавать что-то типа Revit_LookUp
Слишком подняли вы планку:) Revit_Lookup далеко не легкое приложение для новичка.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Если только учитесь, то почему используете VB.Net, а не C#? Все таки C# гораздо распространеннее.

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

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

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

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

По поводу CommanData: у меня имеется ExternalCommandData - это подойдет?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
По поводу CommanData: у меня имеется ExternalCommandData - это подойдет?
Да, естественно. Я код на память писал, ошибся в названии класса. Нужен объект класса ExternalCommandData, а как он называется - это уже второстепенный вопрос.

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

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Отлично. В таком случае жду еще большое количество вопросов на форуме

Мы оживим этот раздел  :D

Отмечено как Решение Пашин Евгений 16-10-2015, 10:58:39

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Ну что же могу сказать: решение задачи найдено! Это было трудно... похоже, такова судьба НОВИЧКА!

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!


« Последнее редактирование: 22-10-2015, 08:30:05 от Пашин Евгений »

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Я думал в Revite проще все будет. Ошибался! Биться над этой задачей больше 3 часов - болезненно переношу!
На самом деле то что вы делали - по большому счету вообще к Revit отношения не имеет. Здесь из  Revit API - только свойство, которое возвращает номер версии.
Создание форм, открытие, конструктор, события, параметры - это все общие принципы программирования.
А работать с Revit API одно удовольствие, по сравнению с тем же AutoCAD API. Хотя это дело привычки:)

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Вам с вершины виднее  :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.  

и работает.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
форма, открытая в Revit-е должна быть инициализирована с Revit-ом  с самого начала!
C этого места по подробней. С какого начала?
Форму можно создать инициализировать когда угодно. Работа с формой осуществляется точно также как и в любом другом приложении. Revit вообще не имеет никакого отношения к инициализации формы. Вы сами решаете когда и где ее создавать и когда показывать.


Вообще первоначально спрашивали как номер версии вывести. Про какие-то мифические проблемы инициализации формы речи не шло. Так и не понял чем вы остались недовольны, и какую проблему вы решили "простым" кодом:
    Private myCD As ExternalCommandData
 
    Public Sub New(ByVal commandData As ExternalCommandData)
        MyBase.New()
        InitializeComponent()
        myCD = commandData
    End Sub