- lhs=canvas->surefind_value_node(element->get_attribute("lhs")->get_value());
- value_node->set_lhs(lhs);
- }
-
- if(element->get_attribute("rhs"))
- {
- rhs=canvas->surefind_value_node(element->get_attribute("rhs")->get_value());
- value_node->set_rhs(rhs);
- }
- }
- catch (Exception::IDNotFound)
- {
- error(element,"attribute in <subtract> references unknown ID");
- }
- catch (Exception::FileNotFound)
- {
- error(element,"Unable to open external file referenced in ID");
- }
-
- xmlpp::Element::NodeList list = element->get_children();
- for(xmlpp::Element::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter)
- {
- xmlpp::Element *child(dynamic_cast<xmlpp::Element*>(*iter));
- if(!child)
- continue;
- else
- if(child->get_name()=="lhs")
- {
- if(lhs)
- {
- error(child,"LHS component of <subtract> already defined!");
- continue;
- }
-
- xmlpp::Element::NodeList list = child->get_children();
- xmlpp::Element::NodeList::iterator iter;
-
- // Search for the first non-text XML element
- for(iter = list.begin(); iter != list.end(); ++iter)
- if(dynamic_cast<xmlpp::Element*>(*iter)) break;
-
- if(iter==list.end())
- {
- error(child,_("<lhs> is missing its contents"));
- continue;
- }
-
- lhs=parse_value_node(dynamic_cast<xmlpp::Element*>(*iter),canvas);
-
- if(lhs)
- value_node->set_lhs(lhs);
- else
- {
- error((*iter),"Parse of LHS ValueNode failed");
- }
-
- // \todo do a search for more elements and warn if they are found
- }
- else
- if(child->get_name()=="rhs")
- {
- if(rhs)
- {
- error(child,"RHS component of <subtract> already defined!");
- continue;
- }
-
- xmlpp::Element::NodeList list = child->get_children();
- xmlpp::Element::NodeList::iterator iter;
-
- // Search for the first non-text XML element
- for(iter = list.begin(); iter != list.end(); ++iter)
- if(dynamic_cast<xmlpp::Element*>(*iter)) break;
-
- if(iter==list.end())
- {
- error(child,_("<rhs> is missing its contents"));
- continue;
- }
-
- rhs=parse_value_node(dynamic_cast<xmlpp::Element*>(*iter),canvas);
-
- if(rhs)
- value_node->set_rhs(rhs);
- else
- {
- error((*iter),"Parse of RHS ValueNode failed");
- }
-
- // \todo do a search for more elements and warn if they are found
- }
- else
- if(child->get_name()=="scalar")
- {
- if(scalar)
- {
- error(child,"scalar component of <subtract> already defined!");
- continue;
- }
-
- xmlpp::Element::NodeList list = child->get_children();
- xmlpp::Element::NodeList::iterator iter;
-
- // Search for the first non-text XML element
- for(iter = list.begin(); iter != list.end(); ++iter)
- if(dynamic_cast<xmlpp::Element*>(*iter)) break;
-
- if(iter==list.end())
- {
- error(child,_("<scalar> is missing its contents"));
- continue;
- }
-
- scalar=parse_value_node(dynamic_cast<xmlpp::Element*>(*iter),canvas);
-
- if(scalar)
- value_node->set_scalar(scalar);
- else
- {
- error((*iter),"Parse of scalar ValueNode failed");
+ bool first = true;
+ Real angle, prev = 0;
+ WaypointList &wl = value_node->waypoint_list();
+ for (WaypointList::iterator iter = wl.begin(); iter != wl.end(); iter++)
+ {
+ angle = Angle::deg(iter->get_value(iter->get_time()).get(Angle())).get();
+ if (first)
+ first = false;
+ else if (iter->get_value_node()->get_name() == "constant")
+ {
+ if (angle - prev > 180)
+ {
+ while (angle - prev > 180) angle -= 360;
+ iter->set_value(Angle::deg(angle));
+ }
+ else if (prev - angle > 180)
+ {
+ while (prev - angle > 180) angle += 360;
+ iter->set_value(Angle::deg(angle));
+ }
+ }
+ prev = angle;