forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| CLI output.
 | |
| """
 | |
| 
 | |
| import platform
 | |
| import subprocess
 | |
| import sys
 | |
| import bpy
 | |
| 
 | |
| DEBUG = 36
 | |
| INFO = 37
 | |
| WARN = 35
 | |
| ERROR = 31
 | |
| 
 | |
| if platform.system() == "Windows":
 | |
|     HAS_COLOR_SUPPORT = platform.release() == "10"
 | |
| 
 | |
|     if HAS_COLOR_SUPPORT:
 | |
|         # Enable ANSI codes. Otherwise, the ANSI sequences might not be
 | |
|         # evaluated correctly for the first colored print statement.
 | |
|         import ctypes
 | |
|         kernel32 = ctypes.windll.kernel32
 | |
| 
 | |
|         # -11: stdout
 | |
|         handle_out = kernel32.GetStdHandle(-11)
 | |
| 
 | |
|         console_mode = ctypes.c_long()
 | |
|         kernel32.GetConsoleMode(handle_out, ctypes.byref(console_mode))
 | |
| 
 | |
|         # 0b100: ENABLE_VIRTUAL_TERMINAL_PROCESSING, enables ANSI codes
 | |
|         # see https://docs.microsoft.com/en-us/windows/console/setconsolemode
 | |
|         console_mode.value |= 0b100
 | |
|         kernel32.SetConsoleMode(handle_out, console_mode)
 | |
| else:
 | |
|     HAS_COLOR_SUPPORT = True
 | |
| 
 | |
| info_text = ''
 | |
| num_warnings = 0
 | |
| num_errors = 0
 | |
| 
 | |
| def clear(clear_warnings=False, clear_errors=False):
 | |
|     global info_text, num_warnings, num_errors
 | |
|     info_text = ''
 | |
|     if clear_warnings:
 | |
|         num_warnings = 0
 | |
|     if clear_errors:
 | |
|         num_errors = 0
 | |
| 
 | |
| def format_text(text):
 | |
|     return (text[:80] + '..') if len(text) > 80 else text # Limit str size
 | |
| 
 | |
| def log(text, color=None):
 | |
|     print(colorize(text, color))
 | |
| 
 | |
| def debug(text):
 | |
|     print(colorize(text, DEBUG))
 | |
| 
 | |
| def info(text):
 | |
|     global info_text
 | |
|     print(colorize(text, INFO))
 | |
|     info_text = format_text(text)
 | |
| 
 | |
| def print_warn(text):
 | |
|     print(colorize('WARNING: ' + text, WARN))
 | |
| 
 | |
| def warn(text):
 | |
|     global num_warnings
 | |
|     num_warnings += 1
 | |
|     print_warn(text)
 | |
| 
 | |
| def error(text):
 | |
|     global num_errors
 | |
|     num_errors += 1
 | |
|     print(colorize('ERROR: ' + text, ERROR), file=sys.stderr)
 | |
| 
 | |
| def colorize(text:str, color=None):
 | |
|     if bpy.context.area is not None and bpy.context.area.type == 'CONSOLE':
 | |
|         return text
 | |
|     if HAS_COLOR_SUPPORT and color is not None:
 | |
|         csi = '\033['
 | |
|         text = csi + str(color) + 'm' + text + csi + '0m'
 | |
|     return text
 | |
| 
 | |
| def warn_called_process_error(proc: subprocess.CalledProcessError):
 | |
|     out = f'Command {proc.cmd} exited with code {proc.returncode}.'
 | |
|     if proc.output is not None:
 | |
|         out += (
 | |
|             f'Command output:\n'
 | |
|             f'---------------\n'
 | |
|             f'{proc.output.decode(encoding="utf-8")}'  # Output is encoded as bytes by default
 | |
|         )
 | |
|     warn(out)
 |