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