Llamar macros en Basic desde Python

Es posible llamar macros escritas en Collabora Office Basic desde secuencias de órdenes en Python y sacar provecho de funcionalidades tales como:

El marco de programación de macros de la API (interfaz de programación de aplicaciones) de Collabora Office admite la ejecución de secuencias de órdenes entre Python y Basic u otros lenguajes de programación admitidos. Los argumentos se pueden pasar de un lado a otro entre llamadas, siempre que representen tipos de datos primitivos que ambos lenguajes reconozcan y suponiendo que el marco de programación de macros los convierta de forma adecuada.

tip

Es recomendable familiarizarse con los módulos estándares de Python y las funcionalidades de la API de Collabora Office antes de efectuar llamadas entre los lenguajes Python, Basic, JavaScript o cualquier otro motor de secuencias de órdenes.


warning

Es posible que, al intentar ejecutar secuencias de órdenes escritas en Python desde un entorno de desarrollo integrado (EDI), falte el motor de BASIC incrustado en Collabora Office. En estos contextos, evite las llamadas de Python a Collabora Office Basic. Por el contrario, el entorno Python y los objetos de red universales (UNO, por sus siglas en inglés) siempre estarán disponibles. Para más información, consulte Puesta en funcionamiento de un EDI para Python.


Recuperación de secuencias de órdenes en Basic en Collabora Office

Las macros de Collabora Office BASIC pueden ser de uso personal, compartidas o estar incrustadas en los documentos. Para poder ejecutarlas, ha de proveerse un entorno de ejecución de Python con las ubicaciones de macros de BASIC. La implementación de la interfaz com.sun.star.script.provider.XScriptProvider permite recuperar macros ejecutables:

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

def getBasicScript(macro='Main', module='Module1', library='Standard',
        isEmbedded=False) -> XScript:
    '''Tomar el objeto de secuencia de Basic antes de la invocación.'''
    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

Ejecución de secuencias de órdenes en Basic en Collabora Office

La documentación del Kit de desarrollo de software (SDK) de Collabora Office correspondiente a la interfaz com.sun.star.script.provider.XScript detalla la convención para efectuar llamadas entre lenguajes de programación. La invocación de funciones requere tres matrices:

Sintaxis de Python

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

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

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

Ejemplos de secuencias de órdenes personales o compartidas

Algunos ejemplos sobre la entrada/salida a la pantalla detallan cómo realizar las llamadas de invocación a Basic desde Python. En Monitorización de eventos de documento, se muestra el uso del comodín *args en el lenguaje Python para imprimir un número variable de parámetros en el diálogo de la consola de registros de Access2Base.

tip

Mientras está desarrollando su macro, puede interrumpir la ejecución de la secuencia de órdenes de Python si utiliza la extensión Xray para inspeccionar las propiedades y métodos de objetos UNO. El depurador de extensiones APSO permite la introspección de objetos cuando usa las extensiones Xray o MRI.


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

Ejemplos de secuencias de órdenes incrustadas en documentos

La sintaxis simplificada de Python *args puede ser usada en conjunto con rutinas Basic de Collabora Office que acepten un número variable de argumentos. Más abajo, las funciones de Python Print y SUM llaman a sus contrapartes de Basic Print y SUM en la ya mencionada función getBasicScript. El manejo de excepciones no se detalla.

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

def Print(*args):
    """Muestra las cadenas o expresiones numéricas especificadas en un cuadro de diálogo."""
    xScript = getBasicScript("Print", "Scripting", embedded=True)
    xScript.invoke((args), (), ())

def SUM(*args):
    """SUMA la expresión numérica especificada."""
    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,)

Las rutinas de Collabora Office Basic Print y SUM, basadas en documentos, aceptan un número variable de argumentos. Los atributos Private o Public no tienen efecto. La comprobación del tipo de argumentos se omite por claridad.

Option Compatible ' "Standard.Scripting" module
Option Explicit

Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    ''' Imprimir la lista de número variable de elementos '''
    ' se aceptan todos los argumentos convertibles de 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 (suma) una lista variable de números '''
    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()

¡Necesitamos su ayuda!