105 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Convert Python logic node definition to Haxe
 | 
						|
 | 
						|
import json
 | 
						|
import glob
 | 
						|
import sys
 | 
						|
 | 
						|
def socket_type(s):
 | 
						|
	if s == 'LnxNodeSocketAction':
 | 
						|
		return 'ACTION'
 | 
						|
	elif s == 'LnxNodeSocketObject':
 | 
						|
		return 'OBJECT'
 | 
						|
	elif s == 'LnxNodeSocketAnimAction':
 | 
						|
		return 'ANIMACTION'
 | 
						|
	elif s == 'LnxNodeSocketArray':
 | 
						|
		return 'ARRAY'
 | 
						|
	elif s == 'NodeSocketShader':
 | 
						|
		return 'SHADER'
 | 
						|
	elif s == 'NodeSocketInt':
 | 
						|
		return 'INTEGER'
 | 
						|
	elif s == 'NodeSocketFloat':
 | 
						|
		return 'VALUE'
 | 
						|
	elif s == 'NodeSocketString':
 | 
						|
		return 'STRING'
 | 
						|
	elif s == 'NodeSocketBool':
 | 
						|
		return 'BOOL'
 | 
						|
	elif s == 'NodeSocketVector':
 | 
						|
		return 'VECTOR'
 | 
						|
	elif s == 'NodeSocketColor':
 | 
						|
		return 'RGBA'
 | 
						|
	else:
 | 
						|
		return s
 | 
						|
 | 
						|
# path = '/Users/onek8/Downloads/Leenkx/lnxsdk/leenkx/blender/lnx.logicnode'
 | 
						|
path = sys.argv[1]
 | 
						|
modules = glob.glob(path + "/*.py")
 | 
						|
out = {}
 | 
						|
out['categories'] = []
 | 
						|
 | 
						|
for m in modules:
 | 
						|
	if m == '__init__.py':
 | 
						|
		continue
 | 
						|
	if m == 'lnx_nodes.py':
 | 
						|
		continue
 | 
						|
	with open(m) as f:
 | 
						|
		n = {}
 | 
						|
		n['inputs'] = []
 | 
						|
		n['outputs'] = []
 | 
						|
		n['buttons'] = []
 | 
						|
		but = None
 | 
						|
		lines = f.read().splitlines()
 | 
						|
		for l in lines:
 | 
						|
			l = l.strip()
 | 
						|
			if l == '' or l == '],':
 | 
						|
				continue
 | 
						|
 | 
						|
			# if l.startswith('property'):
 | 
						|
			if 'EnumProperty' in l: # TODO: enum only for now
 | 
						|
				but = {}
 | 
						|
				but['name'] = 'property' + l.split(' = ', 1)[0][-1]
 | 
						|
				but['type'] = 'ENUM'
 | 
						|
				but['default_value'] = 0
 | 
						|
				but['data'] = []
 | 
						|
				n['buttons'].append(but)
 | 
						|
				continue
 | 
						|
			elif but != None:
 | 
						|
				if l.endswith(')'):
 | 
						|
					but = None
 | 
						|
					continue
 | 
						|
				ar = l.split("'")
 | 
						|
				but['data'].append(ar[1])
 | 
						|
 | 
						|
			if l.startswith('bl_idname'):
 | 
						|
				ar = l.split("'")
 | 
						|
				n['type'] = ar[1][2:]
 | 
						|
			if l.startswith('bl_label'):
 | 
						|
				ar = l.split("'")
 | 
						|
				n['name'] = ar[1]
 | 
						|
			if l.startswith('self.inputs.new('):
 | 
						|
				ar = l.split("'")
 | 
						|
				soc = {}
 | 
						|
				soc['type'] = socket_type(ar[1])
 | 
						|
				soc['name'] = ar[3]
 | 
						|
				n['inputs'].append(soc)
 | 
						|
			if l.startswith('self.outputs.new('):
 | 
						|
				ar = l.split("'")
 | 
						|
				soc = {}
 | 
						|
				soc['type'] = socket_type(ar[1])
 | 
						|
				soc['name'] = ar[3]
 | 
						|
				n['outputs'].append(soc)
 | 
						|
			if l.startswith('add_node('):
 | 
						|
				ar = l.split("'")
 | 
						|
				cat = None
 | 
						|
				for c in out['categories']:
 | 
						|
					if c['name'] == ar[1]:
 | 
						|
						cat = c
 | 
						|
						break
 | 
						|
				if cat == None:
 | 
						|
					cat = {}
 | 
						|
					cat['name'] = ar[1]
 | 
						|
					cat['nodes'] = []
 | 
						|
					out['categories'].append(cat)
 | 
						|
				cat['nodes'].append(n)
 | 
						|
 | 
						|
print(json.dumps(out))
 |