--- loncom/homework/functionplotresponse.pm 2011/10/27 00:36:37 1.69 +++ loncom/homework/functionplotresponse.pm 2011/11/18 17:44:07 1.71 @@ -1,7 +1,7 @@ # LearningOnline Network with CAPA -# option list style responses +# Functionplot responses # -# $Id: functionplotresponse.pm,v 1.69 2011/10/27 00:36:37 www Exp $ +# $Id: functionplotresponse.pm,v 1.71 2011/11/18 17:44:07 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -35,6 +35,7 @@ use Apache::run; BEGIN { &Apache::lonxml::register('Apache::functionplotresponse',('functionplotresponse','backgroundplot','spline', + 'plotobject','plotvector', 'functionplotrule','functionplotruleset', 'functionplotelements')); } @@ -379,6 +380,59 @@ sub plot_script { } # +# Subroutine to produce objects +# + +sub plotobject_script { + my ($id,$label,$x,$y)=@_; + unless ($label) { + $Apache::functionplotresponse::counter++; + $label='O'.$Apache::functionplotresponse::counter; + } + return "document.ggbApplet_$id.evalCommand('a=1');\n". + "document.ggbApplet_$id.setVisible('a', false);\n". + "document.ggbApplet_$id.setLabelVisible('a', false);\n". + "document.ggbApplet_$id.evalCommand('$label=a*($x,$y)');\n". + "document.ggbApplet_$id.setVisible('$label', true);\n". + "document.ggbApplet_$id.setLabelVisible('$label', true);\n"; +} + +# +# Subroutine to produce vectors +# + +sub plotvector_script { + my ($id,$label,$xs,$ys,$xe,$ye)=@_; + unless ($label) { + $Apache::functionplotresponse::counter++; + $label='V'.$Apache::functionplotresponse::counter; + } + my $startlabel=$label.'Start'; + my $endlabel=$label.'End'; + my $pointlabel=$label.'Point'; + my $anglelabel=$label.'Angle'; + return(<<ENDVECTOR); +document.ggbApplet_$id.evalCommand("$startlabel=($xs,$ys)"); +document.ggbApplet_$id.setVisible("$startlabel",false); +document.ggbApplet_$id.setLabelVisible("$startlabel",false); +document.ggbApplet_$id.evalCommand("$endlabel=($xe,$ye)"); +document.ggbApplet_$id.setLabelVisible("$endlabel",false); +document.ggbApplet_$id.evalCommand("$label=Vector[$startlabel,$endlabel]"); +document.ggbApplet_$id.setLabelVisible("$label",true); +document.ggbApplet_$id.setLineThickness("$label",8); +// Displays the Angle +//document.ggbApplet1.evalCommand("Gravitypoint=(110,y(Gravitystart))"); //The x-value for this should be 2*(xmax-xmin)+xmax; +//document.ggbApplet1.evalCommand("GravityAngle=Angle[Gravitypoint,Gravitystart,Gravityend]"); +//document.ggbApplet1.setLabelVisible("GravityAngle",true); +//document.ggbApplet1.setLabelStyle("GravityAngle",VALUE=2); +// Keeps track of points we care about (This should use the same listener function we use in graph problems) +//document.ggbApplet1.registerObjectUpdateListener('Gravitystart','updatePointCoordinates'); +//document.ggbApplet1.registerObjectUpdateListener('Gravityend','updatePointCoordinates'); +//document.ggbApplet1.registerObjectUpdateListener('GravityAngle','updatePointCoordinates'); +ENDVECTOR +} + +# # Answer spline display # # points: x,y,slope_x,slope_y @@ -431,6 +485,107 @@ sub generate_spline { $result.='document.ggbApplet_'.$id.'.evalCommand("Spline'.$order.'['.join(',',@coords).']");'."\n"; return $result; } + +# +# Object +# + +sub start_plotobject { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result=''; + my $internalid = $Apache::inputtags::part.'_'.$Apache::inputtags::response[-1]; + my $x=&Apache::lonxml::get_param('x',$parstack,$safeeval); + my $y=&Apache::lonxml::get_param('y',$parstack,$safeeval); + my $label=&Apache::lonxml::get_param('label',$parstack,$safeeval); + $label=~s/\W//gs; + $label=ucfirst($label); + unless ($label) { $label="NewObject"; } + if ($target eq 'web') { + my ($xmin,$xmax,$ymin,$ymax)=&boundaries($parstack,$safeeval,-3); + unless (defined($x)) { $x=$xmin; } + unless (defined($y)) { $y=$ymin; } + $result.=&plotobject_script($internalid,$label,$x,$y); + } elsif ($target eq 'edit') { + $result=&Apache::edit::tag_start($target,$token,'Plot Object'). + &Apache::edit::text_arg('Label on Plot:','label', + $token,'16'). + &Apache::edit::text_arg('x:','x', + $token,'8'). + &Apache::edit::text_arg('y:','y', + $token,'8'). + &Apache::edit::end_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,'label','x','y'); + if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } + } + return $result; +} + +sub end_plotobject { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result=''; + if ($target eq 'edit') { + $result=&Apache::edit::end_table(); + } + return $result; +} + +# +# Vector +# + +sub start_plotvector { + 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 $tipx=&Apache::lonxml::get_param('tipx',$parstack,$safeeval); + my $tipy=&Apache::lonxml::get_param('tipy',$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($tipx)) { $tipx=$xmin; } + unless (defined($tipy)) { $tipy=$ymin; } + $result.=&plotvector_script($internalid,$label,$tailx,$taily,$tipx,$tipy); + } elsif ($target eq 'edit') { + $result=&Apache::edit::tag_start($target,$token,'Plot Vector'). + &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'). + &Apache::edit::text_arg('Tip x:','tipx', + $token,'8'). + &Apache::edit::text_arg('Tip y:','tipy', + $token,'8'). + + &Apache::edit::end_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,'label','tailx','taily','tipx','tipy'); + if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } + } + return $result; +} + +sub end_plotvector { + 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" /> #