Download raw (18.2 KB)
# -*- coding: utf-8 -*-
import random
import math
import json
from chiplotle import *
from chiplotle.hpgl import commands
import re
from configureMemory import configureMemory
from instantiate_plotter_on_port import instantiate_plotter_on_port
############################################
## IMPORT THE FUNCTIONS TO DRAW EACH CELL ##
############################################
from shapes.chlorella import chlorella_cell
from shapes.dunaliella_salina import duna_cell
from shapes.nannochloropsis import nanno_cell
from shapes.p_cruentum import p_cell
from shapes.spirulina import spirulina_cell
from shapes.haematococcus import haema_cell
#######################################
## VARIOUS FUNCTIONS TO PROCESS TEXT ##
#######################################
def mm(amount):
return amount * 40
def cm(amount):
return amount * 400
def units_to_cm(amount):
return amount / 400.0
# Doubling effect of the header
def title(text, char_width, char_height, linespace):
text = text.upper().replace(' ', '\r\n')
title = shapes.group([])
for i in range(4):
title_text = shapes.label(text, charwidth=units_to_cm(char_width), charheight=units_to_cm(char_height), charspace=0, linespace=linespace)
transforms.center_at(title_text, (i * mm(.8), 0))
title.append(title_text)
return title
# Calculate linelength
def line_length(txt, char_width):
return len(txt) * char_width * 1.3
# Make a plotter label instrucion for the given text line
def make_label (text, char_width, char_height, offset, charspace=None, linespace=None):
line = shapes.label(text, units_to_cm(char_width), units_to_cm(char_height), charspace, linespace)
transforms.offset(line, (0, -offset))
return line
# Transform text lines into plotter labels
def make_labels (lines, charwidth, charheight, charspace=None, linespace=None, offset=None):
text = '{}{}'.format(chr(10), chr(13)).join(lines)
label = shapes.label(text, charwidth=units_to_cm(charwidth), charheight=units_to_cm(charheight), charspace=charspace, linespace=linespace)
if offset:
transforms.offset(label, offset)
return label
# # enter word, come back to start + half, insert HT, reinsert word
# # insert 2 spaces, HT, continue
# def add_style_instructions (word, bold=False):
# if bold:
# print('BOLD:::{}:::'.format(word))
# return '{word}{backfeed}{ht}{word}{ht}'.format(word=word, backfeed=(len(word)-1)*chr(8), ht=chr(9))
# return word
# Returns a tuple with the word, and a boolean whether it's bold
# if it's bold also return tokens before and after bold sign
# *word*, → ('word,', True)
def add_style_annotation (word):
m = re.match(r'^(\W?)\*(.+)\*(\W?)$', word)
if m:
return ('{}{}{}'.format(m.group(1), m.group(2), m.group(3)), True)
else:
return (word, False)
# Changes boldness across multiple word to bold per word.
# *one two three* *one* *two* *three*
def bold_per_word (m):
return re.sub(r'(\s+)', '*\\1*', m.group(0))
def tokenize_text (text):
text = re.sub(r'\*[^\*]+\*', bold_per_word, text.replace('\r\n', '\n').replace('\n', ' __newline__ '))
return [add_style_annotation(w) for w in re.split(r'\s+', text)]
def bufferLength (annotated_words, separator=" ", prefix="", char_width=1):
if annotated_words:
separator_length = line_length(separator, char_width)
length = line_length(prefix, char_width)
# Loop through words, if they're bold count an extra char
for word, bold in annotated_words:
length += line_length(word, char_width)
if bold:
length += line_length(word[-1], char_width)
# add spaces
length += (len(annotated_words) - 1) * separator_length
return length
else:
return 0
def makeLines (text, width, char_width, prefix = ""):
lines = []
buff = []
separator = " "
# print(text, tokenize_text(text))
for token in tokenize_text(text):
# print(token)
length = bufferLength(buff, separator, prefix, char_width)
word_length = bufferLength([token], separator, separator, char_width)
if (width and length + word_length > width) or token[0] == '__newline__':
lines.append(buff)
buff = [token] if token[0] <> '__newline__' else []
else:
if '°' in token[0]:
buff.append((token[0].replace("°", chr(14) + chr(122) + chr(15)), token[1]))
else:
buff.append(token)
if buff:
lines.append(buff)
normal = [prefix + separator.join([word for word, _ in line]) for line in lines]
bold = [prefix + separator.join([word if bold else len(word) * ' ' for word, bold in line]) for line in lines]
return (normal, bold)
def body(input_text, width, char_width, char_height, line_height, charspace=-.1, linespace=None):
linesRegular, linesBold = makeLines(input_text, width, char_width)
return Group ([
make_labels(linesRegular, charwidth=char_width, charheight=char_height, charspace=charspace, linespace=linespace),
make_labels(linesBold, charwidth=char_width, charheight=char_height, charspace=charspace, linespace=linespace, offset=(mm(.5), 0))
] )
#######################
## DEFINING THE GRID ##
#######################
def draw_grid (plotter):
from chiplotle.geometry.shapes.line import line
plotter.set_origin_bottom_left()
width = plotter.margins.hard.width
height = plotter.margins.hard.height
left = 0
right = width
top = height
bottom = 0
x_unit = width / 72.0
y_unit = height / 48.0
def x(input):
return input * x_unit
def y(input):
return input * y_unit
g = Group()
## add horizontal lines
for i in range(48):
g.append(line((left, y(i)), (right, y(i))))
## add vertical lines
for i in range(72):
g.append(line((x(i), top), (x(i), bottom)))
plotter.select_pen(2)
plotter.write(g)
plotter.select_pen(0)
def draw (plotter, pen=1, speed=15, force=3):
plotter.set_origin_bottom_left()
width = plotter.margins.hard.width
height = plotter.margins.hard.height
print(width, height)
plotter.select_pen(pen)
plotter.write(commands.FS(force))
plotter.write(commands.VS(speed))
left = 0
right = width
top = height
bottom = 0
x_unit = width / 72.0
y_unit = height / 48.0
def x(input):
return input * x_unit
def y(input):
return input * y_unit
def rx(input):
# A relative X value. Made for positioning items on a page(section of the whole poster). The base_x is defined at the beginning of each page.
return (base_x + input) * x_unit
def ry(input):
# A relative y value. Made for positioning items on a page(section of the whole poster). The base_y is defined at the beginning of each page.
return (base_y + input) * y_unit
plotter.select_pen(1)
#########################
## DEFINING TEXT SIZES ##
#########################
title_char_width = x(0.8)
title_char_height = y(2)
title_line_height = ((y(3))/(y(4)))-1
big_char_width = x(0.25)
big_char_height = y(0.42)
big_char_line_height = y(2.0 / 3.0)
body_char_width = x(0.15)
body_char_height = y(0.25 )
body_char_line_height = y(0.5)
cell_size = int(x(1.8))
#########################################
## IMPORTING THE TEXT FROM A JSON FILE ##
#########################################
with open("formatted_content.json", "r") as read_file:
content = json.load(read_file)
#######################
## DRAWING THE PAGES ##
#######################
plotter.write(commands.CA(5)) #Enables alternative characterset so it is possible to draw the degree sign
plotter.select_pen(1)
# ############
# ## PAGE 1 ##
# ############
# Arthrospira
# ############
base_x = 0
base_y = 0
TEXT_POS_VERTICAL = 10
PIGMENT_X = 9
title_input = content[0]["title"].encode("utf-8")
biomass_input = content[0]["biomass"].encode("utf-8")
pigment_input = content[0]["pigment"].encode("utf-8")
description_input = content[0]["description"].encode("utf-8")
properties_input = content[0]["properties"].encode("utf-8")
title_position = (rx(4), ry(21) - ry(2))
biomass_position = (rx(1), ry(19) - ry(2))
pigment_position = (rx(PIGMENT_X), ry(15) - ry(2))
description_position = (rx(1), ry(TEXT_POS_VERTICAL) - ry(2))
properties_position = (rx(14), ry(TEXT_POS_VERTICAL) - ry(2))
shape_position = (rx(22), ry(2) - ry(1))
title_plot = title(title_input, title_char_width, title_char_height, title_line_height)
transforms.offset(title_plot, title_position)
biomass_plot = body(biomass_input, x(18), big_char_width, big_char_height, big_char_line_height)
transforms.offset(biomass_plot, biomass_position)
pigment_plot = body(pigment_input, x(10), big_char_width, big_char_height, big_char_line_height)
transforms.offset(pigment_plot, pigment_position)
description_plot = body(description_input, x(11), body_char_width, body_char_height, body_char_line_height)
transforms.offset(description_plot, description_position)
properties_plot = body(properties_input, x(8), body_char_width, body_char_height, body_char_line_height)
transforms.offset(properties_plot, properties_position)
small_shape = spirulina_cell(random.randint(3,6), random.uniform(0.1, 0.3), random.randint(int(x(1.5)), int(x(2))))
transforms.center_at(small_shape, shape_position)
plotter.write([title_plot, biomass_plot, pigment_plot, description_plot, properties_plot, small_shape])
# ############
# ## PAGE 2 ##
# ############
# Chlorella
# ############
base_x = 24
base_y = 0
title_input = content[1]["title"].encode("utf-8")
biomass_input = content[1]["biomass"].encode("utf-8")
pigment_input = content[1]["pigment"].encode("utf-8")
description_input = content[1]["description"].encode("utf-8")
properties_input = content[1]["properties"].encode("utf-8")
title_position = (rx(4), ry(21) - ry(2))
biomass_position = (rx(1), ry(19) - ry(2))
pigment_position = (rx(PIGMENT_X), ry(15) - ry(2))
description_position = (rx(1), ry(TEXT_POS_VERTICAL) - ry(2))
properties_position = (rx(14), ry(TEXT_POS_VERTICAL) - ry(2))
shape_position = (rx(22), ry(2) - ry(1))
title_plot = title(title_input, title_char_width, title_char_height, title_line_height)
transforms.offset(title_plot, title_position)
biomass_plot = body(biomass_input, x(18), big_char_width, big_char_height, big_char_line_height)
transforms.offset(biomass_plot, biomass_position)
pigment_plot = body(pigment_input, x(10), big_char_width, big_char_height, big_char_line_height)
transforms.offset(pigment_plot, pigment_position)
description_plot = body(description_input, x(11), body_char_width, body_char_height, body_char_line_height)
transforms.offset(description_plot, description_position)
properties_plot = body(properties_input, x(7), body_char_width, body_char_height, body_char_line_height)
transforms.offset(properties_plot, properties_position)
small_shape = chlorella_cell(cell_size, 3)
transforms.center_at(small_shape, shape_position)
plotter.write([title_plot, biomass_plot, pigment_plot, description_plot, properties_plot, small_shape])
# ############
# ## PAGE 3 ##
# ############
# Dunaliella salina
# ##########
base_x = 48
base_y = 0
title_input = content[2]["title"].encode("utf-8")
pigment_input = content[2]["pigment"].encode("utf-8")
description_input = content[2]["description"].encode("utf-8")
properties_input = content[2]["properties"].encode("utf-8")
title_position = (rx(4), ry(21) - ry(2))
pigment_position = (rx(PIGMENT_X), ry(16) - ry(2))
description_position = (rx(1), ry(TEXT_POS_VERTICAL) - ry(2))
properties_position = (rx(14), ry(TEXT_POS_VERTICAL) - ry(2))
shape_position = (rx(22), ry(2) - ry(1))
title_plot = title(title_input, title_char_width, title_char_height, title_line_height)
transforms.offset(title_plot, title_position)
pigment_plot = body(pigment_input, x(10), big_char_width, big_char_height, big_char_line_height)
transforms.offset(pigment_plot, pigment_position)
description_plot = body(description_input, x(11), body_char_width, body_char_height, body_char_line_height)
transforms.offset(description_plot, description_position)
properties_plot = body(properties_input, x(8), body_char_width, body_char_height, body_char_line_height)
transforms.offset(properties_plot, properties_position)
small_shape = duna_cell(cell_size, 4)
transforms.center_at(small_shape, shape_position)
plotter.write([title_plot, pigment_plot, description_plot, properties_plot, small_shape])
# ############
# ## PAGE 4 ##
# ############
# Porphyridium purpureum
# ############
base_x = 0
base_y = 24
title_input = content[3]["title"].encode("utf-8")
pigment_input = content[3]["pigment"].encode("utf-8")
description_input = content[3]["description"].encode("utf-8")
properties_input = content[3]["properties"].encode("utf-8")
title_position = (rx(4), ry(21))
pigment_position = (rx(PIGMENT_X), ry(16))
description_position = (rx(1), ry(TEXT_POS_VERTICAL))
properties_position = (rx(14), ry(TEXT_POS_VERTICAL))
shape_position = (rx(22), ry(2))
title_plot = title(title_input, title_char_width, title_char_height, title_line_height)
transforms.offset(title_plot, title_position)
pigment_plot = body(pigment_input, x(10), big_char_width, big_char_height, big_char_line_height)
transforms.offset(pigment_plot, pigment_position)
description_plot = body(description_input, x(11), body_char_width, body_char_height, body_char_line_height)
transforms.offset(description_plot, description_position)
properties_plot = body(properties_input, x(10), body_char_width, body_char_height, body_char_line_height)
transforms.offset(properties_plot, properties_position)
small_shape = p_cell(int(cell_size * 0.75), cell_size)
transforms.center_at(small_shape, shape_position)
plotter.write([title_plot, pigment_plot, description_plot, properties_plot, small_shape])
# ############
# ## PAGE 5 ##
# ############
# Nannochloropsis
# ##########
base_x = 24
base_y = 24
title_input = content[4]["title"].encode("utf-8")
biomass_input = content[4]["biomass"].encode("utf-8")
description_input = content[4]["description"].encode("utf-8")
properties_input = content[4]["properties"].encode("utf-8")
title_position = (rx(4), ry(21))
biomass_position = (rx(1), ry(19))
description_position = (rx(1), ry(TEXT_POS_VERTICAL))
properties_position = (rx(14), ry(TEXT_POS_VERTICAL))
shape_position = (rx(22), ry(2))
title_plot = title(title_input, title_char_width, title_char_height, title_line_height)
transforms.offset(title_plot, title_position)
biomass_plot = body(biomass_input, x(19), big_char_width, big_char_height, big_char_line_height)
transforms.offset(biomass_plot, biomass_position)
description_plot = body(description_input, x(11), body_char_width, body_char_height, body_char_line_height)
transforms.offset(description_plot, description_position)
properties_plot = body(properties_input, x(7), body_char_width, body_char_height, body_char_line_height)
transforms.offset(properties_plot, properties_position)
small_shape = nanno_cell(cell_size, 4)
transforms.center_at(small_shape, shape_position)
plotter.write([title_plot, biomass_plot, description_plot, properties_plot, small_shape])
# ############
# ## PAGE 6 ##
# ############
# HAEMATOCOCCUS PLUVIALIS
# ############
base_x = 48
base_y = 24
title_input = content[5]["title"].encode("utf-8")
biomass_input = content[5]["biomass"].encode("utf-8")
pigment_input = content[5]["pigment"].encode("utf-8")
description_input = content[5]["description"].encode("utf-8")
properties_input = content[5]["properties"].encode("utf-8")
title_position = (rx(4), ry(21))
biomass_position = (rx(1), ry(16))
pigment_position = (rx(PIGMENT_X), ry(13))
description_position = (rx(1), ry(TEXT_POS_VERTICAL))
properties_position = (rx(14), ry(TEXT_POS_VERTICAL))
shape_position = (rx(22), ry(2))
title_plot = title(title_input, title_char_width, title_char_height, title_line_height)
transforms.offset(title_plot, title_position)
biomass_plot = body(biomass_input, x(20), big_char_width, big_char_height, big_char_line_height)
transforms.offset(biomass_plot, biomass_position)
pigment_plot = body(pigment_input, x(10), big_char_width, big_char_height, big_char_line_height)
transforms.offset(pigment_plot, pigment_position)
description_plot = body(description_input, x(11), body_char_width, body_char_height, body_char_line_height)
transforms.offset(description_plot, description_position)
properties_plot = body(properties_input, x(7.5), body_char_width, body_char_height, body_char_line_height)
transforms.offset(properties_plot, properties_position)
small_shape = haema_cell(cell_size)
transforms.center_at(small_shape, shape_position)
plotter.write([title_plot, biomass_plot, pigment_plot, description_plot, properties_plot, small_shape])
plotter.select_pen(0)
if __name__ == '__main__':
############
## FINISH ##
############
DRAW_GRID = False
#################################
## VIRTUAL OR HARDWARE PLOTTER ##
#################################
VIRTUAL = False
if VIRTUAL:
from chiplotle.tools.plottertools import instantiate_virtual_plotter
plotter = instantiate_virtual_plotter(left_bottom = Coordinate(-17300,-11880), right_top = Coordinate(16340,11880), type="DPX-3300")
plotter.margins.hard.draw_outline()
plotter.select_pen(1)
draw(plotter)
else:
# plotter = instantiate_plotters()[0]
plotter = instantiate_plotter_on_port('/dev/ttyUSB0')
configureMemory(plotter, 9678, 2048, 0, 0, 0, 1024)
plotter.rotate(0)
while(True):
draw(plotter)
next = str(raw_input('Plot next?'))
if DRAW_GRID:
draw_grid(plotter)
if VIRTUAL:
io.view(plotter)