Handle the implicit auto value for limits now written by the compiler to the xml

This commit is contained in:
Balint-H
2024-03-14 12:38:56 +00:00
parent 069708a599
commit c2bef232b6
3 changed files with 27 additions and 15 deletions
@@ -165,14 +165,7 @@ namespace Mujoco {
ImpFriction.FromMjcf(mjcf, "solimpfriction"); ImpFriction.FromMjcf(mjcf, "solimpfriction");
FrictionLoss = mjcf.GetFloatAttribute("frictionloss", 0.0f); FrictionLoss = mjcf.GetFloatAttribute("frictionloss", 0.0f);
bool defaultLimited = false; Limited = mjcf.GetLimitedAttribute("limited", mjcf.HasAttribute("range"));
if ((mjcf.OwnerDocument.GetElementsByTagName("compiler")[0]?["compiler"])
?.GetBoolAttribute("autolimits", true) ??
true) {
defaultLimited = mjcf.HasAttribute("range");
}
Limited = mjcf.GetBoolAttribute("limited", defaultLimited);
Margin = mjcf.GetFloatAttribute("margin", defaultValue: 0.0f); Margin = mjcf.GetFloatAttribute("margin", defaultValue: 0.0f);
} }
} }
+4 -7
View File
@@ -82,13 +82,10 @@ public class MjActuator : MjComponent {
LengthRange = mjcf.GetVector2Attribute("lengthrange", defaultValue: Vector2.zero); LengthRange = mjcf.GetVector2Attribute("lengthrange", defaultValue: Vector2.zero);
Gear = mjcf.GetFloatArrayAttribute("gear", defaultValue: new float[] { 1.0f }).ToList(); Gear = mjcf.GetFloatArrayAttribute("gear", defaultValue: new float[] { 1.0f }).ToList();
bool autolimits = (mjcf.OwnerDocument.GetElementsByTagName("compiler")[0]?["compiler"]) CtrlLimited = mjcf.GetLimitedAttribute("ctrllimited",
?.GetBoolAttribute("autolimits", true) ?? rangeDefined: mjcf.HasAttribute("ctrlrange"));
false; ForceLimited = mjcf.GetLimitedAttribute("forcelimited",
CtrlLimited = mjcf.GetBoolAttribute("ctrllimited", rangeDefined: mjcf.HasAttribute("forcerange"));
defaultValue: autolimits ? CtrlRange != Vector2.zero : false);
ForceLimited = mjcf.GetBoolAttribute("forcelimited",
defaultValue: autolimits ? ForceRange != Vector2.zero : false);
} }
} }
@@ -37,6 +37,28 @@ public static class XmlElementExtensions {
} }
} }
public static bool GetLimitedAttribute(
this XmlElement element, string name, bool rangeDefined) {
var strValue = element.GetStringAttribute(name, "auto");
if (strValue == "auto" && rangeDefined && element.GetAutolimitsEnabled()) return true;
if (strValue == "auto") return false;
bool parsedValue;
if (bool.TryParse(strValue, out parsedValue)) {
return parsedValue;
} else {
throw new ArgumentException($"'{strValue}' is not a bool.");
}
}
public static bool GetAutolimitsEnabled(
this XmlElement element) {
bool autolimits = (element.OwnerDocument?.GetElementsByTagName("compiler")[0]?["compiler"])
?.GetBoolAttribute("autolimits", true) ??
true;
return autolimits;
}
public static float GetFloatAttribute( public static float GetFloatAttribute(
this XmlElement element, string name, float defaultValue = 0.0f) { this XmlElement element, string name, float defaultValue = 0.0f) {
if (!element.HasAttribute(name)) { if (!element.HasAttribute(name)) {