Русскоязычный форум закрыт из-за отсутствия активности (доступен только для чтения).
Пожалуйста, пользуйтесь англоязычной его версией. Приносим извинения за неудобства
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Вход


4 Страницы<1234>
Опции
К последнему сообщению К первому непрочитанному
Offline uni  
#41 Оставлено : 19 апреля 2011 г. 20:53:15(UTC)
uni


Статус: Advanced Member

Группы: Registered, Advanced Member
Зарегистрирован: 15.03.2011(UTC)
Сообщений: 3
Мужчина
Российская Федерация

Сказал «Спасибо»: 563 раз
Поблагодарили: 1 раз в 1 постах
Между прочим, плагины можно писать и под линуксом в MonoDevelop'е. Работают, правда что-то с русским текстом кое-где, но пример скомпилировался...
Offline smath  
#42 Оставлено : 4 августа 2011 г. 9:36:08(UTC)
smath


Статус: Administration

Группы: Developers, Registered, Knovel Developers, Administrators, Advanced Member
Зарегистрирован: 11.07.2008(UTC)
Сообщений: 912
Мужчина
Российская Федерация

Сказал «Спасибо»: 640 раз
Поблагодарили: 262 раз в 102 постах
Адрес репозитория изменился. Новый путь: https://smath.info/svn/public
thanks 1 пользователь поблагодарил smath за этот пост.
уни оставлено 04.08.2011(UTC)
Offline уни  
#43 Оставлено : 4 августа 2011 г. 23:42:58(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
А старые пароли (на запись) уже не работают? Да и анонимный вход что-то не фурычит.

Отредактировано пользователем 4 августа 2011 г. 23:50:14(UTC)  | Причина: Не указана

Россия навсегда!
Вячеслав Мезенцев
Offline smath  
#44 Оставлено : 5 августа 2011 г. 19:00:47(UTC)
smath


Статус: Administration

Группы: Developers, Registered, Knovel Developers, Administrators, Advanced Member
Зарегистрирован: 11.07.2008(UTC)
Сообщений: 912
Мужчина
Российская Федерация

Сказал «Спасибо»: 640 раз
Поблагодарили: 262 раз в 102 постах
Старые пароли работают (в том числе и ваш, проверил), а анонимный вход починил - теперь репозиторий снова доступен для просмотра всем желающим.
thanks 1 пользователь поблагодарил smath за этот пост.
уни оставлено 05.08.2011(UTC)
Offline уни  
#45 Оставлено : 8 августа 2011 г. 0:31:12(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Тут имеется хороший веб-интерфейс для исходников: https://github.com/ . Если дублировать заливку кода и туда, то можно иметь относительно простой способ просмотра исходников через броузер. Правда основан он на jit vcs.

Если в форуме когда-нить кто-нить будет обсуждать код, удобно было бы иметь какой-нить непосредственный доступ к хранилищу, минуя клиенты. Как, к примеру, делают на mysvn.ru:
https://mysvn.ru/schoolbell/bell/src/

Здесь, правда, у них очень примитивный доступ. Там есть и trac-система, но она очень мудрёна даже для простого просмотра.

Короче говоря, было бы неплохо иметь возможность на форуме дать ссылку на конкретный листинг конкретного файла и чтобы он открывался в броузере. В github.com есть возможность скачивать исходник в виде архива.

Отредактировано пользователем 8 августа 2011 г. 0:33:15(UTC)  | Причина: Не указана

Россия навсегда!
Вячеслав Мезенцев
Offline Antech  
#46 Оставлено : 7 августа 2012 г. 17:12:42(UTC)
Antech


Статус: Member

