ruby_marks 0.2.0 → 0.2.1
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.
- data/README.md +5 -3
- data/lib/ruby_marks/group.rb +1 -2
- data/lib/ruby_marks/recognizer.rb +21 -19
- data/lib/ruby_marks/version.rb +1 -1
- data/test/ruby_marks/recognizer_test.rb +1 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -423,10 +423,12 @@ end
|
|
423
423
|
```ruby
|
424
424
|
# Will execute your custom code if didn't a group isn't found, or it have a line count different than expected,
|
425
425
|
# or in one or more lines the options marks found are different of the specified in marks options.
|
426
|
-
# It returns the recognizer object, a boolean value to incorrect expected lines count, and a
|
427
|
-
#
|
426
|
+
# It returns the recognizer object, a boolean value to incorrect expected lines count, and a hash with the
|
427
|
+
# incorrect bubble lines found, and a hash with the coordinates of bubbles adjusted.
|
428
|
+
# Pay attention on incorrect_expected_lines and incorrect_bubble_line_found, because if some of this variables
|
429
|
+
# becomes present, then your document may have an incorrect result scan...
|
428
430
|
|
429
|
-
recognizer.add_watcher :
|
431
|
+
recognizer.add_watcher :incorrect_group_watcher do |recognizer, incorrect_expected_lines, incorrect_bubble_line_found, bubbles_adjusted|
|
430
432
|
# place your custom code
|
431
433
|
end
|
432
434
|
```
|
data/lib/ruby_marks/group.rb
CHANGED
@@ -6,11 +6,10 @@ module RubyMarks
|
|
6
6
|
attr_accessor :mark_width, :mark_height, :marks_options, :coordinates, :expected_coordinates,
|
7
7
|
:mark_width_tolerance, :mark_height_tolerance, :marks, :distance_between_marks
|
8
8
|
|
9
|
-
|
10
9
|
def initialize(label, recognizer)
|
11
10
|
@label = label
|
12
11
|
@recognizer = recognizer
|
13
|
-
|
12
|
+
|
14
13
|
@mark_width = @recognizer.config.default_mark_width
|
15
14
|
@mark_height = @recognizer.config.default_mark_height
|
16
15
|
|
@@ -4,7 +4,7 @@ module RubyMarks
|
|
4
4
|
class Recognizer
|
5
5
|
|
6
6
|
attr_reader :file, :raised_watchers, :groups, :watchers, :file_str, :original_file_str
|
7
|
-
attr_accessor :config
|
7
|
+
attr_accessor :config, :groups_detected
|
8
8
|
|
9
9
|
|
10
10
|
def initialize
|
@@ -23,6 +23,7 @@ module RubyMarks
|
|
23
23
|
@file = @file.threshold(@config.calculated_threshold_level)
|
24
24
|
@original_file = @file
|
25
25
|
@file = @file.edge(@config.edge_level)
|
26
|
+
@groups_detected = false
|
26
27
|
|
27
28
|
@groups.each_pair do |label, group|
|
28
29
|
group.marks = Hash.new { |hash, key| hash[key] = [] }
|
@@ -84,7 +85,7 @@ module RubyMarks
|
|
84
85
|
result = Hash.new { |hash, key| hash[key] = [] }
|
85
86
|
result.tap do |result|
|
86
87
|
|
87
|
-
self.detect_groups
|
88
|
+
self.detect_groups unless @groups_detected
|
88
89
|
|
89
90
|
@groups.each_pair do |label, group|
|
90
91
|
marks = Hash.new { |hash, key| hash[key] = [] }
|
@@ -92,14 +93,12 @@ module RubyMarks
|
|
92
93
|
value.each do |mark|
|
93
94
|
marks[line] << mark.value if mark.marked?
|
94
95
|
end
|
96
|
+
|
97
|
+
multiple_marked_found = true if marks[line].size > 1
|
98
|
+
unmarked_group_found = true if marks[line].empty?
|
95
99
|
end
|
96
|
-
|
97
|
-
if marks.any?
|
98
|
-
result[group.label.to_sym] = marks
|
99
|
-
multiple_marked_found = true if marks.size > 1
|
100
|
-
else
|
101
|
-
unmarked_group_found = true
|
102
|
-
end
|
100
|
+
marks.delete_if { |line, value| value.empty? }
|
101
|
+
result[group.label.to_sym] = marks if marks.any?
|
103
102
|
end
|
104
103
|
|
105
104
|
raise_watcher :scan_unmarked_watcher, result if unmarked_group_found
|
@@ -112,8 +111,8 @@ module RubyMarks
|
|
112
111
|
def detect_groups
|
113
112
|
file_str = RubyMarks::ImageUtils.export_file_to_str(@file)
|
114
113
|
original_file_str = RubyMarks::ImageUtils.export_file_to_str(@original_file)
|
115
|
-
incorrect_bubble_line_found =
|
116
|
-
bubbles_adjusted =
|
114
|
+
incorrect_bubble_line_found = Hash.new { |hash, key| hash[key] = [] }
|
115
|
+
bubbles_adjusted = []
|
117
116
|
incorrect_expected_lines = false
|
118
117
|
@groups.each_pair do |label, group|
|
119
118
|
next unless group.expected_coordinates.any?
|
@@ -185,8 +184,6 @@ module RubyMarks
|
|
185
184
|
first_position += marks.first.coordinates[:x1]
|
186
185
|
|
187
186
|
elements_position_count += 1
|
188
|
-
else
|
189
|
-
incorrect_bubble_line_found = true
|
190
187
|
end
|
191
188
|
end
|
192
189
|
|
@@ -204,7 +201,7 @@ module RubyMarks
|
|
204
201
|
|
205
202
|
group.marks[line].delete(current_mark)
|
206
203
|
reprocess = true
|
207
|
-
bubbles_adjusted
|
204
|
+
bubbles_adjusted << current_mark.coordinates
|
208
205
|
break
|
209
206
|
|
210
207
|
else
|
@@ -248,7 +245,7 @@ module RubyMarks
|
|
248
245
|
group.marks[line] << current_mark
|
249
246
|
group.marks[line].sort! { |a, b| a.coordinates[:x1] <=> b.coordinates[:x1] }
|
250
247
|
reprocess = true
|
251
|
-
bubbles_adjusted
|
248
|
+
bubbles_adjusted << current_mark.coordinates
|
252
249
|
break
|
253
250
|
end
|
254
251
|
end
|
@@ -261,11 +258,16 @@ module RubyMarks
|
|
261
258
|
end
|
262
259
|
end
|
263
260
|
|
261
|
+
group.marks.each_pair do |line, marks|
|
262
|
+
if marks.count != group.marks_options.count
|
263
|
+
incorrect_bubble_line_found[group.label.to_sym] << line
|
264
|
+
end
|
265
|
+
end
|
264
266
|
end
|
265
267
|
end
|
266
|
-
|
267
|
-
if incorrect_bubble_line_found || bubbles_adjusted || incorrect_expected_lines
|
268
|
-
raise_watcher :incorrect_group_watcher, incorrect_expected_lines, incorrect_bubble_line_found, bubbles_adjusted
|
268
|
+
@groups_detected = true
|
269
|
+
if incorrect_bubble_line_found.any? || bubbles_adjusted.any? || incorrect_expected_lines
|
270
|
+
raise_watcher :incorrect_group_watcher, incorrect_expected_lines, incorrect_bubble_line_found, bubbles_adjusted.flatten
|
269
271
|
end
|
270
272
|
end
|
271
273
|
|
@@ -370,7 +372,7 @@ module RubyMarks
|
|
370
372
|
|
371
373
|
file.tap do |file|
|
372
374
|
|
373
|
-
self.detect_groups
|
375
|
+
self.detect_groups unless @groups_detected
|
374
376
|
|
375
377
|
@groups.each_pair do |label, group|
|
376
378
|
|
data/lib/ruby_marks/version.rb
CHANGED
@@ -138,7 +138,7 @@ class RubyMarks::RecognizerTest < Test::Unit::TestCase
|
|
138
138
|
@file = 'assets/sheet_demo1_invalid.png'
|
139
139
|
@recognizer.file = @file
|
140
140
|
|
141
|
-
@recognizer.add_watcher :incorrect_group_watcher
|
141
|
+
@recognizer.add_watcher :incorrect_group_watcher
|
142
142
|
|
143
143
|
@recognizer.scan
|
144
144
|
assert @recognizer.raised_watchers.include?(:incorrect_group_watcher)
|