Ribbon команда в автокаде

Обновлено: 08.07.2024


By:

The ribbon organizes tools into logical groupings.

The ribbon provides a compact palette of all of the tools necessary to create or modify your drawing. It can be in placed in the following places:

  • Docked horizontally at the top of the drawing area (default)
  • Docked vertically along the right or left edge of the drawing area
  • Undocked, or floating within the drawing area or on a second monitor

Ribbon Tabs and Panels

The ribbon is composed of a series of tabs, which are organized into panels that contain many of the tools and controls available in toolbars.



Note: You can control which ribbon tabs and panels are displayed. Right-click the ribbon and click or clear the names of tabs or panels listed on the shortcut menu.

Floating Panels

You can pull a panel off a ribbon tab and into the drawing area or onto another monitor. The floating panel remains open until you return it to the ribbon, even if you switch ribbon tabs.


Slide-out Panels

If you click the arrow in the middle of a panel title, , the panel will expand to display additional tools and controls. By default, slide-out panels automatically close when you click another panel. To keep a panel expanded, click the push pin, , in the bottom-left corner of the slide-out panel.


Contextual Ribbon Tabs

When you select a certain type of object or start certain commands, a contextual ribbon tab is displayed instead of a toolbar or dialog box. The contextual tab closes when you end the command.


Workspaces and the Ribbon

For products that run on the Windows operating system, a workspace is set of ribbon tabs and panels, menus, toolbars, and palettes that provide you with a custom, task-oriented drawing environment. You can change to a different the ribbon by changing the workspace. On the status bar, click Workspace Switching and select the workspace you want to use. For example, here are the initial workspaces available in AutoCAD.

В прошлой своей статье я пообещал, что напишу еще несколько небольших заметок о разработке плагинов для AutoCAD. На Хабре сведений по этой теме крайне мало — пожалуй, можно и добавить еще пару материалов в обойму. В этой статье я приведу пример создания на ленте AutoCAD новой вкладки с несколькими элементами управления.

Введение

Когда я в свое время начинал работать с лентой, то больше всего мне помог пример, изложенный здесь. В основном я буду опираться именно на него.
Кроме того, некоторую информацию можно почерпнуть из этого поста Kean Walmsley.


Для начала вспомним, как выглядит лента в AutoCAD:

В верхней части расположен список вкладок ленты (Home, Mesh Modeling, Render. ). При выборе вкладки на ленте отображаются элементы управления этой вкладки, сгруппированные в панели (Modeling, Mesh, Solid Editing. ).

Ну что же, приступим.

1. Создание нового проекта плагина

2. Добавление ссылок на необходимые библиотеки

3. Собственно написание кода для создания новой вкладки

  1. создать элементы интерфейса;
  2. сгруппировать эти элементы в контейнеры;
  3. создать панели, на которых будут размещены эти контейнеры;
  4. создать вкладку, на которой будут размещены эти панели;
  5. добавить созданную вкладку на ленту AutoCAD.


Собираем проект, запускаем AutoCAD, загружаем с помощью команды NETLOAD наш плагин, выполняем команду TestCommand…

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

4. Поиск элементов на ленте

Для поиска вкладки на ленте можно использовать метод ComponentManager.Ribbon.FindTab(string id) . В качестве аргумента необходимо указать Id вкладки, заданный при ее создании.

Существуют аналогичные методы для поиска панели ( ComponentManager.Ribbon.FindPanel(string id, bool SearchActiveTabOnly) ) и прочих элементов управления ( ComponentManager.Ribbon.FindItem(string id, bool SearchActiveTabOnly) ).

В случае успешного нахождения элемента приведенные функции вернут соответствующий объект, иначе будет возврашено значение null .

5. Обработка нажатия кнопки

Для привязки обработчика нажатия кнопки служит свойство CommandHandler класса RibbonButton . В этом свойстве необходимо указать метод, реализующий интерфейс System.Windows.Input.ICommand .

В рамках интерфейса ICommand класс должен реализовать событие CanExecuteChanged , а также функции CanExecute и Execute .

Событие CanExecuteChanged оповещает пользователей команды о возможном изменении ее доступности для выполнения (короче говоря, работает она или не работает). Функция CanExecute позволяет узнать, доступна ли команда для выполнения в данный момент времени. А функция Execute — это собственно те действия, которые должна выполнять команда, когда ее вызвали.

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

6. Взаимодействие с выпадающим списком ( RibbonCombo )

6.1 Добавление, изменение, удаление элементов списка

Все элементы выпадающего списка RibbonCombo содержатся в его свойстве Items . Оно имеет тип System.Collections.ObjectModel.ObservableCollection , причем в качестве типа содержимого выступает System.Object . Таким образом, элементом коллекции может быть объект любого класса. К сожалению, если просто добавить в этот массив несколько текстовых строк, то желаемого эффекта мы не получим:


