Список форумов Форум Libreoffice

Форум Libreoffice

Добро пожаловать на Форум Libreoffice!
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

English French German Italian Portuguese Russian Spanish
Python & Basic - функции массивов (списков)

 
Начать новую тему   Ответить на тему    Список форумов Форум Libreoffice -> Basic
Предыдущая тема :: Следующая тема  
Автор Сообщение
hasim



Репутация: 0    

Зарегистрирован: 28.05.2012
Сообщения: 32

СообщениеДобавлено: Чт Ноя 22, 2012 3:12 pm    Заголовок сообщения: Python & Basic - функции массивов (списков) Ответить с цитатой

Продолжу тему взаимодействия Basic'a и языков программирования, поддерживаемых OpenOffice/LibreOffice.
Про BeanShell и JavaScript уже писал mathnew.
Обратимся теперь к Python.
Задача: как передать в скрипт на Python массив, обработать его в скрипте и вернуть обратно в Basic (OpenOffice) новый массив, полученный из исходного.
Python может работать со структурами разнородных данных - списками, вместо обычных массивов, т.е. элементами списка могут быть как числа, так и строки.
Демонстрационный скрипт на Python listarr.py:
Код:
def flistarray(arglistarr):

 aaa = (11, "list", 22)

 bbb = (arglistarr[0]+aaa[0], arglistarr[1]+aaa[1], arglistarr[2]+aaa[2])

 return bbb

получает из макроса на Basic список ("массив") arglistarr, в этом скрипте также задается некий список aaa, а также создается новый список bbb, элементы которого вычисляются на основе элементов списков aaa и bbb (в данном случае элементы списка bbb получаются просто сложением соответствующих элементов списков arglistarr и aaa (можно использовать, конечно, и более сложные операции, но для понимания принципа взаимодействия Python и Basic этого вполне достаточно).

Этот скрипт кладется туда же, где обычно лежат скрипты Python (например, в Windows по пути: C:\Program Files\ OpenOffice.org 3\Basis\share\Scripts\python\).

Макрос на Basic, вызывающий на выполнение этот скрипт и передающий в этот скрипт следующий исходный список
Код:
arrv(0)=10
arrv(1)="string "
arrv(2)=30


имеет следующий вид:
Код:
Sub list_python
Dim arrv(2)

script="listarr.py"

arrv(0)=10
arrv(1)="string "
arrv(2)=30
   
script = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")._
createScriptProvider("").getScript("vnd.sun.star.script:" & script & "$flistarray?language=Python&location=share")

listarrret = script.invoke(array(arrv), array(), array())

For i=0 To 2
s=s & listarrret(i) & Chr(13)
Next i

  MsgBox s

End Sub


Результат выполнения макроса на Basic (и скрипта Python):

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
RFJ



Репутация: +1    

Зарегистрирован: 02.08.2011
Сообщения: 59

СообщениеДобавлено: Вс Ноя 25, 2012 2:35 pm    Заголовок сообщения: Ответить с цитатой

Со списком ("одномерным массивом") это срабатывает.
Но с многомерными массивами, даже если установить Numpy (что теоретически добавляет возможность работы с многомерными массивами), ничего не получается. Многомерный массив можно передать из Basic в Python, но в скрипте на PYthon непонятно как работать с элементами этого массива (даже при установленном Numpy). Все попытки обратиться к элементам многомерного массива приводят к ошибкам.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
hasim



Репутация: 0    

Зарегистрирован: 28.05.2012
Сообщения: 32

СообщениеДобавлено: Пн Ноя 26, 2012 6:54 pm    Заголовок сообщения: Ответить с цитатой

Можно в макросе просто преобразовать многомерный массив в список (одномерный массив) и вместе с данными о структуре исходного массива (число строк, число столбцов) передать в скрипт Python, обработать там как список, вернуть обработанный список в Basic и преобразовать в Basic'е этот список обратно в массив.

Пример такого макроса:

Код:
Sub list_python
Dim arrv(2,2)
Dim arrvr(2,2)
Dim arrvl(8)
Dim arrvlr(8)

'Задаем исходный многомерный массив (3х3)
arrv(0,0)=1000.5
arrv(1,0)=1010.5
arrv(2,0)=1020.5

arrv(0,1)=2001.7
arrv(1,1)=2011.7
arrv(2,1)=2021.7

arrv(0,2)=3002.8
arrv(1,2)=3012.8
arrv(2,2)=3022.8

'Преобразуем исходный массив в список (одномерный массив из 9 элементов)
For i=0 To 2
For j=0 To 2
   arrvl(i+3*j)=arrv(i,j)
Next j
Next i

'Задаем информацию о структуре массива (число строк и столбцов)
imax=3
jmax=3

'Задаем скрипт на Python
script="list1.py"

'Передаем список (arrvl) в скрипт на Python вместе с информацией о структуре массива (imax, jmax), затем получаем список обратно после обработки скриптом Python
script = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")._
createScriptProvider("").getScript("vnd.sun.star.script:" & script & "$flistarray?language=Python&location=share")

listarrret = script.invoke(array(arrvl, imax, jmax ), array(), array())

listmax=Ubound(listarrret(0))

For m=0 To listmax
   arrvlr(m)=listarrret(0)(m)
Next m

'Данные о структуре обработанного массива
   imax=listarrret(1)
   jmax=listarrret(2)

'Преобразуем полученный после обработки скриптом список обратно в многомерный массив   
For n=0 To listmax
i=Int(n/imax)
j=n Mod jmax
arrvr(i,j)=arrvlr(n)
Next n

'Отображаем обработанный массив
For j=0 To imax-1
For i=0 To jmax-1
   MsgBox "array(" & i & "," & j & ") = " & arrvr(i,j)
Next i
Next j

End Sub


Скрипт на Python:

Код:
def flistarray(arglistarr, i, j):

  aaa = (11.3, 22.5, 33.7)

  larglistarr = (aaa[0], aaa[0]*aaa[1], arglistarr[7]+aaa[2], arglistarr[8]*aaa[0], aaa[1]*aaa[2], arglistarr[8]+aaa[2], (arglistarr[0]*aaa[0])/aaa[1], (arglistarr[0]+arglistarr[1])/aaa[1], arglistarr[2]/aaa[2])

  ddd = (larglistarr, i, j)

  return ddd
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
RFJ



Репутация: +1    

Зарегистрирован: 02.08.2011
Сообщения: 59

СообщениеДобавлено: Чт Ноя 29, 2012 5:07 pm    Заголовок сообщения: Ответить с цитатой

Да уж, простоту работу с массивами к достоинствам Python'a не отнесешь.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Форум Libreoffice -> Basic Часовой пояс: GMT
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Вы можете бесплатно создать форум на MyBB2.ru, RSS