version 1.80, 2011/11/21 02:34:58
|
version 1.83, 2011/11/21 20:48:50
|
Line 654 sub start_functionplotrule {
|
Line 654 sub start_functionplotrule {
|
} else { |
} else { |
$label='R'.$label; |
$label='R'.$label; |
} |
} |
if ($Apache::functionplotresponse::splineorder{$label}) { |
|
&Apache::lonxml::error(&mt('Rule indices must be unique.')); |
|
} |
|
|
|
|
|
if ($target eq 'grade') { |
if ($target eq 'grade') { |
# Simply remember - in order - for later |
# Simply remember - in order - for later |
Line 772 sub start_functionplotvectorrule {
|
Line 768 sub start_functionplotvectorrule {
|
} else { |
} else { |
$label='R'.$label; |
$label='R'.$label; |
} |
} |
if ($Apache::functionplotresponse::splineorder{$label}) { |
|
&Apache::lonxml::error(&mt('Rule indices must be unique.')); |
|
} |
|
|
|
if ($target eq 'grade') { |
if ($target eq 'grade') { |
# Simply remember - in order - for later |
# Simply remember - in order - for later |
Line 896 sub start_functionplotvectorsumrule {
|
Line 889 sub start_functionplotvectorsumrule {
|
} else { |
} else { |
$label='R'.$label; |
$label='R'.$label; |
} |
} |
if ($Apache::functionplotresponse::splineorder{$label}) { |
|
&Apache::lonxml::error(&mt('Rule indices must be unique.')); |
|
} |
|
if ($target eq 'grade') { |
if ($target eq 'grade') { |
# Simply remember - in order - for later |
# Simply remember - in order - for later |
my $id=$Apache::inputtags::response[-1]; |
my $id=$Apache::inputtags::response[-1]; |
my $partid=$Apache::inputtags::part; |
my $partid=$Apache::inputtags::part; |
my $internalid = $partid.'_'.$id; |
my $internalid = $partid.'_'.$id; |
my $object=&Apache::lonxml::get_param('object',$parstack,$safeeval); |
my $vectors=&Apache::lonxml::get_param('vectors',$parstack,$safeeval); |
$object=~s/\W//gs; |
|
$object=ucfirst($object); |
|
push(@Apache::functionplotresponse::functionplotvectorrules,join(':',( |
push(@Apache::functionplotresponse::functionplotvectorrules,join(':',( |
$label, |
$label, |
'sum', |
'sum', |
$internalid, |
$internalid, |
$object, |
$vectors, |
&Apache::lonxml::get_param('length',$parstack,$safeeval), |
&Apache::lonxml::get_param('length',$parstack,$safeeval), |
&Apache::lonxml::get_param('angle',$parstack,$safeeval), |
&Apache::lonxml::get_param('angle',$parstack,$safeeval), |
&Apache::lonxml::get_param('lengtherror',$parstack,$safeeval), |
&Apache::lonxml::get_param('lengtherror',$parstack,$safeeval), |
Line 921 sub start_functionplotvectorsumrule {
|
Line 909 sub start_functionplotvectorsumrule {
|
$result=&Apache::edit::tag_start($target,$token,'Function Plot Vector Sum Rule'). |
$result=&Apache::edit::tag_start($target,$token,'Function Plot Vector Sum Rule'). |
&Apache::edit::text_arg('Index/Name:','index', |
&Apache::edit::text_arg('Index/Name:','index', |
$token,'10').' '. |
$token,'10').' '. |
&Apache::edit::text_arg('Vectors attached to object:','object', |
&Apache::edit::text_arg('Comma-separated list of vectors:','vectors', |
$token,'16').'<br />'. |
$token,'30').'<br />'. |
&Apache::edit::text_arg('Sum vector length:','length', |
&Apache::edit::text_arg('Sum vector length:','length', |
$token,'16'). |
$token,'16'). |
&Apache::edit::text_arg('Sum vector angle:','angle', |
&Apache::edit::text_arg('Sum vector angle:','angle', |
Line 935 sub start_functionplotvectorsumrule {
|
Line 923 sub start_functionplotvectorsumrule {
|
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
$env{'form.'.&Apache::edit::html_element_name('object')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('object')}); |
$env{'form.'.&Apache::edit::html_element_name('object')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('object')}); |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
$safeeval,'index','object', |
$safeeval,'index','vectors', |
'length','angle', |
'length','angle', |
,'lengtherror','angleerror'); |
,'lengtherror','angleerror'); |
if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } |
if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } |
Line 1382 sub objectcoords {
|
Line 1370 sub objectcoords {
|
return ($env{'form.HWVAL_'.$id.'_'.$label.'_x'}, |
return ($env{'form.HWVAL_'.$id.'_'.$label.'_x'}, |
$env{'form.HWVAL_'.$id.'_'.$label.'_y'}); |
$env{'form.HWVAL_'.$id.'_'.$label.'_y'}); |
} |
} |
|
|
|
sub attached { |
|
my ($id,$vector,$object,$xmin,$xmax,$ymin,$ymax)=@_; |
|
my ($xs,$xe,$ys,$ye)=&vectorcoords($id,$vector); |
|
my ($xo,$yo)=&objectcoords($id,$object); |
|
my $tolx=($xmax-$xmin)/100.; |
|
my $toly=($ymax-$ymin)/100.; |
|
my $tail=0; |
|
my $tip=0; |
|
&addlog("Proximity $vector ($xs,$xe,$ys,$ye) to $object ($xo,$yo)"); |
|
if ((abs($xs-$xo)<$tolx) && (abs($ys-$yo)<$toly)) { $tail=1; } |
|
if ((abs($xe-$xo)<$tolx) && (abs($ye-$yo)<$toly)) { $tip=1; } |
|
&addlog("Result tail:$tail tip:$tip"); |
|
return($tail,$tip); |
|
} |
|
|
|
|
sub vectorangle { |
sub vectorangle { |
my ($x,$y)=@_; |
my ($x,$y)=@_; |
Line 1459 sub vectorcheck {
|
Line 1463 sub vectorcheck {
|
return 0; |
return 0; |
} |
} |
} |
} |
|
if ($attachpoint ne '') { |
|
&addlog("Checking attached: ".$attachpoint); |
|
my ($tail,$tip)=&attached($id,$vector,$attachpoint,$xmin,$xmax,$ymin,$ymax); |
|
unless ($tail || $tip) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($notattachpoint ne '') { |
|
&addlog("Checking not attached: ".$notattachpoint); |
|
my ($tail,$tip)=&attached($id,$vector,$notattachpoint,$xmin,$xmax,$ymin,$ymax); |
|
if ($tail || $tip) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($tailpoint ne '') { |
|
&addlog("Checking tail: ".$tailpoint); |
|
my ($tail,$tip)=&attached($id,$vector,$tailpoint,$xmin,$xmax,$ymin,$ymax); |
|
unless ($tail) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($nottailpoint ne '') { |
|
&addlog("Checking not tail: ".$nottailpoint); |
|
my ($tail,$tip)=&attached($id,$vector,$nottailpoint,$xmin,$xmax,$ymin,$ymax); |
|
if ($tail) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($tippoint ne '') { |
|
&addlog("Checking tip: ".$tippoint); |
|
my ($tail,$tip)=&attached($id,$vector,$tippoint,$xmin,$xmax,$ymin,$ymax); |
|
unless ($tip) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($nottippoint ne '') { |
|
&addlog("Checking not tip: ".$nottippoint); |
|
my ($tail,$tip)=&attached($id,$vector,$nottippoint,$xmin,$xmax,$ymin,$ymax); |
|
if ($tip) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
|
&addlog("Rule $label passed."); |
&addlog("Rule $label passed."); |
return 1; |
return 1; |
} |
} |
|
|
sub sumcheck { |
sub sumcheck { |
my ($rule,$xmin,$xmax,$ymin,$ymax,$safeeval)=@_; |
my ($rule,$xmin,$xmax,$ymin,$ymax,$safeeval)=@_; |
my ($label,$type,$id,$object,$length,$angle,$lengtherror,$angleerror)=split(/\:/,$rule); |
my ($label,$type,$id,$vectors,$length,$angle,$lengtherror,$angleerror)=split(/\:/,$rule); |
&addlog("Vector Sum Rule $label for vectors attached to ".$object); |
&addlog("Vector Sum Rule $label for vectors ".$vectors); |
|
my $sumx=0; |
|
my $sumy=0; |
|
foreach my $sv (split(/\s*\,\s*/,$vectors)) { |
|
my ($rx,$ry)=&relvector(&vectorcoords($id,$sv)); |
|
$sumx+=$rx; |
|
$sumy+=$ry; |
|
} |
|
&addlog("Sum vector ($sumx,$sumy)"); |
|
if ($length ne '') { |
|
&addlog("Checking length $length with error $lengtherror"); |
|
$length=&Apache::run::run($length,$safeeval); |
|
&addlog("Evaluated to $length"); |
|
my $thislength=&vectorlength($sumx,$sumy); |
|
&addlog("Actual length $thislength"); |
|
if (abs($length-$thislength)>$lengtherror) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($angle ne '') { |
|
&addlog("Checking angle $angle with error $angleerror"); |
|
$angle=&Apache::run::run($angle,$safeeval); |
|
&addlog("Evaluated to $angle"); |
|
my $thisangle=&vectorangle($sumx,$sumy); |
|
&addlog("Actual angle $thisangle"); |
|
my $anglediff=abs($thisangle-$angle); |
|
&addlog("Angle difference: $anglediff"); |
|
if ($anglediff>360.-$anglediff) { |
|
$anglediff=360.-$anglediff; |
|
} |
|
&addlog("Smallest angle difference: $anglediff"); |
|
if ($anglediff>$angleerror) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
&addlog("Rule $label passed."); |
&addlog("Rule $label passed."); |
return 1; |
return 1; |
} |
} |