Class: Auto12Epl

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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, barcode_human_font = 1)
  @element_font = element_font
  @barcode_human_font = barcode_human_font
end

Instance Attribute Details

#barcode_human_fontObject

Returns the value of attribute barcode_human_font.



17
18
19
# File 'lib/auto12epl.rb', line 17

def barcode_human_font
  @barcode_human_font
end

#element_fontObject

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 generate_barcode_element(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 = 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 = L_MARGIN_BARCODE_W_STAT
  end
  barcode_human_text = "#{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)
  barcode_human_element = generate_ascii_element(to_dots(l_margin_barcode), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_BARCODE), 0, @barcode_human_font, false, barcode_human_text)
  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)
  barcode_element = generate_barcode_element(to_dots(l_margin_barcode), 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#{barcode_element}\n#{barcode_human_element}\n#{collector_element}\n#{tests_element}\nP3\n"
  else
    "\nN\nR216,0\nZT\nS1\n#{name_element}\n#{pid_dob_age_gender_element}\n#{barcode_element}\n#{barcode_human_element}\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