--- loncom/homework/imageresponse.pm 2005/04/22 14:03:56 1.67 +++ loncom/homework/imageresponse.pm 2007/04/18 01:06:22 1.82 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # image click response style # -# $Id: imageresponse.pm,v 1.67 2005/04/22 14:03:56 albertel Exp $ +# $Id: imageresponse.pm,v 1.82 2007/04/18 01:06:22 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -37,6 +37,9 @@ use Apache::londefdef(); use Apache::Constants qw(:common :http); use Apache::lonlocal; use Apache::lonnet; +use lib '/home/httpd/lib/perl/'; +use LONCAPA; + BEGIN { &Apache::lonxml::register('Apache::imageresponse',('imageresponse')); @@ -63,12 +66,26 @@ sub start_imageresponse { sub end_imageresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - &Apache::response::end_response; - pop @Apache::lonxml::namespace; + + pop(@Apache::lonxml::namespace); &Apache::lonxml::deregister('Apache::imageresponse',('foilgroup','foil','text','image','rectangle','conceptgroup')); + my $result; - if ($target eq 'edit') { $result=&Apache::edit::end_table(); } + if ($target eq 'edit') { + $result=&Apache::edit::end_table(); + } elsif ($target eq 'tex' + && $Apache::lonhomework::type eq 'exam') { + $result=&Apache::inputtags::exam_score_line($target); + } + undef(%Apache::response::foilnames); + + if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || + $target eq 'tex' || $target eq 'analyze') { + &Apache::lonxml::increment_counter(&Apache::response::repetition()); + } + &Apache::response::end_response(); + return $result; } @@ -115,13 +132,25 @@ sub prep_image { my ($image,$mode,$name)=@_; my $part=$Apache::inputtags::part; my $respid=$Apache::inputtags::response['-1']; + my ($x,$y)=split(/:/,$Apache::lonhomework::history{"resource.$part.$respid.submission"}); + &draw_image($mode,$image,$x,$y,$Apache::response::foilgroup{"$name.area"}); +} + +sub draw_image { + my ($mode,$image,$x,$y,$areas) = @_; + my $id=&Apache::loncommon::get_cgi_id(); + my (%x,$i); - $x{"cgi.$id.BGIMG"}=&Apache::lonnet::escape($image); - my ($x,$y)=split(/:/,$Apache::lonhomework::history{"resource.$part.$respid.submission"}); + $x{"cgi.$id.BGIMG"}=&escape($image); + #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) && $x=~/\S/ && defined($y) && $y =~/\S/ && !&Apache::response::show_answer()) { + + if (defined($x) && $x =~/\S/ + && defined($y) && $y =~/\S/ + && ($mode eq 'submission' || !&Apache::response::show_answer()) + && $mode ne 'answeronly') { my $length = 6; my $width = 1; my $extrawidth = 2; @@ -147,11 +176,10 @@ sub prep_image { $x{"cgi.$id.OBJ$i"}=join(':',(($xmin),($ymax),($xmax),($ymin), "FF0000",($width))); } - if ($mode eq 'answer') { + if ($mode eq 'answer' || $mode eq 'answeronly') { my $width = 1; my $extrawidth = 2; - my @areas = @{ $Apache::response::foilgroup{"$name.area"} }; - foreach my $area (@areas) { + foreach my $area (@{ $areas }) { if ($area=~/^rectangle:/) { $x{"cgi.$id.OBJTYPE"}.='RECTANGLE:'; $i=$x{"cgi.$id.OBJCOUNT"}++; @@ -183,6 +211,7 @@ sub displayfoils { my $result =''; my $name; my $temp=1; + my @images; foreach $name (@whichopt) { $result.=$Apache::response::foilgroup{"$name.text"}; &Apache::lonxml::debug("Text is $result"); @@ -191,7 +220,8 @@ sub displayfoils { &Apache::lonxml::debug("image is $image"); if ( $target eq 'web' && $image !~ /^http:/ ) { $image=&clean_up_image($image); - } + } + push(@images,$image); &Apache::lonxml::debug("image is $image"); if ( &Apache::response::show_answer() ) { if ($target eq 'tex') { @@ -213,6 +243,40 @@ sub displayfoils { } $temp++; } + if ($target eq 'web') { + &Apache::response::setup_prior_tries_hash(\&format_prior_response, + [\@images]); + } + return $result; +} + +sub format_prior_response { + my ($mode,$answer,$other_data) = @_; + my ($x,$y)=split(/:/,$answer); + my $images = $other_data->[0]; + + my $token = &draw_image('submission',$images->[0],$x,$y); + + return ""; + +} + +sub display_answers { + my ($target,$whichopt)=@_; + + my $result; + foreach my $name (@$whichopt) { + my $image=$Apache::response::foilgroup{"$name.image"}; + &Apache::lonxml::debug("image is $image"); + if ( $target eq 'web' && $image !~ /^http:/ ) { + $image = &clean_up_image($image); + } + my $token=&prep_image($image,'answeronly',$name); + + $result.=&Apache::response::answer_header('imageresponse'); + $result.=&Apache::response::answer_part('imageresponse',"
\n"); + $result.=&Apache::response::answer_footer('imageresponse'); + } return $result; } @@ -238,10 +302,18 @@ sub clean_up_image { sub gradefoils { my (@whichopt) = @_; + + my $partid = $Apache::inputtags::part; + my $id = $Apache::inputtags::response['-1']; + + if ($Apache::lonhomework::type eq 'exam') { + &Apache::response::scored_response($partid,$id); + return; + } + my $x; my $y; my $result; - my $id=$Apache::inputtags::response['-1']; my $temp=1; foreach my $name (@whichopt) { $x=$env{"form.HWVAL_$id:$temp.x"}; @@ -280,27 +352,36 @@ sub gradefoils { &Apache::response::handle_previous(\%previous,$result); $Apache::lonhomework::results{"resource.$part.$id.submission"}=$responsestr; $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$result; - return ''; + return; } sub end_foilgroup { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; my @whichopt; + if ($target eq 'web' || $target eq 'grade' || $target eq 'tex' || - $target eq 'analyze') { + $target eq 'analyze' || $target eq 'answer') { + my ($count,$max) = &getfoilcounts($parstack,$safeeval); if ($count>$max) { $count=$max } &Apache::lonxml::debug("Count is $count from $max"); + @whichopt = &whichfoils($max); + if ($target eq 'web' || $target eq 'tex') { $result=&displayfoils($target,@whichopt); + $Apache::lonxml::post_evaluate=0; } elsif ($target eq 'grade') { if ( defined $env{'form.submitted'}) { &gradefoils(@whichopt); } } elsif ( $target eq 'analyze') { &Apache::response::analyze_store_foilgroup(\@whichopt, ['text','image','area']); + } elsif ($target eq 'answer' + && $env{'form.answer_output_mode'} ne 'tex') { + $result=&display_answers($target,\@whichopt); } + } elsif ($target eq 'edit') { $result=&Apache::edit::end_table(); } @@ -345,10 +426,10 @@ sub start_foil { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; if ($target eq 'web' || $target eq 'grade' || $target eq 'tex' || - $target eq 'analyze') { + $target eq 'analyze' || $target eq 'answer') { my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval); - if (!$name) { - &Apache::lonxml::error("Foils without names exist. This can cause problems to malfunction."); + if ($name eq "") { + &Apache::lonxml::warning("Foils without names exist. This can cause problems to malfunction."); $name=$Apache::lonxml::curdepth; } if (defined($Apache::response::foilnames{$name})) { @@ -388,10 +469,11 @@ sub end_foil { sub start_text { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { + if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze' + || $target eq 'answer') { &Apache::lonxml::startredirection; } elsif ($target eq 'edit') { - my $descr=&Apache::lonxml::get_all_text('/text',$parser); + my $descr=&Apache::lonxml::get_all_text('/text',$parser,$style); $result=&Apache::edit::tag_start($target,$token,'Task Description'). &Apache::edit::editfield($token->[1],$descr,'Text',60,2). &Apache::edit::end_row(); @@ -404,7 +486,8 @@ sub start_text { sub end_text { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; - if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { + if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze' + || $target eq 'answer') { my $name = $Apache::imageresponse::curname; if ( $Apache::imageresponse::conceptgroup #&& !&Apache::response::showallfoils() @@ -422,10 +505,11 @@ sub end_text { sub start_image { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { + if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze' + || $target eq 'answer') { &Apache::lonxml::startredirection; } elsif ($target eq 'edit') { - my $bgimg=&Apache::lonxml::get_all_text('/image',$parser); + my $bgimg=&Apache::lonxml::get_all_text('/image',$parser,$style); $Apache::edit::bgimgsrc=$bgimg; $Apache::edit::bgimgsrcdepth=$Apache::lonxml::curdepth; @@ -444,7 +528,7 @@ sub end_image { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; my $name = $Apache::imageresponse::curname; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'answer') { my $image = &Apache::lonxml::endredirection(); &Apache::lonxml::debug("original image is $image"); if ( $Apache::imageresponse::conceptgroup @@ -467,10 +551,30 @@ sub end_image { $result=&Apache::edit::end_table(); } elsif ($target eq 'tex') { my $src = &Apache::lonxml::endredirection(); - my ($path,$file) = &Apache::londefdef::get_eps_image($src); - my ($height_param,$width_param)= - &Apache::londefdef::image_size($src,0.3,$parstack,$safeeval); - $Apache::response::foilgroup{"$name.image"} ='\vskip 0 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} '; + + # There may be all sorts of whitespace on fore and aft: + + $src =~ s/\s+$//s; + $src =~ s/^\s+//s; + + # + # Gnuplot e.g. just generates the latex to put inplace. + # + my $graphinclude; + if ($src =~ /^%DYNAMICIMAGE/) { + # This is needed because the newline is not always passed -> tex. + # At present we don't care about the sizing info. + + my ($commentline, $restofstuff) = split(/\n/, $src); + $graphinclude = $src; + $graphinclude =~ s/^$commentline//; + } else { + my ($path,$file) = &Apache::londefdef::get_eps_image($src); + my ($height_param,$width_param)= + &Apache::londefdef::image_size($src,0.3,$parstack,$safeeval); + $graphinclude = '\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'}'; + } + $Apache::response::foilgroup{"$name.image"} ='\vskip 0 mm \noindent '.$graphinclude; } return $result; } @@ -479,10 +583,10 @@ sub start_rectangle { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; if ($target eq 'web' || $target eq 'grade' || $target eq 'tex' || - $target eq 'analyze') { + $target eq 'analyze' || $target eq 'answer') { &Apache::lonxml::startredirection; } elsif ($target eq 'edit') { - my $coords=&Apache::lonxml::get_all_text('/rectangle',$parser); + my $coords=&Apache::lonxml::get_all_text('/rectangle',$parser,$style); $result=&Apache::edit::tag_start($target,$token,'Rectangle'). &Apache::edit::editline($token->[1],$coords,'Coordinate Pairs',40). &Apache::edit::entercoord(undef,'textnode',undef,undef,'box'). @@ -511,7 +615,7 @@ sub end_rectangle { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; if ($target eq 'web' || $target eq 'grade' || $target eq 'tex' || - $target eq 'analyze') { + $target eq 'analyze' || $target eq 'answer') { my $name = $Apache::imageresponse::curname; my $area = &Apache::lonxml::endredirection; $area=~s/\s//g; @@ -533,10 +637,10 @@ sub start_polygon { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; if ($target eq 'web' || $target eq 'grade' || $target eq 'tex' || - $target eq 'analyze') { + $target eq 'analyze' || $target eq 'answer') { &Apache::lonxml::startredirection; } elsif ($target eq 'edit') { - my $coords=&Apache::lonxml::get_all_text('/polygon',$parser); + my $coords=&Apache::lonxml::get_all_text('/polygon',$parser,$style); $result=&Apache::edit::tag_start($target,$token,'Polygon'). &Apache::edit::editline($token->[1],$coords,'Coordinate list',40). &Apache::edit::entercoord(undef,'textnode',undef,undef,'polygon'). @@ -592,7 +696,7 @@ sub end_polygon { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; if ($target eq 'web' || $target eq 'grade' || $target eq 'tex' || - $target eq 'analyze') { + $target eq 'analyze' || $target eq 'answer') { my $name = $Apache::imageresponse::curname; my $area = &Apache::lonxml::endredirection; $area=~s/\s*//g;