Чтобы получить приличный выпадающий список, в качестве его элементов можно использовать экземпляры рассмотренного выше класса RibbonButton :


В результате увидим вот что:

  • метод Remove(object item) — для удаления указанного элемента;
  • метод RemoveAt(int index) — для удаления элемента на указанной позиции;
  • метод Clear() — для удаления всех элементов из коллекции;
  • свойство Count — для получения количества элементов в коллекции.

Обычно элемент списка соотносится с каким-то объектом предметной области. Чтобы иметь возможность быстро определить, с чем сопоставлен тот или иной элемент списка, можно использовать свойство Tag класса RibbonButton :

Тогда при обработке элемента списка можно посмотреть, какой был задан тег:

Можно пойти и еще дальше. Поскольку свойство Tag имеет тип System.Object , в качестве тега может выступать объект любого класса, в том числе и созданного самим программистом:

После этого можно будет обратиться к любому свойству этого объекта:

При возникновении острого желания экономить строки есть возможность писать конструкции вида

Разумеется, в реальном коде необходимо убеждаться, что полученные значения не равны null .

6.2 Обработка события выбора элемента списка

При выборе элемента списка RibbonCombo генерируется событие CurrentChanged . Вот простой пример обработчика такого события:


Результат:

7. Настройка внешнего вида элементов управления

Во-первых, элементы управления можно располагать друг под другом — это особенно удобно, если используются «узкие» элементы вроде выпадающих списков.

Во-вторых, у каждого элемента управления есть свойства, позволяющие изменять его внешний вид. Например, для выпадающего списка можно задать заголовок и ширину, для кнопки — размер (большая или маленькая) и подпись. Кроме того, можно добавить всплывающие подсказки (в примере она добавлена для третьей кнопки).

Код (обратите внимание, была добавлена ссылка на сборку и пространство имен System.Drawing):


Результат:


На этом статья подходит к концу. В следующий раз напишу о работе со слоями и простыми графическими объектами.

В данной публикации мы рассмотрим пример программного построения собственной вкладки на ленте, а также несколько проблемных вопросов, связанных с лентой.

В последнее время стало очень популярным нововведение под названием лента (Ribbon). Autodesk не стал отставать от жизни и, начиная с 2009 автокада, тоже начал использовать ленту.

Мы рассмотрим пример создания вкладки на ленте для 2010 автокада и рассмотрим несколько сопутствующих «проблемных» вопросов. Почему для него? Да потому что в 2009 лента была еще «сырая» (но там тоже можно так сделать), и потому что для последующих автокадов (2011-2013) код будет анологичен.

  • создать файл АПИ (cui) со своей лентой и подгружать его. На мой взгляд самый плохой и проблемный вариант. ИМХО
  • создать вкладку на ленте программно — этот вариант и рассмотрим
  • создать вкладку используя технологию WPF — я не стал разбираться


  • Проект —> Добавить ссылку —> вкладка «Обзор» —> из папки с автокадом 2010 выбираем файлы: acdbmgd.dll, acmgd.dll, AdWindows.dll. Не забываем в свойствах этих файлов поставить значение false для параметра Копировать локально;
  • Проект —> Добавить ссылку —> вкладка «NET» —> добавляем ссылки на следующие библиотеки: PresentationCore, PresentationFramework, WindowsBase.

3. Теперь рассмотрим из чего состоит лента на примере этой картинки:


Тут в принципе и описывать нечего.

4. Добавляем в наш проект две иконки размерами 16х16 и 32х32 в формате .jpg. Так, как я ленивый, то использовал одинаковую картинку первую попавшеюся на просторах интернет.

Главное для этих файлов поставить значение Resource для параметра Действие при построение:


5. Переходим к коду. Открываем файл Class1.cs (или можете свой создать), удаляем класс Class1 и создаем свой собственный класс, унаследованный от IExtensionApplication. Назовем его ExampleRibbon.

Далее я хотел как-то пошагово описать все действия, но решил, что удобней и понятней будет сразу привести весь код с пояснениями:

6. Все — код готов. Компилируем его (Построение —> Построить решение), открываем автокад 2010, выполняем команду NETLOAD и выбираем наш плагин . \ACadRibbon\ACadRibbon\bin\Debug\ACadRibbon.dll.

И сразу же после загрузки мы увидим, что у нас добавилась новая вкладка на ленте:



Данный вариант активно используется в моем плагине ModPlus и пока не вызвал нареканий.

В прошлой своей статье я пообещал, что напишу еще несколько небольших заметок о разработке плагинов для AutoCAD. На Хабре сведений по этой теме крайне мало — пожалуй, можно и добавить еще пару материалов в обойму. В этой статье я приведу пример создания на ленте AutoCAD новой вкладки с несколькими элементами управления.

Введение

