Inventory не является .NET приложением, поэтому взаимодействие с плагинами, написанными для .NET платформы, отличается от взаимодействия с API плагинами.
Отличия в реализации .NET плагина от реализации на VCL:
1) Использование непосредственно MSXML DOM интерфейсов для доступа к XML документу.
2) Для загрузки используется промежуточный .NET модуль.
Структура генерации событий для плагина:
Структура отправки команд приложению:
3) В .NET плагин требуется включение пространства имен sgPluginItemImpI, в котором должен быть реализован класс sgPluginItem:
...
namespase sgPluginItemImpl
{
public class sgPluginItem
{
...
public sgPluginItem() {}
public virtual event EventHandler OnCommand;
public virtual int Command(int ACmdID, object AParam)
{
switch (ACmdID)
{
case PluginConsts.AB_INIT:
IXMLDOMNode clientNode = (IXMLDOMNode)AParam;
...
return 0;
case PluginConsts.AB_CREATE_ENTITIES:
...
return 0;
...
}
}
...
}
...
}
Реализация класса sgPluginItem
Метод Command
Метод Command предназначен для получения плагином событий приложения:
public virtual int Command(int ACmdID, object AParam)
Параметр ACmdID метода и его описание аналогично параметру CmdID функции Invoke (API плагин). AParam - интерфейсы MSXML.
Событие OnCommand
Событие OnCommand предназначено для выполнения функций приложения (открытие чертежа, сохранение, закрытие чертежа...):
public virtual event EventHandler OnCommand;
Чтобы выполнить функцию приложения, необходимо передать в OnCommand параметр CommandEventArgs, например:
public int DoCommand(int ACmdID, object AParam)
{
if (OnCommand != null)
{
CommandEventArgs e = new CommandEventArgs(ACmdID, AParam, 0);
OnCommand(this, e);
return e.Result;
}
return 0;
}
где CommandEventArgs описывается в модуле InventoryPluginConsts.cs:
...
namespase InventoryPluginConsts
{
[ComVisible(false)]
public class CommandEventArgs : EventArgs
{
private static int cmdID;
private static object param;
private static int result;
public CommandEventArgs(int ACmdID, object AParam, int AResult)
{
cmdID = ACmdID;
param = AParam;
result = AResult;
}
public int CmdID
{
get { return cmdID; }
}
public object Param
{
get { return param; }
}
public int Result
{
get { return result; }
set { result = value; }
}
}
...
▪Свойство CommandEventArgs.CmdID может принимать одно из возможных значений параметра CmdID функции Invoke.
▪Свойство CommandEventArgs.Param может принимать любое значение (имя файла, элемент xml...) в зависимости от значения CommandEventArgs.CmdID.
▪Свойство Result - возвращаемое значение.
Событие OnCommand всегда инициализируется загрузчиком, обработчик которого находится внутри загрузчика.
Инициализация .NET плагина
Использование плагина позволяет создавать дополнительные элементы управления Windows (кнопки на панели инструментов, докпанели, MDI окна). Механизм создания заключается в заполнении элементов необходимыми данными в соответствующей плагину ветке application\Session\Clients\Client. Заполнение ветки выполняется однократно при инициализации плагина, после чего, приложение анализирует записи и создает соответствующие элементы управления.
...
public virtual int Command(int ACmdID, object AParam)
{
switch (ACmdID)
}
case PluginConsts.AB_INIT:
// инициализация элемента соответствующей ветки плагина
clientNode = (IXMLDOMNode)AParam;
// поиск/создание списка тулбаров
IXMLDOMNode commandBars = PluginConsts.NodeByName(clientNode, PluginConsts.sCommandBars);
// добавление нового тулбара к списку
newCommandBarNode = PluginConsts.AddChildNode(commandBars, PluginConsts.sCommandBar);
//назначение ему уникального имени
PluginConsts.AddChildNode(newCommandBarNode, PluginConsts.sName).text = PluginConsts.sCommandBar + NameSuffix;
// присвоение ему заголовка
PluginConsts.AddChildNode(newCommandBarNode, PluginConsts.sCaption).text = "C# Plugin ";
// создание кнопки на тулбаре
newCommandNode = PluginConsts.AddChildNode(newCommandBarNode, PluginConsts.sCommand);
// назначение ей уникального имени
PluginConsts.AddChildNode(newCommandNode, PluginConsts.sName).text = PluginConsts.sCommand + NameSuffix;
// присвоение ей заголовка и всплывающей подсказки
PluginConsts.AddChildNode(newCommandNode, PluginConsts.sCaption).text = ButtonCaption;
PluginConsts.AddChildNode(newCommandNode, PluginConsts.sHint).text = ButtonCaption;
// поиск/создание списка докпанелей
IXMLDOMNODE dockPanels = PluginConsts.NodeByName(clientNode, PluginConsts.sDockPanels);
// создание докпанели
dockPanel = PluginConsts.AddChildNode(dockPanels, PluginConsts.sDockPanel);
// назначение ей уникального имени
PluginConsts.AddChildNode(dockPanel, PluginConsts.sName).text = PluginConsts.sDockPanel + NameSuffix;
// присвоение ей заголовка
PluginConsts.AddChildNode(dockPanel, PluginConsts.sCaption).text = "C# Plugin DockPanel1";
// создание стандартного или пользовательского элемента управления .NET
// его инициализация
DockControl = new DockPanelControl();
DockControl.PluginItem = this;
// добавление элемента к докпанели, с указывающим на значение дескриптора окна
IXMLDOMNode Childs = PluginConsts.AddChildNode(dockPanel, PluginConsts.sChilds);
IXMLDOMNode ChildHandle = PluginConsts.AddChildNode(Childs, PluginConsts.sHandle);
ChildHandle.text = DockControl.Handle.ToString();
//добавление иконки докпанели
IXMLDOMNode IconHandle = PluginConsts.AddChildNode(newCommandNode, PluginConsts.sIconHandle);
IconHandle.text = InventoryPluginControl.Properties.Resources.cs_low.Handle.ToString();
...
После инициализации приложение создает элементы управления и добавляет к соответствующим элементам xml-документа дополнительные атрибуты и значения (значение дескриптора окна, идентификатора окна и т.д.).
Перейти на страницу Inventory