Пример #1
0
        /*
         * private void FindMatchingSolidModelingFeatures(CyPhy.CADDatum datum,
         *                                             CyPhy.CADModel acadmodel)
         * {
         *  // META-947: Creates a virtual connector
         *
         *  Dictionary<string, DataRep.Datum> featuremap = new Dictionary<string, DataRep.Datum>();
         *  FindMatchingDatums(datum,
         *                     acadmodel,
         *                     featuremap);
         *
         *  if (featuremap.Count > 0)
         *  {
         *      // virtual connector
         *      DataRep.StructuralInterfaceConstraint sirep = new StructuralInterfaceConstraint(datum, this.Id);
         *      sirep.DatumList = featuremap;
         *      sirep.DegreeFreedom = sirep.GetDegreesOfFreedom();
         *      StructuralInterfaceNodes[datum.ID] = sirep;
         *  }
         * }
         *
         * private void FindMatchingSolidModelingFeatures(CyPhy.Connector a,
         *                                             CyPhy.CADModel acadmodel)
         * {
         *  // META-947: Connector instead of StructuralInterface
         *  // [1] Connectors can be nested so find all cad datums within a connector recursively
         *  // [2] Find connected datums
         *  //     Skip Connector without any Datum Ports
         *
         *  List<CyPhy.CADDatum> CadDatum_List = new List<CyPhy.CADDatum>();
         *  FindCadDatumsInConnector(a, CadDatum_List);
         *
         *  Dictionary<string, DataRep.Datum> featuremap = new Dictionary<string, DataRep.Datum>();
         *
         *  if (CadDatum_List.Count() > 0)
         *  {
         *      foreach (CyPhy.CADDatum item in CadDatum_List)
         *      {
         *          FindMatchingDatums(item,
         *                             acadmodel,
         *                             featuremap);
         *      }
         *
         *  }
         *
         *  if (featuremap.Count > 0)
         *  {
         *      DataRep.StructuralInterfaceConstraint sirep = new StructuralInterfaceConstraint(a, this.Id);
         *      sirep.DatumList = featuremap;
         *      sirep.DegreeFreedom = sirep.GetDegreesOfFreedom();
         *      StructuralInterfaceNodes[a.ID] = sirep;
         *  }
         * }
         *
         *
         * private void FindMatchingDatums(CyPhy.CADDatum datum,
         *                              CyPhy.CADModel cadmodel,
         *                              Dictionary<string, DataRep.Datum> featuremap)
         * {
         *  string cadmodel_id = cadmodel.ID;
         *  string alignment = "ALIGN";
         *  string orientation = "NONE";
         *
         *
         *  if (datum.Kind == "Surface")
         *  {
         *      alignment = (datum as CyPhy.Surface).Attributes.Alignment.ToString();
         *  }
         *
         *  CadDatumTraversal traversal = new CadDatumTraversal(datum,
         *                                                      cadmodel_id);
         *
         *  if (traversal.datumFound.Count > 0)
         *  {
         *      if (traversal.datumFound.Count > 1)
         *      {
         *          Logger.Instance.AddLogMessage("Connector datum connected to multiple datums in the same CADModel [" + datum.Path + "]", Severity.Error);
         *          return;
         *      }
         *
         *      CyPhy2CAD_CSharp.DataRep.Datum datumRep = new DataRep.Datum(traversal.datumFound.First().Attributes.DatumName,
         *                                                                    datum.Kind,
         *                                                                    this.DisplayID);
         *      if (datum.Kind == "Surface")
         *      {
         *          if (traversal.ReverseMap)
         *              orientation = "SIDE_B";
         *          else
         *              orientation = "SIDE_A";
         *      }
         *
         *      if (datum.Kind == "CoordinateSystem")
         *      {
         *          alignment = "CSYS";
         *      }
         *
         *      datumRep.Alignment = alignment;
         *      datumRep.Orientation = orientation;
         *
         *      if (!featuremap.ContainsKey(datum.Name))
         *      {
         *          featuremap[datum.Name] = datumRep;
         *      }
         *  }
         * }
         *
         * // Connectors can be nested!
         * private void FindCadDatumsInConnector(CyPhy.Connector connector,
         *                         List<CyPhy.CADDatum> caddatum_list)
         * {
         *  caddatum_list.AddRange(connector.Children.CADDatumCollection);
         *
         *  //foreach (CyPhy.Connector conn in connector.Children.ConnectorCollection)
         *  //{
         *  //    FindCadDatumsInConnector(conn, caddatum_list);
         *  //}
         *
         * }
         */

        public CAD.CADComponentType ToCADXMLOutput(string representation)
        {
            CAD.CADComponentType cadoutput = new CAD.CADComponentType();
            cadoutput._id                = UtilityHelpers.MakeUdmID();
            cadoutput.Type               = ModelType.ToUpper();
            cadoutput.Standalone         = false;
            cadoutput.SpecialInstruction = Size2Fit ? "SIZE_TO_FIT" : "";
            if (!String.IsNullOrEmpty(SpecialInstructions))
            {
                cadoutput.SpecialInstruction += (cadoutput.SpecialInstruction.Length != 0 ? "," : "") + SpecialInstructions;
            }
            cadoutput.Name           = String.IsNullOrEmpty(ModelName) ? "" : ModelName;
            cadoutput.DisplayName    = Name;
            cadoutput.MaterialID     = MaterialName;
            cadoutput.ComponentID    = DisplayID;
            cadoutput.Classification = Classification;


            if (CadParameters.Any())
            {
                CAD.ParametricParametersType parameterRoot = new CAD.ParametricParametersType();
                parameterRoot._id = UtilityHelpers.MakeUdmID();

                List <CAD.CADParameterType> paramarray = new List <CAD.CADParameterType>();
                foreach (var item in CadParameters)
                {
                    CAD.CADParameterType parameter = new CAD.CADParameterType();
                    parameter._id         = UtilityHelpers.MakeUdmID();
                    parameter.Type        = item.Type;
                    parameter.Name        = item.Name;
                    parameter.Value       = item.Value;
                    parameter.Units       = new CAD.UnitsType();
                    parameter.Units._id   = UtilityHelpers.MakeUdmID();
                    parameter.Units.Value = item.Unit;
                    paramarray.Add(parameter);
                }
                parameterRoot.CADParameter     = paramarray.ToArray();
                cadoutput.ParametricParameters = parameterRoot;
            }

            if (ManufacturingParameters != null && ManufacturingParameters.Count != 0)
            {
                cadoutput.ManufacturingParameter = new CAD.ManufacturingParameterType[ManufacturingParameters.Count];

                int i = 0;
                foreach (var param in ManufacturingParameters)
                {
                    cadoutput.ManufacturingParameter[i++] = new CAD.ManufacturingParameterType()
                    {
                        Name  = param.Key,
                        Value = param.Value
                    };
                }
            }

            if (MetaData != null && MetaData.Count != 0)
            {
                cadoutput.MetaData = new CAD.MetaDataType[MetaData.Count];

                int i = 0;
                foreach (var param in MetaData)
                {
                    cadoutput.MetaData[i++] = new CAD.MetaDataType()
                    {
                        Key   = param.Key,
                        Value = param.Value
                    };
                }
            }

            cadoutput.Representation = representation;
            if (this.CadElementsList.Count > 0)
            {
                cadoutput.Elements = new CAD.ElementsType()
                {
                    _id = UtilityHelpers.MakeUdmID()
                };

                cadoutput.Elements.Element = this.CadElementsList.ToArray();
            }

            return(cadoutput);
        }
