Class: Auto12Epl
- Inherits:
-
Object
- Object
- Auto12Epl
- Defined in:
- lib/auto12epl.rb
Overview
Generates EPL code that conforms to the Auto12-A standard for specimen labeling
Constant Summary collapse
- DPI =
203
- LABEL_WIDTH_IN =
2.0
- LABEL_HEIGHT_IN =
0.5
- FONT_X_DOTS =
font constants
[8, 10, 12, 14, 32]
- FONT_Y_DOTS =
[12, 16, 20, 24, 24]
- FONT_PAD_DOTS =
2
- HEIGHT_MARGIN =
element heights
0.031
- HEIGHT_ELEMENT =
0.1
- HEIGHT_ELEMENT_SPACE =
0.01
- HEIGHT_PID =
0.1
- HEIGHT_BARCODE =
0.200
- HEIGHT_BARCODE_HUMAN =
0.050
- WIDTH_ELEMENT =
element widths
1.94
- WIDTH_BARCODE =
1.395
- WIDTH_BARCODE_HUMAN =
1.688
- L_MARGIN =
margins
0.031
- L_MARGIN_BARCODE =
0.25
- L_MARGIN_BARCODE_W_STAT =
stat locations
0.200
- L_MARGIN_W_STAT =
0.150
- STAT_WIDTH_ELEMENT =
1.78
- STAT_WIDTH_BARCODE =
1.150
- STAT_WIDTH_BARCODE_HUMAN =
1.400
- BARCODE_TYPE =
constants for generated EPL code
'1A'
- BARCODE_NARROW_WIDTH =
'2'
- BARCODE_WIDE_WIDTH =
'2'
- BARCODE_ROTATION =
'0'
- BARCODE_IS_HUMAN_READABLE =
'N'
- ASCII_HORZ_MULT =
1
- ASCII_VERT_MULT =
1
Instance Attribute Summary collapse
-
#barcode_human_font ⇒ Object
Returns the value of attribute barcode_human_font.
-
#element_font ⇒ Object
Returns the value of attribute element_font.
Instance Method Summary collapse
- #concatName(last_name, first_name, middle_initial) ⇒ Object
-
#full_justify(pid, dag, font, length) ⇒ Object
Add spaces between the NPID and the dob/age/gender so that line is fully justified.
-
#generate_ascii_element(x, y, rotation, font, is_reverse, text) ⇒ Object
generate ascii EPL.
-
#generate_barcode_element(x, y, height, schema_track) ⇒ Object
generate barcode EPL.
-
#generate_epl(last_name, first_name, middle_initial, pid, dob, age, gender, col_date_time, col_name, tests, stat, acc_num, schema_track) ⇒ Object
The main function to generate the EPL.
-
#initialize(element_font = 1, barcode_human_font = 1) ⇒ Auto12Epl
constructor
A new instance of Auto12Epl.
-
#max_characters(font, length) ⇒ Object
Calculate the number of characters that will fit in a given length.
-
#pad_stat_w_space(stat) ⇒ Object
Add spaces before and after the stat text so that black bars appear across the left edge of label.
-
#to_dots(inches) ⇒ Object
convert inches to number of dots using DPI.
-
#truncate_name(last_name, first_name, middle_initial, is_stat) ⇒ Object
Use basic truncation rule to truncate the name element i.e., if > maxCharacters cutoff and trail with +.
Constructor Details
#initialize(element_font = 1, barcode_human_font = 1) ⇒ Auto12Epl
Returns a new instance of Auto12Epl.
62 63 64 65 |
# File 'lib/auto12epl.rb', line 62 def initialize(element_font = 1, = 1) @element_font = element_font @barcode_human_font = end |
Instance Attribute Details
#barcode_human_font ⇒ Object
Returns the value of attribute barcode_human_font.
17 18 19 |
# File 'lib/auto12epl.rb', line 17 def @barcode_human_font end |
#element_font ⇒ Object
Returns the value of attribute element_font.
16 17 18 |
# File 'lib/auto12epl.rb', line 16 def element_font @element_font end |
Instance Method Details
#concatName(last_name, first_name, middle_initial) ⇒ Object
101 102 103 |
# File 'lib/auto12epl.rb', line 101 def concatName(last_name, first_name, middle_initial) last_name + ', ' + first_name + (middle_initial == nil ? '' : ' ' + middle_initial) end |
#full_justify(pid, dag, font, length) ⇒ Object
Add spaces between the NPID and the dob/age/gender so that line is fully justified
155 156 157 158 159 160 161 162 163 |
# File 'lib/auto12epl.rb', line 155 def full_justify(pid, dag, font, length) max_char = max_characters(font, length) spaces_needed = max_char - pid.length - dag.length space = '' spaces_needed.times do space = space + ' ' end pid + space + dag end |
#generate_ascii_element(x, y, rotation, font, is_reverse, text) ⇒ Object
generate ascii EPL
171 172 173 |
# File 'lib/auto12epl.rb', line 171 def generate_ascii_element(x, y, rotation, font, is_reverse, text) "A#{x.to_s},#{y.to_s},#{rotation.to_s},#{font.to_s},#{ASCII_HORZ_MULT},#{ASCII_VERT_MULT},#{is_reverse ? 'R' : 'N'},\"#{text}\"" end |
#generate_barcode_element(x, y, height, schema_track) ⇒ Object
generate barcode EPL
176 177 178 179 |
# File 'lib/auto12epl.rb', line 176 def (x, y, height, schema_track) schema_track = schema_track.gsub("-", "").strip "B#{x.to_s},#{y.to_s},#{BARCODE_ROTATION},#{BARCODE_TYPE},#{BARCODE_NARROW_WIDTH},#{BARCODE_WIDE_WIDTH},#{height.to_s},#{BARCODE_IS_HUMAN_READABLE},\"#{schema_track}\"" end |
#generate_epl(last_name, first_name, middle_initial, pid, dob, age, gender, col_date_time, col_name, tests, stat, acc_num, schema_track) ⇒ Object
The main function to generate the EPL
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/auto12epl.rb', line 106 def generate_epl(last_name, first_name, middle_initial, pid, dob, age, gender, col_date_time, col_name, tests, stat, acc_num, schema_track) # format text and set margin if stat == nil name_text = truncate_name(last_name, first_name, middle_initial, false) pid_dob_age_gender_text = full_justify(pid, dob + ' ' + age + ' ' + gender, @element_font, WIDTH_ELEMENT) l_margin = L_MARGIN = L_MARGIN_BARCODE else name_text = truncate_name(last_name, first_name, middle_initial, true) pid_dob_age_gender_text = full_justify(pid, dob + ' ' + age + ' ' + gender, @element_font, STAT_WIDTH_ELEMENT) stat_element_text = pad_stat_w_space(stat) l_margin = L_MARGIN_W_STAT = L_MARGIN_BARCODE_W_STAT end = "#{acc_num} * #{schema_track.gsub(/\-/i, '')}" collector_element_text = "Col: #{col_date_time} #{col_name}" tests_element_text = tests # generate EPL statements name_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN), 0, @element_font, false, name_text) pid_dob_age_gender_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE), 0, @element_font, false, pid_dob_age_gender_text) = generate_ascii_element(to_dots(), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_BARCODE), 0, @barcode_human_font, false, ) collector_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_BARCODE + HEIGHT_BARCODE_HUMAN + HEIGHT_ELEMENT_SPACE), 0, @element_font, false, collector_element_text) tests_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_BARCODE + HEIGHT_BARCODE_HUMAN + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE), 0, @element_font, false, tests_element_text) = (to_dots(), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE), to_dots(HEIGHT_BARCODE)-4, schema_track) stat_element = generate_ascii_element(to_dots(L_MARGIN)+FONT_Y_DOTS.at(@element_font - 1)+FONT_PAD_DOTS, to_dots(HEIGHT_MARGIN), 1, @element_font, true, stat_element_text) # combine EPL statements if stat == nil "\nN\nR216,0\nZT\nS1\n#{name_element}\n#{pid_dob_age_gender_element}\n#{}\n#{}\n#{collector_element}\n#{tests_element}\nP3\n" else "\nN\nR216,0\nZT\nS1\n#{name_element}\n#{pid_dob_age_gender_element}\n#{}\n#{}\n#{collector_element}\n#{tests_element}\n#{stat_element}\nP3\n" end end |
#max_characters(font, length) ⇒ Object
Calculate the number of characters that will fit in a given length
68 69 70 71 72 73 74 75 |
# File 'lib/auto12epl.rb', line 68 def max_characters(font, length) dots_per_char = FONT_X_DOTS.at(font-1) + FONT_PAD_DOTS num_char = ( (length * DPI) / dots_per_char).round_down num_char.to_int end |
#pad_stat_w_space(stat) ⇒ Object
Add spaces before and after the stat text so that black bars appear across the left edge of label
144 145 146 147 148 149 150 151 152 |
# File 'lib/auto12epl.rb', line 144 def pad_stat_w_space(stat) num_char = max_characters(@element_font, LABEL_HEIGHT_IN) spaces_needed = (num_char - stat.length) / 1 space = '' spaces_needed.times do space = space + ' ' end space + stat + space end |
#to_dots(inches) ⇒ Object
convert inches to number of dots using DPI
166 167 168 |
# File 'lib/auto12epl.rb', line 166 def to_dots(inches) (inches * DPI).round end |
#truncate_name(last_name, first_name, middle_initial, is_stat) ⇒ Object
Use basic truncation rule to truncate the name element i.e., if > maxCharacters cutoff and trail with +
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/auto12epl.rb', line 78 def truncate_name(last_name, first_name, middle_initial, is_stat) if is_stat name_max_characters = max_characters(@element_font, STAT_WIDTH_ELEMENT) else name_max_characters = max_characters(@element_font, WIDTH_ELEMENT) end if concatName(last_name, first_name, middle_initial).length > name_max_characters # truncate last? if last_name.length > 12 last_name = last_name[0..11] + '+' end # truncate first? if concatName(last_name, first_name, middle_initial).length > name_max_characters && first_name.length > 7 first_name = first_name[0..7] + '+' end end concatName(last_name, first_name, middle_initial) end |