Как создать плагин (дополнение) для SMath Studio

Как создать плагин (дополнение) для SMath Studio - Сообщения

#1 Опубликовано: 13.02.2010 02:28:12
Andrey Ivashov

Andrey Ivashov

2270 сообщений из 3734 понравились пользователям.

Группа: Super Administrator

Описание
Проект SMath теперь предоставляет общий доступ к SVN репозиторию, на котором доступны исходники открытых плагинов (дополнений) к программе SMath Studio. Данный репозиторий может содержать как плагины (дополнения) созданные разработчиками SMath Studio, так и разработчиками, никак не связанными с проектом.

Параметры репозитория
Путь: https://smath.info/svn/public
Права: анонимный доступ на чтение (логин и пароль не требуются)

Как получить доступные исходники
  1. Загрузите программу-киент SVN: TortoiseSVN.
  2. Установите программу (возможно, в процессе установки потребуется перезагрузка).
  3. Создайте папку на диске Вашего компьютера, где будут храниться исходники.
  4. Нажмите правой клавишей по созданной папке и в появившемся контектном меню выберите пункт "SVN Checkout...".
  5. Заполните текстовые поля появившегося диалога (обычно, достаточно указать путь к репозиторию) и нажмите кнопку OK.
  6. Доступные исходники будут загружены на Ваш компьютер.

Как загрузить изменения в репозиторий
Репозиторий дуступен для чтения любому пользователю, но права на запись необходимо запросить по почте на адрес support[at]smath[dot]info если Вы хотите выложить свой проект или модифицировать уже существующий.
1 пользователям понравился этот пост
Iosif 10.06.2015 03:35:00
#2 Опубликовано: 13.02.2010 02:29:46
Andrey Ivashov

Andrey Ivashov

2270 сообщений из 3734 понравились пользователям.

Группа: Super Administrator

Программой SMath Studio 0.87 поддерживаются три типа дополнений (в следующих версиях программы их количество будет расти).
  1. Поддержка низкоуровневых вычислений (интерфейс IPluginLowLevelEvaluation).
    Описание: Все математические выражения программы изначально хранятся и обрабатываются ею в виде обратной польской записи. Данный интерфейс позволяет внедриться в самую низкоуровневую обработку выражений SMath Studio. При вычислении выражений плагин будет оповещён о каждом встретившемся операнде (переменной), операторе и функции. Получив информацию о текущем вхождении дополнение сможет произвольно изменить список элементов выражения в виде ОПЗ, что даёт возможность полностью управлять вычислением самым быстрым способом. Одновременно, реализация данного интерфейса является самой сложной. Важно также понимать, что низкоуровневая обработка математических выражений проходит до попадания этих выражений в численную или символьную библиотеку, а значит через данную обработку будет проходить абсолютно любое выражение, запросившее вычисление.
    Применение: Использование данного типа перехвата вычислений имеет смысл для операций, которые должны быть обработаны независимо от выбора типа вычисления пользователя: символьного или численного. Например, вычисление функции синуса нет необходимости выполнять на данном этапе, т.к. символьная библиотека должна получить не десятичную дробь (именно такой ответ в общем случае будет после вычисления синуса), а исходную функцию для дальнейших упрощений. И наоборот, функцию сочетаний (см. видео) стоит обрабатывать именно в этом интерфейсе, что бы не пришлось реализовывать её дважды, в численной и символьной библиотеке (ведь её результат должен быть виден при выборе любого типа вычислений).
    Приоритет: Дополнение опрашивается до обработки элементов выражений в численной или символьной библиотеке и до выполнения встроенных в SMath Studio правил (правил обработки операторов, переменных и функций), но лишь после учёта объявленных пользователем переменных и функций.
    Типы объектов: Каждый элемент выражения представлен классом Term и хранит в себе информацию о текстовом значении элемента (например имя функции), о его типе (функция, операнд, оператор или скобка) и количестве зависимых от него элементов (например количество аргументов функции).
  2. Поддержка численных вычислений (интерфейс IPluginMathNumericEvaluation).
  3. Поддержка символьных вычислений (интерфейс IPluginMathSymbolicEvaluation).


Подробная инструкция по созданию дополнений в разработке. Пожалуйста будьте терпеливы.
#3 Опубликовано: 23.08.2010 06:35:00
alexant