Когда я в свое время начинал работать с лентой, то больше всего мне помог пример, изложенный здесь. В основном я буду опираться именно на него.
Кроме того, некоторую информацию можно почерпнуть из этого поста Kean Walmsley.


Для начала вспомним, как выглядит лента в AutoCAD:

В верхней части расположен список вкладок ленты (Home, Mesh Modeling, Render. ). При выборе вкладки на ленте отображаются элементы управления этой вкладки, сгруппированные в панели (Modeling, Mesh, Solid Editing. ).

Ну что же, приступим.

1. Создание нового проекта плагина

2. Добавление ссылок на необходимые библиотеки

3. Собственно написание кода для создания новой вкладки

  1. создать элементы интерфейса;
  2. сгруппировать эти элементы в контейнеры;
  3. создать панели, на которых будут размещены эти контейнеры;
  4. создать вкладку, на которой будут размещены эти панели;
  5. добавить созданную вкладку на ленту AutoCAD.


Собираем проект, запускаем AutoCAD, загружаем с помощью команды NETLOAD наш плагин, выполняем команду TestCommand…

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

4. Поиск элементов на ленте

Для поиска вкладки на ленте можно использовать метод ComponentManager.Ribbon.FindTab(string id) . В качестве аргумента необходимо указать Id вкладки, заданный при ее создании.

Существуют аналогичные методы для поиска панели ( ComponentManager.Ribbon.FindPanel(string id, bool SearchActiveTabOnly) ) и прочих элементов управления ( ComponentManager.Ribbon.FindItem(string id, bool SearchActiveTabOnly) ).

В случае успешного нахождения элемента приведенные функции вернут соответствующий объект, иначе будет возврашено значение null .

5. Обработка нажатия кнопки

Для привязки обработчика нажатия кнопки служит свойство CommandHandler класса RibbonButton . В этом свойстве необходимо указать метод, реализующий интерфейс System.Windows.Input.ICommand .

В рамках интерфейса ICommand класс должен реализовать событие CanExecuteChanged , а также функции CanExecute и Execute .

Событие CanExecuteChanged оповещает пользователей команды о возможном изменении ее доступности для выполнения (короче говоря, работает она или не работает). Функция CanExecute позволяет узнать, доступна ли команда для выполнения в данный момент времени. А функция Execute — это собственно те действия, которые должна выполнять команда, когда ее вызвали.

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

6. Взаимодействие с выпадающим списком ( RibbonCombo )

6.1 Добавление, изменение, удаление элементов списка

Все элементы выпадающего списка RibbonCombo содержатся в его свойстве Items . Оно имеет тип System.Collections.ObjectModel.ObservableCollection , причем в качестве типа содержимого выступает System.Object . Таким образом, элементом коллекции может быть объект любого класса. К сожалению, если просто добавить в этот массив несколько текстовых строк, то желаемого эффекта мы не получим:


Чтобы получить приличный выпадающий список, в качестве его элементов можно использовать экземпляры рассмотренного выше класса RibbonButton :


В результате увидим вот что:

  • метод Remove(object item) — для удаления указанного элемента;
  • метод RemoveAt(int index) — для удаления элемента на указанной позиции;
  • метод Clear() — для удаления всех элементов из коллекции;
  • свойство Count — для получения количества элементов в коллекции.

Обычно элемент списка соотносится с каким-то объектом предметной области. Чтобы иметь возможность быстро определить, с чем сопоставлен тот или иной элемент списка, можно использовать свойство Tag класса RibbonButton :

Тогда при обработке элемента списка можно посмотреть, какой был задан тег:

Можно пойти и еще дальше. Поскольку свойство Tag имеет тип System.Object , в качестве тега может выступать объект любого класса, в том числе и созданного самим программистом:

После этого можно будет обратиться к любому свойству этого объекта:

При возникновении острого желания экономить строки есть возможность писать конструкции вида

Разумеется, в реальном коде необходимо убеждаться, что полученные значения не равны null .

6.2 Обработка события выбора элемента списка

При выборе элемента списка RibbonCombo генерируется событие CurrentChanged . Вот простой пример обработчика такого события:


Результат:

7. Настройка внешнего вида элементов управления

Во-первых, элементы управления можно располагать друг под другом — это особенно удобно, если используются «узкие» элементы вроде выпадающих списков.

Во-вторых, у каждого элемента управления есть свойства, позволяющие изменять его внешний вид. Например, для выпадающего списка можно задать заголовок и ширину, для кнопки — размер (большая или маленькая) и подпись. Кроме того, можно добавить всплывающие подсказки (в примере она добавлена для третьей кнопки).

Код (обратите внимание, была добавлена ссылка на сборку и пространство имен System.Drawing):


Результат:


На этом статья подходит к концу. В следующий раз напишу о работе со слоями и простыми графическими объектами.

Читайте также: