Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 24-09-2015, 12:55:56
-
Ситуация такая:
У меня есть приложение для AutoCAD, которое раньше я подгружал при помощи загрузки CUIX-файла. Рядом с этим CUIX находился файл MNL, который загружал мои .NET dll-библиотеки. В dll прописана проверка состояния приложения и установка для кнопок ленты отображения "включено-отключено" путем изменения свойства RibbonItem.IsChecked.
Сейчас я перевел приложение на загрузку с использованием Bundle-пакета. Загрузку CUIX-файла и .NET dll-библиотек прописал в PackageContents.xml элементами ComponentEntry. И теперь, при загрузке, происходит следующее - сперва грузятся dll-файлы, а уже после происходит инициализация интерфейса и загружается CUIX файл. Соответственно, установка состояний для кнопок ленты отрабатывает "вхолостую", т.к. в этот момент ленты еще нет - метод получения вкладок-панелей-кнопок возвращает null.
Пока предполагаю два возможных варианта решения: искать события инициализации ленты, подписываться на них и производить обработку, либо формировать вкладки-панели-кнопки ленты полностью программно без CUIX-файла (сталкивался уже с таким в чьих-то приложениях).
Вопрос такой - может быть, кто-то уже сталкивался с такой проблемой и подскажет, в каком направлении искать решение и где какие грабли раскиданы? :)
-
А если прописать StartupCommand (http://adndevblog.typepad.com/autocad/2012/04/autoloader-the-startupcommand-parameter.html) и в нём выполнять "установку состояния для кнопок ленты"?
-
Александр Наумович, как всегда, в точку! :)
Работает как надо! Спасибо!
-
Я так понимаю, что этот параметр сделали именно для того, чтобы можно было выполнить некоторые действия, когда уже AutoCAD полностью инициализирован (меню, лента, палитры, тулбары и т.д.) и ждёт действия пользователя. Возможны и альтернативные решения (например, через подписку на Applicaton.Idle), но начиная с AutoCAD 2013 в них нет необходимости.
-
А если прописать StartupCommand и в нём выполнять "установку состояния для кнопок ленты"?
Обнаружилась неприятная особенность этого способа. Он не срабатывает, если запускать AutoCAD из "Пуск" с указанием чертежа, который нужно открыть, из списка "Последние". Баг?
-
А если прописать StartupCommand и в нём выполнять "установку состояния для кнопок ленты"?
Обнаружилась неприятная особенность этого способа. Он не срабатывает, если запускать AutoCAD из "Пуск" с указанием чертежа, который нужно открыть, из списка "Последние". Баг?
Только отсюда или кликом по чертежу в проводнике тоже?
-
либо формировать вкладки-панели-кнопки ленты полностью программно без CUIX-файла (сталкивался уже с таким в чьих-то приложениях)
А почему бы и нет? ИМХО, самый простой и удобный вариант..
Может, подскажете, в чем преимущества работы с CUIX-файлом (просто я так и не нашел никаких плюсов для себя, поэтому строю ленту сразу программно)?
-
Только отсюда или кликом по чертежу в проводнике тоже?
Только в таком варианте запуска. Если кликать по чертежу в проводнике, или запускать автокад с ярлыка, а потом открывать чертеж - все в порядке. Сейчас запишу видео и выложу тестовый проект.
-
Может, подскажете, в чем преимущества работы с CUIX-файлом
Ну есть и плюсы и минусы, но, на мой взгляд, так правильнее. Программно никогда не создавал элементы ленты, поэтому не в курсе, что можно сделать таким способом, а что нельзя. Однозначно, что при таком подходе пользователь не сможет никак изменить ленту, подстроить под себя. В варианте с подгружаемым CUIX файлом у него есть такая возможность.
Вот, записал видео проблемы. Сильно подозреваю, что в голом автокаде ее может и не быть. Суть в чем - при открытии через "Пуск", русский Civil 3D дополнительно создает документ "Чертеж1". И наличие этого документа портит всю работу. Английская версия Civil 3D не имеет такой проблемы - проверял на 2015 версии, но думаю, в 2017 будет то же самое, потому что эта проблема с дополнительным документом тянется еще с версии 2013, если мне не изменяет память. Только раньше мне это не мешало, а вот сейчас - очень даже неприятную ситуацию создает.
Во вложениях:
SimpleBundle.zip - проект VS 2013
SimpleBundle.bundle.zip - папка bundle. Работает с AutoCAD и AutoCAD Civil 3D версий 2013-2017
-
Программно никогда не создавал элементы ленты, поэтому не в курсе, что можно сделать таким способом, а что нельзя.
По сути, можно все.
Однозначно, что при таком подходе пользователь не сможет никак изменить ленту, подстроить под себя. В варианте с подгружаемым CUIX файлом у него есть такая возможность.
Ну можно создать окошко какое-то дополнительное (не автокадовское, где пользователь будет перетаскивать кнопки), а мы потом, соответственно, перестраивать ленту по "перетасканному";)
Вообще, Вашу позицию понял.
Сильно подозреваю, что в голом автокаде ее может и не быть.
Вряд ли тебе это поможет, но вот я проверил на голом(хотя, смотря что понимать под этим) акаде - действительно, все ок:
-
Дмитрий Загорулькин
Странно. Непонятно в чем разница между русским и английским Civil 3D, что такая вещь проявляется только в нём. Может в русском еще какие-то дополнительные приложения? Кстати, тот факт, что остаётся открытым Чертеж1 говорит о том, что после запуска Civil 3D произошло изменение базы этого чертежа и поэтому Civil 3D его не закрыл перед открытием заданного чертежа.
-
Да нет, дело не в дополнениях. Изначально, в версии 2013, если мне не изменяет память, так было и в английской версии и в русской. В английской создавался Drawing1, в русской Чертеж1. Потом в каком-то SP поправили это дело в английской версии, а в русской так и осталось. Насчет того, что в Чертеж1 было изменение базы у меня большие сомнения. Потому что если бы это было так, то он бы помечался звездочкой и при закрытии предлагал бы сохранить изменения. Но этого не происходит.
Попробовал задать команде флаг Session, но это привело к тому, что Civil 3D просто зависает при запуске и приходится его закрывать через диспетчер задач. Вот ведь засада...
-
Ну можно создать окошко какое-то дополнительное (не автокадовское, где пользователь будет перетаскивать кнопки), а мы потом, соответственно, перестраивать ленту по "перетасканному"
Ну у меня порядка 40 кнопок на ленте своих. Замучаешься инструмент кастомизации делать :)
К тому же, через программное создание, наверняка, будет сложно предусмотреть смену значков при изменении цветовой схемы (светлая-темная). Через CUIX и ресурсные DLL с иконками это делать довольно удобно. В общем, использование CUIX более гибко по сравнению с программным созданием. И программировать меньше приходится, т.к. используются встроенные в AutoCAD механизмы.
-
Дмитрий, в общем, у меня на всех акадах работает (2016 и 2017, "голых" и "не голых", на работе и дома).
К тому же, через программное создание, наверняка, будет сложно предусмотреть смену значков при изменении цветовой схемы (светлая-темная). Через CUIX и ресурсные DLL с иконками это делать довольно удобно. В общем, использование CUIX более гибко по сравнению с программным созданием. И программировать меньше приходится, т.к. используются встроенные в AutoCAD механизмы.
Не подскажешь, где можно толково почитать про программную настройку CUIX?
-
Не подскажешь, где можно толково почитать про программную настройку CUIX?
Программная настройка? Это как? Я вручную его создаю и настраиваю, через инструмент "Адаптация".
-
А если прописать StartupCommand и в нём выполнять "установку состояния для кнопок ленты"?
Все-таки, очень часто этот метод дает сбой по непонятным причинам. И пользователям приходится выполнять команду инициализации вручную после загрузки Civil 3D. Придется, наверное, воспользоваться этим решением:
Возможны и альтернативные решения (например, через подписку на Applicaton.Idle)
-
Все-таки, очень часто этот метод дает сбой по непонятным причинам.
Я вспомнил почти анекдот двадцатилетней давности. Мне сообщили, что у одной пользовательницы МАЭСТРО наша программа не работает, при том, что у всех её коллег в той же комнате эта же версия прекрасно работает. Подхожу я к ней и вижу, что действительно команды МАЭСТРО не запускаются. Прошу её перезапустить AutoCAD. И что я вижу? Пока AutoCAD запускается она стучит по клавише ESC. Я спрашиваю её а зачем она это делает? Она отвечает - так он же так быстрее загрузится. Занавес!
P.S.: Объяснение - при запуске AutoCAD загружаются и настраиваются модули МАЭСТРО, проверяется защита и т.д. Нажатие ESC приводит к прерыванию загрузки.
P.S.: Последи за их руками, ведь StartupCommand запускает команду. Вполне возможно что из-за их "шаловливых ручек" она не запускается.
-
Хороший анекдот :)
Но, к сожалению, это не тот случай. Такое случилось недавно когда я сам запускал Civil на чужом ПК. Я не знаю, что влияет - урезанные права пользователей, особенности локальных политик ПК, особенности архитектуры ПК, какой-то софт или еще что-то. Но метод уже зарекомендовал себя как ненадежный. Добавил ему в помощь Application.Idle, чтобы что-то одно из них гарантированно отрабатывало. Посмотрим, как оно себя на практике покажет.
P.S. Хотя, можно было бы оставить только Application.Idle. Оно всегда раньше срабатывает :)