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

ADN Club => Revit API => Тема начата: Пашин Евгений от 17-03-2016, 08:21:17

Название: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 08:21:17
Всем, добрый день!

Ищу ответ на вопрос: как закрыть проект семейства, который я программно открыл...

Может я что-то не так делаю, но ...

Код - vb.net [Выбрать]
  1.     Private myCD As ExternalCommandData
  2.  
  3.     Public Sub Transfer_Single_Project(ByVal Project_Path As String)
  4.         ' Открываем требуемый документ
  5.         myCD.Application.OpenAndActivateDocument(Project_Path)
  6.         ' Объявляем переменные
  7.         Dim App As Autodesk.Revit.UI.UIApplication = myCD.Application()
  8.         Dim UIDoc As UIDocument = App.ActiveUIDocument
  9.         Dim Doc As Document = App.ActiveUIDocument.Document
  10.  
  11.         ' Здесь собственно код работы модуля
  12.         ' •••••••••••••••••••••••••••••••••••
  13.  
  14.         'Doc.Close(True) ' Не работает
  15.         'Doc.Close() ' Не работает
  16.  
  17.         UIDoc.SaveAndClose() ' Не работает
  18.  
  19.     End Sub

не работает.

Сохранение работает нормально, а вот закрытие проекта семейства никак!!! Что я еще не знаю про этот простой, на первый взгляд, процесс???
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Александр Ривилис от 17-03-2016, 08:30:12
http://thebuildingcoder.typepad.com/blog/2010/10/closing-the-active-document-and-why-not-to.html
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Александр Ривилис от 17-03-2016, 08:32:25
Альтернатива - переключиться на другой документ, а этот закрыть.
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 08:34:14
Александр Ривилис, Вы хоть представляете как я себя ужасно чувствую когда читаю это??? Я же пытаюсь закрыть проект из модального окна. Отправка нажатия клавиш вообще не вариант!!!

Ужас!!! Я даже не верю. Кто-то так пошутил?
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Александр Ривилис от 17-03-2016, 08:36:56
Ну тогда ждите. Возможно у Виктора есть альтернативное решение.
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 09:08:19
Альтернатива - переключится на другой документ, а этот закрыть.

Наверное это единственное решение в таком случае.

В моей задаче идет пакетная обработка семейств, она срочная и потому ждать нельзя ))) Спасибо за подсказку. Надеюсь, неактивный документ закрывать можно?
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 09:11:33
Александр Ривилис, а Вам не кажется странным, что метод есть, а использовать его нельзя? Это я так шучу :)
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Александр Ривилис от 17-03-2016, 09:19:07
Александр Ривилис, а Вам не кажется странным, что метод есть, а использовать его нельзя?
Его (как я понимаю) использовать можно, но (!!!) не с активным документом. В AutoCAD'е аналогично. Закрывать активный документ - это тоже самое, что пилить сук на котором сидишь. Это я так шучу.
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 09:23:24
Закрывать активный документ - это тоже самое, что пилить сук на котором сидишь. Это я так шучу.

Смешно :)

Но я-то не из «дерева» сделан:
1. Чтобы открыть модальное окно, я, предварительно, все равно хоть какой-то проект открываю (и он остается всегда открытым)
2. Я закрываю только то, что открыл.

И вот обломчик...
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 09:24:15
В AutoCAD'е аналогично.

Да, ладно? Ну есть же этому какое-то объяснение... Хотя бы ограничение сделали - НЕ ЗАКРЫВАТЬ хотя бы один-последний документ. У меня пользователи сейчас под потолок от этой новости будут прыгать от злости, что им пока придется это вручную закрывать )))
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Александр Ривилис от 17-03-2016, 09:45:34
И вот обломчик...
Так чего же обломчик, если ты можешь переключится на предыдущий проект перед тем как закрывать активный.
Цитата: Александр Ривилис от 17-03-2016, 08:19:07

    В AutoCAD'е аналогично.


Да, ладно?
Угу. Т.е. закрыть можно, но достаточно извращенным способом, зависящим от версии AutoCAD. При этом определённые вещи в AutoCAD работать не будут. Всё это называется zero document state
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 09:47:23
Спасибо за информацию, Александр Наумович!!!

Попробую, отпишусь )))
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Александр Ривилис от 17-03-2016, 09:56:01
Кстати, если бы ты пользовался поиском, то возможно нашёл и проверил бы такой вариант: http://thebuildingcoder.typepad.com/blog/2012/12/closing-the-active-document.html
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Виктор Чекалин от 17-03-2016, 09:59:37
Ну тогда ждите. Возможно у Виктора есть альтернативное решение.
Нет, альтернативные решения мне не встречались.
Справедливости ради хочу заметить, что мне тоже не понятно решение запретить закрывать активный документ. В принципе, в этом нет ничего противоестественного. Думаю это просто как то связанно с архитектурой API, и исторически так сложилось, что нельзя.
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Александр Ривилис от 17-03-2016, 10:02:17
Думаю это просто как то связанно с архитектурой API, и исторически так сложилось, что нельзя.
В AutoCAD это однозначно так. Он изначально был однодокументным до версии 2000 и этот режим сохранён в нём до сих пор.
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 10:26:52
Кстати, если бы ты пользовался поиском, то возможно нашёл и проверил бы такой вариант: http://thebuildingcoder.typepad.com/blog/2012/12/closing-the-active-document.html

