def main(): """ Main function. """ try: cv = Canvas(8, 2) except CanvasError as err: sys.stderr.write("%s\n" % err) sys.exit(127) cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLACK) cv.put_str(0, 0, "ABcde") cv.set_color_ansi(caca.COLOR_LIGHTRED, caca.COLOR_BLACK) cv.put_str(5, 0, "\\o/") cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLUE) cv.put_str(0, 1, "&$âøÿØ?!") fonts = caca.get_font_list() if not fonts: sys.stderr.write("libcaca was compiled without any fonts\n") sys.exit(127) try: f = Font(fonts[0]) except FontError as err: sys.stderr.write("%s\n" % err) sys.exit(127) w = cv.get_width() * f.get_width() h = cv.get_height() * f.get_height() buf = ctypes.c_buffer(4 * w * h) cv.render(f, buf, w, h, 4 * w) cv.set_size(80, 32) try: dp = Display(cv) except DisplayError as err: sys.stderr.write("%s\n" % err) sys.exit(127) try: if sys.byteorder == 'big': dit = Dither(32, w, h, 4 * w, 0xff0000, 0xff00, 0xff, 0xff000000) else: dit = Dither(32, w, h, 4 * w, 0xff00, 0xff0000, 0xff000000, 0xff) dit.bitmap(cv, 0, 0, cv.get_width(), cv.get_height(), buf) except DitherError as err: sys.stderr.write("%s\n" % err) sys.exit(127) else: dp.refresh() dp.get_event(caca.EVENT_KEY_PRESS, Event(), -1)
def __init__(self, *args, **kwargs): """ """ KinematicServer.__init__(self, *args, **kwargs) self.robots = [ r for (name, r) in self.elements.items() if isinstance(r, Robot) ] self.cv = Canvas() self.dp = Display(self.cv) self.ev = Event() self.quit = False self.width = self.cv.get_width() self.height = self.cv.get_height() self.camera = Camera(self, 640, 480) self.camera.translation = [3.5, 0, 1] self.camera.init() self.fps = -1.0 self.frames = 0 self.last_t = 0
def main(): """ Main function. """ try: cv = Canvas(80, 24) dp = Display(cv) except (CanvasError, DisplayError) as err: sys.stderr.write("%s\n" % err) sys.exit(127) cv.set_color_ansi(caca.COLOR_LIGHTGRAY, caca.COLOR_BLACK) cv.clear() for i in range(0, 16): if i >= 8: y = i + 3 else: y = i + 2 cv.set_color_ansi(caca.COLOR_LIGHTGRAY, caca.COLOR_BLACK) cv.printf(3, y, "ANSI %i", i) for j in range(0, 16): if j >= 8: x = 13 + (j * 4) else: x = 12 + (j * 4) if i >= 8: y = i + 3 else: y = i + 2 cv.set_color_ansi(i, j) cv.put_str(x, y, "Aaホ") cv.set_color_ansi(caca.COLOR_LIGHTGRAY, caca.COLOR_BLACK) cv.put_str( 3, 20, "This is bold This is blink This is italics This is underline" ) cv.set_attr(caca.STYLE_BOLD) cv.put_str(3 + 8, 20, "bold") cv.set_attr(caca.STYLE_BLINK) cv.put_str(3 + 24, 20, "blink") cv.set_attr(caca.STYLE_ITALICS) cv.put_str(3 + 41, 20, "italics") cv.set_attr(caca.STYLE_UNDERLINE) cv.put_str(3 + 60, 20, "underline") dp.refresh() dp.get_event(caca.EVENT_KEY_PRESS, Event(), -1)
def __init__(self, filename=None): # Parse command line arguments self.arg_parser = argparse.ArgumentParser() self.arg_parser.add_argument("--inittest", help="Initialize app and quit", action="store_true", default=False) self.arg_parser.add_argument("--loglevel", help="DEBUG, INFO or WARN", default="DEBUG") self.arg_parser.add_argument("--driver", action="store", dest="driver", default="gl", help="Select display driver: gl, curses, slang") self.args = self.arg_parser.parse_args() self.logger = logging.getLogger() self.logger.setLevel(self.args.loglevel) # Initialize Spec/State self.initialize_app_spec(filename) logging.debug("USING DRIVER: " + self.args.driver) if self.args.driver: self.display = TartanDisplay(self, self.spec, self.args.driver) else: self.display = TartanDisplay(self, self.spec) self.local_event_dispatch = LocalEventDispatch(self) self.digest_rate = 1000 #ms self.keypress_queue = [] self.event_thing = Event() self.quit = False self.styles = [] # Keypress hooks self.keypress_hooks = [] # Parse spec self.load_keypress_hooks() self.load_styles() # Initialize network connection IF specified if self.specifies("network", True, ["app"]): self.remote_messages = [] self.remote_dispatch = RemoteEventDispatch(self) self.remote_dispatch.init_consume()
def main(): """ Main function. """ try: cv = Canvas(0, 0) except CanvasError as err: sys.stderr.write("%s\n" % err) sys.exit(2) for idx in range(1, 200): cv.create_frame(idx) sys.stderr.write("canvas created, size is %dx%d\n" \ % (cv.get_width(), cv.get_height())) cv.set_size(150, 80) sys.stderr.write("canvas expanded, size is %dx%d\n" \ % (cv.get_width(), cv.get_height())) for idx in range(0, 16): cv.set_frame(idx) cv.set_color_ansi(caca.COLOR_WHITE, idx) cv.fill_box(0, 0, 40, 15, ':') cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLUE) cv.put_str((idx * 5) // 2, idx, "カカ") cv.set_color_ansi(caca.COLOR_DEFAULT, caca.COLOR_TRANSPARENT) cv.set_size(41, 16) sys.stderr.write("canvas shrinked, size is %dx%d\n" \ % (cv.get_width(), cv.get_height())) try: dp = Display(cv) except DisplayError as err: sys.stderr.write("%s\n" % err) sys.exit(2) dp.set_time(50000) sys.stderr.write("display attached, size is %dx%d\n" \ % (cv.get_width(), cv.get_height())) n = 0 while not dp.get_event(caca.EVENT_KEY_PRESS, Event(), 0): cv.set_frame(n % 16) dp.refresh() n += 1
def __init__(self, *args, **kwargs): """ """ KinematicServer.__init__(self, *args, **kwargs) self.robots = [r for (name, r) in self.elements.items() if isinstance(r, Robot)] self.cv = Canvas() self.dp = Display(self.cv) self.ev = Event() self.quit = False self.width = self.cv.get_width() self.height = self.cv.get_height() self.camera = Camera(self, 640 , 480) self.camera.translation = [3.5, 0, 1] self.camera.init() self.fps = -1.0 self.frames = 0 self.last_t = 0
def main(): """ Main function. """ lst = caca.get_display_driver_list() cur = 0 try: cv = Canvas(0, 0) dp = Display(cv) except (CanvasError, DisplayError) as err: sys.stderr.write("%s\n" % err) sys.exit(127) cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLACK) while True: cv.put_str(1, 0, "Available drivers:") cur_driver = dp.get_driver() n = 0 for driver, desc in lst: if driver == cur_driver: cv.put_str(2, n + 2, "%s %s (%s)" % ('*', driver, desc)) else: cv.put_str(2, n + 2, "%s %s (%s)" % (' ', driver, desc)) n += 1 cv.put_str(2, n + 3, "Switching driver in 5 seconds") dp.refresh() if dp.get_event(caca.EVENT_KEY_PRESS, Event(), 5000000): break cur += 1 if cur < len(lst) and lst[cur][0] == "raw": cur += 1 if cur >= len(lst): cur = 0 dp.set_driver(lst[cur][0])
def main(): """ Main function. """ try: cv = Canvas(0, 0) dp = Display(cv) except (CanvasError, DisplayError) as err: sys.stderr.write("%s\n" % err) sys.exit(2) sprite = Canvas(0, 0) sprite.set_color_ansi(caca.COLOR_LIGHTRED, caca.COLOR_BLACK) sprite.import_from_memory(THE_PIG, "text") sprite.set_handle(sprite.get_width()//2, sprite.get_height()//2) cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLUE) cv.put_str(0, 0, "Centered sprite") cv.blit(cv.get_width()//2, cv.get_height()//2, sprite, NullCanvas()) dp.refresh() dp.get_event(caca.EVENT_KEY_PRESS, Event(), -1) sys.exit(0)
posx = (cv.get_height() - self.height) // 2 posy = (cv.get_width() - self.width) // 2 for x in range(0, self.ca.height): for y in range(0, self.ca.width): if self.ca.get(x, y): cv.put_str(posy+y, posx+x, "@") def zeroCells(self): for x in range(0, self.ca.height): for y in range(0, self.ca.width): self.ca.set(x, y, 0) if __name__ == "__main__": cv = Canvas() dp = Display(cv) ev = Event() app = CellApp(80, 20) app.zeroCells() while True: if dp.get_event(caca.EVENT_KEY_PRESS, ev, 2): ch = ev.get_key_ch() if ch == ord('q'): break elif ch == ord('s'): app.auto = True elif ch == ord('n'): app.nextCycle() elif ch == ord('r'): app.randomCells()
dp = Display(cv) except (CanvasError, DisplayError), err: sys.stderr.write("%s\n" % err) sys.exit(127) h = cv.get_height() - 1 cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLUE) cv.draw_line(0, 0, cv.get_width() - 1, 0, ' ') cv.draw_line(0, h, cv.get_width() - 1, h, ' ') cv.put_str(0, h, "Type \"quit\" to exit") dp.refresh() while quit < 4: ev = Event() if dp.get_event(caca.EVENT_ANY, ev, -1): if ev.get_type() == caca.EVENT_KEY_PRESS: key = ev.get_key_ch() if key == ord('u') and quit == 1: quit += 1 elif key == ord('i') and quit == 2: quit += 1 elif key == ord('t') and quit == 3: quit += 1 elif key == ord('q'): quit = 1 else: quit = 0 events.append(ev)
class App: defaultColorMap = { "black" : 0, "blue" : 1, "green" : 2, "cyan" : 3, "red" : 4, "magenta" : 5, "brown" : 6, "lightgray" : 7, "darkgray" : 8, "lightblue" : 9, "lightgreen" : 10, "lightcyan" : 11, "lightred" : 12, "lightmagenta" : 13, "yellow" : 14, "white" : 15 } defaultStyles = [ { "name": "default", "bgColor": "black", "fgColor": "white" } ] defaultAppState = { "styles": defaultStyles, "app": { "remoteMessages": { "queues": [] }, "keyHooks": [ { "key": "q", "func": "quitApp" } ], "height": 24, "width": 80 }, "widgets": [] } def specifies(self, key, value=None, path=None): spec_doc = self.spec try: if path != None and isDict(multiIndex(spec_doc, path)): target = multiIndex(spec_doc, path) if value == None: return key in target.keys() else: return target[key] == value else: target = self.spec return key in target.keys() and ( target[key] == value if value != None else True) except KeyError: self.logger.warn("Key error when requesting path " + \ str(path) + " for app") return False def __init__(self, filename=None): # Parse command line arguments self.arg_parser = argparse.ArgumentParser() self.arg_parser.add_argument("--inittest", help="Initialize app and quit", action="store_true", default=False) self.arg_parser.add_argument("--loglevel", help="DEBUG, INFO or WARN", default="DEBUG") self.arg_parser.add_argument("--driver", action="store", dest="driver", default="gl", help="Select display driver: gl, curses, slang") self.args = self.arg_parser.parse_args() self.logger = logging.getLogger() self.logger.setLevel(self.args.loglevel) # Initialize Spec/State self.initialize_app_spec(filename) logging.debug("USING DRIVER: " + self.args.driver) if self.args.driver: self.display = TartanDisplay(self, self.spec, self.args.driver) else: self.display = TartanDisplay(self, self.spec) self.local_event_dispatch = LocalEventDispatch(self) self.digest_rate = 1000 #ms self.keypress_queue = [] self.event_thing = Event() self.quit = False self.styles = [] # Keypress hooks self.keypress_hooks = [] # Parse spec self.load_keypress_hooks() self.load_styles() # Initialize network connection IF specified if self.specifies("network", True, ["app"]): self.remote_messages = [] self.remote_dispatch = RemoteEventDispatch(self) self.remote_dispatch.init_consume() def process_style(self, style): """ Given a hash representing a style, convert to a format usable by the engine, i.e. convert color names to caca values """ self.logger.debug("Loading App Style " + style["name"]) color_mapped_style = { "name": style["name"], "fgColor": App.defaultColorMap[style["fgColor"]], "bgColor": App.defaultColorMap[style["bgColor"]], } if "reverse" in style.keys(): color_mapped_style["reverse"] = style["reverse"] self.logger.debug("Color mapped style:") self.logger.debug(str(color_mapped_style)) return color_mapped_style def load_styles(self): for style in self.spec["styles"]: self.styles.append(self.process_style(style)) self.logger.debug("Final styles for app:") self.logger.debug(str(self.styles)) def load_keypress_hooks(self): for hook in self.spec["app"]["keyHooks"]: self.register_keypress_hook(hook) def initialize_default_app_spec(self): self.logger.info("Initialized default app spec") self.spec = App.defaultAppState.copy() self.logger.debug("default spec: " + str(self.spec)) def initialize_app_spec(self, filepath): self.initialize_default_app_spec() if filepath != None: self.logger.info("App loading filepath: " + str(filepath)) loaded_spec = json.load(open(filepath)) self.logger.debug("Loaded spec: " + str(loaded_spec)) self.spec.update(loaded_spec) self.logger.debug("Updated spec: " + str(self.spec)) def register_keypress_hook(self, hook): hook["func"] = getattr(hooks, hook["func"]) def get_widget_hook_for_key(self, key): """ Return the widget and relevant hook for the key """ res = [widget.get_keyhook_for(key) for widget in self.display.widgets] res = filter(lambda x: x != None, res) return res[0] if len(res) > 0 else None def get_focused_widget_hook_for_key(self, key): return self.display.focused_widget.get_focused_keyhook_for(key) def get_focused_widget_catchall_hook(self): return self.display.focused_widget.get_focused_keyhook_for("ALL") def get_hook_for_key(self, key): res = filter(lambda x: x["key"] == key, self.spec["app"]["keyHooks"]) if len(res) > 0: res = res[0] else: res = None return res def process_messages(self, msg_type="remote"): message_collection = self.remote_messages if msg_type == \ "remote" else self.local_event_dispatch.messages for message in message_collection: for widget in self.display.widgets: hook = widget.get_message_hook_for_channel(message["channel"], msg_type=msg_type) if hook: hook["func"](widget, message=message) message_collection.remove(message) def process_keypresses(self): if self.display.display.get_event(caca.EVENT_KEY_PRESS, self.event_thing, self.digest_rate): if self.event_thing.get_type() == caca.EVENT_KEY_PRESS: key = chr(self.event_thing.get_key_ch()) hook = self.get_hook_for_key(key) if hook != None: hook["func"](self) else: hook = self.get_focused_widget_hook_for_key(key) if hook != None: hook["func"](hook["widget"]) # Execute hook for widget else: hook = self.get_widget_hook_for_key(key) if hook != None: # execute the hook hook["func"](hook["widget"]) else: hook = self.get_focused_widget_catchall_hook() if hook != None: hook["func"](hook["widget"], key=key) # TODO: Else run unhandled_input hook key = None # Reset key def run(self): self.display.build_display() if self.args.inittest != True: while self.quit == False: self.display.refresh() self.process_keypresses() if self.specifies("network", True, ["app"]): self.process_messages() self.process_messages(msg_type="local") self.remote_dispatch.check_queue()
def main(): """ Main function. """ events = [] quit = 0 quit_string = ["", "q", "qu", "qui", "quit"] try: cv = Canvas(80, 24) dp = Display(cv) except (CanvasError, DisplayError) as err: sys.stderr.write("%s\n" % err) sys.exit(127) h = cv.get_height() - 1 cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLUE) cv.draw_line(0, 0, cv.get_width() - 1, 0, ' ') cv.draw_line(0, h, cv.get_width() - 1, h, ' ') cv.put_str(0, h, "Type \"quit\" to exit") dp.refresh() while quit < 4: ev = Event() if dp.get_event(caca.EVENT_ANY, ev, -1): if ev.get_type() == caca.EVENT_KEY_PRESS: key = ev.get_key_ch() if key == ord('u') and quit == 1: quit += 1 elif key == ord('i') and quit == 2: quit += 1 elif key == ord('t') and quit == 3: quit += 1 elif key == ord('q'): quit = 1 else: quit = 0 events.append(ev) cv.set_color_ansi(caca.COLOR_LIGHTGRAY, caca.COLOR_BLACK) cv.clear() #print current event cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLUE) cv.draw_line(0, 0, cv.get_width() - 1, 0, ' ') if events: print_event(cv, 0, 0, events[-1]) cv.draw_line(0, h, cv.get_width() - 1, h, ' ') cv.put_str(0, h, "Type \"quit\" to exit: %s" % quit_string[quit]) #print previous events cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLACK) counts = list(range(0, len(events)-1)) counts.reverse() if len(events) > 1: j = 0 for i in counts: if j < h - 1 and events[i].get_type(): print_event(cv, 0, ((len(events) - 1) - i), events[i]) j += 1 dp.refresh()
class LibcacaServer(KinematicServer): def __init__(self, *args, **kwargs): """ """ KinematicServer.__init__(self, *args, **kwargs) self.robots = [ r for (name, r) in self.elements.items() if isinstance(r, Robot) ] self.cv = Canvas() self.dp = Display(self.cv) self.ev = Event() self.quit = False self.width = self.cv.get_width() self.height = self.cv.get_height() self.camera = Camera(self, 640, 480) self.camera.translation = [3.5, 0, 1] self.camera.init() self.fps = -1.0 self.frames = 0 self.last_t = 0 def compute_fps(self): now = time.time() if self.last_t == 0: self.last_t = now return PER = 2.0 if now - self.last_t >= PER: self.fps = self.frames / PER self.frames = 0 self.last_t = now return else: self.frames += 1 def key_cb(self): UP, DOWN, LEFT, RIGHT = 273, 274, 275, 276 if self.dp.get_event(caca.EVENT_KEY_PRESS, self.ev, 0): ch = self.ev.get_key_ch() if ch == ord('q'): self.quit = True elif ch == UP: self.camera.rotate(0, 1) elif ch == DOWN: self.camera.rotate(0, -1) elif ch == LEFT: self.camera.rotate(1, 0) elif ch == RIGHT: self.camera.rotate(-1, 0) def project(self, p): u, v = self.camera.project(p) up, vp = int(u * self.width / self.camera.width), int( (v) * self.height / self.camera.height) return up, self.height - vp def draw_floor(self): lines = [] L = 5 w = 1 N = int(L / w) self.cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLACK) for i in range(-N, N + 1): lines.append([i * w, L, 0.005]) lines.append([i * w, -L, 0.005]) lines.append([L, i * w, 0.005]) lines.append([-L, i * w, 0.005]) for i in range(len(lines) / 2): p1 = lines[2 * i] p2 = lines[2 * i + 1] u1, v1 = self.project(p1) u2, v2 = self.project(p2) self.cv.draw_thin_line(int(u1), int(v1), int(u2), int(v2)) def draw_robot(self, r): self.cv.set_color_ansi(caca.COLOR_GREEN, caca.COLOR_BLACK) for j in r.moving_joint_list: u, v = self.project(j.T[:3, 3]) radius = 0 if j.parent: up, vp = self.project(j.parent.T[:3, 3]) self.cv.draw_thin_line(int(u), int(v), int(up), int(vp)) self.cv.set_color_ansi(caca.COLOR_RED, caca.COLOR_BLACK) for j in r.moving_joint_list: u, v = self.project(j.T[:3, 3]) self.cv.draw_circle(u, v, radius, '@') def run(self): try: while not self.quit: self.key_cb() self.compute_fps() self.cv.clear() self.draw_floor() for r in self.robots: self.draw_robot(r) self.cv.put_str(0, 0, "%3.1f FPS" % self.fps) self.dp.refresh() del self.cv, self.dp, self.ev except: del self.cv, self.dp, self.ev
def main(): """ Main function. """ events = [] quit = 0 quit_string = ["", "q", "qu", "qui", "quit"] try: cv = Canvas(80, 24) dp = Display(cv) except (CanvasError, DisplayError) as err: sys.stderr.write("%s\n" % err) sys.exit(127) h = cv.get_height() - 1 cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLUE) cv.draw_line(0, 0, cv.get_width() - 1, 0, ' ') cv.draw_line(0, h, cv.get_width() - 1, h, ' ') cv.put_str(0, h, "Type \"quit\" to exit") dp.refresh() while quit < 4: ev = Event() if dp.get_event(caca.EVENT_ANY, ev, -1): if ev.get_type() == caca.EVENT_KEY_PRESS: key = ev.get_key_ch() if key == ord('u') and quit == 1: quit += 1 elif key == ord('i') and quit == 2: quit += 1 elif key == ord('t') and quit == 3: quit += 1 elif key == ord('q'): quit = 1 else: quit = 0 events.append(ev) cv.set_color_ansi(caca.COLOR_LIGHTGRAY, caca.COLOR_BLACK) cv.clear() #print current event cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLUE) cv.draw_line(0, 0, cv.get_width() - 1, 0, ' ') if events: print_event(cv, 0, 0, events[-1]) cv.draw_line(0, h, cv.get_width() - 1, h, ' ') cv.put_str(0, h, "Type \"quit\" to exit: %s" % quit_string[quit]) #print previous events cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLACK) counts = list(range(0, len(events) - 1)) counts.reverse() if len(events) > 1: j = 0 for i in counts: if j < h - 1 and events[i].get_type(): print_event(cv, 0, ((len(events) - 1) - i), events[i]) j += 1 dp.refresh()
class LibcacaServer(KinematicServer): def __init__(self, *args, **kwargs): """ """ KinematicServer.__init__(self, *args, **kwargs) self.robots = [r for (name, r) in self.elements.items() if isinstance(r, Robot)] self.cv = Canvas() self.dp = Display(self.cv) self.ev = Event() self.quit = False self.width = self.cv.get_width() self.height = self.cv.get_height() self.camera = Camera(self, 640 , 480) self.camera.translation = [3.5, 0, 1] self.camera.init() self.fps = -1.0 self.frames = 0 self.last_t = 0 def compute_fps(self): now = time.time() if self.last_t == 0: self.last_t = now return PER = 2.0 if now - self.last_t >= PER: self.fps = self.frames / PER self.frames = 0 self.last_t = now return else: self.frames += 1 def key_cb(self): UP, DOWN, LEFT, RIGHT = 273,274,275,276 if self.dp.get_event(caca.EVENT_KEY_PRESS, self.ev, 0): ch = self.ev.get_key_ch() if ch == ord('q'): self.quit = True elif ch == UP: self.camera.rotate(0, 1) elif ch == DOWN: self.camera.rotate(0, -1) elif ch == LEFT: self.camera.rotate(1, 0) elif ch == RIGHT: self.camera.rotate(-1, 0) def project(self, p): u, v = self.camera.project(p) up, vp = int(u*self.width/self.camera.width), int((v)*self.height/self.camera.height) return up, self.height - vp def draw_floor(self): lines=[] L = 5 w = 1 N = int(L/w) self.cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLACK) for i in range(-N,N+1): lines.append([i*w, L,0.005]) lines.append([i*w,-L,0.005]) lines.append([L , i*w,0.005]) lines.append([-L , i*w,0.005] ) for i in range(len(lines)/2): p1 = lines[2*i] p2 = lines[2*i+1] u1, v1 = self.project(p1) u2, v2 = self.project(p2) self.cv.draw_thin_line(int(u1), int(v1), int(u2), int(v2)) def draw_robot(self, r): self.cv.set_color_ansi(caca.COLOR_GREEN, caca.COLOR_BLACK) for j in r.moving_joint_list: u, v = self.project(j.T[:3,3]) radius = 0 if j.parent: up, vp = self.project(j.parent.T[:3,3]) self.cv.draw_thin_line(int(u), int(v), int(up), int(vp)) self.cv.set_color_ansi(caca.COLOR_RED, caca.COLOR_BLACK) for j in r.moving_joint_list: u, v = self.project(j.T[:3,3]) self.cv.draw_circle(u, v, radius, '@') def run(self): try: while not self.quit: self.key_cb() self.compute_fps() self.cv.clear() self.draw_floor() for r in self.robots: self.draw_robot(r) self.cv.put_str(0,0,"%3.1f FPS"%self.fps) self.dp.refresh() del self.cv, self.dp, self.ev except: del self.cv, self.dp, self.ev