--- loncom/homework/caparesponse/caparesponse.pm 2003/11/25 14:37:11 1.124 +++ loncom/homework/caparesponse/caparesponse.pm 2004/02/19 19:24:38 1.126.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.124 2003/11/25 14:37:11 sakharuk Exp $ +# $Id: caparesponse.pm,v 1.126.2.1 2004/02/19 19:24:38 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -95,13 +95,15 @@ sub end_numericalresponse { if (!$Apache::lonxml::default_homework_loaded) { &Apache::lonxml::default_homework_load($safeeval); } + my $tag; + if (scalar(@$tagstack)) { $tag=$$tagstack[-1]; } if ( $target eq 'grade' && defined($ENV{'form.submitted'})) { - &Apache::response::setup_params($$tagstack[-1]); + &Apache::response::setup_params($tag); $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); my $partid = $Apache::inputtags::part; my $id = $Apache::inputtags::response['-1']; if ($Apache::lonhomework::type eq 'exam' && - $$tagstack[-1] eq 'formularesponse') { + $tag eq 'formularesponse') { $increment=&Apache::response::scored_response($partid,$id); } else { my $response = &Apache::response::getresponse(); @@ -142,13 +144,13 @@ sub end_numericalresponse { #sig fig don't make much sense either if (($Apache::lonhomework::type eq 'exam' || $ENV{'form.submitted'} eq 'scantron') && - $$tagstack[-1] eq 'numericalresponse') { + $tag eq 'numericalresponse') { $expression.=';my $sig=undef;'; } - if ($$tagstack[-1] eq 'formularesponse') { + if ($tag eq 'formularesponse') { $expression.=';my $type="fml";'; - } elsif ($$tagstack[-1] eq 'numericalresponse') { + } elsif ($tag eq 'numericalresponse') { $expression.=';my $type="float";'; } $expression.="');"; @@ -211,7 +213,11 @@ sub end_numericalresponse { my $partid=$Apache::inputtags::part; my $id=$Apache::inputtags::response[-1]; my $number_of_bubbles = &Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.numbubbles'); + if ($Apache::inputtags::params{'numbubbles'}) { + $number_of_bubbles = $Apache::inputtags::params{'numbubbles'}; + } if (!$number_of_bubbles) { $number_of_bubbles=8; } + my (@formats)=&Apache::lonxml::get_param_var('format',$parstack, $safeeval); my $unit=&Apache::lonxml::get_param_var('unit',$parstack, @@ -222,7 +228,7 @@ sub end_numericalresponse { $formats[0],\@incorrect); my @alphabet=('A'..'Z'); if ($target eq 'web') { - if ($$tagstack[-1] eq 'numericalresponse') { + if ($tag eq 'numericalresponse') { if ($unit=~/\S/) {$result.=' (in '.$unit.')

';} $result.= ''; my $previous=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.$id.submission"}; @@ -237,7 +243,7 @@ sub end_numericalresponse { $bubble_values[$ind].''; } $result.='
'; - } elsif ($$tagstack[-1] eq 'formularesponse') { + } elsif ($tag eq 'formularesponse') { $result.= '



