Сделать лист текущим по его имени.

Автор Тема: Сделать лист текущим по его имени.  (Прочитано 4629 раз)

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

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

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Добрый день, коллеги!

Подскажите как сделать лист чертежа текущим, зная лишь его имя? (Для текущего чертежа)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Сделать лист текущим по его имени.
« Ответ #1 : 18-05-2017, 08:33:34 »
Вообще-то так должно работать:
Код - C# [Выбрать]
  1. LayoutManager.Current.CurrentLayout = "<имя листа>";
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Сделать лист текущим по его имени.
« Ответ #2 : 18-05-2017, 08:52:01 »
Вообще-то так должно работать:

Увы, получаю eSetFailed:



Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.DatabaseServices
  3.  
  4.     Private Sub bMakeCurrent_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bMakeCurrent.ItemClick
  5.         Dim acLtMgr As LayoutManager = LayoutManager.Current
  6.         acLtMgr.CurrentLayout = "А0_гор"
  7.     End Sub

Может я что-то забыл подключить? [AutoCAD 2017 Rus \ Windows 10]

Отмечено как Решение Пашин Евгений 18-05-2017, 09:22:18

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Сделать лист текущим по его имени.
« Ответ #3 : 18-05-2017, 09:18:30 »
Попробуйте заблокировать документ. И еще иногда нужно вызывать регенерацию
Код - C# [Выбрать]
  1. using (DocumentLock documentLock = mdiActiveDocument.LockDocument())
  2. {
  3.     current.CurrentLayout = selectedItem.LayoutName;
  4.     mdiActiveDocument.Editor.Regen();
  5. }

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Сделать лист текущим по его имени.
« Ответ #4 : 18-05-2017, 09:24:22 »
Александр, благодарю, как камень с души спал.

Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.ApplicationServices
  2. Imports Autodesk.AutoCAD.Runtime
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4.     Private Sub bMakeCurrent_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bMakeCurrent.ItemClick
  5.         Dim RW As New galRegWork
  6.         Dim ParamVal As String = RW.RegGetValue(galRegWork.yeraParameter.CurrentLayoutName)
  7.         Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
  8.         Using docLock As DocumentLock = acDoc.LockDocument
  9.             Dim acLtMgr As LayoutManager = LayoutManager.Current
  10.             acLtMgr.CurrentLayout = ParamVal
  11.             acDoc.Editor.Regen()
  12.         End Using
  13.     End Sub

Попробуйте заблокировать документ. И еще иногда нужно вызывать регенерацию
В каких ещё моментах это требуется? Так, чтобы заранее знать.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Сделать лист текущим по его имени.
« Ответ #5 : 18-05-2017, 09:46:39 »
В каких ещё моментах это требуется? Так, чтобы заранее знать.
Про блокировку документа написано в справке:
Цитировать
Requests to modify objects or access AutoCAD can occur in any context, and coming from any number of applications. To prevent conflicts with other requests, you are responsible for locking a document before you modify it. Failure to lock the document in certain contexts will cause a lock violation during the modification of the database. You want to lock the document when your application:
Interacts with AutoCAD from a modeless dialog box
Accesses a loaded document other than the current document
Used as a COM server
Registers a command with the Session command flag
For example, when adding an entity to Model or Paper space in a document other than the current document, the document needs to be locked. You use the LockDocument method of the Database object you want to lock. When the LockDocument method is called, a DocumentLock object is returned.
Once you are done modifying the locked database, you need to unlock the database. To unlock the database, you call the Dispose method of the DocumentLock object. You can also use the Using statement with the DocumentLock object, once the Using statement ends the database is unlocked.
Note: When working in the context of a command that does not use the Session command flag, you do not need to lock the database for the current document before it is modified.
Хотя, обычно если не заблокировать документ, то получите соответствующую ошибку. Если бы вы обернули свой код в try{} catch{}, то скорей всего и получили бы эту ошибку

Про регенерацию - это из опыта. При установке текущего листа из контекста моего приложения не обновлялись вкладки листов. Т.е. лист становился активным, но в окне автокада на вкладке с листами не менялся. После некоторых опытов выяснил, что регенерация решает проблему

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Сделать лист текущим по его имени.
« Ответ #6 : 18-05-2017, 09:49:43 »
Александр, спасибо!
Interacts with AutoCAD from a modeless dialog box
Перевод: взаимодействие с AutoCAD из немодального окна.
Вот что мне мешало!!!

Получается, если я работаю из немодального окна, то блокировку документа мне нужно делать ВСЕГДА?!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Сделать лист текущим по его имени.
« Ответ #7 : 18-05-2017, 10:24:52 »
Получается, если я работаю из немодального окна, то блокировку документа мне нужно делать ВСЕГДА?!
Необходимость в блокировке возникает в случае если документ (а точнее его база) модифицируется. Если происходит только чтение информации, то можно не блокировать. Но так как не всегда со 100%-ой уверенностью можно понять не будет ли операции записи, то я бы рекомендовал блокировать документ из немодальных окон ВСЕГДА.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Сделать лист текущим по его имени.
« Ответ #8 : 18-05-2017, 10:30:55 »
Необходимость в блокировке возникает в случае если документ (а точнее его база) модифицируется. Если происходит только чтение информации, то можно не блокировать. Но так как не всегда со 100%-ой уверенностью можно понять не будет ли операции записи, то я бы рекомендовал блокировать документ из немодальных окон ВСЕГДА.

Спасибо, всё ясно. Буду впредь придерживаться данной рекомендации.