Diff for /loncom/homework/imageresponse.pm between versions 1.16 and 1.26

version 1.16, 2002/01/17 12:23:31 version 1.26, 2003/05/05 22:36:54
Line 26 Line 26
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
   
 #FIXME assumes multiple possbile submissions but only one is possible currently  #FIXME LATER assumes multiple possible submissions but only one is possible 
   #currently
   
 package Apache::imageresponse;  package Apache::imageresponse;
 use strict;  use strict;
   use Image::Magick;
   
 BEGIN {  BEGIN {
   &Apache::lonxml::register('Apache::imageresponse',('imageresponse'));    &Apache::lonxml::register('Apache::imageresponse',('imageresponse'));
Line 55  sub end_imageresponse { Line 57  sub end_imageresponse {
   return '';    return '';
 }  }
   
 %Apache::response::foilgroup={};  %Apache::response::foilgroup=();
 sub start_foilgroup {  sub start_foilgroup {
   %Apache::response::foilgroup={};    %Apache::response::foilgroup=();
   $Apache::imageresponse::conceptgroup=0;    $Apache::imageresponse::conceptgroup=0;
   &Apache::response::setrandomnumber();    &Apache::response::setrandomnumber();
   return '';    return '';
Line 69  sub getfoilcounts { Line 71  sub getfoilcounts {
   my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');    my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');
   # +1 since instructors will count from 1    # +1 since instructors will count from 1
   my $count = $#{ $Apache::response::foilgroup{'names'} }+1;    my $count = $#{ $Apache::response::foilgroup{'names'} }+1;
     if (&Apache::response::showallfoils()) { $max=$count; }
   return ($count,$max);    return ($count,$max);
 }  }
   
Line 79  sub whichfoils { Line 82  sub whichfoils {
   my @whichopt =();    my @whichopt =();
   while ((($#whichopt+1) < $max) && ($#names > -1)) {    while ((($#whichopt+1) < $max) && ($#names > -1)) {
     &Apache::lonxml::debug("Have $#whichopt max is $max");      &Apache::lonxml::debug("Have $#whichopt max is $max");
     my $aopt=int(rand($#names+1));      my $aopt;
       if (&Apache::response::showallfoils()) {
         $aopt=0;
       } else {
         $aopt=int(&Math::Random::random_uniform() * ($#names+1));
       }
     &Apache::lonxml::debug("From $#names elms, picking $aopt");      &Apache::lonxml::debug("From $#names elms, picking $aopt");
     $aopt=splice(@names,$aopt,1);      $aopt=splice(@names,$aopt,1);
     &Apache::lonxml::debug("Picked $aopt");      &Apache::lonxml::debug("Picked $aopt");
Line 89  sub whichfoils { Line 97  sub whichfoils {
 }  }
   
 sub displayfoils {  sub displayfoils {
   my (@whichopt) = @_;    my ($target,@whichopt) = @_;
   my $result ='';    my $result ='';
   my $name;    my $name;
   my $temp=1;    my $temp=1;
   foreach $name (@whichopt) {    foreach $name (@whichopt) {
     $result.=$Apache::response::foilgroup{"$name.text"}."<br />\n";      $result.=$Apache::response::foilgroup{"$name.text"};
       if ($target eq 'tex') {$result.="\\vskip 0 mm \n";} else {$result.="<br />\n";}
     my $image=$Apache::response::foilgroup{"$name.image"};      my $image=$Apache::response::foilgroup{"$name.image"};
     if ($Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"} =~ /^correct/ ) {      if ($Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"} =~ /^correct/ ) {
       $result.="<img src=\"$image\"/> <br />\n";        if ($target eq 'tex') {
    $result.=$Apache::response::foilgroup{"$name.image"}."\\vskip 0 mm \n";
         } else {
           $result.="<img src=\"$image\"/> <br />\n";
         }
     } else {      } else {
       $result.="<input type=\"image\" name=\"HWVAL_$Apache::inputtags::response['-1']:$temp\" src=\"$image\"/> <br />\n";        if ($target eq 'tex') {
    $result.=$Apache::response::foilgroup{"$name.image"}."\\vskip 0 mm \n";
         } else {
           $result.="<input type=\"image\" name=\"HWVAL_$Apache::inputtags::response['-1']:$temp\" src=\"$image\"/> <br />\n";
         }
     }      }
     $temp++;      $temp++;
   }    }
Line 108  sub displayfoils { Line 125  sub displayfoils {
   
 sub gradefoils {  sub gradefoils {
   my (@whichopt) = @_;    my (@whichopt) = @_;
   my $result='';  
   my $x;    my $x;
   my $y;    my $y;
   my $result;    my $result;
Line 149  sub end_foilgroup { Line 165  sub end_foilgroup {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $result='';    my $result='';
   my @whichopt;    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);      my ($count,$max) = &getfoilcounts($parstack,$safeeval);
     if ($count>$max) { $count=$max }      if ($count>$max) { $count=$max }
     &Apache::lonxml::debug("Count is $count from $max");      &Apache::lonxml::debug("Count is $count from $max");
     @whichopt = &whichfoils($max);      @whichopt = &whichfoils($max);
   }    } elsif ($target eq 'web' || $target eq 'tex') {
   if ($target eq 'web') {      $result=&displayfoils($target,@whichopt);
     $result=&displayfoils(@whichopt);    } elsif ($target eq 'grade') {
   }  
   if ($target eq 'grade') {  
     if ( defined $ENV{'form.submitted'}) {      if ( defined $ENV{'form.submitted'}) {
       &gradefoils(@whichopt);        &gradefoils(@whichopt);
     }      }
     } elsif ($target eq 'edit') {
         $result=&Apache::edit::end_table();
   }    }
   return $result;    return $result;
 }  }
   
 sub start_conceptgroup {  sub start_conceptgroup {
   $Apache::imageresponse::conceptgroup=1;    $Apache::imageresponse::conceptgroup=1;
   %Apache::response::conceptgroup={};    %Apache::response::conceptgroup=();
   return '';    return '';
 }  }
   
 sub end_conceptgroup {  sub end_conceptgroup {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   $Apache::imageresponse::conceptgroup=0;      $Apache::imageresponse::conceptgroup=0;
   if ($target eq 'web' || $target eq 'grade') {    my $result;
     if ($target eq 'web' || $target eq 'grade' || $target eq 'tex') {
     if (defined(@{ $Apache::response::conceptgroup{'names'} })) {      if (defined(@{ $Apache::response::conceptgroup{'names'} })) {
       my @names = @{ $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];        my $name=$names[$pick];
       if (defined(@{ $Apache::response::conceptgroup{"$name.area"} })) {        if (defined(@{ $Apache::response::conceptgroup{"$name.area"} })) {
  push @{ $Apache::response::foilgroup{'names'} }, $name;   push @{ $Apache::response::foilgroup{'names'} }, $name;
Line 190  sub end_conceptgroup { Line 207  sub end_conceptgroup {
  &Apache::lonxml::debug("Selecting $name in $concept");   &Apache::lonxml::debug("Selecting $name in $concept");
       }        }
     }      }
     } elsif ($target eq 'edit') {
         $result=&Apache::edit::end_table();
   }    }
   return '';    return $result;
 }  }
   
 $Apache::imageresponse::curname='';  $Apache::imageresponse::curname='';
 sub start_foil {  sub start_foil {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    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);      my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
     if ($name eq '') { $name=$Apache::lonxml::curdepth; }      if ($name eq '') { $name=$Apache::lonxml::curdepth; }
     if ( $Apache::imageresponse::conceptgroup ) {      if ( $Apache::imageresponse::conceptgroup
    && !&Apache::response::showallfoils()) {
       push(@{ $Apache::response::conceptgroup{'names'} }, $name);        push(@{ $Apache::response::conceptgroup{'names'} }, $name);
     } else {      } else {
       push(@{ $Apache::response::foilgroup{'names'} }, $name);        push(@{ $Apache::response::foilgroup{'names'} }, $name);
Line 211  sub start_foil { Line 231  sub start_foil {
 }  }
   
 sub end_foil {  sub end_foil {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   return '';      my $result;
       if ($target eq 'edit') {
    $result=&Apache::edit::end_table();
       }
       return $result;
 }  }
   
 sub start_text {  sub start_text {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   if ($target eq 'web') { &Apache::lonxml::startredirection; }    my $result='';
   return '';    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 {  sub end_text {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    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;      my $name = $Apache::imageresponse::curname;
     if ( $Apache::imageresponse::conceptgroup ) {      if ( $Apache::imageresponse::conceptgroup
          && !&Apache::response::showallfoils() ) {
       $Apache::response::conceptgroup{"$name.text"} = &Apache::lonxml::endredirection;        $Apache::response::conceptgroup{"$name.text"} = &Apache::lonxml::endredirection;
     } else {      } else {
       $Apache::response::foilgroup{"$name.text"} = &Apache::lonxml::endredirection;        $Apache::response::foilgroup{"$name.text"} = &Apache::lonxml::endredirection;
     }      }
     } elsif ($target eq 'edit') {
         $result=&Apache::edit::end_table();
   }    }
   return '';    return $result;
 }  }
   
 sub start_image {  sub start_image {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   if ($target eq 'web') { &Apache::lonxml::startredirection; }    my $result='';
   return '';    if ($target eq 'web' || $target eq 'tex') { 
         &Apache::lonxml::startredirection; 
     } elsif ($target eq 'edit') {
       my $bgimg=&Apache::lonxml::get_all_text('/image',$parser);
       $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 {  sub end_image {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;
     my $name = $Apache::imageresponse::curname;
   if ($target eq 'web') {    if ($target eq 'web') {
     my $name = $Apache::imageresponse::curname;  
     my $image = &Apache::lonxml::endredirection;      my $image = &Apache::lonxml::endredirection;
     &Apache::lonxml::debug("out is $image");      &Apache::lonxml::debug("out is $image");
     if ( $Apache::imageresponse::conceptgroup ) {      if ( $Apache::imageresponse::conceptgroup
    && !&Apache::response::showallfoils()) {
       $Apache::response::conceptgroup{"$name.image"} = $image;        $Apache::response::conceptgroup{"$name.image"} = $image;
     } else {      } else {
       $Apache::response::foilgroup{"$name.image"} = $image;        $Apache::response::foilgroup{"$name.image"} = $image;
     }      }
   }    } elsif ($target eq 'edit') {
   return '';        $result=&Apache::edit::end_table();
     } elsif ($target eq 'tex') {
       my $src = &Apache::lonxml::endredirection;
       $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
       my $width_param = '';
       my $height_param = '';
       my $scaling = .3;
       my $image = Image::Magick->new;
       my $current_figure = $image->Read($src);
       $width_param = $image->Get('width') * $scaling;;
       $height_param = $image->Get('height') * $scaling;;
       undef $image;
       my $epssrc = $src;
       $epssrc =~ s/(\.gif|\.jpg)$/\.eps/i;
       if (not -e $epssrc) {
    my $localfile = $epssrc;
    $localfile =~ s/.*(\/res)/$1/;
    my $file;
    my $path;
    if ($localfile =~ m!(.*)/([^/]*)$!) {
       $file = $2;
       $path = $1.'/'; 
    }
    my $signal_eps = 0;
    my @content_directory = &Apache::lonnet::dirlist($path);
    for (my $iy=0;$iy<=$#content_directory;$iy++) {
       my @tempo_array = split(/&/,$content_directory[$iy]);
       $content_directory[$iy] = $tempo_array[0];
       if ($file eq $tempo_array[0]) {
    $signal_eps = 1;
    last;
       }
    }
    if ($signal_eps) {
       my $eps_file = &Apache::lonnet::getfile($localfile);
    } else {
       $localfile = $src;
       $localfile =~ s/.*(\/res)/$1/;
       my $as = &Apache::lonnet::getfile($src);      
    }
       }
       my $file;
       my $path;
       if ($src =~ m!(.*)/([^/]*)$!) {
    $file = $2;
    $path = $1.'/'; 
       }
       my $newsrc = $src;
       $newsrc =~ s/(\.gif|\.jpg)$/\.eps/i;
       $file=~s/(\.gif|\.jpg)$/\.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); 
       my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval);
       if ($TeXwidth ne '') { 
    $width_param = $TeXwidth; 
       } elsif ($TeXheight ne '') { 
    $width_param = $TeXheight/$height_param*$width_param;
       } elsif ($width ne '') {
    $width_param = $width*$scaling;      
       }
       #where can we find the picture?
       if (-e $newsrc) {
    if ($path) {
     $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";
   $Apache::response::foilgroup{"$name.image"} ='\vskip 0 mm \graphicspath{{/home/httpd/prtspool/}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
       }
     } 
     return $result;
 }  }
   
 sub start_rectangle {  sub start_rectangle {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   if ($target eq 'web' || $target eq 'grade') { &Apache::lonxml::startredirection; }    my $result='';
   return '';    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::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 {  sub grade_rectangle {
Line 272  sub grade_rectangle { Line 414  sub grade_rectangle {
   &Apache::lonxml::debug("Point $x1,$y1,$x2,$y2");    &Apache::lonxml::debug("Point $x1,$y1,$x2,$y2");
   if ($x1 > $x2) { my $temp=$x1;$x1=$x2;$x2=$temp; }    if ($x1 > $x2) { my $temp=$x1;$x1=$x2;$x2=$temp; }
   if ($y1 > $y2) { my $temp=$y1;$y1=$y2;$y2=$temp; }    if ($y1 > $y2) { my $temp=$y1;$y1=$y2;$y2=$temp; }
   if ($x => $x1) { if ($x <= $x2) { if ($y => $y1) { if ($y <= $y2) { return 'APPROX_ANS'; } } } }    if (($x >= $x1) && ($x <= $x2) && ($y >= $y1) && ($y <= $y2)) {
       return 'APPROX_ANS';
     }
   return 'INCORRECT';    return 'INCORRECT';
 }  }
   
 sub end_rectangle {  sub end_rectangle {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    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 $name = $Apache::imageresponse::curname;
     my $area = &Apache::lonxml::endredirection;      my $area = &Apache::lonxml::endredirection;
     &Apache::lonxml::debug("out is $area for $name");      &Apache::lonxml::debug("out is $area for $name");
     if ( $Apache::imageresponse::conceptgroup ) {      if ( $Apache::imageresponse::conceptgroup
    && !&Apache::response::showallfoils()) {
       push @{ $Apache::response::conceptgroup{"$name.area"} },"rectangle:$area";        push @{ $Apache::response::conceptgroup{"$name.area"} },"rectangle:$area";
     } else {      } else {
       push @{ $Apache::response::foilgroup{"$name.area"} },"rectangle:$area";        push @{ $Apache::response::foilgroup{"$name.area"} },"rectangle:$area";
     }      }
     } elsif ($target eq 'edit') {
         $result=&Apache::edit::end_table();
   }    }
   return '';    return $result;
 }  }
 1;  1;
 __END__  __END__

Removed from v.1.16  
changed lines
  Added in v.1.26


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>