Согласен, что я лентяй бываю :)
Справедливости ради хочу заметить, что мне тоже не понятно решение запретить закрывать активный документ.

Капелька бальзама на душу :)
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 10:50:51
Кстати, если бы ты пользовался поиском, то возможно нашёл и проверил бы такой вариант: http://thebuildingcoder.typepad.com/blog/2012/12/closing-the-active-document.html

Беглое чтение этой статьи привело меня к выводу, что в данном примере обязательно должен использоваться сторонний макрос и файл проекта. Ну с файлом проекта еще как-то решить можно, а вот пихать каждому пользователю макрос в Revit, видится мне как не самый лучший вариант. Но за подсказку большое спасибо!
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Виктор Чекалин от 17-03-2016, 12:14:08
обязательно должен использоваться сторонний макрос и файл проекта
Макрос не обязательно. нет ничего такого в макросах, чего нельзя было бы добиться полноценной надстройкой. Макрос просто приведен в качестве примера. А так ничто не мешает вам поместить этот код в полноценную надстройку. Файл проекта да, обязателен, так как именно в этом и состоит суть: открыть какой то файл проекта, перейти на него, и закрыть нужный. Правда можно ведь просто создать новый файл проекта, а не открывать уже существующий.
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 14:41:48
Окей, решение найдено, но оно «костыль»!!! Работает.

1. После того как проект изменен, нужно сначала закрыть все невидимые виды проекта

Код - vb.net [Выбрать]
  1.         Try
  2.             Dim myPC As RevitCommandId = RevitCommandId.LookupPostableCommandId(PostableCommand.CloseHiddenWindows)
  3.             App.PostCommand(myPC)
  4.         Catch ex As Exception
  5.             MsgBox(ex.Message)
  6.         End Try

2. Обязательно сохранить проект

Код - vb.net [Выбрать]
  1.         Dim App As Autodesk.Revit.UI.UIApplication = myCD.Application()
  2.         Dim UIDoc As UIDocument = App.ActiveUIDocument
  3.         Dim Doc As Document = App.ActiveUIDocument.Document
  4.  
  5.         Doc.Save()

3. Запускаем приложение, которое закрывает текущий проект. Андрей Калашников написал приложение, которое отсылает сочетание клавиш в окно Revit (на AutoIT-е). За это ему огромное спасибо!!!

Код - vb.net [Выбрать]
  1. Process.Start("C:\Users\Pashin.Evgeniy\Desktop\project_closer.exe")

4. Модуль должен работать не через модальное окно, а через кнопку на ленте (или после закрытия модального окна).

Имеется исходный код AutoIT-а:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs018.radikal.ru%2Fi528%2F1603%2F66%2Fce03f0a524fat.jpg&hash=8d09c1d5c7df61463f68a062bc586f06) (http://radikal.ru/fp/cb3231eccd3c4ffa9b02b0a3157b7ffa)

Приложение для закрытия текущего проекта - во вложении.


А вот результат работы модуля в купе с приложением

Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 17-03-2016, 14:49:25
Макрос не обязательно. нет ничего такого в макросах, чего нельзя было бы добиться полноценной надстройкой. Макрос просто приведен в качестве примера. А так ничто не мешает вам поместить этот код в полноценную надстройку. Файл проекта да, обязателен, так как именно в этом и состоит суть: открыть какой то файл проекта, перейти на него, и закрыть нужный. Правда можно ведь просто создать новый файл проекта, а не открывать уже существующий.

У меня не получилось данный пример запустить (закрыть проект и создать другой), поэтому сделал по-другому!
Название: Re: Закрытие открытых проектов в Revit
Отправлено: Пашин Евгений от 06-04-2016, 07:12:32
Забыл выложить решение по закрытию открытых проектов без стороннего приложения, если кому будет интересно:

Код - vb.net [Выбрать]
  1.         ' Пытаемся закрыть неактивные документы
  2.         Dim App As Autodesk.Revit.UI.UIApplication = myCD.Application()
  3.         Dim UIDoc As UIDocument = App.ActiveUIDocument
  4.         Dim Doc As Document = App.ActiveUIDocument.Document
  5.  
  6.         ' Получение списка открытых документов
  7.         Dim myDocSet As DocumentSet = Doc.Application.Documents
  8.  
  9.         For Each mydocset_Single As Document In myDocSet
  10.             Try
  11.                 Dim myNewDS As DocumentSet = Doc.Application.Documents
  12.                 If myNewDS.Size > 1 Then
  13.                     mydocset_Single.Close()
  14.                 End If
  15.             Catch ex As Exception
  16.             End Try
  17.         Next