alexant

0 сообщений из 21 понравились пользователям.

Группа: User

Хочу попытаться поправить, с позволения автора, плагин передачи данных в excell,
но при попытке загрузить с svn выдает следующую ошибку:
Can't connect to host 'smath.info': Es konnte keine Verbindung hergestellt
werden, da der Zielcomputer die Verbindung verweigerte.
Тоесть:
не может создать соединение, так как удаленный комп соединение отклонил.

Не нашел, где указать анонимного пользователя - может из-за этого..

А вообще мне лишь нужен исходник на плагин с функциями exportcell, importcell.

Спасибо.
#4 Опубликовано: 23.08.2010 06:47:52
alexant

alexant

0 сообщений из 21 понравились пользователям.

Группа: User

И еще одно "хочу":
Может конечно не совсем к этой теме...

Как мне иметь доступ к функциям и значением из екселя например.

Либе Грюсе!
#5 Опубликовано: 23.08.2010 06:56:19
Andrey Ivashov

Andrey Ivashov

2270 сообщений из 3734 понравились пользователям.

Группа: Super Administrator

Возможно Вы пытались соединиться в момент, когда сервер действительно был недоступен. Убедитесь, так же, что в качестве пути Вы указали svn://smath.info/public, а не http://smath.info/public. Если бы проблема была в авторизации, то ошибка была бы соответствующая. Исходники проекта ExcelCollab в репозитории.

С уважением.
#6 Опубликовано: 23.08.2010 07:58:41
alexant

alexant

0 сообщений из 21 понравились пользователям.

Группа: User

Ну как бы и сейчас пытаюсь - вряд ли дело в сервере.
А как svn протокол с нод32
контачит? Может дело в его файрволе?

Чтобы я пока на это время не тратил, можно, пожалуйста мне на почту кинуть исходник?
#7 Опубликовано: 23.08.2010 08:23:21
Andrey Ivashov

Andrey Ivashov

2270 сообщений из 3734 понравились пользователям.

Группа: Super Administrator

Отправил. Проблема возможно и в firewall-е.
#8 Опубликовано: 05.11.2010 09:17:42
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

VisualSVN очень хорошая штуковина, если её подлечить.

Попробовал тут возможности интерфейса IPluginLowLevelEvaluation. Не хило. В отличие от видео-руководства тип переменных нужно уже указывать явно, а не просто количество:
        void IPlugin.Initialize() {
            this.ИнформацияСборки = new AssemblyInfo[] {
                // Plugin requires to be installed with SMath Studio 0.87 or later version
                new AssemblyInfo( "SMath Studio", new Version( 0, 89 ), new Guid( "a37cba83-b69c-4c71-9992-55ff666763bd" ) )
            };

            this.ИнформацияФункции = new TermInfo[] {
                    new TermInfo( "combin", TermType.Function, "(n, k) - возвращает число подстановок", FunctionSections.Unknown, true,
                        new ArgumentInfo[] { new ArgumentInfo( ArgumentSections.ComplexNumber ), new ArgumentInfo( ArgumentSections.ComplexNumber ) } ) 
            };
        }
Может я отстал от жизни, но выглядит всё это хозяйство сложновато. Наверное отстал. Хотя такой тип вычислений был ещё на калькуляторах МК-61.

А Decision.Preprocessing() для поддержки функций в качестве операнда, т.е. развёртывает функцию?

По сравнению с маткадовским плагинным интерфейсом UserEFI (видимо Extended Function Interface) всё намного сложнее, т.к. возможностей больше.

Может быть кому-то будет интересным про порядок записи выражения. В сети есть МК-61. Руководство по эксплуатации (pdf). Там раздел "6.6. Выполнение двухместных операций" на стр. 50.
Россия навсегда! Вячеслав Мезенцев
#9 Опубликовано: 05.11.2010 10:19:10
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

AlgLib не доделан что-ли? Или это просто рыба? Компилируется с двумя ошибками... а при попытке прояснить ситуацию, кажется, что не реализованы посредники между библиотекой и SMath. И вообще, похоже что написано по некой уже устаревшей идеологии.
Россия навсегда! Вячеслав Мезенцев
#10 Опубликовано: 05.11.2010 11:32:58
build_your_web

build_your_web

4 сообщений из 127 понравились пользователям.

