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

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

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

tip

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


warning

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


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

Макросите на Collabora Office 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

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

Документацията на комплекта за разработка на софтуер (SDK) на Collabora Office за интерфейса 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.

tip

По време на разработване можете да прекъсвате изпълнението на скрипт на Python с разширението Xray, за да инспектирате свойствата и методите на UNO обекти. Дебъгерът на разширения APSO позволява интроспекция на обекти чрез разширението Xray или разширението MRI.


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

Примери с вградени скриптове в документи

Опростеният синтаксис *args на Python може да бъде използван с подпрограми на Collabora Office 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 на Collabora Office 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()

Моля, подкрепете ни!