← Назад в F.A.Q.

API программы Цербер

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

Для начала необходимо скачать последнюю версию программы и распаковать ее в папку, например D:\TestAPI

Далее создаем проект (в примере я буду использовать Visual Studio 2010, C# и framework 3.5).
В качестве шаблона необходимо использовать "Библиотеку классов". Назовем проект ZerberTestAPI, в принципе название проекта не имеет значения, важно, чтобы имя компилируемого файла соответствовало маске Zerber[Name].dll
[Name] — это внутреннее имя плагина, более подробно объясню немного ниже.



Далее заходим в свойства проекта и во вкладке "Построение" выбираем в качестве пути вывода папку, куда мы предварительно распаковали программу.



Теперь необходимо указать ссылку на Zerber.exe



Далее необходимо создать форму TaskForm.cs для редактирования настроек макроса и класс TheProcessor.cs в котором будет выполняться основной код плагина.
Итого мы имеем 2 класса — Class1.cs, TheProcessor.cs и 1 форму — TaskForm.cs. Теперь по порядку, разберем каждый класс.

Class1.cs

    public class Class1 : IPlugin
    {
        public string Name { get { return "TestAPI"; } } //внутреннее имя плагина,
        //имя файла в которое будет скомпилирован плагин обязательно должно соответствовать маске Zerber[Name].dll
        //таким образом Zerber.exe поймет в какой плагин отправлять выполнение задания
        //например в нашем случае плагин должнен компилироваться в файл ZerberTestAPI.dll

        public string Description { get { return "Тестовый плагин"; } } //описание плагина
        public static string Type { get { return "TestAPI"; } } //тип плагина
        public static string Action { get { return "Протестировать API"; } } //действие плагина
        public string AuthorName { get { return "Spartanets"; } } //автор плагина
        public string Version { get { return "1"; } } //версия плагина

        private Global global; //глобальная переменаая для обмена данными между плагином и Zerber.exe

        public void Initialize(Global _global, object tsm_project_add_task, bool Go)
        {
            global = _global; //получаем переменную

            //Go это bool переменная:
            //true то программа отправляет задание на выполнение,
            //false открывает форму редактирования задания
            if (Go)
            {
                try
                {
                    var proc = new TheProcessor(global); //TheProcessor класс, выполняющий задание
                    proc.LetsGo(); //LetsGo() основная функция TheProcessor

                    //делаем задание завершенным
                    global.pt.ctask.State = "Завершенный";
                    global.pt.Serialise();

                    return;
                }
                catch (Exception)
                {
                    return;
                }
            }

            //помимо переменной Go zerber передает в плагин переменную global.pt.ctask,
            //которая содержит информацию о текущем выполняемом задании
            //если значение global.pt.ctask == null программа просто добавляет кнопку в список заданий tsm_project_add_task
            if (global.pt.ctask == null)
            {
                if (tsm_project_add_task != null)
                {
                    var mnu = (ToolStripMenuItem)tsm_project_add_task;
                    var item = new ToolStripMenuItem { Text = Description };
                    item.Click += item_Click;
                    mnu.DropDownItems.Add(item);
                }
                return;
            }

            //если значение Go==false и global.pt.ctask != null плагин откроет форму редактирования задания
            var frm = new TaskForm(global);
            frm.ShowDialog();
        }

        //открываем форму для добавления задания
        void item_Click(object sender, EventArgs e)
        {
            var frm = new TaskForm(global);
            frm.ShowDialog();
        }

        public void Dispose()
        {
        }
    }

TaskForm

Теперь займемся формой. В примере плагин будет выводить указанной сообщение. Можно так же задать цикличность и указать сколько раз повторить цикл (это для того, чтобы показать как работать с настройками string, bool и int).

Расположим на форме следующие элементы:



Далее код формы с комментариями:

    public partial class TaskForm : Form
    {
        public TaskForm(Global _global)
        {
            global = _global;
            InitializeComponent();
        }
        private readonly Global global;

        private void TaskForm_Load(object sender, System.EventArgs e)
        {
            /*---standart---*/
            comboState.Items.Add("Новый");
            comboState.Items.Add("Завершенный");
            comboState.Items.Add("Незавершенный");
            comboState.Text = @"Новый";
            if (string.IsNullOrEmpty(global.pt.ctask.Name))//если задание новое
            {
                labelTaskName.Text = global.pt.PrepareTaskName(Class1.Action);
                return;
            }
            labelTaskName.Text = global.pt.ctask.Name;
            labelTaskName.ReadOnly = true;
            comboState.Text = global.pt.ctask.State;
            /*---standart---*/

            //Считываем настройки

            //Для сохранения и считывания настроек используются 2 функции:
            
            //global.pt.ctask.SaveItem для сохранения
            //тут все очень просто: задается имя переменной и значение, все значения записываются в string, например
            //global.pt.ctask.SaveItem("Имя_переменной", "Значение");
           
            //global.pt.ctask.LoadItem для считывания
            //для удобства у функции есть 2 перегрузки
            //global.pt.ctask.LoadItem("Имя_переменной"); — вернет значение переменной в string
            //global.pt.ctask.LoadItem("Имя_переменной", true/false); — попытается вернуть значение переменной в bool,
            //при этом true или false значение по умолчанию, если не удастся вернуть bool
            //global.pt.ctask.LoadItem("Имя_переменной", 0); — тоже самое, но для integer

            textBox_Message.Text = global.pt.ctask.LoadItem("Message");
            checkBox_Loop.Checked = global.pt.ctask.LoadItem("Loop", false);
            numericUpDown_Count.Value = global.pt.ctask.LoadItem("Count", 1);
        }

        private void buttonReady_Click(object sender, System.EventArgs e)
        {
            /*---standart---*/
            if (string.IsNullOrEmpty(global.pt.ctask.Name))//если задание новое
            {
                global.pt.ctask.Name = labelTaskName.Text;
                global.pt.ctask.Type = Class1.Type;
                global.pt.ctask.State = "Новый";
                global.pt.ctask.Create();
                global.pt.CurrentProject.AddTask(global.pt.ctask.Name, global.pt.ctask.State, global.pt.ctask.Type);
                global.pt.CurrentProjectNode.Nodes.Add(new TreeNode(global.pt.ctask.Name, 3, 3));
            }
            global.pt.ctask.State = comboState.Text;
            /*---standart---*/

            //Сохраняем настройки
            global.pt.ctask.SaveItem("Message", textBox_Message.Text);
            global.pt.ctask.SaveItem("Loop", checkBox_Loop.Checked.ToString());
            global.pt.ctask.SaveItem("Count", numericUpDown_Count.Value.ToString());

            /*---standart---*/
            global.pt.ctask.Save(); //сохраняем задание
            global.pt.ShowProjects(); //обновляем дерево заданий
            Close(); //закрываем форму
            /*---standart---*/
        }

    }

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

TheProcessor.cs

Здесь думаю комментарии излишни

    public class TheProcessor
    {
        public TheProcessor(Global _global)
        {
            global = _global;
        }

        private readonly Global global = new Global();

        public void LetsGo()
        {
            //Считываем настройки
            var message = global.pt.ctask.LoadItem("Message");
            var loop = global.pt.ctask.LoadItem("Loop", false);
            var count = global.pt.ctask.LoadItem("Count", 1);

            if (loop) for (var i = 0; i < count; i++) MessageBox.Show(message);
            else MessageBox.Show(message);
        }
    }

Все, наш плагин готов!

Исходники

Скачать проект примера для VS2010

Вопросы по расширению API, лицензирование и т.д.

Если вам надо что-либо добавить в API или что-то не понятно, вы всегда можете обратиться ко мне в контакты.

Я никаким образом не ограничиваю разработчиков, которые пишут свои плагины. Напротив, если плагин интересный, я размещу о нем информацию в своем блоге и каталоге плагинов с контактами автора.

Olark Livehelp