Группа: User

Я работал над интеграцией alglib в качестве плагина для smath.

Как оказалось c# версия этой библиотеки полностью сделана кодогенератором.
Т.е.
* количество неадектваного кода очень велико
* код не оптимизирован под .net, да и вобще не оптимизирован (кодогенератор)
* связаться по каким-то вопросам по этому проекту не с кем

В качестве вероятной замены рассматривал Math.NET.
Но как раз тогда я переключился на другое направление, поэтому заменить alglib чем-то другим так и не успел.
#11 Опубликовано: 05.11.2010 17:32:01
Andrey Ivashov

Andrey Ivashov

2270 сообщений из 3734 понравились пользователям.

Группа: Super Administrator

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

Wrote

В отличие от видео-руководства тип переменных нужно уже указывать явно, а не просто количество


Пришлось так сделать, что бы генерировать левую часть описания функции автоматически. Раньше описание надо было заполнять так: "('первыйАрг', 'второйАрг') - Возвращает 'первыйАрг' умноженный на 'второйАрг'.", а теперь: "Возвращает {0} умноженный на {1}.", где названия аргументов будут зависеть от их типа из описания функций плагина. Очень удобно. К тому же решение позволило избавится от некоторых ошибок, которые делают переводчики (каждый указывал разделитель между аргументами такой, какой хотелось, а теперь программа выбирает его на основе настроек ОС и программы; похожие проблемы были и с кавычками, в которые включены имена аргументов, с пробелами и т.п.).

Wrote

А Decision.Preprocessing() для поддержки функций в качестве операнда, т.е. развёртывает функцию?


Метод Preprocessing занимается подстановкой определённых пользователем на листе функций и переменных, основываясь на их списке из store (контекст вычисления). Так же метод опрашивает плагины на наличие реализованных функций/переменных и вызывает реализации, если такие имеются. К тому же Preprocessing приводит все единицы измерения к основным, т.е. 10*'km переведёт в 10*1000*'m.
Обычно, за редкими исключениями, Preprocessing имеет смысл вызывать для каждого аргумента функции переданного в плагин. А играясь с передаваемым store можно делась с выражением различные преобразования. Ещё метод содержит в себе несколько алгоритмов для предотвращения входа в бесконечные циклы.

С уважением, Андрей Ивашов.
#12 Опубликовано: 05.11.2010 18:46:15
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Цитата

а теперь: "Возвращает {0} умноженный на {1}.", где названия аргументов будут зависеть от их типа из описания функций плагина. Очень удобно.


Да, я заметил странность описания функций в окне выбора, надо было догадаться, что это автомат заполняет шаблоны. Между прочим, в маткадовском интерфейсе тоже нужно указывать явно тип переменных, причём, как входных так и результата.

Я тут поэкспериментировал немного и думаю, что в принципе можно из ОПЗ налету генерировать неуправляемый код и результаты уже его вычисления подставлять в качестве результата. Правда для этого придётся немного продублировать работу, т.к. все функции придётся описывать самому. Если мне не изменяет память, ОПЗ используется сопроцессором и тогда можно естественно переписать код на ассемблере. Хочу убыстрить вычисление в особых функциях радикальным образом.
Россия навсегда! Вячеслав Мезенцев
#13 Опубликовано: 08.11.2010 06:20:48
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

build_your_web, я посмотрел библиотеку и исходники более подробно. В принципе, там чисто рутинные "оболочки" нужно написать. Это нудновато, зато вполне работоспособно:

Если желание не пропало, то давай доделаем на пару. Версия ALGLIB 3.1.0 выглядит уже более компактно. Думаю, что даже ODEsolver() прикрутить можно будет, если в дополнении можно вычислять передаваемые "ТЕРМические" функции.

Начал тут эпопею:


Заказы на функции принимаются В планах: fft и свёртки.
Россия навсегда! Вячеслав Мезенцев
#14 Опубликовано: 08.11.2010 08:36:35
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Вопрос такой. Написал тут обёртку для комплексного fft. Вот такая вещь работает:
                for ( int ii = 0; ii < Длина; ii++ ) {
                    врм = new TComplex( Буфер[ii].x,Буфер[ii].y );
                    Результат.unit.SetValue( ( TNumber ) врм , new long[] { ii, 0L } );
                }[/code]а вот такая нет:
