Как скрывать палитру на стартовой страничке

Автор Тема: Как скрывать палитру на стартовой страничке  (Прочитано 8376 раз)

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

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

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Обычные палитры Автокада исчезают, когда пользователь выбирает нечертежный лист Start. Моя самодельная палитра (PaletteSet) остается видимой. И появляется на экране сразу после старта автокада, когда вообще ничего не открыто, кроме Start, хотя я проверяю, что MdiActiveDocument != null. Такое ощущение, что автокад создает какой-то чертеж при загрузке, потом его уничтожает и показывает Start. Может есть какой-то способ пометить, что моя палитра - только для чертежных листов. Или обязательно отлавливать события переключения документов?

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Проверил в отладчике - чудеса. Автокад загружается, создает документ drawing1.dwg, запускает команду создания моей палитры, закрывает документ и показывает Start.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Значит у тебя остаётся только один вариант - отлавливать события создания/удаления/переключения документов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Два варианта:
1. Как и сказал Александр Ривилис - отлавливать события создания/удаления/переключения документов и на основе этих событий скрывать/показывать палитру
2. В самой палитре учесть наличие открытых документов. Т.е. палитра всегда показывается, но работа ее ограничена и это ограничение нужно учитывать в коде

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Два варианта:
Переформулирую: 1. Заморачиваться 2. Не париться :)
Раз нет встроенной отключалки, то предпочту второе. Пусть окошко Start будет слегка некрасивым. Не такая уж беда. Все функции палитры у меня и так уже заблокированны, если нет выбранных объектов.
Спасибо!

Отмечено как Решение avc 17-01-2017, 18:33:34

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Значит у тебя остаётся только один вариант - отлавливать события создания/удаления/переключения документов.
Да, наверное, достаточно будет только события Application.DocumentManager.DocumentActivated.
Код - C# [Выбрать]
  1. static bool m_isAutoOff = false;
  2.  
  3. // ...
  4.  
  5. static void DocumentManager_DocumentActivated(object sender, DocumentCollectionEventArgs e)
  6. {
  7.     if (e.Document == null && m_paletteSet.Visible)
  8.     {
  9.         m_paletteSet.Visible = false;
  10.         m_isAutoOff = true;
  11.     }
  12.     else if (e.Document != null && !m_paletteSet.Visible && m_isAutoOff)
  13.     {
  14.         m_paletteSet.Visible = true;
  15.         m_isAutoOff = false;
  16.     }
  17. }
  18.  
« Последнее редактирование: 17-01-2017, 23:13:47 от Дмитрий Загорулькин »

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Да, наверное, достаточно будет только события Application.DocumentManager.DocumentActivated.
Как изящно-то! Мне виделось, что всю систему автоматического открытия палитр придется похоронить и переписать по своему. А вона как все просто :) Проверено, работает (с доработочками, конечно)

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Отлично! Надо бы тоже добавить к моим палитрам эту фишку  :)
А доработки косметические, или я что-то важное упустил?

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Нет, у вас все зачетно, кроме одной точки с запятой ;)
А доработки - это я сам упустил, что отключаю все прерывания по событию смены статуса палитры, когда статус палитры становится Hide. Соответственно, палитру уже было не вернуть.
Ну и те, кого не обсуждаем, похоже капитально наколбасили в ACAD2017 с отключением событий у Editor. Editor.SelectionAdded -= Editor_SelectionAdded - просто игнорируется, а Editor.SelectionRemoved -= Editor_SelectionRemoved вызывает феерическое окошко с кнопочками Прервать/Продолжить. Я такого вообще не видел не разу. И никаких Exception. Но это уже не по теме.
Нам ли привыкать искать пути в обход :)

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Editor.SelectionRemoved -= Editor_SelectionRemoved вызывает феерическое окошко с кнопочками Прервать/Продолжить. Я такого вообще не видел не разу. И никаких Exception.
Я сегодня такое окошко словил при попытке выполнить Editor.SelectionAdded -= Editor_SelectionAdded. Поймал в AutoCAD Civil 3D 2016, возможно, что и в других версиях есть такое. Появляется, если до этого не было подписки на это событие, то есть не выполнялось Editor.SelectionAdded += Editor_SelectionAdded. Пришлось ввести дополнительную переменную с булевым значением, чтобы контролировать, была ли выполнена подписка ранее или нет:
Код - C# [Выбрать]
  1. static bool m_SelAdded = false;
  2.  
  3. //...
  4.  
  5. ed.SelectionAdded += Ed_SelectionAdded;
  6. m_SelAdded = true;
  7.  
  8. //...
  9.  
  10. if (m_SelAdded)
  11. {
  12.     ed.SelectionAdded -= Ed_SelectionAdded;
  13.     m_SelAdded = false;
  14. }
  15.  
С этим дополнением проблем нет, проверил сейчас специально в 2017 версии. Поэтому, не подтверждаю, что:
похоже капитально наколбасили в ACAD2017 с отключением событий у Editor. Editor.SelectionAdded -= Editor_SelectionAdded - просто игнорируется

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Пришлось ввести дополнительную переменную с булевым значением
Глядя на ваш код я кажется начинаю догадываться, где я прокололся. У вас один флажок m_SelAdded на все чертежи. Вы ходите сказать, что у всех открытых документов один и тот же редактор и однажды подписавшись на события в одном документе будет вызываться обработчик и во всех других? Я то подписывался в каждом открытом документе. Окошко это в конце концов стало вылетать и на SelectionAdded тоже. Соответственно у меня был вариант составлять список документов, где я подписался на события. Но событие вызывалось по 7 раз и я понял, что чем со всем этим бороться, проще подписаться на Doc_ImpliedSelectionChanged - там все работает без танцев с бубном. Обратно уже не нет смысла переделывать, но хотелось бы разобраться...
« Последнее редактирование: 19-01-2017, 21:34:06 от avc »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вы ходите сказать, что у всех открытых документов один и тот же редактор и однажды подписавшись на один события в одном документе будет вызываться обработчик и во всех других?
Редактор действительно один и тот же. Если интересно, то посмотри класс AcEdEditor в ObjectARX, который един для всех документов и никакого отношения к AcApDocument (в .NET - Document) не имеет. Editor - это вроде как должна быть обёртка для AcEdEditor. Зачем сделали всё это в .NET с привязкой к Document для меня загадка. Я удивлялся этому еще десять лет назад...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Вот оно как, оказывается. В моем случае без разницы - статическая переменная или нет, т.к. у меня запуск обработки - по событию запуска команды, остановка обработки - по событию остановки команды. В один момент времени в двух разных документах не может выполняться команда, поэтому, проблем такого рода у меня быть не может.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Редактор действительно один и тот же
Круто! Если б не поднял эту тему, в жизни б не догадался...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Редактор действительно один и тот же
Круто! Если б не поднял эту тему, в жизни б не догадался...
Я давно говорил, что начинать нужно с ObjectARX, а потом переходить к AutoCAD .NET API
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение