mork 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|