175 lines
5.7 KiB
Python
175 lines
5.7 KiB
Python
import sys
|
|
import time
|
|
import math
|
|
import os.path
|
|
from operator import add, mul, sub, truediv
|
|
from time import sleep
|
|
from array import array
|
|
import jarray
|
|
|
|
import java.lang.Class as Class
|
|
import java.lang.Object as Object
|
|
import java.lang.System as System
|
|
import java.beans.PropertyChangeListener
|
|
import java.util.concurrent.Callable
|
|
import java.util.List
|
|
import java.util.ArrayList
|
|
import java.lang.reflect.Array
|
|
import java.lang.Thread
|
|
import java.awt.image.BufferedImage as BufferedImage
|
|
import java.awt.Color as Color
|
|
import java.awt.Point as Point
|
|
import java.awt.Dimension as Dimension
|
|
import java.awt.Rectangle as Rectangle
|
|
import java.awt.Font as Font
|
|
import org.python.core.PyArray as PyArray
|
|
import org.python.core.PyFunction as PyFunction
|
|
import org.python.core.PyMethod as PyMethod
|
|
import org.python.core.PyGenerator as PyGenerator
|
|
|
|
import java.lang.Boolean
|
|
import java.lang.Integer
|
|
import java.lang.Float
|
|
import java.lang.Double
|
|
import java.lang.Short
|
|
import java.lang.Byte
|
|
import java.lang.Long
|
|
import java.lang.String
|
|
|
|
import ch.psi.pshell.core.Context
|
|
import ch.psi.pshell.scripting.ScriptUtils as ScriptUtils
|
|
import ch.psi.utils.Convert as Convert
|
|
import ch.psi.utils.Arr as Arr
|
|
|
|
|
|
###################################################################################################
|
|
#Type conversion and checking
|
|
###################################################################################################
|
|
|
|
def to_array(obj, type = None, primitive = True):
|
|
"""Convert Python list to Java array.
|
|
|
|
Args:
|
|
obj(list): Original data.
|
|
type(str): array type 'b' = byte, 'h' = short, 'i' = int, 'l' = long, 'f' = float, 'd' = double,
|
|
'c' = char, 'z' = boolean, 's' = String, 'o' = Object
|
|
Returns:
|
|
Java array.
|
|
"""
|
|
if obj is None:
|
|
return None
|
|
if type is None:
|
|
type = 'o'
|
|
enforceArrayType=False
|
|
else:
|
|
enforceArrayType=True
|
|
if type[0] == '[':
|
|
type = type[1:]
|
|
element_type = ScriptUtils.getPrimitiveType(type) if primitive else ScriptUtils.getType(type)
|
|
|
|
def convert_1d_array(obj):
|
|
try:
|
|
if primitive:
|
|
#If primitive, first try converting with jarray.array
|
|
return jarray.array(obj,type)
|
|
except:
|
|
pass
|
|
|
|
if type == 'c':
|
|
ret = java.lang.reflect.Array.newInstance(element_type,len(obj))
|
|
for i in range(len(obj)): ret[i] = chr(obj[i])
|
|
return ret
|
|
if type == 'z':
|
|
ret = java.lang.reflect.Array.newInstance(element_type,len(obj))
|
|
for i in range(len(obj)):
|
|
ret[i]= True if obj[i] else False
|
|
return ret
|
|
if type == 'o':
|
|
ret = java.lang.reflect.Array.newInstance(element_type,len(obj))
|
|
for i in range(len(obj)):
|
|
ret[i]= obj[i]
|
|
return ret
|
|
if type == "s":
|
|
return Convert.toStringArray(obj)
|
|
if primitive:
|
|
ret = Convert.toPrimitiveArray(obj, element_type)
|
|
else:
|
|
ret = java.lang.reflect.Array.newInstance(element_type,len(obj))
|
|
for i in range(len(obj)): ret[i] = Convert.toType(obj[i],element_type)
|
|
return ret
|
|
|
|
if isinstance(obj,PyArray):
|
|
if enforceArrayType:
|
|
if Arr.getComponentType(obj) != element_type:
|
|
rank = Arr.getRank(obj)
|
|
if (rank== 1):
|
|
obj=convert_1d_array(obj)
|
|
elif (rank>1):
|
|
pars, aux = [element_type], obj
|
|
for i in range(rank):
|
|
pars.append(len(aux))
|
|
aux = aux[0]
|
|
ret = java.lang.reflect.Array.newInstance(*pars)
|
|
for i in range(len(obj)):
|
|
ret[i]=to_array(obj[i], type)
|
|
obj = ret
|
|
elif is_list(obj):
|
|
if type=='o':
|
|
ret = java.lang.reflect.Array.newInstance(element_type, len(obj))
|
|
for i in range (len(obj)):
|
|
if is_list(obj[i]) or isinstance(obj[i],PyArray):
|
|
ret[i] = to_array(obj[i],type)
|
|
else:
|
|
ret[i] = obj[i]
|
|
obj=ret
|
|
elif len(obj)>0 and (is_list(obj[0]) or isinstance(obj[0],PyArray)):
|
|
pars, aux = [element_type], obj
|
|
while len(aux)>0 and (is_list(aux[0]) or isinstance(aux[0],PyArray)):
|
|
pars.append(len(aux))
|
|
aux = aux[0]
|
|
pars.append(0)
|
|
ret = java.lang.reflect.Array.newInstance(*pars)
|
|
for i in range(len(obj)):
|
|
ret[i]=to_array(obj[i], type)
|
|
obj=ret
|
|
else:
|
|
obj= convert_1d_array(obj)
|
|
return obj
|
|
|
|
def to_list(obj):
|
|
"""Convert an object into a Python List.
|
|
|
|
Args:
|
|
obj(tuple or array or List): Original data.
|
|
|
|
Returns:
|
|
List.
|
|
"""
|
|
if obj is None:
|
|
return None
|
|
if isinstance(obj,tuple) or isinstance(obj,java.util.List) :
|
|
return list(obj)
|
|
#if isinstance(obj,PyArray):
|
|
# return obj.tolist()
|
|
if not isinstance(obj,list):
|
|
return [obj,]
|
|
return obj
|
|
|
|
def is_list(obj):
|
|
return isinstance(obj,tuple) or isinstance(obj,list) or isinstance (obj, java.util.List)
|
|
|
|
def is_string(obj):
|
|
return (type(obj) is str) or (type(obj) is unicode)
|
|
|
|
def is_interpreter_thread():
|
|
return java.lang.Thread.currentThread().name == "MainThread"
|
|
|
|
###################################################################################################
|
|
#Access to context singleton
|
|
###################################################################################################
|
|
def get_context():
|
|
return ch.psi.pshell.core.Context.getInstance()
|
|
|
|
|
|
|