public CAD.AssembliesType ToCADXMLOutput(TestBenchModel.TestBenchBase tb, bool metalink = false)
        {
            CAD.AssembliesType outputAssembliesType = new CAD.AssembliesType();
            outputAssembliesType.VersionInfo = "";

            List<CAD.AssemblyType> asmlist = new List<CAD.AssemblyType>();
            foreach (var item in assemblies.Values)
            {
                CAD.AssemblyType assembly = item.ToCADXMLOutput(tb);
                asmlist.Add(assembly);
                pointCoordinatesList.AddRange(item.PointCoordinatesList);
            }

            if (asmlist.Count > 1 && metalink)
            {
                Logger.Instance.AddLogMessage("There's more than one unconnected assembly in the model. Meta-Link may not work with this model.", Severity.Warning);
            }

            if (orphans.Any())
            {
                if (metalink)
                {
                    CAD.AssemblyType topAssembly = asmlist.First();
                    List<CAD.CADComponentType> cadcomponentlist = topAssembly.CADComponent.CADComponent.ToList();
                    foreach (var orphan in orphans)
                    {
                        cadcomponentlist.Add(orphan.ToCADXMLOutput(tb.GetRepresentation(orphan)));
                    }
                    topAssembly.CADComponent.CADComponent = cadcomponentlist.ToArray();
                }
                else
                {
                    List<CAD.CADComponentType> orphanlist = new List<CAD.CADComponentType>();
                    CAD.UnassembledComponentsType orphancomponentParent = new CAD.UnassembledComponentsType();
                    orphancomponentParent._id = UtilityHelpers.MakeUdmID();

                    foreach (var orphan in orphans)
                    {
                        orphanlist.Add(orphan.ToCADXMLOutput(tb.GetRepresentation(orphan)));
                    }
                    orphancomponentParent.CADComponent = orphanlist.ToArray();
                    outputAssembliesType.UnassembledComponents = orphancomponentParent;
                }
            }

            outputAssembliesType.Assembly = asmlist.ToArray();

            return outputAssembliesType;
        }
        public CAD.AssemblyType ToCADXMLOutput(TestBenchModel.TestBenchBase tb)
        {
            CAD.AssemblyType cadassemblyoutput = new CAD.AssemblyType();
            cadassemblyoutput._id = UtilityHelpers.MakeUdmID();
            cadassemblyoutput.ConfigurationID = ConfigID;

            CAD.CADComponentType cadassemblycomponentoutput = new CAD.CADComponentType();
            cadassemblycomponentoutput._id = UtilityHelpers.MakeUdmID();
            cadassemblycomponentoutput.ComponentID = ConfigID;
            cadassemblycomponentoutput.Type = "ASSEMBLY";
            cadassemblycomponentoutput.Standalone = false;
            cadassemblycomponentoutput.SpecialInstruction = "";
            cadassemblycomponentoutput.Name = this.Name;
            cadassemblycomponentoutput.DisplayName = DisplayName;
            cadassemblycomponentoutput.MaterialID = "";
            cadassemblycomponentoutput.Representation = "";
            cadassemblycomponentoutput.Classification = "";

            
            Dictionary<string, List<CAD.ConstraintType>> compidToConstraint = new Dictionary<string, List<CAD.ConstraintType>>();       // Dictionary<Id, List<Constraints>>
            var sortedEdges = ChildEdges.OrderBy(x => x.DstPortName).ToList();
            foreach (CADEdge edge in sortedEdges)        //foreach (CADEdge edge in ChildEdges)
            {
                CAD.ConstraintType constraintout = edge.ToCADXMLOutput(tb);
                if (!compidToConstraint.ContainsKey(edge.Dst.Id))
                {
                    compidToConstraint.Add(edge.Dst.Id, new List<CAD.ConstraintType>());
                }
                compidToConstraint[edge.Dst.Id].Add(constraintout);
            }

            var sortedS2FEdges = ChildSize2FitEdges.OrderBy(x => x.DstPortName).ToList();
            foreach (CADEdge edge in sortedS2FEdges)        //foreach (CADEdge edge in ChildSize2FitEdges)
            {
                CAD.ConstraintType constraintout = edge.ToCADXMLOutput(tb);
                if (!compidToConstraint.ContainsKey(edge.Dst.Id))
                {
                    compidToConstraint.Add(edge.Dst.Id, new List<CAD.ConstraintType>());
                }
                compidToConstraint[edge.Dst.Id].Add(constraintout);
            }

            // META-2885
            //Dictionary<string, CAD.CADComponentType> tmpComponents = new Dictionary<string, CAD.CADComponentType>();
            List<CAD.CADComponentType> tmpComponents = new List<CAD.CADComponentType>();
            var sortedComponents = ChildComponents.OrderBy(x => x.Value.Name).ToDictionary(x => x.Key, x => x.Value).Values.ToList();
            foreach (CADComponent component in sortedComponents)      //foreach (CADComponent component in ChildComponents.Values)
            {
                CAD.CADComponentType componentout = component.ToCADXMLOutput(tb.GetRepresentation(component));

                // root constraint
                if (component.Id == RootComponentID)
                {
                    bool rootIsAsmType = component.ModelType == "Assembly";     //bool rootIsAsmType = component.ModelType == "PART";
                    List<CAD.PairType> pairlist = new List<CAD.PairType>();
                    CAD.ConstraintType rootconstraintout = new CAD.ConstraintType();
                    rootconstraintout._id = UtilityHelpers.MakeUdmID();

                    // front pair
                    pairlist.Add(MakeRootConstraint("FRONT",
                                                    component.DisplayID,
                                                    ConfigID,
                                                    rootIsAsmType));

                    // top pair
                    pairlist.Add(MakeRootConstraint("TOP",
                                                    component.DisplayID,
                                                    ConfigID,
                                                    rootIsAsmType));

                    // right pair
                    pairlist.Add(MakeRootConstraint("RIGHT",
                                                    component.DisplayID,
                                                    ConfigID,
                                                    rootIsAsmType));

                    rootconstraintout.Pair = pairlist.ToArray();

                    componentout.Constraint = new CAD.ConstraintType[1];
                    componentout.Constraint[0] = rootconstraintout;
                }
                else
                {
                    if (compidToConstraint.ContainsKey(component.Id))
                    {
                        componentout.Constraint = compidToConstraint[component.Id].ToArray();
                    }
                }

                //tmpComponents[component.Id] = componentout;
                tmpComponents.Add(componentout);

            }
            
            var size2fitCompSorted = ChildSize2FitComponents.OrderBy(x => x.Value.Name).ToDictionary(x => x.Key, x => x.Value).Values.ToList();
            foreach (CADComponent component in size2fitCompSorted)//foreach (CADComponent component in ChildSize2FitComponents.Values)      // META-2885
            {
                CAD.CADComponentType componentout = component.ToCADXMLOutput(tb.GetRepresentation(component));
                if (compidToConstraint.ContainsKey(component.Id))
                {
                    componentout.Constraint = compidToConstraint[component.Id].ToArray();
                }

                //tmpComponents[component.Id] = componentout;
                tmpComponents.Add(componentout);
            }

            // Fill MetaLinkData. Only needed in case if data is prepared for Meta-Link communication
            if (MetaLinkData != null && MetaLinkData.Components.Count>0)
            {
                cadassemblyoutput.MetaLinkData = new CAD.MetaLinkDataType();
                cadassemblyoutput.MetaLinkData.CadComponentMLData = new CAD.CadComponentMLDataType[MetaLinkData.Components.Count];
                int i  = 0;
                foreach (MetaLinkData.Component comp in MetaLinkData.Components)
                {
                    cadassemblyoutput.MetaLinkData.CadComponentMLData[i] = new CAD.CadComponentMLDataType();
                    cadassemblyoutput.MetaLinkData.CadComponentMLData[i].ID = comp.ID;
                    cadassemblyoutput.MetaLinkData.CadComponentMLData[i].AvmID = comp.AvmID;
                    if (comp.Connectors.Count>0)
                    {
                        cadassemblyoutput.MetaLinkData.CadComponentMLData[i].ConnectorMLData = new CAD.ConnectorMLDataType[comp.Connectors.Count];
                        int j = 0;
                        foreach (MetaLinkData.Connector conn in comp.Connectors)
                        {
                            cadassemblyoutput.MetaLinkData.CadComponentMLData[i].ConnectorMLData[j] = new CAD.ConnectorMLDataType();
                            cadassemblyoutput.MetaLinkData.CadComponentMLData[i].ConnectorMLData[j].ID = conn.ID;
                            cadassemblyoutput.MetaLinkData.CadComponentMLData[i].ConnectorMLData[j].DisplayName = conn.DisplayName;
                            if (conn.Datums.Count > 0)
                            {
                                cadassemblyoutput.MetaLinkData.CadComponentMLData[i].ConnectorMLData[j].DatumMLData = new CAD.DatumMLDataType[conn.Datums.Count];
                                int k = 0;
                                foreach (MetaLinkData.Datum d in conn.Datums)
                                {
                                    cadassemblyoutput.MetaLinkData.CadComponentMLData[i].ConnectorMLData[j].DatumMLData[k] = new CAD.DatumMLDataType();
                                    cadassemblyoutput.MetaLinkData.CadComponentMLData[i].ConnectorMLData[j].DatumMLData[k].ID = d.ID;
                                    cadassemblyoutput.MetaLinkData.CadComponentMLData[i].ConnectorMLData[j].DatumMLData[k].DisplayName = d.DisplayName;
                                    k++;
                                }
                            }
                            j++;
                        }
                    }
                    i++;
                }
            }

            cadassemblycomponentoutput.CADComponent = tmpComponents.ToArray();       //cadassemblycomponentoutput.CADComponent = tmpComponents.Values.ToArray();
            cadassemblyoutput.CADComponent = cadassemblycomponentoutput;

            CAD.PropertiesType asmproperties = new CAD.PropertiesType();
            asmproperties._id = UtilityHelpers.MakeUdmID();
            CAD.UnitsType asmunit = new CAD.UnitsType();
            asmunit._id = UtilityHelpers.MakeUdmID();
            asmunit.Value = "value1";
            asmproperties.Units = asmunit;
            cadassemblyoutput.Properties = asmproperties;
            return cadassemblyoutput;
        }
        public CAD.ConstraintType ToCADXMLOutput(TestBenchModel.TestBenchBase testBenchBase)
        {
            CAD.ConstraintType constraintout = new CAD.ConstraintType();
            constraintout._id = UtilityHelpers.MakeUdmID();
            CADComponent src = Src as CADComponent;
            CADComponent dst = Dst as CADComponent;

            string srcid = src.DisplayID;
            string dstid = dst.DisplayID;

            if (ConstraintPairs.Any())
            {
                List<CAD.PairType> pairlist = new List<CAD.PairType>();

                foreach (var item in ConstraintPairs)
                {
                    List<CAD.ConstraintFeatureType> constrainfeaturelist = new List<CAD.ConstraintFeatureType>();
                    CAD.PairType pair = new CAD.PairType();
                    pair._id = UtilityHelpers.MakeUdmID();
                    pair.FeatureAlignmentType = item.Item1.Alignment;
                    pair.FeatureGeometryType = item.Item1.Type.ToString().ToUpper();
                    pair.FeatureInterfaceType = "CAD_DATUM";
                    if (item.Item1.Guide || item.Item2.Guide)
                    {
                        pair.Guide = "True";
                    }
                    
                    CAD.ConstraintFeatureType afeature = new CAD.ConstraintFeatureType();
                    afeature._id = UtilityHelpers.MakeUdmID();
                    afeature.ComponentID = item.Item1.ComponentID;
                    afeature.FeatureName = item.Item1.DatumName;
                    afeature.FeatureOrientationType = item.Item1.Orientation;
                    if (item.Item1.Marker != null)
                    {
                        afeature.GeometryMarker = item.Item1.Marker.ToCADXml();
                    }

                    CAD.ConstraintFeatureType bfeature = new CAD.ConstraintFeatureType();
                    bfeature._id = UtilityHelpers.MakeUdmID();
                    bfeature.ComponentID = item.Item2.ComponentID;
                    bfeature.FeatureName = item.Item2.DatumName;
                    bfeature.FeatureOrientationType = item.Item2.Orientation;
                    if (item.Item2.Marker != null)
                    {
                        bfeature.GeometryMarker = item.Item2.Marker.ToCADXml();
                    }

                    constrainfeaturelist.Add(afeature);
                    constrainfeaturelist.Add(bfeature);
                    pair.ConstraintFeature = constrainfeaturelist.ToArray();
                    pairlist.Add(pair);

                }
                constraintout.Pair = pairlist.ToArray();

                // META-3124
                if (KinematicJointPair != null)
                {
                   constraintout.Joint = KinematicJointPair.ToCADXMLOutput();
                }

                // Associated geomnetries
                List<CAD.GeometryType> geoms = new List<CAD.GeometryType>();
                foreach (var geom in SrcIntf.Geometry.Union(DstIntf.Geometry))
                {
                    geoms.Add(geom.ToCADXMLOutput());
                }
                constraintout.Geometry = geoms.ToArray();

                // Adjoining surface treatment (if any)
                if (testBenchBase is TestBenchModel.FEATestBench)
                {
                    string surftreatment = GetAdjoiningSurfaceTreatment(testBenchBase as TestBenchModel.FEATestBench);
                    constraintout.AdjoiningSurfaceType = surftreatment;
                }
            }


            return constraintout;
        }
 private string GetAdjoiningSurfaceTreatment(TestBenchModel.FEATestBench testBench)
 {
     CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum src = CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Testbench_Default;
     CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum dst = CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Testbench_Default;
     bool srcset = false;
     bool dstset = false;
     // Are the 2 settings compatible?
     if (SrcIntf.AdjSurfTreatment.HasValue)
     {
         srcset = true;
         src = CombineAdjoiningValue(SrcIntf.AdjSurfTreatment.Value, testBench);
     }
     if (DstIntf.AdjSurfTreatment.HasValue)
     {
         dstset = true;
         dst = CombineAdjoiningValue(DstIntf.AdjSurfTreatment.Value, testBench);
     }
     if (srcset && dstset)
     {
         if (src != dst)
         {
             Logger.Instance.AddLogMessage("Conflicting adjoning surface settings. Component A: " + SrcIntf.CyPhyImpl.ToHyperLink() + ", Type: " + src.ToString() + "; Component B: " + DstIntf.CyPhyImpl.ToHyperLink() + ", Type: " + dst.ToString(), Severity.Error);
             return null;
         }
         else
         {
             return AdjoiningEnumToCADString(src);
         }
     }
     else if (srcset && !dstset)
     {
         return AdjoiningEnumToCADString(src);
     }
     else if (!srcset && dstset)
     {
         return AdjoiningEnumToCADString(dst);
     }
     else
     {
         switch (testBench.AdjSurfTreatment)
         {
             case CyPhyClasses.CADTestBench.AttributesClass.AdjoiningTreatment_enum.Bonded:
                 return AdjoiningEnumToCADString(CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Bonded);
             case CyPhyClasses.CADTestBench.AttributesClass.AdjoiningTreatment_enum.Contacted:
                 return AdjoiningEnumToCADString(CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Contacted);
             case CyPhyClasses.CADTestBench.AttributesClass.AdjoiningTreatment_enum.Free:
                 return AdjoiningEnumToCADString(CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Free);
             case CyPhyClasses.CADTestBench.AttributesClass.AdjoiningTreatment_enum.Joint_Implied:
                 return AdjoiningEnumToCADString(SrcIntf.ImliedSurfTreatment);
         }
     }
     // Shouldn't get here
     return null;
 }
 private CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum CombineAdjoiningValue(CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum input, TestBenchModel.FEATestBench testBench)
 {
     switch (input)
     {
         case CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Testbench_Default:
             switch (testBench.AdjSurfTreatment)
             {
                 case CyPhyClasses.CADTestBench.AttributesClass.AdjoiningTreatment_enum.Bonded:
                     return CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Bonded;
                 case CyPhyClasses.CADTestBench.AttributesClass.AdjoiningTreatment_enum.Contacted:
                     return CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Contacted;
                 case CyPhyClasses.CADTestBench.AttributesClass.AdjoiningTreatment_enum.Free:
                     return CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Free;
                 case CyPhyClasses.CADTestBench.AttributesClass.AdjoiningTreatment_enum.Joint_Implied:
                     return SrcIntf.ImliedSurfTreatment;
             }
             break;
         case CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Joint_Implied:
             return SrcIntf.ImliedSurfTreatment;
         case CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Bonded:
             return CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Bonded;
         case CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Contacted:
             return CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Contacted;
         case CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Free:
             return CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Free;
     }
     // Shouldn't get here
     return CyPhyClasses.AdjoiningSurfacesTreatment.AttributesClass.Type_enum.Free;
 }