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:

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.

tip

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.


warning

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:

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.

tip

Tijdens het ontwikkelen kunt u de uitvoering van Python-script onderbreken met de extensie Xray om de eigenschappen en de methoden 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()
	  

Help ons, alstublieft!