mork 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -3
- data/lib/mork/coord.rb +58 -0
- data/lib/mork/grid.rb +44 -35
- data/lib/mork/grid_const.rb +11 -6
- data/lib/mork/grid_omr.rb +76 -62
- data/lib/mork/magicko.rb +162 -0
- data/lib/mork/mimage.rb +102 -177
- data/lib/mork/npatch.rb +38 -56
- data/lib/mork/sheet_omr.rb +45 -43
- data/lib/mork/sheet_pdf.rb +16 -16
- data/lib/mork/version.rb +1 -1
- data/mork.gemspec +2 -2
- data/mork.sublime-project +9 -0
- data/spec/mork/coord_spec.rb +55 -0
- data/spec/mork/grid_omr_spec.rb +62 -85
- data/spec/mork/grid_spec.rb +7 -7
- data/spec/mork/magicko_spec.rb +46 -0
- data/spec/mork/mimage_spec.rb +30 -20
- data/spec/mork/npatch_spec.rb +46 -39
- data/spec/mork/sheet_omr_spec.rb +82 -40
- data/spec/mork/sheet_pdf_spec.rb +8 -8
- data/spec/samples/angolo.jpg +0 -0
- data/spec/samples/grid.yml +53 -0
- data/spec/samples/info.yml +12 -11
- data/spec/samples/layout.yml +9 -5
- data/spec/samples/lucrezia/border1.pdf +0 -0
- data/spec/samples/lucrezia/border2.pdf +0 -0
- data/spec/samples/lucrezia/bw1.pdf +0 -0
- data/spec/samples/lucrezia/bw2.pdf +0 -0
- data/spec/samples/lucrezia/gray1.pdf +0 -0
- data/spec/samples/lucrezia/gray2.pdf +0 -0
- data/spec/samples/out-1.jpg +0 -0
- data/spec/samples/rm00.jpeg +0 -0
- data/spec/samples/slanted.jpg +0 -0
- data/spec/samples/slanted.yml +54 -0
- data/spec/samples/syst/IMG_20150104_0004.jpg +0 -0
- data/spec/samples/syst/IMG_20150104_0004.txt +4955 -0
- data/spec/samples/syst/IMG_20150104_0009.jpg +0 -0
- data/spec/samples/syst/IMG_20150104_0009.txt +4955 -0
- data/spec/samples/syst/IMG_20150104_0011.jpg +0 -0
- data/spec/samples/syst/IMG_20150104_0011.txt +4955 -0
- data/spec/samples/syst/SCN_0001.jpg +0 -0
- data/spec/samples/syst/SCN_0001.txt +4955 -0
- data/spec/samples/syst/barr0.jpg +0 -0
- data/spec/samples/syst/barr0.txt +4955 -0
- data/spec/samples/syst/barr1.jpg +0 -0
- data/spec/samples/syst/barr1.txt +4955 -0
- data/spec/samples/syst/barr2.jpg +0 -0
- data/spec/samples/syst/barr2.txt +4955 -0
- data/spec/samples/syst/bell0.jpg +0 -0
- data/spec/samples/syst/bell0.txt +4955 -0
- data/spec/samples/syst/bell1.jpg +0 -0
- data/spec/samples/syst/bell1.txt +4955 -0
- data/spec/samples/syst/bell2.jpg +0 -0
- data/spec/samples/syst/bell2.txt +4955 -0
- data/spec/samples/syst/bila0.jpg +0 -0
- data/spec/samples/syst/bila0.txt +4955 -0
- data/spec/samples/syst/bila1.jpg +0 -0
- data/spec/samples/syst/bila1.txt +4955 -0
- data/spec/samples/syst/bila2.jpg +0 -0
- data/spec/samples/syst/bila2.txt +4955 -0
- data/spec/samples/syst/bila3.jpg +0 -0
- data/spec/samples/syst/bila3.txt +4955 -0
- data/spec/samples/syst/bila4.jpg +0 -0
- data/spec/samples/syst/bila4.txt +4955 -0
- data/spec/samples/syst/bone0.jpg +0 -0
- data/spec/samples/syst/bone0.txt +4955 -0
- data/spec/samples/syst/bone1.jpg +0 -0
- data/spec/samples/syst/bone1.txt +4955 -0
- data/spec/samples/syst/bone2.jpg +0 -0
- data/spec/samples/syst/bone2.txt +4955 -0
- data/spec/samples/syst/cost0.jpg +0 -0
- data/spec/samples/syst/cost0.txt +4955 -0
- data/spec/samples/syst/cost1.jpg +0 -0
- data/spec/samples/syst/cost1.txt +4955 -0
- data/spec/samples/syst/cost2.jpg +0 -0
- data/spec/samples/syst/cost2.txt +4955 -0
- data/spec/samples/syst/cost3.jpg +0 -0
- data/spec/samples/syst/cost3.txt +4955 -0
- data/spec/samples/syst/cost4.jpg +0 -0
- data/spec/samples/syst/cost4.txt +4955 -0
- data/spec/samples/syst/dald0.jpg +0 -0
- data/spec/samples/syst/dald0.txt +4955 -0
- data/spec/samples/syst/dald1.jpg +0 -0
- data/spec/samples/syst/dald1.txt +4955 -0
- data/spec/samples/syst/dald2.jpg +0 -0
- data/spec/samples/syst/dald2.txt +4955 -0
- data/spec/samples/syst/dald3.jpg +0 -0
- data/spec/samples/syst/dald3.txt +4955 -0
- data/spec/samples/syst/dald4.jpg +0 -0
- data/spec/samples/syst/dald4.txt +4955 -0
- data/spec/samples/syst/dign0.jpg +0 -0
- data/spec/samples/syst/dign0.txt +4955 -0
- data/spec/samples/syst/dign1.jpg +0 -0
- data/spec/samples/syst/dign1.txt +4955 -0
- data/spec/samples/syst/dign2.jpg +0 -0
- data/spec/samples/syst/dign2.txt +4955 -0
- data/spec/samples/syst/dive0.jpg +0 -0
- data/spec/samples/syst/dive0.txt +4955 -0
- data/spec/samples/syst/dive1.jpg +0 -0
- data/spec/samples/syst/dive1.txt +4955 -0
- data/spec/samples/syst/dive2.jpg +0 -0
- data/spec/samples/syst/dive2.txt +4955 -0
- data/spec/samples/syst/histo.m +42 -0
- data/spec/samples/syst/out0000.jpg +0 -0
- data/spec/samples/syst/out0000.txt +4955 -0
- data/spec/samples/syst/out0001.jpg +0 -0
- data/spec/samples/syst/out0001.txt +4955 -0
- data/spec/samples/syst/out0002.jpg +0 -0
- data/spec/samples/syst/out0002.txt +4955 -0
- data/spec/samples/syst/qzc013.jpg +0 -0
- data/spec/samples/syst/qzc013.txt +4955 -0
- data/spec/samples/syst/sample_gray.jpg +0 -0
- data/spec/samples/syst/sample_gray.txt +4955 -0
- data/spec/samples/syst_grid.yml +53 -0
- data/spec/spec_helper.rb +18 -10
- data/test_reg.m +39 -0
- metadata +105 -8
- data/spec/samples/io.jpg +0 -0
data/spec/mork/npatch_spec.rb
CHANGED
@@ -2,49 +2,45 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Mork
|
4
4
|
describe NPatch do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
expect(
|
5
|
+
describe '#centroid' do
|
6
|
+
it 'computes centers for rm0X' do
|
7
|
+
np = make 'spec/samples/rm01.jpeg', 134, 104
|
8
|
+
expect(np.centroid[0]).to eq 50
|
9
|
+
expect(np.centroid[1]).to eq 60
|
10
|
+
np = make 'spec/samples/rm02.jpeg', 114, 117
|
11
|
+
expect(np.centroid[0]).to eq 69
|
12
|
+
expect(np.centroid[1]).to eq 71
|
13
|
+
np = make 'spec/samples/rm03.jpeg', 124, 105
|
14
|
+
expect(np.centroid[0]).to eq 71
|
15
|
+
expect(np.centroid[1]).to eq 61
|
16
|
+
np = make 'spec/samples/rm04.jpeg', 144, 117
|
17
|
+
expect(np.centroid[0]).to eq 84
|
18
|
+
expect(np.centroid[1]).to eq 52
|
19
|
+
np = make 'spec/samples/rm05.jpeg', 144, 117
|
20
|
+
expect(np.centroid[0]).to eq 84
|
21
|
+
expect(np.centroid[1]).to eq 52
|
10
22
|
end
|
11
23
|
end
|
12
|
-
|
13
|
-
describe '#
|
14
|
-
it '
|
15
|
-
np =
|
16
|
-
expect(np.
|
17
|
-
np = NPatch.new 'spec/samples/rm02.jpeg', 114, 117
|
18
|
-
expect(np.dark_centroid).to eq [69, 71]
|
19
|
-
np = NPatch.new 'spec/samples/rm03.jpeg', 124, 105
|
20
|
-
expect(np.dark_centroid).to eq [71, 61]
|
21
|
-
np = NPatch.new 'spec/samples/rm04.jpeg', 144, 117
|
22
|
-
expect(np.dark_centroid).to eq [84, 52]
|
23
|
-
np = NPatch.new 'spec/samples/rm05.jpeg', 144, 117
|
24
|
-
expect(np.dark_centroid).to eq [84, 52]
|
24
|
+
|
25
|
+
describe '#average' do
|
26
|
+
it 'works' do
|
27
|
+
np = make 'spec/samples/rm00.jpeg', 100, 100
|
28
|
+
expect(np.average Coord.new(100)).to be_within(1).of(234)
|
25
29
|
end
|
26
30
|
end
|
27
|
-
|
28
|
-
describe '#
|
31
|
+
|
32
|
+
describe '#stddev' do
|
29
33
|
it 'works' do
|
30
|
-
|
31
|
-
|
32
|
-
c = {x: 85, y: 10, w: 46, h: 46}
|
33
|
-
puts rm.average c
|
34
|
+
np = make 'spec/samples/rm00.jpeg', 100, 100
|
35
|
+
expect(np.stddev Coord.new(100)).to be_within(1).of(53)
|
34
36
|
end
|
35
37
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
#
|
43
|
-
# it "should return the correct Y" do
|
44
|
-
# x, y = NPatch.new(mim).dark_centroid
|
45
|
-
# y.should == rgm.info["centroid_y"]
|
46
|
-
# end
|
47
|
-
# end
|
38
|
+
|
39
|
+
def make(fname, w, h)
|
40
|
+
b = IO.read("|convert #{fname} gray:-").unpack 'C*'
|
41
|
+
NPatch.new b, w, h
|
42
|
+
end
|
43
|
+
|
48
44
|
end
|
49
45
|
end
|
50
46
|
|
@@ -54,22 +50,33 @@ end
|
|
54
50
|
# x.should be_within(2).of(smp.reg_marks["tl_x"])
|
55
51
|
# y.should be_within(2).of(smp.reg_marks["tl_y"])
|
56
52
|
# end
|
57
|
-
#
|
53
|
+
#
|
58
54
|
# it "returns the actual xy offset of the tr registration mark" do
|
59
55
|
# x, y = mim.dark_centroid_on({x: smp.width-180, y: 0, w: 180, h: 180})
|
60
56
|
# x.should be_within(2).of(smp.reg_marks["tr_x"])
|
61
57
|
# y.should be_within(2).of(smp.reg_marks["tr_y"])
|
62
58
|
# end
|
63
|
-
#
|
59
|
+
#
|
64
60
|
# it "returns the actual xy offset of the br registration mark" do
|
65
61
|
# x, y = mim.dark_centroid_on({x: smp.width-180, y: smp.height-180, w: 180, h: 180})
|
66
62
|
# x.should be_within(2).of(smp.reg_marks["br_x"])
|
67
63
|
# y.should be_within(2).of(smp.reg_marks["br_y"])
|
68
64
|
# end
|
69
|
-
#
|
65
|
+
#
|
70
66
|
# it "returns the actual xy offset of the bl registration mark" do
|
71
67
|
# x, y = mim.dark_centroid_on({x: 0, y: smp.height-180, w: 180, h: 180})
|
72
68
|
# x.should be_within(2).of(smp.reg_marks["bl_x"])
|
73
69
|
# y.should be_within(2).of(smp.reg_marks["bl_y"])
|
74
70
|
# end
|
75
71
|
# end
|
72
|
+
|
73
|
+
# let(:impath) { 'spec/samples/rm01.jpeg' }
|
74
|
+
# let(:imbytes) { IO.read("|convert #{impath} gray:-").unpack 'C*' }
|
75
|
+
# let(:rm) { NPatch.new imbytes, 134, 104 }
|
76
|
+
|
77
|
+
# describe ".new" do
|
78
|
+
# it "should create an NPatch" do
|
79
|
+
# expect(rm).to be_an NPatch
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
|
data/spec/mork/sheet_omr_spec.rb
CHANGED
@@ -3,6 +3,23 @@ require 'fileutils'
|
|
3
3
|
|
4
4
|
module Mork
|
5
5
|
describe SheetOMR do
|
6
|
+
context 'basic object generation' do
|
7
|
+
let(:img) { sample_img 'slanted' }
|
8
|
+
let(:omr) { SheetOMR.new img.filename, [5] * 120, img.grid_file }
|
9
|
+
describe '#new' do
|
10
|
+
it 'raises an error if the provided path is invalid' do
|
11
|
+
expect { SheetOMR.new 'non_existing_file.jpg'}.to raise_error IOError
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'creates a SheetOMR object' do
|
15
|
+
expect(omr).to be_a SheetOMR
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'registers correctly' do
|
19
|
+
expect(omr.valid?).to be_truthy
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
6
23
|
# context 'problematic' do
|
7
24
|
# let(:shinfo) { sample_img 'bianchi' }
|
8
25
|
# let(:sheet) { SheetOMR.new shinfo.filename, shinfo.grid_file }
|
@@ -27,23 +44,40 @@ module Mork
|
|
27
44
|
# end
|
28
45
|
#
|
29
46
|
# end
|
30
|
-
|
47
|
+
#
|
48
|
+
context 'slanted' do
|
49
|
+
let(:sh) { sample_img 'slanted' }
|
50
|
+
let(:sheet) { SheetOMR.new sh.filename, [5]*120, sh.grid_file }
|
51
|
+
|
52
|
+
it 'gets in trouble' do
|
53
|
+
sheet.write_registration 'spec/out/laurout.jpg'
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'gets more in trouble' do
|
57
|
+
sheet.highlight_marked
|
58
|
+
sheet.write 'spec/out/lauraout2.jpg'
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should be valid' do
|
62
|
+
expect(sheet.valid?).to be_truthy
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
31
66
|
context 'highlighting' do
|
32
67
|
# since these specs change the @crop, they must be run in isolation
|
33
68
|
# with the SheetOMR rebuilt each time, even though it is time consuming!
|
34
69
|
let(:shinfo) { sample_img 'sample-gray' }
|
35
|
-
let(:sheet) { SheetOMR.new shinfo.filename, [5]*
|
36
|
-
|
37
|
-
it '
|
38
|
-
sheet.
|
39
|
-
sheet.write_raw 'spec/out/reg_areas.jpg'
|
70
|
+
let(:sheet) { SheetOMR.new shinfo.filename, [5]*120, shinfo.grid_file }
|
71
|
+
|
72
|
+
it 'writes the sheet with registrations highlighted' do
|
73
|
+
sheet.write_registration 'spec/out/sample_gray_registered.jpg'
|
40
74
|
end
|
41
|
-
|
75
|
+
|
42
76
|
it 'highlights all choice cells' do
|
43
77
|
sheet.highlight_all_choices
|
44
78
|
sheet.write 'spec/out/all_highlights.jpg'
|
45
79
|
end
|
46
|
-
|
80
|
+
|
47
81
|
it 'highlights marked cells' do
|
48
82
|
sheet.highlight_marked
|
49
83
|
sheet.write 'spec/out/marked_highlights.jpg'
|
@@ -83,7 +117,7 @@ module Mork
|
|
83
117
|
s.highlight_marked
|
84
118
|
s.write 'spec/out/problem.jpg'
|
85
119
|
end
|
86
|
-
|
120
|
+
|
87
121
|
it 'highlights the barcode' do
|
88
122
|
si = sample_img 'sample-gray'
|
89
123
|
s = SheetOMR.new si.filename, [5]*100, si.grid_file
|
@@ -91,26 +125,26 @@ module Mork
|
|
91
125
|
s.write 'spec/out/code_bits.jpg'
|
92
126
|
end
|
93
127
|
end
|
94
|
-
|
128
|
+
|
95
129
|
context 'marking a nicely printed and scanned sheet' do
|
96
130
|
before(:all) do
|
97
131
|
@shinfo = sample_img 'sample-gray'
|
98
132
|
@sheet = SheetOMR.new @shinfo.filename, [5]*120, @shinfo.grid_file
|
99
133
|
end
|
100
|
-
|
134
|
+
|
101
135
|
describe '#valid?' do
|
102
136
|
it 'returns true' do
|
103
137
|
@sheet.valid?.should be_truthy
|
104
138
|
end
|
105
139
|
end
|
106
|
-
|
140
|
+
|
107
141
|
describe '#marked?' do
|
108
142
|
it 'returns true for some darkened choices' do
|
109
143
|
expect(@sheet.marked?(0,0)).to be_truthy
|
110
144
|
expect(@sheet.marked?(1,1)).to be_truthy
|
111
145
|
expect(@sheet.marked?(2,2)).to be_truthy
|
112
146
|
end
|
113
|
-
|
147
|
+
|
114
148
|
it 'return false for some blank choices' do
|
115
149
|
expect(@sheet.marked?(0,1)).to be_falsy
|
116
150
|
expect(@sheet.marked?(1,0)).to be_falsy
|
@@ -154,13 +188,13 @@ module Mork
|
|
154
188
|
]
|
155
189
|
end
|
156
190
|
end
|
157
|
-
|
191
|
+
|
158
192
|
describe 'barcodes' do
|
159
193
|
it 'should read the bit string as all ones' do
|
160
194
|
@sheet.barcode_string.should == '1111111111111111111111111111111111111111'
|
161
195
|
@sheet.barcode.should == 1099511627775
|
162
196
|
end
|
163
|
-
|
197
|
+
|
164
198
|
it 'should read another bit string' do
|
165
199
|
barcode_string = '0000000000000000000000000010000110100000'
|
166
200
|
s2 = SheetOMR.new('spec/samples/sample02.jpg', [5]*100)
|
@@ -174,18 +208,16 @@ module Mork
|
|
174
208
|
s2.barcode.should == sh.barcode_int
|
175
209
|
end
|
176
210
|
end
|
177
|
-
|
211
|
+
|
178
212
|
end
|
179
|
-
|
213
|
+
|
180
214
|
context 'marking a problematic sheet' do
|
181
215
|
let(:sheet) { SheetOMR.new 'spec/samples/out-1.jpg', [5]*100, 'spec/samples/grid.yml' }
|
182
|
-
|
183
|
-
it 'highlights
|
184
|
-
sheet.
|
185
|
-
sheet.outline [[0,1,2,3,4]] * 100
|
186
|
-
sheet.write 'spec/out/marks_and_outs.jpg'
|
216
|
+
|
217
|
+
it 'highlights the registration' do
|
218
|
+
sheet.write_registration 'spec/out/problematic.jpg'
|
187
219
|
end
|
188
|
-
|
220
|
+
|
189
221
|
it 'highlights the barcode' do
|
190
222
|
sheet.highlight_barcode
|
191
223
|
sheet.write 'spec/out/barcode.jpg'
|
@@ -194,32 +226,38 @@ module Mork
|
|
194
226
|
|
195
227
|
context 'systematic tests' do
|
196
228
|
let(:bila) { 'CCEBEBCEEACCDCABDBEBCADEADDCCCACCACDBBDAECDDABDEEBCEEDCBAAADEEEEDCADEABCBDECCCCDDDCABBECAADADBBEEABA'.split '' }
|
197
|
-
let(:bila0) { SheetOMR.new 'spec/samples/syst/bila0.jpg', [5]*100, 'spec/samples/
|
198
|
-
let(:bila1) { SheetOMR.new 'spec/samples/syst/bila1.jpg', [5]*100, 'spec/samples/
|
199
|
-
let(:bila2) { SheetOMR.new 'spec/samples/syst/bila2.jpg', [5]*100, 'spec/samples/
|
200
|
-
let(:bila3) { SheetOMR.new 'spec/samples/syst/bila3.jpg', [5]*100, 'spec/samples/
|
229
|
+
let(:bila0) { SheetOMR.new 'spec/samples/syst/bila0.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
230
|
+
let(:bila1) { SheetOMR.new 'spec/samples/syst/bila1.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
231
|
+
let(:bila2) { SheetOMR.new 'spec/samples/syst/bila2.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
232
|
+
let(:bila3) { SheetOMR.new 'spec/samples/syst/bila3.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
233
|
+
let(:bila4) { SheetOMR.new 'spec/samples/syst/bila4.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
201
234
|
let(:dald) { 'DDDBECAAADBAEEEAEEEBAACAEDBDECDBDCDCDDEDCCDCDBDCADEEDBCCBEBBAADDCDBBECBBBDEABADABADADBABAEABACBDADDA'.split '' }
|
202
|
-
let(:dald0) { SheetOMR.new 'spec/samples/syst/dald0.jpg', [5]*100, 'spec/samples/
|
203
|
-
let(:dald1) { SheetOMR.new 'spec/samples/syst/dald1.jpg', [5]*100, 'spec/samples/
|
204
|
-
let(:dald2) { SheetOMR.new 'spec/samples/syst/dald2.jpg', [5]*100, 'spec/samples/
|
205
|
-
let(:dald3) { SheetOMR.new 'spec/samples/syst/dald3.jpg', [5]*100, 'spec/samples/
|
235
|
+
let(:dald0) { SheetOMR.new 'spec/samples/syst/dald0.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
236
|
+
let(:dald1) { SheetOMR.new 'spec/samples/syst/dald1.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
237
|
+
let(:dald2) { SheetOMR.new 'spec/samples/syst/dald2.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
238
|
+
let(:dald3) { SheetOMR.new 'spec/samples/syst/dald3.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
239
|
+
let(:dald4) { SheetOMR.new 'spec/samples/syst/dald4.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
206
240
|
let(:cost) { 'ABBDDBAEAEBAADEAAECBCDBBDABABADEECCACBCAEDDAEBEABBCDABECAACEEEBADECBBEAADBBBEABDAEBDEEABBABEBEDDAEEC'.split '' }
|
207
|
-
let(:cost0) { SheetOMR.new 'spec/samples/syst/cost0.jpg', [5]*100, 'spec/samples/
|
208
|
-
let(:cost1) { SheetOMR.new 'spec/samples/syst/cost1.jpg', [5]*100, 'spec/samples/
|
209
|
-
let(:cost2) { SheetOMR.new 'spec/samples/syst/cost2.jpg', [5]*100, 'spec/samples/
|
210
|
-
let(:cost3) { SheetOMR.new 'spec/samples/syst/cost3.jpg', [5]*100, 'spec/samples/
|
241
|
+
let(:cost0) { SheetOMR.new 'spec/samples/syst/cost0.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
242
|
+
let(:cost1) { SheetOMR.new 'spec/samples/syst/cost1.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
243
|
+
let(:cost2) { SheetOMR.new 'spec/samples/syst/cost2.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
244
|
+
let(:cost3) { SheetOMR.new 'spec/samples/syst/cost3.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
245
|
+
let(:cost4) { SheetOMR.new 'spec/samples/syst/cost4.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
211
246
|
let(:bone) { 'CECBBABAECADEDCACBBDEECBADBECDCEDECABCAADCBDEDACAEEDCCADBEDCEBCCBBDCCACDEDDAAECEBDBADCBAAEBAEDABCBDC'.split '' }
|
212
|
-
let(:bone0) { SheetOMR.new 'spec/samples/syst/bone0.jpg', [5]*100, 'spec/samples/
|
213
|
-
let(:bone1) { SheetOMR.new 'spec/samples/syst/bone1.jpg', [5]*100, 'spec/samples/
|
247
|
+
let(:bone0) { SheetOMR.new 'spec/samples/syst/bone0.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
248
|
+
let(:bone1) { SheetOMR.new 'spec/samples/syst/bone1.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
249
|
+
let(:bone2) { SheetOMR.new 'spec/samples/syst/bone2.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
214
250
|
let(:barr) { 'ACECAAADDBCECCCDBEBECDEDAECEDDEEDCDEADDCCBCCCBBEACBCAEDEEDDDABBBBABEBDCEADEEDEBCBADBCEDCDBACEBCBDCDA'.split '' }
|
215
|
-
let(:barr0) { SheetOMR.new 'spec/samples/syst/barr0.jpg', [5]*100, 'spec/samples/
|
216
|
-
let(:barr1) { SheetOMR.new 'spec/samples/syst/barr1.jpg', [5]*100, 'spec/samples/
|
217
|
-
|
251
|
+
let(:barr0) { SheetOMR.new 'spec/samples/syst/barr0.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
252
|
+
let(:barr1) { SheetOMR.new 'spec/samples/syst/barr1.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
253
|
+
let(:barr2) { SheetOMR.new 'spec/samples/syst/barr2.jpg', [5]*100, 'spec/samples/syst_grid.yml'}
|
254
|
+
|
218
255
|
it 'checks bila' do
|
219
256
|
expect(bila0.mark_char_array.flatten).to eq(bila)
|
220
257
|
expect(bila1.mark_char_array.flatten).to eq(bila)
|
221
258
|
expect(bila2.mark_char_array.flatten).to eq(bila)
|
222
259
|
expect(bila3.mark_char_array.flatten).to eq(bila)
|
260
|
+
expect(bila4.mark_char_array.flatten).to eq(bila)
|
223
261
|
end
|
224
262
|
|
225
263
|
it 'checks dald' do
|
@@ -227,6 +265,7 @@ module Mork
|
|
227
265
|
expect(dald1.mark_char_array.flatten).to eq(dald)
|
228
266
|
expect(dald2.mark_char_array.flatten).to eq(dald)
|
229
267
|
expect(dald3.mark_char_array.flatten).to eq(dald)
|
268
|
+
expect(dald4.mark_char_array.flatten).to eq(dald)
|
230
269
|
end
|
231
270
|
|
232
271
|
it 'checks cost' do
|
@@ -234,16 +273,19 @@ module Mork
|
|
234
273
|
expect(cost1.mark_char_array.flatten).to eq(cost)
|
235
274
|
expect(cost2.mark_char_array.flatten).to eq(cost)
|
236
275
|
expect(cost3.mark_char_array.flatten).to eq(cost)
|
276
|
+
expect(cost4.mark_char_array.flatten).to eq(cost)
|
237
277
|
end
|
238
278
|
|
239
279
|
it 'checks bone' do
|
240
280
|
expect(bone0.mark_char_array.flatten).to eq(bone)
|
241
281
|
expect(bone1.mark_char_array.flatten).to eq(bone)
|
282
|
+
expect(bone2.mark_char_array.flatten).to eq(bone)
|
242
283
|
end
|
243
284
|
|
244
285
|
it 'checks barr' do
|
245
286
|
expect(barr0.mark_char_array.flatten).to eq(barr)
|
246
287
|
expect(barr1.mark_char_array.flatten).to eq(barr)
|
288
|
+
expect(barr2.mark_char_array.flatten).to eq(barr)
|
247
289
|
end
|
248
290
|
|
249
291
|
end
|
data/spec/mork/sheet_pdf_spec.rb
CHANGED
@@ -19,16 +19,16 @@ module Mork
|
|
19
19
|
s = SheetPDF.new(content)
|
20
20
|
s.instance_variable_get('@grip').should be_a GridPDF
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
it 'creates a grid by loading the specified file' do
|
24
24
|
s = SheetPDF.new(content, 'spec/samples/layout.yml')
|
25
25
|
s.instance_variable_get('@grip').should be_a GridPDF
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
it 'raises an error with an invalid init parameter' do
|
29
|
-
lambda { SheetPDF.new(content, 2) }.should raise_error
|
29
|
+
lambda { SheetPDF.new(content, 2) }.should raise_error ArgumentError
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
it 'assigns an array to @content' do
|
33
33
|
s = SheetPDF.new(content)
|
34
34
|
s.instance_variable_get('@content').should be_an Array
|
@@ -43,17 +43,17 @@ module Mork
|
|
43
43
|
s = SheetPDF.new(content)
|
44
44
|
s.save('spec/out/sheet.pdf')
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
it 'creates a basic PDF sheet with a code of 15' do
|
48
48
|
s = SheetPDF.new(content.merge({barcode: 15}))
|
49
49
|
s.save('spec/out/sheet16.pdf')
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
it 'creates a basic PDF sheet with a code of 666666666666' do
|
53
53
|
s = SheetPDF.new(content.merge({barcode: 666666666666}))
|
54
54
|
s.save('spec/out/sheet666.pdf')
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
it 'creates a PDF sheet with the maximum possible barcode' do
|
58
58
|
s = SheetPDF.new(content.merge({barcode: 1099511627775}))
|
59
59
|
s.save('spec/out/maxcode.pdf')
|
@@ -62,7 +62,7 @@ module Mork
|
|
62
62
|
it 'creates a PDF sheet with 160 items' do
|
63
63
|
s = SheetPDF.new(content.merge({choices: [5] * 160}), 'spec/samples/grid160.yml')
|
64
64
|
s.save('spec/out/i160.pdf')
|
65
|
-
system 'open spec/out/i160.pdf'
|
65
|
+
# system 'open spec/out/i160.pdf'
|
66
66
|
end
|
67
67
|
|
68
68
|
it 'creates a PDF sheet with unequal choices per item' do
|
Binary file
|
@@ -0,0 +1,53 @@
|
|
1
|
+
page_size:
|
2
|
+
width: 210
|
3
|
+
height: 297
|
4
|
+
reg_marks:
|
5
|
+
margin: 10
|
6
|
+
radius: 2.5
|
7
|
+
offset: 2
|
8
|
+
crop: 12
|
9
|
+
blur: 2
|
10
|
+
dilate: 5
|
11
|
+
header:
|
12
|
+
name:
|
13
|
+
top: 5
|
14
|
+
left: 7.5
|
15
|
+
width: 170
|
16
|
+
size: 14
|
17
|
+
title:
|
18
|
+
top: 15
|
19
|
+
left: 7.5
|
20
|
+
width: 180
|
21
|
+
size: 12
|
22
|
+
code:
|
23
|
+
top: 5
|
24
|
+
left: 165
|
25
|
+
width: 20
|
26
|
+
size: 14
|
27
|
+
signature:
|
28
|
+
top: 30
|
29
|
+
left: 7.5
|
30
|
+
width: 120
|
31
|
+
height: 15
|
32
|
+
size: 7
|
33
|
+
box: true
|
34
|
+
items:
|
35
|
+
top: 55.5
|
36
|
+
left: 10.5
|
37
|
+
columns: 4
|
38
|
+
column_width: 44
|
39
|
+
rows: 30
|
40
|
+
x_spacing: 7
|
41
|
+
y_spacing: 7
|
42
|
+
cell_width: 6
|
43
|
+
cell_height: 5
|
44
|
+
max_cells: 5
|
45
|
+
font_size: 9
|
46
|
+
number_width: 8
|
47
|
+
number_margin: 2
|
48
|
+
barcode:
|
49
|
+
bits: 40
|
50
|
+
left: 15
|
51
|
+
width: 3
|
52
|
+
height: 2.5
|
53
|
+
spacing: 4
|
data/spec/samples/info.yml
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
slanted:
|
2
|
+
filename: spec/samples/slanted.jpg
|
3
|
+
grid-file: spec/samples/slanted.yml
|
4
|
+
width: 1241
|
5
|
+
height: 1754
|
6
|
+
tl: [63, 67]
|
7
|
+
tr: [1172, 68]
|
8
|
+
br: [1169, 1704]
|
9
|
+
bl: [55, 1702]
|
10
|
+
|
1
11
|
code666:
|
2
12
|
filename: spec/samples/sheet666.jpg
|
3
13
|
grid-file: spec/samples/layout.yml
|
@@ -13,15 +23,6 @@ sample-gray:
|
|
13
23
|
width: 1654
|
14
24
|
height: 2339
|
15
25
|
|
16
|
-
bianchi:
|
17
|
-
# filename: spec/samples/IMG_20150104_0005.jpg
|
18
|
-
# filename: spec/samples/out0000.jpg
|
19
|
-
# filename: spec/samples/SCN_0001.jpg
|
20
|
-
# filename: spec/samples/IMG_20150104_0011.jpg
|
21
|
-
# filename: spec/samples/IMG_20150104_0009.jpg
|
22
|
-
grid-file: spec/samples/bianchi.yml
|
23
|
-
barcode-int: 9350
|
24
|
-
|
25
26
|
reg-mark:
|
26
27
|
filename: spec/samples/reg_mark.jpg
|
27
28
|
centroid-x: 92
|
@@ -32,7 +33,7 @@ small:
|
|
32
33
|
|
33
34
|
code-sample:
|
34
35
|
filename: spec/samples/code_sample.png
|
35
|
-
code-string: "0000000000000000000000000000000000000000000000000001110001010001"
|
36
|
+
code-string: "0000000000000000000000000000000000000000000000000001110001010001"
|
36
37
|
code-int: 7249
|
37
38
|
|
38
39
|
code-zero:
|
@@ -41,4 +42,4 @@ code-zero:
|
|
41
42
|
two-pages:
|
42
43
|
filename: spec/samples/two_pages.pdf
|
43
44
|
code-int: 17382938642823887837
|
44
|
-
|
45
|
+
|
data/spec/samples/layout.yml
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
page_size: # all measurements in mm
|
2
2
|
width: 210 # width of the paper sheet
|
3
3
|
height: 297 # height of the paper sheet
|
4
|
-
reg_marks:
|
4
|
+
reg_marks:
|
5
5
|
margin: 10 # distance from each page border to registration mark center
|
6
6
|
radius: 2.5 # registration mark radius
|
7
|
-
search: 12 # initial size of the registration mark search area (*)
|
8
7
|
offset: 2 # distance between the search area and each page border (*)
|
8
|
+
crop: 12
|
9
|
+
offset: 2
|
10
|
+
blur: 2
|
11
|
+
dilate: 5
|
9
12
|
|
10
|
-
|
13
|
+
|
14
|
+
header:
|
11
15
|
name: # ‘name’ is just a label; you can add arbitrary header elements
|
12
16
|
top: 5 # margin relative to registration frame top side
|
13
17
|
left: 7.5 # margin relative to registration frame left side
|
@@ -35,14 +39,14 @@ items:
|
|
35
39
|
left: 10.5 # response area margin, relative to reg frame
|
36
40
|
rows: 30 # number of items per column
|
37
41
|
columns: 4 # number of columns
|
38
|
-
column_width: 44 #
|
42
|
+
column_width: 44 #
|
39
43
|
x_spacing: 7 # horizontal distance between ajacent cell centers
|
40
44
|
y_spacing: 7 # vertical distance between ajacent cell centers
|
41
45
|
cell_width: 6 # width of each choice and calibration cell
|
42
46
|
cell_height: 5 # height of each choice and calibration cell
|
43
47
|
max_cells: 5 # maximum number of choices per item
|
44
48
|
font_size: 9 # size of both the item number and choice cell letter
|
45
|
-
number_width: 8 #
|
49
|
+
number_width: 8 #
|
46
50
|
number_margin: 2 # margin between
|
47
51
|
barcode:
|
48
52
|
bits: 40 # the maximum sheet identifier is 2 to the power or bits
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,54 @@
|
|
1
|
+
page_size:
|
2
|
+
width: 210
|
3
|
+
height: 297
|
4
|
+
reg_marks:
|
5
|
+
margin: 10
|
6
|
+
radius: 2.5
|
7
|
+
crop: 12
|
8
|
+
offset: 2
|
9
|
+
blur: 2
|
10
|
+
dilate: 5
|
11
|
+
|
12
|
+
header:
|
13
|
+
name:
|
14
|
+
top: 5
|
15
|
+
left: 7.5
|
16
|
+
width: 170
|
17
|
+
size: 14
|
18
|
+
title:
|
19
|
+
top: 15
|
20
|
+
left: 7.5
|
21
|
+
width: 180
|
22
|
+
size: 12
|
23
|
+
code:
|
24
|
+
top: 5
|
25
|
+
left: 165
|
26
|
+
width: 20
|
27
|
+
size: 14
|
28
|
+
signature:
|
29
|
+
top: 30
|
30
|
+
left: 7.5
|
31
|
+
width: 120
|
32
|
+
height: 15
|
33
|
+
size: 7
|
34
|
+
box: true
|
35
|
+
items:
|
36
|
+
top: 55.5
|
37
|
+
left: 10.5
|
38
|
+
columns: 4
|
39
|
+
column_width: 44
|
40
|
+
rows: 30
|
41
|
+
x_spacing: 7
|
42
|
+
y_spacing: 7
|
43
|
+
cell_width: 6
|
44
|
+
cell_height: 5
|
45
|
+
max_cells: 5
|
46
|
+
font_size: 9
|
47
|
+
number_width: 8
|
48
|
+
number_margin: 2
|
49
|
+
barcode:
|
50
|
+
bits: 40
|
51
|
+
left: 15
|
52
|
+
width: 3
|
53
|
+
height: 2.5
|
54
|
+
spacing: 4
|
Binary file
|