Пример #2
0
        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;
        }
Пример #3
0
        // META-2262: Modify orientation here instead of in CADData.cs
        private void ModifyRootComponentOrientation(CAD.CADComponentType componentParent,
                                                    string assemblyID)
        {
            List <string> orientations = new List <string>();

            orientations.Add("ASM_TOP");
            orientations.Add("ASM_RIGHT");
            orientations.Add("ASM_FRONT");

            // Not doing recursive right now, just changing it at the first level
            //foreach (var aComponent in componentParent.CADComponent)
            if (componentParent.CADComponent != null)
            {
                foreach (var aComponent in componentParent.CADComponent)
                {
                    if (aComponent.Constraint != null)
                    {
                        foreach (var constraint in aComponent.Constraint)
                        {
                            if (constraint.Pair != null)
                            {
                                foreach (var pair in constraint.Pair)
                                {
                                    if (pair.ConstraintFeature != null)
                                    {
                                        foreach (var feature in pair.ConstraintFeature)
                                        {
                                            if (feature.ComponentID == assemblyID)
                                            {
                                                if (feature.FeatureName == "ASM_TOP")
                                                {
                                                    feature.FeatureName = "ASM_FRONT";
                                                    orientations.Remove("ASM_TOP");
                                                    if (!orientations.Any())
                                                    {
                                                        return;
                                                    }
                                                }
                                                else if (feature.FeatureName == "ASM_RIGHT")
                                                {
                                                    feature.FeatureName = "ASM_TOP";
                                                    orientations.Remove("ASM_RIGHT");
                                                    if (!orientations.Any())
                                                    {
                                                        return;
                                                    }
                                                }
                                                else if (feature.FeatureName == "ASM_FRONT")
                                                {
                                                    feature.FeatureName = "ASM_RIGHT";
                                                    orientations.Remove("ASM_FRONT");
                                                    if (!orientations.Any())
                                                    {
                                                        return;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #4
0
        /*
        private void FindMatchingSolidModelingFeatures(CyPhy.CADDatum datum,
                                                       CyPhy.CADModel acadmodel)
        {
            // META-947: Creates a virtual connector

            Dictionary<string, DataRep.Datum> featuremap = new Dictionary<string, DataRep.Datum>();
            FindMatchingDatums(datum,
                               acadmodel,
                               featuremap);

            if (featuremap.Count > 0)
            {
                // virtual connector
                DataRep.StructuralInterfaceConstraint sirep = new StructuralInterfaceConstraint(datum, this.Id);
                sirep.DatumList = featuremap;
                sirep.DegreeFreedom = sirep.GetDegreesOfFreedom();
                StructuralInterfaceNodes[datum.ID] = sirep;
            }
        }

        private void FindMatchingSolidModelingFeatures(CyPhy.Connector a,
                                                       CyPhy.CADModel acadmodel)
        {
            // META-947: Connector instead of StructuralInterface
            // [1] Connectors can be nested so find all cad datums within a connector recursively
            // [2] Find connected datums
            //     Skip Connector without any Datum Ports

            List<CyPhy.CADDatum> CadDatum_List = new List<CyPhy.CADDatum>();
            FindCadDatumsInConnector(a, CadDatum_List);

            Dictionary<string, DataRep.Datum> featuremap = new Dictionary<string, DataRep.Datum>();    

            if (CadDatum_List.Count() > 0)
            {
                foreach (CyPhy.CADDatum item in CadDatum_List)
                {
                    FindMatchingDatums(item,
                                       acadmodel,
                                       featuremap);
                }

            }

            if (featuremap.Count > 0)
            {
                DataRep.StructuralInterfaceConstraint sirep = new StructuralInterfaceConstraint(a, this.Id);
                sirep.DatumList = featuremap;
                sirep.DegreeFreedom = sirep.GetDegreesOfFreedom();
                StructuralInterfaceNodes[a.ID] = sirep;
            }
        }


        private void FindMatchingDatums(CyPhy.CADDatum datum,
                                        CyPhy.CADModel cadmodel,
                                        Dictionary<string, DataRep.Datum> featuremap)
        {
            string cadmodel_id = cadmodel.ID;
            string alignment = "ALIGN";
            string orientation = "NONE";


            if (datum.Kind == "Surface")
            {
                alignment = (datum as CyPhy.Surface).Attributes.Alignment.ToString();
            }

            CadDatumTraversal traversal = new CadDatumTraversal(datum,
                                                                cadmodel_id);

            if (traversal.datumFound.Count > 0)
            {
                if (traversal.datumFound.Count > 1)
                {
                    Logger.Instance.AddLogMessage("Connector datum connected to multiple datums in the same CADModel [" + datum.Path + "]", Severity.Error);
                    return;
                }

                CyPhy2CAD_CSharp.DataRep.Datum datumRep = new DataRep.Datum(traversal.datumFound.First().Attributes.DatumName,
                                                                              datum.Kind,
                                                                              this.DisplayID);
                if (datum.Kind == "Surface")
                {
                    if (traversal.ReverseMap)
                        orientation = "SIDE_B";
                    else
                        orientation = "SIDE_A";
                }

                if (datum.Kind == "CoordinateSystem")
                {
                    alignment = "CSYS";
                }

                datumRep.Alignment = alignment;
                datumRep.Orientation = orientation;

                if (!featuremap.ContainsKey(datum.Name))
                {
                    featuremap[datum.Name] = datumRep;
                }
            }
        }

        // Connectors can be nested!
        private void FindCadDatumsInConnector(CyPhy.Connector connector,
                                   List<CyPhy.CADDatum> caddatum_list)
        {
            caddatum_list.AddRange(connector.Children.CADDatumCollection);
            
            //foreach (CyPhy.Connector conn in connector.Children.ConnectorCollection)
            //{
            //    FindCadDatumsInConnector(conn, caddatum_list);                  
            //}

        }
        */

        public CAD.CADComponentType ToCADXMLOutput(string representation)
        {
            CAD.CADComponentType cadoutput = new CAD.CADComponentType();
            cadoutput._id = UtilityHelpers.MakeUdmID();
            cadoutput.Type = ModelType.ToUpper();
            cadoutput.Standalone = false;
            cadoutput.SpecialInstruction = Size2Fit ? "SIZE_TO_FIT" : "";
            if (!String.IsNullOrEmpty(SpecialInstructions))
            {
                cadoutput.SpecialInstruction += (cadoutput.SpecialInstruction.Length != 0 ? "," : "") + SpecialInstructions;
            }
            cadoutput.Name = String.IsNullOrEmpty(ModelName) ? "" : ModelName;
            cadoutput.DisplayName = Name;
            cadoutput.MaterialID = MaterialName;
            cadoutput.ComponentID = DisplayID;
            cadoutput.Classification = Classification;


            if (CadParameters.Any())
            {
                CAD.ParametricParametersType parameterRoot = new CAD.ParametricParametersType();
                parameterRoot._id = UtilityHelpers.MakeUdmID();

                List<CAD.CADParameterType> paramarray = new List<CAD.CADParameterType>();
                foreach (var item in CadParameters)
                {
                    CAD.CADParameterType parameter = new CAD.CADParameterType();
                    parameter._id = UtilityHelpers.MakeUdmID();
                    parameter.Type = item.Type;
                    parameter.Name = item.Name;
                    parameter.Value = item.Value;
                    parameter.Units = new CAD.UnitsType();
                    parameter.Units._id = UtilityHelpers.MakeUdmID();
                    parameter.Units.Value = item.Unit;
                    paramarray.Add(parameter);
                }
                parameterRoot.CADParameter = paramarray.ToArray();
                cadoutput.ParametricParameters = parameterRoot;
            }

            if (ManufacturingParameters != null && ManufacturingParameters.Count != 0)
            {
                cadoutput.ManufacturingParameter = new CAD.ManufacturingParameterType[ManufacturingParameters.Count];

                int i = 0;
                foreach (var param in ManufacturingParameters)
                {
                    cadoutput.ManufacturingParameter[i++] = new CAD.ManufacturingParameterType()
                    {
                        Name = param.Key,
                        Value = param.Value
                    };
                }
            }

            if (MetaData != null && MetaData.Count != 0)
            {
                cadoutput.MetaData = new CAD.MetaDataType[MetaData.Count];

                int i = 0;
                foreach (var param in MetaData)
                {
                    cadoutput.MetaData[i++] = new CAD.MetaDataType()
                    {
                        Key = param.Key,
                        Value = param.Value
                    };
                }

            }

            cadoutput.Representation = representation;

            return cadoutput;
        }
Пример #5
0
        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,
                                                    component.SpecialDatums.Where(d => d.DatumName == "FRONT").FirstOrDefault()));

                    // top pair
                    pairlist.Add(MakeRootConstraint("TOP",
                                                    component.DisplayID,
                                                    ConfigID,
                                                    rootIsAsmType,
                                                    component.SpecialDatums.Where(d => d.DatumName == "TOP").FirstOrDefault()));

                    // right pair
                    pairlist.Add(MakeRootConstraint("RIGHT",
                                                    component.DisplayID,
                                                    ConfigID,
                                                    rootIsAsmType,
                                                    component.SpecialDatums.Where(d => d.DatumName == "RIGHT").FirstOrDefault()));

                    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);

                // 3/7/2016 - Export_All_Component_Points at TB level
                pointCoordinatesList.AddRange(component.PointCoordinatesList);
            }

            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);

                // 3/7/2016 - Export_All_Component_Points at TB level
                pointCoordinatesList.AddRange(component.PointCoordinatesList);
            }

            // 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);
        }