Содержимое

# Вызов макросов Basic из Python

Макросы LibreOffice Basic можно вызывать из сценариев Python для использования различных полезных функций, например:

- Простые средства журналирования из консоли Trace библиотеки Access2Base,

- Функции ввода/вывода на экран InputBox и MsgBox на основе Basic для упрощения разработки сценариев на Python,

- Инструмент Xray позволяет останавливать выполнение сценариев Python для инспекции переменных.

Среда выполнения сценариев LibreOffice API поддерживает выполнение сценариев с возможностью межъязыкового вызова между Python и Basic, а также между другими поддерживаемыми для этих задач языками программирования. Возможен двусторонний обмен аргументами через вызовы, с учётом принадлежности этих аргументов к основным типам данных, распознаваемых обоими языками, и при условии, что среда выполнения сценариев осуществляет их надлежащее преобразование.

При этом для начала рекомендуется получить базовые представления о работе со стандартными модулями Python и функциями LibreOffice API, и только после этого обращаться к межъязыковым вызовам из Python в Basic, JavaScript или любой другой интерпретатор сценариев.

При работе со сценариями Python из интегрированной среды разработки (IDE) встроенный интерпретатор LibreOffice Basic может отсутствовать. В таком случае лучше воздержаться от выполнения вызовов из Python в LibreOffice Basic. Однако среда Python и Universal Networks Objects (UNO) при этом остаются полностью доступны. См. более подробную информацию в разделе Настройка интегрированной среды разработки для Python.

## Получение сценариев Basic LibreOffice

Макросы Basic в LibreOffice могут быть пользовательскими, общими или встроенными в документы. Для их запуска среда выполнения Python должна обладать информацией о размещении макросов Basic. Исполняемые сценарии можно получать с помощью интерфейса com.sun.star.script.provider.XScriptProvider:

    		 import uno
    		 from com.sun.star.script.provider import Xscript

    		 def getBasicScript(macro='Main', module='Module1', library='Standard',
    		         isEmbedded=False) -> XScript:
    		     '''Получение объекта сценария Basic перед вызовом.'''
    		     ctx = uno.getComponentContext()
    		     smgr = ctx.ServiceManager
    		     if isEmbedded:
    		         desktop = smgr.createInstanceWithContext('com.sun.star.frame.Desktop', ctx)
    		         scriptPro = desktop.CurrentComponent.getScriptProvider()
    		         location = "document"
    		     else:
    		         mspf = smgr.createInstanceWithContext(
    		             "com.sun.star.script.provider.MasterScriptProviderFactory", ctx)
    		         scriptPro = mspf.createScriptProvider("")
    		         location = "application"
    		     scriptName = "vnd.sun.star.script:"+library+"."+module+"."+macro+ \
    		                  "?language=Basic&location="+location
    		     xScript = scriptPro.getScript(scriptName)
    		     return xScript

## Выполнение сценариев Basic в LibreOffice

В документации по LibreOffice SDK (Software Development Kit) представлена подробная информация о соглашениях при осуществлении межъязыковых вызовов через интерфейс com.sun.star.script.provider.XScript. Для запуска функций потребуется три массива:

- первый массив содержит список аргументов вызываемой процедуры

- второй массив определяет изменяемые аргументы

- третий массив хранит возвращаемые значения

### Синтаксис Python

results = script.invoke((prompt,buttons,title), (), ())

script.invoke((message,), tuple, ())

script.invoke((args), (), results)

### Примеры пользовательских и общих сценариев

В примерах раздела Ввод/вывод на экран показано выполнение вызовов из Python в Basic. Раздел Отслеживание событий документа иллюстрирует использование конструкции *args в Python для вывода переменного числа параметров в консоль регистрации событий Access2Base.

В процессе разработки сценарии Python можно прерывать с помощью расширения Xray для инспекции свойств и методов объектов UNO. Отладчик расширения APSO позволяет проводить инспекцию объектов с помощью расширения Xray или MRI.

    	  def xray(myObject):
    	  	  script = getBasicScript(library="XrayTool", module="_Main", macro="Xray")
    	  	  script.invoke((myObject,), (), ())

### Примеры встроенных сценариев в документах

Конструкцию *args упрощённого синтаксиса Python можно использовать совместно с процедурами Basic LibreOffice, принимающими переменное число аргументов. В примерах ниже функции Python Print и SUM вызывают аналогичные процедуры Basic Print и SUM с помощью вышеупомянутой функции getBasicScript. Обработка исключений не детализирована.

    	  # -*- coding: utf-8 -*-
    	  from __future__ import unicode_literals

    	  def Print(*args):
    	      """Выводит указанные строки или числовые выражения в диалоговое окно."""
    	      xScript = getBasicScript("Print", "Scripting", embedded=True)
    	      xScript.invoke((args), (), ())

    	  def SUM(*args):
    	      """Выполняет суммирование (SUM) указанного числового выражения."""
    	      xScript = getBasicScript("SUM", "Scripting", embedded=True)
    	      res = xScript.invoke((args), (), ())
    	      return res[0]

    	  # def getBasicScript()  # see above

    	  def playWithArgs():
    	      Print("Fun with *args ", -9.81, 297864.681974, 8762E-137)
    	      Print(SUM(45, -9.81, 297864.681974))
    	      Print(SUM(45, -9.81, 297864.681974, 8762E+137))

    	  g_exportedScripts = (playWithArgs,)

Встроенные в документ процедуры LibreOffice Basic Print и SUM принимают переменное число аргументов. Атрибуты Private или Public не влияют на выполнение. Проверка типов аргументов пропущена для наглядности.

    	  Option Compatible ' "Standard.Scripting" module
    	  Option Explicit

    	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    	      ''' Вывод списка элементов произвольной длины '''
    	      ' принимаются все аргументы, которые могут быть преобразованы функцией CStr()
    	      Dim str As String, i As Integer
    	      If UBound(args) >= 0 Then
    	          For i = 0 To UBound(args)
    	              str = str + Cstr(args(i))+ sep
    	          Next i
    	      End If
    	      Print str
    	  End Sub ' Standard.Scripting.Print()

    	  Public Function SUM(ParamArray args() As Variant) As Variant
    	      ''' Выполняет суммирование (SUM) переменного списка чисел '''
    	      Dim ndx As Integer
    	      If UBound(args) >= 0 Then
    	          For ndx = 0 To UBound(args)
    	              SUM = SUM + args(ndx)
    	          Next ndx
    	      End If
    	  End Function ' Standard.Scripting.SUM()

См. также

Вызов сценариев Python из Basic

Примеры кода на Python

Справка по макросам на Python в LibreOffice

Справка LibreOffice Basic

Пожалуйста, поддержите нас!