Михаил Одинцов
Постоянный посетитель
Всего сообщений: 148
Дата регистрации: 22.07.2008
|
Создано:
28.09.2010 17:38:00
|
|
В общем,мне перестало хватать возможностей связки Excel/Rastrwin, т.е. большинство макросов я пишу в экселе и он через VBA колдует с растром, но в экселе слабый математичекий аппарат, поэтому хотелось бы подключить возможности матлаба. В общем это нужно для выполнения очень большого количества сложных расчетов, вручную сделать их нереально. Собственно связь экселя и растра не проблема, вопрос в матлабе, в этой теме я буду писать свои попытки и идеи, но т.к. программирование не моя сильная сторона, то надеюсь кто-то заинтересуется и поможет создать небольшой примерчик матлаб/растр и т.д.
В общем идей две:
1) работаем в экселе и вызываем растр и матлаб из экселя. (Excel link)
По этому пункту пока не работал.
2) работаем в матлабе и вызываем растр из матлаба
Здесь получилось(похоже на то) открыть режимный файл из матлаба(надо создать м-файл):
Rastr = actxserver('Astra.Rastr');
shabl1 = 'C:\Program Files\RastrWin\SHABLON\режим.rg2';
File1='C:\Макро\Тест Для МК(version 1)\Копия Урал_зима_max_2010_ees.rg2';
Rastr.Load( 1, File1, shabl1);
t1 = Rastr.get;
Только не понимаю, как вытащить данные из таблиц
Полезная ссылка:
http://www.mathworks.com/help/techdoc...#f16-54223
|
|
|
Александр Александров
Администратор
Всего сообщений: 659
Дата регистрации: 31.05.2008
|
Создано:
28.09.2010 18:26:43
|
Можно начать с:
Код |
---|
RastrTables = Rastr.Tables;
RastrTable_node = RastrTables.Item('node');
RastrTable_node.SetSel('sta=0');
|
и дальше по аналогии.
|
|
|
Михаил Одинцов
Постоянный посетитель
Всего сообщений: 148
Дата регистрации: 22.07.2008
|
Создано:
28.09.2010 19:41:24
|
|
Спасибо за ответ, просто по аналогии как раз и неполучается, наверно это не сложно, просто я в этом слабо разбираюсь, попробовал
Код |
---|
RastrTables = Rastr.Tables;
RastrTable_node = RastrTables.Item('node');
RastrTable_node.SetSel('sta=0');
RastrTable_node.DelRows
Rastr.Save(File1, shabl1);
|
Но ругается на удаление.
No appropriate method, property, or field DelRows for class
Interface.astra_1.0_Type_Library.ITable.
При этом метод Setsel выполняет, и вроде даже сохраняет (т.к. изменения я сделать не могу, то не проверить действительно ли это так)
Я никак не могу понять, как сделать хотя бы одно изменение или вытащить данные, т.е. изменить нагрузку в узле например и сохранить. Если у Вас есть возможность сделать такой пример, буду очень благодарен.
В принципе одно решение удалось найти, работать с Матлабом через VBA из экселя, т.е. отправлять туда переменные и их вычислять и забирать обратно, только надо посмотреть вообще скорость таких действий, слишком много накручено.
Set Matlab = CreateObject("matlab.application")
t = Matlab.PutWorkspaceData("A", "base", ny_t.Z(i))
t = Matlab.Execute("B=A*rand(1,1)")
Cells(i + 6, 3).Value = Matlab.GetVariable("B", "base")
P.S. Режим тоже посчитался, удалось получить, что он сходится, т.е. фактически мне не понятно как получить в переменные столбцы с параметрами и как вызывать их значения и менять их, все время вылезает Index exceeds matrix dimensions. Может проблема в том, что в матлабе размер столбца начинается с 1 а в растре с 0?? Или в том, что я не знаю правильного синтаксиса.
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
28.09.2010 23:09:05
|
Цитата |
---|
Михаил Одинцов пишет:
В общем это нужно для выполнения очень большого количества сложных расчетов, вручную сделать их нереально. | Интересно! Какие "сложные" расчеты Вы имеете ввиду?
|
|
|
Михаил Одинцов
Постоянный посетитель
Всего сообщений: 148
Дата регистрации: 22.07.2008
|
Создано:
29.09.2010 13:25:39
|
|
Цитата |
---|
Михаил Реутов пишет:
Цитата |
---|
Михаил Одинцов пишет:
В общем это нужно для выполнения очень большого количества сложных расчетов, вручную сделать их нереально. | Интересно! Какие "сложные" расчеты Вы имеете ввиду?
|
Я так написал, чтобы не посоветовали использовать просто другие форматы в качестве обмена, экспорт в txt например, т.е. чтобы написанный макрос делал расчеты без моего участия.
Планировалось применять в научной области (апробация некоторых идей, которые есть только на бумаге), а не только в расчетах режимов, конкретно определенного применения пока нет, есть только мысли и желания=)
Просто MATLAB чаще используется и намного сильнее и удобнее того же Excel, например в матричной области, не представляю как выполнить сингулярное разложение и вообще какие-нибудь операции с матрицами в Excel, ведь большинство из них основано на методах приближения, писать специальный модуль - глупость, быстрее разобратся и подключить MATLAB. Хранение и вызов переменных и модулей тоже будет плюсом.
|
|
|
Александр Александров
Администратор
Всего сообщений: 659
Дата регистрации: 31.05.2008
|
Создано:
29.09.2010 13:50:36
|
Матфайл замены всех нагрузок узлов с номером более 10000 на 13 МВт и сохранение файла.
Вот, что у меня получилось:
Код |
---|
clc
clear global;
Rastr = actxserver('Astra.Rastr');
Rastr.Load( 1, 'C:projectsKZInvestTKZ_3000_DataRDU_SEMY_NETMakeNonSymmреальная схема части РДУ\rdu_1_.rg2', '' );
RastrTables = Rastr.Tables;
RastrTable_node = RastrTables.Item('node');
node_Cols = RastrTable_node.Cols;
node_Col_pn = node_Cols.Item('pn');
RastrTable_node.SetSel('ny>10000');
CurrentRow_node = RastrTable_node.get( 'FindNextSel', -1 );
while( CurrentRow_node ~= -1 )
node_Col_pn.set('Z', CurrentRow_node , 13 )
CurrentRow_node = RastrTable_node.get('FindNextSel', CurrentRow_node );
end
Rastr.Save( 'C:Tempprank', '' );
disp('ok');
|
Сильно помогло чтение:
MatLabHelp
Общее впечатление, что работа с КОМ в МатЛаб не совсем привычна пользователю VBA.
|
|
|
Михаил Одинцов
Постоянный посетитель
Всего сообщений: 148
Дата регистрации: 22.07.2008
|
Создано:
29.09.2010 14:09:28
|
Спасибо большое, кажется я понял как это работает. Теперь только надо подумать и потестировать, что оптимальнее - работать MATLAB/Rastrwin или MATLAB/Excel/Rastrwin.
Думаю в этой теме теперь есть все для связок с MATLAB и из MATLAB используя VBA, можно считать ее закрытой.
|
|
|
Роман Язенин
Заглянувший
Всего сообщений: 7
Дата регистрации: 28.02.2011
|
Создано:
28.02.2011 14:07:54
|
Уважаемые форумчане!
Возникла проблема с запуском Растра из Матлаба.
В М-файле пишу всего одну строчку
Rastr = actxserver('Astra.Rastr');
И Матлаб выдает следующую ошибку:
??? Error using ==> feval
Server Creation Failed: Класс не зарегистрирован
Error in ==> actxserver at 87
h=feval(['COM.' convertedProgID], 'server', machinename, interface);
Error in ==> primer at 1
Rastr = actxserver('Astra.Rastr');
Может кто сталкивался?
|
|
|
Михаил Одинцов
Постоянный посетитель
Всего сообщений: 148
Дата регистрации: 22.07.2008
|
Создано:
28.02.2011 14:32:59
|
Вроде бы такая ошибка выдавалась на 64-битном Матлабе,мне было сказано что 64-битный Матлаб с actxserver плохо дружит, а точнее не дружит совсем, решилось установкой 32-битного Матлаба.
|
|
|
Роман Язенин
Заглянувший
Всего сообщений: 7
Дата регистрации: 28.02.2011
|
Создано:
28.02.2011 14:46:55
|
У меня 64-битная ОС Windows.
Разве можно на нее устанавливать 32-битный матлаб?
Если нет, то какие пути Вы видите для преодоления этой проблемы?
|
|
|
Михаил Одинцов
Постоянный посетитель
Всего сообщений: 148
Дата регистрации: 22.07.2008
|
Создано:
28.02.2011 17:47:18
|
Можно, Вы попробуйте, была такая же проблема на машине с 64-битной ОС Windows 7, сейчас на той машине стоит 32-битный матлаб и все прекрасно работает. Просто при установке запускаете экзешник 32-битного матлаба.
|
|
|
Роман Язенин
Заглянувший
Всего сообщений: 7
Дата регистрации: 28.02.2011
|
Создано:
01.03.2011 19:46:16
|
Спасибо!
Все работает!
Возник еще один вопрос: как сохранять из матлаб растровские файлы? чтоб было расширение rg2.
|
|
|
Роман Язенин
Заглянувший
Всего сообщений: 7
Дата регистрации: 28.02.2011
|
Создано:
01.03.2011 21:02:12
|
Прошу прощения, нашел про сохранение)
|
|
|
Михаил Одинцов
Постоянный посетитель
Всего сообщений: 148
Дата регистрации: 22.07.2008
|
Создано:
02.03.2011 18:32:51
|
Что-то я ступил, видимо уставший был, я знаю как сделать, то что ты хочешь в MatLab, если не получится, заходи я тебе напишу программулину.
Сорри за оффтоп=)
|
|
|
Роман Язенин
Заглянувший
Всего сообщений: 7
Дата регистрации: 28.02.2011
|
Создано:
03.03.2011 13:32:41
|
Обязательно зайду! =)
|
|
|
Вячеслав Коробка
Заглянувший
Всего сообщений: 3
Дата регистрации: 15.11.2017
|
Создано:
12.11.2018 02:44:54
|
Александр Александров,
Почему то не работает вызов таблиц Rastr из Matlab. Взял за основу ваш код, указав свои пути к файлам:
clear
Rastr = actxserver('Astra.Rastr');
shabl1 = 'D:\Soft\RastrWin3\RastrWin3\SHABLON\режим.rg2';
File1='D:\LARS\Наука\НИОКР 2018\Отправка 28.06.18\зима_max.rg2';
Rastr.Load( 1, File1, shabl1);
RastrTables = Rastr.Tables;
RastrTable_node = RastrTables.Item('node');
Подскажите, пожалуйста, что я делаю не так? При выполнении данного куска кода я ведь должен получить переменную RastrTable_node, в которой данные будут представлены по шаблону Узлы? Или как должна выглядеть переменная RastrTable_node?
P.S. стоит задача загрузки в файл Rastr активной проводимости G в некоторых ветвях с последующей оптимизацией режима по Q. Сами G будут рассчитаны в Matlab, для чего и нужна связь Matlab-RastrWin.
|
|
|