Как написать плагин ?

Как написать плагин ? - Messages

#1 Posted: 6/10/2010 5:01:59 PM
Mikka

Mikka

36 likes in 206 posts.

Group: User

Доброго времени суток уважаемый SMatch, спасибо вам большое за вашу программу! Очень хорошая программа...
Но для использования ее в инженерных целях, мне не хватает некоторых полезных функций...
Вопросы такие:
1) закончен ли процесс написания той части программы которая отвечает за взаимодействие с плагинами, в той степени, чтобы можно было писать плагины (с минимальными доработками или без доработок их в последующем )?
2) как писать собственные плагины ? (старая инструкция которую вы давали к smatch studio 0.85, как я понял не
подходит)
Есть пара предложений, которые я хочу попробовать реализовать сам... если интересно пишите в личку, расскажу идею...
Не официальный справочник http://sites.google.com/site/mikkhalichlab/ jabber конференция smath@conference.jabber.ru
#2 Posted: 6/11/2010 2:15:44 PM
Andrey Ivashov

Andrey Ivashov

2270 likes in 3734 posts.

Group: Super Administrator

Здравствуйте.

Wrote

1) закончен ли процесс написания той части программы которая отвечает за взаимодействие с плагинами, в той степени, чтобы можно было писать плагины (с минимальными доработками или без доработок их в последующем )?


Да, поддержка плагинов реализована полноценно. Можно добавлять свои переменные, функции (как в численные вычисления, так и в символьные), можно добавлять поддержку новых типов файлов для импорта/экспорта в SMath Studio. Гарантировать, что в последующих версиях ничего не изменится я пока не могу, т.к., по сути, это лишь только начало соответствующих работ, однако уверен, основные принципы уже не изменятся. Показателем готовности можно считать и то, что в версии 0.88 большинство функций и функциональности импорта/экспорта файлов уже вынесено в плагины (папка plugins в установочной директории программы).

Wrote

2) как писать собственные плагины ? (старая инструкция которую вы давали к smatch studio 0.85, как я понял не подходит)


