Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
71d48778
Commit
71d48778
authored
Oct 28, 2012
by
ichuang
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #983 from MITx/kimth/fix-imageresponse
Support for multiple rectangle hitboxes in imageresponse
parents
dd6d7e99
49bad83c
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
39 additions
and
20 deletions
+39
-20
common/lib/capa/capa/responsetypes.py
+21
-17
common/lib/capa/capa/tests/test_files/imageresponse.xml
+7
-2
common/lib/capa/capa/tests/test_responsetypes.py
+11
-1
No files found.
common/lib/capa/capa/responsetypes.py
View file @
71d48778
...
...
@@ -1717,7 +1717,7 @@ class ImageResponse(LoncapaResponse):
"""
Handle student response for image input: the input is a click on an image,
which produces an [x,y] coordinate pair. The click is correct if it falls
within a region specified. This region is
nominally a rectangle
.
within a region specified. This region is
a union of rectangles
.
Lon-CAPA requires that each <imageresponse> has a <foilgroup> inside it. That
doesn't make sense to me (Ike). Instead, let's have it such that <imageresponse>
...
...
@@ -1727,6 +1727,7 @@ class ImageResponse(LoncapaResponse):
snippets
=
[{
'snippet'
:
'''<imageresponse>
<imageinput src="image1.jpg" width="200" height="100" rectangle="(10,10)-(20,30)" />
<imageinput src="image2.jpg" width="210" height="130" rectangle="(12,12)-(40,60)" />
<imageinput src="image2.jpg" width="210" height="130" rectangle="(10,10)-(20,30);(12,12)-(40,60)" />
</imageresponse>'''
}]
response_tag
=
'imageresponse'
...
...
@@ -1743,20 +1744,10 @@ class ImageResponse(LoncapaResponse):
for
aid
in
self
.
answer_ids
:
# loop through IDs of <imageinput> fields in our stanza
given
=
student_answers
[
aid
]
# this should be a string of the form '[x,y]'
correct_map
.
set
(
aid
,
'incorrect'
)
if
not
given
:
# No answer to parse. Mark as incorrect and move on
correct_map
.
set
(
aid
,
'incorrect'
)
continue
# parse expected answer
# TODO: Compile regexp on file load
m
=
re
.
match
(
'[
\
(
\
[]([0-9]+),([0-9]+)[
\
)
\
]]-[
\
(
\
[]([0-9]+),([0-9]+)[
\
)
\
]]'
,
expectedset
[
aid
]
.
strip
()
.
replace
(
' '
,
''
))
if
not
m
:
msg
=
'Error in problem specification! cannot parse rectangle in
%
s'
%
(
etree
.
tostring
(
self
.
ielements
[
aid
],
pretty_print
=
True
))
raise
Exception
(
'[capamodule.capa.responsetypes.imageinput] '
+
msg
)
(
llx
,
lly
,
urx
,
ury
)
=
[
int
(
x
)
for
x
in
m
.
groups
()]
# parse given answer
m
=
re
.
match
(
'
\
[([0-9]+),([0-9]+)]'
,
given
.
strip
()
.
replace
(
' '
,
''
))
if
not
m
:
...
...
@@ -1764,11 +1755,24 @@ class ImageResponse(LoncapaResponse):
'error grading
%
s (input=
%
s)'
%
(
aid
,
given
))
(
gx
,
gy
)
=
[
int
(
x
)
for
x
in
m
.
groups
()]
# answer is correct if (x,y) is within the specified rectangle
if
(
llx
<=
gx
<=
urx
)
and
(
lly
<=
gy
<=
ury
):
correct_map
.
set
(
aid
,
'correct'
)
else
:
correct_map
.
set
(
aid
,
'incorrect'
)
# Check whether given point lies in any of the solution rectangles
solution_rectangles
=
expectedset
[
aid
]
.
split
(
';'
)
for
solution_rectangle
in
solution_rectangles
:
# parse expected answer
# TODO: Compile regexp on file load
m
=
re
.
match
(
'[
\
(
\
[]([0-9]+),([0-9]+)[
\
)
\
]]-[
\
(
\
[]([0-9]+),([0-9]+)[
\
)
\
]]'
,
solution_rectangle
.
strip
()
.
replace
(
' '
,
''
))
if
not
m
:
msg
=
'Error in problem specification! cannot parse rectangle in
%
s'
%
(
etree
.
tostring
(
self
.
ielements
[
aid
],
pretty_print
=
True
))
raise
Exception
(
'[capamodule.capa.responsetypes.imageinput] '
+
msg
)
(
llx
,
lly
,
urx
,
ury
)
=
[
int
(
x
)
for
x
in
m
.
groups
()]
# answer is correct if (x,y) is within the specified rectangle
if
(
llx
<=
gx
<=
urx
)
and
(
lly
<=
gy
<=
ury
):
correct_map
.
set
(
aid
,
'correct'
)
break
return
correct_map
def
get_answers
(
self
):
...
...
common/lib/capa/capa/tests/test_files/imageresponse.xml
View file @
71d48778
...
...
@@ -8,8 +8,14 @@ Hello</p></text>
<text>
Click on the image where the top skier will stop momentarily if the top skier starts from rest.
</text>
<imageinput
src=
"/static/Physics801/Figures/Skier-conservation of energy.jpg"
width=
"560"
height=
"388"
rectangle=
"(242,202)-(296,276)"
/>
<text>
Click on the image where the lower skier will stop momentarily if the lower skier starts from rest.
</text>
<imageinput
src=
"/static/Physics801/Figures/Skier-conservation of energy.jpg"
width=
"560"
height=
"388"
rectangle=
"(490,11)-(556,98);(242,202)-(296,276)"
/>
<text>
Click on either of the two positions as discussed previously.
</text>
<imageinput
src=
"/static/Physics801/Figures/Skier-conservation of energy.jpg"
width=
"560"
height=
"388"
rectangle=
"(490,11)-(556,98);(242,202)-(296,276)"
/>
<text>
Click on either of the two positions as discussed previously.
</text>
<imageinput
src=
"/static/Physics801/Figures/Skier-conservation of energy.jpg"
width=
"560"
height=
"388"
rectangle=
"(490,11)-(556,98);(242,202)-(296,276)"
/>
<text>
Click on either of the two positions as discussed previously.
</text>
<hintgroup
showoncorrect=
"no"
>
<text><p>
Use conservation of energy.
</p></text>
</hintgroup>
</imageresponse>
</problem>
\ No newline at end of file
</problem>
common/lib/capa/capa/tests/test_responsetypes.py
View file @
71d48778
...
...
@@ -53,12 +53,22 @@ class ImageResponseTest(unittest.TestCase):
imageresponse_file
=
os
.
path
.
dirname
(
__file__
)
+
"/test_files/imageresponse.xml"
test_lcp
=
lcp
.
LoncapaProblem
(
open
(
imageresponse_file
)
.
read
(),
'1'
,
system
=
test_system
)
correct_answers
=
{
'1_2_1'
:
'(490,11)-(556,98)'
,
'1_2_2'
:
'(242,202)-(296,276)'
}
'1_2_2'
:
'(242,202)-(296,276)'
,
'1_2_3'
:
'(490,11)-(556,98);(242,202)-(296,276)'
,
'1_2_4'
:
'(490,11)-(556,98);(242,202)-(296,276)'
,
'1_2_5'
:
'(490,11)-(556,98);(242,202)-(296,276)'
,
}
test_answers
=
{
'1_2_1'
:
'[500,20]'
,
'1_2_2'
:
'[250,300]'
,
'1_2_3'
:
'[500,20]'
,
'1_2_4'
:
'[250,250]'
,
'1_2_5'
:
'[10,10]'
,
}
self
.
assertEquals
(
test_lcp
.
grade_answers
(
test_answers
)
.
get_correctness
(
'1_2_1'
),
'correct'
)
self
.
assertEquals
(
test_lcp
.
grade_answers
(
test_answers
)
.
get_correctness
(
'1_2_2'
),
'incorrect'
)
self
.
assertEquals
(
test_lcp
.
grade_answers
(
test_answers
)
.
get_correctness
(
'1_2_3'
),
'correct'
)
self
.
assertEquals
(
test_lcp
.
grade_answers
(
test_answers
)
.
get_correctness
(
'1_2_4'
),
'correct'
)
self
.
assertEquals
(
test_lcp
.
grade_answers
(
test_answers
)
.
get_correctness
(
'1_2_5'
),
'incorrect'
)
class
SymbolicResponseTest
(
unittest
.
TestCase
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment