Module sverchok.utils.nodes_mixins.console_mixin
Expand source code
# This file is part of project Sverchok. It's copyrighted by the contributors
# recorded in the version control history of the file, available from
# its original location https://github.com/nortikin/sverchok/commit/master
#
# SPDX-License-Identifier: GPL3
# License-Filename: LICENSE
import re
import bpy
import numpy as np
import bgl, gpu
from gpu_extras.batch import batch_for_shader
from sverchok.utils.sv_nodeview_draw_helper import get_console_grid, get_xy_for_bgl_drawing
from sverchok.nodes.viz.console_node import (
simple_console_xy,
terminal_text_to_uv,
process_uvs_for_shader,
syntax_highlight_basic,
make_color,
process_grid_for_shader,
vertex_shader,
lexed_fragment_shader,
lexed_colors,
get_font_pydata_location,
)
def advanced_parse_socket(socket, node):
out = "...."
if (fulldata := socket.sv_get()):
if len(fulldata) > 0:
try:
# this is to handle data, which can be turned into np.array
# np.array can handle a lot, but it will get things wrong - the tricky part is
# to introspect and
# - pass to array2string for syntax highlighter (mostly non strings) or
# - pass unchanged to lamelexer for character based colouring (strings)
# could potentially chop up fulldata here before turning it
# into nparray. maybe it's faster?
index = abs(node.element_index) % len(fulldata)
prefix = f"data[{index}] = "
a = np.array(fulldata[index])
str_array = np.array2string(
a,
max_line_width=node.line_width,
precision=node.rounding or None,
prefix=prefix,
separator=' ',
threshold=30,
edgeitems=10)
if "list" in str_array:
str_array = re.sub("list\((?P<list>.+?)\)", "\g<list>", str_array)
#print(str_array)
return (prefix + str_array).split("\n")
except:
...
return out
def find_longest_linelength(lines):
return len(max(lines, key=len))
def ensure_line_padding(text, filler=" "):
""" expects a single string, with newlines """
lines = text.split('\n')
longest_line = find_longest_linelength(lines)
new_lines = [line.ljust(longest_line, filler) for line in lines]
return new_lines, longest_line
def advanced_text_decompose(content):
"""
input:
expects to receive a newline separated string, to indicate multiline text
if anything else is received a "no valid text found..." message is passed.
return:
return_str : a list of strings, padded with " " to match the longest line
dims : 1. number of lines high,
2. length of longest line (its char count)
"""
return_str = ""
if isinstance(content, str):
return_str, width = ensure_line_padding(content)
else:
return_str, width = ensure_line_padding("no valid text found\nfeed it multiline\ntext")
dims = width, len(return_str)
return return_str, dims
class LexMixin():
texture_dict = {}
console_grid_dict = {} # shared over all insntances.
name1Color: make_color("name1 color", (0.83, 0.91, 1.00, 1.0)) # 1
numberColor: make_color("number color", (0.08, 0.70, 0.98, 1.0)) # 2
stringColor: make_color("Strings", (0.96, 0.85, 0.00, 1.0)) # 3
parenColor: make_color("parenthesis" , (0.70, 0.07, 0.01, 1.0)) # 7, 8
bracketColor: make_color("Brackets color", (0.65, 0.68, 0.70, 1.0)) # 9, 10
equalsColor: make_color("Equals", (0.90, 0.70, 0.60, 1.0)) # 22
braceColor: make_color("Braces", (0.40, 0.50, 0.70, 1.0)) # 25, 26
opColor: make_color("Operators", (1.00, 0.18, 0.00, 1.0)) # 53, 54
commentColor: make_color("Comments", (0.49, 0.49, 0.49, 1.0)) # 55, 60
name2Color: make_color("Main syntax", (0.90, 0.01, 0.02, 1.0)) # 90
name3Color: make_color("Bool etc,..", (0.30, 0.90, 0.40, 1.0)) # 91
qualifierColor: make_color("Qualifiers", (0.18, 0.77, 0.01, 1.0)) # 92
bgColor: make_color("Background", (0.06, 0.06, 0.06, 1.0)) # there are nicer ways to calculate the background overlay.
terminal_width: bpy.props.IntProperty(name="terminal width", default=10, min=2) #, update=updateNode)
terminal_text: bpy.props.StringProperty(name="terminal text", default="1234567890\n0987654321\n098765BbaA")
num_rows: bpy.props.IntProperty(name="num rows", default=3, min=1) #, update=updateNode)
local_scale: bpy.props.FloatProperty(default=0.6, min=0.2, name="scale", update=lambda self, context: self.process_node(context))
def init_texture(self, width, height):
texname = self.texture_dict['texture']
data = self.texture_dict['texture_data']
clr = bgl.GL_RGBA
if not 'texture_buffer' in self.texture_dict:
#print('initializing texture longform')
texture = bgl.Buffer(bgl.GL_FLOAT, data.size, data.tolist())
self.texture_dict['texture_buffer'] = texture
else:
#print("reusing")
texture = self.texture_dict['texture_buffer']
bgl.glPixelStorei(bgl.GL_UNPACK_ALIGNMENT, 1)
bgl.glEnable(bgl.GL_TEXTURE_2D)
bgl.glBindTexture(bgl.GL_TEXTURE_2D, texname)
bgl.glActiveTexture(bgl.GL_TEXTURE0)
bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_S, bgl.GL_CLAMP_TO_EDGE)
bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_T, bgl.GL_CLAMP_TO_EDGE)
bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MAG_FILTER, bgl.GL_LINEAR)
bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MIN_FILTER, bgl.GL_LINEAR)
bgl.glTexImage2D(bgl.GL_TEXTURE_2D, 0, clr, width, height, 0, clr, bgl.GL_FLOAT, texture)
def get_font_texture(self):
if not self.texture_dict:
filepath = get_font_pydata_location()
# this is a compressed npz, which we can dict lookup.
found_data = np.load(filepath)
data = found_data['a']
dsize = data.size
data = data.repeat(3).reshape(-1, 3)
data = np.concatenate((data, np.ones(dsize)[:,None]),axis=1).flatten()
name = bgl.Buffer(bgl.GL_INT, 1)
bgl.glGenTextures(1, name)
self.texture_dict['texture'] = name[0]
self.texture_dict['texture_data'] = data # bgl.Buffer(bgl.GL_FLOAT, data.size, data.tolist())
def get_lexed_colors(self):
return [(lex_name, getattr(self, lex_name)[:]) for lex_name in lexed_colors]
def prepare_for_grid(self):
char_width = int(15 * self.local_scale)
char_height = int(32 * self.local_scale)
params = char_width, char_height, self.terminal_width, self.num_rows
if params in self.console_grid_dict:
geom = self.console_grid_dict.get(params)
else:
geom = get_console_grid(char_width, char_height, self.terminal_width, self.num_rows)
self.console_grid_dict[params] = geom
return geom
@property
def dims(self):
x, y = self.xy_offset
width = self.terminal_width * 15
height = self.num_rows * 32
return (x, y, width, height)
def set_node_props(self, socket_data):
multiline, (chars_x, chars_y) = advanced_text_decompose('\n'.join(socket_data))
valid_multiline = '\n'.join(multiline)
self.terminal_text = valid_multiline
self.num_rows = chars_y
self.terminal_width = chars_x
@property
def draw_data(self):
texture = lambda: None
config = lambda: None
processed_data = advanced_parse_socket(self.inputs[0], self)
self.set_node_props(processed_data)
self.adjust_position_and_dimensions(*self.dims) # low impact i think..
lexer = syntax_highlight_basic(self).repeat(6).tolist()
self.get_font_texture() # [x] this is cached after 1st run
self.init_texture(256, 256) # this must be done each redraw
grid = self.prepare_for_grid() # [x] is cached
verts = process_grid_for_shader(grid) # not worth caching (tried!)
uv_indices = process_uvs_for_shader(self) # could cache if terminal text is unchanged.
texture.texture_dict = self.texture_dict
shader = gpu.types.GPUShader(vertex_shader, lexed_fragment_shader)
batch = batch_for_shader(shader, 'TRIS', {"pos": verts, "texCoord": uv_indices, "lexer": lexer})
config.batch = batch
config.shader = shader
config.syntax_mode = "Code"
config.colors = {color_name: getattr(self, color_name)[:] for color_name in lexed_colors}
draw_data = {
'tree_name': self.id_data.name[:],
'node_name': self.name[:],
'loc': get_xy_for_bgl_drawing,
'mode': 'custom_function_context',
'custom_function': simple_console_xy,
'args': (texture, config)
}
return draw_data
Functions
def advanced_parse_socket(socket, node)
-
Expand source code
def advanced_parse_socket(socket, node): out = "...." if (fulldata := socket.sv_get()): if len(fulldata) > 0: try: # this is to handle data, which can be turned into np.array # np.array can handle a lot, but it will get things wrong - the tricky part is # to introspect and # - pass to array2string for syntax highlighter (mostly non strings) or # - pass unchanged to lamelexer for character based colouring (strings) # could potentially chop up fulldata here before turning it # into nparray. maybe it's faster? index = abs(node.element_index) % len(fulldata) prefix = f"data[{index}] = " a = np.array(fulldata[index]) str_array = np.array2string( a, max_line_width=node.line_width, precision=node.rounding or None, prefix=prefix, separator=' ', threshold=30, edgeitems=10) if "list" in str_array: str_array = re.sub("list\((?P<list>.+?)\)", "\g<list>", str_array) #print(str_array) return (prefix + str_array).split("\n") except: ... return out
def advanced_text_decompose(content)
-
input: expects to receive a newline separated string, to indicate multiline text if anything else is received a "no valid text found…" message is passed. return: return_str : a list of strings, padded with " " to match the longest line dims : 1. number of lines high, 2. length of longest line (its char count)
Expand source code
def advanced_text_decompose(content): """ input: expects to receive a newline separated string, to indicate multiline text if anything else is received a "no valid text found..." message is passed. return: return_str : a list of strings, padded with " " to match the longest line dims : 1. number of lines high, 2. length of longest line (its char count) """ return_str = "" if isinstance(content, str): return_str, width = ensure_line_padding(content) else: return_str, width = ensure_line_padding("no valid text found\nfeed it multiline\ntext") dims = width, len(return_str) return return_str, dims
def ensure_line_padding(text, filler=' ')
-
expects a single string, with newlines
Expand source code
def ensure_line_padding(text, filler=" "): """ expects a single string, with newlines """ lines = text.split('\n') longest_line = find_longest_linelength(lines) new_lines = [line.ljust(longest_line, filler) for line in lines] return new_lines, longest_line
def find_longest_linelength(lines)
-
Expand source code
def find_longest_linelength(lines): return len(max(lines, key=len))
Classes
class LexMixin
-
Expand source code
class LexMixin(): texture_dict = {} console_grid_dict = {} # shared over all insntances. name1Color: make_color("name1 color", (0.83, 0.91, 1.00, 1.0)) # 1 numberColor: make_color("number color", (0.08, 0.70, 0.98, 1.0)) # 2 stringColor: make_color("Strings", (0.96, 0.85, 0.00, 1.0)) # 3 parenColor: make_color("parenthesis" , (0.70, 0.07, 0.01, 1.0)) # 7, 8 bracketColor: make_color("Brackets color", (0.65, 0.68, 0.70, 1.0)) # 9, 10 equalsColor: make_color("Equals", (0.90, 0.70, 0.60, 1.0)) # 22 braceColor: make_color("Braces", (0.40, 0.50, 0.70, 1.0)) # 25, 26 opColor: make_color("Operators", (1.00, 0.18, 0.00, 1.0)) # 53, 54 commentColor: make_color("Comments", (0.49, 0.49, 0.49, 1.0)) # 55, 60 name2Color: make_color("Main syntax", (0.90, 0.01, 0.02, 1.0)) # 90 name3Color: make_color("Bool etc,..", (0.30, 0.90, 0.40, 1.0)) # 91 qualifierColor: make_color("Qualifiers", (0.18, 0.77, 0.01, 1.0)) # 92 bgColor: make_color("Background", (0.06, 0.06, 0.06, 1.0)) # there are nicer ways to calculate the background overlay. terminal_width: bpy.props.IntProperty(name="terminal width", default=10, min=2) #, update=updateNode) terminal_text: bpy.props.StringProperty(name="terminal text", default="1234567890\n0987654321\n098765BbaA") num_rows: bpy.props.IntProperty(name="num rows", default=3, min=1) #, update=updateNode) local_scale: bpy.props.FloatProperty(default=0.6, min=0.2, name="scale", update=lambda self, context: self.process_node(context)) def init_texture(self, width, height): texname = self.texture_dict['texture'] data = self.texture_dict['texture_data'] clr = bgl.GL_RGBA if not 'texture_buffer' in self.texture_dict: #print('initializing texture longform') texture = bgl.Buffer(bgl.GL_FLOAT, data.size, data.tolist()) self.texture_dict['texture_buffer'] = texture else: #print("reusing") texture = self.texture_dict['texture_buffer'] bgl.glPixelStorei(bgl.GL_UNPACK_ALIGNMENT, 1) bgl.glEnable(bgl.GL_TEXTURE_2D) bgl.glBindTexture(bgl.GL_TEXTURE_2D, texname) bgl.glActiveTexture(bgl.GL_TEXTURE0) bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_S, bgl.GL_CLAMP_TO_EDGE) bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_T, bgl.GL_CLAMP_TO_EDGE) bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MAG_FILTER, bgl.GL_LINEAR) bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MIN_FILTER, bgl.GL_LINEAR) bgl.glTexImage2D(bgl.GL_TEXTURE_2D, 0, clr, width, height, 0, clr, bgl.GL_FLOAT, texture) def get_font_texture(self): if not self.texture_dict: filepath = get_font_pydata_location() # this is a compressed npz, which we can dict lookup. found_data = np.load(filepath) data = found_data['a'] dsize = data.size data = data.repeat(3).reshape(-1, 3) data = np.concatenate((data, np.ones(dsize)[:,None]),axis=1).flatten() name = bgl.Buffer(bgl.GL_INT, 1) bgl.glGenTextures(1, name) self.texture_dict['texture'] = name[0] self.texture_dict['texture_data'] = data # bgl.Buffer(bgl.GL_FLOAT, data.size, data.tolist()) def get_lexed_colors(self): return [(lex_name, getattr(self, lex_name)[:]) for lex_name in lexed_colors] def prepare_for_grid(self): char_width = int(15 * self.local_scale) char_height = int(32 * self.local_scale) params = char_width, char_height, self.terminal_width, self.num_rows if params in self.console_grid_dict: geom = self.console_grid_dict.get(params) else: geom = get_console_grid(char_width, char_height, self.terminal_width, self.num_rows) self.console_grid_dict[params] = geom return geom @property def dims(self): x, y = self.xy_offset width = self.terminal_width * 15 height = self.num_rows * 32 return (x, y, width, height) def set_node_props(self, socket_data): multiline, (chars_x, chars_y) = advanced_text_decompose('\n'.join(socket_data)) valid_multiline = '\n'.join(multiline) self.terminal_text = valid_multiline self.num_rows = chars_y self.terminal_width = chars_x @property def draw_data(self): texture = lambda: None config = lambda: None processed_data = advanced_parse_socket(self.inputs[0], self) self.set_node_props(processed_data) self.adjust_position_and_dimensions(*self.dims) # low impact i think.. lexer = syntax_highlight_basic(self).repeat(6).tolist() self.get_font_texture() # [x] this is cached after 1st run self.init_texture(256, 256) # this must be done each redraw grid = self.prepare_for_grid() # [x] is cached verts = process_grid_for_shader(grid) # not worth caching (tried!) uv_indices = process_uvs_for_shader(self) # could cache if terminal text is unchanged. texture.texture_dict = self.texture_dict shader = gpu.types.GPUShader(vertex_shader, lexed_fragment_shader) batch = batch_for_shader(shader, 'TRIS', {"pos": verts, "texCoord": uv_indices, "lexer": lexer}) config.batch = batch config.shader = shader config.syntax_mode = "Code" config.colors = {color_name: getattr(self, color_name)[:] for color_name in lexed_colors} draw_data = { 'tree_name': self.id_data.name[:], 'node_name': self.name[:], 'loc': get_xy_for_bgl_drawing, 'mode': 'custom_function_context', 'custom_function': simple_console_xy, 'args': (texture, config) } return draw_data
Subclasses
- sverchok.nodes.text.stethoscope_v28.SvStethoscopeNodeMK2
Class variables
var bgColor : <_PropertyDeferred,
, {'name': 'Background', 'default': (0.06, 0.06, 0.06, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'bgColor'}> var braceColor : <_PropertyDeferred,
, {'name': 'Braces', 'default': (0.4, 0.5, 0.7, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'braceColor'}> var bracketColor : <_PropertyDeferred,
, {'name': 'Brackets color', 'default': (0.65, 0.68, 0.7, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'bracketColor'}> var commentColor : <_PropertyDeferred,
, {'name': 'Comments', 'default': (0.49, 0.49, 0.49, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'commentColor'}> var console_grid_dict
var equalsColor : <_PropertyDeferred,
, {'name': 'Equals', 'default': (0.9, 0.7, 0.6, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'equalsColor'}> var local_scale : <_PropertyDeferred,
, {'default': 0.6, 'min': 0.2, 'name': 'scale', 'update': LexMixin. at 0x7f2f1abffb80>, 'attr': 'local_scale'}> var name1Color : <_PropertyDeferred,
, {'name': 'name1 color', 'default': (0.83, 0.91, 1.0, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'name1Color'}> var name2Color : <_PropertyDeferred,
, {'name': 'Main syntax', 'default': (0.9, 0.01, 0.02, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'name2Color'}> var name3Color : <_PropertyDeferred,
, {'name': 'Bool etc,..', 'default': (0.3, 0.9, 0.4, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'name3Color'}> var num_rows : <_PropertyDeferred,
, {'name': 'num rows', 'default': 3, 'min': 1, 'attr': 'num_rows'}> var numberColor : <_PropertyDeferred,
, {'name': 'number color', 'default': (0.08, 0.7, 0.98, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'numberColor'}> var opColor : <_PropertyDeferred,
, {'name': 'Operators', 'default': (1.0, 0.18, 0.0, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'opColor'}> var parenColor : <_PropertyDeferred,
, {'name': 'parenthesis', 'default': (0.7, 0.07, 0.01, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'parenColor'}> var qualifierColor : <_PropertyDeferred,
, {'name': 'Qualifiers', 'default': (0.18, 0.77, 0.01, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'qualifierColor'}> var stringColor : <_PropertyDeferred,
, {'name': 'Strings', 'default': (0.96, 0.85, 0.0, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'stringColor'}> var terminal_text : <_PropertyDeferred,
, {'name': 'terminal text', 'default': '1234567890\n0987654321\n098765BbaA', 'attr': 'terminal_text'}> var terminal_width : <_PropertyDeferred,
, {'name': 'terminal width', 'default': 10, 'min': 2, 'attr': 'terminal_width'}> var texture_dict
Instance variables
var dims
-
Expand source code
@property def dims(self): x, y = self.xy_offset width = self.terminal_width * 15 height = self.num_rows * 32 return (x, y, width, height)
var draw_data
-
Expand source code
@property def draw_data(self): texture = lambda: None config = lambda: None processed_data = advanced_parse_socket(self.inputs[0], self) self.set_node_props(processed_data) self.adjust_position_and_dimensions(*self.dims) # low impact i think.. lexer = syntax_highlight_basic(self).repeat(6).tolist() self.get_font_texture() # [x] this is cached after 1st run self.init_texture(256, 256) # this must be done each redraw grid = self.prepare_for_grid() # [x] is cached verts = process_grid_for_shader(grid) # not worth caching (tried!) uv_indices = process_uvs_for_shader(self) # could cache if terminal text is unchanged. texture.texture_dict = self.texture_dict shader = gpu.types.GPUShader(vertex_shader, lexed_fragment_shader) batch = batch_for_shader(shader, 'TRIS', {"pos": verts, "texCoord": uv_indices, "lexer": lexer}) config.batch = batch config.shader = shader config.syntax_mode = "Code" config.colors = {color_name: getattr(self, color_name)[:] for color_name in lexed_colors} draw_data = { 'tree_name': self.id_data.name[:], 'node_name': self.name[:], 'loc': get_xy_for_bgl_drawing, 'mode': 'custom_function_context', 'custom_function': simple_console_xy, 'args': (texture, config) } return draw_data
Methods
def get_font_texture(self)
-
Expand source code
def get_font_texture(self): if not self.texture_dict: filepath = get_font_pydata_location() # this is a compressed npz, which we can dict lookup. found_data = np.load(filepath) data = found_data['a'] dsize = data.size data = data.repeat(3).reshape(-1, 3) data = np.concatenate((data, np.ones(dsize)[:,None]),axis=1).flatten() name = bgl.Buffer(bgl.GL_INT, 1) bgl.glGenTextures(1, name) self.texture_dict['texture'] = name[0] self.texture_dict['texture_data'] = data # bgl.Buffer(bgl.GL_FLOAT, data.size, data.tolist())
def get_lexed_colors(self)
-
Expand source code
def get_lexed_colors(self): return [(lex_name, getattr(self, lex_name)[:]) for lex_name in lexed_colors]
def init_texture(self, width, height)
-
Expand source code
def init_texture(self, width, height): texname = self.texture_dict['texture'] data = self.texture_dict['texture_data'] clr = bgl.GL_RGBA if not 'texture_buffer' in self.texture_dict: #print('initializing texture longform') texture = bgl.Buffer(bgl.GL_FLOAT, data.size, data.tolist()) self.texture_dict['texture_buffer'] = texture else: #print("reusing") texture = self.texture_dict['texture_buffer'] bgl.glPixelStorei(bgl.GL_UNPACK_ALIGNMENT, 1) bgl.glEnable(bgl.GL_TEXTURE_2D) bgl.glBindTexture(bgl.GL_TEXTURE_2D, texname) bgl.glActiveTexture(bgl.GL_TEXTURE0) bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_S, bgl.GL_CLAMP_TO_EDGE) bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_T, bgl.GL_CLAMP_TO_EDGE) bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MAG_FILTER, bgl.GL_LINEAR) bgl.glTexParameterf(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MIN_FILTER, bgl.GL_LINEAR) bgl.glTexImage2D(bgl.GL_TEXTURE_2D, 0, clr, width, height, 0, clr, bgl.GL_FLOAT, texture)
def prepare_for_grid(self)
-
Expand source code
def prepare_for_grid(self): char_width = int(15 * self.local_scale) char_height = int(32 * self.local_scale) params = char_width, char_height, self.terminal_width, self.num_rows if params in self.console_grid_dict: geom = self.console_grid_dict.get(params) else: geom = get_console_grid(char_width, char_height, self.terminal_width, self.num_rows) self.console_grid_dict[params] = geom return geom
def set_node_props(self, socket_data)
-
Expand source code
def set_node_props(self, socket_data): multiline, (chars_x, chars_y) = advanced_text_decompose('\n'.join(socket_data)) valid_multiline = '\n'.join(multiline) self.terminal_text = valid_multiline self.num_rows = chars_y self.terminal_width = chars_x