private void SetupJoint(List<CyPhy.CADDatum> datumlist, List<CyPhy.CADDatum> limitreflist, Dictionary<string, DataRep.Datum> limitrefmap)
{
if ((CyPhyImpl as CyPhy.Connector).Children.KinematicRevoluteJointCollection.Any())
{
Joint = new KinematicJoint((CyPhyImpl as CyPhy.Connector).Children.KinematicRevoluteJointCollection.First());
} else
if ((CyPhyImpl as CyPhy.Connector).Children.KinematicCylindricalJointCollection.Any())
{
Joint = new KinematicJoint((CyPhyImpl as CyPhy.Connector).Children.KinematicCylindricalJointCollection.First());
} else
if ((CyPhyImpl as CyPhy.Connector).Children.KinematicFixedJointCollection.Any())
{
Joint = new KinematicJoint((CyPhyImpl as CyPhy.Connector).Children.KinematicFixedJointCollection.First());
} else
if ((CyPhyImpl as CyPhy.Connector).Children.KinematicTranslationalJointCollection.Any())
{
Joint = new KinematicJoint((CyPhyImpl as CyPhy.Connector).Children.KinematicTranslationalJointCollection.First());
}
// Get the datums to associate with this joint
if (Joint != null)
{
foreach (var cyphydatum in datumlist)
{
Datum datarepdatum;
if (DatumList.TryGetValue(cyphydatum.Name, out datarepdatum))
{
// Is datum part of defining the joint?
if (cyphydatum.SrcConnections.KinematicJointDefinitionCollection.Any())
{
if (cyphydatum is CyPhy.Axis)
{
Joint.Axis = datarepdatum;
}
else if (cyphydatum is CyPhy.Surface)
{
Joint.AlignmentPlane = datarepdatum;
}
}
}
}
if (limitreflist.Any() && Joint.JointType == KinematicJoint.KinematicJointType.REVOLUTE)
{
throw new Exception("Limit references for revolute joints are not supported currently. Guides will be used as limit references. Please remove limit references on rvlute joints from your model. Connector: " + CyPhyImpl.Name + ", Parent: " + CyPhyImpl.ParentContainer.Name);
}
var guides = datumlist.Where(d => d.Attributes.DefinitionNotes.Contains("GUIDE"));
if (guides.Any())
{
Logger.Instance.AddLogMessage("Datum is using old guide format. Please use the attribute 'IsGuide'. Connector: " + CyPhyImpl.Path, Severity.Error);
return;
}
guides = datumlist.Where(d => d.Attributes.IsGuide);
if (guides.Count() > 1)
{
throw new Exception("More than one guides in a kinematic joint. This is not supported yet. Connector: " + CyPhyImpl.Path);
}
else if (guides.Count() == 1)
{
Joint.RotationDefaultReference = this.DatumList[guides.First().Name];
}
foreach (var limitrefdatum in limitreflist)
{
Datum datarepdatum;
if (limitrefmap.TryGetValue(limitrefdatum.Name, out datarepdatum))
{
// Is this datum part of defining the limits of the joint?
if ((limitrefdatum as CyPhy.Surface).SrcConnections.KinematicTranslationalLimitReferenceCollection.Any())
{
var limittype = (limitrefdatum as CyPhy.Surface).SrcConnections.KinematicTranslationalLimitReferenceCollection.First().Attributes.TranslationalLimitReferenceType;
// Default
if (limittype == CyPhyClasses.KinematicTranslationalLimitReference.AttributesClass.TranslationalLimitReferenceType_enum.NormalExtent)
{
Joint.TranslationDefaultReference = datarepdatum;
}
// Min
else if (limittype == CyPhyClasses.KinematicTranslationalLimitReference.AttributesClass.TranslationalLimitReferenceType_enum.MinExtent)
{
throw new Exception("Min and max references are not yet supported. Please remove these." + CyPhyImpl.Name + ", Parent: " + CyPhyImpl.ParentContainer.Name);
}
// Max
else
{
throw new Exception("Min and max references are not yet supported. Please remove these." + CyPhyImpl.Name + ", Parent: " + CyPhyImpl.ParentContainer.Name);
}
}
}
}
if ((Joint.RotationLimitMax.HasValue || Joint.RotationLimitMin.HasValue) && !Joint.RotationLimitDefault.HasValue)
{
throw new Exception("Joint has rotation limit max or min specified, but not default. Please specify default value as well." + CyPhyImpl.Name + ", Parent: " + CyPhyImpl.ParentContainer.Name);
}
if (Joint.RotationLimitDefault.HasValue && Joint.RotationDefaultReference == null)
{
throw new Exception("Joint has rotation limit specified, but there are no guides present to be used as rotation references. Please define guides for the connection as well." + CyPhyImpl.Name + ", Parent: " + CyPhyImpl.ParentContainer.Name);
}
if ((Joint.TranslationLimitMax.HasValue || Joint.TranslationLimitMin.HasValue) && !Joint.TranslationLimitDefault.HasValue)
{
throw new Exception("Joint has translation limit max or min specified, but not default. Please specify default value as well." + CyPhyImpl.Name + ", Parent: " + CyPhyImpl.ParentContainer.Name);
}
if (Joint.TranslationLimitDefault.HasValue && Joint.TranslationDefaultReference == null)
{
throw new Exception("Joint has translation limit specified, but there is no limit reference present. Please define limit references in the connection as well." + CyPhyImpl.Name + ", Parent: " + CyPhyImpl.ParentContainer.Name);
}
if (Joint.RotationLimitMax.HasValue && Joint.RotationLimitMin.HasValue && Joint.RotationLimitMin.Value > Joint.RotationLimitMax.Value)
{
throw new Exception("Joint rotation limit min > max. Please correct this." + CyPhyImpl.Name + ", Parent: " + CyPhyImpl.ParentContainer.Name);
}
}
}