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