Exemple #1
0
        // Only accept ComponentAssembly and DesignContainer
        public static DesignModel Convert(CyPhy.DesignEntity de)
        {
            if (!(de.Kind == "ComponentAssembly" || de.Kind == "DesignContainer"))
            {
                return(null);
            }

            ResetCache();

            var dm = new DesignModel {
                Name = de.Name
            };
            Container rootContainerType = null;


            if (de is CyPhy.ComponentAssembly)
            {
                String s_ID = (de as CyPhy.ComponentAssembly).Attributes.ConfigurationUniqueID;
                if (string.IsNullOrEmpty(s_ID))
                {
                    s_ID = Guid.NewGuid().ToString("B");
                    (de as CyPhy.ComponentAssembly).Attributes.ConfigurationUniqueID = s_ID;
                }
                if (s_ID.IndexOf("{") != 0)
                {
                    // Add curly braces
                    s_ID = string.Concat("{", s_ID, "}");
                }
                dm.DesignID = s_ID;

                rootContainerType = new Compound();
            }
            else if (de is CyPhy.DesignContainer)
            {
                dm.DesignID = (de as CyPhy.DesignContainer).Impl.GetGuidDisp();
                switch (((CyPhy.DesignContainer)de).Attributes.ContainerType)
                {
                case CyPhyClasses.DesignContainer.AttributesClass.ContainerType_enum.Compound:
                    rootContainerType = new Compound();
                    break;

                case CyPhyClasses.DesignContainer.AttributesClass.ContainerType_enum.Alternative:
                    rootContainerType = new Alternative();
                    break;

                case CyPhyClasses.DesignContainer.AttributesClass.ContainerType_enum.Optional:
                    rootContainerType = new Optional();
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }


            // Add single ContainerType for the root level Container

            dm.Containers.AddItem(rootContainerType);
            rootContainerType.Name = de.Name;
            rootContainerType.id   = GetOrSetID(de);

            // Update DesignModel by calling recursive update method
            var innerPortInstances     = new Dictionary <CyPhy.Port, PortInstance>();
            var containerPortInstances = new Dictionary <CyPhy.Port, ContainerPort>();

            var innerStructuralPortInstances     = new Dictionary <CyPhy.Port, StructuralInterfaceInstance>();
            var containerStructuralPortInstances = new Dictionary <CyPhy.Port, ContainerStructuralInterface>();

            var connections    = new List <Connection>();
            var simpleFormulas = new Dictionary <CyPhy.SimpleFormula, ContainerCalculation>();

            // Can contain: ContainerNamedValue/ContainerCalculation/ComponentNamedValueInstance
            var valueInstances = new Dictionary <CyPhy.ValueFlowTarget, AVM.META.Design.ValueType>();


            UpdateSubContainers(new DesignPrimitivesWrapper(de), rootContainerType, dm, innerPortInstances, containerPortInstances, connections, simpleFormulas, valueInstances, innerStructuralPortInstances, containerStructuralPortInstances);


            #region Create AllPorts dictionary
            var allPorts = new Dictionary <CyPhy.Port, AbstractPort>();

            foreach (var portInstance in innerPortInstances)
            {
                allPorts.Add(portInstance.Key, portInstance.Value);
            }

            foreach (var containerPort in containerPortInstances)
            {
                allPorts.Add(containerPort.Key, containerPort.Value);
            }

            #endregion

            #region Create AllStructuralPorts dictionary
            var allStructuralPorts = new Dictionary <CyPhy.Port, AbstractStructuralInterface>();

            foreach (var abstractPortInstance in innerStructuralPortInstances)
            {
                allStructuralPorts.Add(abstractPortInstance.Key, abstractPortInstance.Value);
            }

            foreach (var abstractContainerPort in containerStructuralPortInstances)
            {
                allStructuralPorts.Add(abstractContainerPort.Key, abstractContainerPort.Value);
            }

            #endregion


            #region Join Structures -> PortConnectors

            // Pair construct
            //ConvertJoinStructures(dm, innerPortInstances, connections.OfType<CyPhy.JoinStructures>());


            // Grouping construct
            //ConvertJoinStrucutresInGroups(GetStructuralPortGroups(allPorts, connections.OfType<CyPhy.JoinStructures>()), dm, allPorts);

            // Pair construct

            #endregion

            #region ValueFlow -> ValueConnector

            ConvertValueFlows(dm, connections.OfType <CyPhy.ValueFlow>(), simpleFormulas, allPorts, valueInstances);

            #endregion

            return(dm);
        }
Exemple #2
0
        private static void UpdateSubContainers(DesignPrimitivesWrapper de,
                                                Container rootContainerType,
                                                DesignModel rootDesignModel,
                                                Dictionary <CyPhy.Port, PortInstance> cyphyPorts2PortInstances,
                                                Dictionary <CyPhy.Port, ContainerPort> containerPorts,
                                                List <Connection> connectionsToBeVisited,
                                                Dictionary <CyPhy.SimpleFormula, ContainerCalculation> simpleFormulas,
                                                Dictionary <CyPhy.ValueFlowTarget, AVM.META.Design.ValueType> valueInstances,
                                                Dictionary <CyPhy.Port, StructuralInterfaceInstance> innerStructuralPortInstances,
                                                Dictionary <CyPhy.Port, ContainerStructuralInterface> containerStructuralPortInstances)
        {
            System.Diagnostics.Debug.WriteLine(de.Path);

            // Init list
            if (rootContainerType.ContainerPorts == null)
            {
                rootContainerType.ContainerPorts = new List <ContainerPort>();
            }
            rootContainerType.ComponentInstances = new List <ComponentInstance>();

            // Add Powerflows, JointStrucutres and ValueFlows for later steps
            connectionsToBeVisited.AddRange(de.ValueFlows);


            #region Handle ComponentRefs
            var componentRefs = de.ComponentRefs;
            foreach (var compRef in componentRefs)
            {
                var isComponent = false;
                try
                {
                    var c = compRef.Referred.Component;
                    // line above throws an exception if it is not a component
                    isComponent = true;
                }
                catch
                {
                }

                if (compRef != null && isComponent)
                {
                    CyPhy.Component comp = compRef.Referred.Component;
                    System.Diagnostics.Debug.WriteLine(comp.Path);

                    ComponentInstance compInst = Component2ComponentInstance(comp);
                    rootContainerType.ComponentInstances.AddItem(compInst);
                    compInst.Name = compRef.Name;
                    //compInst.id = GetOrSetID(compRef);
                    //compInst.id = compRef.Guid.ToString();

                    String instanceGUID = compRef.Attributes.InstanceGUID;
                    // Set this value if not set
                    if (String.IsNullOrWhiteSpace(instanceGUID))
                    {
                        compRef.Attributes.InstanceGUID = compRef.Guid.ToString();
                        instanceGUID = compRef.Attributes.InstanceGUID;
                    }
                    compInst.id = compRef.Attributes.InstanceGUID;


                    String s_SrcDesignSpaceContainerID = GetDesignSpaceSourceObjectID(compRef);
                    if (!String.IsNullOrWhiteSpace(s_SrcDesignSpaceContainerID))
                    {
                        compInst.SrcDesignSpaceContainerID = s_SrcDesignSpaceContainerID;
                    }

                    // Update Component's PortInstances
                    compInst.PortInstances = new List <PortInstance>();
                    foreach (CyPhy.Port port in comp.Children.PortCollection)
                    {
#if TRACK_PORT_ID
                        var portInst = new PortInstance {
                            IDinSourceModel = port.ID
                        };
#else
                        var portInst = new PortInstance {
                            IDinSourceModel = port.Attributes.ID
                        };
#endif
                        //var portInst = new PortInstance { IDinSourceModel = port.ID };
                        compInst.PortInstances.AddItem(portInst);

                        if (!cyphyPorts2PortInstances.ContainsKey(port))
                        {
                            cyphyPorts2PortInstances.Add(port, portInst); // Update Ports list
                        }
                    }

                    // Convert parameters
                    foreach (var p in comp.Children.ParameterCollection)
                    {
                        double result = 0;
                        double.TryParse(p.Attributes.Value, out result);
                        var componentNamedValueInstance = new ComponentNamedValueInstance {
                            IDinComponentModel = p.Attributes.ID, Value = result
                        };
                        compInst.NamedValueInstances.AddItem(componentNamedValueInstance);
                        if (valueInstances.ContainsKey(p))
                        {
                            continue;
                        }

                        valueInstances.Add(p, componentNamedValueInstance);
                    }

                    // Convert properties
                    foreach (var p in comp.Children.PropertyCollection)
                    {
                        double result = 0;
                        double.TryParse(p.Attributes.Value, out result);
                        var componentNamedValueInstance = new ComponentNamedValueInstance {
                            IDinComponentModel = p.Attributes.ID, Value = result
                        };
                        compInst.NamedValueInstances.AddItem(componentNamedValueInstance);
                        if (valueInstances.ContainsKey(p))
                        {
                            continue;
                        }

                        valueInstances.Add(p, componentNamedValueInstance);
                    }
                }
            }
            #endregion

            #region Handle Component instances
            List <CyPhy.Component> lcChildComps = de.Components;

            foreach (CyPhy.Component comp in lcChildComps)
            {
                System.Diagnostics.Debug.WriteLine(comp.Path);

                ComponentInstance compInst = Component2ComponentInstance(comp);
                rootContainerType.ComponentInstances.AddItem(compInst);

                // Update Component's PortInstances
                compInst.PortInstances = new List <PortInstance>();
                foreach (CyPhy.Port port in comp.Children.PortCollection)
                {
#if TRACK_PORT_ID
                    var structPort = new StructuralInterfaceInstance {
                        IDinSourceModel = port.ID
                    };
#else
                    var structPort = new StructuralInterfaceInstance {
                        IDinSourceModel = port.Attributes.ID
                    };
#endif
                    if (!innerStructuralPortInstances.ContainsKey(port))
                    {
                        innerStructuralPortInstances.Add(port, structPort);
                        compInst.StructuralInterfaceInstances.Add(structPort);
                    }

#if TRACK_PORT_ID
                    var portInst = new PortInstance {
                        IDinSourceModel = port.ID
                    };
#else
                    var portInst = new PortInstance {
                        IDinSourceModel = port.Attributes.ID
                    };
#endif
                    compInst.PortInstances.AddItem(portInst);

                    if (!cyphyPorts2PortInstances.ContainsKey(port))
                    {
                        cyphyPorts2PortInstances.Add(port, portInst); // Update Ports list
                    }
                }

                // Convert parameters
                foreach (var p in comp.Children.ParameterCollection)
                {
                    double result = 0;
                    double.TryParse(p.Attributes.Value, out result);
                    var componentNamedValueInstance = new ComponentNamedValueInstance {
                        IDinComponentModel = p.Attributes.ID, Value = result
                    };
                    compInst.NamedValueInstances.AddItem(componentNamedValueInstance);
                    if (valueInstances.ContainsKey(p))
                    {
                        continue;
                    }

                    valueInstances.Add(p, componentNamedValueInstance);
                }

                // Convert properties
                foreach (var p in comp.Children.PropertyCollection)
                {
                    double result = 0;
                    double.TryParse(p.Attributes.Value, out result);
                    var componentNamedValueInstance = new ComponentNamedValueInstance {
                        IDinComponentModel = p.Attributes.ID, Value = result
                    };
                    compInst.NamedValueInstances.AddItem(componentNamedValueInstance);
                    if (valueInstances.ContainsKey(p))
                    {
                        continue;
                    }

                    valueInstances.Add(p, componentNamedValueInstance);
                }
            }
            #endregion

            // Recursively add all ContainerTypes from sub-DesignEntities
            rootContainerType.Containers = new List <Container>();
            var ldeDesignEntityChildren = de.ComponentAssemblies.Cast <CyPhy.DesignEntity>().ToList();
            ldeDesignEntityChildren.AddRange(de.DesignContainers);

            foreach (CyPhy.DesignEntity subDE in ldeDesignEntityChildren)
            {
                Container subRootContainerType;
                if (subDE is CyPhy.DesignContainer &&
                    (subDE as CyPhy.DesignContainer).Attributes.ContainerType == CyPhyClasses.DesignContainer.AttributesClass.ContainerType_enum.Compound)
                {
                    subRootContainerType = new Compound();
                }
                else if (subDE is CyPhy.DesignContainer &&
                         (subDE as CyPhy.DesignContainer).Attributes.ContainerType == CyPhyClasses.DesignContainer.AttributesClass.ContainerType_enum.Alternative)
                {
                    subRootContainerType = new Alternative();
                }
                else if (subDE is CyPhy.DesignContainer &&
                         (subDE as CyPhy.DesignContainer).Attributes.ContainerType == CyPhyClasses.DesignContainer.AttributesClass.ContainerType_enum.Optional)
                {
                    subRootContainerType = new Optional();
                }
                else if (subDE is CyPhy.ComponentAssembly)
                {
                    subRootContainerType = new Compound();
                }
                else
                {
                    continue;
                }

                subRootContainerType.Name = subDE.Name;
                subRootContainerType.id   = GetOrSetID(subDE);

                rootContainerType.Containers.AddItem(subRootContainerType);

                UpdateSubContainers(new DesignPrimitivesWrapper(subDE), subRootContainerType, rootDesignModel, cyphyPorts2PortInstances, containerPorts, connectionsToBeVisited, simpleFormulas, valueInstances, innerStructuralPortInstances, containerStructuralPortInstances);
            }

            #region Elements on the current container

            // Convert simple formulas
            foreach (var sf in de.SimpleFormulas)
            {
                var containerCalculation = new ContainerCalculation();
                rootContainerType.ContainerValues.AddItem(containerCalculation);
                simpleFormulas[sf] = containerCalculation;
            }

            // Add container ports (from ports)
            foreach (var port in de.Ports)
            {
                if (containerPorts.ContainsKey(port))
                {
                    continue;
                }

                var pi = new ContainerPort();
                containerPorts.Add(port, pi);
                rootContainerType.ContainerPorts.AddItem(pi);
            }

            // Convert parameters
            foreach (var p in de.Parameters)
            {
                var containerNamedValue = new ContainerNamedValue {
                    IsParameter = true, Value = p.Attributes.Value
                };
                rootContainerType.ContainerValues.AddItem(containerNamedValue);
                if (valueInstances.ContainsKey(p))
                {
                    continue;
                }

                valueInstances.Add(p, containerNamedValue);
            }

            // Convert properties
            foreach (var p in de.Properties)
            {
                var containerNamedValue = new ContainerNamedValue {
                    IsParameter = false, Value = p.Attributes.Value
                };
                rootContainerType.ContainerValues.AddItem(containerNamedValue);
                if (valueInstances.ContainsKey(p))
                {
                    continue;
                }

                valueInstances.Add(p, containerNamedValue);
            }

            #endregion
        }