--- loncom/homework/functionplotresponse.pm	2011/12/26 01:48:10	1.91
+++ 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.91 2011/12/26 01:48:10 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" />