Kalla opp Basic-makroar frå Python

Du kan kalla opp LibreOffice Basic-makroar frå Python-skript. Du kan såleis oppnå spesielle funksjonar som for eksempel

Skriptnettverket LibreOffice Application Programming Interface (API) har støtte for å køyra blanda skript mellom Python og Basic, eller andre programmeringsspråk for den saks skuld. Såleis kan argument sendast mellom språka dersom dei er såkalla primitive datatypar som begge språka forstår og at dei vert konverterte korrekt.

tip

Det vert tilrådd at du har kjennskap til standardmodulane i Python og LibreOffice API-funksjonar før du lagar oppkall frå Python til Basic, JavaScript eller andre språk.


warning

Når du køyrer Python-skript frå eit IDE (Integrated Development Environment = Integrert utviklingsmiljø) kan den innebygde Basic-motoren i LibreOffice mangla. Då må du unngå oppkall frå Python til LibreOffice Basic. Python-miljøet og Universal Networks Objekter (UNO) er fult tilgjengelege. Du finn meir om dette i Oppsetjing av Integrert IDE til Python.


Hent LibreOffice Basic-skript

LibreOffice Basic-makroar kan vera personlege, delte eller innebygde i dokumenta. For å køyra dei, må Python-køyretid vera oppført med grunnleggjande makroplasseringar. Implementering av grensesnittet com.sun.star.script.provider.XScriptProvider tillet henting av køyrbare skript:


		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Hent Basic-skript-objekt før bruk.'''
		     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
		 

Køyrer LibreOffice Basic-skript

LibreOffice Software Development Kit (SDK) sin dokumentasjon for grensesnittet com.sun.star.script.provider.XScriptforklarer reglane for oppkall av mellomspråkelege oppkall. Funksjonsoppkallet krev tre tabellar:

Python-syntaks

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

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

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

Eksempel på personlege eller delte skript

Eksempla i Input/Output to Screen forklarer i detalj oppkall frå Python til Basic. Monitoring Document Events viser bruk av *args Python-formspråk for å skriva ut varierande mengde parameterar til dialogvindauget med logkonsollen for Access2Base.

tip

At time of development you can interrupt Python script execution using Xray extension in order to inspect properties and methods of UNO objects. The ASPO extension debugger allows object introspection using either Xray either MRI extensions.



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

Examples of Embedded Scripts in Documents

*argsPython simplified syntax can be used in conjunction with LibreOffice Basic routines that accept a variable number of arguments. Below Print and SUM Python functions call their Basic Print and SUM counterparts, using aforementioned getBasicScript function. Exception handling is not detailed.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """Outputs the specified strings or numeric expressions in a dialog box."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """SUM the specified number expression."""
	      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,)
	  

The LibreOffice Basic Print and SUM document-based routines accept a variable number of arguments. The Private or Public attributes have no effect. The arguments type checking is skipped for clarity.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Print item list of variable number '''
	      ' all CStr() convertible args are accepted
	      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 a variable list of numbers '''
	      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()