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