public static bool MatchStructuralInterfaceDatums(DataRep.StructuralInterfaceConstraint a,
DataRep.StructuralInterfaceConstraint b,
List<Tuple<DataRep.Datum, DataRep.Datum>> constraintPairs,
CyPhyCOMInterfaces.IMgaTraceability Traceability)
{
string apath = a.CyPhyImpl.Path, bpath = b.CyPhyImpl.Path;
// Means no error
bool result = false;
if (!DataRep.StructuralInterfaceConstraint.MatchSIType(a.InterfaceDefinition, b.InterfaceDefinition)) //if (!MatchSIType(a.InterfaceDefinition, b.InterfaceDefinition))
{
Logger.Instance.AddLogMessage("Mismatched Type attribute on connected StructuralInterfaces. Interface 1: ["
+ a.CyPhyImpl.ToHyperLink(Traceability) + "] (" + a.InterfaceDefinition + "). Interface 2: [" + b.CyPhyImpl.ToHyperLink(Traceability) + "] (" + b.InterfaceDefinition + ")", Severity.Error);
return true;
}
List<string> adatumnames = a.DatumList.Keys.ToList();
List<string> bdatumnames = b.DatumList.Keys.ToList();
if (adatumnames.Count() != bdatumnames.Count())
{
Logger.Instance.AddLogMessage("Connected StructuralInterfaces have different number of datum ports: ["
+ a.CyPhyImpl.ToHyperLink(Traceability) + ", " + b.CyPhyImpl.ToHyperLink(Traceability) + "]", Severity.Error);
return true;
}
if (adatumnames.Count() > 1 && bdatumnames.Count() > 1)
{
foreach (KeyValuePair<string, DataRep.Datum> adatum in a.DatumList)
{
if (b.DatumList.ContainsKey(adatum.Key))
{
DataRep.DatumType a_type = adatum.Value.Type;
DataRep.DatumType b_type = b.DatumList[adatum.Key].Type;
if (a_type != b_type)
{
Logger.Instance.AddLogMessage("Matching datum ports are different type ["
+ a.CyPhyImpl.ToHyperLink(Traceability) + "," + b.CyPhyImpl.ToHyperLink(Traceability) + "]", Severity.Error);
result = true;
continue;
}
else
{
if (a_type == DataRep.DatumType.Surface)
{
if (adatum.Value.Alignment != b.DatumList[adatum.Key].Alignment)
{
Logger.Instance.AddLogMessage("Matching Surface datum ports have different Alignment attributes ["
+ a.CyPhyImpl.ToHyperLink(Traceability) + "," + b.CyPhyImpl.ToHyperLink(Traceability) + "]", Severity.Error);
result = true;
continue;
}
}
var atumple = new Tuple<DataRep.Datum, DataRep.Datum>(adatum.Value, b.DatumList[adatum.Key]);
constraintPairs.Add(atumple);
}
adatumnames.Remove(adatum.Key);
bdatumnames.Remove(adatum.Key);
}
}
if (adatumnames.Any() || bdatumnames.Any())
{
Logger.Instance.AddLogMessage(String.Format("Connected connectors contain unmatched named feature ports. Port names must match inside connectors. Connectors are: {0} ({1}) and {2} ({3}).",
a.CyPhyImpl.ToHyperLink(Traceability), String.Join(",", adatumnames.ToArray()), b.CyPhyImpl.ToHyperLink(Traceability), String.Join(",", bdatumnames)), Severity.Error);
return true;
}
}
else
{
var atuple = new Tuple<DataRep.Datum, DataRep.Datum>(a.DatumList.Values.First(), b.DatumList.Values.First());
constraintPairs.Add(atuple);
}
return result;
}