Exemplo n.º 1
0
        /// <summary>
        /// Render the list of form elements into a list of SubmodelElements.
        /// </summary>
        public AdminShell.SubmodelElementWrapperCollection AddOrUpdateDifferentElementsToCollection(
            AdminShell.SubmodelElementWrapperCollection elements,
            AdminShellPackageEnv packageEnv = null, bool addFilesToPackage = false)
        {
            // will be a list of newly added elements (for tracing)
            var res = new AdminShell.SubmodelElementWrapperCollection();

            // each description / instance pair
            foreach (var pair in this)
            {
                // ok, perform the actual add or update procedure
                var lst = pair.instances.AddOrUpdateSameElementsToCollection(elements, packageEnv, addFilesToPackage);

                // for newly added elements, shaping of idSHort might be required
                if (lst != null)
                {
                    foreach (var smw in lst)
                    {
                        // access
                        if (smw?.submodelElement?.idShort == null)
                        {
                            continue;
                        }

                        // check, if to make idShort unique?
                        FormInstanceHelper.MakeIdShortUnique(elements, smw.submodelElement);

                        // add to tracing
                        res.Add(smw);
                    }
                }
            }
            return(res);
        }
        public AdminShell.SubmodelElementWrapperCollection GenerateDefault()
        {
            var res = new AdminShell.SubmodelElementWrapperCollection();

            foreach (var desc in this)
            {
                AdminShell.SubmodelElement sme = null;

                // generate element

                if (desc is FormDescProperty)
                {
                    sme = (desc as FormDescProperty).GenerateDefault();
                }
                if (desc is FormDescMultiLangProp)
                {
                    sme = (desc as FormDescMultiLangProp).GenerateDefault();
                }
                if (desc is FormDescFile)
                {
                    sme = (desc as FormDescFile).GenerateDefault();
                }
                if (desc is FormDescSubmodelElementCollection)
                {
                    sme = (desc as FormDescSubmodelElementCollection).GenerateDefault();
                }

                // multiplicity -> enumerate correctly
                FormInstanceHelper.MakeIdShortUnique(res, sme);

                if (sme != null)
                {
                    res.Add(sme);
                }
            }

            return(res);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Render the form description and adds or updates its instances into a list of SubmodelElements.
        /// </summary>
        public AdminShell.SubmodelElementWrapperCollection AddOrUpdateSameElementsToCollection(
            AdminShell.SubmodelElementWrapperCollection elements, AdminShellPackageEnv packageEnv = null,
            bool addFilesToPackage = false)
        {
            // access
            var res = new AdminShell.SubmodelElementWrapperCollection();

            if (this.SubInstances == null || this.workingDesc == null)
            {
                return(null);
            }

            // over all instances
            foreach (var ins in this.SubInstances)
            {
                // access
                if (!(ins is FormInstanceSubmodelElement))
                {
                    continue;
                }

                // only touched?
                if (!(ins is FormInstanceSubmodelElementCollection) && !ins.Touched)
                {
                    continue;
                }

                // this is not very nice: distinguish between SMECs und SMEs
                if (!(this.workingDesc is FormDescSubmodelElementCollection))
                {
                    var lst1 = (ins as FormInstanceSubmodelElement).AddOrUpdateSmeToCollection(
                        elements, packageEnv, addFilesToPackage);

                    // for monitoring purpose
                    res.AddRange(lst1);
                }
                else
                {
                    // Special case: SMEC

                    // the Same-Instance was already prepared, however it needs to be eventually
                    // filled with the new elements
                    var smecInst   = ins as FormInstanceSubmodelElementCollection;
                    var sourceSmec = smecInst?.sourceSme as AdminShell.SubmodelElementCollection;

                    AdminShell.SubmodelElementWrapperCollection newElems = null;
                    bool addMode = false;
                    if (sourceSmec == null)
                    {
                        // will become a NEW SMEC !
                        newElems = new AdminShell.SubmodelElementWrapperCollection();
                        addMode  = true;
                    }
                    else
                    {
                        // will be added to an existing SMEC
                        newElems = sourceSmec.value;
                        addMode  = false;
                    }

                    var lst = (ins as FormInstanceSubmodelElement).AddOrUpdateSmeToCollection(
                        newElems, packageEnv, addFilesToPackage);

                    if (newElems != null && newElems.Count > 0)
                    {
                        var smec = smecInst?.sme as AdminShell.SubmodelElementCollection;

                        // really add a new instances of the SMEC
                        if (addMode && smecInst != null && smec != null)
                        {
                            // add
                            if (smec.value == null)
                            {
                                smec.value = new AdminShellV20.SubmodelElementWrapperCollection();
                            }
                            smec.value.AddRange(newElems);

                            // make smec unique
                            FormInstanceHelper.MakeIdShortUnique(elements, smec);

                            // to (outer) elements
                            elements.Add(smec);
                        }

                        // for monitoring purpose
                        res.AddRange(lst);
                    }
                }
            }

            // now, check if original SMEs are missing in the Instances and have therefore be removed
            // (kind of post-mortem analysis)
            if (this.InitialSourceElements != null)
            {
                foreach (var ise in this.InitialSourceElements)
                {
                    // exclude trivial cases
                    if (ise == null)
                    {
                        continue;
                    }

                    // manually search
                    var found = false;
                    foreach (var ins in this.SubInstances)
                    {
                        if (ins != null && ins is FormInstanceSubmodelElement &&
                            (ins as FormInstanceSubmodelElement).sourceSme == ise)
                        {
                            found = true;
                        }
                    }

                    // if not foudnd, DELETE original element
                    if (!found)
                    {
                        elements.Remove(ise);
                    }
                }
            }

            // ok
            return(res);
        }