--- loncom/homework/functionplotresponse.pm 2011/11/26 01:35:26 1.88 +++ loncom/homework/functionplotresponse.pm 2012/02/28 22:42:31 1.93 @@ -1,7 +1,7 @@ # LearningOnline Network with CAPA # Functionplot responses # -# $Id: functionplotresponse.pm,v 1.88 2011/11/26 01:35:26 www Exp $ +# $Id: functionplotresponse.pm,v 1.93 2012/02/28 22:42:31 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -38,6 +38,7 @@ BEGIN { &Apache::lonxml::register('Apache::functionplotresponse',('functionplotresponse','backgroundplot','spline', 'plotobject','plotvector', 'functionplotvectorrule','functionplotvectorsumrule', + 'drawvectorsum', 'functionplotcustomrule', 'functionplotrule','functionplotruleset', 'functionplotelements')); @@ -410,7 +411,7 @@ sub plotobject_script { # sub plotvector_script { - my ($id,$label,$xs,$ys,$xe,$ye,$xmin,$xmax)=@_; + my ($id,$label,$xs,$ys,$xe,$ye,$xmin,$xmax,$fixed)=@_; unless ($label) { $Apache::functionplotresponse::counter++; $label='V'.$Apache::functionplotresponse::counter; @@ -421,8 +422,8 @@ sub plotvector_script { my $pointx=2.*($xmax-$xmin)+$xmax; my $anglelabel=$label.'Angle'; return - &new_point_coordinate($id,$startlabel,$xs,$ys,0). - &new_point_coordinate($id,$endlabel,$xe,$ye,0). + &new_point_coordinate($id,$startlabel,$xs,$ys,$fixed). + &new_point_coordinate($id,$endlabel,$xe,$ye,$fixed). (<<ENDVECTOR); document.ggbApplet_$id.evalCommand("$label=Vector[$startlabel,$endlabel]"); document.ggbApplet_$id.setLabelVisible("$label",true); @@ -556,7 +557,9 @@ sub start_plotvector { unless (defined($taily)) { $taily=$ymin; } unless (defined($tipx)) { $tipx=$xmin; } unless (defined($tipy)) { $tipy=$ymin; } - $result.=&plotvector_script($internalid,$label,$tailx,$taily,$tipx,$tipy,$xmin,$xmax); + my $fixed=0; + if ((&Apache::response::show_answer()) || (&Apache::response::check_status()>=2)) { $fixed=1; } + $result.=&plotvector_script($internalid,$label,$tailx,$taily,$tipx,$tipy,$xmin,$xmax,$fixed); } elsif ($target eq 'edit') { $result=&Apache::edit::tag_start($target,$token,'Plot Vector'). &Apache::edit::text_arg('Label on Plot:','label', @@ -589,6 +592,83 @@ sub end_plotvector { } +# +# Vector sum - have GeoGebra draw a sum of specified vectors to help students draw +# + +sub start_drawvectorsum { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result=''; + my $internalid = $Apache::inputtags::part.'_'.$Apache::inputtags::response[-1]; + my $tailx=&Apache::lonxml::get_param('tailx',$parstack,$safeeval); + my $taily=&Apache::lonxml::get_param('taily',$parstack,$safeeval); + my $vectorlist=&Apache::lonxml::get_param('vectorlist',$parstack,$safeeval); + my $label=&Apache::lonxml::get_param('label',$parstack,$safeeval); + $label=~s/\W//gs; + $label=ucfirst($label); + unless ($label) { $label="NewVector"; } + if ($target eq 'web') { + my ($xmin,$xmax,$ymin,$ymax)=&boundaries($parstack,$safeeval,-3); + unless (defined($tailx)) { $tailx=$xmin; } + unless (defined($taily)) { $taily=$ymin; } + unless (defined($vectorlist)) { $vectorlist=''; } + my @vectors=split(/\,/,$vectorlist); + if ($#vectors>0) { + my @sumx=(); + my @sumy=(); + foreach my $thisvector (@vectors) { + $thisvector=~s/\W//gs; + $thisvector=ucfirst($thisvector); + unless ($thisvector) { next; } + my $vectorx=$thisvector.'X'; + my $vectory=$thisvector.'Y'; + $result.=(<<ENDADDVEC); +document.ggbApplet_$internalid.evalCommand("$vectorx=x($thisvector)"); +document.ggbApplet_$internalid.evalCommand("$vectory=y($thisvector)"); +document.ggbApplet_$internalid.evalCommand("Include$thisvector$label=Checkbox[]"); +ENDADDVEC + push(@sumx,"If[Include$thisvector$label,$vectorx,0]"); + push(@sumy,"If[Include$thisvector$label,$vectory,0]"); + } + $result.="document.ggbApplet_$internalid.evalCommand(".'"'."xTot$label=".join('+',@sumx).'");'."\n"; + $result.="document.ggbApplet_$internalid.evalCommand(".'"'."yTot$label=".join('+',@sumy).'");'."\n"; + $result.=(<<ENDMAKEVECTOR); +document.ggbApplet_$internalid.evalCommand("$label=Vector[($tailx,$taily),($tailx+xTot$label,$taily+yTot$label)]"); +document.ggbApplet_$internalid.setLabelVisible("$label",true); +document.ggbApplet_$internalid.setLineThickness("$label",8); +document.ggbApplet_$internalid.setColor("$label",255,0,0); +ENDMAKEVECTOR + } + } elsif ($target eq 'edit') { + $result=&Apache::edit::tag_start($target,$token,'Draw Vector Sum'). + &Apache::edit::text_arg('Label on Plot:','label', + $token,'16'). + &Apache::edit::text_arg('Tail x:','tailx', + $token,'8'). + &Apache::edit::text_arg('Tail y:','taily', + $token,'8').'<br />'. + &Apache::edit::text_arg('Vector List:','vectorlist', + $token,'40'). + &Apache::edit::end_row(); + } elsif ($target eq 'modified') { + $env{'form.'.&Apache::edit::html_element_name('label')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('label')}); + my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,'label','tailx','taily','vectorlist'); + if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } + } + return $result; +} + + +sub end_drawvectorsum { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result=''; + if ($target eq 'edit') { + $result=&Apache::edit::end_table(); + } + return $result; +} + + # # <backgroundplot function="..." fixed="yes/no" /> @@ -1289,27 +1369,16 @@ sub start_functionplotresponse { ($env{'form.answer_output_mode'} ne 'tex') && ($Apache::lonhomework::viewgrades == 'F')) { my (undef,undef,$udom,$uname)=&Apache::lonnet::whichuser(); - my $windowopen=&Apache::lonhtmlcommon::javascript_docopen(); - my $start_page = &Apache::loncommon::start_page('Rules Log', undef, - {'only_body' => 1, - 'bgcolor' => '#FFFFFF', - 'js_ready' => 1,}); - my $end_page = &Apache::loncommon::end_page({'js_ready' => 1,}); $uname =~s/\W//g; $udom =~s/\W//g; my $function_name = join('_','LONCAPA_scriptvars',$uname,$udom, $env{'form.counter'},$Apache::lonxml::curdepth); - my $rules_var ="<script type=\"text/javascript\"> -// <![CDATA[ - function $function_name() {newWindow=open('','new_W','width=500,height=500,scrollbars=1,resizable=yes');newWindow.$windowopen;newWindow.document.writeln('$start_page<pre>". - $Apache::functionplotresponse::ruleslog. - "<\\/pre>$end_page');newWindow.document.close();newWindow.focus()} -// ]]> -</script><a href=\"javascript:$function_name();void(0);\">".&mt('Rules Log')."</a><br />"; - &Apache::lonxml::add_script_result($rules_var); - } - + &Apache::lonxml::add_script_result( + &Apache::loncommon::modal_adhoc_window($function_name,700,500, + '<pre>'.$Apache::functionplotresponse::ruleslog.'</pre>', + &mt('Rules Log'))."<br />"); + } return $result; } @@ -1680,7 +1749,7 @@ sub functionplotrulecheck { # # Evaluate the value # - if ($value=~/\D/) { + if (($value=~/\D/) && ($value ne 'undef')) { $Apache::functionplotresponse::fpr_xmin=$xmin; $Apache::functionplotresponse::fpr_xmax=$xmax; $value=&Apache::run::run($value,$safeeval);