A Console Based Progress Bar

Hi All,

Nothing amazing here, but I was wondering how Yafaray and LUX get green colored text in the console window. Does anyone know how to make colorized text appear in the console in Blender 2.5?

As I was searching for this answer, I ran across this code that works in Blender.


import sys
import time

def progress(n):
   for i in range(n+1):
       sys.stdout.write('\r%3s%% [%s>%s]' % (i, '='*i, ' '*(n-i)))
       sys.stdout.flush()
       time.sleep(0.5)

progress(60)

Run this short code and then immediately bring up the console window. You will see that you can have a text based progress bar. This may be a nice way to show a function in progress if they take a long time.

Use report()
Example of a typical line within your operator execute() or invoke() code:

self.report("INFO", "This text shows up in green")

Thanks, I did not know about that method of an operator.

A lot of my code is still currently running “freeform” and not as an operator so I have no self:spin:

I did manage to come up with a way to colorize when code is running in a “freeform” state.


import platform

import logging
logging.basicConfig(level=logging.DEBUG,format='(%(threadName)-10s) %(message)s',)

############################################################################
# Global variables here.
############################################################################
PREFIX = "  "
CONSOLE_PREFIX = ""
CONSOLE_HANDLE = None
CONSOLE_COLOR_CLEAR = None
DEBUG = True
LOGGING = True

def toConsole(passedItem):
    global DEBUG, LOGGING, CONSOLE_HANDLE, CONSOLE_PREFIX
        
    if DEBUG == True:
        if platform.system() == "Windows":
            # Turn on colorization.
            ctypes.windll.kernel32.SetConsoleTextAttribute(CONSOLE_HANDLE, FOREGROUND_RED)
                
        if LOGGING == True:
            if platform.system() == "Windows":
                logging.debug(CONSOLE_PREFIX + "->" + passedItem)
            else:
                #Linux or OSX.
                logging.debug(bcolors.WARNING + CONSOLE_PREFIX + "->" + passedItem)
                
        
        if platform.system() == "Windows":
            # Turn off colorization.
            ctypes.windll.kernel32.SetConsoleTextAttribute(CONSOLE_HANDLE, CONSOLE_COLOR_CLEAR)
    

if (platform.system() == "Linux") or (platform.system() == "Darwin"):
    # For Linux or OSX, we only need to use ansii escape codes.
    class bcolors:
        HEADER = '\033[95m'
        OKBLUE = '\033[94m'
        OKGREEN = '\033[92m'
        WARNING = '\033[93m'
        FAIL = '\033[91m'
        ENDC = '\033[0m'
    
        def disable(self):
            self.HEADER = ''
            self.OKBLUE = ''
            self.OKGREEN = ''
            self.WARNING = ''
            self.FAIL = ''
            self.ENDC = ''

if platform.system() == "Windows":
    # For windows we need to use ctypes win32.dll
    import ctypes
    
    # Constants from the Windows API
    STD_OUTPUT_HANDLE = -11
    FOREGROUND_BLUE_DRK    = 0x0001 # text color contains dark blue.
    FOREGROUND_GREEN_DRK    = 0x0002 # text color contains green.
    FOREGROUND_CYAN_DRK    = 0x0003 # text color contains cyan.
    FOREGROUND_RED_DRK    = 0x0004 # text color contains red.
    FOREGROUND_PLUM = 0x0005 # text color contains purple.
    FOREGROUND_GOLD    = 0x0006 # text color contains gold.
    FOREGROUND_WHITE    = 0x0007 # text color contains white.
    FOREGROUND_GREY    = 0x0008 # text color contains grey.
    FOREGROUND_BLUE    = 0x0009 # text color contains blue.
    FOREGROUND_IVORY    = 0x000f # text color contains ivory.
    FOREGROUND_YELLOW    = 0x000e # text color contains yellow.
    FOREGROUND_PINK    = 0x000d # text color contains pink.
    FOREGROUND_RED    = 0x000c # text color contains red.
    FOREGROUND_CYAN    = 0x000b # text color contains cyan.
    FOREGROUND_GREEN    = 0x000a # text color contains green.
    
    
    def get_csbi_attributes(handle):
        # Based on IPython's winconsole.py, written by Alexander Belchenko
        import struct
        csbi = ctypes.create_string_buffer(22)
        res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(handle, csbi)
        assert res
    
        (bufx, bufy, curx, cury, wattr,
        left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
        return wattr

    CONSOLE_HANDLE = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
    try:
        CONSOLE_COLOR_CLEAR = get_csbi_attributes(CONSOLE_HANDLE)
    except:
        pass
    
toConsole("My string and my #" + str(10) +".")
print("here")

I have not tested the Linux or OSX portion, but from what I read ANSII support is automatic in the consoles for those OS’s. So a simple escape sequence can turn color on and off.

Tested in Linux (ubuntu 12.04) with blender 2.68 … works!


Wow! That’s nice research!