--- loncom/homework/imageresponse.pm 2003/10/30 20:52:54 1.39 +++ loncom/homework/imageresponse.pm 2004/01/15 22:25:31 1.42.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # image click response style # -# $Id: imageresponse.pm,v 1.39 2003/10/30 20:52:54 albertel Exp $ +# $Id: imageresponse.pm,v 1.42.2.1 2004/01/15 22:25:31 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,10 +29,10 @@ #currently package Apache::imageresponse; -use Apache::randomlylabel; use strict; use Image::Magick; -use GD; +use Apache::randomlylabel; +use Apache::Constants qw(:common :http); BEGIN { &Apache::lonxml::register('Apache::imageresponse',('imageresponse')); @@ -103,6 +103,52 @@ sub whichfoils { return @whichopt; } +sub prep_image { + my ($image,$mode,$name)=@_; + my $part=$Apache::inputtags::part; + my $respid=$Apache::inputtags::response['-1']; + my $id=&Apache::loncommon::get_cgi_id(); + my %x; + $x{"cgi.$id.BGIMG"}=$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; + 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))); + } + if ($mode eq 'answer') { + my $width = 1; + my $extrawidth = 2; + my @areas = @{ $Apache::response::foilgroup{"$name.area"} }; + foreach my $area (@areas) { + 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", + ($width+$extrawidth))); + $i=$x{"cgi.$id.BOXCOUNT"}++; + $x{"cgi.$id.BOX$i"}=join(':',($x1,$y1,$x2,$y2,"00FF00",$width)); + } + } + &Apache::lonnet::appenv(%x); + return $id; +} + sub displayfoils { my ($target,@whichopt) = @_; my $result =''; @@ -114,17 +160,29 @@ sub displayfoils { if ($target eq 'tex') {$result.="\\vskip 0 mm \n";} else {$result.="
\n";} my $image=$Apache::response::foilgroup{"$name.image"}; &Apache::lonxml::debug("image is $image"); + if ( $target eq 'web' && $image !~ /^http:/ ) { + $image=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$image); + if (&Apache::lonnet::repcopy($image) ne OK) { + $image='/home/httpd/html/adm/lonKaputt/lonlogo_broken.gif'; + } + } + &Apache::lonxml::debug("image is $image"); if ( &Apache::response::show_answer() ) { if ($target eq 'tex') { $result.=$Apache::response::foilgroup{"$name.image"}."\\vskip 0 mm \n"; } else { - $result.="
\n"; + my $token=&prep_image($image,'answer',$name); + $result.="
\n"; } } else { if ($target eq 'tex') { $result.=$Apache::response::foilgroup{"$name.image"}."\\vskip 0 mm \n"; } else { - $result.="
\n"; + my $id=$Apache::inputtags::response['-1']; + my $token=&prep_image($image); + my $temp=1; + $result.="
\n"; } } $temp++; @@ -315,36 +373,6 @@ sub end_image { if ($target eq 'web') { my $image = &Apache::lonxml::endredirection; &Apache::lonxml::debug("original image is $image"); - my $id=$Apache::inputtags::response['-1']; - my $temp=1; - my $x=$ENV{"form.HWVAL_$id:$temp.x"}; - my $y=$ENV{"form.HWVAL_$id:$temp.y"}; - if (defined ($x) && defined ($y)) { - &Apache::lonxml::debug("x and y defined as $x,$y"); - my $currentImage = &Apache::randomlylabel::get_image('/home/httpd/html'.$image,1); - if (! defined($currentImage)) { - &Apache::lonnet::logthis('Unable to create image object for '.$image); - return ''; - } - my $red; - if (!($red = $currentImage->colorResolve(255,0,0))) { - $red = $currentImage->colorClosestHWB(255,0,0); - } - my $length = 6; - $currentImage->line($x-$length,$y-$length,$x+$length,$y+$length,$red); - $currentImage->line($x-$length,$y+$length,$x+$length,$y-$length,$red); - - my ($nameWOext) = ($image =~ /^.*\/(.*)\..*$/); - &Apache::lonxml::debug("graph name $nameWOext"); - my $webImageName = "/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_". - $nameWOext.'.png'; #needs to be more random or specific - my $newImageName = '/home/httpd'.$webImageName; - - my $imgfh = Apache::File->new('>'.$newImageName); - print $imgfh $currentImage->png; - $image = $webImageName; - } - &Apache::lonxml::debug("out image is $image"); if ( $Apache::imageresponse::conceptgroup && !&Apache::response::showallfoils()) { $Apache::response::conceptgroup{"$name.image"} = $image; @@ -431,7 +459,11 @@ sub end_image { my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat"; $temp_file = Apache::File->new('>>'.$filename); print $temp_file "$src\n"; - $Apache::response::foilgroup{"$name.image"} ='\vskip 0 mm \graphicspath{{/home/httpd/prtspool/}}\includegraphics[width='.$width_param.' mm]{'.$file.'} '; + $newsrc=~s/\/home\/httpd\/html\/res//; + $newsrc=~s/\/home\/([^\/]*)\/public_html\//\/$1\//; + $newsrc=~s/\/\.\//\//; + $newsrc=~s/\/([^\/]+)\.(ps|eps)/\//; + $Apache::response::foilgroup{"$name.image"} ='\vskip 0 mm \graphicspath{{/home/httpd/prtspool'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} '; } } return $result;