Да, та инструкция к альфа версии программы уже неактуальна. На текущий момент самое большое кол-во информации о процессе создания плагинов собрано на английском форуме программы: How to create plugins for SMath Studio (обратите особое внимание на последний комментарий пользователя maweilian). Если будут какие-либо проблемы с английским, то всё равно рекомендую ознакомится с подготовленным мною видео (C#) или с пошаговой инструкцией (VB.Net). На русском кое-что написано здесь: Как создать плагин (дополнение) для SMath Studio. В любом случае не стесняйтесь задавать прямые вопросы по процессу реализации дополнений для SMath Studio - буду отвечать максимально оперативно.

С уважением, Андрей Ивашов.
#3 Posted: 6/11/2010 2:49:43 PM
Mikka

Mikka

36 likes in 206 posts.

Group: User

Спасибо большое, английский я не очень хорошо знаю, но переводчик google поможет
Не официальный справочник http://sites.google.com/site/mikkhalichlab/ jabber конференция smath@conference.jabber.ru
#4 Posted: 6/12/2010 9:06:59 AM
Mikka

Mikka

36 likes in 206 posts.

Group: User

Вроде все делал ка на видео, SMatch Studio принимает плагин, но при попытке вставить функцию выдает ошибку:

Необрабатываемое исключение в приложении. При нажатии кнопки "Продолжить" приложение проигнорирует ошибку и попытается продолжить работу. При нажатии кнопки "Выход" приложение немедленно завершит работу.
Не удалось привести тип объекта
"SMatch.MikTools.Plugininitializer" к типу
"SMath.Manager.IPluginLowLevelEvaluation".


using System;
using System.Collections.Generic;
using System.Text;

using SMath.Manager;
using SMath.Math;

namespace SMMikTools
{
   public class Class1 : IPluginHandleEvaluation, IPluginLowLevelEvaluation
   {
      private TermInfo[] termInfos;
      private AssemblyInfo[] asseblyInfos;

      TermInfo[] IPluginHandleEvaluation.TermsHandled
      {
         get { return this.termInfos; }
      }

      AssemblyInfo[] IPlugin.Dependences
      {
         get { return this.asseblyInfos; }
      }

      #region Члены IPluginHandleEvaluation

      public TermInfo[] TermsHandled
      {
         get { throw new NotImplementedException(); }
      }

      #endregion

      #region Члены IPlugin

      public AssemblyInfo[] Dependences
      {
         get { throw new NotImplementedException(); }
      }

      public void Initialize()
      {

         // Список обрабатываются функции плагина
         this.termInfos = new TermInfo[] {
                new TermInfo("[b]combine[/b]", TermType.Function, 2, "(n, k) - Возвращает число подмножеств", FunctionSection.Unknown, true),              
            };

         // Плагин требует SMath Studio 0,88
         this.asseblyInfos = new AssemblyInfo[] {
                new AssemblyInfo("SMath Studio", new Version(0, 88), new Guid("a37cba83-b69c-4c71-9992-55ff666763bd"),
            };
      }

      #endregion

      #region Члены IDisposable

      public void Dispose()
      {
         // тут ничего быть не должно
      }

      #endregion

      #region Члены IPluginLowLevelEvaluation

      public bool ExpressionEvaluation(Term root, Term[][] args, ref Store store, ref Term[] result)
      {
         //throw new NotImplementedException();

         if (root.Type == TermType.Function  && root.Text == "[b]combine[/b]" && root.ChildCount == 2)
         {
            Term[] arg1 = Decision.Preprocessing(args[0], ref store);
            Term[] arg2 = Decision.Preprocessing(args[1], ref store);
            // Предобработка(«Preprocessing» - описанная выше - действие необходимое, 
            // что бы правильно подготовить аргументы. Это значит, что все возможные замены будут выполняться.
            
            List <Term >
               answer = new List<Term>() ;
            
               //Теперь необходимо составить выражение массива образованное в обратной польской записи для такого математического выражения:
               // n1/(k!*(n-k)!)
               //В обратной польской записи, это выражение будет выглядеть вот так:
               //n ! k ! n k - ! * /
               //Таким образом введите следующие строки, составив список Terms:

            answer.AddRange(arg1);                                               // <- n
            answer.Add (new Term(Operator.Factorial, TermType.Operator, 1));     // !
            answer.AddRange(arg2);                                               // <- k
            answer.Add (new Term(Operator.Factorial, TermType.Operator, 1));     // !
            answer.AddRange(arg1);                                               // <- n
            answer.AddRange(arg2);                                               // <- k
            answer.Add (new Term(Operator.Substraction,TermType.Operator,2));    // -
            answer.Add (new Term(Operator.Multiplication, TermType.Operator,2)); // *
            answer.Add (new Term(Operator.Division , TermType.Operator,2));      // /

            result = answer.ToArray();
            return true ;
         }

         return false ;
      }

      #endregion
   }
}

Не официальный справочник http://sites.google.com/site/mikkhalichlab/ jabber конференция smath@conference.jabber.ru
#5 Posted: 6/12/2010 9:24:43 AM
Andrey Ivashov

Andrey Ivashov

2270 likes in 3734 posts.

Group: Super Administrator

А что такое SMatch.MikTools.Plugininitializer в сообщении об ошибке? В показанном коде я не могу найти ничего подобного.
#6 Posted: 6/12/2010 2:04:31 PM
Mikka

Mikka

36 likes in 206 posts.

Group: User

Прошу проещения, все разобрался. Просто в папке с плагинами оставалась другая моя неудачная попытка написать плагин... Теперь все работает... И код выше тоже рабочий...

Приложил почти полный перевод учебника (без части про отладку) Как написать плагин для SMatch Sudio на VB.NET (зеркало на сервере smath.info), добавил к нему часть для C#
Не официальный справочник http://sites.google.com/site/mikkhalichlab/ jabber конференция smath@conference.jabber.ru
#7 Posted: 6/12/2010 5:47:30 PM
Mikka

Mikka

36 likes in 206 posts.

Group: User

А вот еще вопрос, возможно ли поместить контрол в расчеты SMath ? я только учусь программировать на С#, по этому если можно по подробней...
Я хочу реализовать вот что...


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

з.ы. это не обязательно должна быть функция. это может быть элемент типа графика или что то в этом роде
Не официальный справочник http://sites.google.com/site/mikkhalichlab/ jabber конференция smath@conference.jabber.ru
#8 Posted: 6/13/2010 12:43:49 PM
Andrey Ivashov

Andrey Ivashov

2270 likes in 3734 posts.

Group: Super Administrator

Реализация пользовательских элементов управления посредством плагинов - это следующий шаг расширения возможностей дополнений программы. На данный момент это невозможно.

P.S.: Большое спасибо за перевод и доработку справочника.
#9 Posted: 6/14/2010 8:20:32 AM
Mikka

Mikka

36 likes in 206 posts.

Group: User

Жаль, буду ждать...
Не официальный справочник http://sites.google.com/site/mikkhalichlab/ jabber конференция smath@conference.jabber.ru
#10 Posted: 6/14/2010 10:22:21 PM
hard-t

hard-t

0 likes in 11 posts.

Group: User

Я так понимаю плагины надо писать на C#. Я к примеру неплохо знаю С++ и java (ну и ассемблер). Так вот, возможно ли применять эти языки для создание плагинов?
#11 Posted: 1/8/2012 10:04:06 PM
Lrrr

Lrrr

0 likes in 8 posts.

Group: User

Добрый день! Познакомился с SMath, надо сказать был приятно поражен соотношением возможности/размер программы. Спасибо. Пытаюсь осваивать.
Хотелось бы узнать ответы на два вопроса, если не затруднит.
1. Можно ли заставить функцию "ExpressionEvaluation" вернуть строку, которую можно ? извините, чего-то не могу найти описание от Term и не очень понимаю как с ним работать
2. Возможно ли создать свой элемент управления (панель инструментов, например)? Хотелось бы иметь такой элемент, например, для управления передачей данных во внешние приложения.
#12 Posted: 1/11/2012 6:45:02 AM
Andrey Ivashov

Andrey Ivashov

2270 likes in 3734 posts.

Group: Super Administrator

Здравствуйте!

Wrote

Можно ли заставить функцию "ExpressionEvaluation" вернуть строку, которую можно ? извините, чего-то не могу найти описание от Term и не очень понимаю как с ним работать


Term - это компонента выражения, т.е. это может быть оператор (+ или - или другой), операнд (число, единицы измерения или имя переменной), функция или скобки.
Выражение состоит из массива таких компонентов (Term[]), но располагаются компоненты в нём в порядке обратной польской нотации, потому первое время разбирать глазами такие массивы может быть сложно. Если же Вы хотите, что бы программа самостоятельно перевела Term[] в "человеческий" (т.е. инфиксный) вид, то используйте следующий метод: SMath.Manager.Converter.ToString(здесь_вставляйте_массив_компонент);

Wrote

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


Расширять панель инструментов пока нельзя, но такая возможность обязательно появится позже.

Посмотрите также тему на английском форуме: custom regions - там я показал, какие дополнения стало возможно создавать в последней версии.
#13 Posted: 1/12/2012 4:18:51 AM
Lrrr

Lrrr

0 likes in 8 posts.

Group: User

Большое спасибо за ответ, особенно за ссылочку на примеры. Будем изучать. Особенно заинтересовала возможность создания элементов управления. Как в Mathcad. Хотя, может это и не очень хорошая идея вставлять кнопки, переключатели и списки в рабочий документ? Рабдок сразу приобретает "непечатный" вид. Может лучше открывать их в окне "Менеджер свойств" при выборе выражения? Или в окне диалога при вызове из контекстного меню/контекстной панели инструментов? А в выражении показывать только результат выбора? Ой..Извиняюсь за офф-топ.
  • New Posts New Posts
  • No New Posts No New Posts