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))
							 |