'; @@ -246,20 +252,20 @@ sub end_numericalresponse { if ((defined $unit) and ($unit=~/\S/) and ($Apache::lonhomework::type eq 'exam')) { $result.=' \textit{(in} \verb|'.$unit.'|\textit{)} '; } - if ($$tagstack[-1] eq 'numericalresponse') { + if ($tag eq 'numericalresponse') { my ($celllength,$number_of_tables,@table_range)= - &get_table_sizes($formats[0],$number_of_bubbles); + &get_table_sizes($number_of_bubbles,\@bubble_values); my $j=0; my $cou=0; $result.='\vskip -1 mm \noindent \begin{enumerate}\item[\textbf{'.$Apache::lonxml::counter.'}.]'; for (my $i=0;$i<$number_of_tables;$i++) { $result.='\vskip -1 mm \noindent \begin{tabular}{'; for (my $ind=0;$ind<$table_range[$j];$ind++) { - $result.='lp{'.$celllength.' mm}'; + $result.='p{3 mm}p{'.$celllength.' mm}'; } $result.='}'; for (my $ind=$cou;$ind<$cou+$table_range[$j];$ind++) { - $result.='\hskip -3 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -2 mm & {\small '.$bubble_values[$ind].'} '; + $result.='\hskip -4 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$ & \hskip -3 mm {\small '.$bubble_values[$ind].'} '; if ($ind != $cou+$table_range[$j]-1) {$result.=' & ';} } $cou += $table_range[$j]; @@ -286,18 +292,20 @@ sub end_numericalresponse { my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; if ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); - $Apache::lonhomework::analyze{"$part_id.type"} = $$tagstack[-1]; + $Apache::lonhomework::analyze{"$part_id.type"} = $tag; my (@incorrect)=&Apache::lonxml::get_param_var('incorrect',$parstack,$safeeval); push (@{ $Apache::lonhomework::analyze{"$part_id.incorrect"} }, @incorrect); } - &Apache::response::setup_params($$tagstack[-1]); + if (scalar(@$tagstack)) { + &Apache::response::setup_params($tag); + } my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval); my (@formats)=&Apache::lonxml::get_param_var('format',$parstack,$safeeval); my $unit=&Apache::lonxml::get_param_var('unit',$parstack,$safeeval); my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval); if ($target eq 'answer') { - $result.=&Apache::response::answer_header($$tagstack[-1]); + $result.=&Apache::response::answer_header($tag); } for(my $i=0;$i<=$#answers;$i++) { my $ans=$answers[$i]; @@ -311,7 +319,7 @@ sub end_numericalresponse { if ($Apache::inputtags::params{'sig'}) { ($sighigh,$siglow)=&get_sigrange($Apache::inputtags::params{'sig'}); } - if ($fmt && $$tagstack[-1] eq 'numericalresponse') { + if ($fmt && $tag eq 'numericalresponse') { $fmt=~s/e/E/g; $ans = sprintf('%.'.$fmt,$ans); if ($high) { @@ -320,15 +328,15 @@ sub end_numericalresponse { } } if ($target eq 'answer') { - if ($high && $$tagstack[-1] eq 'numericalresponse') { $ans.=' ['.$low.','.$high.']'; } - if ($sighigh && $$tagstack[-1] eq 'numericalresponse') { + if ($high && $tag eq 'numericalresponse') { $ans.=' ['.$low.','.$high.']'; } + if ($sighigh && $tag eq 'numericalresponse') { if ($ENV{'form.answer_output_mode'} eq 'tex') { $ans.= " Sig $siglow - $sighigh"; } else { $ans.= " Sig $siglow - $sighigh"; } } - $result.=&Apache::response::answer_part($$tagstack[-1],$ans); + $result.=&Apache::response::answer_part($tag,$ans); } elsif ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"$part_id.answer"} }, $ans); if ($high) { @@ -338,25 +346,25 @@ sub end_numericalresponse { } } if (defined($unit) and ($unit ne '') and - $$tagstack[-1] eq 'numericalresponse') { + $tag eq 'numericalresponse') { if ($target eq 'answer') { if ($ENV{'form.answer_output_mode'} eq 'tex') { - $result.=&Apache::response::answer_part($$tagstack[-1], + $result.=&Apache::response::answer_part($tag, " Unit: $unit "); } else { - $result.=&Apache::response::answer_part($$tagstack[-1], + $result.=&Apache::response::answer_part($tag, "Unit: $unit"); } } elsif ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"$part_id.unit"} }, $unit); } } - if ($$tagstack[-1] eq 'formularesponse' && $target eq 'answer') { + if ($tag eq 'formularesponse' && $target eq 'answer') { my $samples=&Apache::lonxml::get_param('samples',$parstack,$safeeval); - $result.=&Apache::response::answer_part($$tagstack[-1],$samples); + $result.=&Apache::response::answer_part($tag,$samples); } if ($target eq 'answer') { - $result.=&Apache::response::answer_footer($$tagstack[-1]); + $result.=&Apache::response::answer_footer($tag); } } if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || @@ -368,23 +376,39 @@ sub end_numericalresponse { } sub get_table_sizes { - my ($format,$number_of_bubbles)=@_; - my $max_val = 0; - if ($format=~m/^(\d+)E([^\d]*)(\d*)$/) { - $max_val=$1+$2+4; + my ($number_of_bubbles,$rbubble_values)=@_; + my $scale=2; #mm for one digit + my $cell_width=0; + foreach my $member (@$rbubble_values) { + my $cell_width_real=0; + if ($member=~/(\d*)\.?(\d*)(E|e)(\+|-)?(\d*)/) { + $cell_width_real=(length($1)+length($2)+length($5)+9)*$scale; + } elsif ($member=~/(\d*)\.?(\d*)/) { + $cell_width_real=(length($1)+length($2)+2)*$scale; + } else { + $cell_width_real=(length($member)+1)*$scale; + } + if ($cell_width_real>$cell_width) {$cell_width=$cell_width_real;} + } + $cell_width+=8; + my $textwidth; + if ($ENV{'form.textwidth'} ne '') { + $ENV{'form.textwidth'}=~/(\d+)/; + $textwidth=$1; } else { - $max_val=4; + $ENV{'textwidth'}=~/(\d+)/; + $textwidth=$1; } - $max_val = int(0.9*$ENV{'form.textwidth'}/(($max_val+6)*2)); - my $celllength = 0.9*$ENV{'form.textwidth'}/$max_val-10; + my $bubbles_per_line=int($textwidth/$cell_width); + my $number_of_tables = int($number_of_bubbles/$bubbles_per_line); my @table_range = (); - my $number_of_tables = int($number_of_bubbles/$max_val); - for (my $i=0;$i<$number_of_tables;$i++) {push @table_range,$max_val;} - if ($number_of_bubbles % $max_val != 0) { + for (my $i=0;$i<$number_of_tables;$i++) {push @table_range,$bubbles_per_line;} + if ($number_of_bubbles % $bubbles_per_line) { $number_of_tables++; - push @table_range,($number_of_bubbles % $max_val); + push @table_range,($number_of_bubbles % $bubbles_per_line); } - return ($celllength,$number_of_tables,@table_range); + $cell_width-=8; + return ($cell_width,$number_of_tables,@table_range); } sub format_number { @@ -424,7 +448,8 @@ sub make_numerical_bubbles { my @oldseed=&Math::Random::random_get_seed(); if (defined($incorrect) && ref($incorrect)) { &Apache::lonxml::debug("inside ".(scalar(@$incorrect)+1 gt $number_of_bubbles)); - if (scalar(@$incorrect)+1 >= $number_of_bubbles) { + if (defined($$incorrect[0]) && + scalar(@$incorrect)+1 >= $number_of_bubbles) { &Apache::lonxml::debug("inside ".(scalar(@$incorrect)+1).":$number_of_bubbles"); &Apache::response::setrandomnumber(); my @rand_inc=&Math::Random::random_permutation(@$incorrect); @@ -437,7 +462,7 @@ sub make_numerical_bubbles { #FIXME what to do when not enough incorrects specified? } my @factors = (1.13,1.17,1.25,1.33,1.45); #default values of factors - my @powers = (1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0); #default values for powers + my @powers = (1..$number_of_bubbles); &Apache::response::setrandomnumber(); my $ind=&Math::Random::random_uniform_integer(1,0,$#powers); my $power = $powers[$ind]; @@ -531,7 +556,7 @@ sub end_stringresponse { &Apache::lonxml::default_homework_load($safeeval); } if ( $target eq 'grade' && defined($ENV{'form.submitted'})) { - &Apache::response::setup_params($$tagstack[-1]); + &Apache::response::setup_params('stringresponse'); $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); if ($Apache::lonhomework::type eq 'exam' || $ENV{'form.submitted'} eq 'scantron') { @@ -605,15 +630,15 @@ sub end_stringresponse { } elsif ($target eq 'answer' || $target eq 'analyze') { if ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"parts"} },"$part.$id"); - $Apache::lonhomework::analyze{"$part.$id.type"} = $$tagstack[-1]; + $Apache::lonhomework::analyze{"$part.$id.type"} = 'stringresponse'; } - &Apache::response::setup_params($$tagstack[-1]); + &Apache::response::setup_params('stringresponse'); if ($target eq 'answer') { - $result.=&Apache::response::answer_header($$tagstack[-1]); + $result.=&Apache::response::answer_header('stringresponse'); } # foreach my $ans (@answers) { if ($target eq 'answer') { - $result.=&Apache::response::answer_part($$tagstack[-1],$answer); + $result.=&Apache::response::answer_part('stringresponse',$answer); } elsif ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"$part.$id.answer"} }, $answer); @@ -631,10 +656,10 @@ sub end_stringresponse { } if ($target eq 'answer') { if ($ENV{'form.answer_output_mode'} eq 'tex') { - $result.=&Apache::response::answer_part($$tagstack[-1], + $result.=&Apache::response::answer_part('stringresponse', "$string"); } else { - $result.=&Apache::response::answer_part($$tagstack[-1], + $result.=&Apache::response::answer_part('stringresponse', "$string"); } } elsif ($target eq 'analyze') { @@ -642,7 +667,7 @@ sub end_stringresponse { $type); } if ($target eq 'answer') { - $result.=&Apache::response::answer_footer($$tagstack[-1]); + $result.=&Apache::response::answer_footer('stringresponse'); } } elsif ($target eq 'edit') { $result.=''.&Apache::edit::end_table;