From b5eea4d0153c77c502f226cc4ee581515e018c72 Mon Sep 17 00:00:00 2001 From: Alina Geesen Date: Thu, 11 Jul 2024 11:00:51 +0200 Subject: [PATCH] feat show archetype of hierarchical submodel and refactor visualization --- .../_components/submodel/SubmodelDetail.tsx | 2 +- .../ArchetypeDetailsDialog.tsx | 28 ++++++++++ .../HierarchicalStructuresDetail.tsx | 54 ++++++++++++++++++- .../enums/SubmodelElementSemanticId.enum.ts | 1 + src/lib/enums/SubmodelSemanticId.enum.ts | 3 +- 5 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 src/app/[locale]/viewer/_components/submodel/hierarchical-structures/ArchetypeDetailsDialog.tsx diff --git a/src/app/[locale]/viewer/_components/submodel/SubmodelDetail.tsx b/src/app/[locale]/viewer/_components/submodel/SubmodelDetail.tsx index d8e6421..f6cabf6 100644 --- a/src/app/[locale]/viewer/_components/submodel/SubmodelDetail.tsx +++ b/src/app/[locale]/viewer/_components/submodel/SubmodelDetail.tsx @@ -47,7 +47,7 @@ export function SubmodelDetail(props: SubmodelDetailProps) { ); - } else if (semanticId === SubmodelSemanticId.HierarchicalStructures) { + } else if (semanticId === SubmodelSemanticId.HierarchicalStructuresV10 || semanticId === SubmodelSemanticId.HierarchicalStructuresV11) { return ( diff --git a/src/app/[locale]/viewer/_components/submodel/hierarchical-structures/ArchetypeDetailsDialog.tsx b/src/app/[locale]/viewer/_components/submodel/hierarchical-structures/ArchetypeDetailsDialog.tsx new file mode 100644 index 0000000..6af8880 --- /dev/null +++ b/src/app/[locale]/viewer/_components/submodel/hierarchical-structures/ArchetypeDetailsDialog.tsx @@ -0,0 +1,28 @@ +import { Dialog, DialogContent } from '@mui/material'; +import React from 'react'; + +type ArchetypeDetailsModalProps = { + readonly handleClose: () => void; + readonly open: boolean; +}; + +export function ArchetypeDetailsDialog(props: ArchetypeDetailsModalProps) { + return ( + + +
+

Full

+ This Submodel Template allows to model a full hierarchy (including sub assets) in a single Submodel. This is useful if Entities representing Co-Managed Entities have to be expressed, as Co-Managed-Entities typically do not have an Asset Administration Shell of their own. In addition, full modeling also allows a version status to be kept centrally. +
+
+

OneDown

+ The One Down archetype is useful for subsystem or component manufactures. For any given Asset in the hierarchy tree, an AAS corresponding to the Asset shall exists. The AAS shall contain a Submodel expressing the one down excerpt view starting with the Asset of the AAS. This type allows the modelling of a consistent stand-alone hierarchy in the engineering-phase of the subsystem. The integration is done by adding the subsystem in a top-level system via the given rules of this Submodel Template, e.g., with the HasPart Relation. +
+
+

OneUp

+ The One Up relationship is suitable for describing the installation location of an asset. This enables the asset to provide information without external asset administration shells (e.g., in offline scenarios). In addition, the installation location can already be determined when the parent asset and its AAS are still in the planning stage. +
+
+
+ ); +} diff --git a/src/app/[locale]/viewer/_components/submodel/hierarchical-structures/HierarchicalStructuresDetail.tsx b/src/app/[locale]/viewer/_components/submodel/hierarchical-structures/HierarchicalStructuresDetail.tsx index 466feec..5bdd008 100644 --- a/src/app/[locale]/viewer/_components/submodel/hierarchical-structures/HierarchicalStructuresDetail.tsx +++ b/src/app/[locale]/viewer/_components/submodel/hierarchical-structures/HierarchicalStructuresDetail.tsx @@ -12,6 +12,11 @@ import { cloneDeep } from 'lodash'; import { SubmodelElementSemanticId } from 'lib/enums/SubmodelElementSemanticId.enum'; import { GetKeyType } from 'lib/util/KeyTypeUtil'; import { GetEntityType } from 'lib/util/EntityTypeUtil'; +import { Box, IconButton } from '@mui/material'; +import { SubmodelElementRenderer } from '../../submodel-elements/SubmodelElementRenderer'; +import { InfoOutlined } from '@mui/icons-material'; +import React from 'react'; +import { ArchetypeDetailsDialog } from './ArchetypeDetailsDialog'; type HierarchicalStructuresDetailProps = { readonly submodel: Submodel; @@ -33,6 +38,13 @@ export function HierarchicalStructuresDetail(props: HierarchicalStructuresDetail return; }); + const archeTypePropertylElement= smElements.find((el) => { + if (GetKeyType(el) === KeyTypes.Property && el.semanticId?.keys[0].value === SubmodelElementSemanticId.ArcheType) { + return el as Property; + } + return; + }); + const [entryNode, relationShips, entityNodes] = prepareEntryNodeModel(entitySubmodelElement); (entryNode as Entity).statements = buildRelationTree( @@ -40,8 +52,45 @@ export function HierarchicalStructuresDetail(props: HierarchicalStructuresDetail relationShips as RelationshipElement[], entityNodes as Entity[], ); - - return ; + const [detailsModalOpen, setDetailsModalOpen] = React.useState(false); + const handleDetailsModalClose = () => { + setDetailsModalOpen(false); + }; + const handleDetailsClick = (event: React.MouseEvent) => { + event.stopPropagation(); + setDetailsModalOpen(true); + }; + + return ( + + + + {archeTypePropertylElement && + <> + + + + + + + + + + + + + + } + + + ); } const prepareEntryNodeModel = (subMod?: ISubmodelElement) => { @@ -86,6 +135,7 @@ const prepareEntryNodeModel = (subMod?: ISubmodelElement) => { entityNodes.push(elementEntity); } + }); return [node, relationShips, entityNodes]; diff --git a/src/lib/enums/SubmodelElementSemanticId.enum.ts b/src/lib/enums/SubmodelElementSemanticId.enum.ts index 30e3c7a..e2cb2ca 100644 --- a/src/lib/enums/SubmodelElementSemanticId.enum.ts +++ b/src/lib/enums/SubmodelElementSemanticId.enum.ts @@ -28,4 +28,5 @@ export enum SubmodelElementSemanticId { TimeSeriesLinkedSegmentQuery = 'https://admin-shell.io/idta/TimeSeries/Query/1/1', EntryNode = 'https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0', BulkCount = 'https://admin-shell.io/idta/HierarchicalStructures/BulkCount/1/0', + ArcheType= 'https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0', } diff --git a/src/lib/enums/SubmodelSemanticId.enum.ts b/src/lib/enums/SubmodelSemanticId.enum.ts index 19279aa..9f312c2 100644 --- a/src/lib/enums/SubmodelSemanticId.enum.ts +++ b/src/lib/enums/SubmodelSemanticId.enum.ts @@ -4,7 +4,8 @@ export enum SubmodelSemanticId { CarbonFootprintIRDI = '0173-1#01-AHE712#001', CarbonFootprint = 'https://admin-shell.io/idta/CarbonFootprint/CarbonFootprint/0/9', TimeSeries = 'https://admin-shell.io/idta/TimeSeries/1/1', - HierarchicalStructures = 'https://admin-shell.io/idta/HierarchicalStructures/1/1/Submodel', + HierarchicalStructuresV10 = 'https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel', + HierarchicalStructuresV11 = 'https://admin-shell.io/idta/HierarchicalStructures/1/1/Submodel', Nameplate = 'https://admin-shell.io/zvei/nameplate/1/0/Nameplate', BillOfApplications = 'https://xitaso.com/BillOfApplications', }