Группы: Registered
Зарегистрирован: 13.09.2010(UTC)
Сообщений: 28
Откуда: Solar System, Earth

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 1 раз в 1 постах
Здравтсвуйте. Я довольно часто пользую базовые функции SMath, но тут появилась необходимость расчета теплофизики воды. У меня есть библиотека моего знакомого (написана на Delphi 32-бит), она бесплатная (Alex.dll по таблицам Александрова). Я решил сделать плагин на C#, чтобы подключить Alex.dll в SMath. Но я совсем не знаю C# (пишу на Visual Fortran и C++). Вчера я весь день занимался тем, чтобы заставить плагин работать. ОК, он запускается. Но возникла проблема с загрузкой неуппавляемой DLL. Как я понял, есть два способа сделать это: DllImport и DllImport+LoadLibrary+GetProcAddress. Ни один способ не заработал!!! Компилируется без ошибок (у меня Visual Studio 2008 Express 32-битная). Но загружать 32-битную DLL не хочет! У меня Win7 x64, компилятор C# (как я понял) 32-битный (в настройках проекта разрядность не нашел), SMath текущая стабильная версия. Симптомы такие:

1. Загрузка через dllImport:
Код:
class Import
{
 [DllImport("Alex.dll"]
 public static extern double WtrPrpEntByPrsTempExt(double prs,double temp);
}

...

result=Import.WtrPrpEntByPrsTempExt(argPri,argSec);

Компилится нормально, при вычислении функции в SMath "Была сделана попытка загрузить программу, имеющую неверный формат". Функция выделяется красным, разумеется, нихрена не считается Sad

2. Загрузка через LoadLibrary:
Код:
class Import
{
 [DllImport("Kernel32.dll")]
 public static extern IntPtr LoadLibrary(string lpFileName);
}

...

hLib=Import.LoadLibrary("Alex.dll");

Результат - в дебаге (сделал по инструкции SMath для VS Express) видно, что хэндл DLL'а нулевой. Код ошибки (Import.GetLastError) - 193, "не является приложением Win32" (ну это у Микрософта глюкавые сообщения об ошибках, на самом деле то же, что и в первом случае: не является приложением Win64).

Пробовал другие 32-битные DLL (разные) - та же фигня (GetLastError 193). Пробовал 64-битный DLL от Comodo "framework.dll" - прекрасно загружается. Т.е. проблема именно с 32-битным DLL под x64 системой.

Можно ли обойти эту ошибку и загрузить мой любимый 32-битный DLL? Или опять MathCad? Маткад-то прекрасно работает, но хотелось бы SMath...

Отредактировано пользователем 7 августа 2012 г. 17:14:49(UTC)  | Причина: Syntax

Offline kmihaylovich  
#47 Оставлено : 7 августа 2012 г. 17:32:27(UTC)
kmihaylovich


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 24.07.2008(UTC)
Сообщений: 97
Откуда: Питер

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 3 раз в 3 постах
Попробуйте в свойствах вашего проекта (проекта плагина) вместо ANY CPU выставить 32 bit. Вот тут обсуждается этот вопрос: http://stackoverflow.com...n-64-bit-net-application
thanks 1 пользователь поблагодарил kmihaylovich за этот пост.
Antech оставлено 07.08.2012(UTC)
Offline Antech  
#48 Оставлено : 7 августа 2012 г. 18:06:06(UTC)
Antech


Статус: Member

Группы: Registered
Зарегистрирован: 13.09.2010(UTC)
Сообщений: 28
Откуда: Solar System, Earth

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 1 раз в 1 постах
kmihaylovich
Спасибо за совет! К сожалению, это не помогло...

В общем, если выставить AnyCPU, то SMath загружает плагин, но функции, разумеется, не работают (32-битный DLL не грузится). Если в плагине выставить x86, то он не загружается: SMath говорит, что не тот формат...

ИМХО SMath сконфигурирован как "Any CPU" и аналогично моему плагину не может загрузить C# DLL плагина, сконфигуренный как x86. Если же делать плагин Any CPU, то он не грузит 32-битный Alex.dll. Что интересно, в Маткаде далеко не такой продвинутый механизм плагинов, но зато он без проблем разботает в x86 и x64. И, что неприятно, мой SMath-файл для параметров топлива будет неполноценный...

Отредактировано пользователем 7 августа 2012 г. 21:03:59(UTC)  | Причина: Не указана

Offline tca  
#49 Оставлено : 7 августа 2012 г. 21:29:24(UTC)
tca


Статус: Member

Группы: Registered
Зарегистрирован: 06.02.2011(UTC)
Сообщений: 15
Мужчина
Откуда: Тамбов

Сказал «Спасибо»: 24 раз
Поблагодарили: 11 раз в 9 постах
Была такая же проблема для 32 битных dll в 64 битной среде.

Решилась установкой 32 битного флага в файле SMathStudio_Desktop.exe утилитой CorFlags.exe



Вложение(я):
CorFlags.zip (32kb) загружен 42 раз(а).
thanks 1 пользователь поблагодарил tca за этот пост.
Antech оставлено 08.08.2012(UTC)
Offline Antech  
#50 Оставлено : 8 августа 2012 г. 0:26:13(UTC)
Antech


Статус: Member

Группы: Registered
Зарегистрирован: 13.09.2010(UTC)
Сообщений: 28
Откуда: Solar System, Earth

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 1 раз в 1 постах
tca
Спасибо! Сейчас уже ночь, как будет возможность - попробую!
Offline уни  
#51 Оставлено : 8 августа 2012 г. 4:46:40(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Если работает в Mathcad плагин ваш, то можно попробовать использовать его же через местный плагин UserEFI: http://ru.smath.info/for...Mathcad-EFI-plaghin.aspx
Россия навсегда!
Вячеслав Мезенцев
Offline Antech  
#52 Оставлено : 8 августа 2012 г. 12:32:31(UTC)
Antech


Статус: Member

Группы: Registered
Зарегистрирован: 13.09.2010(UTC)
Сообщений: 28
Откуда: Solar System, Earth

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 1 раз в 1 постах
Да, к сожалению, этот C# совершенно неюзабелен по сравнению с нормальным C++.

В общем, скачал CorFlags.exe в составе Framework 4 SDK. Флаг в SMath поменял. Теперь мой плагин приводит к вываливанию SMath (выполняет недопустимую операцию) при нажатии на кнопку выбора функции "f(x)". В режиме дебага происходит то же самое. Ладно, функцию можно ввести, не заходя в окно выбора.
Но теперь возникла другая проблема: хотя указатели на функции, по всей видимости, задаются (это не C++ и как проверить значение указателя на фунцию - неясно), возникает математическая ошибки "потеря точности или переполнение" при обращении к функции Alex.dll (стоит ли говорить, что у меня эта библиотека и на C++, и на Frotran 90 уже годами работает). Попробовал try/catch: Smath на эту ошибку не ругается, но и значение функции не вычисляется, т.е. отвал по catch происходит раньше, чем присваивается результат функции из DLL, что и понятно. В свойствах проекта VS2008 Express никаких опций, относящихся к обработке ошибок, я не нашел. Можно как-то решить эту проблему?

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

Таки попробовал Ваш интерфейс для Mathcad. Alex.dll прекрасно работает, большое спасибо. Но мне просто интересно: нельзя ли как-то заставить работать мой вариант?

Отредактировано пользователем 8 августа 2012 г. 12:47:48(UTC)  | Причина: Не указана

Offline уни  
#53 Оставлено : 8 августа 2012 г. 14:09:22(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Мне сложно ответить на этот вопрос, так как я отказался от маршаллинга и по совету в одном посте из рунета написал оболочку на C++/CLI - управляемом C++. Ваш случай я пока не понял, нужно более подробно описать что и как. Вообще же, плагины для SMath Studio можно писать и на управляемом C++. В моём варианте есть особый случай: плагин должен экспортировать функции для того, чтобы подключать Маткад библиотеки и одновременно он должен быть сборкой .Net. Я не знаю можно ли это совместить в одной dll, поэтому разбил проект на две части.

В вашем случае, если подключаемая dll не использует какого-то особого протокола регистрации, думаю можно подключить её через дополнение на C++/CLI. Этот язык специально для этого создавался.
Россия навсегда!
Вячеслав Мезенцев
Offline Antech  
#54 Оставлено : 8 августа 2012 г. 15:45:43(UTC)
Antech


Статус: Member

Группы: Registered
Зарегистрирован: 13.09.2010(UTC)
Сообщений: 28
Откуда: Solar System, Earth

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 1 раз в 1 постах
уни
нужно более подробно описать что и как
Я только два дня назад пощупал кроссплатформенный программинг Good Я использовал C# в Visual Studio 2008 Express. В этом C# делается через маршаллинг (млин, у них там Delegate и Marshall - более технических терминов не нашлось). Т.е. вначале в отдельном классе Import объявляю внешние функции LoadLibrary() и т.д. из DLL (kernel32.dll) через DllImport, а потом - загружаю неуправляемый DLL через LoadLibrary() и получаю указатель на функцию через GetProcAddress (как я и делал всегда на WinAPI). После этого делаю стандартно маршаллинг (правильности типов аргументов проверил) и превращаю указатель в делегат (т.е. в C#-указатель). Но фигня, вероятно, в том, что в этом неуправляемом DLL (Alex.dll) где-то происходит минорная ошибка типа float=double и вылезает ошибка "потеря точности или переполнение" (либо в балуне SMath, если просто запускать, либо в дебагере). А может и более значительная ошибка. При этом в Alex.dll дебагер лезть не хочет, да и исходников от него нет, поэтому отследить где и в чем ошибка я не могу. Да, аргумент(ы) пробовал константами задавать - та же фигня: делегат, установленный на функцию из "водяного" DLL, отваливается с той же ошибкой.

В общем, спасибо за помощь, буду пользовать Ваше гениальное творение. Еще и некий C++/CLI копать - это слишком Good, времени на него сейчас нету, надо еще и другим заняться...

Отредактировано пользователем 8 августа 2012 г. 15:47:45(UTC)  | Причина: Не указана

Offline уни  
#55 Оставлено : 8 августа 2012 г. 16:49:16(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
"Более подробно" - это означает показать исходный код и желательно весь какой есть, в том числе и тот, где ведётся работа с этой dll на других языках. Дело ещё и в том, что, если это стандартная userefi-dll, то она при старте ищет модуль mcaduser.dll, чтобы зарегистрироваться в системе (Mathcad, SMath), т.е. импортирует некоторые функции оттуда (CreateFunction(), MathcadAllocate(), MathcadFree() и т.д.). Некоторые такие dll после неуспешной регистрации могут просто блокировать работу функций. Т.е. нужна внутренняя логика работы этой dll на всех этапах работы с ней. При работе в составе математической системы они работу с неуправляемой памятью возлагают на эту систему и самостоятельно не выделяют и не освобождают память. Это очень важно, если же эти функции недоступны, то соответственно ничего работать не будет и dll вообще не должна загружаться. Что-то в таком духе.

П.С. Аналогичным способом подключается другая известная библиотека: using Water Steam Pro 6.0.1.36

Отредактировано пользователем 8 августа 2012 г. 21:15:53(UTC)  | Причина: Не указана

Россия навсегда!
Вячеслав Мезенцев
Offline Antech  
#56 Оставлено : 11 августа 2012 г. 12:33:23(UTC)
Antech


Статус: Member

Группы: Registered
Зарегистрирован: 13.09.2010(UTC)
Сообщений: 28
Откуда: Solar System, Earth

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 1 раз в 1 постах
уни
Извиняюсь, что долго не отвечал. Я использовал Ваш плагин и уже доделал "топливный" файл для SMath.
Исхоный код не показывал, потому что думал, что там все стандартно (хотя часть я показывал выше). Сейчас, наверное, уже нет смысла, потому что если даже оно заработает (что врядли), мне придется в каждой версии SMath поднимать флаг 32BIT. Так что я лучше буду через Ваш плагин подключать.
Что касается регистрации в вызывающей программе, то у меня обычный 32-битный DLL (это мой товарищ написал на Delphi в далеком теперь 2002 году). Все, что нужно для его работы, - LoadLibrary и GetProcAddress.
Про WSP я хнаю, но он платный, а мне нужен freeware. Я в Вашем плагине (в архиве) нашел еще одну реализацию того же IF-97 (XSteam). Она даже работает и free. Попробовал наугад энтальпию в одной точке - на несколько кДж/кг расходится с Alex.dll (хотя в нем, вроде, достаточно точно считается, я когда-то делал сравнение с WSP). В общем, пока что пользую ALex.dll.
Offline уни  
#57 Оставлено : 13 августа 2012 г. 19:15:45(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Андрей, не могу понять как рисовать на канве при создании компонента.

[img=http://ru.smath.info/?file=740071&type=image]Ошибка при отображении изображения[/img]

Создал дополнение по аналогии с CheckBoxRegion. Делаю вроде по аналогии:

Код:

    class CImageRegionEvaluable : RegionEvaluable {

        internal Image image;

        //...

        public override void OnPaint( PaintEventArgs e ) {

            base.OnPaint( e );

            if ( image != null ) {

                e.Graphics.DrawImage( this.image, 0, 0 );
            }
            
        }
    }



Россия навсегда!
Вячеслав Мезенцев
Offline уни  
#58 Оставлено : 13 августа 2012 г. 19:21:40(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Изображение гружу так (вставка кода csharp на форуме глючит - нельзя два куска кода в одном сообщении вставить):

Код:

        public override void OnEvaluation( Store store ) {        
            // Если параметр области является строкой, то делаем допущение, что это путь к файлу
            if ( ( base.Terms.Length == 1 ) && ( base.Terms[0].Type == TermType.Operand ) && store.IsDefined( Terms[0] ) ) {               
                              
                Term[] out1 = Decision.Preprocessing( Terms, ref store );

                // Вычисляем получившийся вектор
                TDouble out2 = ( TDouble ) SMath.Math.Numeric.Expression.Calculate( out1, store ).obj;

                if ( out2.isText ) {

                    // Убираем обрамляющие кавычки
                    string ImageFileName = out2.Text.Replace( "\"", "" );

                    // Файл должен существовать                    
                    if ( File.Exists( ImageFileName ) ) {

                        base.canv.image = Image.FromFile( ImageFileName );

                    } else {

                        // TODO: Заменить заглушку
                        //throw new FileNotFoundException( "File not found: " + out2.Text );

                    }

                }

            }

        }

В результате, если размеры подвигать, то видно, что размер изображения считывается (я Resize() обрабатываю и не даю изменять размеры), но на компоненте нет загруженного изображения. Не могу понять почему.
Россия навсегда!
Вячеслав Мезенцев
Offline smath  
#59 Оставлено : 14 августа 2012 г. 1:23:19(UTC)
smath


Статус: Administration

Группы: Developers, Registered, Knovel Developers, Administrators, Advanced Member
Зарегистрирован: 11.07.2008(UTC)
Сообщений: 912
Мужчина
Российская Федерация

Сказал «Спасибо»: 640 раз
Поблагодарили: 262 раз в 102 постах
Ответил в скайпе. Суть в том, что вместо
e.Graphics.DrawImage( this.image, 0, 0 );
нужно использовать
e.Graphics.DrawImage( this.image, e.ClipRectangle.X, e.ClipRectangle.Y );
thanks 1 пользователь поблагодарил smath за этот пост.
уни оставлено 14.08.2012(UTC)
Offline уни  
#60 Оставлено : 14 августа 2012 г. 1:51:14(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Да, это сработало, я был невнимателен к оригиналу. Теперь ещё одна проблема: как сделать так, чтобы при первом вычислении размер компонента подстроился под размер загружаемой картинки? Т.е. как правильно изменить размеры? Пробовал после загрузки Resize() вызывать, но не помогло, хотя обработчик этого Resize() у меня чётко "держит" размер картинки при ручном изменении размеров.

[img=http://ru.smath.info/?file=740072&type=image]Проблема с размером[/img]
Россия навсегда!
Вячеслав Мезенцев
Пользователи, просматривающие эту тему
4 Страницы<1234>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.