summaryrefslogtreecommitdiff
path: root/wizards
diff options
context:
space:
mode:
authorJean-Pierre Ledure <jp@ledure.be>2021-03-16 16:57:28 +0100
committerJean-Pierre Ledure <jp@ledure.be>2021-03-17 18:11:23 +0100
commit8c04c9b3c726deb4bcab82aff0aec7d4f4ee6158 (patch)
tree6ba29fa20f3531a3862090717187edac098ab9dd /wizards
parentff1cfaf87ce0aa9673e1c3f92308cde6a2c6aa69 (diff)
ScriptForge - (scriptforge.py) Array class
The SF_Array (Basic) class is highly redundant with the Python tuple/list classes. Hence only 1 method is implemented in Python: ImportFromCSVFile() to have the same csv files imported identically in both environments. The returned value is a tuple of tuples. Restriction: dates are recognized but converted to their ISO format. Up to the user to interpret them correctly. Change-Id: I6611964a8083a9d7c6f9622b2aef64fe8b1491ea Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112585 Tested-by: Jean-Pierre Ledure <jp@ledure.be> Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Diffstat (limited to 'wizards')
-rw-r--r--wizards/source/scriptforge/SF_PythonHelper.xba27
-rw-r--r--wizards/source/scriptforge/python/scriptforge.py34
2 files changed, 55 insertions, 6 deletions
diff --git a/wizards/source/scriptforge/SF_PythonHelper.xba b/wizards/source/scriptforge/SF_PythonHelper.xba
index 38aaa0e4681b..7368390c97bf 100644
--- a/wizards/source/scriptforge/SF_PythonHelper.xba
+++ b/wizards/source/scriptforge/SF_PythonHelper.xba
@@ -547,8 +547,9 @@ Dim sObjectType As String &apos; Alias of object.ObjectType
Dim bBasicClass As Boolean &apos; True when BasicObject is a class
Dim sLibrary As String &apos; Library where the object belongs to
Dim bUno As Boolean &apos; Return value is a UNO object
+Dim iDims As Integer &apos; # of dims of vReturn
Dim sess As Object : Set sess = ScriptForge.SF_Session
-Dim i As Long
+Dim i As Long, j As Long
&apos; Conventional special input or output values
Const cstNoArgs = &quot;+++NOARGS+++&quot;, cstSymEmpty = &quot;+++EMPTY+++&quot;, cstSymNull = &quot;+++NULL+++&quot;, cstSymMissing = &quot;+++MISSING+++&quot;
@@ -658,6 +659,15 @@ Try:
If sObjectType = &quot;SF_FileSystem&quot; And Script = &quot;GetFileModified&quot; Then vReturn = SF_FileSystem.GetFileModified(vArgs(0))
End Select
+ &apos; Methods in usual modules using a 2D array or returning arrays are hardcoded as exceptions
+ ElseIf Not bBasicClass And _
+ (((CallType And vbMethod) + (CallType And cstArgArray)) = vbMethod + cstArgArray Or _
+ ((CallType And vbMethod) + (CallType And cstRetArray)) = vbMethod + cstRetArray) Then
+ Select Case sLibrary
+ Case &quot;ScriptForge&quot;
+ If sObjectType = &quot;SF_Array&quot; And Script = &quot;ImportFromCSVFile&quot; Then vReturn = SF_Array.ImportFromCSVFile(vArgs(0), vArgs(1), vArgs(2))
+ End Select
+
&apos; Methods in usual modules are called by ExecuteBasicScript() except if they use a ParamArray
ElseIf Not bBasicClass And (CallType And vbMethod) = vbMethod Then
sScript = sLibrary &amp; &quot;.&quot; &amp; sObjectType &amp; &quot;.&quot; &amp; Script
@@ -721,9 +731,22 @@ Try:
&apos; Scalar
If IsArray(vReturn) Then
ReDim vReturnArray(0 To 2)
+ iDims = SF_Array.CountDims(vReturn)
+ &apos; Replace dates by ISO notation
+ If iDims = 1 Then
+ For i = LBound(vReturn) To UBound(vReturn)
+ If VarType(vReturn(i)) = V_DATE Then vReturn(i) = SF_Utils._CDateToIso(vReturn(i))
+ Next i
+ ElseIf iDims = 2 Then
+ For i = LBound(vReturn, 1) To UBound(vReturn, 1)
+ For j = LBound(vReturn, 2) To UBound(vReturn, 2)
+ If VarType(vReturn(i, j)) = V_DATE Then vReturn(i, j) = SF_Utils._CDateToIso(vReturn(i, j))
+ Next j
+ Next i
+ End If
vReturnArray(0) = vReturn &apos; 2D arrays are flattened by the script provider when returning to Python
vReturnArray(1) = VarType(vReturn)
- vReturnArray(2) = SF_Array.CountDims(vReturn)
+ vReturnArray(2) = iDims
ElseIf VarType(vReturn) = V_OBJECT And Not IsNull(vReturn) Then
&apos; Uno or not Uno ?BuildPath
bUno = False
diff --git a/wizards/source/scriptforge/python/scriptforge.py b/wizards/source/scriptforge/python/scriptforge.py
index 86e35167b83b..ed87679ee99f 100644
--- a/wizards/source/scriptforge/python/scriptforge.py
+++ b/wizards/source/scriptforge/python/scriptforge.py
@@ -362,7 +362,7 @@ class SFServices(object):
vbGet, vbLet, vbMethod, vbSet = 2, 4, 1, 8 # CallByName constants
flgDateRet = 128 # Invoked service method can return a date
flgArrayArg = 512 # 1st argument can be a 2D array
- flgArrayRet = 1024 # Invoked service method can return an array
+ flgArrayRet = 1024 # Invoked service method can return a 2D array
flgUno = 256 # Invoked service method/property can return a UNO object
# Basic class type
moduleClass, moduleStandard = 2, 1
@@ -505,6 +505,31 @@ class SFServices(object):
# #####################################################################################################################
class SFScriptForge:
# #########################################################################
+ # SF_Array CLASS
+ # #########################################################################
+ class SF_Array(SFServices, metaclass = _Singleton):
+ """
+ Provides a collection of methods for manipulating and transforming arrays of one dimension (vectors)
+ and arrays of two dimensions (matrices). This includes set operations, sorting,
+ importing to and exporting from text files.
+ The Python version of the service provides a single method: ImportFromCSVFile
+ """
+ # Mandatory class properties for service registration
+ serviceimplementation = 'basic'
+ servicename = 'ScriptForge.Array'
+ servicesynonyms = ('array', 'scriptforge.array')
+ serviceproperties = dict()
+ propertysynonyms = SFServices._getAttributeSynonyms(serviceproperties)
+
+ def ImportFromCSVFile(self, filename, delimiter = ',', dateformat = ''):
+ """
+ Difference with the Basic version: dates are returned in their iso format,
+ not as any of the datetime objects.
+ """
+ return self.Execute(self.vbMethod + self.flgArrayRet, 'ImportFromCSVFile', filename, delimiter, dateformat)
+ importFromCSVFile, importfromcsvfile = ImportFromCSVFile, ImportFromCSVFile
+
+ # #########################################################################
# SF_Basic CLASS
# #########################################################################
class SF_Basic(SFServices, metaclass = _Singleton):
@@ -787,7 +812,7 @@ class SFScriptForge:
def DebugDisplay(self, *args):
# Arguments are concatenated in a single string similar to what the Python print() function would produce
self.DebugPrint(*args)
- param = '\n'.join(list(map(lambda a : a.strip("'") if isinstance(a, str) else repr(a), args)))
+ param = '\n'.join(list(map(lambda a: a.strip("'") if isinstance(a, str) else repr(a), args)))
bas = CreateScriptService('ScriptForge.Basic')
return bas.MsgBox(param, bas.MB_OK + bas.MB_ICONINFORMATION, 'DebugDisplay')
debugDisplay, debugdisplay = DebugDisplay, DebugDisplay
@@ -862,7 +887,7 @@ class SFScriptForge:
fileexists, fileExists = FileExists, FileExists
def Files(self, foldername, filter = ''):
- return self.Execute(self.vbMethod + self.flgArrayRet, 'Files', foldername, filter)
+ return self.Execute(self.vbMethod, 'Files', foldername, filter)
def FolderExists(self, foldername):
return self.Execute(self.vbMethod, 'FolderExists', foldername)
@@ -917,7 +942,7 @@ class SFScriptForge:
return self.Execute(self.vbMethod, 'PickFolder', defaultfolder, freetext)
def SubFolders(self, foldername, filter = ''):
- return self.Execute(self.vbMethod + self.flgArrayRet, 'SubFolders', foldername, filter)
+ return self.Execute(self.vbMethod, 'SubFolders', foldername, filter)
def _ConvertFromUrl(self, filename):
# Alias for same function in FileSystem Basic module
@@ -1169,6 +1194,7 @@ def CreateScriptService(service, *args):
serv = ScriptForge.InvokeBasicService('SF_Services', SFServices.vbMethod, 'CreateScriptService', service, *args)
return serv
+
createScriptService, createscriptservice = CreateScriptService, CreateScriptService