return ValueBase(parse_canvas(element,canvas,true));
else
{
- DEBUGPOINT();
error_unexpected_element(element,element->get_name());
}
if(!value_node)
{
- error(element,strprintf(_("Unable to create <animated> with type \"%s\""),ValueBase::type_name(type).c_str()));
+ error(element,strprintf(_("Unable to create <animated> with type \"%s\""),ValueBase::type_local_name(type).c_str()));
return ValueNode_Animated::Handle();
}
else
error_unexpected_element(child,child->get_name());
}
+
+ // in canvas version 0.1, angles used to wrap, so to get from -179
+ // degrees to 180 degrees meant a 1 degree change
+ // in canvas version 0.2 they don't, so that's a 359 degree change
+
+ // when loading a version 0.1 canvas, modify constant angle
+ // waypoints to that they are within 180 degrees of the previous
+ // waypoint's value
+ if (type == ValueBase::TYPE_ANGLE)
+ {
+ Canvas::Handle parent = canvas;
+ while (!parent->is_root())
+ parent = parent->parent();
+
+ if (parent->get_version() == "0.1")
+ {
+ 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;
+ }
+ }
+ }
+
value_node->changed();
return value_node;
}
else
if(!value_node->set_link(index,link))
{
- //error(dynamic_cast<xmlpp::Element*>(*iter),strprintf("Unable to connect value node ('%s' of type '%s') to link %d",link->get_name().c_str(),ValueBase::type_name(link->get_type()).c_str(),index));
- error(element,strprintf("Unable to connect value node ('%s' of type '%s') to link %d",link->get_name().c_str(),ValueBase::type_name(link->get_type()).c_str(),index));
+ //error(dynamic_cast<xmlpp::Element*>(*iter),strprintf(_("Unable to connect value node ('%s' of type '%s') to link %d"),link->get_name().c_str(),ValueBase::type_local_name(link->get_type()).c_str(),index));
+ error(element,strprintf(_("Unable to connect value node ('%s' of type '%s') to link %d"),link->get_name().c_str(),ValueBase::type_local_name(link->get_type()).c_str(),index));
}
// \todo do a search for more elements and warn if they are found
{
error_unexpected_element(element,element->get_name());
error(element, "Expected a ValueNode");
+ value_node=PlaceholderValueNode::create();
}
canvas->set_guid(guid);
}
+ if(element->get_attribute("version"))
+ canvas->set_version(element->get_attribute("version")->get_value());
+
if(element->get_attribute("width"))
canvas->rend_desc().set_w(atoi(element->get_attribute("width")->get_value().c_str()));
nodes.c_str()));
}
+ canvas->set_version(CURRENT_CANVAS_VERSION);
return canvas;
}