Съдържание

# Обръщения към макроси на Basic от Python

От скриптовете на Python можете да извиквате макроси на LibreOffice Basic, което ви дава достъп до следните важни възможности:

- прости средства за регистриране (logging) в конзолата Trace от библиотеката Access2Base,

- базирани на Basic функции за екранен вход и изход InputBox и MsgBox, улесняващи разработването с Python,

- извиквания на Xray, които прекъсват изпълнението на скрипта на Python, позволявайки инспектиране на променливи.

Обкръжението за скриптове (Scripting Framework) на интерфейса за приложно програмиране (API) на LibreOffice поддържа многоезиково изпълнение между Python и Basic, както и между други езици. При обръщенията могат да се предават аргументи в двете посоки, стига да представят разпознавани и от двата езика примитивни типове данни, които Scripting Framework е в състояние да преобразува правилно.

Преди да използвате междуезикови обръщения от Python към Basic, JavaScript или друга скриптова машина, е препоръчително да се запознаете със стандартните модули на Python и възможностите на LibreOffice API.

Когато стартирате скриптове на Python от интегрирана развойна среда (IDE), вградената машина за Basic на LibreOffice може да отсъства. В такъв контекст избягвайте обръщения от Python към LibreOffice Basic. Обкръжението на Python и Universal Networks Objects (UNO) обаче са изцяло достъпни. Вижте Инсталиране на интегрирана развойна среда за Python за повече информация.

## Извличане на скриптове на LibreOffice Basic

Макросите на LibreOffice Basic могат да бъдат лични, споделени или вградени в документи. За да ги изпълнява, системата за изпълнение на Python трябва да разполага с местоположенията им. Реализирането на интерфейса 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

## Изпълняване на скриптове на LibreOffice Basic

Документацията на комплекта за разработка на софтуер (SDK) на LibreOffice за интерфейса 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 може да бъде използван с подпрограми на LibreOffice Basic, които приемат променлив брой аргументи. По-долу функциите Print и SUM на Python извикват съответствията си от 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):
    	      """Сумира указания числов израз."""
    	      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,)

Базираните на документ подпрограми Print и SUM на LibreOffice Basic приемат променлив брой аргументи. Атрибутите 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
    	      ''' Сумиране на променлив брой числа '''
    	      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