--- loncom/homework/imageresponse.pm 2004/02/11 21:59:34 1.47 +++ loncom/homework/imageresponse.pm 2005/01/31 22:47:43 1.58.2.1 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # image click response style # -# $Id: imageresponse.pm,v 1.47 2004/02/11 21:59:34 albertel Exp $ +# $Id: imageresponse.pm,v 1.58.2.1 2005/01/31 22:47:43 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -31,10 +31,11 @@ package Apache::imageresponse; use strict; -use Image::Magick; -use Apache::randomlylabel; -use Apache::londefdef; +use Image::Magick(); +use Apache::randomlylabel(); +use Apache::londefdef(); use Apache::Constants qw(:common :http); +use Apache::lonlocal; BEGIN { &Apache::lonxml::register('Apache::imageresponse',('imageresponse')); @@ -49,6 +50,7 @@ sub start_imageresponse { 'polygon','conceptgroup')); push (@Apache::lonxml::namespace,'imageresponse'); my $id = &Apache::response::start_response($parstack,$safeeval); + undef(%Apache::response::foilnames); if ($target eq 'meta') { $result=&Apache::response::meta_package_write('imageresponse'); } elsif ($target eq 'analyze') { @@ -65,6 +67,7 @@ sub end_imageresponse { &Apache::lonxml::deregister('Apache::imageresponse',('foilgroup','foil','text','image','rectangle','conceptgroup')); my $result; if ($target eq 'edit') { $result=&Apache::edit::end_table(); } + undef(%Apache::response::foilnames); return $result; } @@ -72,7 +75,7 @@ sub end_imageresponse { sub start_foilgroup { %Apache::response::foilgroup=(); $Apache::imageresponse::conceptgroup=0; - &Apache::response::setrandomnumber(); + &Apache::response::pushrandomnumber(); return ''; } @@ -82,7 +85,7 @@ sub getfoilcounts { my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2'); # +1 since instructors will count from 1 my $count = $#{ $Apache::response::foilgroup{'names'} }+1; - if (&Apache::response::showallfoils()) { $max=$count; } + #if (&Apache::response::showallfoils()) { $max=$count; } return ($count,$max); } @@ -94,11 +97,11 @@ sub whichfoils { while ((($#whichopt+1) < $max) && ($#names > -1)) { &Apache::lonxml::debug("Have $#whichopt max is $max"); my $aopt; - if (&Apache::response::showallfoils()) { - $aopt=0; - } else { +# if (&Apache::response::showallfoils()) { +# $aopt=0; +# } else { $aopt=int(&Math::Random::random_uniform() * ($#names+1)); - } +# } &Apache::lonxml::debug("From $#names elms, picking $aopt"); $aopt=splice(@names,$aopt,1); &Apache::lonxml::debug("Picked $aopt"); @@ -112,28 +115,36 @@ sub prep_image { my $part=$Apache::inputtags::part; my $respid=$Apache::inputtags::response['-1']; my $id=&Apache::loncommon::get_cgi_id(); - my %x; + my (%x,$i); $x{"cgi.$id.BGIMG"}=&Apache::lonnet::escape($image); my ($x,$y)=split(/:/,$Apache::lonhomework::history{"resource.$part.$respid.submission"}); #draws 2 xs on the image at the clicked location #one in white and then one in red on top of the one in white - if (defined($x) && defined($y)) { - $x{"cgi.$id.LINECOUNT"}=4; + if (defined($x) && $x=~/\S/ && defined($y) && $y =~/\S/ && !&Apache::response::show_answer()) { my $length = 6; my $width = 1; my $extrawidth = 2; - $x{"cgi.$id.LINE0"}= - join(':',(($x-$length),($y-$length),($x+$length),($y+$length), - "FFFFFF",($width+$extrawidth))); - $x{"cgi.$id.LINE1"}= - join(':',(($x-$length),($y+$length),($x+$length),($y-$length), - "FFFFFF",($width+$extrawidth))); - $x{"cgi.$id.LINE2"}= - join(':',(($x-$length),($y-$length),($x+$length),($y+$length), - "FF0000",($width))); - $x{"cgi.$id.LINE3"}= - join(':',(($x-$length),($y+$length),($x+$length),($y-$length), - "FF0000",($width))); + my $xmin=($x-$length); + my $xmax=($x+$length); + my $ymin=($y-$length); + my $ymax=($y+$length); + + $x{"cgi.$id.OBJTYPE"}.='LINE:'; + $i=$x{"cgi.$id.OBJCOUNT"}++; + $x{"cgi.$id.OBJ$i"}=join(':',(($xmin),($ymin),($xmax),($ymax), + "FFFFFF",($width+$extrawidth))); + $x{"cgi.$id.OBJTYPE"}.='LINE:'; + $i=$x{"cgi.$id.OBJCOUNT"}++; + $x{"cgi.$id.OBJ$i"}=join(':',(($xmin),($ymax),($xmax),($ymin), + "FFFFFF",($width+$extrawidth))); + $x{"cgi.$id.OBJTYPE"}.='LINE:'; + $i=$x{"cgi.$id.OBJCOUNT"}++; + $x{"cgi.$id.OBJ$i"}=join(':',(($xmin),($ymin),($xmax),($ymax), + "FF0000",($width))); + $x{"cgi.$id.OBJTYPE"}.='LINE:'; + $i=$x{"cgi.$id.OBJCOUNT"}++; + $x{"cgi.$id.OBJ$i"}=join(':',(($xmin),($ymax),($xmax),($ymin), + "FF0000",($width))); } if ($mode eq 'answer') { my $width = 1; @@ -141,20 +152,24 @@ sub prep_image { my @areas = @{ $Apache::response::foilgroup{"$name.area"} }; foreach my $area (@areas) { if ($area=~/^rectangle:/) { + $x{"cgi.$id.OBJTYPE"}.='RECTANGLE:'; + $i=$x{"cgi.$id.OBJCOUNT"}++; my ($x1,$y1,$x2,$y2)= ($area=~m/rectangle:\(([0-9]+),([0-9]+)\)\-\(([0-9]+),([0-9]+)\)/); - my $i=$x{"cgi.$id.BOXCOUNT"}++; - $x{"cgi.$id.BOX$i"}=join(':',($x1,$y1,$x2,$y2,"FFFFFF", + $x{"cgi.$id.OBJ$i"}=join(':',($x1,$y1,$x2,$y2,"FFFFFF", ($width+$extrawidth))); - $i=$x{"cgi.$id.BOXCOUNT"}++; - $x{"cgi.$id.BOX$i"}=join(':',($x1,$y1,$x2,$y2,"00FF00",$width)); + $x{"cgi.$id.OBJTYPE"}.='RECTANGLE:'; + $i=$x{"cgi.$id.OBJCOUNT"}++; + $x{"cgi.$id.OBJ$i"}=join(':',($x1,$y1,$x2,$y2,"00FF00",$width)); } elsif ($area=~/^polygon:(.*)/) { - my $i=$x{"cgi.$id.POLYCOUNT"}++; - $x{"cgi.$id.POLYOPT$i"}=join(':',("FFFFFF",($width+$extrawidth))); - $x{"cgi.$id.POLY$i"}=$1; - $i=$x{"cgi.$id.POLYCOUNT"}++; - $x{"cgi.$id.POLYOPT$i"}=join(':',("00FF00",$width)); - $x{"cgi.$id.POLY$i"}=$1; + $x{"cgi.$id.OBJTYPE"}.='POLYGON:'; + $i=$x{"cgi.$id.OBJCOUNT"}++; + $x{"cgi.$id.OBJ$i"}=join(':',("FFFFFF",($width+$extrawidth))); + $x{"cgi.$id.OBJEXTRA$i"}=$1; + $x{"cgi.$id.OBJTYPE"}.='POLYGON:'; + $i=$x{"cgi.$id.OBJCOUNT"}++; + $x{"cgi.$id.OBJ$i"}=join(':',("00FF00",$width)); + $x{"cgi.$id.OBJEXTRA$i"}=$1; } } } @@ -203,7 +218,7 @@ sub displayfoils { sub clean_up_image { my ($image)=@_; if ($image =~ /\s*[_1] appears more than once. Foil names need to be unique.",$name)); + } + $Apache::response::foilnames{$name}++; if ( $Apache::imageresponse::conceptgroup - && !&Apache::response::showallfoils()) { + #&& !&Apache::response::showallfoils() + ) { push(@{ $Apache::response::conceptgroup{'names'} }, $name); } else { push(@{ $Apache::response::foilgroup{'names'} }, $name); @@ -365,7 +393,8 @@ sub end_text { if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { my $name = $Apache::imageresponse::curname; if ( $Apache::imageresponse::conceptgroup - && !&Apache::response::showallfoils() ) { + #&& !&Apache::response::showallfoils() + ) { $Apache::response::conceptgroup{"$name.text"} = &Apache::lonxml::endredirection; } else { $Apache::response::foilgroup{"$name.text"} = &Apache::lonxml::endredirection; @@ -405,7 +434,8 @@ sub end_image { my $image = &Apache::lonxml::endredirection; &Apache::lonxml::debug("original image is $image"); if ( $Apache::imageresponse::conceptgroup - && !&Apache::response::showallfoils()) { + #&& !&Apache::response::showallfoils() + ) { $Apache::response::conceptgroup{"$name.image"} = $image; } else { $Apache::response::foilgroup{"$name.image"} = $image; @@ -413,7 +443,8 @@ sub end_image { } elsif ($target eq 'analyze') { my $image = &Apache::lonxml::endredirection; if ( $Apache::imageresponse::conceptgroup - && !&Apache::response::showallfoils()) { + #&& !&Apache::response::showallfoils() + ) { $Apache::response::conceptgroup{"$name.image"} = $image; } else { $Apache::response::foilgroup{"$name.image"} = $image; @@ -480,6 +511,7 @@ sub end_image { } elsif ($width ne '') { $width_param = $width*$scaling; } + $width_param=&Apache::randomlabel::adjust_textwidth($width_param); #where can we find the picture? if (-e $newsrc) { if ($path) { @@ -532,9 +564,11 @@ sub end_rectangle { $target eq 'analyze') { my $name = $Apache::imageresponse::curname; my $area = &Apache::lonxml::endredirection; + $area=~s/\s//g; &Apache::lonxml::debug("out is $area for $name"); if ( $Apache::imageresponse::conceptgroup - && !&Apache::response::showallfoils()) { + #&& !&Apache::response::showallfoils() + ) { push @{ $Apache::response::conceptgroup{"$name.area"} },"rectangle:$area"; } else { push @{ $Apache::response::foilgroup{"$name.area"} },"rectangle:$area"; @@ -611,9 +645,11 @@ sub end_polygon { $target eq 'analyze') { my $name = $Apache::imageresponse::curname; my $area = &Apache::lonxml::endredirection; + $area=~s/\s*//g; &Apache::lonxml::debug("out is $area for $name"); if ( $Apache::imageresponse::conceptgroup - && !&Apache::response::showallfoils()) { + #&& !&Apache::response::showallfoils() + ) { push @{ $Apache::response::conceptgroup{"$name.area"} },"polygon:$area"; } else { push @{ $Apache::response::foilgroup{"$name.area"} },"polygon:$area";