/// <summary> /// Create form descriptions for the new v1.1 template of VDIO2770 /// </summary> public static FormDescSubmodelElementCollection CreateVdi2770v11TemplateDesc() { // shortcut var defs = AasxPredefinedConcepts.VDI2770v11.Static; // DocumentItem var descDoc = new FormDescSubmodelElementCollection( "Document", FormMultiplicity.ZeroToMany, defs.CD_Document?.GetSingleKey(), "Document{0:00}", "Each document item comprises a set of elements describing the information of a VDI 2770 Document " + "with directly attached DocumentVersion."); // DocumentIdDomain var descDocIdDom = new FormDescSubmodelElementCollection( "DocumentIdDomain", FormMultiplicity.OneToMany, defs.CD_DocumentId?.GetSingleKey(), "DocumentIdDomain{0:00}", "Set of information on the Document within a given domain, e.g. the providing organisation."); descDoc.Add(descDocIdDom); descDocIdDom.Add(new FormDescProperty( "DocumentDomainId", FormMultiplicity.One, defs.CD_DocumentDomainId?.GetSingleKey(), "DocumentDomainId", "Identification of the Domain, e.g. the providing organisation.")); descDocIdDom.Add(new FormDescProperty( "DocumentId", FormMultiplicity.One, defs.CD_DocumentId?.GetSingleKey(), "DocumentId", "Identification of the Document within a given domain, e.g. the providing organisation.")); descDocIdDom.Add(new FormDescProperty( "IsPrimary", FormMultiplicity.ZeroToOne, defs.CD_IsPrimary?.GetSingleKey(), "IsPrimary", "Flag indicating that a DocumentId within a collection of at least two DocumentId`s is the " + "‘primary’ identifier for the document. This is the preferred ID of the document (commonly from " + "the point of view of the owner of the asset).")); // DocumentClassification var descDocClass = new FormDescSubmodelElementCollection( "DocumentClassification", FormMultiplicity.ZeroToMany, defs.CD_DocumentClassification?.GetSingleKey(), "DocumentClassification{0:00}", "Set of information on the Document within a given domain, e.g. the providing organisation."); descDoc.Add(descDocClass); var descDocClassSystem = new FormDescProperty( "ClassificationSystem", FormMultiplicity.One, defs.CD_ClassificationSystem?.GetSingleKey(), "ClassificationSystem", "Identification of the classification system. A classification according to " + "VDI2770:2018 shall be given."); descDocClassSystem.comboBoxChoices = new[] { "VDI2770:2018", "IEC 61355-1:2008", "IEC/IEEE 82079-1:2019" }; descDocClass.Add(descDocClassSystem); var descDocClassId = new FormDescProperty( "ClassId", FormMultiplicity.One, defs.CD_ClassId?.GetSingleKey(), "ClassId", "ClassId of the document in VDI2770 or other."); var cbList = new List <string>(new[] { "(free text)" }); var vlList = new List <string>(new[] { "" }); foreach (var dc in (DefinitionsVDI2770.Vdi2770DocClass[])Enum.GetValues( typeof(DefinitionsVDI2770.Vdi2770DocClass))) { if ((int)dc == 0) { continue; } cbList.Add("VDI2770 - " + DefinitionsVDI2770.GetDocClass(dc) + " - " + DefinitionsVDI2770.GetDocClassName(dc)); vlList.Add("" + DefinitionsVDI2770.GetDocClass(dc)); } descDocClassId.comboBoxChoices = cbList.ToArray(); descDocClassId.valueFromComboBoxIndex = vlList.ToArray(); descDocClass.Add(descDocClassId); var descDocName = new FormDescProperty( "ClassName", FormMultiplicity.One, defs.CD_ClassName?.GetSingleKey(), "ClassName", "ClassName of the document in VDI2770 or other. " + "This property is automatically computed based on ClassId."); descDocName.SlaveOfIdShort = "ClassId"; descDocName.valueFromMasterValue = new Dictionary <string, string>(); descDocName.valueFromMasterValue.Add("", ""); foreach (var dc in (DefinitionsVDI2770.Vdi2770DocClass[])Enum.GetValues( typeof(DefinitionsVDI2770.Vdi2770DocClass))) { descDocName.valueFromMasterValue.Add( DefinitionsVDI2770.GetDocClass(dc), DefinitionsVDI2770.GetDocClassName(dc)); } descDocClass.Add(descDocName); // DocumentVersion var descDocVer = new FormDescSubmodelElementCollection( "DocumentVersion", FormMultiplicity.OneToMany, defs.CD_DocumentVersion?.GetSingleKey(), "DocumentVersion", "VDI2770 allows for multiple DocumentVersions for a document to be delivered."); descDoc.Add(descDocVer); descDocVer.Add(new FormDescProperty( "Languages", FormMultiplicity.OneToMany, defs.CD_Language?.GetSingleKey(), "Language{0:00}", "List of languages used in the DocumentVersion. For most cases, " + "at least one language shall be given.")); descDocVer.Add(new FormDescProperty( "DocumentVersionId", FormMultiplicity.One, defs.CD_DocumentVersionId?.GetSingleKey(), "DocumentVersionId", "Unambigous identification number of a DocumentVersion.")); descDocVer.Add(new FormDescMultiLangProp( "Title", FormMultiplicity.One, defs.CD_Title?.GetSingleKey(), "Title", "Language dependent title of the document.")); descDocVer.Add(new FormDescMultiLangProp( "SubTitle", FormMultiplicity.ZeroToOne, defs.CD_SubTitle?.GetSingleKey(), "SubTitle", "Language dependent sub title of the document.")); descDocVer.Add(new FormDescMultiLangProp( "Summary", FormMultiplicity.One, defs.CD_Summary?.GetSingleKey(), "Summary", "Language dependent summary of the document.")); descDocVer.Add(new FormDescMultiLangProp( "Keywords", FormMultiplicity.One, defs.CD_KeyWords?.GetSingleKey(), "Keywords", "Language dependent keywords of the document.")); descDocVer.Add(new FormDescProperty( "SetDate", FormMultiplicity.One, defs.CD_SetDate?.GetSingleKey(), "SetDate", "Date when the document status was set. Format is YYYY-MM-dd.")); var descStatus = new FormDescProperty( "StatusValue", FormMultiplicity.One, defs.CD_StatusValue?.GetSingleKey(), "StatusValue", "Each document version represents a point in time in the document life cycle. " + "This status value refers to the milestones in the document life cycle. " + "The following two statuses should be used for the application of this guideline: " + "InReview (under review), Released (released)."); descDocVer.Add(descStatus); descStatus.comboBoxChoices = new[] { "InReview", "Released" }; descDocVer.Add(new FormDescProperty( "OrganizationName", FormMultiplicity.One, defs.CD_OrganizationName?.GetSingleKey(), "OrganizationName", "Organiziation name of the author of the Document.")); descDocVer.Add(new FormDescProperty( "OrganizationOfficialName", FormMultiplicity.One, defs.CD_OrganizationOfficialName?.GetSingleKey(), "OrganizationOfficialName", "Official name of the organization of author of the Document " + "(which might be longer or include legal information).")); descDocVer.Add(new FormDescFile( "DigitalFile", FormMultiplicity.OneToMany, defs.CD_DigitalFile?.GetSingleKey(), "DigitalFile{0:00}", "Digital file, which represents the Document and DocumentVersion. " + "A PDF/A format is required for textual representations.")); descDocVer.Add(new FormDescFile( "PreviewFile", FormMultiplicity.ZeroToOne, defs.CD_PreviewFile?.GetSingleKey(), "PreviewFile{0:00}", "Provides a preview image of the Document, e.g. first page, in a commonly used " + "image format and low resolution.")); descDocVer.Add(new FormDescReferenceElement( "RefersTo", FormMultiplicity.ZeroToMany, defs.CD_RefersTo?.GetSingleKey(), "RefersTo{0:00}", "Forms a generic RefersTo-relationship to another Document or DocumentVersion. " + "They have a loose relationship.")); descDocVer.Add(new FormDescReferenceElement( "BasedOn", FormMultiplicity.ZeroToMany, defs.CD_BasedOn?.GetSingleKey(), "BasedOn{0:00}", "Forms a BasedOn-relationship to another Document or DocumentVersion. Typically states, that the " + "content of the document bases on another document (e.g. specification requirements). Both have a " + "strong relationship.")); descDocVer.Add(new FormDescReferenceElement( "TranslationOf", FormMultiplicity.ZeroToMany, defs.CD_TranslationOf?.GetSingleKey(), "TranslationOf{0:00}", "Forms a TranslationOf-relationship to another Document or DocumentVersion. Both have a " + "strong relationship.")); // back to Document descDoc.Add(new FormDescReferenceElement( "DocumentedEntity", FormMultiplicity.ZeroToOne, defs.CD_DocumentedEntity?.GetSingleKey(), "DocumentedEntity", "Identifies the Entity, which is subject to the Documentation.")); // end return(descDoc); }
private void ButtonTabPanels_Click(object sender, RoutedEventArgs e) { if (sender == ButtonCreateDoc) { // show the edit panel OuterTabControl.SelectedItem = TabPanelEdit; ButtonAddUpdateDoc.Content = "Add"; //// TODO (MIHO, 2020-09-29): if the V1.1 template works and is adopted, the old //// V1.0 shall be removed completely (over complicated) */ //// make a template description for the content (remeber it) var desc = theOptions.FormVdi2770; if (desc == null) { desc = DocumentShelfOptions.CreateVdi2770TemplateDesc(theOptions); } // latest version (from resources) if (this.CheckBoxLatestVersion.IsChecked == true) { desc = DocumentShelfOptions.CreateVdi2770v11TemplateDesc(); } this.currentFormDescription = desc; formInUpdateMode = false; updateSourceElements = null; // take over existing data this.currentFormInst = new FormInstanceSubmodelElementCollection(null, currentFormDescription); this.currentFormInst.PresetInstancesBasedOnSource(updateSourceElements); this.currentFormInst.outerEventStack = theEventStack; // bring it to the panel var elementsCntl = new FormListOfDifferentControl(); elementsCntl.ShowHeader = false; elementsCntl.DataContext = this.currentFormInst; ScrollViewerForm.Content = elementsCntl; } if (sender == ButtonAddUpdateDoc) { // add if (this.currentFormInst != null && this.currentFormDescription != null && thePackage != null && theOptions != null && theOptions.SemIdDocument != null && theSubmodel != null) { // on this level of the hierarchy, shall a new SMEC be created or shall // the existing source of elements be used? AdminShell.SubmodelElementWrapperCollection currentElements = null; if (formInUpdateMode && updateSourceElements != null) { currentElements = updateSourceElements; } else { currentElements = new AdminShell.SubmodelElementWrapperCollection(); } // create a sequence of SMEs try { this.currentFormInst.AddOrUpdateDifferentElementsToCollection( currentElements, thePackage, addFilesToPackage: true); } catch (Exception ex) { Log.Error(ex, "when adding Document"); } // the InstSubmodel, which started the process, should have a "fresh" SMEC available // make it unique in the Documentens Submodel var newSmc = this.currentFormInst?.sme as AdminShell.SubmodelElementCollection; // if not update, put them into the Document's Submodel if (!formInUpdateMode && currentElements != null && newSmc != null) { // make newSmc unique in the cotext of the Submodel FormInstanceHelper.MakeIdShortUnique(theSubmodel.submodelElements, newSmc); // add the elements newSmc.value = currentElements; // add the whole SMC theSubmodel.Add(newSmc); } #if __may_be_not__ // save directly to ensure consistency try { if (thePackage.Filename != null) { thePackage.SaveAs(thePackage.Filename); } } catch (Exception ex) { if (theLogger != null) { theLogger.Log( $"Saving package {thePackage.Filename} failed for adding Document " + $"and gave: {ex.Message}"); } } #endif } else { Log.Error("Preconditions for adding Document not met."); } // change back OuterTabControl.SelectedItem = TabPanelList; // re-display ParseSubmodelToListItems( this.theSubmodel, this.theOptions, theViewModel.TheSelectedDocClass, theViewModel.TheSelectedLanguage, theViewModel.TheSelectedListType); // re-display also in Explorer var evt = new AasxPluginResultEventRedrawAllElements(); if (theEventStack != null) { theEventStack.PushEvent(evt); } } if (sender == ButtonCancel) { OuterTabControl.SelectedItem = TabPanelList; } if (sender == ButtonFixCDs) { // check if CDs are present var theDefs = new AasxPredefinedConcepts.DefinitionsVDI2770.SetOfDefsVDI2770( new AasxPredefinedConcepts.DefinitionsVDI2770()); var theCds = theDefs.GetAllReferables().Where( (rf) => { return(rf is AdminShell.ConceptDescription); }).ToList(); // v11 if (CheckBoxLatestVersion.IsChecked == true) { theCds = AasxPredefinedConcepts.VDI2770v11.Static.GetAllReferables().Where( (rf) => { return(rf is AdminShell.ConceptDescription); }).ToList(); } if (theCds.Count < 1) { Log.Error( "Not able to find appropriate ConceptDescriptions in pre-definitions. " + "Aborting."); return; } // check for Environment var env = this.thePackage?.AasEnv; if (env == null) { Log.Error( "Not able to access AAS environment for set of Submodel's ConceptDescriptions. Aborting."); return; } // be safe? if (MessageBoxResult.Yes != MessageBox.Show( "Add missing ConceptDescriptions to the AAS?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning)) { return; } // ok, check int nr = 0; foreach (var x in theCds) { var cd = x as AdminShell.ConceptDescription; if (cd == null || cd.identification == null) { continue; } var cdFound = env.FindConceptDescription(cd.identification); if (cdFound != null) { continue; } // ok, add var newCd = new AdminShell.ConceptDescription(cd); env.ConceptDescriptions.Add(newCd); nr++; } // ok Log.Info("In total, {0} ConceptDescriptions were added to the AAS environment.", nr); } if (sender == ButtonCreateEntity) { // show the edit panel OuterTabControl.SelectedItem = TabPanelEntity; } if (sender == ButtonCancelEntity) { OuterTabControl.SelectedItem = TabPanelList; } if (sender == ButtonAddEntity && this.theSubmodel != null && TextBoxEntityIdShort.Text.Trim().HasContent()) { // add entity this.theSubmodel.SmeForWrite.CreateSMEForCD <AdminShell.Entity>( AasxPredefinedConcepts.VDI2770v11.Static.CD_DocumentedEntity, idShort: "" + TextBoxEntityIdShort.Text.Trim(), addSme: true); // switch back OuterTabControl.SelectedItem = TabPanelList; // re-display also in Explorer var evt = new AasxPluginResultEventRedrawAllElements(); if (theEventStack != null) { theEventStack.PushEvent(evt); } } }
/// <summary> /// Create a default template description for VDI2770 based on the SemanticIds from the <c>options</c> /// </summary> /// <param name="opt"></param> /// <returns></returns> public static FormDescSubmodelElementCollection CreateVdi2770TemplateDesc(DocumentShelfOptions opt) { if (opt == null) { return(null); } var semConfig = DocuShelfSemanticConfig.CreateDefault(); // DocumentItem var descDoc = new FormDescSubmodelElementCollection( "Document", FormMultiplicity.ZeroToMany, semConfig.SemIdDocument, "Document{0:00}", "Each document item comprises a set of elements describing the information of a VDI 2770 Document " + "with directly attached DocumentVersion."); // Document descDoc.Add(new FormDescProperty( "DocumentId", FormMultiplicity.One, semConfig.SemIdDocumentId, "DocumentId", "The combination of DocumentId and DocumentVersionId shall be unqiue.")); descDoc.Add(new FormDescProperty( "IsPrimary", FormMultiplicity.One, semConfig.SemIdIsPrimaryDocumentId, "IsPrimary", "True, if primary document id for the document.")); var descDocClass = new FormDescProperty( "ClassId", FormMultiplicity.One, semConfig.SemIdDocumentClassId, "ClassId", "VDI2770 ClassId of the document."); var cbList = new List <string>(); var vlList = new List <string>(); foreach (var dc in (DefinitionsVDI2770.Vdi2770DocClass[])Enum.GetValues( typeof(DefinitionsVDI2770.Vdi2770DocClass))) { if ((int)dc == 0) { continue; } cbList.Add("" + DefinitionsVDI2770.GetDocClass(dc) + " - " + DefinitionsVDI2770.GetDocClassName(dc)); vlList.Add("" + DefinitionsVDI2770.GetDocClass(dc)); } descDocClass.comboBoxChoices = cbList.ToArray(); descDocClass.valueFromComboBoxIndex = vlList.ToArray(); descDoc.Add(descDocClass); var descDocName = new FormDescProperty( "ClassName", FormMultiplicity.One, semConfig.SemIdDocumentClassName, "ClassName", "VDI2770 ClassName of the document. This property is automaticall computed based on ClassId.", isReadOnly: true); descDocName.SlaveOfIdShort = "ClassId"; descDocName.valueFromMasterValue = new Dictionary <string, string>(); foreach (var dc in (DefinitionsVDI2770.Vdi2770DocClass[])Enum.GetValues( typeof(DefinitionsVDI2770.Vdi2770DocClass))) { descDocName.valueFromMasterValue.Add( DefinitionsVDI2770.GetDocClass(dc), DefinitionsVDI2770.GetDocClassName(dc)); } descDoc.Add(descDocName); descDoc.Add( new FormDescProperty( "ClassificationSystem", FormMultiplicity.One, semConfig.SemIdDocumentClassificationSystem, "ClassificationSystem", "This property is always set to VDI2770:2018", isReadOnly: true, presetValue: "VDI2770:2018")); descDoc.Add(new FormDescProperty( "ReferencedObject", FormMultiplicity.One, semConfig.SemIdReferencedObject, "ReferencedObject", "Reference to Asset or Entity, on which the Document is related to.")); // DocumentVersion var descDocVer = new FormDescSubmodelElementCollection( "DocumentVersion", FormMultiplicity.OneToMany, semConfig.SemIdDocumentVersion, "DocumentVersion", "VDI2770 allows for multiple DocumentVersions for a document to be delivered."); descDoc.Add(descDocVer); descDocVer.Add(new FormDescProperty( "DocumentVersionId", FormMultiplicity.One, semConfig.SemIdDocumentVersionIdValue, "DocumentVersionId", "The combination of DocumentId and DocumentVersionId shall be unqiue.")); descDocVer.Add(new FormDescProperty( "Languages", FormMultiplicity.ZeroToMany, semConfig.SemIdLanguage, "Language{0}", "List of languages used in the DocumentVersion. For most cases, " + "at least one language shall be given.")); descDocVer.Add(new FormDescMultiLangProp( "Title", FormMultiplicity.One, semConfig.SemIdTitle, "Title", "Language dependent title of the document.")); descDocVer.Add(new FormDescMultiLangProp( "Summary", FormMultiplicity.One, semConfig.SemIdSummary, "Summary", "Language dependent summary of the document.")); descDocVer.Add(new FormDescMultiLangProp( "Keywords", FormMultiplicity.One, semConfig.SemIdKeywords, "Keywords", "Language dependent keywords of the document.")); descDocVer.Add(new FormDescFile( "DigitalFile", FormMultiplicity.OneToMany, semConfig.SemIdDigitalFile, "DigitalFile{0:00}", "Digital file, which represents the Document and DocumentVersion. " + "A PDF/A format is required for textual representations.")); descDocVer.Add(new FormDescProperty( "SetDate", FormMultiplicity.One, semConfig.SemIdDate, "SetDate", "Date when the document was introduced into the AAS or set to the status. Format is YYYY-MM-dd.")); var descStatus = new FormDescProperty( "StatusValue", FormMultiplicity.One, semConfig.SemIdStatusValue, "StatusValue", "Each document version represents a point in time in the document life cycle. " + "This status value refers to the milestones in the document life cycle. " + "The following two statuses should be used for the application of this guideline: " + "InReview (under review), Released (released)."); descDocVer.Add(descStatus); descStatus.comboBoxChoices = new[] { "InReview", "Released" }; var descRole = new FormDescProperty( "Role", FormMultiplicity.One, semConfig.SemIdRole, "Role", "Define a role for the organisation according to the following selection list."); descDocVer.Add(descRole); descRole.comboBoxChoices = new[] { "Author", "Customer", "Supplier", "Manufacturer", "Responsible" }; descDocVer.Add(new FormDescProperty( "OrganizationName", FormMultiplicity.One, semConfig.SemIdOrganizationName, "OrganizationName", "Common name for the organisation.")); descDocVer.Add(new FormDescProperty( "OrganizationOfficialName", FormMultiplicity.One, semConfig.SemIdOrganizationOfficialName, "OrganizationOfficialName", "Official name for the organisation (which might be longer or include legal information).")); return(descDoc); }
private void ButtonTabPanels_Click(object sender, RoutedEventArgs e) { if (sender == ButtonCreateDoc) { // show the edit panel OuterTabControl.SelectedItem = TabPanelEdit; ButtonAddUpdateDoc.Content = "Add"; // make a template description for the content (remeber it) var desc = theOptions.FormVdi2770; if (desc == null) { desc = DocumentShelfOptions.CreateVdi2770TemplateDesc(theOptions); } this.currentFormDescription = desc; formInUpdateMode = false; updateSourceElements = null; // take over existing data this.currentFormInst = new FormInstanceSubmodelElementCollection(null, currentFormDescription); this.currentFormInst.PresetInstancesBasedOnSource(updateSourceElements); // bring it to the panel var elementsCntl = new FormListOfDifferentControl(); elementsCntl.ShowHeader = false; elementsCntl.DataContext = this.currentFormInst; ScrollViewerForm.Content = elementsCntl; } if (sender == ButtonAddUpdateDoc) { // add if (this.currentFormInst != null && this.currentFormDescription != null && thePackage != null && theOptions != null && theOptions.SemIdDocument != null && theSubmodel != null) { // on this level of the hierarchy, shall a new SMEC be created or shall // the existing source of elements be used? AdminShell.SubmodelElementWrapperCollection currentElements = null; if (formInUpdateMode && updateSourceElements != null) { currentElements = updateSourceElements; } else { currentElements = new AdminShell.SubmodelElementWrapperCollection(); } // create a sequence of SMEs try { this.currentFormInst.AddOrUpdateDifferentElementsToCollection( currentElements, thePackage, addFilesToPackage: true); } catch (Exception ex) { Log.Error(ex, "when adding Document"); } // the InstSubmodel, which started the process, should have a "fresh" SMEC available // make it unique in the Documentens Submodel var newSmc = this.currentFormInst?.sme as AdminShell.SubmodelElementCollection; // if not update, put them into the Document's Submodel if (!formInUpdateMode && currentElements != null && newSmc != null) { // make newSmc unique in the cotext of the Submodel FormInstanceHelper.MakeIdShortUnique(theSubmodel.submodelElements, newSmc); // add the elements newSmc.value = currentElements; // add the whole SMC theSubmodel.Add(newSmc); } #if __may_be_not__ // save directly to ensure consistency try { if (thePackage.Filename != null) { thePackage.SaveAs(thePackage.Filename); } } catch (Exception ex) { if (theLogger != null) { theLogger.Log( $"Saving package {thePackage.Filename} failed for adding Document " + $"and gave: {ex.Message}"); } } #endif } else { Log.Error("Preconditions for adding Document not met."); } // change back OuterTabControl.SelectedItem = TabPanelList; // re-display ParseSubmodelToListItems( this.theSubmodel, this.theOptions, theViewModel.TheSelectedDocClass, theViewModel.TheSelectedLanguage, theViewModel.TheSelectedListType); // re-display also in Explorer var evt = new AasxPluginResultEventRedrawAllElements(); if (theEventStack != null) { theEventStack.PushEvent(evt); } } if (sender == ButtonCancel) { OuterTabControl.SelectedItem = TabPanelList; } }