Inhoud

# Basic-macro's in Python aanroepen

Het is mogelijk om LibreOffice Basic-macro's aan te roepen in Python-scripts en zo kunnen nuttige functies verkregen worden, zoals:

- Eenvoudige logging uit Access2Base bibliotheek Trace console,

- InputBox en MsgBox scherm I/O functies gebaseerd op Basic om ontwikkeling in Python te vergemakkelijken,

- Xray onderbreekt tijdelijk de uitvoering van Python-script om variabelen te kunnen lezen.

De LibreOffice Application Programming Interface (API) Scripting Framework ondersteunt uitvoering van scripts tussen Python en Basic of andere ondersteunde programmeertalen. Argumenten kunnen worden teruggegeven en doorgegeven bij aanroepen, als die tenminste van een data-type zijn dat door beide talen wordt ondersteund en aannemende dat het Scripting Framework ze goed converteert.

Het is aanbevolen om kennis te hebben van Python-standaardmodules en LibreOffice API features voordat u aanroepen tussen verschillende programmeertalen als Python, Basic, JavaScript of andere script-engine gaat programmeren.

Bij het uitvoeren van Python-scripts vanuit een Integrated Development Environment (IDE), kan de LibreOffice-embedded Basic-engine ontbreken. Vermijdt dan Python-naar-LibreOffice Basic aanroepen. De Python-omgeving en Universal Networks Objects (UNO) zijn volledig beschikbaar. Meer informatie : Setting Up an Integrated IDE voor Python.

## Ophalen LibreOffice Basic-scripts

LibreOffice Basic-macro's kunnen persoonlijk, gedeeld of ingesloten zijn in documenten. Om ze te kunnen uitvoeren moet Python op het moment van uitvoeren de locaties van de Basic-macro's kennen. Door de interface com.sun.star.script.provider.XScriptProvider is het mogelijk de scripts op te halen:

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

    		 def getBasicScript(macro='Main', module='Module1', library='Standard',
    		         isEmbedded=False) -> XScript:
    		     '''Ophalen Basic-script object voor het aanroepen.'''
    		     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

## Uitvoering LibreOffice Basic-scripts

De LibreOffice Software Development Kit (SDK) documentatie voor com.sun.star.script.provider.XScript interface details voor het aanroepen van andere programmeertalen. Bij een functie-aanroep zijn drie matrixen nodig:

- de eerste bevat de argumenten van de aan te roepen routine

- de volgende bevat de gewijzigde argumenten

- de derde bevat de resultaten

### Python-syntaxis

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

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

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

### Voorbeelden van persoonlijke en gedeelde scripts

Voorbeelden van I/O naar scherm detail Python-Basic aanroepen. Monitoren document gebeurtenissen geven het gebruik aan van *args Python idioom om een variabel aantal parameters weer te geven op het Access2Base logging console-dialoog.

Tijdens het ontwikkelen kunt u de uitvoering van Python-script onderbreken met de extensie Xray om de eigenschappen en de methodes van UNO-objecten te bekijken. De extensie APSO debugger maakt het mogelijk een object te beoordelen na gebruik van een Xray of een MRI extensie.

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

### Voorbeelden van in documenten ingesloten scripts

*argsPython vereenvoudigde syntaxis kan gebruikt worden samen met LibreOffice Basic-routines die een variabel aantal argumenten toestaan. Onder Print en SUM Python-functies roepen hun Basic Print en SUM tegenhangers aan, met gebruik van eerdergenoemde functie getBasicScript. De foutafhandeling is hier niet in detail beschreven.

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

    	  def Print(*args):
    	      """Toont de gespecificeerde strings of numerieke expressies in een dialoogvenster."""
    	      xScript = getBasicScript("Print", "Scripting", embedded=True)
    	      xScript.invoke((args), (), ())

    	  def SUM(*args):
    	      """SUM de aangegeven getallen expressie."""
    	      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,)

De documentgebaseerde LibreOffice Basic Print en SUM-routines accepteren een variabel aantal argumenten. De Private en Public attributen hebben geen effect. Voor de beknoptheid is de type-controle van de argumenten overgeslagen.

    	  Option Compatible ' "Standard.Scripting" module
    	  Option Explicit

    	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    	      ''' Itemlijst met variabel aantal afdrukken '''
    	      ' alle CStr() om te zetten argumenten zijn geaccepteerd
    	      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 een variabel aantal getallen '''
    	      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()

Verwante onderwerpen

Python-scripts vanuit BASIC aanroepen

Python programmeringsvoorbeelden

Hulp bij LibreOffice Python-scripts

LibreOffice Basic Help