--- loncom/homework/imageresponse.pm 2002/07/29 20:43:47 1.20 +++ loncom/homework/imageresponse.pm 2003/08/01 15:50:43 1.34 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # image click response style # -# $Id: imageresponse.pm,v 1.20 2002/07/29 20:43:47 albertel Exp $ +# $Id: imageresponse.pm,v 1.34 2003/08/01 15:50:43 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,11 +25,16 @@ # # http://www.lon-capa.org/ # - -#FIXME assumes multiple possbile submissions but only one is possible currently +# July,August 2003 H. K. Ng +# +#FIXME LATER assumes multiple possible submissions but only one is possible +#currently package Apache::imageresponse; +use Apache::randomlylabel; use strict; +use Image::Magick; +use GD; BEGIN { &Apache::lonxml::register('Apache::imageresponse',('imageresponse')); @@ -49,10 +54,13 @@ sub start_imageresponse { } sub end_imageresponse { - &Apache::response::end_response; - pop @Apache::lonxml::namespace; - &Apache::lonxml::deregister('Apache::imageresponse',('foilgroup','foil','text','image','rectangle','conceptgroup')); - return ''; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + &Apache::response::end_response; + 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(); } + return $result; } %Apache::response::foilgroup=(); @@ -84,7 +92,7 @@ sub whichfoils { if (&Apache::response::showallfoils()) { $aopt=0; } else { - $aopt=int(rand($#names+1)); + $aopt=int(&Math::Random::random_uniform() * ($#names+1)); } &Apache::lonxml::debug("From $#names elms, picking $aopt"); $aopt=splice(@names,$aopt,1); @@ -95,17 +103,28 @@ sub whichfoils { } sub displayfoils { - my (@whichopt) = @_; + my ($target,@whichopt) = @_; my $result =''; my $name; my $temp=1; foreach $name (@whichopt) { - $result.=$Apache::response::foilgroup{"$name.text"}."
\n"; + $result.=$Apache::response::foilgroup{"$name.text"}; + &Apache::lonxml::debug("Text is $result"); + 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 ($Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"} =~ /^correct/ ) { - $result.="
\n"; + if ($target eq 'tex') { + $result.=$Apache::response::foilgroup{"$name.image"}."\\vskip 0 mm \n"; + } else { + $result.="
\n"; + } } else { - $result.="
\n"; + if ($target eq 'tex') { + $result.=$Apache::response::foilgroup{"$name.image"}."\\vskip 0 mm \n"; + } else { + $result.="
\n"; + } } $temp++; } @@ -123,7 +142,8 @@ sub gradefoils { $x=$ENV{"form.HWVAL_$id:$temp.x"}; $y=$ENV{"form.HWVAL_$id:$temp.y"}; &Apache::lonxml::debug("Got a x of $x and a y of $y for $name"); - if (defined(@{ $Apache::response::foilgroup{"$name.area"} })) { + if (defined($x) && defined($y) && + defined(@{ $Apache::response::foilgroup{"$name.area"} })) { my @areas = @{ $Apache::response::foilgroup{"$name.area"} }; my $grade="INCORRECT"; foreach my $area (@areas) { @@ -154,19 +174,18 @@ sub end_foilgroup { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; my @whichopt; - if ($target eq 'web' || $target eq 'grade') { + if ($target eq 'web' || $target eq 'grade' || $target eq 'tex') { 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') { - $result=&displayfoils(@whichopt); - } - if ($target eq 'grade') { - if ( defined $ENV{'form.submitted'}) { - &gradefoils(@whichopt); - } + if ($target eq 'web' || $target eq 'tex') { + $result=&displayfoils($target,@whichopt); + } elsif ($target eq 'grade') { + if ( defined $ENV{'form.submitted'}) { &gradefoils(@whichopt); } + } + } elsif ($target eq 'edit') { + $result=&Apache::edit::end_table(); } return $result; } @@ -179,11 +198,12 @@ sub start_conceptgroup { sub end_conceptgroup { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - $Apache::imageresponse::conceptgroup=0; - if ($target eq 'web' || $target eq 'grade') { + $Apache::imageresponse::conceptgroup=0; + my $result; + if ($target eq 'web' || $target eq 'grade' || $target eq 'tex') { if (defined(@{ $Apache::response::conceptgroup{'names'} })) { my @names = @{ $Apache::response::conceptgroup{'names'} }; - my $pick=int(rand($#names+1)); + my $pick=int(&Math::Random::random_uniform() * ($#names+1)); my $name=$names[$pick]; if (defined(@{ $Apache::response::conceptgroup{"$name.area"} })) { push @{ $Apache::response::foilgroup{'names'} }, $name; @@ -195,14 +215,26 @@ sub end_conceptgroup { &Apache::lonxml::debug("Selecting $name in $concept"); } } + } elsif ($target eq 'edit') { + $result=&Apache::edit::end_table(); } - return ''; + return $result; +} + +sub insert_foil { + return ' + + + + + +'; } $Apache::imageresponse::curname=''; sub start_foil { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - if ($target eq 'web' || $target eq 'grade') { + if ($target eq 'web' || $target eq 'grade' || $target eq 'tex') { my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval); if ($name eq '') { $name=$Apache::lonxml::curdepth; } if ( $Apache::imageresponse::conceptgroup @@ -217,19 +249,36 @@ sub start_foil { } sub end_foil { - my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - return ''; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result; + if ($target eq 'edit') { + $result=&Apache::edit::end_table(); + } + return $result; } sub start_text { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - if ($target eq 'web') { &Apache::lonxml::startredirection; } - return ''; + my $result=''; + if ($target eq 'web' || $target eq 'tex') { + &Apache::lonxml::startredirection; + } elsif ($target eq 'edit') { + my $descr=&Apache::lonxml::get_all_text('/text',$parser); + $result=&Apache::edit::tag_start($target,$token,'Task Description'). + &Apache::edit::editfield($token->[1],$descr,'Text',60,2). + &Apache::edit::end_row(); + } elsif ($target eq "modified") { + my $descr=&Apache::lonxml::get_all_text('/text',$parser); + $result=$token->[4].&Apache::edit::modifiedfield($token); + &Apache::lonxml::debug($result); + } + return $result; } sub end_text { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - if ($target eq 'web') { + my $result; + if ($target eq 'web' || $target eq 'tex') { my $name = $Apache::imageresponse::curname; if ( $Apache::imageresponse::conceptgroup && !&Apache::response::showallfoils() ) { @@ -237,29 +286,80 @@ sub end_text { } else { $Apache::response::foilgroup{"$name.text"} = &Apache::lonxml::endredirection; } + } elsif ($target eq 'edit') { + $result=&Apache::edit::end_table(); } - return ''; + return $result; } sub start_image { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - if ($target eq 'web' || $target eq 'tex') { &Apache::lonxml::startredirection; } - return ''; + my $result=''; + if ($target eq 'web' || $target eq 'tex') { + &Apache::lonxml::startredirection; + } elsif ($target eq 'edit') { + my $bgimg=&Apache::lonxml::get_all_text('/image',$parser); + $Apache::edit::bgimgsrc=$bgimg; + $Apache::edit::bgimgsrcdepth=$Apache::lonxml::curdepth; + + $result=&Apache::edit::tag_start($target,$token,'Clickable Image'). + &Apache::edit::editline($token->[1],$bgimg,'Image Source File',40); + $result.=&Apache::edit::browse(undef,'textnode').' '; + $result.=&Apache::edit::search(undef,'textnode'). + &Apache::edit::end_row(); + } elsif ($target eq "modified") { + my $bgimg=&Apache::lonxml::get_all_text('/image',$parser); + $result=$token->[4].&Apache::edit::modifiedfield($token); + &Apache::lonxml::debug($result); + } + return $result; } sub end_image { - my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - my $currentstring = ''; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result; + my $name = $Apache::imageresponse::curname; if ($target eq 'web') { - my $name = $Apache::imageresponse::curname; my $image = &Apache::lonxml::endredirection; - &Apache::lonxml::debug("out is $image"); + &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; } else { $Apache::response::foilgroup{"$name.image"} = $image; } + } elsif ($target eq 'edit') { + $result=&Apache::edit::end_table(); } elsif ($target eq 'tex') { my $src = &Apache::lonxml::endredirection; $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src); @@ -307,8 +407,8 @@ sub end_image { $path = $1.'/'; } my $newsrc = $src; - $newsrc =~ s/(\.gif|\.jpg)$/\.eps/i; - $file=~s/(\.gif|\.jpg)$/\.eps/i; + $newsrc =~ s/(\.gif|\.jpg|\.jpeg)$/\.eps/i; + $file=~s/(\.gif|\.jpg|\.jpeg)$/\.eps/i; #do we have any specified size of the picture? my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval); my $TeXheight = &Apache::lonxml::get_param('TeXheight',$parstack,$safeeval); @@ -323,23 +423,36 @@ sub end_image { #where can we find the picture? if (-e $newsrc) { if ($path) { - $currentstring .= '\vskip 0 mm \noindent\graphicspath{{'.$path.'}}\fbox{\includegraphics[width='.$width_param.' mm]{'.$file.'}} '; + $Apache::response::foilgroup{"$name.image"} ='\vskip 0 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} '; } } else { my $temp_file; my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat"; $temp_file = Apache::File->new('>>'.$filename); print $temp_file "$src\n"; - $currentstring .= '\vskip 0 mm \graphicspath{{/home/httpd/prtspool/}}\fbox{\includegraphics[width='.$width_param.' mm]{'.$file.'}} '; +$Apache::response::foilgroup{"$name.image"} ='\vskip 0 mm \graphicspath{{/home/httpd/prtspool/}}\includegraphics[width='.$width_param.' mm]{'.$file.'} '; } - } - return $currentstring; + } + return $result; } sub start_rectangle { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - if ($target eq 'web' || $target eq 'grade') { &Apache::lonxml::startredirection; } - return ''; + my $result=''; + if ($target eq 'web' || $target eq 'grade' || $target eq 'tex') { + &Apache::lonxml::startredirection; + } elsif ($target eq 'edit') { + my $coords=&Apache::lonxml::get_all_text('/rectangle',$parser); + $result=&Apache::edit::tag_start($target,$token,'Rectangle'). + &Apache::edit::editline($token->[1],$coords,'Coordinate Pairs',40). + &Apache::edit::entercoordpair(undef,'textnode'). + &Apache::edit::end_row(); + } elsif ($target eq "modified") { + my $coords=&Apache::lonxml::get_all_text('/rectangle',$parser); + $result=$token->[4].&Apache::edit::modifiedfield($token); + &Apache::lonxml::debug($result); + } + return $result; } sub grade_rectangle { @@ -361,7 +474,8 @@ sub grade_rectangle { sub end_rectangle { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - if ($target eq 'web' || $target eq 'grade') { + my $result; + if ($target eq 'web' || $target eq 'grade' || $target eq 'tex') { my $name = $Apache::imageresponse::curname; my $area = &Apache::lonxml::endredirection; &Apache::lonxml::debug("out is $area for $name"); @@ -371,8 +485,10 @@ sub end_rectangle { } else { push @{ $Apache::response::foilgroup{"$name.area"} },"rectangle:$area"; } + } elsif ($target eq 'edit') { + $result=&Apache::edit::end_table(); } - return ''; + return $result; } 1; __END__