Определение командных методов
При определении команды используется атрибут CommandMethod (полное имя -- Autodesk.AutoCAD.Runtime.CommandMethod). Атрибут CommandMethod ожидает строковое значение, которое будет использоваться в качестве глобального имени определяемой команды. Наряду с глобальным именем команды атрибут CommandMethod может принимать следующие значения (значения приведены с указанием имени свойства класса CommandMethodAttribute):
- Flags (Флаги команды) : Определяют поведение команды, записываются в виде CommandFlags.UsePickSet | CommandFlags.NoBlockEditor | и т.д.;
- GroupName (Имя группы команд);
- LocalizedNameId (Локализованное имя) : локальное имя команды, обычно специфичное для используемой языковой локализации;
- HelpTopic : Идентификатор раздела справки, который откроется при нажатии на F1 (обычно представляет собой относительный путь к странице в составе CHM:справочника или URL:адрес к страничке с документацией, развернутой локально или на публичном ресурсе);
- ContextMenuExtensionType : Определяет поведение контекстного меню, когда команда активна (исполняется);
- HelpFileName : Файловый путь к файлу справки, содержащий справочную информацию, которая будет отображаться при нажатии на F1 во время выполнения команды;
Примеры использования аргументов:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
[CommandMethod("Test")]
public void TestNotInGroup()
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage("Test Command NOT in group.\\n");
}
[CommandMethod("CmdGroup", "Test", CommandFlags.Modal)]
public void TestInGroup()
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage("Test Command in CmdGroup.\\n");
}
Выше представлены 2 метода. Оба имеют внутреннее имя "Test", но при вводе в командную строку AutoCAD команды по имени "Test" или ".Test" запустится только первая (объявляющая метод TestNotInGroup). При вводе в командную строку AutoCAD команды по имени "CmdGroup.Test" запустится уже вторая команда (объявляющая метод TestInGroup). Специфика первого аргумента в атрибуте CommandMethod заключается в названии группы (groupName), в которой будет лежать объявление целевого метода (объявленного вторым аргументом : globalName). Полный список поддерживаемых конструкторов из справки:
public CommandMethodAttribute(ref String globalName);
public CommandMethodAttribute(ref String globalName, CommandFlags flags);
public CommandMethodAttribute(ref String groupName, ref String globalName, ref String localizedNameId, CommandFlags flags);
public CommandMethodAttribute(ref String groupName, ref String globalName, ref String localizedNameId, CommandFlags flags, ref String helpTopic);
public CommandMethodAttribute(ref String groupName, ref String globalName, ref String localizedNameId, CommandFlags flags, ref Type contextMenuExtensionType);
public CommandMethodAttribute(ref String groupName, ref String globalName, ref String localizedNameId, CommandFlags flags, ref Type contextMenuExtensionType, ref String helpFileName, ref String helpTopic);
Доступные типы CommandFlags
Таблица ниже содержит перечень доступных к использованию флагов команд CommandFlags:
| Enum Value | Description |
|---|---|
| ActionMacro | Команда может быть записана при помощи утилиты Action Recorder (не доступно в AutoCAD) |
| Defun | Команда может быть вызвана как LISP-функция с возможностью использования acedGetArgs() для получения аргументов из LISP и функции acedRetXxx() для возврата значений в LISP. Этот флаг может быть установлен только движком Visual LISP. |
| DocExclusiveLock | При вызове и работе команды документ будет заблокирован. |
| DocReadLock | Document will be read locked when command is invoked. |
| Interruptible | Выполнение команды может быть прервано, если будет запрошен пользовательский ввод (через командную строку) |
| Modal | Команда не будет вызвана, пока активна какая-либо другая команда |
| NoActionRecording | Команда не может быть записана при помощи утилиты Action Recorder |
| NoBlockEditor | Команда не может быть запущена или использована внутри Редактора блоков |
| NoHistory | Команда не будет добавлена в историю "последних команд" |
| NoInferConstraint | Команда не может быть использована, если установлены ограничения AutoCAD |
| NoInternalLock | При выполнении команды документ не сможет быть внутренне заблокирован (инструкции по блокировке документа внутри метода не будут выполнены) |
| NoMultiple | Команда не будет поддерживать перегрузки метода через символы "*" как аргументы макроса для запуска команды |
| NoNewStack | Команда не будет создавать новый элемент во внутреннем стеке. |
| NoOEM | Команда не будет доступна из среды OEM-программы. |
| NoPaperSpace | Команда не может быть запущена из пространства Листа |
| NoPerspective | Команда не может быть запущена, если значение переменной PERSPECTIVE = 1 |
| NoTileMode | Команда не может быть запущена, если значение переменной TILEMODE = 1 |
| NoUndoMarker | Команда не будет поддерживать маркеры отмены. Это предназначено для команд, которые не изменяют базу данных, и, следовательно, не должны фигурировать в файле отмены. |
| Redraw | При изменении набора выделенных объектов команда запускается заново. |
| Session | Команда будет выполняться в среде сессии AutoCAD, а не только для данного документа |
| TempShowDynDimension | Команда разрешает отображение динамического ввода при выборе объектов |
| Transparent | Команда может использоваться одновременно с другой запущенной командой. |
| Undefined | Команда может быть использована (запущена) только по своему Глобальному имени (то есть без привязки к Категории) |
| UsePickSet | Команда срабатывает по отношению к первому выделенному объекту в рамках пользовательского выбора. |
Для задания нескольких флагов одновременно используйте в C# символ | .
[CommandMethod("CheckForPickfirstSelection", CommandFlags.UsePickSet |
CommandFlags.NoBlockEditor)]
public static void CheckForPickfirstSelection()
{
//...
}
Статические и нестатические методы
Командные методы могут быть объявлены как статические или нестатические (они же так называемые "either instance" или "instance commands") публичные методы класса. Статические командные методы объявляются с ключевым словом static в C# или с ключевым словом Shared в VB .NET.
Для нестатического командного метода, реализуемый метод устанавливается отдельно для каждого открытого документа. Это означает, что каждый документ получает частную копию данных экземпляра команды (метода под атрибутом CommandMethod). Таким образом, нет опасности перезаписать данные конкретного документа, когда пользователь переключается между документами. Если методу экземпляра требуется глобальный обмен данными, он может сделать это, объявив методы статическими или используя общие переменные/поля класса.
Для статического командного метода управляемому модулю (загруженной библиотеке) не нужно загружать данный метод во все экземпляры документов. Используется единственная копия данных метода, независимо от контекста документа. Статические команды обычно не используют данные, относящиеся к документу, и не требуют специального обработчика для режима MDI (Multiple Document Interface).
Экземплярные (нестатические) и статические методы могут быть определены с помощью флагов команд для специфичных задач. Например, метод экземпляра может быть объявлен с атрибутом, устанавливающим флаг CommandFlags.Session. Это означает, что команда работает в контексте выполнения приложения, но при этом сохраняет данные для каждого документа. Примером такой команды в AutoCAD является команда PROPERTIES. Аналогично, статический метод может быть объявлен без флага CommandFlags.Session. Такая комбинация полезна для команд, которые выполняются в контексте документа, но не нуждаются в сохранении данных, относящихся к документу.