[code]                for ( int ii = 0; ii < Длина; ii++ ) {
                    Результат.unit.SetValue( new TComplex( Буфер[ii].x,Буфер[ii].y ), new long[] { ii, 0L } );
                }

Перегруженный метод для комплексной матрицы отсутствует, а всё равно работает


П.С. Короче, кто не понял. TComplex приводится к TNumber... очень смешно, если учесть, что TNumber - это одно число, а TComplex - два. Ну... как бы И конструктор у TMatrix принимает только TNumber[,]
Дааа, без описалова трудно будет понимать тайные родственные связи.
Россия навсегда! Вячеслав Мезенцев
#15 Опубликовано: 08.11.2010 12:18:12
build_your_web

build_your_web

4 сообщений из 127 понравились пользователям.

Группа: User

2 уни.

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

Опыта хватает, цели можешь ставить любой сложности.
skype: r-u-s-lan
icq: 255-133-308
#16 Опубликовано: 08.11.2010 14:57:53
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Я ошибся, оказывается TNumber - это общий класс. Нашёл маленькое описание.

build_your_web
Ну раз так, то чего мелочиться-то. Там в руководстве написано, что:
SMath.Math.Numeric.Expression.Calculate(Term) - Numeric expression calculation

Если эта штука вычисляет термическое выражение, то можно попробовать приделать odesolve из библиотеки.
Наверное это сложно, да и скорость вряд ли будет большой. Зато эту технологию передачи функции внутрь плагина можно будет использовать для других функций, в частности: implicitplot2d(), implicitplot3d(), CreateMesh(), CreateSpace() - по аналогии с маткадовскими. В двух последних нужно передавать вектор из функций, как и в решателе ODE.

Попробую описать план действий и разбить на этапы по пакетам AlgLib. Там не так много функций, как я думал. Не n * 1000 как в Maple.

Да, кстати. Можно сделать интерфейс для подключения маткадовских пользовательских библиотек, если кому нужно, чтобы не переписывать старое ПО.
Россия навсегда! Вячеслав Мезенцев
#17 Опубликовано: 08.11.2010 15:29:04
build_your_web

build_your_web

4 сообщений из 127 понравились пользователям.

Группа: User

Пользовательских - это открытых для использования сторонними программами?
Не хочется нарушать чьих-то лицензий.
#18 Опубликовано: 08.11.2010 15:38:21
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Цитата

Пользовательских - это открытых для использования сторонними программами?


Почти да Я сам когда-то писал такие функции. Там будет проблема небольшая, т.к. алгоритм их вызова немножко мудрёный и "неуправляемый". С другой стороны я не видел так уж много библиотек, написанных для маткада.

Лицензии не нарушим. Это устаревший механизм. PTC пытается заменить его на что-то по-лучше, а вот Mathsoft за 10 лет так ничего и не придумала. Т.о. можно "приютить" в SMath чужие библиотечки, которые будут "утеряны" в случае отказа от механизма UserEFI в новых версиях.
Россия навсегда! Вячеслав Мезенцев
#19 Опубликовано: 08.11.2010 16:21:23
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Да, и самое интересное. Думается мне, что можно приделать к SMath Studio (на пока) символьный движок от Maple V R4. Это который шёл со всеми Маткадами до 13 версии, начиная то ли с 5-ой, то ли с 6-ой версии.

Библиотека (не упакованная) размером где-то с 2 метра + 4 метра функций. Для этого нужно налету переделывать синтаксис SMath-выражений на язык Maple и обратно, чтобы показывать результат. Вот это работка поинтересней, правда тут лицензии будут нарушаться , т.к. я переделал WMAPLE.EXE в mkernel.dll, чтобы можно было им пользоваться.

Вот это будет моща. Там около 3000 функций и куча багов

Вещь редкая, достать сложно.
Россия навсегда! Вячеслав Мезенцев
#20 Опубликовано: 08.11.2010 17:56:52
build_your_web

build_your_web

4 сообщений из 127 понравились пользователям.

Группа: User

Что-то не нравится мне идея подключать гигантские библиотеки.
99% пользователей хватит одной сотни функций. Так зачем заставлять их грузить такие монстры?!
  • Новые сообщения Новые сообщения
  • Нет новых сообщений Нет новых сообщений