From 7f9467dd4c7e6dc68b1b39298511031a1a65e210 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 20 Jan 2025 12:13:59 +0100 Subject: [PATCH 01/50] Fixed centerline-mapping --- rml_mappings/graphics/CenterLine.map.ttl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 037a636a..d078f18c 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -18,7 +18,7 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "CenterLine" + rml:iterator "//*/CenterLine" ]; rr:subjectMap :centerLineSubject ; rr:predicateObjectMap [ From 7a7adb9d45afac62acebebedb09e1992f1d588e9 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 20 Jan 2025 19:44:31 +0100 Subject: [PATCH 02/50] Trying to get the coordinate list correct --- rml_mappings/graphics/CenterLine.map.ttl | 84 ++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index d078f18c..0eac9c6a 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -9,6 +9,7 @@ @prefix asset: . @prefix imf: . @prefix : . +@prefix xsd: . :centerLineSubject rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}"; rr:termType rr:IRI; @@ -23,8 +24,83 @@ rr:subjectMap :centerLineSubject ; rr:predicateObjectMap [ rr:predicate graphic:hasCoordinates; - rr:objectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}/coordinates"; - rr:termType rr:IRI; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinConidtion [ + rr:child "ID"; + rr:parent "../Connection/@ToID"; + ] ] - ] . \ No newline at end of file + ] . + + +:CoordinateListMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() = 1]" + ]; + rr:subjectMap [ + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap [ + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + ] + ] . + + +:CoordinateListElementMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" + ]; + rr:subjectMap [ + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap [ + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + ] + # ]; + # rr:predicateObjectMap [ + # rr:predicate rdf:rest; + # rr:objectMap [ + # rr:parentTriplesMap :CoordinateListMap ; + + # ] + ] . + +:CoordinateMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate" + ]; + + rr:subjectMap [ + a rr:RefObjectMap ; + rr:termType rr:BlankNode; + ] + #; +# rr:predicateObjectMap [ +# rr:predicate graphic:x; +# rr:objectMap [ +# rml:reference "@X"; +# rr:datatype xsd:integer; +# ] +# ]; +# rr:predicateObjectMap [ +# rr:predicate graphic:y; +# rr:objectMap [ +# rml:reference "@Y"; +# rr:datatype xsd:integer; +# ] + #] + . \ No newline at end of file From 8d1d39d512118acd496d3c52bd5c7871c9615a91 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Tue, 21 Jan 2025 12:41:27 +0100 Subject: [PATCH 03/50] Almost got the CenterLine mappings --- examples/graphical.trig | 16 ++-- rml_mappings/graphics/CenterLine.map.ttl | 101 +++++++++++++---------- shacl/graphic-dexpi.shacl.ttl | 6 +- 3 files changed, 70 insertions(+), 53 deletions(-) diff --git a/examples/graphical.trig b/examples/graphical.trig index 9548651d..c1db0ded 100644 --- a/examples/graphical.trig +++ b/examples/graphical.trig @@ -27,8 +27,8 @@ document:graphic1234 a :Diagram ; graphic:PressureVessel-1 a :Symbol ; :hasPosition [ a :Position ; - :x 390 ; - :y 210 ; + :x "390"^^xsd:double ; + :y "210"^^xsd:double ; :rotation 0 ]; :hasGraphics symbol:PT002A . @@ -37,18 +37,18 @@ graphic:GateValve-5-node2-connector a :Line ; :hasCoordinates ( [ a :Position ; - :x 646 ; - :y 188 + :x "646"^^xsd:double ; + :y "188"^^xsd:double ] [ a :Position ; - :x 646 ; - :y 180 + :x "646"^^xsd:double ; + :y "180"^^xsd:double ] [ a :Position ; - :x 412 ; - :y 180 + :x "412"^^xsd:double ; + :y "180"^^xsd:double ] ); :hasStyle [ diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 0eac9c6a..3cc99bf6 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -15,24 +15,52 @@ rr:termType rr:IRI; rr:class graphic:Line . +:hasCoordinatesMap + rr:predicate graphic:hasCoordinates; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "position()"; + rr:parent "../position()"; + ] + ] + . + + :CenterLineMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine" + rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; - rr:subjectMap :centerLineSubject ; - rr:predicateObjectMap [ - rr:predicate graphic:hasCoordinates; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap . + + +:coordinateListContentMap a rr:PredicateObjectMap; + rr:predicate rdf:first; rr:objectMap [ a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateListMap ; - rr:joinConidtion [ - rr:child "ID"; - rr:parent "../Connection/@ToID"; + rr:parentTriplesMap :CoordinateMap ; + rr:joinCondition [ + rr:child "../../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "../position()"; + rr:parent "../position()"; + ], [ + rr:child "../../position()"; + rr:parent "../../position()"; ] - ] - ] . + ]. :CoordinateListMap a rr:TriplesMap; @@ -42,15 +70,10 @@ rml:iterator "//*/CenterLine/Coordinate[position() = 1]" ]; rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap [ - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - ] - ] . + rr:predicateObjectMap :coordinateListContentMap . :CoordinateListElementMap a rr:TriplesMap; @@ -60,14 +83,10 @@ rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" ]; rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap [ - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - ] + rr:predicateObjectMap :coordinateListContentMap . # ]; # rr:predicateObjectMap [ # rr:predicate rdf:rest; @@ -75,7 +94,7 @@ # rr:parentTriplesMap :CoordinateListMap ; # ] - ] . + :CoordinateMap a rr:TriplesMap; rml:logicalSource [ @@ -83,24 +102,22 @@ rml:referenceFormulation ql:XPath; rml:iterator "//*/CenterLine/Coordinate" ]; - rr:subjectMap [ - a rr:RefObjectMap ; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinate"; rr:termType rr:BlankNode; - ] - #; -# rr:predicateObjectMap [ -# rr:predicate graphic:x; -# rr:objectMap [ -# rml:reference "@X"; -# rr:datatype xsd:integer; -# ] -# ]; -# rr:predicateObjectMap [ -# rr:predicate graphic:y; -# rr:objectMap [ -# rml:reference "@Y"; -# rr:datatype xsd:integer; -# ] - #] + ]; + rr:predicateObjectMap [ + rr:predicate graphic:x; + rr:objectMap [ + rml:reference "@X"; + rr:datatype xsd:integer; + ] + ]; + rr:predicateObjectMap [ + rr:predicate graphic:y; + rr:objectMap [ + rml:reference "@Y"; + rr:datatype xsd:integer; + ] + ] . \ No newline at end of file diff --git a/shacl/graphic-dexpi.shacl.ttl b/shacl/graphic-dexpi.shacl.ttl index b5cc32e5..a001de01 100644 --- a/shacl/graphic-dexpi.shacl.ttl +++ b/shacl/graphic-dexpi.shacl.ttl @@ -66,21 +66,21 @@ sh:targetClass :Position; sh:property [ sh:path :x ; - sh:datatype xsd:integer ; + sh:datatype xsd:double ; sh:minCount 1; sh:maxCount 1; sh:message "A position must have exactly one x coordinate" ] ; sh:property [ sh:path :y ; - sh:datatype xsd:integer ; + sh:datatype xsd:double ; sh:minCount 1; sh:maxCount 1; sh:message "A position must have exactly one y coordinate" ] ; sh:property [ sh:path :rotation ; - sh:datatype xsd:integer ; + sh:datatype xsd:double ; sh:minCount 0 ; sh:maxCount 1 ; sh:message "A position may have one rotation" From 934f6042ad366b291fcf10ac38fd82b5945fe9d0 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Wed, 22 Jan 2025 14:51:18 +0100 Subject: [PATCH 04/50] Improved joins and ids on center-lines vs. connectors --- examples/graphical.trig | 8 +- rml_mappings/graphics/CenterLine.map.ttl | 212 +++++++++++++++++++---- shacl/graphic-dexpi.shacl.ttl | 13 +- 3 files changed, 188 insertions(+), 45 deletions(-) diff --git a/examples/graphical.trig b/examples/graphical.trig index c1db0ded..d0d052ab 100644 --- a/examples/graphical.trig +++ b/examples/graphical.trig @@ -17,8 +17,8 @@ document:GateValve-5-node2-connector :visualisedAs graphic:GateValve-5-node2-con document:graphic1234 a :Diagram ; :hasExtent [ a :Extent ; - :minimumExtent [ :x 100 ; :y 100 ] ; - :maximumExtent [ :x 200 ; :y 200 ] + :minimumExtent [ :x "100"^^xsd:double ; :y "100"^^xsd:double ] ; + :maximumExtent [ :x "200"^^xsd:double ; :y "200"^^xsd:double ] ] ; :hasSymbol graphic:PressureVessel-1 ; :hasLine graphic:GateValve-5-node2-connector . @@ -29,7 +29,7 @@ graphic:PressureVessel-1 a :Symbol ; a :Position ; :x "390"^^xsd:double ; :y "210"^^xsd:double ; - :rotation 0 + :rotation "0"^^xsd:double ]; :hasGraphics symbol:PT002A . @@ -55,7 +55,7 @@ graphic:GateValve-5-node2-connector a :Line ; :hasStroke [ a :Stroke ; :dasharray "none"^^xsd:string ; - :width 1.4 ; + :width "1.4"^^xsd:double ; :color [ a :RgbColor ; :red 255 ; diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 3cc99bf6..f5b71342 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -11,9 +11,6 @@ @prefix : . @prefix xsd: . -:centerLineSubject rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}"; - rr:termType rr:IRI; - rr:class graphic:Line . :hasCoordinatesMap rr:predicate graphic:hasCoordinates; @@ -31,7 +28,7 @@ . -:CenterLineMap a rr:TriplesMap; +:CenterLineToMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; @@ -42,25 +39,115 @@ rr:termType rr:IRI; rr:class graphic:Line ] ; - rr:predicateObjectMap :hasCoordinatesMap . + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . +:CenterLineAfterComponentMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{preceding-sibling::PipingComponent[1]/@ID}-node2"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . -:coordinateListContentMap a rr:PredicateObjectMap; - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - rr:joinCondition [ - rr:child "../../@ID"; - rr:parent "../../@ID"; - ], [ - rr:child "../position()"; - rr:parent "../position()"; - ], [ - rr:child "../../position()"; - rr:parent "../../position()"; +:CenterLineFromMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[../Connection/@FromID]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@FromID}-node{../Connection/@FromNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . + +:CenterLineToIdMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[../Connection/@ToID]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . + +:lineHasStyleMap a rr:PredicateObjectMap; + rr:predicate graphic:hasStyle; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :LineStyleMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../@ID"; + ], [ + rr:child "position()"; + rr:parent "position()"; ] - ]. + ] . + +:LineStyleMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../@ID}_{count(preceding-sibling::CenterLine)}_linestyle"; + rr:termType rr:BlankNode + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:hasStroke; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :LineStrokeMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../@ID"; + ], [ + rr:child "position()"; + rr:parent "position()"; + ] + ] + ]. + + +:LineStrokeMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../@ID}_{count(preceding-sibling::CenterLine)}_linestroke"; + rr:termType rr:BlankNode ; + rr:class graphic:Stroke + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:dasharray; + rr:objectMap [ + rr:constant "none"; + ] + ] , [ + rr:predicate graphic:width; + rr:objectMap [ + rr:constant "0.25"^^xsd:double; + rr:datatype xsd:double; + ] + ] + . :CoordinateListMap a rr:TriplesMap; @@ -70,10 +157,13 @@ rml:iterator "//*/CenterLine/Coordinate[position() = 1]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap :coordinateListContentMap . + rr:predicateObjectMap + :coordinateListContentMap, + :restOfCoordinateListMap + . :CoordinateListElementMap a rr:TriplesMap; @@ -83,19 +173,73 @@ rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap :coordinateListContentMap . - # ]; - # rr:predicateObjectMap [ - # rr:predicate rdf:rest; - # rr:objectMap [ - # rr:parentTriplesMap :CoordinateListMap ; - - # ] + rr:predicateObjectMap + :coordinateListContentMap, + :restOfCoordinateListMap + . + +:CoordinateListLastElementMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() = last()]" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::CenterLine)}_coordinateListElement"; + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap :coordinateListContentMap, + [ + rr:predicate rdf:rest; + rr:objectMap [ + rr:constant rdf:nil; + ] + ]. + +:restOfCoordinateListMap a rr:PredicateObjectMap; + rr:predicate rdf:rest; + rr:objectMap [ + rr:parentTriplesMap :CoordinateListElementMap ; + a rr:RefObjectMap ; + rr:joinCondition :nextCoordinateListElementJoinConditionId, :nextCoordinateListElementJoinConditionCenterLine, :nextCoordinateListElementJoinConditionCoordinate + ] , [ + rr:parentTriplesMap :CoordinateListLastElementMap ; + a rr:RefObjectMap ; + rr:joinCondition :nextCoordinateListElementJoinConditionId + , :nextCoordinateListElementJoinConditionCenterLine + , :nextCoordinateListElementJoinConditionCoordinate + ]. + +:nextCoordinateListElementJoinConditionId + rr:child "../../@ID"; + rr:parent "../../@ID". + :nextCoordinateListElementJoinConditionCenterLine + rr:child "../count(preceding-sibling::CenterLine)"; + rr:parent "../count(preceding-sibling::CenterLine)". + :nextCoordinateListElementJoinConditionCoordinate + rr:child "count(preceding-sibling::Coordinate)"; + rr:parent "count(preceding-sibling::Coordinate)+1". + +:coordinateListContentMap a rr:PredicateObjectMap; + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + rr:joinCondition + :nextCoordinateListElementJoinConditionId, + :nextCoordinateListElementJoinConditionCenterLine , + [ + rr:child "count(preceding-sibling::Coordinate)"; + rr:parent "count(preceding-sibling::Coordinate)"; + ] + ]. + + :CoordinateMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; @@ -103,21 +247,21 @@ rml:iterator "//*/CenterLine/Coordinate" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinate"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinate"; rr:termType rr:BlankNode; ]; rr:predicateObjectMap [ rr:predicate graphic:x; rr:objectMap [ rml:reference "@X"; - rr:datatype xsd:integer; + rr:datatype xsd:double; ] ]; rr:predicateObjectMap [ rr:predicate graphic:y; rr:objectMap [ rml:reference "@Y"; - rr:datatype xsd:integer; + rr:datatype xsd:double; ] ] . \ No newline at end of file diff --git a/shacl/graphic-dexpi.shacl.ttl b/shacl/graphic-dexpi.shacl.ttl index a001de01..b7eeb6b3 100644 --- a/shacl/graphic-dexpi.shacl.ttl +++ b/shacl/graphic-dexpi.shacl.ttl @@ -165,11 +165,6 @@ sh:maxCount 1; sh:node :StrokeShape ; ] ; - sh:property [ - sh:path :hasStyle ; - sh:maxCount 1; - sh:datatype css:style ; - ] ; sh:closed true. :StrokeShape a sh:NodeShape ; @@ -179,12 +174,16 @@ sh:datatype xsd:string ; ], [ sh:path :width ; - sh:datatype xsd:decimal ; + sh:datatype xsd:double ; + sh:minCount 1; + sh:maxCount 1; + sh:message "A stroke must specify a width"; ] , [ sh:path :color ; - sh:minCount 1; + sh:minCount 0; sh:maxCount 1; sh:node :ColorShape ; + sh:message "A stroke can have at most one color"; ], [ sh:path rdf:type; ]; From 8b45bc81e758627147ed71e942559e8d97e426bc Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 08:56:32 +0100 Subject: [PATCH 05/50] WOrking centerline mappings --- rml_mappings/graphics/CenterLine.map.ttl | 84 ++++++++++++------------ 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index f5b71342..0d5e3e88 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -12,20 +12,6 @@ @prefix xsd: . -:hasCoordinatesMap - rr:predicate graphic:hasCoordinates; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateListMap ; - rr:joinCondition [ - rr:child "../@ID"; - rr:parent "../../@ID"; - ], [ - rr:child "position()"; - rr:parent "../position()"; - ] - ] - . :CenterLineToMap a rr:TriplesMap; @@ -35,7 +21,7 @@ rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case1"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -46,10 +32,10 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent]" + rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent and (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{preceding-sibling::PipingComponent[1]/@ID}-node2"; + rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector-case2"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -60,10 +46,10 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[../Connection/@FromID]" + rml:iterator "//*/CenterLine[(../Connection/@FromID) and not (preceding-sibling::PipingComponent)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@FromID}-node{../Connection/@FromNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector-case3"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -74,16 +60,32 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[../Connection/@ToID]" + rml:iterator "//*/CenterLine[(../Connection/@ToID) and (not ((../Connection/@FromID) or (preceding-sibling::PipingComponent)))]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case4"; rr:termType rr:IRI; rr:class graphic:Line ] ; rr:predicateObjectMap :hasCoordinatesMap ; rr:predicateObjectMap :lineHasStyleMap . +:hasCoordinatesMap + rr:predicate graphic:hasCoordinates; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "../count(preceding-sibling::CenterLine)"; + ] + ] + . + + :lineHasStyleMap a rr:PredicateObjectMap; rr:predicate graphic:hasStyle; rr:objectMap [ @@ -93,8 +95,8 @@ rr:child "../@ID"; rr:parent "../@ID"; ], [ - rr:child "position()"; - rr:parent "position()"; + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "count(preceding-sibling::CenterLine)"; ] ] . @@ -117,8 +119,8 @@ rr:child "../@ID"; rr:parent "../@ID"; ], [ - rr:child "position()"; - rr:parent "position()"; + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "count(preceding-sibling::CenterLine)"; ] ] ]. @@ -154,43 +156,34 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() = 1]" + rml:iterator "//*/CenterLine/Coordinate[not (preceding-sibling::Coordinate)]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_0_coordinateListFirstElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap - :coordinateListContentMap, - :restOfCoordinateListMap - . - + rr:predicateObjectMap :coordinateListContentMap, :restOfCoordinateListMap, :restOfCoordinateListLastMap . :CoordinateListElementMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" + rml:iterator "//*/CenterLine/Coordinate[preceding-sibling::Coordinate and following-sibling::Coordinate]" ]; rr:subjectMap [ rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap - :coordinateListContentMap, - :restOfCoordinateListMap - . + rr:predicateObjectMap :coordinateListContentMap, :restOfCoordinateListMap, :restOfCoordinateListLastMap . - - :CoordinateListLastElementMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() = last()]" + rml:iterator "//*/CenterLine/Coordinate[preceding-sibling::Coordinate and (not (following-sibling::Coordinate))]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::CenterLine)}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListLastElement"; rr:termType rr:BlankNode; ]; rr:predicateObjectMap :coordinateListContentMap, @@ -207,7 +200,11 @@ rr:parentTriplesMap :CoordinateListElementMap ; a rr:RefObjectMap ; rr:joinCondition :nextCoordinateListElementJoinConditionId, :nextCoordinateListElementJoinConditionCenterLine, :nextCoordinateListElementJoinConditionCoordinate - ] , [ + ] . + + :restOfCoordinateListLastMap a rr:PredicateObjectMap; + rr:predicate rdf:rest; + rr:objectMap [ rr:parentTriplesMap :CoordinateListLastElementMap ; a rr:RefObjectMap ; rr:joinCondition :nextCoordinateListElementJoinConditionId @@ -223,7 +220,7 @@ rr:parent "../count(preceding-sibling::CenterLine)". :nextCoordinateListElementJoinConditionCoordinate rr:child "count(preceding-sibling::Coordinate)"; - rr:parent "count(preceding-sibling::Coordinate)+1". + rr:parent "count(preceding-sibling::Coordinate)-1". :coordinateListContentMap a rr:PredicateObjectMap; rr:predicate rdf:first; @@ -249,6 +246,7 @@ rr:subjectMap [ rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinate"; rr:termType rr:BlankNode; + rr:class graphic:Position ]; rr:predicateObjectMap [ rr:predicate graphic:x; From 6e5354847daaf4fea68e6fd4bfdfa744b02ad0cd Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 08:57:58 +0100 Subject: [PATCH 06/50] WOrking centerline mappings --- rml_mappings/graphics/CenterLine.map.ttl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 0d5e3e88..afec4991 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -21,7 +21,7 @@ rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case1"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -35,7 +35,7 @@ rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent and (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector-case2"; + rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -49,7 +49,7 @@ rml:iterator "//*/CenterLine[(../Connection/@FromID) and not (preceding-sibling::PipingComponent)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector-case3"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -63,7 +63,7 @@ rml:iterator "//*/CenterLine[(../Connection/@ToID) and (not ((../Connection/@FromID) or (preceding-sibling::PipingComponent)))]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case4"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; From 72b3611faa2491581c29dd9385c5a2be61cac3cb Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 20 Jan 2025 12:13:59 +0100 Subject: [PATCH 07/50] Fixed centerline-mapping --- rml_mappings/graphics/CenterLine.map.ttl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 037a636a..d078f18c 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -18,7 +18,7 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "CenterLine" + rml:iterator "//*/CenterLine" ]; rr:subjectMap :centerLineSubject ; rr:predicateObjectMap [ From 9924bfa90b7deca44f0a7c27e8d6c9dbfc6e0c93 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 20 Jan 2025 19:44:31 +0100 Subject: [PATCH 08/50] Trying to get the coordinate list correct --- rml_mappings/graphics/CenterLine.map.ttl | 84 ++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index d078f18c..0eac9c6a 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -9,6 +9,7 @@ @prefix asset: . @prefix imf: . @prefix : . +@prefix xsd: . :centerLineSubject rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}"; rr:termType rr:IRI; @@ -23,8 +24,83 @@ rr:subjectMap :centerLineSubject ; rr:predicateObjectMap [ rr:predicate graphic:hasCoordinates; - rr:objectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}/coordinates"; - rr:termType rr:IRI; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinConidtion [ + rr:child "ID"; + rr:parent "../Connection/@ToID"; + ] ] - ] . \ No newline at end of file + ] . + + +:CoordinateListMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() = 1]" + ]; + rr:subjectMap [ + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap [ + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + ] + ] . + + +:CoordinateListElementMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" + ]; + rr:subjectMap [ + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap [ + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + ] + # ]; + # rr:predicateObjectMap [ + # rr:predicate rdf:rest; + # rr:objectMap [ + # rr:parentTriplesMap :CoordinateListMap ; + + # ] + ] . + +:CoordinateMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate" + ]; + + rr:subjectMap [ + a rr:RefObjectMap ; + rr:termType rr:BlankNode; + ] + #; +# rr:predicateObjectMap [ +# rr:predicate graphic:x; +# rr:objectMap [ +# rml:reference "@X"; +# rr:datatype xsd:integer; +# ] +# ]; +# rr:predicateObjectMap [ +# rr:predicate graphic:y; +# rr:objectMap [ +# rml:reference "@Y"; +# rr:datatype xsd:integer; +# ] + #] + . \ No newline at end of file From 8596061edb1d8797dc77b683d2d95a24d99cae75 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Tue, 21 Jan 2025 12:41:27 +0100 Subject: [PATCH 09/50] Almost got the CenterLine mappings --- examples/graphical.trig | 16 ++-- rml_mappings/graphics/CenterLine.map.ttl | 101 +++++++++++++---------- shacl/graphic-dexpi.shacl.ttl | 6 +- 3 files changed, 70 insertions(+), 53 deletions(-) diff --git a/examples/graphical.trig b/examples/graphical.trig index 9548651d..c1db0ded 100644 --- a/examples/graphical.trig +++ b/examples/graphical.trig @@ -27,8 +27,8 @@ document:graphic1234 a :Diagram ; graphic:PressureVessel-1 a :Symbol ; :hasPosition [ a :Position ; - :x 390 ; - :y 210 ; + :x "390"^^xsd:double ; + :y "210"^^xsd:double ; :rotation 0 ]; :hasGraphics symbol:PT002A . @@ -37,18 +37,18 @@ graphic:GateValve-5-node2-connector a :Line ; :hasCoordinates ( [ a :Position ; - :x 646 ; - :y 188 + :x "646"^^xsd:double ; + :y "188"^^xsd:double ] [ a :Position ; - :x 646 ; - :y 180 + :x "646"^^xsd:double ; + :y "180"^^xsd:double ] [ a :Position ; - :x 412 ; - :y 180 + :x "412"^^xsd:double ; + :y "180"^^xsd:double ] ); :hasStyle [ diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 0eac9c6a..3cc99bf6 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -15,24 +15,52 @@ rr:termType rr:IRI; rr:class graphic:Line . +:hasCoordinatesMap + rr:predicate graphic:hasCoordinates; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "position()"; + rr:parent "../position()"; + ] + ] + . + + :CenterLineMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine" + rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; - rr:subjectMap :centerLineSubject ; - rr:predicateObjectMap [ - rr:predicate graphic:hasCoordinates; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap . + + +:coordinateListContentMap a rr:PredicateObjectMap; + rr:predicate rdf:first; rr:objectMap [ a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateListMap ; - rr:joinConidtion [ - rr:child "ID"; - rr:parent "../Connection/@ToID"; + rr:parentTriplesMap :CoordinateMap ; + rr:joinCondition [ + rr:child "../../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "../position()"; + rr:parent "../position()"; + ], [ + rr:child "../../position()"; + rr:parent "../../position()"; ] - ] - ] . + ]. :CoordinateListMap a rr:TriplesMap; @@ -42,15 +70,10 @@ rml:iterator "//*/CenterLine/Coordinate[position() = 1]" ]; rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap [ - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - ] - ] . + rr:predicateObjectMap :coordinateListContentMap . :CoordinateListElementMap a rr:TriplesMap; @@ -60,14 +83,10 @@ rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" ]; rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap [ - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - ] + rr:predicateObjectMap :coordinateListContentMap . # ]; # rr:predicateObjectMap [ # rr:predicate rdf:rest; @@ -75,7 +94,7 @@ # rr:parentTriplesMap :CoordinateListMap ; # ] - ] . + :CoordinateMap a rr:TriplesMap; rml:logicalSource [ @@ -83,24 +102,22 @@ rml:referenceFormulation ql:XPath; rml:iterator "//*/CenterLine/Coordinate" ]; - rr:subjectMap [ - a rr:RefObjectMap ; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinate"; rr:termType rr:BlankNode; - ] - #; -# rr:predicateObjectMap [ -# rr:predicate graphic:x; -# rr:objectMap [ -# rml:reference "@X"; -# rr:datatype xsd:integer; -# ] -# ]; -# rr:predicateObjectMap [ -# rr:predicate graphic:y; -# rr:objectMap [ -# rml:reference "@Y"; -# rr:datatype xsd:integer; -# ] - #] + ]; + rr:predicateObjectMap [ + rr:predicate graphic:x; + rr:objectMap [ + rml:reference "@X"; + rr:datatype xsd:integer; + ] + ]; + rr:predicateObjectMap [ + rr:predicate graphic:y; + rr:objectMap [ + rml:reference "@Y"; + rr:datatype xsd:integer; + ] + ] . \ No newline at end of file diff --git a/shacl/graphic-dexpi.shacl.ttl b/shacl/graphic-dexpi.shacl.ttl index b5cc32e5..a001de01 100644 --- a/shacl/graphic-dexpi.shacl.ttl +++ b/shacl/graphic-dexpi.shacl.ttl @@ -66,21 +66,21 @@ sh:targetClass :Position; sh:property [ sh:path :x ; - sh:datatype xsd:integer ; + sh:datatype xsd:double ; sh:minCount 1; sh:maxCount 1; sh:message "A position must have exactly one x coordinate" ] ; sh:property [ sh:path :y ; - sh:datatype xsd:integer ; + sh:datatype xsd:double ; sh:minCount 1; sh:maxCount 1; sh:message "A position must have exactly one y coordinate" ] ; sh:property [ sh:path :rotation ; - sh:datatype xsd:integer ; + sh:datatype xsd:double ; sh:minCount 0 ; sh:maxCount 1 ; sh:message "A position may have one rotation" From 5cc87f20605a6b1975e349cd4adda8d1c4a4ffbe Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Wed, 22 Jan 2025 14:51:18 +0100 Subject: [PATCH 10/50] Improved joins and ids on center-lines vs. connectors --- examples/graphical.trig | 8 +- rml_mappings/graphics/CenterLine.map.ttl | 212 +++++++++++++++++++---- shacl/graphic-dexpi.shacl.ttl | 13 +- 3 files changed, 188 insertions(+), 45 deletions(-) diff --git a/examples/graphical.trig b/examples/graphical.trig index c1db0ded..d0d052ab 100644 --- a/examples/graphical.trig +++ b/examples/graphical.trig @@ -17,8 +17,8 @@ document:GateValve-5-node2-connector :visualisedAs graphic:GateValve-5-node2-con document:graphic1234 a :Diagram ; :hasExtent [ a :Extent ; - :minimumExtent [ :x 100 ; :y 100 ] ; - :maximumExtent [ :x 200 ; :y 200 ] + :minimumExtent [ :x "100"^^xsd:double ; :y "100"^^xsd:double ] ; + :maximumExtent [ :x "200"^^xsd:double ; :y "200"^^xsd:double ] ] ; :hasSymbol graphic:PressureVessel-1 ; :hasLine graphic:GateValve-5-node2-connector . @@ -29,7 +29,7 @@ graphic:PressureVessel-1 a :Symbol ; a :Position ; :x "390"^^xsd:double ; :y "210"^^xsd:double ; - :rotation 0 + :rotation "0"^^xsd:double ]; :hasGraphics symbol:PT002A . @@ -55,7 +55,7 @@ graphic:GateValve-5-node2-connector a :Line ; :hasStroke [ a :Stroke ; :dasharray "none"^^xsd:string ; - :width 1.4 ; + :width "1.4"^^xsd:double ; :color [ a :RgbColor ; :red 255 ; diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 3cc99bf6..f5b71342 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -11,9 +11,6 @@ @prefix : . @prefix xsd: . -:centerLineSubject rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}"; - rr:termType rr:IRI; - rr:class graphic:Line . :hasCoordinatesMap rr:predicate graphic:hasCoordinates; @@ -31,7 +28,7 @@ . -:CenterLineMap a rr:TriplesMap; +:CenterLineToMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; @@ -42,25 +39,115 @@ rr:termType rr:IRI; rr:class graphic:Line ] ; - rr:predicateObjectMap :hasCoordinatesMap . + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . +:CenterLineAfterComponentMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{preceding-sibling::PipingComponent[1]/@ID}-node2"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . -:coordinateListContentMap a rr:PredicateObjectMap; - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - rr:joinCondition [ - rr:child "../../@ID"; - rr:parent "../../@ID"; - ], [ - rr:child "../position()"; - rr:parent "../position()"; - ], [ - rr:child "../../position()"; - rr:parent "../../position()"; +:CenterLineFromMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[../Connection/@FromID]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@FromID}-node{../Connection/@FromNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . + +:CenterLineToIdMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[../Connection/@ToID]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . + +:lineHasStyleMap a rr:PredicateObjectMap; + rr:predicate graphic:hasStyle; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :LineStyleMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../@ID"; + ], [ + rr:child "position()"; + rr:parent "position()"; ] - ]. + ] . + +:LineStyleMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../@ID}_{count(preceding-sibling::CenterLine)}_linestyle"; + rr:termType rr:BlankNode + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:hasStroke; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :LineStrokeMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../@ID"; + ], [ + rr:child "position()"; + rr:parent "position()"; + ] + ] + ]. + + +:LineStrokeMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../@ID}_{count(preceding-sibling::CenterLine)}_linestroke"; + rr:termType rr:BlankNode ; + rr:class graphic:Stroke + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:dasharray; + rr:objectMap [ + rr:constant "none"; + ] + ] , [ + rr:predicate graphic:width; + rr:objectMap [ + rr:constant "0.25"^^xsd:double; + rr:datatype xsd:double; + ] + ] + . :CoordinateListMap a rr:TriplesMap; @@ -70,10 +157,13 @@ rml:iterator "//*/CenterLine/Coordinate[position() = 1]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap :coordinateListContentMap . + rr:predicateObjectMap + :coordinateListContentMap, + :restOfCoordinateListMap + . :CoordinateListElementMap a rr:TriplesMap; @@ -83,19 +173,73 @@ rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap :coordinateListContentMap . - # ]; - # rr:predicateObjectMap [ - # rr:predicate rdf:rest; - # rr:objectMap [ - # rr:parentTriplesMap :CoordinateListMap ; - - # ] + rr:predicateObjectMap + :coordinateListContentMap, + :restOfCoordinateListMap + . + +:CoordinateListLastElementMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() = last()]" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::CenterLine)}_coordinateListElement"; + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap :coordinateListContentMap, + [ + rr:predicate rdf:rest; + rr:objectMap [ + rr:constant rdf:nil; + ] + ]. + +:restOfCoordinateListMap a rr:PredicateObjectMap; + rr:predicate rdf:rest; + rr:objectMap [ + rr:parentTriplesMap :CoordinateListElementMap ; + a rr:RefObjectMap ; + rr:joinCondition :nextCoordinateListElementJoinConditionId, :nextCoordinateListElementJoinConditionCenterLine, :nextCoordinateListElementJoinConditionCoordinate + ] , [ + rr:parentTriplesMap :CoordinateListLastElementMap ; + a rr:RefObjectMap ; + rr:joinCondition :nextCoordinateListElementJoinConditionId + , :nextCoordinateListElementJoinConditionCenterLine + , :nextCoordinateListElementJoinConditionCoordinate + ]. + +:nextCoordinateListElementJoinConditionId + rr:child "../../@ID"; + rr:parent "../../@ID". + :nextCoordinateListElementJoinConditionCenterLine + rr:child "../count(preceding-sibling::CenterLine)"; + rr:parent "../count(preceding-sibling::CenterLine)". + :nextCoordinateListElementJoinConditionCoordinate + rr:child "count(preceding-sibling::Coordinate)"; + rr:parent "count(preceding-sibling::Coordinate)+1". + +:coordinateListContentMap a rr:PredicateObjectMap; + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + rr:joinCondition + :nextCoordinateListElementJoinConditionId, + :nextCoordinateListElementJoinConditionCenterLine , + [ + rr:child "count(preceding-sibling::Coordinate)"; + rr:parent "count(preceding-sibling::Coordinate)"; + ] + ]. + + :CoordinateMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; @@ -103,21 +247,21 @@ rml:iterator "//*/CenterLine/Coordinate" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinate"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinate"; rr:termType rr:BlankNode; ]; rr:predicateObjectMap [ rr:predicate graphic:x; rr:objectMap [ rml:reference "@X"; - rr:datatype xsd:integer; + rr:datatype xsd:double; ] ]; rr:predicateObjectMap [ rr:predicate graphic:y; rr:objectMap [ rml:reference "@Y"; - rr:datatype xsd:integer; + rr:datatype xsd:double; ] ] . \ No newline at end of file diff --git a/shacl/graphic-dexpi.shacl.ttl b/shacl/graphic-dexpi.shacl.ttl index a001de01..b7eeb6b3 100644 --- a/shacl/graphic-dexpi.shacl.ttl +++ b/shacl/graphic-dexpi.shacl.ttl @@ -165,11 +165,6 @@ sh:maxCount 1; sh:node :StrokeShape ; ] ; - sh:property [ - sh:path :hasStyle ; - sh:maxCount 1; - sh:datatype css:style ; - ] ; sh:closed true. :StrokeShape a sh:NodeShape ; @@ -179,12 +174,16 @@ sh:datatype xsd:string ; ], [ sh:path :width ; - sh:datatype xsd:decimal ; + sh:datatype xsd:double ; + sh:minCount 1; + sh:maxCount 1; + sh:message "A stroke must specify a width"; ] , [ sh:path :color ; - sh:minCount 1; + sh:minCount 0; sh:maxCount 1; sh:node :ColorShape ; + sh:message "A stroke can have at most one color"; ], [ sh:path rdf:type; ]; From 01bcf5568861fea8245fc950f0cdffcb4b532831 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 08:56:32 +0100 Subject: [PATCH 11/50] WOrking centerline mappings --- rml_mappings/graphics/CenterLine.map.ttl | 84 ++++++++++++------------ 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index f5b71342..0d5e3e88 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -12,20 +12,6 @@ @prefix xsd: . -:hasCoordinatesMap - rr:predicate graphic:hasCoordinates; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateListMap ; - rr:joinCondition [ - rr:child "../@ID"; - rr:parent "../../@ID"; - ], [ - rr:child "position()"; - rr:parent "../position()"; - ] - ] - . :CenterLineToMap a rr:TriplesMap; @@ -35,7 +21,7 @@ rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case1"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -46,10 +32,10 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent]" + rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent and (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{preceding-sibling::PipingComponent[1]/@ID}-node2"; + rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector-case2"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -60,10 +46,10 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[../Connection/@FromID]" + rml:iterator "//*/CenterLine[(../Connection/@FromID) and not (preceding-sibling::PipingComponent)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@FromID}-node{../Connection/@FromNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector-case3"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -74,16 +60,32 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[../Connection/@ToID]" + rml:iterator "//*/CenterLine[(../Connection/@ToID) and (not ((../Connection/@FromID) or (preceding-sibling::PipingComponent)))]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case4"; rr:termType rr:IRI; rr:class graphic:Line ] ; rr:predicateObjectMap :hasCoordinatesMap ; rr:predicateObjectMap :lineHasStyleMap . +:hasCoordinatesMap + rr:predicate graphic:hasCoordinates; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "../count(preceding-sibling::CenterLine)"; + ] + ] + . + + :lineHasStyleMap a rr:PredicateObjectMap; rr:predicate graphic:hasStyle; rr:objectMap [ @@ -93,8 +95,8 @@ rr:child "../@ID"; rr:parent "../@ID"; ], [ - rr:child "position()"; - rr:parent "position()"; + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "count(preceding-sibling::CenterLine)"; ] ] . @@ -117,8 +119,8 @@ rr:child "../@ID"; rr:parent "../@ID"; ], [ - rr:child "position()"; - rr:parent "position()"; + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "count(preceding-sibling::CenterLine)"; ] ] ]. @@ -154,43 +156,34 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() = 1]" + rml:iterator "//*/CenterLine/Coordinate[not (preceding-sibling::Coordinate)]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_0_coordinateListFirstElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap - :coordinateListContentMap, - :restOfCoordinateListMap - . - + rr:predicateObjectMap :coordinateListContentMap, :restOfCoordinateListMap, :restOfCoordinateListLastMap . :CoordinateListElementMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" + rml:iterator "//*/CenterLine/Coordinate[preceding-sibling::Coordinate and following-sibling::Coordinate]" ]; rr:subjectMap [ rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap - :coordinateListContentMap, - :restOfCoordinateListMap - . + rr:predicateObjectMap :coordinateListContentMap, :restOfCoordinateListMap, :restOfCoordinateListLastMap . - - :CoordinateListLastElementMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() = last()]" + rml:iterator "//*/CenterLine/Coordinate[preceding-sibling::Coordinate and (not (following-sibling::Coordinate))]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::CenterLine)}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListLastElement"; rr:termType rr:BlankNode; ]; rr:predicateObjectMap :coordinateListContentMap, @@ -207,7 +200,11 @@ rr:parentTriplesMap :CoordinateListElementMap ; a rr:RefObjectMap ; rr:joinCondition :nextCoordinateListElementJoinConditionId, :nextCoordinateListElementJoinConditionCenterLine, :nextCoordinateListElementJoinConditionCoordinate - ] , [ + ] . + + :restOfCoordinateListLastMap a rr:PredicateObjectMap; + rr:predicate rdf:rest; + rr:objectMap [ rr:parentTriplesMap :CoordinateListLastElementMap ; a rr:RefObjectMap ; rr:joinCondition :nextCoordinateListElementJoinConditionId @@ -223,7 +220,7 @@ rr:parent "../count(preceding-sibling::CenterLine)". :nextCoordinateListElementJoinConditionCoordinate rr:child "count(preceding-sibling::Coordinate)"; - rr:parent "count(preceding-sibling::Coordinate)+1". + rr:parent "count(preceding-sibling::Coordinate)-1". :coordinateListContentMap a rr:PredicateObjectMap; rr:predicate rdf:first; @@ -249,6 +246,7 @@ rr:subjectMap [ rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinate"; rr:termType rr:BlankNode; + rr:class graphic:Position ]; rr:predicateObjectMap [ rr:predicate graphic:x; From 011f288536ac2ebd7e467b739a3e4ff4745a8772 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 08:57:58 +0100 Subject: [PATCH 12/50] WOrking centerline mappings --- rml_mappings/graphics/CenterLine.map.ttl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 0d5e3e88..afec4991 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -21,7 +21,7 @@ rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case1"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -35,7 +35,7 @@ rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent and (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector-case2"; + rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -49,7 +49,7 @@ rml:iterator "//*/CenterLine[(../Connection/@FromID) and not (preceding-sibling::PipingComponent)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector-case3"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -63,7 +63,7 @@ rml:iterator "//*/CenterLine[(../Connection/@ToID) and (not ((../Connection/@FromID) or (preceding-sibling::PipingComponent)))]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case4"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; From 691bee5095a6121baa51e964266841024f6325f3 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 10:30:27 +0100 Subject: [PATCH 13/50] Fixed error in shacl testing --- .github/workflows/rdf_tests.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rdf_tests.yml b/.github/workflows/rdf_tests.yml index 864e631c..ce9ed1c8 100644 --- a/.github/workflows/rdf_tests.yml +++ b/.github/workflows/rdf_tests.yml @@ -47,7 +47,14 @@ jobs: export PATH="$PATH:$JENA_HOME/bin" curl -o rml_mappings/pandid.xml https://raw.githubusercontent.com/equinor/NOAKADEXPI/refs/heads/main/Blueprint/DISC_EXAMPLE-02/DISC_EXAMPLE-02-02.xml docker run -v .:/data rmlio/rmlmapper-java:7.2.0 -m rml_mappings/imf/* -o /data/imf.ttl -s Turtle - shacl v --shapes shacl/imf-dexpi.shacl.ttl --data imf.ttl + SHACL_RESULT=$(shacl v --shapes shacl/imf-dexpi.shacl.ttl --data imf.ttl --text --quiet) + if [ "$SHACL_RESULT" != "Conforms" ]; then + echo "SHACL validation failed" + echo $SHACL_RESULT + exit 1 + else + echo "SHACL validation passed" + fi - name: Test graphics mappings run: | @@ -55,7 +62,14 @@ jobs: export PATH="$PATH:$JENA_HOME/bin" curl -o rml_mappings/pandid.xml https://raw.githubusercontent.com/equinor/NOAKADEXPI/refs/heads/main/Blueprint/DISC_EXAMPLE-02/DISC_EXAMPLE-02-02.xml docker run -v .:/data rmlio/rmlmapper-java:7.2.0 -m rml_mappings/graphics/* -o /data/graphics.ttl -s Turtle - shacl v --shapes shacl/graphic-dexpi.shacl.ttl --data graphics.ttl + SHACL_RESULT=$(shacl v --shapes shacl/graphic-dexpi.shacl.ttl --data graphics.ttl --text --quiet) + if [ "$SHACL_RESULT" != "Conforms" ]; then + echo "SHACL validation failed" + echo $SHACL_RESULT + exit 1 + else + echo "SHACL validation passed" + fi - name: Test rdf examples run: | From 99107eab71ef03575dadca42c90f24a1b60234d3 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 20 Jan 2025 12:13:59 +0100 Subject: [PATCH 14/50] Fixed centerline-mapping --- rml_mappings/graphics/CenterLine.map.ttl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 037a636a..d078f18c 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -18,7 +18,7 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "CenterLine" + rml:iterator "//*/CenterLine" ]; rr:subjectMap :centerLineSubject ; rr:predicateObjectMap [ From 87c1d415830e30822f32ce8649b650741e9aab5c Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 20 Jan 2025 19:44:31 +0100 Subject: [PATCH 15/50] Trying to get the coordinate list correct --- rml_mappings/graphics/CenterLine.map.ttl | 84 ++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index d078f18c..0eac9c6a 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -9,6 +9,7 @@ @prefix asset: . @prefix imf: . @prefix : . +@prefix xsd: . :centerLineSubject rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}"; rr:termType rr:IRI; @@ -23,8 +24,83 @@ rr:subjectMap :centerLineSubject ; rr:predicateObjectMap [ rr:predicate graphic:hasCoordinates; - rr:objectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}/coordinates"; - rr:termType rr:IRI; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinConidtion [ + rr:child "ID"; + rr:parent "../Connection/@ToID"; + ] ] - ] . \ No newline at end of file + ] . + + +:CoordinateListMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() = 1]" + ]; + rr:subjectMap [ + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap [ + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + ] + ] . + + +:CoordinateListElementMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" + ]; + rr:subjectMap [ + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap [ + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + ] + # ]; + # rr:predicateObjectMap [ + # rr:predicate rdf:rest; + # rr:objectMap [ + # rr:parentTriplesMap :CoordinateListMap ; + + # ] + ] . + +:CoordinateMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate" + ]; + + rr:subjectMap [ + a rr:RefObjectMap ; + rr:termType rr:BlankNode; + ] + #; +# rr:predicateObjectMap [ +# rr:predicate graphic:x; +# rr:objectMap [ +# rml:reference "@X"; +# rr:datatype xsd:integer; +# ] +# ]; +# rr:predicateObjectMap [ +# rr:predicate graphic:y; +# rr:objectMap [ +# rml:reference "@Y"; +# rr:datatype xsd:integer; +# ] + #] + . \ No newline at end of file From ddb7b60c928a361dddc5a9f0bde4c30d9e2c3f82 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Tue, 21 Jan 2025 12:41:27 +0100 Subject: [PATCH 16/50] Almost got the CenterLine mappings --- examples/graphical.trig | 16 ++-- rml_mappings/graphics/CenterLine.map.ttl | 101 +++++++++++++---------- shacl/graphic-dexpi.shacl.ttl | 6 +- 3 files changed, 70 insertions(+), 53 deletions(-) diff --git a/examples/graphical.trig b/examples/graphical.trig index 9548651d..c1db0ded 100644 --- a/examples/graphical.trig +++ b/examples/graphical.trig @@ -27,8 +27,8 @@ document:graphic1234 a :Diagram ; graphic:PressureVessel-1 a :Symbol ; :hasPosition [ a :Position ; - :x 390 ; - :y 210 ; + :x "390"^^xsd:double ; + :y "210"^^xsd:double ; :rotation 0 ]; :hasGraphics symbol:PT002A . @@ -37,18 +37,18 @@ graphic:GateValve-5-node2-connector a :Line ; :hasCoordinates ( [ a :Position ; - :x 646 ; - :y 188 + :x "646"^^xsd:double ; + :y "188"^^xsd:double ] [ a :Position ; - :x 646 ; - :y 180 + :x "646"^^xsd:double ; + :y "180"^^xsd:double ] [ a :Position ; - :x 412 ; - :y 180 + :x "412"^^xsd:double ; + :y "180"^^xsd:double ] ); :hasStyle [ diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 0eac9c6a..3cc99bf6 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -15,24 +15,52 @@ rr:termType rr:IRI; rr:class graphic:Line . +:hasCoordinatesMap + rr:predicate graphic:hasCoordinates; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "position()"; + rr:parent "../position()"; + ] + ] + . + + :CenterLineMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine" + rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; - rr:subjectMap :centerLineSubject ; - rr:predicateObjectMap [ - rr:predicate graphic:hasCoordinates; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap . + + +:coordinateListContentMap a rr:PredicateObjectMap; + rr:predicate rdf:first; rr:objectMap [ a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateListMap ; - rr:joinConidtion [ - rr:child "ID"; - rr:parent "../Connection/@ToID"; + rr:parentTriplesMap :CoordinateMap ; + rr:joinCondition [ + rr:child "../../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "../position()"; + rr:parent "../position()"; + ], [ + rr:child "../../position()"; + rr:parent "../../position()"; ] - ] - ] . + ]. :CoordinateListMap a rr:TriplesMap; @@ -42,15 +70,10 @@ rml:iterator "//*/CenterLine/Coordinate[position() = 1]" ]; rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap [ - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - ] - ] . + rr:predicateObjectMap :coordinateListContentMap . :CoordinateListElementMap a rr:TriplesMap; @@ -60,14 +83,10 @@ rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" ]; rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap [ - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - ] + rr:predicateObjectMap :coordinateListContentMap . # ]; # rr:predicateObjectMap [ # rr:predicate rdf:rest; @@ -75,7 +94,7 @@ # rr:parentTriplesMap :CoordinateListMap ; # ] - ] . + :CoordinateMap a rr:TriplesMap; rml:logicalSource [ @@ -83,24 +102,22 @@ rml:referenceFormulation ql:XPath; rml:iterator "//*/CenterLine/Coordinate" ]; - rr:subjectMap [ - a rr:RefObjectMap ; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinate"; rr:termType rr:BlankNode; - ] - #; -# rr:predicateObjectMap [ -# rr:predicate graphic:x; -# rr:objectMap [ -# rml:reference "@X"; -# rr:datatype xsd:integer; -# ] -# ]; -# rr:predicateObjectMap [ -# rr:predicate graphic:y; -# rr:objectMap [ -# rml:reference "@Y"; -# rr:datatype xsd:integer; -# ] - #] + ]; + rr:predicateObjectMap [ + rr:predicate graphic:x; + rr:objectMap [ + rml:reference "@X"; + rr:datatype xsd:integer; + ] + ]; + rr:predicateObjectMap [ + rr:predicate graphic:y; + rr:objectMap [ + rml:reference "@Y"; + rr:datatype xsd:integer; + ] + ] . \ No newline at end of file diff --git a/shacl/graphic-dexpi.shacl.ttl b/shacl/graphic-dexpi.shacl.ttl index b5cc32e5..a001de01 100644 --- a/shacl/graphic-dexpi.shacl.ttl +++ b/shacl/graphic-dexpi.shacl.ttl @@ -66,21 +66,21 @@ sh:targetClass :Position; sh:property [ sh:path :x ; - sh:datatype xsd:integer ; + sh:datatype xsd:double ; sh:minCount 1; sh:maxCount 1; sh:message "A position must have exactly one x coordinate" ] ; sh:property [ sh:path :y ; - sh:datatype xsd:integer ; + sh:datatype xsd:double ; sh:minCount 1; sh:maxCount 1; sh:message "A position must have exactly one y coordinate" ] ; sh:property [ sh:path :rotation ; - sh:datatype xsd:integer ; + sh:datatype xsd:double ; sh:minCount 0 ; sh:maxCount 1 ; sh:message "A position may have one rotation" From 476cc9e37b4d80b383bbb08f1761370a29b4a847 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Wed, 22 Jan 2025 14:51:18 +0100 Subject: [PATCH 17/50] Improved joins and ids on center-lines vs. connectors --- examples/graphical.trig | 8 +- rml_mappings/graphics/CenterLine.map.ttl | 212 +++++++++++++++++++---- shacl/graphic-dexpi.shacl.ttl | 13 +- 3 files changed, 188 insertions(+), 45 deletions(-) diff --git a/examples/graphical.trig b/examples/graphical.trig index c1db0ded..d0d052ab 100644 --- a/examples/graphical.trig +++ b/examples/graphical.trig @@ -17,8 +17,8 @@ document:GateValve-5-node2-connector :visualisedAs graphic:GateValve-5-node2-con document:graphic1234 a :Diagram ; :hasExtent [ a :Extent ; - :minimumExtent [ :x 100 ; :y 100 ] ; - :maximumExtent [ :x 200 ; :y 200 ] + :minimumExtent [ :x "100"^^xsd:double ; :y "100"^^xsd:double ] ; + :maximumExtent [ :x "200"^^xsd:double ; :y "200"^^xsd:double ] ] ; :hasSymbol graphic:PressureVessel-1 ; :hasLine graphic:GateValve-5-node2-connector . @@ -29,7 +29,7 @@ graphic:PressureVessel-1 a :Symbol ; a :Position ; :x "390"^^xsd:double ; :y "210"^^xsd:double ; - :rotation 0 + :rotation "0"^^xsd:double ]; :hasGraphics symbol:PT002A . @@ -55,7 +55,7 @@ graphic:GateValve-5-node2-connector a :Line ; :hasStroke [ a :Stroke ; :dasharray "none"^^xsd:string ; - :width 1.4 ; + :width "1.4"^^xsd:double ; :color [ a :RgbColor ; :red 255 ; diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 3cc99bf6..f5b71342 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -11,9 +11,6 @@ @prefix : . @prefix xsd: . -:centerLineSubject rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}"; - rr:termType rr:IRI; - rr:class graphic:Line . :hasCoordinatesMap rr:predicate graphic:hasCoordinates; @@ -31,7 +28,7 @@ . -:CenterLineMap a rr:TriplesMap; +:CenterLineToMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; @@ -42,25 +39,115 @@ rr:termType rr:IRI; rr:class graphic:Line ] ; - rr:predicateObjectMap :hasCoordinatesMap . + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . +:CenterLineAfterComponentMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{preceding-sibling::PipingComponent[1]/@ID}-node2"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . -:coordinateListContentMap a rr:PredicateObjectMap; - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - rr:joinCondition [ - rr:child "../../@ID"; - rr:parent "../../@ID"; - ], [ - rr:child "../position()"; - rr:parent "../position()"; - ], [ - rr:child "../../position()"; - rr:parent "../../position()"; +:CenterLineFromMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[../Connection/@FromID]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@FromID}-node{../Connection/@FromNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . + +:CenterLineToIdMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[../Connection/@ToID]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . + +:lineHasStyleMap a rr:PredicateObjectMap; + rr:predicate graphic:hasStyle; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :LineStyleMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../@ID"; + ], [ + rr:child "position()"; + rr:parent "position()"; ] - ]. + ] . + +:LineStyleMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../@ID}_{count(preceding-sibling::CenterLine)}_linestyle"; + rr:termType rr:BlankNode + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:hasStroke; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :LineStrokeMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../@ID"; + ], [ + rr:child "position()"; + rr:parent "position()"; + ] + ] + ]. + + +:LineStrokeMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../@ID}_{count(preceding-sibling::CenterLine)}_linestroke"; + rr:termType rr:BlankNode ; + rr:class graphic:Stroke + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:dasharray; + rr:objectMap [ + rr:constant "none"; + ] + ] , [ + rr:predicate graphic:width; + rr:objectMap [ + rr:constant "0.25"^^xsd:double; + rr:datatype xsd:double; + ] + ] + . :CoordinateListMap a rr:TriplesMap; @@ -70,10 +157,13 @@ rml:iterator "//*/CenterLine/Coordinate[position() = 1]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap :coordinateListContentMap . + rr:predicateObjectMap + :coordinateListContentMap, + :restOfCoordinateListMap + . :CoordinateListElementMap a rr:TriplesMap; @@ -83,19 +173,73 @@ rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap :coordinateListContentMap . - # ]; - # rr:predicateObjectMap [ - # rr:predicate rdf:rest; - # rr:objectMap [ - # rr:parentTriplesMap :CoordinateListMap ; - - # ] + rr:predicateObjectMap + :coordinateListContentMap, + :restOfCoordinateListMap + . + +:CoordinateListLastElementMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() = last()]" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::CenterLine)}_coordinateListElement"; + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap :coordinateListContentMap, + [ + rr:predicate rdf:rest; + rr:objectMap [ + rr:constant rdf:nil; + ] + ]. + +:restOfCoordinateListMap a rr:PredicateObjectMap; + rr:predicate rdf:rest; + rr:objectMap [ + rr:parentTriplesMap :CoordinateListElementMap ; + a rr:RefObjectMap ; + rr:joinCondition :nextCoordinateListElementJoinConditionId, :nextCoordinateListElementJoinConditionCenterLine, :nextCoordinateListElementJoinConditionCoordinate + ] , [ + rr:parentTriplesMap :CoordinateListLastElementMap ; + a rr:RefObjectMap ; + rr:joinCondition :nextCoordinateListElementJoinConditionId + , :nextCoordinateListElementJoinConditionCenterLine + , :nextCoordinateListElementJoinConditionCoordinate + ]. + +:nextCoordinateListElementJoinConditionId + rr:child "../../@ID"; + rr:parent "../../@ID". + :nextCoordinateListElementJoinConditionCenterLine + rr:child "../count(preceding-sibling::CenterLine)"; + rr:parent "../count(preceding-sibling::CenterLine)". + :nextCoordinateListElementJoinConditionCoordinate + rr:child "count(preceding-sibling::Coordinate)"; + rr:parent "count(preceding-sibling::Coordinate)+1". + +:coordinateListContentMap a rr:PredicateObjectMap; + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + rr:joinCondition + :nextCoordinateListElementJoinConditionId, + :nextCoordinateListElementJoinConditionCenterLine , + [ + rr:child "count(preceding-sibling::Coordinate)"; + rr:parent "count(preceding-sibling::Coordinate)"; + ] + ]. + + :CoordinateMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; @@ -103,21 +247,21 @@ rml:iterator "//*/CenterLine/Coordinate" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinate"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinate"; rr:termType rr:BlankNode; ]; rr:predicateObjectMap [ rr:predicate graphic:x; rr:objectMap [ rml:reference "@X"; - rr:datatype xsd:integer; + rr:datatype xsd:double; ] ]; rr:predicateObjectMap [ rr:predicate graphic:y; rr:objectMap [ rml:reference "@Y"; - rr:datatype xsd:integer; + rr:datatype xsd:double; ] ] . \ No newline at end of file diff --git a/shacl/graphic-dexpi.shacl.ttl b/shacl/graphic-dexpi.shacl.ttl index a001de01..b7eeb6b3 100644 --- a/shacl/graphic-dexpi.shacl.ttl +++ b/shacl/graphic-dexpi.shacl.ttl @@ -165,11 +165,6 @@ sh:maxCount 1; sh:node :StrokeShape ; ] ; - sh:property [ - sh:path :hasStyle ; - sh:maxCount 1; - sh:datatype css:style ; - ] ; sh:closed true. :StrokeShape a sh:NodeShape ; @@ -179,12 +174,16 @@ sh:datatype xsd:string ; ], [ sh:path :width ; - sh:datatype xsd:decimal ; + sh:datatype xsd:double ; + sh:minCount 1; + sh:maxCount 1; + sh:message "A stroke must specify a width"; ] , [ sh:path :color ; - sh:minCount 1; + sh:minCount 0; sh:maxCount 1; sh:node :ColorShape ; + sh:message "A stroke can have at most one color"; ], [ sh:path rdf:type; ]; From 7bf7aac08b21688cfb257197be4d8acc1c9d5612 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 08:56:32 +0100 Subject: [PATCH 18/50] WOrking centerline mappings --- rml_mappings/graphics/CenterLine.map.ttl | 84 ++++++++++++------------ 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index f5b71342..0d5e3e88 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -12,20 +12,6 @@ @prefix xsd: . -:hasCoordinatesMap - rr:predicate graphic:hasCoordinates; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateListMap ; - rr:joinCondition [ - rr:child "../@ID"; - rr:parent "../../@ID"; - ], [ - rr:child "position()"; - rr:parent "../position()"; - ] - ] - . :CenterLineToMap a rr:TriplesMap; @@ -35,7 +21,7 @@ rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case1"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -46,10 +32,10 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent]" + rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent and (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{preceding-sibling::PipingComponent[1]/@ID}-node2"; + rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector-case2"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -60,10 +46,10 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[../Connection/@FromID]" + rml:iterator "//*/CenterLine[(../Connection/@FromID) and not (preceding-sibling::PipingComponent)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@FromID}-node{../Connection/@FromNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector-case3"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -74,16 +60,32 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[../Connection/@ToID]" + rml:iterator "//*/CenterLine[(../Connection/@ToID) and (not ((../Connection/@FromID) or (preceding-sibling::PipingComponent)))]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case4"; rr:termType rr:IRI; rr:class graphic:Line ] ; rr:predicateObjectMap :hasCoordinatesMap ; rr:predicateObjectMap :lineHasStyleMap . +:hasCoordinatesMap + rr:predicate graphic:hasCoordinates; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "../count(preceding-sibling::CenterLine)"; + ] + ] + . + + :lineHasStyleMap a rr:PredicateObjectMap; rr:predicate graphic:hasStyle; rr:objectMap [ @@ -93,8 +95,8 @@ rr:child "../@ID"; rr:parent "../@ID"; ], [ - rr:child "position()"; - rr:parent "position()"; + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "count(preceding-sibling::CenterLine)"; ] ] . @@ -117,8 +119,8 @@ rr:child "../@ID"; rr:parent "../@ID"; ], [ - rr:child "position()"; - rr:parent "position()"; + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "count(preceding-sibling::CenterLine)"; ] ] ]. @@ -154,43 +156,34 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() = 1]" + rml:iterator "//*/CenterLine/Coordinate[not (preceding-sibling::Coordinate)]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_0_coordinateListFirstElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap - :coordinateListContentMap, - :restOfCoordinateListMap - . - + rr:predicateObjectMap :coordinateListContentMap, :restOfCoordinateListMap, :restOfCoordinateListLastMap . :CoordinateListElementMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" + rml:iterator "//*/CenterLine/Coordinate[preceding-sibling::Coordinate and following-sibling::Coordinate]" ]; rr:subjectMap [ rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap - :coordinateListContentMap, - :restOfCoordinateListMap - . + rr:predicateObjectMap :coordinateListContentMap, :restOfCoordinateListMap, :restOfCoordinateListLastMap . - - :CoordinateListLastElementMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() = last()]" + rml:iterator "//*/CenterLine/Coordinate[preceding-sibling::Coordinate and (not (following-sibling::Coordinate))]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::CenterLine)}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListLastElement"; rr:termType rr:BlankNode; ]; rr:predicateObjectMap :coordinateListContentMap, @@ -207,7 +200,11 @@ rr:parentTriplesMap :CoordinateListElementMap ; a rr:RefObjectMap ; rr:joinCondition :nextCoordinateListElementJoinConditionId, :nextCoordinateListElementJoinConditionCenterLine, :nextCoordinateListElementJoinConditionCoordinate - ] , [ + ] . + + :restOfCoordinateListLastMap a rr:PredicateObjectMap; + rr:predicate rdf:rest; + rr:objectMap [ rr:parentTriplesMap :CoordinateListLastElementMap ; a rr:RefObjectMap ; rr:joinCondition :nextCoordinateListElementJoinConditionId @@ -223,7 +220,7 @@ rr:parent "../count(preceding-sibling::CenterLine)". :nextCoordinateListElementJoinConditionCoordinate rr:child "count(preceding-sibling::Coordinate)"; - rr:parent "count(preceding-sibling::Coordinate)+1". + rr:parent "count(preceding-sibling::Coordinate)-1". :coordinateListContentMap a rr:PredicateObjectMap; rr:predicate rdf:first; @@ -249,6 +246,7 @@ rr:subjectMap [ rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinate"; rr:termType rr:BlankNode; + rr:class graphic:Position ]; rr:predicateObjectMap [ rr:predicate graphic:x; From 40b55d70527a3a637b6c798d0789b2a0a5b08e69 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 08:57:58 +0100 Subject: [PATCH 19/50] WOrking centerline mappings --- rml_mappings/graphics/CenterLine.map.ttl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 0d5e3e88..afec4991 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -21,7 +21,7 @@ rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case1"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -35,7 +35,7 @@ rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent and (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector-case2"; + rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -49,7 +49,7 @@ rml:iterator "//*/CenterLine[(../Connection/@FromID) and not (preceding-sibling::PipingComponent)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector-case3"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -63,7 +63,7 @@ rml:iterator "//*/CenterLine[(../Connection/@ToID) and (not ((../Connection/@FromID) or (preceding-sibling::PipingComponent)))]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case4"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; From c9342f67b61c50d2391a1e7651d74ca9905f80f5 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 20 Jan 2025 19:44:31 +0100 Subject: [PATCH 20/50] Trying to get the coordinate list correct --- rml_mappings/graphics/CenterLine.map.ttl | 44 ++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index afec4991..60d44ea1 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -260,6 +260,50 @@ rr:objectMap [ rml:reference "@Y"; rr:datatype xsd:double; + rr:predicate graphic:hasCoordinates; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinConidtion [ + rr:child "ID"; + rr:parent "../Connection/@ToID"; + ] + ] + ] . + + +:CoordinateListMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() = 1]" + ]; + rr:subjectMap [ + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap [ + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + ] + ] . + + +:CoordinateListElementMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" + ]; + rr:subjectMap [ + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap [ + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; ] ] . \ No newline at end of file From 7fad974f042de43e6d88c5644c3b7a04a15839da Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Tue, 21 Jan 2025 12:41:27 +0100 Subject: [PATCH 21/50] Almost got the CenterLine mappings --- examples/graphical.trig | 8 +- rml_mappings/graphics/CenterLine.map.ttl | 270 ++++------------------- 2 files changed, 46 insertions(+), 232 deletions(-) diff --git a/examples/graphical.trig b/examples/graphical.trig index d0d052ab..c1db0ded 100644 --- a/examples/graphical.trig +++ b/examples/graphical.trig @@ -17,8 +17,8 @@ document:GateValve-5-node2-connector :visualisedAs graphic:GateValve-5-node2-con document:graphic1234 a :Diagram ; :hasExtent [ a :Extent ; - :minimumExtent [ :x "100"^^xsd:double ; :y "100"^^xsd:double ] ; - :maximumExtent [ :x "200"^^xsd:double ; :y "200"^^xsd:double ] + :minimumExtent [ :x 100 ; :y 100 ] ; + :maximumExtent [ :x 200 ; :y 200 ] ] ; :hasSymbol graphic:PressureVessel-1 ; :hasLine graphic:GateValve-5-node2-connector . @@ -29,7 +29,7 @@ graphic:PressureVessel-1 a :Symbol ; a :Position ; :x "390"^^xsd:double ; :y "210"^^xsd:double ; - :rotation "0"^^xsd:double + :rotation 0 ]; :hasGraphics symbol:PT002A . @@ -55,7 +55,7 @@ graphic:GateValve-5-node2-connector a :Line ; :hasStroke [ a :Stroke ; :dasharray "none"^^xsd:string ; - :width "1.4"^^xsd:double ; + :width 1.4 ; :color [ a :RgbColor ; :red 255 ; diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 60d44ea1..3cc99bf6 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -11,64 +11,9 @@ @prefix : . @prefix xsd: . - - - -:CenterLineToMap a rr:TriplesMap; - rml:logicalSource [ - rml:source "../pandid.xml"; - rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" - ]; - rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector"; - rr:termType rr:IRI; - rr:class graphic:Line - ] ; - rr:predicateObjectMap :hasCoordinatesMap ; - rr:predicateObjectMap :lineHasStyleMap . - -:CenterLineAfterComponentMap a rr:TriplesMap; - rml:logicalSource [ - rml:source "../pandid.xml"; - rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent and (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" - ]; - rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector"; +:centerLineSubject rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}"; rr:termType rr:IRI; - rr:class graphic:Line - ] ; - rr:predicateObjectMap :hasCoordinatesMap ; - rr:predicateObjectMap :lineHasStyleMap . - -:CenterLineFromMap a rr:TriplesMap; - rml:logicalSource [ - rml:source "../pandid.xml"; - rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[(../Connection/@FromID) and not (preceding-sibling::PipingComponent)]" - ]; - rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector"; - rr:termType rr:IRI; - rr:class graphic:Line - ] ; - rr:predicateObjectMap :hasCoordinatesMap ; - rr:predicateObjectMap :lineHasStyleMap . - -:CenterLineToIdMap a rr:TriplesMap; - rml:logicalSource [ - rml:source "../pandid.xml"; - rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[(../Connection/@ToID) and (not ((../Connection/@FromID) or (preceding-sibling::PipingComponent)))]" - ]; - rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector"; - rr:termType rr:IRI; - rr:class graphic:Line - ] ; - rr:predicateObjectMap :hasCoordinatesMap ; - rr:predicateObjectMap :lineHasStyleMap . + rr:class graphic:Line . :hasCoordinatesMap rr:predicate graphic:hasCoordinates; @@ -79,163 +24,77 @@ rr:child "../@ID"; rr:parent "../../@ID"; ], [ - rr:child "count(preceding-sibling::CenterLine)"; - rr:parent "../count(preceding-sibling::CenterLine)"; + rr:child "position()"; + rr:parent "../position()"; ] ] . -:lineHasStyleMap a rr:PredicateObjectMap; - rr:predicate graphic:hasStyle; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :LineStyleMap ; - rr:joinCondition [ - rr:child "../@ID"; - rr:parent "../@ID"; - ], [ - rr:child "count(preceding-sibling::CenterLine)"; - rr:parent "count(preceding-sibling::CenterLine)"; - ] - ] . - -:LineStyleMap a rr:TriplesMap; +:CenterLineMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine" + rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../@ID}_{count(preceding-sibling::CenterLine)}_linestyle"; - rr:termType rr:BlankNode + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:termType rr:IRI; + rr:class graphic:Line ] ; - rr:predicateObjectMap [ - rr:predicate graphic:hasStroke; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :LineStrokeMap ; - rr:joinCondition [ - rr:child "../@ID"; - rr:parent "../@ID"; - ], [ - rr:child "count(preceding-sibling::CenterLine)"; - rr:parent "count(preceding-sibling::CenterLine)"; - ] - ] - ]. + rr:predicateObjectMap :hasCoordinatesMap . -:LineStrokeMap a rr:TriplesMap; - rml:logicalSource [ - rml:source "../pandid.xml"; - rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine" - ]; - rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../@ID}_{count(preceding-sibling::CenterLine)}_linestroke"; - rr:termType rr:BlankNode ; - rr:class graphic:Stroke - ] ; - rr:predicateObjectMap [ - rr:predicate graphic:dasharray; - rr:objectMap [ - rr:constant "none"; - ] - ] , [ - rr:predicate graphic:width; - rr:objectMap [ - rr:constant "0.25"^^xsd:double; - rr:datatype xsd:double; +:coordinateListContentMap a rr:PredicateObjectMap; + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + rr:joinCondition [ + rr:child "../../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "../position()"; + rr:parent "../position()"; + ], [ + rr:child "../../position()"; + rr:parent "../../position()"; ] - ] - . + ]. :CoordinateListMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[not (preceding-sibling::Coordinate)]" + rml:iterator "//*/CenterLine/Coordinate[position() = 1]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_0_coordinateListFirstElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap :coordinateListContentMap, :restOfCoordinateListMap, :restOfCoordinateListLastMap . + rr:predicateObjectMap :coordinateListContentMap . + :CoordinateListElementMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[preceding-sibling::Coordinate and following-sibling::Coordinate]" + rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap :coordinateListContentMap, :restOfCoordinateListMap, :restOfCoordinateListLastMap . + rr:predicateObjectMap :coordinateListContentMap . + # ]; + # rr:predicateObjectMap [ + # rr:predicate rdf:rest; + # rr:objectMap [ + # rr:parentTriplesMap :CoordinateListMap ; + + # ] -:CoordinateListLastElementMap a rr:TriplesMap; - rml:logicalSource [ - rml:source "../pandid.xml"; - rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[preceding-sibling::Coordinate and (not (following-sibling::Coordinate))]" - ]; - rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListLastElement"; - rr:termType rr:BlankNode; - ]; - rr:predicateObjectMap :coordinateListContentMap, - [ - rr:predicate rdf:rest; - rr:objectMap [ - rr:constant rdf:nil; - ] - ]. - -:restOfCoordinateListMap a rr:PredicateObjectMap; - rr:predicate rdf:rest; - rr:objectMap [ - rr:parentTriplesMap :CoordinateListElementMap ; - a rr:RefObjectMap ; - rr:joinCondition :nextCoordinateListElementJoinConditionId, :nextCoordinateListElementJoinConditionCenterLine, :nextCoordinateListElementJoinConditionCoordinate - ] . - - :restOfCoordinateListLastMap a rr:PredicateObjectMap; - rr:predicate rdf:rest; - rr:objectMap [ - rr:parentTriplesMap :CoordinateListLastElementMap ; - a rr:RefObjectMap ; - rr:joinCondition :nextCoordinateListElementJoinConditionId - , :nextCoordinateListElementJoinConditionCenterLine - , :nextCoordinateListElementJoinConditionCoordinate - ]. - -:nextCoordinateListElementJoinConditionId - rr:child "../../@ID"; - rr:parent "../../@ID". - :nextCoordinateListElementJoinConditionCenterLine - rr:child "../count(preceding-sibling::CenterLine)"; - rr:parent "../count(preceding-sibling::CenterLine)". - :nextCoordinateListElementJoinConditionCoordinate - rr:child "count(preceding-sibling::Coordinate)"; - rr:parent "count(preceding-sibling::Coordinate)-1". - -:coordinateListContentMap a rr:PredicateObjectMap; - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - rr:joinCondition - :nextCoordinateListElementJoinConditionId, - :nextCoordinateListElementJoinConditionCenterLine , - [ - rr:child "count(preceding-sibling::Coordinate)"; - rr:parent "count(preceding-sibling::Coordinate)"; - ] - ]. - :CoordinateMap a rr:TriplesMap; rml:logicalSource [ @@ -244,66 +103,21 @@ rml:iterator "//*/CenterLine/Coordinate" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinate"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinate"; rr:termType rr:BlankNode; - rr:class graphic:Position ]; rr:predicateObjectMap [ rr:predicate graphic:x; rr:objectMap [ rml:reference "@X"; - rr:datatype xsd:double; + rr:datatype xsd:integer; ] ]; rr:predicateObjectMap [ rr:predicate graphic:y; rr:objectMap [ rml:reference "@Y"; - rr:datatype xsd:double; - rr:predicate graphic:hasCoordinates; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateListMap ; - rr:joinConidtion [ - rr:child "ID"; - rr:parent "../Connection/@ToID"; - ] - ] - ] . - - -:CoordinateListMap a rr:TriplesMap; - rml:logicalSource [ - rml:source "../pandid.xml"; - rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() = 1]" - ]; - rr:subjectMap [ - rr:termType rr:BlankNode; - ]; - rr:predicateObjectMap [ - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - ] - ] . - - -:CoordinateListElementMap a rr:TriplesMap; - rml:logicalSource [ - rml:source "../pandid.xml"; - rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" - ]; - rr:subjectMap [ - rr:termType rr:BlankNode; - ]; - rr:predicateObjectMap [ - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; + rr:datatype xsd:integer; ] ] . \ No newline at end of file From 66854ca3c9500456543adb762cff18cd1154345d Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Wed, 22 Jan 2025 14:51:18 +0100 Subject: [PATCH 22/50] Improved joins and ids on center-lines vs. connectors --- examples/graphical.trig | 8 +- rml_mappings/graphics/CenterLine.map.ttl | 212 +++++++++++++++++++---- 2 files changed, 182 insertions(+), 38 deletions(-) diff --git a/examples/graphical.trig b/examples/graphical.trig index c1db0ded..d0d052ab 100644 --- a/examples/graphical.trig +++ b/examples/graphical.trig @@ -17,8 +17,8 @@ document:GateValve-5-node2-connector :visualisedAs graphic:GateValve-5-node2-con document:graphic1234 a :Diagram ; :hasExtent [ a :Extent ; - :minimumExtent [ :x 100 ; :y 100 ] ; - :maximumExtent [ :x 200 ; :y 200 ] + :minimumExtent [ :x "100"^^xsd:double ; :y "100"^^xsd:double ] ; + :maximumExtent [ :x "200"^^xsd:double ; :y "200"^^xsd:double ] ] ; :hasSymbol graphic:PressureVessel-1 ; :hasLine graphic:GateValve-5-node2-connector . @@ -29,7 +29,7 @@ graphic:PressureVessel-1 a :Symbol ; a :Position ; :x "390"^^xsd:double ; :y "210"^^xsd:double ; - :rotation 0 + :rotation "0"^^xsd:double ]; :hasGraphics symbol:PT002A . @@ -55,7 +55,7 @@ graphic:GateValve-5-node2-connector a :Line ; :hasStroke [ a :Stroke ; :dasharray "none"^^xsd:string ; - :width 1.4 ; + :width "1.4"^^xsd:double ; :color [ a :RgbColor ; :red 255 ; diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 3cc99bf6..f5b71342 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -11,9 +11,6 @@ @prefix : . @prefix xsd: . -:centerLineSubject rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}"; - rr:termType rr:IRI; - rr:class graphic:Line . :hasCoordinatesMap rr:predicate graphic:hasCoordinates; @@ -31,7 +28,7 @@ . -:CenterLineMap a rr:TriplesMap; +:CenterLineToMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; @@ -42,25 +39,115 @@ rr:termType rr:IRI; rr:class graphic:Line ] ; - rr:predicateObjectMap :hasCoordinatesMap . + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . +:CenterLineAfterComponentMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{preceding-sibling::PipingComponent[1]/@ID}-node2"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . -:coordinateListContentMap a rr:PredicateObjectMap; - rr:predicate rdf:first; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateMap ; - rr:joinCondition [ - rr:child "../../@ID"; - rr:parent "../../@ID"; - ], [ - rr:child "../position()"; - rr:parent "../position()"; - ], [ - rr:child "../../position()"; - rr:parent "../../position()"; +:CenterLineFromMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[../Connection/@FromID]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@FromID}-node{../Connection/@FromNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . + +:CenterLineToIdMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine[../Connection/@ToID]" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:termType rr:IRI; + rr:class graphic:Line + ] ; + rr:predicateObjectMap :hasCoordinatesMap ; + rr:predicateObjectMap :lineHasStyleMap . + +:lineHasStyleMap a rr:PredicateObjectMap; + rr:predicate graphic:hasStyle; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :LineStyleMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../@ID"; + ], [ + rr:child "position()"; + rr:parent "position()"; ] - ]. + ] . + +:LineStyleMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../@ID}_{count(preceding-sibling::CenterLine)}_linestyle"; + rr:termType rr:BlankNode + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:hasStroke; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :LineStrokeMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../@ID"; + ], [ + rr:child "position()"; + rr:parent "position()"; + ] + ] + ]. + + +:LineStrokeMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../@ID}_{count(preceding-sibling::CenterLine)}_linestroke"; + rr:termType rr:BlankNode ; + rr:class graphic:Stroke + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:dasharray; + rr:objectMap [ + rr:constant "none"; + ] + ] , [ + rr:predicate graphic:width; + rr:objectMap [ + rr:constant "0.25"^^xsd:double; + rr:datatype xsd:double; + ] + ] + . :CoordinateListMap a rr:TriplesMap; @@ -70,10 +157,13 @@ rml:iterator "//*/CenterLine/Coordinate[position() = 1]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap :coordinateListContentMap . + rr:predicateObjectMap + :coordinateListContentMap, + :restOfCoordinateListMap + . :CoordinateListElementMap a rr:TriplesMap; @@ -83,19 +173,73 @@ rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap :coordinateListContentMap . - # ]; - # rr:predicateObjectMap [ - # rr:predicate rdf:rest; - # rr:objectMap [ - # rr:parentTriplesMap :CoordinateListMap ; - - # ] + rr:predicateObjectMap + :coordinateListContentMap, + :restOfCoordinateListMap + . + +:CoordinateListLastElementMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "//*/CenterLine/Coordinate[position() = last()]" + ]; + rr:subjectMap [ + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::CenterLine)}_coordinateListElement"; + rr:termType rr:BlankNode; + ]; + rr:predicateObjectMap :coordinateListContentMap, + [ + rr:predicate rdf:rest; + rr:objectMap [ + rr:constant rdf:nil; + ] + ]. + +:restOfCoordinateListMap a rr:PredicateObjectMap; + rr:predicate rdf:rest; + rr:objectMap [ + rr:parentTriplesMap :CoordinateListElementMap ; + a rr:RefObjectMap ; + rr:joinCondition :nextCoordinateListElementJoinConditionId, :nextCoordinateListElementJoinConditionCenterLine, :nextCoordinateListElementJoinConditionCoordinate + ] , [ + rr:parentTriplesMap :CoordinateListLastElementMap ; + a rr:RefObjectMap ; + rr:joinCondition :nextCoordinateListElementJoinConditionId + , :nextCoordinateListElementJoinConditionCenterLine + , :nextCoordinateListElementJoinConditionCoordinate + ]. + +:nextCoordinateListElementJoinConditionId + rr:child "../../@ID"; + rr:parent "../../@ID". + :nextCoordinateListElementJoinConditionCenterLine + rr:child "../count(preceding-sibling::CenterLine)"; + rr:parent "../count(preceding-sibling::CenterLine)". + :nextCoordinateListElementJoinConditionCoordinate + rr:child "count(preceding-sibling::Coordinate)"; + rr:parent "count(preceding-sibling::Coordinate)+1". + +:coordinateListContentMap a rr:PredicateObjectMap; + rr:predicate rdf:first; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateMap ; + rr:joinCondition + :nextCoordinateListElementJoinConditionId, + :nextCoordinateListElementJoinConditionCenterLine , + [ + rr:child "count(preceding-sibling::Coordinate)"; + rr:parent "count(preceding-sibling::Coordinate)"; + ] + ]. + + :CoordinateMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; @@ -103,21 +247,21 @@ rml:iterator "//*/CenterLine/Coordinate" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../position()}_{position()}_coordinate"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinate"; rr:termType rr:BlankNode; ]; rr:predicateObjectMap [ rr:predicate graphic:x; rr:objectMap [ rml:reference "@X"; - rr:datatype xsd:integer; + rr:datatype xsd:double; ] ]; rr:predicateObjectMap [ rr:predicate graphic:y; rr:objectMap [ rml:reference "@Y"; - rr:datatype xsd:integer; + rr:datatype xsd:double; ] ] . \ No newline at end of file From 8b37fb79b9172da6bf1775ec54c066038e70bf1c Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 08:56:32 +0100 Subject: [PATCH 23/50] WOrking centerline mappings --- rml_mappings/graphics/CenterLine.map.ttl | 84 ++++++++++++------------ 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index f5b71342..0d5e3e88 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -12,20 +12,6 @@ @prefix xsd: . -:hasCoordinatesMap - rr:predicate graphic:hasCoordinates; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :CoordinateListMap ; - rr:joinCondition [ - rr:child "../@ID"; - rr:parent "../../@ID"; - ], [ - rr:child "position()"; - rr:parent "../position()"; - ] - ] - . :CenterLineToMap a rr:TriplesMap; @@ -35,7 +21,7 @@ rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case1"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -46,10 +32,10 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent]" + rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent and (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{preceding-sibling::PipingComponent[1]/@ID}-node2"; + rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector-case2"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -60,10 +46,10 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[../Connection/@FromID]" + rml:iterator "//*/CenterLine[(../Connection/@FromID) and not (preceding-sibling::PipingComponent)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@FromID}-node{../Connection/@FromNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector-case3"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -74,16 +60,32 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine[../Connection/@ToID]" + rml:iterator "//*/CenterLine[(../Connection/@ToID) and (not ((../Connection/@FromID) or (preceding-sibling::PipingComponent)))]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/lines#{../Connection/@ToID}-node{../Connection/@ToNode}"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case4"; rr:termType rr:IRI; rr:class graphic:Line ] ; rr:predicateObjectMap :hasCoordinatesMap ; rr:predicateObjectMap :lineHasStyleMap . +:hasCoordinatesMap + rr:predicate graphic:hasCoordinates; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :CoordinateListMap ; + rr:joinCondition [ + rr:child "../@ID"; + rr:parent "../../@ID"; + ], [ + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "../count(preceding-sibling::CenterLine)"; + ] + ] + . + + :lineHasStyleMap a rr:PredicateObjectMap; rr:predicate graphic:hasStyle; rr:objectMap [ @@ -93,8 +95,8 @@ rr:child "../@ID"; rr:parent "../@ID"; ], [ - rr:child "position()"; - rr:parent "position()"; + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "count(preceding-sibling::CenterLine)"; ] ] . @@ -117,8 +119,8 @@ rr:child "../@ID"; rr:parent "../@ID"; ], [ - rr:child "position()"; - rr:parent "position()"; + rr:child "count(preceding-sibling::CenterLine)"; + rr:parent "count(preceding-sibling::CenterLine)"; ] ] ]. @@ -154,43 +156,34 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() = 1]" + rml:iterator "//*/CenterLine/Coordinate[not (preceding-sibling::Coordinate)]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_0_coordinateListFirstElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap - :coordinateListContentMap, - :restOfCoordinateListMap - . - + rr:predicateObjectMap :coordinateListContentMap, :restOfCoordinateListMap, :restOfCoordinateListLastMap . :CoordinateListElementMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() != last() and position() > 1]" + rml:iterator "//*/CenterLine/Coordinate[preceding-sibling::Coordinate and following-sibling::Coordinate]" ]; rr:subjectMap [ rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListElement"; rr:termType rr:BlankNode; ]; - rr:predicateObjectMap - :coordinateListContentMap, - :restOfCoordinateListMap - . + rr:predicateObjectMap :coordinateListContentMap, :restOfCoordinateListMap, :restOfCoordinateListLastMap . - - :CoordinateListLastElementMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "//*/CenterLine/Coordinate[position() = last()]" + rml:iterator "//*/CenterLine/Coordinate[preceding-sibling::Coordinate and (not (following-sibling::Coordinate))]" ]; rr:subjectMap [ - rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::CenterLine)}_coordinateListElement"; + rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinateListLastElement"; rr:termType rr:BlankNode; ]; rr:predicateObjectMap :coordinateListContentMap, @@ -207,7 +200,11 @@ rr:parentTriplesMap :CoordinateListElementMap ; a rr:RefObjectMap ; rr:joinCondition :nextCoordinateListElementJoinConditionId, :nextCoordinateListElementJoinConditionCenterLine, :nextCoordinateListElementJoinConditionCoordinate - ] , [ + ] . + + :restOfCoordinateListLastMap a rr:PredicateObjectMap; + rr:predicate rdf:rest; + rr:objectMap [ rr:parentTriplesMap :CoordinateListLastElementMap ; a rr:RefObjectMap ; rr:joinCondition :nextCoordinateListElementJoinConditionId @@ -223,7 +220,7 @@ rr:parent "../count(preceding-sibling::CenterLine)". :nextCoordinateListElementJoinConditionCoordinate rr:child "count(preceding-sibling::Coordinate)"; - rr:parent "count(preceding-sibling::Coordinate)+1". + rr:parent "count(preceding-sibling::Coordinate)-1". :coordinateListContentMap a rr:PredicateObjectMap; rr:predicate rdf:first; @@ -249,6 +246,7 @@ rr:subjectMap [ rr:template "{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_{../../@ID}_{../count(preceding-sibling::CenterLine)}_{count(preceding-sibling::Coordinate)}_coordinate"; rr:termType rr:BlankNode; + rr:class graphic:Position ]; rr:predicateObjectMap [ rr:predicate graphic:x; From b238b9abcf6b41e4d7af637aab55849512d4a88a Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 08:57:58 +0100 Subject: [PATCH 24/50] WOrking centerline mappings --- rml_mappings/graphics/CenterLine.map.ttl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rml_mappings/graphics/CenterLine.map.ttl b/rml_mappings/graphics/CenterLine.map.ttl index 0d5e3e88..afec4991 100644 --- a/rml_mappings/graphics/CenterLine.map.ttl +++ b/rml_mappings/graphics/CenterLine.map.ttl @@ -21,7 +21,7 @@ rml:iterator "//*/CenterLine[../Connection/@ToID and not (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case1"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -35,7 +35,7 @@ rml:iterator "//*/CenterLine[preceding-sibling::PipingComponent and (following-sibling::PipingComponent or following-sibling::PropertyBreak)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector-case2"; + rr:template "https://assetid.equinor.com/plantx#{preceding-sibling::PipingComponent[1]/@ID}-node2-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -49,7 +49,7 @@ rml:iterator "//*/CenterLine[(../Connection/@FromID) and not (preceding-sibling::PipingComponent)]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector-case3"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@FromID}-node{../Connection/@FromNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; @@ -63,7 +63,7 @@ rml:iterator "//*/CenterLine[(../Connection/@ToID) and (not ((../Connection/@FromID) or (preceding-sibling::PipingComponent)))]" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector-case4"; + rr:template "https://assetid.equinor.com/plantx#{../Connection/@ToID}-node{../Connection/@ToNode}-connector"; rr:termType rr:IRI; rr:class graphic:Line ] ; From eeedf81aadbf878a66550384f8eb3608021ba1b9 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 10:30:27 +0100 Subject: [PATCH 25/50] Fixed error in shacl testing --- .github/workflows/rdf_tests.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rdf_tests.yml b/.github/workflows/rdf_tests.yml index 864e631c..ce9ed1c8 100644 --- a/.github/workflows/rdf_tests.yml +++ b/.github/workflows/rdf_tests.yml @@ -47,7 +47,14 @@ jobs: export PATH="$PATH:$JENA_HOME/bin" curl -o rml_mappings/pandid.xml https://raw.githubusercontent.com/equinor/NOAKADEXPI/refs/heads/main/Blueprint/DISC_EXAMPLE-02/DISC_EXAMPLE-02-02.xml docker run -v .:/data rmlio/rmlmapper-java:7.2.0 -m rml_mappings/imf/* -o /data/imf.ttl -s Turtle - shacl v --shapes shacl/imf-dexpi.shacl.ttl --data imf.ttl + SHACL_RESULT=$(shacl v --shapes shacl/imf-dexpi.shacl.ttl --data imf.ttl --text --quiet) + if [ "$SHACL_RESULT" != "Conforms" ]; then + echo "SHACL validation failed" + echo $SHACL_RESULT + exit 1 + else + echo "SHACL validation passed" + fi - name: Test graphics mappings run: | @@ -55,7 +62,14 @@ jobs: export PATH="$PATH:$JENA_HOME/bin" curl -o rml_mappings/pandid.xml https://raw.githubusercontent.com/equinor/NOAKADEXPI/refs/heads/main/Blueprint/DISC_EXAMPLE-02/DISC_EXAMPLE-02-02.xml docker run -v .:/data rmlio/rmlmapper-java:7.2.0 -m rml_mappings/graphics/* -o /data/graphics.ttl -s Turtle - shacl v --shapes shacl/graphic-dexpi.shacl.ttl --data graphics.ttl + SHACL_RESULT=$(shacl v --shapes shacl/graphic-dexpi.shacl.ttl --data graphics.ttl --text --quiet) + if [ "$SHACL_RESULT" != "Conforms" ]; then + echo "SHACL validation failed" + echo $SHACL_RESULT + exit 1 + else + echo "SHACL validation passed" + fi - name: Test rdf examples run: | From 9e9dbfb21b5aaabb2831e39a34ffae103222ba4c Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 23 Jan 2025 12:22:48 +0100 Subject: [PATCH 26/50] PlantModel mapping error --- rml_mappings/graphics/PlantModel.map.ttl | 94 ++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 6 deletions(-) diff --git a/rml_mappings/graphics/PlantModel.map.ttl b/rml_mappings/graphics/PlantModel.map.ttl index e9210580..7aa38a9d 100644 --- a/rml_mappings/graphics/PlantModel.map.ttl +++ b/rml_mappings/graphics/PlantModel.map.ttl @@ -10,18 +10,93 @@ @prefix imf: . @prefix : . -:documentSubject +:PlantModelDrawingMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "/PlantModel" + ]; + rr:subjectMap [ rr:template "https://assetid.equinor.com/plantx/drawing#{MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}"; rr:termType rr:IRI; - rr:class graphic:Diagram . + rr:class graphic:Diagram + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:hasExtent; + rr:objectMap [ + rr:parentTriplesMap :HasExtentMap ; + rr:joinCondition [ + rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + ] + ] + ]. -:PlantModelDrawingMap a rr:TriplesMap; +:HasExtentMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "/PlantModel/Drawing/Extent" + ]; + rr:subjectMap [ + rr:template "{../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_extent"; + rr:termType rr:BlankNode; + rr:class graphic:Extent + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:minimumExtent; + rr:objectMap [ + rr:parentTriplesMap :MinimumExtentMap ; + rr:joinCondition [ + rr:child "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + ] + ] + ]; + rr:predicateObjectMap [ + rr:predicate graphic:maximumExtent; + rr:objectMap [ + rr:parentTriplesMap :MaximumExtentMap ; + rr:joinCondition [ + rr:child "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + ] + ] + ] + . + +:MaximumExtentMap a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; rml:iterator "/PlantModel" ]; - rr:subjectMap :documentSubject . + rr:subjectMap [ + rr:template "{MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_maximumExtent"; + rr:termType rr:BlankNode; + rr:class graphic:Position + ] ; + rr:predicateObjectMap [ + rr:predicate schema:x; + rr:objectMap [ + rr:parentTriplesMap :MaximumExtentXMap ; + rr:joinCondition [ + rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + ] + ] + ]; + rr:predicateObjectMap [ + rr:predicate schema:y; + rr:objectMap [ + rr:parentTriplesMap :MaximumExtentYMap ; + rr:joinCondition [ + rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + ] + ] + ] + . :PlantModelDocumentMap a rr:TriplesMap; rml:logicalSource [ @@ -30,10 +105,17 @@ rml:iterator "/PlantModel" ]; rr:subjectMap [ - rr:template "https://assetid.equinor.com/plantx#{MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}"; + rr:template "https://assetid.equinor.com/document/SITE/{MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}"; rr:termType rr:IRI ] ; rr:predicateObjectMap [ rr:predicate graphic:visualisedAs; - rr:objectMap :documentSubject + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :PlantModelDrawingMap ; + rr:joinCondition [ + rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + ] + ] ]. \ No newline at end of file From 97ff3aa77b88e3b495b7d39162f97bf21bbd2a9e Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Fri, 24 Jan 2025 13:17:08 +0100 Subject: [PATCH 27/50] Fixed bug in plant extent mapping --- rml_mappings/graphics/PlantModel.map.ttl | 89 +++++++++++------------- 1 file changed, 41 insertions(+), 48 deletions(-) diff --git a/rml_mappings/graphics/PlantModel.map.ttl b/rml_mappings/graphics/PlantModel.map.ttl index 7aa38a9d..bba290e7 100644 --- a/rml_mappings/graphics/PlantModel.map.ttl +++ b/rml_mappings/graphics/PlantModel.map.ttl @@ -42,16 +42,16 @@ rr:template "{../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_extent"; rr:termType rr:BlankNode; rr:class graphic:Extent - ] ; - rr:predicateObjectMap [ - rr:predicate graphic:minimumExtent; - rr:objectMap [ - rr:parentTriplesMap :MinimumExtentMap ; - rr:joinCondition [ - rr:child "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - rr:parent "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - ] - ] + # ] ; + # rr:predicateObjectMap [ + # rr:predicate graphic:minimumExtent; + # rr:objectMap [ + # rr:parentTriplesMap :MinimumExtentMap ; + # rr:joinCondition [ + # rr:child "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + # rr:parent "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + # ] + # ] ]; rr:predicateObjectMap [ rr:predicate graphic:maximumExtent; @@ -59,7 +59,7 @@ rr:parentTriplesMap :MaximumExtentMap ; rr:joinCondition [ rr:child "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - rr:parent "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "../../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; ] ] ] @@ -69,53 +69,46 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "/PlantModel" + rml:iterator "/PlantModel/Drawing/Extent/Max" ]; rr:subjectMap [ - rr:template "{MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_maximumExtent"; + rr:template "{../../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_maximumExtent"; rr:termType rr:BlankNode; rr:class graphic:Position ] ; rr:predicateObjectMap [ - rr:predicate schema:x; + rr:predicate graphic:x; rr:objectMap [ - rr:parentTriplesMap :MaximumExtentXMap ; - rr:joinCondition [ - rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - ] + rr:template "@X"; + rr:datatype xsd:double ] - ]; - rr:predicateObjectMap [ - rr:predicate schema:y; + ], [ + rr:predicate graphic:y; rr:objectMap [ - rr:parentTriplesMap :MaximumExtentYMap ; - rr:joinCondition [ - rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - ] + rr:template "@Y"; + rr:datatype xsd:double ] ] . -:PlantModelDocumentMap a rr:TriplesMap; - rml:logicalSource [ - rml:source "../pandid.xml"; - rml:referenceFormulation ql:XPath; - rml:iterator "/PlantModel" - ]; - rr:subjectMap [ - rr:template "https://assetid.equinor.com/document/SITE/{MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}"; - rr:termType rr:IRI - ] ; - rr:predicateObjectMap [ - rr:predicate graphic:visualisedAs; - rr:objectMap [ - a rr:RefObjectMap ; - rr:parentTriplesMap :PlantModelDrawingMap ; - rr:joinCondition [ - rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - ] - ] - ]. \ No newline at end of file +# :PlantModelDocumentMap a rr:TriplesMap; +# rml:logicalSource [ +# rml:source "../pandid.xml"; +# rml:referenceFormulation ql:XPath; +# rml:iterator "/PlantModel" +# ]; +# rr:subjectMap [ +# rr:template "https://assetid.equinor.com/document/SITE/{MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}"; +# rr:termType rr:IRI +# ] ; +# rr:predicateObjectMap [ +# rr:predicate graphic:visualisedAs; +# rr:objectMap [ +# a rr:RefObjectMap ; +# rr:parentTriplesMap :PlantModelDrawingMap ; +# rr:joinCondition [ +# rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; +# rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; +# ] +# ] +# ]. \ No newline at end of file From 87ed4696ee8e3736710f737006de7944b35d3614 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Fri, 24 Jan 2025 13:45:17 +0100 Subject: [PATCH 28/50] Added Equipment symbols --- rml_mappings/graphics/Equipment.map.ttl | 37 +++++++++- rml_mappings/graphics/PlantModel.map.ttl | 94 ++++++++++++++---------- 2 files changed, 90 insertions(+), 41 deletions(-) diff --git a/rml_mappings/graphics/Equipment.map.ttl b/rml_mappings/graphics/Equipment.map.ttl index 6805705f..1b3956ed 100644 --- a/rml_mappings/graphics/Equipment.map.ttl +++ b/rml_mappings/graphics/Equipment.map.ttl @@ -33,4 +33,39 @@ rr:objectMap [ rml:reference "GenericAttributes/GenericAttribute[@Name='TagNameAssignmentClass']/@Value"; ] - ]. \ No newline at end of file + ] , + [ + rr:predicate graphic:hasPosition ; + rr:objectMap [ + rr:parentTriplesMap :SymbolPositionMap ; + rr:joinCondition [ + rr:child "@ID"; + rr:parent "../@ID"; + ] + ] + ]. + +:SymbolPositionMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "PlantModel/Equipment/Position" + ]; + rr:subjectMap [ + rr:template "position_{../@ID}_position"; + rr:termType rr:BlankNode; + rr:class graphic:Position + ]; + rr:predicateObjectMap [ + rr:predicate graphic:x; + rr:objectMap [ + rr:template "{Location/@X}"; + rr:datatype xsd:double; + ] + ] , [ + rr:predicate graphic:y; + rr:objectMap [ + rr:template "{Location/@Y}"; + rr:datatype xsd:double; + ] + ] . diff --git a/rml_mappings/graphics/PlantModel.map.ttl b/rml_mappings/graphics/PlantModel.map.ttl index bba290e7..473c08e7 100644 --- a/rml_mappings/graphics/PlantModel.map.ttl +++ b/rml_mappings/graphics/PlantModel.map.ttl @@ -27,7 +27,7 @@ rr:parentTriplesMap :HasExtentMap ; rr:joinCondition [ rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; ] ] ]. @@ -42,16 +42,16 @@ rr:template "{../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_extent"; rr:termType rr:BlankNode; rr:class graphic:Extent - # ] ; - # rr:predicateObjectMap [ - # rr:predicate graphic:minimumExtent; - # rr:objectMap [ - # rr:parentTriplesMap :MinimumExtentMap ; - # rr:joinCondition [ - # rr:child "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - # rr:parent "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - # ] - # ] + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:minimumExtent; + rr:objectMap [ + rr:parentTriplesMap :MinimumExtentMap ; + rr:joinCondition [ + rr:child "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "../../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + ] + ] ]; rr:predicateObjectMap [ rr:predicate graphic:maximumExtent; @@ -76,39 +76,53 @@ rr:termType rr:BlankNode; rr:class graphic:Position ] ; - rr:predicateObjectMap [ + rr:predicateObjectMap :graphicXMapping, :graphicYMapping . + +:MinimumExtentMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "/PlantModel/Drawing/Extent/Min" + ]; + rr:subjectMap [ + rr:template "{../../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}_minimumExtent"; + rr:termType rr:BlankNode; + rr:class graphic:Position + ] ; + rr:predicateObjectMap :graphicXMapping, :graphicYMapping . + +:graphicXMapping a rr:PredicateObjectMap; rr:predicate graphic:x; rr:objectMap [ - rr:template "@X"; + rr:template "{@X}"; rr:datatype xsd:double - ] - ], [ + ] . + + :graphicYMapping a rr:PredicateObjectMap; rr:predicate graphic:y; rr:objectMap [ - rr:template "@Y"; + rr:template "{@Y}"; rr:datatype xsd:double - ] - ] - . + ] . -# :PlantModelDocumentMap a rr:TriplesMap; -# rml:logicalSource [ -# rml:source "../pandid.xml"; -# rml:referenceFormulation ql:XPath; -# rml:iterator "/PlantModel" -# ]; -# rr:subjectMap [ -# rr:template "https://assetid.equinor.com/document/SITE/{MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}"; -# rr:termType rr:IRI -# ] ; -# rr:predicateObjectMap [ -# rr:predicate graphic:visualisedAs; -# rr:objectMap [ -# a rr:RefObjectMap ; -# rr:parentTriplesMap :PlantModelDrawingMap ; -# rr:joinCondition [ -# rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; -# rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; -# ] -# ] -# ]. \ No newline at end of file +:PlantModelDocumentMap a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "/PlantModel" + ]; + rr:subjectMap [ + rr:template "https://assetid.equinor.com/document/SITE/{MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}"; + rr:termType rr:IRI + ] ; + rr:predicateObjectMap [ + rr:predicate graphic:visualisedAs; + rr:objectMap [ + a rr:RefObjectMap ; + rr:parentTriplesMap :PlantModelDrawingMap ; + rr:joinCondition [ + rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + ] + ] + ]. \ No newline at end of file From ca4d519c2f87c9b84ecbe8b725c2559a685d93b7 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Fri, 24 Jan 2025 15:45:56 +0100 Subject: [PATCH 29/50] Fixed shacl to work --- rml_mappings/graphics/PlantModel.map.ttl | 32 +++++++++++++- shacl/graphic-dexpi.shacl.ttl | 56 ++++++++++++++---------- 2 files changed, 65 insertions(+), 23 deletions(-) diff --git a/rml_mappings/graphics/PlantModel.map.ttl b/rml_mappings/graphics/PlantModel.map.ttl index 473c08e7..9d9fc8ca 100644 --- a/rml_mappings/graphics/PlantModel.map.ttl +++ b/rml_mappings/graphics/PlantModel.map.ttl @@ -30,6 +30,35 @@ rr:parent "../../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; ] ] + ] , [ + rr:predicate graphic:hasSymbol; + rr:objectMap [ + rr:parentTriplesMap :EquipmentBlockMap ; + rr:joinCondition [ + rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + rr:parent "../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; + ] + ] + ], [ + rr:predicate graphic:hasLine; + rr:objectMap [ + rr:parentTriplesMap :CenterLineToMap + ] + ], [ + rr:predicate graphic:hasLine; + rr:objectMap [ + rr:parentTriplesMap :CenterLineAfterComponentMap + ] + ], [ + rr:predicate graphic:hasLine; + rr:objectMap [ + rr:parentTriplesMap :CenterLineFromMap + ] + ], [ + rr:predicate graphic:hasLine; + rr:objectMap [ + rr:parentTriplesMap :CenterLineToIdMap + ] ]. :HasExtentMap a rr:TriplesMap; @@ -113,7 +142,8 @@ ]; rr:subjectMap [ rr:template "https://assetid.equinor.com/document/SITE/{MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}"; - rr:termType rr:IRI + rr:termType rr:IRI ; + rr:class graphic:PID ] ; rr:predicateObjectMap [ rr:predicate graphic:visualisedAs; diff --git a/shacl/graphic-dexpi.shacl.ttl b/shacl/graphic-dexpi.shacl.ttl index b7eeb6b3..2a4ef925 100644 --- a/shacl/graphic-dexpi.shacl.ttl +++ b/shacl/graphic-dexpi.shacl.ttl @@ -19,29 +19,29 @@ :DiagramShape a sh:NodeShape ; sh:targetClass :Diagram ; sh:property [ - sh:path :hasExtent ; - sh:node :ExtentShape ; - sh:class :Extent ; - sh:minCount 1; - sh:maxCount 1; - sh:message "A Dexpi diagram must have exactly one extent" ; + sh:path :hasExtent ; + sh:node :ExtentShape ; + sh:class :Extent ; + sh:minCount 1; + sh:maxCount 1; + sh:message "A Dexpi diagram must have exactly one extent" ; ] , [ sh:path :hasSymbol ; sh:class :Symbol ; sh:minCount 1; - sh:message "A Dexpi graphic must have at least one symbol" - ] , [ - sh:path :hasLine ; - sh:class :Line ; - sh:minCount 1; - sh:message "A Dexpi graphic must have at least one line" - ] , [ - sh:path [sh:inversePath :visualisedAs] ; - sh:class :PID ; - sh:minCount 1; - sh:maxCount 1; - sh:message "A Dexpi graphic must be a visualization of exaxtly one P&ID document" - ]. + sh:message "A Dexpi graphic must have at least one symbol" + ] , [ + sh:path :hasLine ; + sh:class :Line ; + sh:minCount 1; + sh:message "A Dexpi graphic must have at least one line" + ] , [ + sh:path [sh:inversePath :visualisedAs] ; + sh:class :PID ; + sh:minCount 1; + sh:maxCount 1; + sh:message "A Dexpi graphic must be a visualization of exaxtly one P&ID document" + ]. :ExtentShape a sh:NodeShape ; sh:targetClass :Extent ; @@ -104,9 +104,15 @@ sh:maxCount 1; sh:message "A symbol must have exactly one graphics" ] , [ - sh:path [sh:inversePath :visualisedAs] ; + sh:path [sh:inversePath :visualisedAs] ; sh:maxCount 1; sh:message "A Dexpi symbol is a visualization of at most one IMF concept (propably block or terminal)" + ] , [ + sh:path [sh:inversePath :hasSymbol ] ; + sh:maxCount 1; + sh:minCount 1; + sh:class :Diagram; + sh:message "A Dexpi symbol is part of exactly one diagram" ] , [ sh:path rdf:type; ] , [ @@ -131,10 +137,16 @@ sh:message "A line must have at least one style"; sh:node :StyleShape ; ] , [ - sh:path [sh:inversePath :visualisedAs] ; + sh:path [ sh:inversePath :visualisedAs ] ; sh:maxCount 1; sh:message "A Dexpi line is a visualization of at most one IMF concept (propably connector)" ], [ + sh:path [ sh:inversePath :hasLine ] ; + sh:maxCount 1; + sh:minCount 1; + sh:class :Diagram; + sh:message "A Dexpi line is part of exactly one diagram" + ] , [ sh:path rdf:type; ] ; sh:closed true . @@ -155,7 +167,7 @@ ] ; sh:or ( [ sh:property [ sh:path rdf:rest ; sh:hasValue rdf:nil ] ] - [ sh:property [ sh:path rdf:rest ; sh:node :CoordinateListShape ] ] + [ sh:property [ sh:path rdf:rest ; sh:minCount 1 ; sh:maxCount 1 ] ] ) ; sh:closed true. From dd00de8c59c5e0d7a5943d885676f63835646737 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 27 Jan 2025 09:54:14 +0100 Subject: [PATCH 30/50] Added lacking xsd prefix --- rml_mappings/graphics/Equipment.map.ttl | 1 + rml_mappings/graphics/PlantModel.map.ttl | 1 + 2 files changed, 2 insertions(+) diff --git a/rml_mappings/graphics/Equipment.map.ttl b/rml_mappings/graphics/Equipment.map.ttl index 1b3956ed..cb59ac09 100644 --- a/rml_mappings/graphics/Equipment.map.ttl +++ b/rml_mappings/graphics/Equipment.map.ttl @@ -8,6 +8,7 @@ @prefix dexpi: . @prefix asset: . @prefix imf: . +@prefix xsd: . @prefix : . :EquipmentBlockMap a rr:TriplesMap; diff --git a/rml_mappings/graphics/PlantModel.map.ttl b/rml_mappings/graphics/PlantModel.map.ttl index 9d9fc8ca..b163445c 100644 --- a/rml_mappings/graphics/PlantModel.map.ttl +++ b/rml_mappings/graphics/PlantModel.map.ttl @@ -8,6 +8,7 @@ @prefix dexpi: . @prefix asset: . @prefix imf: . +@prefix xsd: . @prefix : . :PlantModelDrawingMap a rr:TriplesMap; From a05b0300f12792383bf8225be396e344bcd55c52 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 27 Jan 2025 10:04:47 +0100 Subject: [PATCH 31/50] Added rotation to symbol mapping --- rml_mappings/graphics/Equipment.map.ttl | 29 ++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/rml_mappings/graphics/Equipment.map.ttl b/rml_mappings/graphics/Equipment.map.ttl index cb59ac09..64399837 100644 --- a/rml_mappings/graphics/Equipment.map.ttl +++ b/rml_mappings/graphics/Equipment.map.ttl @@ -52,21 +52,30 @@ rml:referenceFormulation ql:XPath; rml:iterator "PlantModel/Equipment/Position" ]; - rr:subjectMap [ + rr:subjectMap :symbolPositionSubject; + rr:predicateObjectMap :symbolPositionX , :symbolPositionY , + [ + rr:predicate graphic:rotation; + rr:objectMap [ + rr:template "0"; + rr:datatype xsd:double; + ] + ] . + +:symbolPositionSubject a rr:SubjectMap; rr:template "position_{../@ID}_position"; rr:termType rr:BlankNode; - rr:class graphic:Position - ]; - rr:predicateObjectMap [ + rr:class graphic:Position . +:symbolPositionX a rr:PredicateObjectMap; rr:predicate graphic:x; rr:objectMap [ - rr:template "{Location/@X}"; + rml:reference "Location/@X"; rr:datatype xsd:double; - ] - ] , [ + ] . + + :symbolPositionY a rr:PredicateObjectMap; rr:predicate graphic:y; rr:objectMap [ - rr:template "{Location/@Y}"; + rr:template "{//*/Drawing/Extent/Max/@Y - Location/@Y}"; rr:datatype xsd:double; - ] - ] . + ] . \ No newline at end of file From ad0c22abb5327d7c832ac8e6152bc6fefd94fc80 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 27 Jan 2025 11:52:47 +0100 Subject: [PATCH 32/50] Added rotation to positions --- rml_mappings/graphics/Equipment.map.ttl | 72 ++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 7 deletions(-) diff --git a/rml_mappings/graphics/Equipment.map.ttl b/rml_mappings/graphics/Equipment.map.ttl index 64399837..54a356cc 100644 --- a/rml_mappings/graphics/Equipment.map.ttl +++ b/rml_mappings/graphics/Equipment.map.ttl @@ -38,19 +38,46 @@ [ rr:predicate graphic:hasPosition ; rr:objectMap [ - rr:parentTriplesMap :SymbolPositionMap ; - rr:joinCondition [ - rr:child "@ID"; - rr:parent "../@ID"; + rr:parentTriplesMap :SymbolPositionMap0 ; + rr:joinCondition :symbolPositionJoinCondition + ], + [ + rr:parentTriplesMap :SymbolPositionMap90 ; + rr:joinCondition :symbolPositionJoinCondition + ] + , + [ + rr:parentTriplesMap :SymbolPositionMap180 ; + rr:joinCondition :symbolPositionJoinCondition], + [ + rr:parentTriplesMap :SymbolPositionMap270 ; + rr:joinCondition :symbolPositionJoinCondition ] - ] ]. +:symbolPositionJoinCondition a rr:Join ; + rr:child "@ID"; + rr:parent "../@ID" . -:SymbolPositionMap a rr:TriplesMap; +:SymbolPositionMap270 a rr:TriplesMap; rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "PlantModel/Equipment/Position" + rml:iterator "PlantModel/Equipment/Position[Reference/@X='0' and Reference/@Y='1' and Reference/@Z='0' and Axis/@Z='1']" + ]; + rr:subjectMap :symbolPositionSubject; + rr:predicateObjectMap :symbolPositionX , :symbolPositionY , + [ + rr:predicate graphic:rotation; + rr:objectMap [ + rr:template "270"; + rr:datatype xsd:double; + ] + ] . +:SymbolPositionMap0 a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "PlantModel/Equipment/Position[Reference/@X='1' and Reference/@Y='0' and Reference/@Z='0' and Axis/@Z='1']" ]; rr:subjectMap :symbolPositionSubject; rr:predicateObjectMap :symbolPositionX , :symbolPositionY , @@ -61,6 +88,37 @@ rr:datatype xsd:double; ] ] . +:SymbolPositionMap180 a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "PlantModel/Equipment/Position[Reference/@X = '-1' and Reference/@Y = '0' and Reference/@Z = '0' and Axis/@Z='1']" + ]; + rr:subjectMap :symbolPositionSubject; + rr:predicateObjectMap :symbolPositionX , :symbolPositionY , + [ + rr:predicate graphic:rotation; + rr:objectMap [ + rr:template "180"; + rr:datatype xsd:double; + ] + ] . +:SymbolPositionMap90 a rr:TriplesMap; + rml:logicalSource [ + rml:source "../pandid.xml"; + rml:referenceFormulation ql:XPath; + rml:iterator "PlantModel/Equipment/Position[Reference/@X = '0' and Reference/@Y = '-1' and Reference/@Z = '0' and Axis/@Z='1']" + ]; + rr:subjectMap :symbolPositionSubject; + rr:predicateObjectMap :symbolPositionX , :symbolPositionY , + [ + rr:predicate graphic:rotation; + rr:objectMap [ + rr:template "90"; + rr:datatype xsd:double; + ] + ] . + :symbolPositionSubject a rr:SubjectMap; rr:template "position_{../@ID}_position"; From 251606bb0f69a7c9ee38742ab1333ca923350289 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 27 Jan 2025 12:16:26 +0100 Subject: [PATCH 33/50] Fixed negative rotation also. Removed PipeTee since not graphical --- rml_mappings/graphics/Equipment.map.ttl | 16 ++++++++-------- rml_mappings/graphics/PlantModel.map.ttl | 6 +----- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/rml_mappings/graphics/Equipment.map.ttl b/rml_mappings/graphics/Equipment.map.ttl index 54a356cc..2edfa8a0 100644 --- a/rml_mappings/graphics/Equipment.map.ttl +++ b/rml_mappings/graphics/Equipment.map.ttl @@ -15,7 +15,7 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "PlantModel/Equipment" + rml:iterator "PlantModel/Equipment | //PipingNetworkSegment/PipingComponent[@ComponentName != 'PipeTee'] | //PipingNetworkSegment/PropertyBreak" ]; rr:subjectMap [ rr:template "https://assetid.equinor.com/plantx/{/PlantModel/MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value}/symbols#{@ID}"; @@ -62,14 +62,14 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "PlantModel/Equipment/Position[Reference/@X='0' and Reference/@Y='1' and Reference/@Z='0' and Axis/@Z='1']" + rml:iterator "//Position[Reference/@X='0' and Reference/@Y='1' and Reference/@Z='0' and Axis/@Z='1']" ]; rr:subjectMap :symbolPositionSubject; rr:predicateObjectMap :symbolPositionX , :symbolPositionY , [ rr:predicate graphic:rotation; rr:objectMap [ - rr:template "270"; + rr:template "{270 * Axis/@Z}"; rr:datatype xsd:double; ] ] . @@ -77,7 +77,7 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "PlantModel/Equipment/Position[Reference/@X='1' and Reference/@Y='0' and Reference/@Z='0' and Axis/@Z='1']" + rml:iterator "//Position[Reference/@X='1' and Reference/@Y='0' and Reference/@Z='0']" ]; rr:subjectMap :symbolPositionSubject; rr:predicateObjectMap :symbolPositionX , :symbolPositionY , @@ -92,14 +92,14 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "PlantModel/Equipment/Position[Reference/@X = '-1' and Reference/@Y = '0' and Reference/@Z = '0' and Axis/@Z='1']" + rml:iterator "//Position[Reference/@X = '-1' and Reference/@Y = '0' and Reference/@Z = '0']" ]; rr:subjectMap :symbolPositionSubject; rr:predicateObjectMap :symbolPositionX , :symbolPositionY , [ rr:predicate graphic:rotation; rr:objectMap [ - rr:template "180"; + rr:template "{180 * Axis/@Z}"; rr:datatype xsd:double; ] ] . @@ -107,14 +107,14 @@ rml:logicalSource [ rml:source "../pandid.xml"; rml:referenceFormulation ql:XPath; - rml:iterator "PlantModel/Equipment/Position[Reference/@X = '0' and Reference/@Y = '-1' and Reference/@Z = '0' and Axis/@Z='1']" + rml:iterator "//Position[Reference/@X = '0' and Reference/@Y = '-1' and Reference/@Z = '0' and Axis/@Z='1']" ]; rr:subjectMap :symbolPositionSubject; rr:predicateObjectMap :symbolPositionX , :symbolPositionY , [ rr:predicate graphic:rotation; rr:objectMap [ - rr:template "90"; + rr:template "{90 * Axis/@Z}"; rr:datatype xsd:double; ] ] . diff --git a/rml_mappings/graphics/PlantModel.map.ttl b/rml_mappings/graphics/PlantModel.map.ttl index b163445c..40a82eb3 100644 --- a/rml_mappings/graphics/PlantModel.map.ttl +++ b/rml_mappings/graphics/PlantModel.map.ttl @@ -34,11 +34,7 @@ ] , [ rr:predicate graphic:hasSymbol; rr:objectMap [ - rr:parentTriplesMap :EquipmentBlockMap ; - rr:joinCondition [ - rr:child "MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - rr:parent "../MetaData/GenericAttributes/GenericAttribute[@Name='DrawingNumberAssignmentClass']/@Value"; - ] + rr:parentTriplesMap :EquipmentBlockMap ] ], [ rr:predicate graphic:hasLine; From 1093c5d52c03f8ca020db326cbb609896b7ed53f Mon Sep 17 00:00:00 2001 From: "henriette.rebnor" Date: Thu, 30 Jan 2025 13:01:17 +0100 Subject: [PATCH 34/50] Create interface --- client/Boundaries/Backend/Program.cs | 36 +- .../Boundaries/ConnectionSettings.cs | 10 + client/Boundaries/Boundaries/IRdfoxApi.cs | 18 + client/Boundaries/Boundaries/RdfoxApi.cs | 38 +- ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 + .../Debug/net8.0/Dexpi2Svg.AssemblyInfo.cs | 23 + .../net8.0/Dexpi2Svg.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 15 + .../Debug/net8.0/Dexpi2Svg.GlobalUsings.g.cs | 8 + .../obj/Debug/net8.0/Dexpi2Svg.assets.cache | Bin 0 -> 239 bytes .../obj/Dexpi2Svg.csproj.nuget.dgspec.json | 75 + .../obj/Dexpi2Svg.csproj.nuget.g.props | 16 + .../obj/Dexpi2Svg.csproj.nuget.g.targets | 2 + ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 + .../Release/net8.0/Dexpi2Svg.AssemblyInfo.cs | 23 + .../net8.0/Dexpi2Svg.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 15 + .../net8.0/Dexpi2Svg.GlobalUsings.g.cs | 8 + .../obj/Release/net8.0/Dexpi2Svg.assets.cache | Bin 0 -> 239 bytes .../Dexpi2Svg/obj/project.assets.json | 81 + .../Dexpi2Svg/obj/project.nuget.cache | 8 + rml_mappings/graphics/graphic.trig | 3210 +++++++++++++++++ 22 files changed, 3549 insertions(+), 47 deletions(-) create mode 100644 client/Boundaries/Boundaries/ConnectionSettings.cs create mode 100644 client/Boundaries/Boundaries/IRdfoxApi.cs create mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs create mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfo.cs create mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache create mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GlobalUsings.g.cs create mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.assets.cache create mode 100644 client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.dgspec.json create mode 100644 client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.g.props create mode 100644 client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.g.targets create mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs create mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfo.cs create mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache create mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GlobalUsings.g.cs create mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.assets.cache create mode 100644 client/Boundaries/Dexpi2Svg/obj/project.assets.json create mode 100644 client/Boundaries/Dexpi2Svg/obj/project.nuget.cache create mode 100644 rml_mappings/graphics/graphic.trig diff --git a/client/Boundaries/Backend/Program.cs b/client/Boundaries/Backend/Program.cs index 55070c37..93b5e48b 100644 --- a/client/Boundaries/Backend/Program.cs +++ b/client/Boundaries/Backend/Program.cs @@ -9,20 +9,26 @@ builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); +var connectionSettings = new ConnectionSettings +{ + Host = "localhost", + Port = 12110, + Username = "admin", + Password = "admin", + Datastore = "boundaries" +}; + +builder.Services.AddSingleton(new RdfoxApi(connectionSettings)); + var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI(); - app.UseHttpsRedirection(); -// Establish connection to Rdfox -var conn = RdfoxApi.GetDefaultConnectionSettings(); - - // Add node as boundary -app.MapPost("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId) => +app.MapPost("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); @@ -33,7 +39,7 @@ <{packageId}> {TypesProvider.type} ?type . }}"; - var existsResult = await RdfoxApi.AskSparql(conn, checkQuery); + var existsResult = await rdfoxApi.AskSparql(checkQuery); if (!existsResult) { @@ -43,16 +49,14 @@ var data = $@" <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> ."; - await RdfoxApi.LoadData(conn, data); + await rdfoxApi.LoadData(data); return Results.Ok($"Triple with subject {packageId} and object {nodeId} inserted successfully."); }); - - //Add node as internal -app.MapPost("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId) => +app.MapPost("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); @@ -63,7 +67,7 @@ ASK WHERE {{ <{packageId}> {TypesProvider.type} {PropertiesProvider.CommissioningPackage} . }}"; - var existsResult = await RdfoxApi.AskSparql(conn, checkQuery); + var existsResult = await rdfoxApi.AskSparql(checkQuery); if (!existsResult) { @@ -74,13 +78,13 @@ ASK WHERE {{ <{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> . "; - await RdfoxApi.LoadData(conn, data); + await rdfoxApi.LoadData(data); return Results.Ok($"Triple for package {packageId} and node {nodeId} inserted successfully."); }); // Remove node as boundary -app.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId) => +app.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); @@ -90,7 +94,7 @@ ASK WHERE {{ <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> . }}"; - var existsResult = await RdfoxApi.AskSparql(conn, checkQuery); + var existsResult = await rdfoxApi.AskSparql(checkQuery); if (!existsResult) { @@ -101,7 +105,7 @@ ASK WHERE {{ <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> . "; - await RdfoxApi.DeleteData(conn, data); + await rdfoxApi.DeleteData(data); return Results.Ok($"Triple for package {packageId} and node {nodeId} deleted successfully."); }); diff --git a/client/Boundaries/Boundaries/ConnectionSettings.cs b/client/Boundaries/Boundaries/ConnectionSettings.cs new file mode 100644 index 00000000..502cdb37 --- /dev/null +++ b/client/Boundaries/Boundaries/ConnectionSettings.cs @@ -0,0 +1,10 @@ +namespace Boundaries; + +public struct ConnectionSettings +{ + public string Host { get; set; } + public int Port { get; set; } + public string Username { get; set; } + public string Password { get; set; } + public string Datastore { get; set; } + } \ No newline at end of file diff --git a/client/Boundaries/Boundaries/IRdfoxApi.cs b/client/Boundaries/Boundaries/IRdfoxApi.cs new file mode 100644 index 00000000..8a1dda77 --- /dev/null +++ b/client/Boundaries/Boundaries/IRdfoxApi.cs @@ -0,0 +1,18 @@ +namespace Boundaries; + + +public interface IRdfoxApi +{ + public Task DeleteDatalog( string datalog); + + public Task LoadDatalog(string datalog); + + public Task DeleteData(string data); + + public Task LoadData(string data); + + public Task QuerySparql(string query); + + public Task AskSparql(string query); + +} \ No newline at end of file diff --git a/client/Boundaries/Boundaries/RdfoxApi.cs b/client/Boundaries/Boundaries/RdfoxApi.cs index 69773654..5303ccb9 100644 --- a/client/Boundaries/Boundaries/RdfoxApi.cs +++ b/client/Boundaries/Boundaries/RdfoxApi.cs @@ -1,40 +1,16 @@ using System.Text; -using IriTools; namespace Boundaries; -public class RdfoxApi +public class RdfoxApi(ConnectionSettings conn) : IRdfoxApi { - public struct ConnectionSettings - { - public string Host { get; set; } - public int Port { get; set; } - public string Username { get; set; } - public string Password { get; set; } - public string Datastore { get; set; } - - } - - public static ConnectionSettings GetDefaultConnectionSettings() - { - return new ConnectionSettings - { - Host = "localhost", - Port = 12110, - Username = "admin", - Password = "admin", - Datastore = "boundaries" - }; - } - - /// /// curl -i -X POST localhost:12110/datastores/boundaries/content?operation=delete-content -H "Content-Type: application/x.datalog" -T boundaries.dlog /// /// /// - public static async Task DeleteDatalog(ConnectionSettings conn, string datalog) + public async Task DeleteDatalog(string datalog) { using (var client = new HttpClient()) { @@ -56,7 +32,7 @@ public static async Task DeleteDatalog(ConnectionSettings conn, string datalog) /// /// /// - public static async Task LoadDatalog(ConnectionSettings conn, string datalog) + public async Task LoadDatalog(string datalog) { using (var client = new HttpClient()) { @@ -79,7 +55,7 @@ public static async Task LoadDatalog(ConnectionSettings conn, string datalog) /// /// /// - public static async Task DeleteData(ConnectionSettings conn, string data) + public async Task DeleteData(string data) { using (var client = new HttpClient()) { @@ -102,7 +78,7 @@ public static async Task DeleteData(ConnectionSettings conn, string data) /// /// /// - public static async Task LoadData(ConnectionSettings conn, string data) + public async Task LoadData(string data) { using (var client = new HttpClient()) { @@ -126,7 +102,7 @@ public static async Task LoadData(ConnectionSettings conn, string data) /// /// /// - public static async Task QuerySparql(ConnectionSettings conn, string query) + public async Task QuerySparql(string query) { using (var client = new HttpClient()) { @@ -145,7 +121,7 @@ public static async Task QuerySparql(ConnectionSettings conn, string que } } - public static async Task AskSparql(ConnectionSettings conn, string query) + public async Task AskSparql(string query) { using (var client = new HttpClient()) { diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 00000000..2217181c --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfo.cs b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfo.cs new file mode 100644 index 00000000..f6255a8d --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfo.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Dexpi2Svg")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ca7b34307b429016dc48a48e6c40e672dd08cb4c")] +[assembly: System.Reflection.AssemblyProductAttribute("Dexpi2Svg")] +[assembly: System.Reflection.AssemblyTitleAttribute("Dexpi2Svg")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache new file mode 100644 index 00000000..03c4211b --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2af0af0bd597d780609da32eceff3e33644e66555e091baabe1c821b5d31caf9 diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 00000000..d91c9854 --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,15 @@ +is_global = true +build_property.TargetFramework = net8.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = Dexpi2Svg +build_property.ProjectDir = C:\Users\henriette.rebnor\source\repos\equinor\ssi-dexpi-tmp\client\Boundaries\Dexpi2Svg\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GlobalUsings.g.cs b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GlobalUsings.g.cs new file mode 100644 index 00000000..8578f3d0 --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.assets.cache b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..d87d4f5409df87d8b31ef6e0b78c8ada75c39311 GIT binary patch literal 239 zcmWIWc6a1qU|_hb66SDsKG!b}p}U9rqfNF=u>HGE*|?ugnr{hvaMvS?*FZJI0w$nB zEoZBk(Bjmh;+TxoyrRt1l9E)tqSU0k{Gu4Wywdd4l9+ + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\henriette.rebnor\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + PackageReference + 6.12.3 + + + + + + \ No newline at end of file diff --git a/client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.g.targets b/client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.g.targets new file mode 100644 index 00000000..3dc06ef3 --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 00000000..2217181c --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfo.cs b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfo.cs new file mode 100644 index 00000000..379d35dd --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfo.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Dexpi2Svg")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+89a517806f61772e4cb058556cda169f60c280ca")] +[assembly: System.Reflection.AssemblyProductAttribute("Dexpi2Svg")] +[assembly: System.Reflection.AssemblyTitleAttribute("Dexpi2Svg")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache new file mode 100644 index 00000000..cb13cabd --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d7e0701566d3076071b23b61b7739c34a4113980b66cf8c68a1157332b58403c diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 00000000..d91c9854 --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,15 @@ +is_global = true +build_property.TargetFramework = net8.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = Dexpi2Svg +build_property.ProjectDir = C:\Users\henriette.rebnor\source\repos\equinor\ssi-dexpi-tmp\client\Boundaries\Dexpi2Svg\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GlobalUsings.g.cs b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GlobalUsings.g.cs new file mode 100644 index 00000000..8578f3d0 --- /dev/null +++ b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.assets.cache b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..65891cfa07272ff21f54db17fdd0bcce370fb581 GIT binary patch literal 239 zcmWIWc6a1qU|>kR>BJqid3~YB(rNmY_a}W*sK2*j`G;+VcDouU>3o>B^fgcov49Dv zP|MjWCbT%Us5mAgHLoZ$wWK6fuP8MsFTW^8FRwH`wIrq>F*!RiJ+(LnWUM<-c|cKq zdQoDof?H-zYO#W . +@prefix asset: . +@prefix dexpi: . +@prefix graphic: . +@prefix imf: . +@prefix ql: . +@prefix rdf: . +@prefix rdfs: . +@prefix rml: . +@prefix rr: . +@prefix schema: . +@prefix xsd: . + +{ + _:C01_NOA1_MeasuringLineFunction-1_0_0_coordinate a graphic:Position; + graphic:x 4.12E2; + graphic:y 3.54E2 . + + _:C01_NOA1_MeasuringLineFunction-1_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_MeasuringLineFunction-1_0_0_coordinate; + rdf:rest _:C01_NOA1_MeasuringLineFunction-1_0_1_coordinateListLastElement . + + _:C01_NOA1_MeasuringLineFunction-1_0_1_coordinate a graphic:Position; + graphic:x 4.24E2; + graphic:y 3.54E2 . + + _:C01_NOA1_MeasuringLineFunction-1_0_1_coordinateListLastElement rdf:first _:C01_NOA1_MeasuringLineFunction-1_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_MeasuringLineFunction-1_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_MeasuringLineFunction-1_0_linestyle graphic:hasStroke _:C01_NOA1_MeasuringLineFunction-1_0_linestroke . + + _:C01_NOA1_MeasuringLineFunction-2_0_0_coordinate a graphic:Position; + graphic:x 3.01E2; + graphic:y 4.67999834195E2 . + + _:C01_NOA1_MeasuringLineFunction-2_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_MeasuringLineFunction-2_0_0_coordinate; + rdf:rest _:C01_NOA1_MeasuringLineFunction-2_0_1_coordinateListLastElement . + + _:C01_NOA1_MeasuringLineFunction-2_0_1_coordinate a graphic:Position; + graphic:x 3.01E2; + graphic:y 4.80999654278E2 . + + _:C01_NOA1_MeasuringLineFunction-2_0_1_coordinateListLastElement rdf:first _:C01_NOA1_MeasuringLineFunction-2_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_MeasuringLineFunction-2_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_MeasuringLineFunction-2_0_linestyle graphic:hasStroke _:C01_NOA1_MeasuringLineFunction-2_0_linestroke . + + _:C01_NOA1_MeasuringLineFunction-3_0_0_coordinate a graphic:Position; + graphic:x 4.0E2; + graphic:y 4.37E2 . + + _:C01_NOA1_MeasuringLineFunction-3_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_MeasuringLineFunction-3_0_0_coordinate; + rdf:rest _:C01_NOA1_MeasuringLineFunction-3_0_1_coordinateListLastElement . + + _:C01_NOA1_MeasuringLineFunction-3_0_1_coordinate a graphic:Position; + graphic:x 4.0E2; + graphic:y 4.61E2 . + + _:C01_NOA1_MeasuringLineFunction-3_0_1_coordinateListLastElement rdf:first _:C01_NOA1_MeasuringLineFunction-3_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_MeasuringLineFunction-3_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_MeasuringLineFunction-3_0_linestyle graphic:hasStroke _:C01_NOA1_MeasuringLineFunction-3_0_linestroke . + + _:C01_NOA1_MeasuringLineFunction-4_0_0_coordinate a graphic:Position; + graphic:x 6.07E2; + graphic:y 1.98E2 . + + _:C01_NOA1_MeasuringLineFunction-4_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_MeasuringLineFunction-4_0_0_coordinate; + rdf:rest _:C01_NOA1_MeasuringLineFunction-4_0_1_coordinateListLastElement . + + _:C01_NOA1_MeasuringLineFunction-4_0_1_coordinate a graphic:Position; + graphic:x 6.07E2; + graphic:y 2.16E2 . + + _:C01_NOA1_MeasuringLineFunction-4_0_1_coordinateListLastElement rdf:first _:C01_NOA1_MeasuringLineFunction-4_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_MeasuringLineFunction-4_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_MeasuringLineFunction-4_0_linestyle graphic:hasStroke _:C01_NOA1_MeasuringLineFunction-4_0_linestroke . + + _:C01_NOA1_MeasuringLineFunction-5_0_0_coordinate a graphic:Position; + graphic:x 7.5E2; + graphic:y 2.02E2 . + + _:C01_NOA1_MeasuringLineFunction-5_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_MeasuringLineFunction-5_0_0_coordinate; + rdf:rest _:C01_NOA1_MeasuringLineFunction-5_0_1_coordinateListLastElement . + + _:C01_NOA1_MeasuringLineFunction-5_0_1_coordinate a graphic:Position; + graphic:x 7.5E2; + graphic:y 2.16E2 . + + _:C01_NOA1_MeasuringLineFunction-5_0_1_coordinateListLastElement rdf:first _:C01_NOA1_MeasuringLineFunction-5_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_MeasuringLineFunction-5_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_MeasuringLineFunction-5_0_linestyle graphic:hasStroke _:C01_NOA1_MeasuringLineFunction-5_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-10_0_0_coordinate a graphic:Position; + graphic:x 3.61E2; + graphic:y 5.41E2 . + + _:C01_NOA1_PipingNetworkSegment-10_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-10_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-10_0_1_coordinateListElement . + + _:C01_NOA1_PipingNetworkSegment-10_0_1_coordinate a graphic:Position; + graphic:x 3.61E2; + graphic:y 5.58E2 . + + _:C01_NOA1_PipingNetworkSegment-10_0_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-10_0_1_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-10_0_2_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-10_0_2_coordinate a graphic:Position; + graphic:x 5.62E2; + graphic:y 5.58E2 . + + _:C01_NOA1_PipingNetworkSegment-10_0_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-10_0_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-10_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-10_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-10_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-11_0_0_coordinate a graphic:Position; + graphic:x 3.9E2; + graphic:y 3.29E2 . + + _:C01_NOA1_PipingNetworkSegment-11_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-11_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-11_0_1_coordinate a graphic:Position; + graphic:x 3.9E2; + graphic:y 3.08E2 . + + _:C01_NOA1_PipingNetworkSegment-11_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-11_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-11_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-11_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-11_1_0_coordinate a graphic:Position; + graphic:x 3.9E2; + graphic:y 3.0E2 . + + _:C01_NOA1_PipingNetworkSegment-11_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_1_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-11_1_1_coordinateListElement . + + _:C01_NOA1_PipingNetworkSegment-11_1_1_coordinate a graphic:Position; + graphic:x 3.9E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-11_1_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_1_1_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-11_1_2_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-11_1_2_coordinate a graphic:Position; + graphic:x 4.21E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-11_1_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_1_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-11_1_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-11_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-11_1_linestroke . + + _:C01_NOA1_PipingNetworkSegment-11_2_0_coordinate a graphic:Position; + graphic:x 4.29E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-11_2_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_2_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-11_2_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-11_2_1_coordinate a graphic:Position; + graphic:x 4.42E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-11_2_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_2_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-11_2_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-11_2_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-11_2_linestroke . + + _:C01_NOA1_PipingNetworkSegment-12_0_0_coordinate a graphic:Position; + graphic:x 5.02E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-12_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-12_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-12_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-12_0_1_coordinate a graphic:Position; + graphic:x 5.18E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-12_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-12_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-12_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-12_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-12_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-12_1_0_coordinate a graphic:Position; + graphic:x 5.26E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-12_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-12_1_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-12_1_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-12_1_1_coordinate a graphic:Position; + graphic:x 5.38E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-12_1_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-12_1_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-12_1_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-12_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-12_1_linestroke . + + _:C01_NOA1_PipingNetworkSegment-13_0_0_coordinate a graphic:Position; + graphic:x 7.14E2; + graphic:y 1.44E2 . + + _:C01_NOA1_PipingNetworkSegment-13_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-13_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-13_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-13_0_1_coordinate a graphic:Position; + graphic:x 7.14E2; + graphic:y 2.55E2 . + + _:C01_NOA1_PipingNetworkSegment-13_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-13_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-13_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-13_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-13_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-14_0_0_coordinate a graphic:Position; + graphic:x 6.62E2; + graphic:y 2.83E2 . + + _:C01_NOA1_PipingNetworkSegment-14_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-14_0_1_coordinateListElement . + + _:C01_NOA1_PipingNetworkSegment-14_0_1_coordinate a graphic:Position; + graphic:x 6.62E2; + graphic:y 2.99E2 . + + _:C01_NOA1_PipingNetworkSegment-14_0_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_0_1_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-14_0_2_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-14_0_2_coordinate a graphic:Position; + graphic:x 6.76E2; + graphic:y 2.99E2 . + + _:C01_NOA1_PipingNetworkSegment-14_0_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_0_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-14_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-14_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-14_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-14_1_0_coordinate a graphic:Position; + graphic:x 6.84E2; + graphic:y 2.99E2 . + + _:C01_NOA1_PipingNetworkSegment-14_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_1_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-14_1_1_coordinateListElement . + + _:C01_NOA1_PipingNetworkSegment-14_1_1_coordinate a graphic:Position; + graphic:x 7.32E2; + graphic:y 2.99E2 . + + _:C01_NOA1_PipingNetworkSegment-14_1_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_1_1_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-14_1_2_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-14_1_2_coordinate a graphic:Position; + graphic:x 7.32E2; + graphic:y 1.58E2 . + + _:C01_NOA1_PipingNetworkSegment-14_1_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_1_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-14_1_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-14_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-14_1_linestroke . + + _:C01_NOA1_PipingNetworkSegment-15_0_0_coordinate a graphic:Position; + graphic:x 7.32E2; + graphic:y 1.49E2 . + + _:C01_NOA1_PipingNetworkSegment-15_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-15_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-15_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-15_0_1_coordinate a graphic:Position; + graphic:x 7.32E2; + graphic:y 9.4E1 . + + _:C01_NOA1_PipingNetworkSegment-15_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-15_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-15_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-15_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-15_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-17_0_0_coordinate a graphic:Position; + graphic:x 5.66E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-17_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-17_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-17_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-17_0_1_coordinate a graphic:Position; + graphic:x 5.72E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-17_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-17_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-17_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-17_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-17_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-18_0_0_coordinate a graphic:Position; + graphic:x 5.72E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-18_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-18_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-18_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-18_0_1_coordinate a graphic:Position; + graphic:x 5.72E2; + graphic:y 1.69E2 . + + _:C01_NOA1_PipingNetworkSegment-18_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-18_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-18_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-18_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-18_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-19_0_0_coordinate a graphic:Position; + graphic:x 5.72E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-19_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-19_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-19_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-19_0_1_coordinate a graphic:Position; + graphic:x 5.87E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-19_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-19_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-19_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-19_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-19_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-20_0_0_coordinate a graphic:Position; + graphic:x 5.87E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-20_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-20_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-20_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-20_0_1_coordinate a graphic:Position; + graphic:x 6.07E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-20_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-20_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-20_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-20_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-20_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-21_0_0_coordinate a graphic:Position; + graphic:x 6.07E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-21_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-21_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-21_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-21_0_1_coordinate a graphic:Position; + graphic:x 6.07E2; + graphic:y 1.9E2 . + + _:C01_NOA1_PipingNetworkSegment-21_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-21_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-21_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-21_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-21_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-22_0_0_coordinate a graphic:Position; + graphic:x 6.07E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-22_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-22_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-22_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-22_0_1_coordinate a graphic:Position; + graphic:x 6.22E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-22_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-22_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-22_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-22_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-22_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-22_1_0_coordinate a graphic:Position; + graphic:x 6.3E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-22_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-22_1_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-22_1_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-22_1_1_coordinate a graphic:Position; + graphic:x 6.46E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-22_1_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-22_1_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-22_1_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-22_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-22_1_linestroke . + + _:C01_NOA1_PipingNetworkSegment-23_0_0_coordinate a graphic:Position; + graphic:x 6.46E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-23_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-23_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-23_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-23_0_1_coordinate a graphic:Position; + graphic:x 7.5E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-23_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-23_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-23_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-23_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-23_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-24_0_0_coordinate a graphic:Position; + graphic:x 7.5E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-24_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-24_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-24_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-24_0_1_coordinate a graphic:Position; + graphic:x 7.5E2; + graphic:y 1.94E2 . + + _:C01_NOA1_PipingNetworkSegment-24_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-24_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-24_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-24_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-24_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-25_0_0_coordinate a graphic:Position; + graphic:x 7.5E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-25_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-25_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-25_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-25_0_1_coordinate a graphic:Position; + graphic:x 7.68E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-25_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-25_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-25_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-25_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-25_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-26_0_0_coordinate a graphic:Position; + graphic:x 5.87E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-26_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-26_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-26_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-26_0_1_coordinate a graphic:Position; + graphic:x 5.87E2; + graphic:y 3.75E2 . + + _:C01_NOA1_PipingNetworkSegment-26_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-26_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-26_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-26_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-26_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-27_0_0_coordinate a graphic:Position; + graphic:x 5.83E2; + graphic:y 3.79E2 . + + _:C01_NOA1_PipingNetworkSegment-27_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-27_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-27_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-27_0_1_coordinate a graphic:Position; + graphic:x 4.12E2; + graphic:y 3.79E2 . + + _:C01_NOA1_PipingNetworkSegment-27_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-27_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-27_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-27_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-27_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-28_0_0_coordinate a graphic:Position; + graphic:x 6.46E2; + graphic:y 1.8E2 . + + _:C01_NOA1_PipingNetworkSegment-28_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-28_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-28_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-28_0_1_coordinate a graphic:Position; + graphic:x 6.46E2; + graphic:y 2.55E2 . + + _:C01_NOA1_PipingNetworkSegment-28_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-28_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-28_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-28_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-28_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-29_0_0_coordinate a graphic:Position; + graphic:x 6.46E2; + graphic:y 2.83E2 . + + _:C01_NOA1_PipingNetworkSegment-29_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-29_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-29_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-29_0_1_coordinate a graphic:Position; + graphic:x 6.46E2; + graphic:y 3.98E2 . + + _:C01_NOA1_PipingNetworkSegment-29_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-29_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-29_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-29_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-29_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-29_1_0_coordinate a graphic:Position; + graphic:x 6.46E2; + graphic:y 4.06E2 . + + _:C01_NOA1_PipingNetworkSegment-29_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-29_1_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-29_1_1_coordinateListElement . + + _:C01_NOA1_PipingNetworkSegment-29_1_1_coordinate a graphic:Position; + graphic:x 6.46E2; + graphic:y 4.14E2 . + + _:C01_NOA1_PipingNetworkSegment-29_1_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-29_1_1_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-29_1_2_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-29_1_2_coordinate a graphic:Position; + graphic:x 4.12E2; + graphic:y 4.14E2 . + + _:C01_NOA1_PipingNetworkSegment-29_1_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-29_1_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-29_1_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-29_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-29_1_linestroke . + + _:C01_NOA1_PipingNetworkSegment-30_0_0_coordinate a graphic:Position; + graphic:x 4.42E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-30_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-30_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-30_0_1_coordinate a graphic:Position; + graphic:x 4.54E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-30_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-30_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-30_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-30_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-30_1_0_coordinate a graphic:Position; + graphic:x 4.66E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-30_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_1_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-30_1_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-30_1_1_coordinate a graphic:Position; + graphic:x 4.76E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-30_1_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_1_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-30_1_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-30_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-30_1_linestroke . + + _:C01_NOA1_PipingNetworkSegment-30_2_0_coordinate a graphic:Position; + graphic:x 4.84E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-30_2_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_2_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-30_2_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-30_2_1_coordinate a graphic:Position; + graphic:x 4.98E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-30_2_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_2_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-30_2_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-30_2_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-30_2_linestroke . + + _:C01_NOA1_PipingNetworkSegment-31_0_0_coordinate a graphic:Position; + graphic:x 4.42E2; + graphic:y 1.72E2 . + + _:C01_NOA1_PipingNetworkSegment-31_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-31_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-31_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-31_0_1_coordinate a graphic:Position; + graphic:x 4.42E2; + graphic:y 1.56E2 . + + _:C01_NOA1_PipingNetworkSegment-31_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-31_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-31_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-31_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-31_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-3_0_0_coordinate a graphic:Position; + graphic:x 8.5E1; + graphic:y 3.56E2 . + + _:C01_NOA1_PipingNetworkSegment-3_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-3_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-3_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-3_0_1_coordinate a graphic:Position; + graphic:x 1.45E2; + graphic:y 3.56E2 . + + _:C01_NOA1_PipingNetworkSegment-3_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-3_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-3_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-3_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-3_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-4_0_0_coordinate a graphic:Position; + graphic:x 1.73E2; + graphic:y 3.64E2 . + + _:C01_NOA1_PipingNetworkSegment-4_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-4_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-4_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-4_0_1_coordinate a graphic:Position; + graphic:x 2.3E2; + graphic:y 3.64E2 . + + _:C01_NOA1_PipingNetworkSegment-4_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-4_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-4_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-4_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-4_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-5_0_0_coordinate a graphic:Position; + graphic:x 2.3E2; + graphic:y 3.8E2 . + + _:C01_NOA1_PipingNetworkSegment-5_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-5_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-5_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-5_0_1_coordinate a graphic:Position; + graphic:x 1.72E2; + graphic:y 3.8E2 . + + _:C01_NOA1_PipingNetworkSegment-5_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-5_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-5_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-5_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-5_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-6_0_0_coordinate a graphic:Position; + graphic:x 3.32E2; + graphic:y 3.64E2 . + + _:C01_NOA1_PipingNetworkSegment-6_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-6_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-6_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-6_0_1_coordinate a graphic:Position; + graphic:x 2.74E2; + graphic:y 3.64E2 . + + _:C01_NOA1_PipingNetworkSegment-6_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-6_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-6_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-6_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-6_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-7_0_0_coordinate a graphic:Position; + graphic:x 2.74E2; + graphic:y 3.8E2 . + + _:C01_NOA1_PipingNetworkSegment-7_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-7_0_1_coordinateListElement . + + _:C01_NOA1_PipingNetworkSegment-7_0_1_coordinate a graphic:Position; + graphic:x 2.92E2; + graphic:y 3.8E2 . + + _:C01_NOA1_PipingNetworkSegment-7_0_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_0_1_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-7_0_2_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-7_0_2_coordinate a graphic:Position; + graphic:x 2.92E2; + graphic:y 4.3E2 . + + _:C01_NOA1_PipingNetworkSegment-7_0_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_0_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-7_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-7_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-7_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-7_1_0_coordinate a graphic:Position; + graphic:x 2.92E2; + graphic:y 4.38E2 . + + _:C01_NOA1_PipingNetworkSegment-7_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_1_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-7_1_1_coordinateListElement . + + _:C01_NOA1_PipingNetworkSegment-7_1_1_coordinate a graphic:Position; + graphic:x 2.92E2; + graphic:y 4.67E2 . + + _:C01_NOA1_PipingNetworkSegment-7_1_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_1_1_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-7_1_2_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-7_1_2_coordinate a graphic:Position; + graphic:x 3.01E2; + graphic:y 4.67E2 . + + _:C01_NOA1_PipingNetworkSegment-7_1_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_1_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-7_1_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-7_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-7_1_linestroke . + + _:C01_NOA1_PipingNetworkSegment-7_2_0_coordinate a graphic:Position; + graphic:x 3.01E2; + graphic:y 4.67E2 . + + _:C01_NOA1_PipingNetworkSegment-7_2_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_2_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-7_2_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-7_2_1_coordinate a graphic:Position; + graphic:x 3.61E2; + graphic:y 4.67E2 . + + _:C01_NOA1_PipingNetworkSegment-7_2_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_2_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-7_2_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-7_2_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-7_2_linestroke . + + _:C01_NOA1_PipingNetworkSegment-8_0_0_coordinate a graphic:Position; + graphic:x 3.61E2; + graphic:y 4.67E2 . + + _:C01_NOA1_PipingNetworkSegment-8_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-8_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-8_0_1_coordinateListElement . + + _:C01_NOA1_PipingNetworkSegment-8_0_1_coordinate a graphic:Position; + graphic:x 3.8E2; + graphic:y 4.67E2 . + + _:C01_NOA1_PipingNetworkSegment-8_0_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-8_0_1_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-8_0_2_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-8_0_2_coordinate a graphic:Position; + graphic:x 3.8E2; + graphic:y 4.37E2 . + + _:C01_NOA1_PipingNetworkSegment-8_0_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-8_0_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-8_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-8_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-8_0_linestroke . + + _:C01_NOA1_PipingNetworkSegment-9_0_0_coordinate a graphic:Position; + graphic:x 3.61E2; + graphic:y 4.67E2 . + + _:C01_NOA1_PipingNetworkSegment-9_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-9_0_0_coordinate; + rdf:rest _:C01_NOA1_PipingNetworkSegment-9_0_1_coordinateListLastElement . + + _:C01_NOA1_PipingNetworkSegment-9_0_1_coordinate a graphic:Position; + graphic:x 3.61E2; + graphic:y 5.21E2 . + + _:C01_NOA1_PipingNetworkSegment-9_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-9_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_PipingNetworkSegment-9_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_PipingNetworkSegment-9_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-9_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-10_0_0_coordinate a graphic:Position; + graphic:x 3.01E2; + graphic:y 4.93E2 . + + _:C01_NOA1_SignalConveyingFunction-10_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-10_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-10_0_1_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-10_0_1_coordinate a graphic:Position; + graphic:x 3.01E2; + graphic:y 5.01E2 . + + _:C01_NOA1_SignalConveyingFunction-10_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-10_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-10_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-10_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-10_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-13_0_0_coordinate a graphic:Position; + graphic:x 4.13E2; + graphic:y 2.12E2 . + + _:C01_NOA1_SignalConveyingFunction-13_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-13_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-13_0_1_coordinateListElement . + + _:C01_NOA1_SignalConveyingFunction-13_0_1_coordinate a graphic:Position; + graphic:x 4.25E2; + graphic:y 2.12E2 . + + _:C01_NOA1_SignalConveyingFunction-13_0_1_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-13_0_1_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-13_0_2_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-13_0_2_coordinate a graphic:Position; + graphic:x 4.25E2; + graphic:y 1.85E2 . + + _:C01_NOA1_SignalConveyingFunction-13_0_2_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-13_0_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-13_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-13_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-13_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-14_0_0_coordinate a graphic:Position; + graphic:x 4.25E2; + graphic:y 2.23E2 . + + _:C01_NOA1_SignalConveyingFunction-14_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-14_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-14_0_1_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-14_0_1_coordinate a graphic:Position; + graphic:x 4.25E2; + graphic:y 1.85E2 . + + _:C01_NOA1_SignalConveyingFunction-14_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-14_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-14_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-14_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-14_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-15_0_0_coordinate a graphic:Position; + graphic:x 4.41E2; + graphic:y 2.23E2 . + + _:C01_NOA1_SignalConveyingFunction-15_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-15_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-15_0_1_coordinateListElement . + + _:C01_NOA1_SignalConveyingFunction-15_0_1_coordinate a graphic:Position; + graphic:x 4.41E2; + graphic:y 2.12E2 . + + _:C01_NOA1_SignalConveyingFunction-15_0_1_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-15_0_1_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-15_0_2_coordinateListElement . + + _:C01_NOA1_SignalConveyingFunction-15_0_2_coordinate a graphic:Position; + graphic:x 4.25E2; + graphic:y 2.12E2 . + + _:C01_NOA1_SignalConveyingFunction-15_0_2_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-15_0_2_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-15_0_3_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-15_0_3_coordinate a graphic:Position; + graphic:x 4.25E2; + graphic:y 1.85E2 . + + _:C01_NOA1_SignalConveyingFunction-15_0_3_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-15_0_3_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-15_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-15_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-15_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-16_0_0_coordinate a graphic:Position; + graphic:x 6.8E2; + graphic:y 4.61E2 . + + _:C01_NOA1_SignalConveyingFunction-16_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-16_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-16_0_1_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-16_0_1_coordinate a graphic:Position; + graphic:x 6.8E2; + graphic:y 3.12E2 . + + _:C01_NOA1_SignalConveyingFunction-16_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-16_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-16_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-16_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-16_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-17_0_0_coordinate a graphic:Position; + graphic:x 4.06E2; + graphic:y 4.67E2 . + + _:C01_NOA1_SignalConveyingFunction-17_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-17_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-17_0_1_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-17_0_1_coordinate a graphic:Position; + graphic:x 6.74E2; + graphic:y 4.67E2 . + + _:C01_NOA1_SignalConveyingFunction-17_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-17_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-17_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-17_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-17_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-18_0_0_coordinate a graphic:Position; + graphic:x 7.5E2; + graphic:y 2.28E2 . + + _:C01_NOA1_SignalConveyingFunction-18_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-18_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-18_0_1_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-18_0_1_coordinate a graphic:Position; + graphic:x 7.5E2; + graphic:y 2.41E2 . + + _:C01_NOA1_SignalConveyingFunction-18_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-18_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-18_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-18_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-18_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-19_0_0_coordinate a graphic:Position; + graphic:x 7.5E2; + graphic:y 2.53E2 . + + _:C01_NOA1_SignalConveyingFunction-19_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-19_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-19_0_1_coordinateListElement . + + _:C01_NOA1_SignalConveyingFunction-19_0_1_coordinate a graphic:Position; + graphic:x 7.5E2; + graphic:y 4.02E2 . + + _:C01_NOA1_SignalConveyingFunction-19_0_1_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-19_0_1_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-19_0_2_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-19_0_2_coordinate a graphic:Position; + graphic:x 6.55E2; + graphic:y 4.02E2 . + + _:C01_NOA1_SignalConveyingFunction-19_0_2_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-19_0_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-19_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-19_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-19_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-1_0_0_coordinate a graphic:Position; + graphic:x 3.51E2; + graphic:y 5.31E2 . + + _:C01_NOA1_SignalConveyingFunction-1_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-1_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-1_0_1_coordinateListElement . + + _:C01_NOA1_SignalConveyingFunction-1_0_1_coordinate a graphic:Position; + graphic:x 3.31E2; + graphic:y 5.31E2 . + + _:C01_NOA1_SignalConveyingFunction-1_0_1_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-1_0_1_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-1_0_2_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-1_0_2_coordinate a graphic:Position; + graphic:x 3.31E2; + graphic:y 5.38E2 . + + _:C01_NOA1_SignalConveyingFunction-1_0_2_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-1_0_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-1_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-1_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-1_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-2_0_0_coordinate a graphic:Position; + graphic:x 3.36E2; + graphic:y 5.4E2 . + + _:C01_NOA1_SignalConveyingFunction-2_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-2_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-2_0_1_coordinateListElement . + + _:C01_NOA1_SignalConveyingFunction-2_0_1_coordinate a graphic:Position; + graphic:x 3.41E2; + graphic:y 5.4E2 . + + _:C01_NOA1_SignalConveyingFunction-2_0_1_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-2_0_1_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-2_0_2_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-2_0_2_coordinate a graphic:Position; + graphic:x 3.41E2; + graphic:y 5.54E2 . + + _:C01_NOA1_SignalConveyingFunction-2_0_2_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-2_0_2_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-2_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-2_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-2_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-3_0_0_coordinate a graphic:Position; + graphic:x 3.26E2; + graphic:y 5.4E2 . + + _:C01_NOA1_SignalConveyingFunction-3_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-3_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-3_0_1_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-3_0_1_coordinate a graphic:Position; + graphic:x 3.17E2; + graphic:y 5.4E2 . + + _:C01_NOA1_SignalConveyingFunction-3_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-3_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-3_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-3_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-3_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-4_0_0_coordinate a graphic:Position; + graphic:x 4.36E2; + graphic:y 3.54E2 . + + _:C01_NOA1_SignalConveyingFunction-4_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-4_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-4_0_1_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-4_0_1_coordinate a graphic:Position; + graphic:x 4.64E2; + graphic:y 3.54E2 . + + _:C01_NOA1_SignalConveyingFunction-4_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-4_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-4_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-4_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-4_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-8_0_0_coordinate a graphic:Position; + graphic:x 4.76E2; + graphic:y 3.54E2 . + + _:C01_NOA1_SignalConveyingFunction-8_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-8_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-8_0_1_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-8_0_1_coordinate a graphic:Position; + graphic:x 7.68E2; + graphic:y 3.54E2 . + + _:C01_NOA1_SignalConveyingFunction-8_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-8_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-8_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-8_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-8_0_linestroke . + + _:C01_NOA1_SignalConveyingFunction-9_0_0_coordinate a graphic:Position; + graphic:x 2.56E2; + graphic:y 4.34E2 . + + _:C01_NOA1_SignalConveyingFunction-9_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-9_0_0_coordinate; + rdf:rest _:C01_NOA1_SignalConveyingFunction-9_0_1_coordinateListLastElement . + + _:C01_NOA1_SignalConveyingFunction-9_0_1_coordinate a graphic:Position; + graphic:x 2.79E2; + graphic:y 4.34E2 . + + _:C01_NOA1_SignalConveyingFunction-9_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-9_0_1_coordinate; + rdf:rest rdf:nil . + + _:C01_NOA1_SignalConveyingFunction-9_0_linestroke a graphic:Stroke; + graphic:dasharray "none"; + graphic:width 2.5E-1 . + + _:C01_NOA1_SignalConveyingFunction-9_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-9_0_linestroke . + + _:C01_NOA1_extent a graphic:Extent; + graphic:maximumExtent _:C01_NOA1_maximumExtent; + graphic:minimumExtent _:C01_NOA1_minimumExtent . + + _:C01_NOA1_maximumExtent a graphic:Position; + graphic:x 8.41E2; + graphic:y 5.94E2 . + + _:C01_NOA1_minimumExtent a graphic:Position; + graphic:x 0.0E0; + graphic:y 0.0E0 . + + _:position_BallValve-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.22E2; + graphic:y 4.22E2 . + + _:position_BallValve-2_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 5.72E2; + graphic:y 4.29E2 . + + _:position_BallValve-3_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.26E2; + graphic:y 4.14E2 . + + _:position_BallValve-4_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 4.42E2; + graphic:y 4.42E2 . + + _:position_BlindFlange-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.7E2; + graphic:y 2.4E2 . + + _:position_ButterflyValve-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 3.9E2; + graphic:y 2.9E2 . + + _:position_CentrifugalPump-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.52E2; + graphic:y 4.22E2 . + + _:position_CheckValve-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.8E2; + graphic:y 4.22E2 . + + _:position_ControlledActuator-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 2.92E2; + graphic:y 1.6E2 . + + _:position_ControlledActuator-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.25E2; + graphic:y 4.22E2 . + + _:position_ControlledActuator-3_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.8E2; + graphic:y 2.95E2 . + + _:position_ControlledActuator-4_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 6.46E2; + graphic:y 1.92E2 . + + _:position_CustomHeatExchanger-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.82E2; + graphic:y 3.25E2 . + + _:position_CustomInlinePrimaryElement-1-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.85E2; + graphic:y 1.11E2 . + + _:position_CustomInlinePrimaryElement-1_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 3.01E2; + graphic:y 1.27E2 . + + _:position_CustomInlinePrimaryElement-2-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.69E2; + graphic:y 4.06E2 . + + _:position_CustomInlinePrimaryElement-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.6E2; + graphic:y 4.22E2 . + + _:position_CustomOperatedValve-1-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.41E2; + graphic:y 4.06E2 . + + _:position_CustomOperatedValve-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.25E2; + graphic:y 4.22E2 . + + _:position_CustomPipingComponent-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 3.9E2; + graphic:y 2.63E2 . + + _:position_CustomPipingComponent-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.32E2; + graphic:y 4.4E2 . + + _:position_ElectricHeater-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.51E2; + graphic:y 6.3E1 . + + _:position_Flange-10_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 3.61E2; + graphic:y 5.3E1 . + + _:position_Flange-11_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.38E2; + graphic:y 4.22E2 . + + _:position_Flange-12_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 7.14E2; + graphic:y 3.37E2 . + + _:position_Flange-13_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 6.62E2; + graphic:y 3.11E2 . + + _:position_Flange-14_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 4.0E2; + graphic:y 1.57E2 . + + _:position_Flange-15_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.64E2; + graphic:y 4.14E2 . + + _:position_Flange-16_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.1E2; + graphic:y 2.15E2 . + + _:position_Flange-17_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 6.46E2; + graphic:y 3.37E2 . + + _:position_Flange-18_position graphic:rotation 9.0E1; + graphic:x 6.46E2; + graphic:y 3.11E2; + a graphic:Position . + + _:position_Flange-19_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.1E2; + graphic:y 1.8E2 . + + _:position_Flange-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.1E2; + graphic:y 2.4E2 . + + _:position_Flange-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.45E2; + graphic:y 2.38E2 . + + _:position_Flange-3_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.71E2; + graphic:y 2.3E2 . + + _:position_Flange-4_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.3E2; + graphic:y 2.3E2 . + + _:position_Flange-5_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.3E2; + graphic:y 2.14E2 . + + _:position_Flange-6_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.72E2; + graphic:y 2.3E2 . + + _:position_Flange-7_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.72E2; + graphic:y 2.14E2 . + + _:position_Flange-8_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 3.8E2; + graphic:y 1.57E2 . + + _:position_Flange-9_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 3.61E2; + graphic:y 7.1E1 . + + _:position_FlowInPipeOffPageConnector-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.1E1; + graphic:y 2.38E2 . + + _:position_FlowOutPipeOffPageConnector-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.88E2; + graphic:y 4.14E2 . + + _:position_FlowOutSignalOffPageConnector-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.88E2; + graphic:y 2.4E2 . + + _:position_GateValve-1-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.76E2; + graphic:y 1.44E2 . + + _:position_GateValve-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 2.92E2; + graphic:y 1.6E2 . + + _:position_GateValve-2-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.96E2; + graphic:y 2.79E2 . + + _:position_GateValve-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.8E2; + graphic:y 2.95E2 . + + _:position_GateValve-3_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 6.07E2; + graphic:y 4.0E2 . + + _:position_GateValve-4_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 7.5E2; + graphic:y 3.96E2 . + + _:position_GateValve-5-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.62E2; + graphic:y 1.76E2 . + + _:position_GateValve-5_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 6.46E2; + graphic:y 1.92E2 . + + _:position_InstrumentationNodePosition-10_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.68E2; + graphic:y 2.4E2 . + + _:position_InstrumentationNodePosition-11_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.64E2; + graphic:y 2.4E2 . + + _:position_InstrumentationNodePosition-12_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.76E2; + graphic:y 2.4E2 . + + _:position_InstrumentationNodePosition-13_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.56E2; + graphic:y 1.6E2 . + + _:position_InstrumentationNodePosition-14_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.79E2; + graphic:y 1.6E2 . + + _:position_InstrumentationNodePosition-15_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.01E2; + graphic:y 1.01E2 . + + _:position_InstrumentationNodePosition-16_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.01E2; + graphic:y 9.3E1 . + + _:position_InstrumentationNodePosition-17_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.13E2; + graphic:y 3.82E2 . + + _:position_InstrumentationNodePosition-18_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.25E2; + graphic:y 3.71E2 . + + _:position_InstrumentationNodePosition-19_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.41E2; + graphic:y 3.71E2 . + + _:position_InstrumentationNodePosition-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.51E2; + graphic:y 6.3E1 . + + _:position_InstrumentationNodePosition-20_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.25E2; + graphic:y 4.09E2 . + + _:position_InstrumentationNodePosition-21_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.25E2; + graphic:y 4.09E2 . + + _:position_InstrumentationNodePosition-22_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.25E2; + graphic:y 4.09E2 . + + _:position_InstrumentationNodePosition-23_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.8E2; + graphic:y 1.33E2 . + + _:position_InstrumentationNodePosition-24_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.74E2; + graphic:y 1.27E2 . + + _:position_InstrumentationNodePosition-25_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.8E2; + graphic:y 2.82E2 . + + _:position_InstrumentationNodePosition-26_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.0E2; + graphic:y 1.57E2 . + + _:position_InstrumentationNodePosition-27_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.0E2; + graphic:y 1.33E2 . + + _:position_InstrumentationNodePosition-28_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.06E2; + graphic:y 1.27E2 . + + _:position_InstrumentationNodePosition-29_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.07E2; + graphic:y 3.96E2 . + + _:position_InstrumentationNodePosition-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.31E2; + graphic:y 5.6E1 . + + _:position_InstrumentationNodePosition-30_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 3.92E2 . + + _:position_InstrumentationNodePosition-31_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.07E2; + graphic:y 3.78E2 . + + _:position_InstrumentationNodePosition-32_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 3.78E2 . + + _:position_InstrumentationNodePosition-33_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 3.66E2 . + + _:position_InstrumentationNodePosition-34_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.55E2; + graphic:y 1.92E2 . + + _:position_InstrumentationNodePosition-35_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 3.41E2 . + + _:position_InstrumentationNodePosition-36_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 3.53E2 . + + _:position_InstrumentationNodePosition-37_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.01E2; + graphic:y 1.26000165805E2 . + + _:position_InstrumentationNodePosition-38_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.01E2; + graphic:y 1.1300034572200002E2 . + + _:position_InstrumentationNodePosition-3_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.26E2; + graphic:y 5.4E1 . + + _:position_InstrumentationNodePosition-4_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.36E2; + graphic:y 5.4E1 . + + _:position_InstrumentationNodePosition-5_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.41E2; + graphic:y 4.0E1 . + + _:position_InstrumentationNodePosition-6_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.17E2; + graphic:y 5.4E1 . + + _:position_InstrumentationNodePosition-7_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.12E2; + graphic:y 2.4E2 . + + _:position_InstrumentationNodePosition-8_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.24E2; + graphic:y 2.4E2 . + + _:position_InstrumentationNodePosition-9_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.36E2; + graphic:y 2.4E2 . + + _:position_Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 0.0E0; + graphic:y 0.0E0 . + + _:position_Nozzle-10_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 3.8E2; + graphic:y 1.63E2 . + + _:position_Nozzle-11_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 3.9E2; + graphic:y 2.57E2 . + + _:position_Nozzle-12_position a graphic:Position; + graphic:rotation 1.8E2; + graphic:x 3.74E2; + graphic:y 2.4E2 . + + _:position_Nozzle-13_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.06E2; + graphic:y 2.4E2 . + + _:position_Nozzle-14_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.06E2; + graphic:y 2.15E2 . + + _:position_Nozzle-15_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.06E2; + graphic:y 1.8E2 . + + _:position_Nozzle-16_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 4.0E2; + graphic:y 1.63E2 . + + _:position_Nozzle-17_position a graphic:Position; + graphic:rotation 1.8E2; + graphic:x 3.74E2; + graphic:y 2.12E2 . + + _:position_Nozzle-18_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.52E2; + graphic:y 4.22E2 . + + _:position_Nozzle-19_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.52E2; + graphic:y 4.14E2 . + + _:position_Nozzle-1_position a graphic:Position; + graphic:rotation 1.8E2; + graphic:x 1.51E2; + graphic:y 2.38E2 . + + _:position_Nozzle-20_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 6.46E2; + graphic:y 3.33E2 . + + _:position_Nozzle-21_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 6.46E2; + graphic:y 3.17E2 . + + _:position_Nozzle-22_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 6.62E2; + graphic:y 3.17E2 . + + _:position_Nozzle-23_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 7.14E2; + graphic:y 3.33E2 . + + _:position_Nozzle-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.59E2; + graphic:y 2.3E2 . + + _:position_Nozzle-3_position a graphic:Position; + graphic:rotation 1.8E2; + graphic:x 2.36E2; + graphic:y 2.3E2 . + + _:position_Nozzle-4_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.68E2; + graphic:y 2.14E2 . + + _:position_Nozzle-5_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.68E2; + graphic:y 2.3E2 . + + _:position_Nozzle-6_position a graphic:Position; + graphic:rotation 1.8E2; + graphic:x 2.36E2; + graphic:y 2.14E2 . + + _:position_Nozzle-8_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 3.61E2; + graphic:y 5.9E1 . + + _:position_Nozzle-9_position a graphic:Position; + graphic:rotation 9.0E1; + graphic:x 3.61E2; + graphic:y 6.7E1 . + + _:position_PipeReducer-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.0E2; + graphic:y 4.22E2 . + + _:position_PipeSlopeSymbol-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.6E2; + graphic:y 2.12E2 . + + _:position_PipingNetworkSystem-10-Label-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 3.87E2; + graphic:y 3.43E2 . + + _:position_PipingNetworkSystem-12-Label-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 7.11E2; + graphic:y 3.78E2 . + + _:position_PipingNetworkSystem-13-Label-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 7.29E2; + graphic:y 3.79E2 . + + _:position_PipingNetworkSystem-14-Label-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 7.29E2; + graphic:y 4.68E2 . + + _:position_PipingNetworkSystem-16-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.78E2; + graphic:y 4.1E2 . + + _:position_PipingNetworkSystem-17-Label-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 5.84E2; + graphic:y 3.56E2 . + + _:position_PipingNetworkSystem-18-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.15E2; + graphic:y 2.11E2 . + + _:position_PipingNetworkSystem-19-Label-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 6.43E2; + graphic:y 3.77E2 . + + _:position_PipingNetworkSystem-20-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.18E2; + graphic:y 1.76E2 . + + _:position_PipingNetworkSystem-3-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.11E2; + graphic:y 2.35E2 . + + _:position_PipingNetworkSystem-4-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.99E2; + graphic:y 2.27E2 . + + _:position_PipingNetworkSystem-5-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.04E2; + graphic:y 2.11E2 . + + _:position_PipingNetworkSystem-6-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.06E2; + graphic:y 2.27E2 . + + _:position_PipingNetworkSystem-7-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.28E2; + graphic:y 1.24E2 . + + _:position_PipingNetworkSystem-8-Label-1_position a graphic:Position; + graphic:rotation 2.7E2; + graphic:x 3.58E2; + graphic:y 1.01E2 . + + _:position_PipingNetworkSystem-9-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.43E2; + graphic:y 3.3E1 . + + _:position_PipingNode-100_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.72E2; + graphic:y 2.3E2 . + + _:position_PipingNode-101_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.32E2; + graphic:y 2.14E2 . + + _:position_PipingNode-102_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.61E2; + graphic:y 5.5E1 . + + _:position_PipingNode-103_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.61E2; + graphic:y 7.1E1 . + + _:position_PipingNode-104_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.8E2; + graphic:y 1.59E2 . + + _:position_PipingNode-105_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.9E2; + graphic:y 2.61E2 . + + _:position_PipingNode-106_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.7E2; + graphic:y 2.4E2 . + + _:position_PipingNode-107_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.1E2; + graphic:y 2.4E2 . + + _:position_PipingNode-108_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.1E2; + graphic:y 2.15E2 . + + _:position_PipingNode-109_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.1E2; + graphic:y 1.8E2 . + + _:position_PipingNode-10_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.32E2; + graphic:y 2.3E2 . + + _:position_PipingNode-110_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.0E2; + graphic:y 1.59E2 . + + _:position_PipingNode-111_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.4E2; + graphic:y 4.22E2 . + + _:position_PipingNode-112_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.64E2; + graphic:y 4.14E2 . + + _:position_PipingNode-113_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 3.37E2 . + + _:position_PipingNode-114_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 3.13E2 . + + _:position_PipingNode-115_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.62E2; + graphic:y 3.13E2 . + + _:position_PipingNode-116_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.14E2; + graphic:y 3.37E2 . + + _:position_PipingNode-117_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.42E2; + graphic:y 4.22E2 . + + _:position_PipingNode-118_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.42E2; + graphic:y 4.22E2 . + + _:position_PipingNode-119_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.42E2; + graphic:y 4.22E2 . + + _:position_PipingNode-11_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.3E2; + graphic:y 2.14E2 . + + _:position_PipingNode-120_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.42E2; + graphic:y 4.38E2 . + + _:position_PipingNode-121_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.42E2; + graphic:y 4.46E2 . + + _:position_PipingNode-12_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.32E2; + graphic:y 2.14E2 . + + _:position_PipingNode-13_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.72E2; + graphic:y 2.3E2 . + + _:position_PipingNode-14_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.74E2; + graphic:y 2.3E2 . + + _:position_PipingNode-15_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.92E2; + graphic:y 1.64E2 . + + _:position_PipingNode-16_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.92E2; + graphic:y 1.56E2 . + + _:position_PipingNode-17_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.01E2; + graphic:y 1.27E2 . + + _:position_PipingNode-18_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.01E2; + graphic:y 1.27E2 . + + _:position_PipingNode-19_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.61E2; + graphic:y 1.27E2 . + + _:position_PipingNode-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.7E2; + graphic:y 2.4E2 . + + _:position_PipingNode-20_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.61E2; + graphic:y 1.27E2 . + + _:position_PipingNode-21_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.61E2; + graphic:y 1.27E2 . + + _:position_PipingNode-22_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.72E2; + graphic:y 2.14E2 . + + _:position_PipingNode-23_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.74E2; + graphic:y 2.14E2 . + + _:position_PipingNode-24_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.8E2; + graphic:y 1.57E2 . + + _:position_PipingNode-25_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.8E2; + graphic:y 1.59E2 . + + _:position_PipingNode-26_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.61E2; + graphic:y 7.3E1 . + + _:position_PipingNode-27_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.61E2; + graphic:y 7.1E1 . + + _:position_PipingNode-28_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.61E2; + graphic:y 5.5E1 . + + _:position_PipingNode-29_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.61E2; + graphic:y 5.3E1 . + + _:position_PipingNode-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.1E2; + graphic:y 2.4E2 . + + _:position_PipingNode-30_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.9E2; + graphic:y 2.61E2 . + + _:position_PipingNode-31_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.9E2; + graphic:y 2.65E2 . + + _:position_PipingNode-32_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.9E2; + graphic:y 2.86E2 . + + _:position_PipingNode-33_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.9E2; + graphic:y 2.94E2 . + + _:position_PipingNode-34_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.21E2; + graphic:y 4.22E2 . + + _:position_PipingNode-35_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.29E2; + graphic:y 4.22E2 . + + _:position_PipingNode-36_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.54E2; + graphic:y 4.22E2 . + + _:position_PipingNode-37_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.66E2; + graphic:y 4.22E2 . + + _:position_PipingNode-38_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.76E2; + graphic:y 4.22E2 . + + _:position_PipingNode-39_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.84E2; + graphic:y 4.22E2 . + + _:position_PipingNode-3_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.12E2; + graphic:y 2.4E2 . + + _:position_PipingNode-40_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.98E2; + graphic:y 4.22E2 . + + _:position_PipingNode-41_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.02E2; + graphic:y 4.22E2 . + + _:position_PipingNode-42_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.02E2; + graphic:y 4.22E2 . + + _:position_PipingNode-43_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.02E2; + graphic:y 4.22E2 . + + _:position_PipingNode-44_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.18E2; + graphic:y 4.22E2 . + + _:position_PipingNode-45_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.26E2; + graphic:y 4.22E2 . + + _:position_PipingNode-46_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.38E2; + graphic:y 4.22E2 . + + _:position_PipingNode-47_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.4E2; + graphic:y 4.22E2 . + + _:position_PipingNode-48_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.14E2; + graphic:y 3.39E2 . + + _:position_PipingNode-49_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.14E2; + graphic:y 3.37E2 . + + _:position_PipingNode-4_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 8.5E1; + graphic:y 2.38E2 . + + _:position_PipingNode-50_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.62E2; + graphic:y 3.13E2 . + + _:position_PipingNode-51_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.62E2; + graphic:y 3.11E2 . + + _:position_PipingNode-52_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.76E2; + graphic:y 2.95E2 . + + _:position_PipingNode-53_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.84E2; + graphic:y 2.95E2 . + + _:position_PipingNode-54_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.32E2; + graphic:y 4.36E2 . + + _:position_PipingNode-55_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.32E2; + graphic:y 4.45E2 . + + _:position_PipingNode-56_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.0E2; + graphic:y 1.59E2 . + + _:position_PipingNode-57_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.0E2; + graphic:y 1.57E2 . + + _:position_PipingNode-58_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.64E2; + graphic:y 4.14E2 . + + _:position_PipingNode-59_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.66E2; + graphic:y 4.14E2 . + + _:position_PipingNode-5_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.45E2; + graphic:y 2.38E2 . + + _:position_PipingNode-60_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.72E2; + graphic:y 4.14E2 . + + _:position_PipingNode-61_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.72E2; + graphic:y 4.14E2 . + + _:position_PipingNode-62_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.72E2; + graphic:y 4.14E2 . + + _:position_PipingNode-63_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.72E2; + graphic:y 4.25E2 . + + _:position_PipingNode-64_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.72E2; + graphic:y 4.33E2 . + + _:position_PipingNode-65_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.87E2; + graphic:y 4.14E2 . + + _:position_PipingNode-66_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.87E2; + graphic:y 4.14E2 . + + _:position_PipingNode-67_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.87E2; + graphic:y 4.14E2 . + + _:position_PipingNode-68_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.07E2; + graphic:y 4.14E2 . + + _:position_PipingNode-69_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.07E2; + graphic:y 4.14E2 . + + _:position_PipingNode-6_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.47E2; + graphic:y 2.38E2 . + + _:position_PipingNode-70_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.07E2; + graphic:y 4.14E2 . + + _:position_PipingNode-71_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.07E2; + graphic:y 4.04E2 . + + _:position_PipingNode-72_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.22E2; + graphic:y 4.14E2 . + + _:position_PipingNode-73_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.3E2; + graphic:y 4.14E2 . + + _:position_PipingNode-74_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 4.14E2 . + + _:position_PipingNode-75_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 4.14E2 . + + _:position_PipingNode-76_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 4.14E2 . + + _:position_PipingNode-77_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 4.14E2 . + + _:position_PipingNode-78_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 4.14E2 . + + _:position_PipingNode-79_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 4.14E2 . + + _:position_PipingNode-7_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.71E2; + graphic:y 2.3E2 . + + _:position_PipingNode-80_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 4.0E2 . + + _:position_PipingNode-81_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.68E2; + graphic:y 4.14E2 . + + _:position_PipingNode-82_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.87E2; + graphic:y 2.19E2 . + + _:position_PipingNode-83_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.83E2; + graphic:y 2.15E2 . + + _:position_PipingNode-84_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.83E2; + graphic:y 2.15E2 . + + _:position_PipingNode-85_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.83E2; + graphic:y 2.15E2 . + + _:position_PipingNode-86_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.12E2; + graphic:y 2.15E2 . + + _:position_PipingNode-87_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.1E2; + graphic:y 2.15E2 . + + _:position_PipingNode-88_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 3.39E2 . + + _:position_PipingNode-89_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 3.37E2 . + + _:position_PipingNode-8_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.73E2; + graphic:y 2.3E2 . + + _:position_PipingNode-90_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 3.13E2 . + + _:position_PipingNode-91_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 3.11E2 . + + _:position_PipingNode-92_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 1.96E2 . + + _:position_PipingNode-93_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.46E2; + graphic:y 1.88E2 . + + _:position_PipingNode-94_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.12E2; + graphic:y 1.8E2 . + + _:position_PipingNode-95_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.1E2; + graphic:y 1.8E2 . + + _:position_PipingNode-96_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.47E2; + graphic:y 2.38E2 . + + _:position_PipingNode-97_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.71E2; + graphic:y 2.3E2 . + + _:position_PipingNode-98_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.32E2; + graphic:y 2.3E2 . + + _:position_PipingNode-99_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.72E2; + graphic:y 2.14E2 . + + _:position_PipingNode-9_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.3E2; + graphic:y 2.3E2 . + + _:position_PlateHeatExchanger-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.52E2; + graphic:y 2.22E2 . + + _:position_PressureVessel-1-Label-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.08E2; + graphic:y 2.54E2 . + + _:position_PressureVessel-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.9E2; + graphic:y 2.1E2 . + + _:position_ProcessInstrumentationFunction-10_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.01E2; + graphic:y 1.07E2 . + + _:position_ProcessInstrumentationFunction-11_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.01E2; + graphic:y 8.7E1 . + + _:position_ProcessInstrumentationFunction-12_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.07E2; + graphic:y 3.82E2 . + + _:position_ProcessInstrumentationFunction-13_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.25E2; + graphic:y 3.57E2 . + + _:position_ProcessInstrumentationFunction-14_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.41E2; + graphic:y 3.57E2 . + + _:position_ProcessInstrumentationFunction-15_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.8E2; + graphic:y 1.27E2 . + + _:position_ProcessInstrumentationFunction-16_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.0E2; + graphic:y 1.27E2 . + + _:position_ProcessInstrumentationFunction-17_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 6.07E2; + graphic:y 3.72E2 . + + _:position_ProcessInstrumentationFunction-18_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 3.72E2 . + + _:position_ProcessInstrumentationFunction-19_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 7.5E2; + graphic:y 3.47E2 . + + _:position_ProcessInstrumentationFunction-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.31E2; + graphic:y 5.4E1 . + + _:position_ProcessInstrumentationFunction-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.41E2; + graphic:y 2.6E1 . + + _:position_ProcessInstrumentationFunction-3_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 3.11E2; + graphic:y 5.4E1 . + + _:position_ProcessInstrumentationFunction-4_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.3E2; + graphic:y 2.4E2 . + + _:position_ProcessInstrumentationFunction-5_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.7E2; + graphic:y 2.4E2 . + + _:position_ProcessInstrumentationFunction-6_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.7E2; + graphic:y 2.48E2 . + + _:position_ProcessInstrumentationFunction-7_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.7E2; + graphic:y 2.5E2 . + + _:position_ProcessInstrumentationFunction-8_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 4.7E2; + graphic:y 2.34E2 . + + _:position_ProcessInstrumentationFunction-9_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 2.5E2; + graphic:y 1.6E2 . + + _:position_PropertyBreak-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.02E2; + graphic:y 4.22E2 . + + _:position_PropertyBreak-2_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.62E2; + graphic:y 2.05E2 . + + _:position_RotaryPump-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 1.59E2; + graphic:y 2.38E2 . + + _:position_SafetyValveOrFitting-1-Label-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.95E2; + graphic:y 2.01E2 . + + _:position_SafetyValveOrFitting-1_position a graphic:Position; + graphic:rotation 0.0E0; + graphic:x 5.87E2; + graphic:y 2.15E2 . + + a graphic:PID; + graphic:visualisedAs . + + asset:BallValve-1-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-12_1_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-12_1_linestyle . + + asset:BallValve-3-node2-connector graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-22_1_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-22_1_linestyle; + a graphic:Line . + + asset:ButterflyValve-1-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-11_1_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-11_1_linestyle . + + asset:CheckValve-1-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-30_2_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-30_2_linestyle . + + asset:ControlledActuator-1-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-9_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-9_0_linestyle . + + asset:ControlledActuator-2-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-13_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-13_0_linestyle . + + asset:ControlledActuator-2-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-14_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-14_0_linestyle . + + asset:ControlledActuator-2-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-15_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-15_0_linestyle . + + asset:ControlledActuator-3-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-16_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-16_0_linestyle . + + asset:ControlledActuator-4-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-19_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-19_0_linestyle . + + asset:CustomInlinePrimaryElement-1-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-7_2_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-7_2_linestyle . + + asset:CustomInlinePrimaryElement-1-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-2_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-2_0_linestyle . + + asset:CustomInlinePrimaryElement-2-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-30_1_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-30_1_linestyle . + + asset:CustomOperatedValve-1-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-11_2_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-11_2_linestyle . + + asset:CustomPipingComponent-1-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-11_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-11_0_linestyle . + + asset:CustomPipingComponent-2-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-14_1_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-14_1_linestyle . + + asset:ElectricHeater-1-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-1_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-1_0_linestyle . + + asset:Flange-1-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-1_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-1_0_linestyle . + + asset:Flange-13-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-14_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-14_0_linestyle . + + asset:Flange-14-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-3_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-3_0_linestyle . + + asset:Flange-15-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-17_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-17_0_linestyle . + + asset:Flange-18-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-29_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-29_0_linestyle . + + asset:Flange-3-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-4_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-4_0_linestyle . + + asset:Flange-7-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-7_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-7_0_linestyle . + + asset:FlowInPipeOffPageConnector-1-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-3_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-3_0_linestyle . + + asset:FlowOutPipeOffPageConnector-1-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-25_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-25_0_linestyle . + + asset:FlowOutSignalOffPageConnector-1-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-8_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-8_0_linestyle . + + asset:GateValve-1-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-7_1_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-7_1_linestyle . + + asset:GateValve-3-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-4_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-4_0_linestyle . + + asset:GateValve-4-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-5_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-5_0_linestyle . + + asset:GateValve-5-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-29_1_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-29_1_linestyle . + + asset:Nozzle-23-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-13_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-13_0_linestyle . + + asset:Nozzle-5-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-6_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-6_0_linestyle . + + asset:PipeTee-1-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-8_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-8_0_linestyle . + + asset:PipeTee-1-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-9_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-9_0_linestyle . + + asset:PipeTee-2-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-19_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-19_0_linestyle . + + asset:PipeTee-2-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-18_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-18_0_linestyle . + + asset:PipeTee-3-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-20_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-20_0_linestyle . + + asset:PipeTee-3-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-26_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-26_0_linestyle . + + asset:PipeTee-4-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-22_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-22_0_linestyle . + + asset:PipeTee-4-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-21_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-21_0_linestyle . + + asset:PipeTee-5-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-23_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-23_0_linestyle . + + asset:PipeTee-5-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-28_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-28_0_linestyle . + + asset:PipeTee-6-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-25_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-25_0_linestyle . + + asset:PipeTee-6-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-24_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-24_0_linestyle . + + asset:PipeTee-7-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-30_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-30_0_linestyle . + + asset:PipeTee-7-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-31_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-31_0_linestyle . + + asset:ProcessInstrumentationFunction-1-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-1_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-1_0_linestyle . + + asset:ProcessInstrumentationFunction-1-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-3_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-3_0_linestyle . + + asset:ProcessInstrumentationFunction-1-node3-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-2_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-2_0_linestyle . + + asset:ProcessInstrumentationFunction-10-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-10_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-10_0_linestyle . + + asset:ProcessInstrumentationFunction-10-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-2_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-2_0_linestyle . + + asset:ProcessInstrumentationFunction-11-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-10_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-10_0_linestyle . + + asset:ProcessInstrumentationFunction-12-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-13_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-13_0_linestyle . + + asset:ProcessInstrumentationFunction-13-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-14_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-14_0_linestyle . + + asset:ProcessInstrumentationFunction-14-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-15_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-15_0_linestyle . + + asset:ProcessInstrumentationFunction-15-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-16_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-16_0_linestyle . + + asset:ProcessInstrumentationFunction-15-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-17_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-17_0_linestyle . + + asset:ProcessInstrumentationFunction-16-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-3_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-3_0_linestyle . + + asset:ProcessInstrumentationFunction-16-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-17_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-17_0_linestyle . + + asset:ProcessInstrumentationFunction-17-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-4_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-4_0_linestyle . + + asset:ProcessInstrumentationFunction-18-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-5_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-5_0_linestyle . + + asset:ProcessInstrumentationFunction-18-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-18_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-18_0_linestyle . + + asset:ProcessInstrumentationFunction-19-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-19_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-19_0_linestyle . + + asset:ProcessInstrumentationFunction-19-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-18_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-18_0_linestyle . + + asset:ProcessInstrumentationFunction-2-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-2_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-2_0_linestyle . + + asset:ProcessInstrumentationFunction-3-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-3_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-3_0_linestyle . + + asset:ProcessInstrumentationFunction-4-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-1_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-1_0_linestyle . + + asset:ProcessInstrumentationFunction-4-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-4_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-4_0_linestyle . + + asset:ProcessInstrumentationFunction-5-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-4_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-4_0_linestyle . + + asset:ProcessInstrumentationFunction-5-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-8_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-8_0_linestyle . + + asset:ProcessInstrumentationFunction-9-node1-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-9_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-9_0_linestyle . + + asset:PropertyBreak-1-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-12_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-12_0_linestyle . + + asset:PropertyBreak-2-node2-connector a graphic:Line; + graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-27_0_0_coordinateListFirstElement; + graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-27_0_linestyle . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_BallValve-1_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_BallValve-2_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_BallValve-3_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_BallValve-4_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_BlindFlange-1_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_ButterflyValve-1_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_CentrifugalPump-1_position; + rdfs:label "D-20PA002" . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_CheckValve-1_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_CustomHeatExchanger-1_position; + rdfs:label "D-20HA002" . + + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_CustomInlinePrimaryElement-1_position . + + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_CustomInlinePrimaryElement-2_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_CustomOperatedValve-1_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_CustomPipingComponent-1_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_CustomPipingComponent-2_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_ElectricHeater-1_position; + rdfs:label "D-20FE001" . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-1_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-10_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-11_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-12_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-13_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-14_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-15_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-16_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-17_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-18_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-19_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-2_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-3_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-4_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-5_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-6_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-7_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-8_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_Flange-9_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_GateValve-1_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_GateValve-2_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_GateValve-3_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_GateValve-4_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_GateValve-5_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_PipeReducer-1_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_PlateHeatExchanger-1_position; + rdfs:label "D-20HA001" . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_PressureVessel-1_position; + rdfs:label "D-20VA001" . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_PropertyBreak-1_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_PropertyBreak-2_position . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_RotaryPump-1_position; + rdfs:label "D-20PA001" . + + a graphic:Symbol; + graphic:hasGraphics ; + graphic:hasPosition _:position_SafetyValveOrFitting-1_position . + + a graphic:Diagram; + graphic:hasExtent _:C01_NOA1_extent; + graphic:hasLine asset:BallValve-1-node2-connector, asset:BallValve-3-node2-connector, + asset:ButterflyValve-1-node2-connector, asset:CheckValve-1-node2-connector, asset:ControlledActuator-1-node1-connector, + asset:ControlledActuator-2-node1-connector, asset:ControlledActuator-2-node2-connector, + asset:ControlledActuator-2-node3-connector, asset:ControlledActuator-3-node1-connector, + asset:ControlledActuator-4-node1-connector, asset:CustomInlinePrimaryElement-1-node2-connector, + asset:CustomInlinePrimaryElement-1-node3-connector, asset:CustomInlinePrimaryElement-2-node2-connector, + asset:CustomOperatedValve-1-node2-connector, asset:CustomPipingComponent-1-node2-connector, + asset:CustomPipingComponent-2-node1-connector, asset:ElectricHeater-1-node1-connector, + asset:Flange-1-node3-connector, asset:Flange-13-node2-connector, asset:Flange-14-node3-connector, + asset:Flange-15-node2-connector, asset:Flange-18-node2-connector, asset:Flange-3-node2-connector, + asset:Flange-7-node2-connector, asset:FlowInPipeOffPageConnector-1-node1-connector, + asset:FlowOutPipeOffPageConnector-1-node1-connector, asset:FlowOutSignalOffPageConnector-1-node1-connector, + asset:GateValve-1-node2-connector, asset:GateValve-3-node2-connector, asset:GateValve-4-node2-connector, + asset:GateValve-5-node2-connector, asset:Nozzle-23-node1-connector, asset:Nozzle-5-node1-connector, + asset:PipeTee-1-node2-connector, asset:PipeTee-1-node3-connector, asset:PipeTee-2-node2-connector, + asset:PipeTee-2-node3-connector, asset:PipeTee-3-node2-connector, asset:PipeTee-3-node3-connector, + asset:PipeTee-4-node2-connector, asset:PipeTee-4-node3-connector, asset:PipeTee-5-node2-connector, + asset:PipeTee-5-node3-connector, asset:PipeTee-6-node2-connector, asset:PipeTee-6-node3-connector, + asset:PipeTee-7-node2-connector, asset:PipeTee-7-node3-connector, asset:ProcessInstrumentationFunction-1-node1-connector, + asset:ProcessInstrumentationFunction-1-node2-connector, asset:ProcessInstrumentationFunction-1-node3-connector, + asset:ProcessInstrumentationFunction-10-node1-connector, asset:ProcessInstrumentationFunction-10-node2-connector, + asset:ProcessInstrumentationFunction-11-node1-connector, asset:ProcessInstrumentationFunction-12-node1-connector, + asset:ProcessInstrumentationFunction-13-node1-connector, asset:ProcessInstrumentationFunction-14-node1-connector, + asset:ProcessInstrumentationFunction-15-node1-connector, asset:ProcessInstrumentationFunction-15-node2-connector, + asset:ProcessInstrumentationFunction-16-node1-connector, asset:ProcessInstrumentationFunction-16-node2-connector, + asset:ProcessInstrumentationFunction-17-node1-connector, asset:ProcessInstrumentationFunction-18-node1-connector, + asset:ProcessInstrumentationFunction-18-node2-connector, asset:ProcessInstrumentationFunction-19-node1-connector, + asset:ProcessInstrumentationFunction-19-node2-connector, asset:ProcessInstrumentationFunction-2-node1-connector, + asset:ProcessInstrumentationFunction-3-node1-connector, asset:ProcessInstrumentationFunction-4-node1-connector, + asset:ProcessInstrumentationFunction-4-node2-connector, asset:ProcessInstrumentationFunction-5-node1-connector, + asset:ProcessInstrumentationFunction-5-node2-connector, asset:ProcessInstrumentationFunction-9-node1-connector, + asset:PropertyBreak-1-node2-connector, asset:PropertyBreak-2-node2-connector; + graphic:hasSymbol , + , , + , , + , , + , , + , + , + , , + , , + , , + , , + , , + , , + , , + , , + , , + , , + , , + , , + , , + , , + , , + , , + , , + . +} From d7b5f90b25be0737fd1d4abe9c985421f0f25b6e Mon Sep 17 00:00:00 2001 From: "henriette.rebnor" Date: Thu, 30 Jan 2025 13:06:57 +0100 Subject: [PATCH 35/50] minor fixes --- client/Boundaries/Backend/Program.cs | 3 --- client/Boundaries/Boundaries/IRdfoxApi.cs | 2 +- client/Boundaries/Boundaries/RdfoxApi.cs | 3 +-- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/client/Boundaries/Backend/Program.cs b/client/Boundaries/Backend/Program.cs index ab26a844..d7d6d7ed 100644 --- a/client/Boundaries/Backend/Program.cs +++ b/client/Boundaries/Backend/Program.cs @@ -33,9 +33,6 @@ ); app.UseHttpsRedirection(); -// Establish connection to Rdfox -var conn = RdfoxApi.GetDefaultConnectionSettings(); - // ============ BOUNDARIES ============ diff --git a/client/Boundaries/Boundaries/IRdfoxApi.cs b/client/Boundaries/Boundaries/IRdfoxApi.cs index 8a1dda77..228dd139 100644 --- a/client/Boundaries/Boundaries/IRdfoxApi.cs +++ b/client/Boundaries/Boundaries/IRdfoxApi.cs @@ -11,7 +11,7 @@ public interface IRdfoxApi public Task LoadData(string data); - public Task QuerySparql(string query); + public Task QuerySparql(string query, string acceptHeader); public Task AskSparql(string query); diff --git a/client/Boundaries/Boundaries/RdfoxApi.cs b/client/Boundaries/Boundaries/RdfoxApi.cs index 57c1e073..4a3c5571 100644 --- a/client/Boundaries/Boundaries/RdfoxApi.cs +++ b/client/Boundaries/Boundaries/RdfoxApi.cs @@ -104,7 +104,7 @@ public async Task LoadData(string data) /// /// /// - public static async Task QuerySparql(ConnectionSettings conn, string query, string acceptHeader = "application/sparql-results+json") + public async Task QuerySparql( string query, string acceptHeader = "application/sparql-results+json") { using (var client = new HttpClient()) { @@ -146,5 +146,4 @@ public async Task AskSparql(string query) return jsonResponse.RootElement.GetProperty("boolean").GetBoolean(); } } - } \ No newline at end of file From 5c0233d8f54b03d18cd2d4fe4073a37952f0e2ca Mon Sep 17 00:00:00 2001 From: Johannes Telle Date: Thu, 30 Jan 2025 13:20:38 +0100 Subject: [PATCH 36/50] Updated --- client/Boundaries/Backend/Program.cs | 94 +++++++++---------- client/Boundaries/Backend/Utils/QueryUtils.cs | 37 ++++---- client/Boundaries/Boundaries/RdfoxApi.cs | 3 +- 3 files changed, 68 insertions(+), 66 deletions(-) diff --git a/client/Boundaries/Backend/Program.cs b/client/Boundaries/Backend/Program.cs index d7d6d7ed..aceea349 100644 --- a/client/Boundaries/Backend/Program.cs +++ b/client/Boundaries/Backend/Program.cs @@ -37,29 +37,29 @@ // ============ BOUNDARIES ============ //Update boundary -app.MapPost("/commissioning-package/{packageId}/update-boundary/{nodeId}", async (string packageId, string nodeId) => +app.MapPost("/commissioning-package/{packageId}/update-boundary/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, conn)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } - var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, conn); - var isBoundary = await QueryUtils.IsBoundaryOf(packageId, nodeId, conn); + var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, rdfoxApi); + var isBoundary = await QueryUtils.IsBoundaryOf(packageId, nodeId, rdfoxApi); if (isSelectedInternal) - await QueryUtils.DeleteIsSelectedInternalOf(packageId, nodeId, conn); + await QueryUtils.DeleteIsSelectedInternalOf(packageId, nodeId, rdfoxApi); if (isBoundary) { - await QueryUtils.DeleteIsBoundaryOf(packageId, nodeId, conn); + await QueryUtils.DeleteIsBoundaryOf(packageId, nodeId, rdfoxApi); } else { - await QueryUtils.AddIsBoundaryOf(packageId, nodeId, conn); + await QueryUtils.AddIsBoundaryOf(packageId, nodeId, rdfoxApi); } return Results.Ok(); @@ -67,12 +67,12 @@ // Add node as boundary -app.MapPost("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId) => +app.MapPost("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, conn)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } @@ -87,12 +87,12 @@ // Remove node as boundary -app.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId) => +app.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, conn)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } @@ -101,7 +101,7 @@ <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> . "; - await RdfoxApi.DeleteData(conn, data); + await rdfoxApi.DeleteData(data); return Results.Ok($"Triple for package {packageId} and node {nodeId} deleted successfully."); }).WithTags("Boundary"); @@ -110,29 +110,29 @@ // ============ INTERNAL ============ //Update selected internal -app.MapPost("/commissioning-package/{packageId}/update-internal/{nodeId}", async (string packageId, string nodeId) => +app.MapPost("/commissioning-package/{packageId}/update-internal/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, conn)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } - var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, conn); - var isBoundary = await QueryUtils.IsBoundaryOf(packageId, nodeId, conn); + var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, rdfoxApi); + var isBoundary = await QueryUtils.IsBoundaryOf(packageId, nodeId, rdfoxApi); if (isBoundary) - await QueryUtils.DeleteIsBoundaryOf(packageId, nodeId, conn); + await QueryUtils.DeleteIsBoundaryOf(packageId, nodeId, rdfoxApi); if (isSelectedInternal) { - await QueryUtils.DeleteIsSelectedInternalOf(packageId, nodeId, conn); + await QueryUtils.DeleteIsSelectedInternalOf(packageId, nodeId, rdfoxApi); } else { - await QueryUtils.AddIsSelectedInternalOf(packageId, nodeId, conn); + await QueryUtils.AddIsSelectedInternalOf(packageId, nodeId, rdfoxApi); } return Results.Ok(); @@ -140,12 +140,12 @@ //Add node as internal -app.MapPost("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId) => +app.MapPost("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, conn)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } @@ -154,19 +154,19 @@ <{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> . "; - await RdfoxApi.LoadData(conn, data); + await rdfoxApi.LoadData(data); return Results.Ok($"Triple for package {packageId} and node {nodeId} inserted successfully."); }).WithTags("Internal"); // Remove node as internal -app.MapDelete("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId) => +app.MapDelete("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, conn)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } @@ -175,7 +175,7 @@ <{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> . "; - await RdfoxApi.DeleteData(conn, data); + await rdfoxApi.DeleteData(data); return Results.Ok($"Triple for package {packageId} and node {nodeId} deleted successfully."); }).WithTags("Internal"); @@ -184,13 +184,13 @@ // ============ NODES ============ //Get adjacent nodes -app.MapGet("/nodes/{nodeId}/adjacent", async (string nodeId) => +app.MapGet("/nodes/{nodeId}/adjacent", async (string nodeId, RdfoxApi rdfoxApi) => { nodeId = Uri.UnescapeDataString(nodeId); var query = $@"SELECT ?neighb WHERE {{ <{nodeId}> {PropertiesProvider.adjacentTo} ?neighb }}"; - var result = await RdfoxApi.QuerySparql(conn, query); + var result = await rdfoxApi.QuerySparql(query); var adjacentNodes = new List(); @@ -219,21 +219,21 @@ // ============ COMMISSIONING PACKAGE ============ //Add commissioning package -app.MapPost("/commissioning-package", async (CommissioningPackage commissioningPackage) => +app.MapPost("/commissioning-package", async (CommissioningPackage commissioningPackage, RdfoxApi rdfoxApi) => { var data = new StringBuilder(); data.AppendLine($@"<{commissioningPackage.Id}> {TypesProvider.type} {PropertiesProvider.CommissioningPackage} ."); data.AppendLine($@"<{commissioningPackage.Id}> {PropertiesProvider.hasName} ""{commissioningPackage.Name}"" ."); data.AppendLine($@"<{commissioningPackage.Id}> {PropertiesProvider.hasColor} ""{commissioningPackage.Color}"" ."); - await RdfoxApi.LoadData(conn, data.ToString()); + await rdfoxApi.LoadData(data.ToString()); return Results.Ok($"Commissioning package {commissioningPackage.Id} added successfully."); }).WithTags("Commissioning Package"); // Update commissioning package - updating information like name and color while persisting the calculated internal nodes, and boundaries. -app.MapPut("/commissioning-package", async (CommissioningPackage updatedPackage) => +app.MapPut("/commissioning-package", async (CommissioningPackage updatedPackage, RdfoxApi rdfoxApi) => { var getQuery = $@" SELECT ?object WHERE {{ @@ -243,7 +243,7 @@ }} "; - var result = await RdfoxApi.QuerySparql(conn, getQuery); + var result = await rdfoxApi.QuerySparql(getQuery); string oldPackageName = string.Empty; string oldPackageColor = string.Empty; @@ -264,25 +264,25 @@ <{updatedPackage.Id}> {PropertiesProvider.hasName} ""{oldPackageName}"" . "; - await RdfoxApi.DeleteData(conn, deleteData); + await rdfoxApi.DeleteData(deleteData); var data = $@" <{updatedPackage.Id}> {PropertiesProvider.hasName} ""{updatedPackage.Name}"" . <{updatedPackage.Id}> {PropertiesProvider.hasColor} ""{updatedPackage.Color}"" . "; - await RdfoxApi.LoadData(conn, data); + await rdfoxApi.LoadData(data); return Results.Ok($"Commissioning package {updatedPackage.Id} updated successfully."); }).WithTags("Commissioning Package"); //Get commissioning package -app.MapGet("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId) => +app.MapGet("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId, RdfoxApi rdfoxApi) => { commissioningPackageId = Uri.UnescapeDataString(commissioningPackageId); - if (!await QueryUtils.CommissioningPackageExists(commissioningPackageId, conn)) + if (!await QueryUtils.CommissioningPackageExists(commissioningPackageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {commissioningPackageId} not found."); } @@ -295,7 +295,7 @@ }} "; - var result = await RdfoxApi.QuerySparql(conn, query); + var result = await rdfoxApi.QuerySparql(query); CommissioningPackage commissioningPackage; @@ -317,11 +317,11 @@ //Delete commissioning package -app.MapDelete("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId) => +app.MapDelete("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId, RdfoxApi rdfoxApi) => { commissioningPackageId = Uri.UnescapeDataString(commissioningPackageId); - if (!await QueryUtils.CommissioningPackageExists(commissioningPackageId, conn)) + if (!await QueryUtils.CommissioningPackageExists(commissioningPackageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {commissioningPackageId} not found."); } @@ -331,7 +331,7 @@ {{ <{commissioningPackageId}> ?x ?y . }} }}"; - var result = await RdfoxApi.QuerySparql(conn, query); + var result = await rdfoxApi.QuerySparql(query); var deleteQueryBuilder = new StringBuilder(); @@ -355,14 +355,14 @@ } } - await RdfoxApi.DeleteData(conn, deleteQueryBuilder.ToString()); + await rdfoxApi.DeleteData(deleteQueryBuilder.ToString()); query = $@" SELECT ?x ?y WHERE {{ {{ ?y ?x <{commissioningPackageId}> . }} }}"; - result = await RdfoxApi.QuerySparql(conn, query); + result = await rdfoxApi.QuerySparql(query); deleteQueryBuilder = new StringBuilder(); using (JsonDocument docDel = JsonDocument.Parse(result)) @@ -378,7 +378,7 @@ } } - await RdfoxApi.DeleteData(conn, deleteQueryBuilder.ToString()); + await rdfoxApi.DeleteData(deleteQueryBuilder.ToString()); return Results.Ok($"Commissioning package {commissioningPackageId} deleted successfully."); @@ -386,14 +386,14 @@ //Get all commissioning packages -app.MapGet("/commissioning-package/all", async () => +app.MapGet("/commissioning-package/all", async (RdfoxApi rdfoxApi) => { var query = $@" SELECT ?packageId WHERE {{ ?packageId rdf:type {PropertiesProvider.CommissioningPackage} . }}"; - var result = await RdfoxApi.QuerySparql(conn, query); + var result = await rdfoxApi.QuerySparql(query); var jsonResponse = JsonDocument.Parse(result); var packageIds = jsonResponse.RootElement @@ -415,7 +415,7 @@ }} "; - result = await RdfoxApi.QuerySparql(conn, query); + result = await rdfoxApi.QuerySparql(query); CommissioningPackage commissioningPackage; @@ -439,14 +439,14 @@ //Get the ID of all commissioning packages -app.MapGet("/commissioning-package/ids", async () => +app.MapGet("/commissioning-package/ids", async (RdfoxApi rdfoxApi) => { var query = $@" SELECT ?packageId WHERE {{ ?packageId rdf:type {PropertiesProvider.CommissioningPackage} . }}"; - var result = await RdfoxApi.QuerySparql(conn, query); + var result = await rdfoxApi.QuerySparql(query); var jsonResponse = JsonDocument.Parse(result); var packageIds = jsonResponse.RootElement diff --git a/client/Boundaries/Backend/Utils/QueryUtils.cs b/client/Boundaries/Backend/Utils/QueryUtils.cs index 132be58b..0a0ed170 100644 --- a/client/Boundaries/Backend/Utils/QueryUtils.cs +++ b/client/Boundaries/Backend/Utils/QueryUtils.cs @@ -1,4 +1,5 @@ using Backend.Model; +using Boundaries; using System.Text.Json; using static Boundaries.RdfoxApi; @@ -8,39 +9,39 @@ public static class QueryUtils { #region Boundary actions - public static async Task IsBoundaryOf(string packageId, string nodeId, ConnectionSettings conn) - => await AskSparql(conn, $@"ASK WHERE {{ <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> .}}"); + public static async Task IsBoundaryOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + => await rdfoxApi.AskSparql($@"ASK WHERE {{ <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> .}}"); - public static async Task DeleteIsBoundaryOf(string packageId, string nodeId, ConnectionSettings conn) - => await DeleteData(conn, $@"<{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> ."); + public static async Task DeleteIsBoundaryOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + => await rdfoxApi.DeleteData($@"<{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> ."); - public static async Task AddIsBoundaryOf(string packageId, string nodeId, ConnectionSettings conn) - => await LoadData(conn, $@"<{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> ."); + public static async Task AddIsBoundaryOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + => await rdfoxApi.LoadData($@"<{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> ."); #endregion #region SelectedInternal actions - public static async Task IsSelectedInternalOf(string packageId, string nodeId, ConnectionSettings conn) - => await AskSparql(conn, $@"ASK WHERE {{ <{nodeId}> {PropertiesProvider.isSelectedInternalOf} <{packageId}> . }}"); + public static async Task IsSelectedInternalOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + => await rdfoxApi.AskSparql($@"ASK WHERE {{ <{nodeId}> {PropertiesProvider.isSelectedInternalOf} <{packageId}> . }}"); - public static async Task DeleteIsSelectedInternalOf(string packageId, string nodeId, ConnectionSettings conn) - => await DeleteData(conn, $@"<{nodeId}> {PropertiesProvider.isSelectedInternalOf} <{packageId}> ."); + public static async Task DeleteIsSelectedInternalOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + => await rdfoxApi.DeleteData($@"<{nodeId}> {PropertiesProvider.isSelectedInternalOf} <{packageId}> ."); - public static async Task AddIsSelectedInternalOf(string packageId, string nodeId, ConnectionSettings conn) - => await LoadData(conn, $@"<{nodeId}> {PropertiesProvider.isSelectedInternalOf} <{packageId}> ."); + public static async Task AddIsSelectedInternalOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + => await rdfoxApi.LoadData($@"<{nodeId}> {PropertiesProvider.isSelectedInternalOf} <{packageId}> ."); #endregion #region IsInPackage actions - public static async Task NodeIsInPackage(string packageId, string nodeId, ConnectionSettings conn) - => await AskSparql(conn, $@"ASK WHERE {{ <{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> . }}"); + public static async Task NodeIsInPackage(string packageId, string nodeId, RdfoxApi rdfoxApi) + => await rdfoxApi.AskSparql($@"ASK WHERE {{ <{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> . }}"); - public static async Task DeleteNodeFromPackage(string packageId, string nodeId, ConnectionSettings conn) - => await LoadData(conn, $"<{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> ."); + public static async Task DeleteNodeFromPackage(string packageId, string nodeId, RdfoxApi rdfoxApi) + => await rdfoxApi.LoadData($"<{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> ."); #endregion #region CommissioningPackage actions - public static async Task CommissioningPackageExists(string packageId, ConnectionSettings conn) - => await AskSparql(conn, $@"ASK WHERE {{ <{packageId}> {TypesProvider.type} {PropertiesProvider.CommissioningPackage} . }}"); + public static async Task CommissioningPackageExists(string packageId, RdfoxApi rdfoxApi) + => await rdfoxApi.AskSparql($@"ASK WHERE {{ <{packageId}> {TypesProvider.type} {PropertiesProvider.CommissioningPackage} . }}"); public static CommissioningPackage ParseCommissioningPackageQueryResult(string id, string queryResult) { diff --git a/client/Boundaries/Boundaries/RdfoxApi.cs b/client/Boundaries/Boundaries/RdfoxApi.cs index 4a3c5571..cc5643d6 100644 --- a/client/Boundaries/Boundaries/RdfoxApi.cs +++ b/client/Boundaries/Boundaries/RdfoxApi.cs @@ -1,4 +1,5 @@ using System.Text; +using System.Text.Json; namespace Boundaries; @@ -55,7 +56,7 @@ public async Task LoadDatalog(string datalog) /// /// /// - public async Task DeleteData(string data) + public async Task DeleteData(string data) { using (var client = new HttpClient()) { From 970a4f0382dc8989ea18a03410b008d321e5a221 Mon Sep 17 00:00:00 2001 From: "henriette.rebnor" Date: Thu, 30 Jan 2025 13:46:37 +0100 Subject: [PATCH 37/50] setup testfactory skeleton --- client/Boundaries/Backend/Program.cs | 4 ++ .../TestBoundaries/TestBoundaries.csproj | 6 +- .../Boundaries/TestBoundaries/TestFactory.cs | 61 +++++++++++++++++++ 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 client/Boundaries/TestBoundaries/TestFactory.cs diff --git a/client/Boundaries/Backend/Program.cs b/client/Boundaries/Backend/Program.cs index d7d6d7ed..0aee558d 100644 --- a/client/Boundaries/Backend/Program.cs +++ b/client/Boundaries/Backend/Program.cs @@ -460,3 +460,7 @@ }).WithTags("Commissioning Package"); app.Run(); + + +// Necessary for integration testing +public partial class Program { } \ No newline at end of file diff --git a/client/Boundaries/TestBoundaries/TestBoundaries.csproj b/client/Boundaries/TestBoundaries/TestBoundaries.csproj index b205ab91..bbb07287 100644 --- a/client/Boundaries/TestBoundaries/TestBoundaries.csproj +++ b/client/Boundaries/TestBoundaries/TestBoundaries.csproj @@ -10,8 +10,10 @@ - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/client/Boundaries/TestBoundaries/TestFactory.cs b/client/Boundaries/TestBoundaries/TestFactory.cs new file mode 100644 index 00000000..79e3218c --- /dev/null +++ b/client/Boundaries/TestBoundaries/TestFactory.cs @@ -0,0 +1,61 @@ +using Boundaries; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.VisualStudio.TestPlatform.TestHost; +using DotNet.Testcontainers.Containers; +using DotNet.Testcontainers.Builders; +using DotNet.Testcontainers.Configurations; + + +public class TestFactory : WebApplicationFactory, IAsyncLifetime +{ + private readonly IContainer _rdfox; + public HttpClient? Client { get; private set; } + + public TestFactory() + { + // Set up an RDFox Testcontainer + _rdfox = new ContainerBuilder() + .WithImage("bravoacr.azurecr.io/oxfordsemantic/rdfox-init:7.2a") + //TODO : copy the rdfox lic and mount properly - test it out to see how it goes :)) + // Not sure if password and username is needed? Silly values is used in the BravoTestFacory + //.WithBindMount($"{_outputFolderPath}/TestData/RDFox.lic", "/opt/RDFox/RDFox.lic", AccessMode.ReadOnly) + //.WithBindMount(_tempRdfoxDirectory, "/home/rdfox/.RDFox", AccessMode.ReadWrite) + //.WithCommand("-persistence", "file-sequence", "-request-logger", "elf", "init") + .WithPortBinding(12110, true) + .WithCleanUp(true) + .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(12110)) + .Build(); + } + + public async Task InitializeAsync() + { + await _rdfox.StartAsync(); + Client = CreateClient(); + } + + protected override void ConfigureWebHost(IWebHostBuilder builder) + { + builder.ConfigureServices(services => + { + // Remove existing IRdfoxApi registration + services.Remove(ServiceDescriptor.Singleton(typeof(RdfoxApi))); + // Register a test-specific RdfoxApi instance + services.AddSingleton(new RdfoxApi(new ConnectionSettings + { + Host = "", + Port = 12210, + Username = "", + Password = "", + Datastore = "" + })); + }); + } + + public new async Task DisposeAsync() + { + await _rdfox.DisposeAsync(); + Client?.Dispose(); + } +} From 0d57584be1d10b23498a0bb2d66f86734dd1b4c3 Mon Sep 17 00:00:00 2001 From: Johannes Telle Date: Thu, 30 Jan 2025 13:50:00 +0100 Subject: [PATCH 38/50] merge --- client/Boundaries/Boundaries/RdfoxApi.cs | 8 ++++++++ client/Boundaries/Tests/Tests.csproj | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 client/Boundaries/Tests/Tests.csproj diff --git a/client/Boundaries/Boundaries/RdfoxApi.cs b/client/Boundaries/Boundaries/RdfoxApi.cs index cc5643d6..7f42b4a3 100644 --- a/client/Boundaries/Boundaries/RdfoxApi.cs +++ b/client/Boundaries/Boundaries/RdfoxApi.cs @@ -6,6 +6,14 @@ namespace Boundaries; public class RdfoxApi(ConnectionSettings conn) : IRdfoxApi { + + //Return the CONNECTION conn that is used to connect to the RDFox server + public ConnectionSettings GetDefaultConnectionSettings() + { + return conn; + } + + /// /// curl -i -X POST localhost:12110/datastores/boundaries/content?operation=delete-content -H "Content-Type: application/x.datalog" -T boundaries.dlog /// diff --git a/client/Boundaries/Tests/Tests.csproj b/client/Boundaries/Tests/Tests.csproj new file mode 100644 index 00000000..59286f02 --- /dev/null +++ b/client/Boundaries/Tests/Tests.csproj @@ -0,0 +1,24 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + From cbf380ab14264c549b96e8cba2d6c8265625d49b Mon Sep 17 00:00:00 2001 From: "henriette.rebnor" Date: Fri, 31 Jan 2025 10:50:24 +0100 Subject: [PATCH 39/50] Switch interface, not class --- client/Boundaries/Backend/Program.cs | 46 ++++++++++--------- client/Boundaries/Backend/Utils/QueryUtils.cs | 14 +++--- .../Boundaries/Boundaries/Boundaries.csproj | 1 - client/Boundaries/Boundaries/DexpiApi.cs | 43 ----------------- client/Boundaries/Boundaries/IRdfoxApi.cs | 2 +- client/Boundaries/Boundaries/Program.cs | 36 --------------- 6 files changed, 33 insertions(+), 109 deletions(-) delete mode 100644 client/Boundaries/Boundaries/DexpiApi.cs delete mode 100644 client/Boundaries/Boundaries/Program.cs diff --git a/client/Boundaries/Backend/Program.cs b/client/Boundaries/Backend/Program.cs index 6ad0f57d..4e9a1084 100644 --- a/client/Boundaries/Backend/Program.cs +++ b/client/Boundaries/Backend/Program.cs @@ -3,6 +3,7 @@ using System.Text; using Backend.Utils; using System.Text.Json; +using Microsoft.AspNetCore.Mvc; var builder = WebApplication.CreateBuilder(args); @@ -11,16 +12,19 @@ builder.Services.AddSwaggerGen(); builder.Services.AddCors(); -var connectionSettings = new ConnectionSettings +builder.Services.AddSingleton(sp => { - Host = "localhost", - Port = 12110, - Username = "admin", - Password = "admin", - Datastore = "boundaries" -}; + var connectionSettings = new ConnectionSettings + { + Host = "rdfox", + Port = 12110, + Username = "admin", + Password = "admin", + Datastore = "boundaries" + }; -builder.Services.AddSingleton(new RdfoxApi(connectionSettings)); + return new RdfoxApi(connectionSettings); +}); var app = builder.Build(); @@ -37,7 +41,7 @@ // ============ BOUNDARIES ============ //Update boundary -app.MapPost("/commissioning-package/{packageId}/update-boundary/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => +app.MapPost("/commissioning-package/{packageId}/update-boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); @@ -67,7 +71,7 @@ // Add node as boundary -app.MapPost("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => +app.MapPost("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); @@ -87,7 +91,7 @@ // Remove node as boundary -app.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => +app.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); @@ -110,7 +114,7 @@ // ============ INTERNAL ============ //Update selected internal -app.MapPost("/commissioning-package/{packageId}/update-internal/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => +app.MapPost("/commissioning-package/{packageId}/update-internal/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); @@ -140,7 +144,7 @@ //Add node as internal -app.MapPost("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => +app.MapPost("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); @@ -161,7 +165,7 @@ // Remove node as internal -app.MapDelete("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, RdfoxApi rdfoxApi) => +app.MapDelete("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); @@ -184,7 +188,7 @@ // ============ NODES ============ //Get adjacent nodes -app.MapGet("/nodes/{nodeId}/adjacent", async (string nodeId, RdfoxApi rdfoxApi) => +app.MapGet("/nodes/{nodeId}/adjacent", async (string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { nodeId = Uri.UnescapeDataString(nodeId); @@ -219,7 +223,7 @@ // ============ COMMISSIONING PACKAGE ============ //Add commissioning package -app.MapPost("/commissioning-package", async (CommissioningPackage commissioningPackage, RdfoxApi rdfoxApi) => +app.MapPost("/commissioning-package", async (CommissioningPackage commissioningPackage, [FromServices] IRdfoxApi rdfoxApi) => { var data = new StringBuilder(); data.AppendLine($@"<{commissioningPackage.Id}> {TypesProvider.type} {PropertiesProvider.CommissioningPackage} ."); @@ -233,7 +237,7 @@ // Update commissioning package - updating information like name and color while persisting the calculated internal nodes, and boundaries. -app.MapPut("/commissioning-package", async (CommissioningPackage updatedPackage, RdfoxApi rdfoxApi) => +app.MapPut("/commissioning-package", async (CommissioningPackage updatedPackage, [FromServices] IRdfoxApi rdfoxApi) => { var getQuery = $@" SELECT ?object WHERE {{ @@ -278,7 +282,7 @@ //Get commissioning package -app.MapGet("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId, RdfoxApi rdfoxApi) => +app.MapGet("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId, [FromServices] IRdfoxApi rdfoxApi) => { commissioningPackageId = Uri.UnescapeDataString(commissioningPackageId); @@ -317,7 +321,7 @@ //Delete commissioning package -app.MapDelete("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId, RdfoxApi rdfoxApi) => +app.MapDelete("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId, [FromServices] IRdfoxApi rdfoxApi) => { commissioningPackageId = Uri.UnescapeDataString(commissioningPackageId); @@ -386,7 +390,7 @@ //Get all commissioning packages -app.MapGet("/commissioning-package/all", async (RdfoxApi rdfoxApi) => +app.MapGet("/commissioning-package/all", async ([FromServices] IRdfoxApi rdfoxApi) => { var query = $@" SELECT ?packageId WHERE {{ @@ -439,7 +443,7 @@ //Get the ID of all commissioning packages -app.MapGet("/commissioning-package/ids", async (RdfoxApi rdfoxApi) => +app.MapGet("/commissioning-package/ids", async ([FromServices] IRdfoxApi rdfoxApi) => { var query = $@" SELECT ?packageId WHERE {{ diff --git a/client/Boundaries/Backend/Utils/QueryUtils.cs b/client/Boundaries/Backend/Utils/QueryUtils.cs index 0a0ed170..e2f92936 100644 --- a/client/Boundaries/Backend/Utils/QueryUtils.cs +++ b/client/Boundaries/Backend/Utils/QueryUtils.cs @@ -9,25 +9,25 @@ public static class QueryUtils { #region Boundary actions - public static async Task IsBoundaryOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + public static async Task IsBoundaryOf(string packageId, string nodeId, IRdfoxApi rdfoxApi) => await rdfoxApi.AskSparql($@"ASK WHERE {{ <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> .}}"); - public static async Task DeleteIsBoundaryOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + public static async Task DeleteIsBoundaryOf(string packageId, string nodeId, IRdfoxApi rdfoxApi) => await rdfoxApi.DeleteData($@"<{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> ."); - public static async Task AddIsBoundaryOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + public static async Task AddIsBoundaryOf(string packageId, string nodeId, IRdfoxApi rdfoxApi) => await rdfoxApi.LoadData($@"<{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> ."); #endregion #region SelectedInternal actions - public static async Task IsSelectedInternalOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + public static async Task IsSelectedInternalOf(string packageId, string nodeId, IRdfoxApi rdfoxApi) => await rdfoxApi.AskSparql($@"ASK WHERE {{ <{nodeId}> {PropertiesProvider.isSelectedInternalOf} <{packageId}> . }}"); - public static async Task DeleteIsSelectedInternalOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + public static async Task DeleteIsSelectedInternalOf(string packageId, string nodeId, IRdfoxApi rdfoxApi) => await rdfoxApi.DeleteData($@"<{nodeId}> {PropertiesProvider.isSelectedInternalOf} <{packageId}> ."); - public static async Task AddIsSelectedInternalOf(string packageId, string nodeId, RdfoxApi rdfoxApi) + public static async Task AddIsSelectedInternalOf(string packageId, string nodeId, IRdfoxApi rdfoxApi) => await rdfoxApi.LoadData($@"<{nodeId}> {PropertiesProvider.isSelectedInternalOf} <{packageId}> ."); #endregion @@ -40,7 +40,7 @@ public static async Task DeleteNodeFromPackage(string packageId, string nodeId, #endregion #region CommissioningPackage actions - public static async Task CommissioningPackageExists(string packageId, RdfoxApi rdfoxApi) + public static async Task CommissioningPackageExists(string packageId, IRdfoxApi rdfoxApi) => await rdfoxApi.AskSparql($@"ASK WHERE {{ <{packageId}> {TypesProvider.type} {PropertiesProvider.CommissioningPackage} . }}"); public static CommissioningPackage ParseCommissioningPackageQueryResult(string id, string queryResult) diff --git a/client/Boundaries/Boundaries/Boundaries.csproj b/client/Boundaries/Boundaries/Boundaries.csproj index da63e1e5..30470bef 100644 --- a/client/Boundaries/Boundaries/Boundaries.csproj +++ b/client/Boundaries/Boundaries/Boundaries.csproj @@ -1,7 +1,6 @@  - Exe net8.0 enable enable diff --git a/client/Boundaries/Boundaries/DexpiApi.cs b/client/Boundaries/Boundaries/DexpiApi.cs deleted file mode 100644 index 23467756..00000000 --- a/client/Boundaries/Boundaries/DexpiApi.cs +++ /dev/null @@ -1,43 +0,0 @@ -using IriTools; - -namespace Boundaries; - -public static class DexpiApi -{ - public static async Task GetCommissioningPackage(string internalComponentLabel, IriReference[] borderComponentIris, string dexpiFilePath) - { - var datalogCreator = new DatalogCreator(); - var datalog = datalogCreator.CreateBoundaryDatalogRule(internalComponentLabel, borderComponentIris); - var conn = RdfoxApi.GetDefaultConnectionSettings(); - await RdfoxApi.LoadDatalog(conn, datalog); - - var data = File.ReadAllText(dexpiFilePath); - await RdfoxApi.LoadData(conn, data); - - var queryString = datalogCreator.CreateCommissioningSparqlQuery(); - var result = await RdfoxApi.QuerySparql(conn, queryString); - - await RdfoxApi.DeleteData(conn, data); - await RdfoxApi.DeleteDatalog(conn, datalog); - return result; - } - - - public static async Task GetConnectedEquipment(string internalComponentLabel, string dexpiFilePath) - { - var datalogCreator = new DatalogCreator(); - var datalog = datalogCreator.CreateConnectedDatalogRule(internalComponentLabel); - var conn = RdfoxApi.GetDefaultConnectionSettings(); - await RdfoxApi.LoadDatalog(conn, datalog); - - var data = File.ReadAllText(dexpiFilePath); - await RdfoxApi.LoadData(conn, data); - - var queryString = datalogCreator.CreateConnectedSparqlQuery(); - var result = await RdfoxApi.QuerySparql(conn, queryString); - - await RdfoxApi.DeleteData(conn, data); - await RdfoxApi.DeleteDatalog(conn, datalog); - return result; - } -} \ No newline at end of file diff --git a/client/Boundaries/Boundaries/IRdfoxApi.cs b/client/Boundaries/Boundaries/IRdfoxApi.cs index 228dd139..b191c727 100644 --- a/client/Boundaries/Boundaries/IRdfoxApi.cs +++ b/client/Boundaries/Boundaries/IRdfoxApi.cs @@ -11,7 +11,7 @@ public interface IRdfoxApi public Task LoadData(string data); - public Task QuerySparql(string query, string acceptHeader); + public Task QuerySparql(string query, string acceptHeader = "application/sparql-results+json"); public Task AskSparql(string query); diff --git a/client/Boundaries/Boundaries/Program.cs b/client/Boundaries/Boundaries/Program.cs deleted file mode 100644 index fe1f70a0..00000000 --- a/client/Boundaries/Boundaries/Program.cs +++ /dev/null @@ -1,36 +0,0 @@ -using IriTools; - -namespace Boundaries; - -internal class Program -{ - private static async Task Main(string[] args) - { - if (args.Length < 2) - { - Console.WriteLine( - "Usage \"dotnet run filename-for-dexpi-in-rdf \"label-of-internal-componenet\" iri-of-border-component ... iri-of-border-component "); - Console.WriteLine( - "For finding a commissioning package from boundary use f.ex. \"dotnet run ../../../rml/pandid.trig \"T4750\" https://assetid.equinor.com/plantx#Nozzle-12 https://assetid.equinor.com/plantx#Nozzle-8 https://assetid.equinor.com/plantx#PlateHeatExchanger-1 https://assetid.equinor.com/plantx#ReciprocatingPump-1\""); - Console.WriteLine("For finding directly connected equipemnt use f.ex. \"dotnet run ../../../rml/pandid.trig \"P4711\""); - return; - } - - var dexpiFilePath = args[0]; - var internalComponentLabel = args[1]; - if (!File.Exists(dexpiFilePath)) - { - Console.WriteLine( - $"Could not find one of the input file {dexpiFilePath}"); - return; - } - - var borderComponentIris = args.Skip(2).Select(iri => new IriReference(iri)).ToArray(); - var result = borderComponentIris.Any() ? - await DexpiApi.GetCommissioningPackage(internalComponentLabel, borderComponentIris, dexpiFilePath) - : await DexpiApi.GetConnectedEquipment(internalComponentLabel, dexpiFilePath); - Console.WriteLine("Commissioning package:"); - Console.WriteLine(result); - - } -} \ No newline at end of file From ea2dd5cc37181cd59cb0266e234a0695ecc3be48 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Thu, 6 Feb 2025 15:58:23 +0100 Subject: [PATCH 40/50] Removed dexpi 2 svg project files --- ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 - .../Debug/net8.0/Dexpi2Svg.AssemblyInfo.cs | 23 ----- .../net8.0/Dexpi2Svg.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 15 ---- .../Debug/net8.0/Dexpi2Svg.GlobalUsings.g.cs | 8 -- .../obj/Debug/net8.0/Dexpi2Svg.assets.cache | Bin 239 -> 0 bytes .../obj/Dexpi2Svg.csproj.nuget.dgspec.json | 75 ---------------- .../obj/Dexpi2Svg.csproj.nuget.g.props | 16 ---- .../obj/Dexpi2Svg.csproj.nuget.g.targets | 2 - ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 - .../Release/net8.0/Dexpi2Svg.AssemblyInfo.cs | 23 ----- .../net8.0/Dexpi2Svg.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 15 ---- .../net8.0/Dexpi2Svg.GlobalUsings.g.cs | 8 -- .../obj/Release/net8.0/Dexpi2Svg.assets.cache | Bin 239 -> 0 bytes .../Dexpi2Svg/obj/project.assets.json | 81 ------------------ .../Dexpi2Svg/obj/project.nuget.cache | 8 -- 17 files changed, 284 deletions(-) delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfo.cs delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GlobalUsings.g.cs delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.assets.cache delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.dgspec.json delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.g.props delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.g.targets delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfo.cs delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GlobalUsings.g.cs delete mode 100644 client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.assets.cache delete mode 100644 client/Boundaries/Dexpi2Svg/obj/project.assets.json delete mode 100644 client/Boundaries/Dexpi2Svg/obj/project.nuget.cache diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs deleted file mode 100644 index 2217181c..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfo.cs b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfo.cs deleted file mode 100644 index f6255a8d..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("Dexpi2Svg")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ca7b34307b429016dc48a48e6c40e672dd08cb4c")] -[assembly: System.Reflection.AssemblyProductAttribute("Dexpi2Svg")] -[assembly: System.Reflection.AssemblyTitleAttribute("Dexpi2Svg")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache deleted file mode 100644 index 03c4211b..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -2af0af0bd597d780609da32eceff3e33644e66555e091baabe1c821b5d31caf9 diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index d91c9854..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -is_global = true -build_property.TargetFramework = net8.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = Dexpi2Svg -build_property.ProjectDir = C:\Users\henriette.rebnor\source\repos\equinor\ssi-dexpi-tmp\client\Boundaries\Dexpi2Svg\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.EffectiveAnalysisLevelStyle = 8.0 -build_property.EnableCodeStyleSeverity = diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GlobalUsings.g.cs b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GlobalUsings.g.cs deleted file mode 100644 index 8578f3d0..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.assets.cache b/client/Boundaries/Dexpi2Svg/obj/Debug/net8.0/Dexpi2Svg.assets.cache deleted file mode 100644 index d87d4f5409df87d8b31ef6e0b78c8ada75c39311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmWIWc6a1qU|_hb66SDsKG!b}p}U9rqfNF=u>HGE*|?ugnr{hvaMvS?*FZJI0w$nB zEoZBk(Bjmh;+TxoyrRt1l9E)tqSU0k{Gu4Wywdd4l9+ - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\henriette.rebnor\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 6.12.3 - - - - - - \ No newline at end of file diff --git a/client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.g.targets b/client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.g.targets deleted file mode 100644 index 3dc06ef3..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Dexpi2Svg.csproj.nuget.g.targets +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs deleted file mode 100644 index 2217181c..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfo.cs b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfo.cs deleted file mode 100644 index 379d35dd..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("Dexpi2Svg")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+89a517806f61772e4cb058556cda169f60c280ca")] -[assembly: System.Reflection.AssemblyProductAttribute("Dexpi2Svg")] -[assembly: System.Reflection.AssemblyTitleAttribute("Dexpi2Svg")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache deleted file mode 100644 index cb13cabd..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -d7e0701566d3076071b23b61b7739c34a4113980b66cf8c68a1157332b58403c diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index d91c9854..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -is_global = true -build_property.TargetFramework = net8.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = Dexpi2Svg -build_property.ProjectDir = C:\Users\henriette.rebnor\source\repos\equinor\ssi-dexpi-tmp\client\Boundaries\Dexpi2Svg\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.EffectiveAnalysisLevelStyle = 8.0 -build_property.EnableCodeStyleSeverity = diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GlobalUsings.g.cs b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GlobalUsings.g.cs deleted file mode 100644 index 8578f3d0..00000000 --- a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.assets.cache b/client/Boundaries/Dexpi2Svg/obj/Release/net8.0/Dexpi2Svg.assets.cache deleted file mode 100644 index 65891cfa07272ff21f54db17fdd0bcce370fb581..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmWIWc6a1qU|>kR>BJqid3~YB(rNmY_a}W*sK2*j`G;+VcDouU>3o>B^fgcov49Dv zP|MjWCbT%Us5mAgHLoZ$wWK6fuP8MsFTW^8FRwH`wIrq>F*!RiJ+(LnWUM<-c|cKq zdQoDof?H-zYO#W Date: Thu, 6 Feb 2025 16:17:41 +0100 Subject: [PATCH 41/50] Refactor merge --- .../Backend/Endpoints/BoundaryEndpoints.cs | 59 +-- .../CommissioningPackageEndpoints.cs | 43 +- client/Boundaries/Backend/Program.cs | 433 +----------------- 3 files changed, 55 insertions(+), 480 deletions(-) diff --git a/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs b/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs index c7c75616..0b23f5e4 100644 --- a/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs +++ b/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs @@ -1,38 +1,39 @@ using System.Text.Json; using Backend.Utils; using Boundaries; +using Microsoft.AspNetCore.Mvc; namespace Backend.Endpoints; public static class BoundaryEndpoints { - public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints, RdfoxApi.ConnectionSettings connectionSettings) + public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints) { #region Boundaries //Update boundary - endpoints.MapPost("/commissioning-package/{packageId}/update-boundary/{nodeId}", async (string packageId, string nodeId) => + endpoints.MapPost("/commissioning-package/{packageId}/update-boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, connectionSettings)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } - var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, connectionSettings); - var isBoundary = await QueryUtils.IsBoundaryOf(packageId, nodeId, connectionSettings); + var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, rdfoxApi); + var isBoundary = await QueryUtils.IsBoundaryOf(packageId, nodeId, rdfoxApi); if (isSelectedInternal) - await QueryUtils.DeleteIsSelectedInternalOf(packageId, nodeId, connectionSettings); + await QueryUtils.DeleteIsSelectedInternalOf(packageId, nodeId, rdfoxApi); if (isBoundary) { - await QueryUtils.DeleteIsBoundaryOf(packageId, nodeId, connectionSettings); + await QueryUtils.DeleteIsBoundaryOf(packageId, nodeId, rdfoxApi); } else { - await QueryUtils.AddIsBoundaryOf(packageId, nodeId, connectionSettings); + await QueryUtils.AddIsBoundaryOf(packageId, nodeId, rdfoxApi); } return Results.Ok(); @@ -40,12 +41,12 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints, Rd // Add node as boundary - endpoints.MapPost("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId) => + endpoints.MapPost("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, connectionSettings)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } @@ -53,19 +54,19 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints, Rd var data = $@" <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> ."; - await RdfoxApi.LoadData(connectionSettings, data); + await rdfoxApi.LoadData(data); return Results.Ok($"Triple with subject {packageId} and object {nodeId} inserted successfully."); }).WithTags("Boundary"); // Remove node as boundary - endpoints.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId) => + endpoints.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, connectionSettings)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } @@ -74,7 +75,7 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints, Rd <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> . "; - await RdfoxApi.DeleteData(connectionSettings, data); + await rdfoxApi.DeleteData(data); return Results.Ok($"Triple for package {packageId} and node {nodeId} deleted successfully."); }).WithTags("Boundary"); @@ -82,29 +83,29 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints, Rd #region Internal //Update selected internal - endpoints.MapPost("/commissioning-package/{packageId}/update-internal/{nodeId}", async (string packageId, string nodeId) => + endpoints.MapPost("/commissioning-package/{packageId}/update-internal/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, connectionSettings)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } - var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, connectionSettings); - var isBoundary = await QueryUtils.IsBoundaryOf(packageId, nodeId, connectionSettings); + var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, rdfoxApi); + var isBoundary = await QueryUtils.IsBoundaryOf(packageId, nodeId, rdfoxApi); if (isBoundary) - await QueryUtils.DeleteIsBoundaryOf(packageId, nodeId, connectionSettings); + await QueryUtils.DeleteIsBoundaryOf(packageId, nodeId, rdfoxApi); if (isSelectedInternal) { - await QueryUtils.DeleteIsSelectedInternalOf(packageId, nodeId, connectionSettings); + await QueryUtils.DeleteIsSelectedInternalOf(packageId, nodeId, rdfoxApi); } else { - await QueryUtils.AddIsSelectedInternalOf(packageId, nodeId, connectionSettings); + await QueryUtils.AddIsSelectedInternalOf(packageId, nodeId, rdfoxApi); } return Results.Ok(); @@ -112,12 +113,12 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints, Rd //Add node as internal - endpoints.MapPost("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId) => + endpoints.MapPost("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, connectionSettings)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } @@ -126,19 +127,19 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints, Rd <{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> . "; - await RdfoxApi.LoadData(connectionSettings, data); + await rdfoxApi.LoadData(data); return Results.Ok($"Triple for package {packageId} and node {nodeId} inserted successfully."); }).WithTags("Internal"); // Remove node as internal - endpoints.MapDelete("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId) => + endpoints.MapDelete("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { packageId = Uri.UnescapeDataString(packageId); nodeId = Uri.UnescapeDataString(nodeId); - if (!await QueryUtils.CommissioningPackageExists(packageId, connectionSettings)) + if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {packageId} not found."); } @@ -147,7 +148,7 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints, Rd <{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> . "; - await RdfoxApi.DeleteData(connectionSettings, data); + await rdfoxApi.DeleteData(data); return Results.Ok($"Triple for package {packageId} and node {nodeId} deleted successfully."); }).WithTags("Internal"); @@ -155,13 +156,13 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints, Rd #region Nodes //Get adjacent nodes - endpoints.MapGet("/nodes/{nodeId}/adjacent", async (string nodeId) => + endpoints.MapGet("/nodes/{nodeId}/adjacent", async (string nodeId, [FromServices] IRdfoxApi rdfoxApi) => { nodeId = Uri.UnescapeDataString(nodeId); var query = $@"SELECT ?neighbour WHERE {{ <{nodeId}> {PropertiesProvider.adjacentTo} ?neighbour }}"; - var result = await RdfoxApi.QuerySparql(connectionSettings, query); + var result = await rdfoxApi.QuerySparql(query); var adjacentNodes = new List(); diff --git a/client/Boundaries/Backend/Endpoints/CommissioningPackageEndpoints.cs b/client/Boundaries/Backend/Endpoints/CommissioningPackageEndpoints.cs index 21e6539c..c7073807 100644 --- a/client/Boundaries/Backend/Endpoints/CommissioningPackageEndpoints.cs +++ b/client/Boundaries/Backend/Endpoints/CommissioningPackageEndpoints.cs @@ -3,29 +3,30 @@ using Backend.Model; using Backend.Utils; using Boundaries; +using Microsoft.AspNetCore.Mvc; namespace Backend.Endpoints; public static class CommissioningPackageEndpoints { - public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder endpoints, RdfoxApi.ConnectionSettings connectionSettings) + public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder endpoints) { //Add commissioning package - endpoints.MapPost("/commissioning-package", async (CommissioningPackage commissioningPackage) => + endpoints.MapPost("/commissioning-package", async (CommissioningPackage commissioningPackage, [FromServices] IRdfoxApi rdfoxApi) => { var data = new StringBuilder(); data.AppendLine($@"<{commissioningPackage.Id}> {TypesProvider.type} {PropertiesProvider.CommissioningPackage} ."); data.AppendLine($@"<{commissioningPackage.Id}> {PropertiesProvider.hasName} ""{commissioningPackage.Name}"" ."); data.AppendLine($@"<{commissioningPackage.Id}> {PropertiesProvider.hasColor} ""{commissioningPackage.Color}"" ."); - await RdfoxApi.LoadData(connectionSettings, data.ToString()); + await rdfoxApi.LoadData(data.ToString()); return Results.Ok($"Commissioning package {commissioningPackage.Id} added successfully."); }).WithTags("Commissioning Package"); // Update commissioning package - updating information like name and color while persisting the calculated internal nodes, and boundaries. - endpoints.MapPut("/commissioning-package", async (CommissioningPackage updatedPackage) => + endpoints.MapPut("/commissioning-package", async (CommissioningPackage updatedPackage, [FromServices] IRdfoxApi rdfoxApi) => { var getQuery = $@" SELECT ?object WHERE {{ @@ -35,7 +36,7 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e }} "; - var result = await RdfoxApi.QuerySparql(connectionSettings, getQuery); + var result = await rdfoxApi.QuerySparql(getQuery); var oldPackageName = string.Empty; var oldPackageColor = string.Empty; @@ -56,25 +57,25 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e <{updatedPackage.Id}> {PropertiesProvider.hasName} ""{oldPackageName}"" . "; - await RdfoxApi.DeleteData(connectionSettings, deleteData); + await rdfoxApi.DeleteData(deleteData); var data = $@" <{updatedPackage.Id}> {PropertiesProvider.hasName} ""{updatedPackage.Name}"" . <{updatedPackage.Id}> {PropertiesProvider.hasColor} ""{updatedPackage.Color}"" . "; - await RdfoxApi.LoadData(connectionSettings, data); + await rdfoxApi.LoadData(data); return Results.Ok($"Commissioning package {updatedPackage.Id} updated successfully."); }).WithTags("Commissioning Package"); //Get commissioning package - endpoints.MapGet("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId) => + endpoints.MapGet("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId, [FromServices] IRdfoxApi rdfoxApi) => { commissioningPackageId = Uri.UnescapeDataString(commissioningPackageId); - if (!await QueryUtils.CommissioningPackageExists(commissioningPackageId, connectionSettings)) + if (!await QueryUtils.CommissioningPackageExists(commissioningPackageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {commissioningPackageId} not found."); } @@ -87,7 +88,7 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e }} "; - var result = await RdfoxApi.QuerySparql(connectionSettings, query); + var result = await rdfoxApi.QuerySparql(query); CommissioningPackage commissioningPackage; @@ -109,11 +110,11 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e //Delete commissioning package - endpoints.MapDelete("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId) => + endpoints.MapDelete("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId, [FromServices] IRdfoxApi rdfoxApi) => { commissioningPackageId = Uri.UnescapeDataString(commissioningPackageId); - if (!await QueryUtils.CommissioningPackageExists(commissioningPackageId, connectionSettings)) + if (!await QueryUtils.CommissioningPackageExists(commissioningPackageId, rdfoxApi)) { return Results.NotFound($"Commissioning package {commissioningPackageId} not found."); } @@ -123,7 +124,7 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e {{ <{commissioningPackageId}> ?x ?y . }} }}"; - var result = await RdfoxApi.QuerySparql(connectionSettings, query); + var result = await rdfoxApi.QuerySparql(query); var deleteQueryBuilder = new StringBuilder(); @@ -147,7 +148,7 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e } } - await RdfoxApi.DeleteData(connectionSettings, deleteQueryBuilder.ToString()); + await rdfoxApi.DeleteData( deleteQueryBuilder.ToString()); query = $@" SELECT ?x ?y WHERE {{ @@ -156,7 +157,7 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e try { - result = await RdfoxApi.QuerySparql(connectionSettings, query); + result = await rdfoxApi.QuerySparql(query); deleteQueryBuilder = new StringBuilder(); using (var docDel = JsonDocument.Parse(result)) @@ -172,7 +173,7 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e } } - await RdfoxApi.DeleteData(connectionSettings, deleteQueryBuilder.ToString()); + await rdfoxApi.DeleteData(deleteQueryBuilder.ToString()); } catch (Exception ex) { @@ -185,14 +186,14 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e //Get all commissioning packages - endpoints.MapGet("/commissioning-package/all", async () => + endpoints.MapGet("/commissioning-package/all", async ([FromServices] IRdfoxApi rdfoxApi) => { var query = $@" SELECT ?packageId WHERE {{ ?packageId rdf:type {PropertiesProvider.CommissioningPackage} . }}"; - var result = await RdfoxApi.QuerySparql(connectionSettings, query); + var result = await rdfoxApi.QuerySparql(query); var jsonResponse = JsonDocument.Parse(result); var packageIds = jsonResponse.RootElement @@ -214,7 +215,7 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e }} "; - result = await RdfoxApi.QuerySparql(connectionSettings, query); + result = await rdfoxApi.QuerySparql(query); CommissioningPackage commissioningPackage; @@ -237,14 +238,14 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e }).WithTags("Commissioning Package"); //Get the ID of all commissioning packages - endpoints.MapGet("/commissioning-package/ids", async () => + endpoints.MapGet("/commissioning-package/ids", async ([FromServices] IRdfoxApi rdfoxApi) => { var query = $@" SELECT ?packageId WHERE {{ ?packageId rdf:type {PropertiesProvider.CommissioningPackage} . }}"; - var result = await RdfoxApi.QuerySparql(connectionSettings, query); + var result = await rdfoxApi.QuerySparql(query); var jsonResponse = JsonDocument.Parse(result); var packageIds = jsonResponse.RootElement diff --git a/client/Boundaries/Backend/Program.cs b/client/Boundaries/Backend/Program.cs index ba807ac3..b0fa8a5e 100644 --- a/client/Boundaries/Backend/Program.cs +++ b/client/Boundaries/Backend/Program.cs @@ -3,6 +3,7 @@ using System.Text; using Backend.Utils; using System.Text.Json; +using Backend.Model; using Microsoft.AspNetCore.Mvc; @@ -37,437 +38,9 @@ ); app.UseHttpsRedirection(); -// Establish connection to Rdfox -var rdfoxConnectionSettings = RdfoxApi.GetDefaultConnectionSettings(); - -// ============ BOUNDARIES ============ - -//Update boundary -app.MapPost("/commissioning-package/{packageId}/update-boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => -{ - packageId = Uri.UnescapeDataString(packageId); - nodeId = Uri.UnescapeDataString(nodeId); - - if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) - { - return Results.NotFound($"Commissioning package {packageId} not found."); - } - - var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, rdfoxApi); - var isBoundary = await QueryUtils.IsBoundaryOf(packageId, nodeId, rdfoxApi); - - if (isSelectedInternal) - await QueryUtils.DeleteIsSelectedInternalOf(packageId, nodeId, rdfoxApi); - - if (isBoundary) - { - await QueryUtils.DeleteIsBoundaryOf(packageId, nodeId, rdfoxApi); - } - else - { - await QueryUtils.AddIsBoundaryOf(packageId, nodeId, rdfoxApi); - } - - return Results.Ok(); -}).WithTags("Boundary"); - - -// Add node as boundary -app.MapPost("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => -{ - packageId = Uri.UnescapeDataString(packageId); - nodeId = Uri.UnescapeDataString(nodeId); - - if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) - { - return Results.NotFound($"Commissioning package {packageId} not found."); - } - - var data = $@" - <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> ."; - - await rdfoxApi.LoadData(data); - - return Results.Ok($"Triple with subject {packageId} and object {nodeId} inserted successfully."); -}).WithTags("Boundary"); - - -// Remove node as boundary -app.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => -{ - packageId = Uri.UnescapeDataString(packageId); - nodeId = Uri.UnescapeDataString(nodeId); - - if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) - { - return Results.NotFound($"Commissioning package {packageId} not found."); - } - - var data = $@" - <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> . - "; - - await rdfoxApi.DeleteData(data); - - return Results.Ok($"Triple for package {packageId} and node {nodeId} deleted successfully."); -}).WithTags("Boundary"); - - -// ============ INTERNAL ============ - -//Update selected internal -app.MapPost("/commissioning-package/{packageId}/update-internal/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => -{ - packageId = Uri.UnescapeDataString(packageId); - nodeId = Uri.UnescapeDataString(nodeId); - - if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) - { - return Results.NotFound($"Commissioning package {packageId} not found."); - } - - var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, rdfoxApi); - var isBoundary = await QueryUtils.IsBoundaryOf(packageId, nodeId, rdfoxApi); - - if (isBoundary) - await QueryUtils.DeleteIsBoundaryOf(packageId, nodeId, rdfoxApi); - - if (isSelectedInternal) - { - await QueryUtils.DeleteIsSelectedInternalOf(packageId, nodeId, rdfoxApi); - } - else - { - await QueryUtils.AddIsSelectedInternalOf(packageId, nodeId, rdfoxApi); - } - - return Results.Ok(); -}).WithTags("Internal"); - - -//Add node as internal -app.MapPost("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => -{ - packageId = Uri.UnescapeDataString(packageId); - nodeId = Uri.UnescapeDataString(nodeId); - - if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) - { - return Results.NotFound($"Commissioning package {packageId} not found."); - } - - var data = $@" - <{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> . - "; - - await rdfoxApi.LoadData(data); - - return Results.Ok($"Triple for package {packageId} and node {nodeId} inserted successfully."); -}).WithTags("Internal"); - - -// Remove node as internal -app.MapDelete("/commissioning-package/{packageId}/internal/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => -{ - packageId = Uri.UnescapeDataString(packageId); - nodeId = Uri.UnescapeDataString(nodeId); - - if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) - { - return Results.NotFound($"Commissioning package {packageId} not found."); - } - - var data = $@" - <{nodeId}> {PropertiesProvider.isInPackage} <{packageId}> . - "; - - await rdfoxApi.DeleteData(data); - - return Results.Ok($"Triple for package {packageId} and node {nodeId} deleted successfully."); -}).WithTags("Internal"); - - -// ============ NODES ============ - -//Get adjacent nodes -app.MapGet("/nodes/{nodeId}/adjacent", async (string nodeId, [FromServices] IRdfoxApi rdfoxApi) => -{ - nodeId = Uri.UnescapeDataString(nodeId); - - var query = $@"SELECT ?neighb WHERE {{ <{nodeId}> {PropertiesProvider.adjacentTo} ?neighb }}"; - - var result = await rdfoxApi.QuerySparql(query); - - var adjacentNodes = new List(); - - try - { - using (JsonDocument doc = JsonDocument.Parse(result)) - { - var bindings = doc.RootElement.GetProperty("results").GetProperty("bindings"); - - foreach (var binding in bindings.EnumerateArray()) - { - var neighb = binding.GetProperty("neighb").GetProperty("value").GetString(); - adjacentNodes.Add(neighb); - } - } - } - catch (JsonException e) - { - return Results.Problem("An error occurred while parsing the SPARQL result."); - } - - return Results.Ok(adjacentNodes); -}).WithTags("Nodes"); - - -// ============ COMMISSIONING PACKAGE ============ - -//Add commissioning package -app.MapPost("/commissioning-package", async (CommissioningPackage commissioningPackage, [FromServices] IRdfoxApi rdfoxApi) => -{ - var data = new StringBuilder(); - data.AppendLine($@"<{commissioningPackage.Id}> {TypesProvider.type} {PropertiesProvider.CommissioningPackage} ."); - data.AppendLine($@"<{commissioningPackage.Id}> {PropertiesProvider.hasName} ""{commissioningPackage.Name}"" ."); - data.AppendLine($@"<{commissioningPackage.Id}> {PropertiesProvider.hasColor} ""{commissioningPackage.Color}"" ."); - - await rdfoxApi.LoadData(data.ToString()); - - return Results.Ok($"Commissioning package {commissioningPackage.Id} added successfully."); -}).WithTags("Commissioning Package"); - - -// Update commissioning package - updating information like name and color while persisting the calculated internal nodes, and boundaries. -app.MapPut("/commissioning-package", async (CommissioningPackage updatedPackage, [FromServices] IRdfoxApi rdfoxApi) => -{ - var getQuery = $@" - SELECT ?object WHERE {{ - {{ <{updatedPackage.Id}> {PropertiesProvider.hasColor} ?object . }} - UNION - {{ <{updatedPackage.Id}> {PropertiesProvider.hasName} ?object . }} - }} - "; - - var result = await rdfoxApi.QuerySparql(getQuery); - - string oldPackageName = string.Empty; - string oldPackageColor = string.Empty; - - using (JsonDocument doc = JsonDocument.Parse(result)) - { - var bindings = doc.RootElement.GetProperty("results").GetProperty("bindings").EnumerateArray().ToList(); - - if (bindings.Count >= 2) - { - oldPackageName = bindings[0].GetProperty("object").GetProperty("value").GetString(); - oldPackageColor = bindings[1].GetProperty("object").GetProperty("value").GetString(); - } - } - - // Log the existing color and name of the package - var deleteData = $@"<{updatedPackage.Id}> {PropertiesProvider.hasColor} ""{oldPackageColor}"" . - <{updatedPackage.Id}> {PropertiesProvider.hasName} ""{oldPackageName}"" . "; - - - await rdfoxApi.DeleteData(deleteData); - -// Map endpoints -app.MapBoundaryEndpoints(rdfoxConnectionSettings); -app.MapCommissioningPackageEndpoints(rdfoxConnectionSettings); +app.MapBoundaryEndpoints(); +app.MapCommissioningPackageEndpoints(); app.MapGraphicalDataFormatEndpoints(); - var data = $@" - <{updatedPackage.Id}> {PropertiesProvider.hasName} ""{updatedPackage.Name}"" . - <{updatedPackage.Id}> {PropertiesProvider.hasColor} ""{updatedPackage.Color}"" . - "; - - await rdfoxApi.LoadData(data); - - return Results.Ok($"Commissioning package {updatedPackage.Id} updated successfully."); -}).WithTags("Commissioning Package"); - - -//Get commissioning package -app.MapGet("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId, [FromServices] IRdfoxApi rdfoxApi) => -{ - commissioningPackageId = Uri.UnescapeDataString(commissioningPackageId); - - if (!await QueryUtils.CommissioningPackageExists(commissioningPackageId, rdfoxApi)) - { - return Results.NotFound($"Commissioning package {commissioningPackageId} not found."); - } - - var query = $@" - SELECT ?x ?y WHERE {{ - {{ <{commissioningPackageId}> ?x ?y . }} - UNION - {{ ?y ?x <{commissioningPackageId}> . }} - }} -"; - - var result = await rdfoxApi.QuerySparql(query); - - CommissioningPackage commissioningPackage; - - try - { - commissioningPackage = QueryUtils.ParseCommissioningPackageQueryResult(commissioningPackageId, result); - } - catch (JsonException) - { - return Results.Problem("A json error occurred while parsing the SPARQL result."); - } - catch (Exception) - { - return Results.Problem("Null error occurred while parsing the SPARQL result."); - } - - return Results.Ok(commissioningPackage); -}).WithTags("Commissioning Package"); - - -//Delete commissioning package -app.MapDelete("/commissioning-package/{commissioningPackageId}", async (string commissioningPackageId, [FromServices] IRdfoxApi rdfoxApi) => -{ - commissioningPackageId = Uri.UnescapeDataString(commissioningPackageId); - - if (!await QueryUtils.CommissioningPackageExists(commissioningPackageId, rdfoxApi)) - { - return Results.NotFound($"Commissioning package {commissioningPackageId} not found."); - } - - var query = $@" - SELECT ?x ?y WHERE {{ - {{ <{commissioningPackageId}> ?x ?y . }} - }}"; - - var result = await rdfoxApi.QuerySparql(query); - var deleteQueryBuilder = new StringBuilder(); - - - using (JsonDocument doc = JsonDocument.Parse(result)) - { - var bindings = doc.RootElement.GetProperty("results").GetProperty("bindings"); - - foreach (var binding in bindings.EnumerateArray()) - { - var xValue = binding.GetProperty("x").GetProperty("value").GetString(); - var yValue = binding.GetProperty("y").GetProperty("value").GetString(); - - if (yValue.Contains("http")) - { - deleteQueryBuilder.AppendLine($@"<{commissioningPackageId}> <{xValue}> <{yValue}> . "); - } - else - { - deleteQueryBuilder.AppendLine($@"<{commissioningPackageId}> <{xValue}> ""{yValue}"" . "); - } - } - } - - await rdfoxApi.DeleteData(deleteQueryBuilder.ToString()); - - query = $@" - SELECT ?x ?y WHERE {{ - {{ ?y ?x <{commissioningPackageId}> . }} - }}"; - - result = await rdfoxApi.QuerySparql(query); - deleteQueryBuilder = new StringBuilder(); - - using (JsonDocument docDel = JsonDocument.Parse(result)) - { - var bindingsDel = docDel.RootElement.GetProperty("results").GetProperty("bindings"); - - foreach (var binding in bindingsDel.EnumerateArray()) - { - var xValue = binding.GetProperty("x").GetProperty("value").GetString(); - var yValue = binding.GetProperty("y").GetProperty("value").GetString(); - - deleteQueryBuilder.AppendLine($@"<{yValue}> <{xValue}> <{commissioningPackageId}> . "); - } - } - - await rdfoxApi.DeleteData(deleteQueryBuilder.ToString()); - - return Results.Ok($"Commissioning package {commissioningPackageId} deleted successfully."); - -}).WithTags("Commissioning Package"); - - -//Get all commissioning packages -app.MapGet("/commissioning-package/all", async ([FromServices] IRdfoxApi rdfoxApi) => -{ - var query = $@" - SELECT ?packageId WHERE {{ - ?packageId rdf:type {PropertiesProvider.CommissioningPackage} . - }}"; - - var result = await rdfoxApi.QuerySparql(query); - - var jsonResponse = JsonDocument.Parse(result); - var packageIds = jsonResponse.RootElement - .GetProperty("results") - .GetProperty("bindings") - .EnumerateArray() - .Select(binding => binding.GetProperty("packageId").GetProperty("value").GetString()) - .ToList(); - - var commissioningPackages = new List(); - - foreach (string id in packageIds) - { - query = $@" - SELECT ?x ?y WHERE {{ - {{ <{id}> ?x ?y . }} - UNION - {{ ?y ?x <{id}> . }} - }} - "; - - result = await rdfoxApi.QuerySparql(query); - - CommissioningPackage commissioningPackage; - - try - { - commissioningPackage = QueryUtils.ParseCommissioningPackageQueryResult(id, result); - } - catch (JsonException) - { - return Results.Problem("A json error occurred while parsing the SPARQL result."); - } - catch (Exception) - { - return Results.Problem("Null error occurred while parsing the SPARQL result."); - } - commissioningPackages.Add(commissioningPackage); - } - - return Results.Ok(commissioningPackages); -}).WithTags("Commissioning Package"); - - -//Get the ID of all commissioning packages -app.MapGet("/commissioning-package/ids", async ([FromServices] IRdfoxApi rdfoxApi) => -{ - var query = $@" - SELECT ?packageId WHERE {{ - ?packageId rdf:type {PropertiesProvider.CommissioningPackage} . - }}"; - - var result = await rdfoxApi.QuerySparql(query); - - var jsonResponse = JsonDocument.Parse(result); - var packageIds = jsonResponse.RootElement - .GetProperty("results") - .GetProperty("bindings") - .EnumerateArray() - .Select(binding => binding.GetProperty("packageId").GetProperty("value").GetString()) - .ToList(); - - return Results.Ok(packageIds); -}).WithTags("Commissioning Package"); app.Run(); From 0ba6cc6cfe763cc897473bd4f44cc64b3f4659e5 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Fri, 7 Feb 2025 12:03:34 +0100 Subject: [PATCH 42/50] test starts up! --- client/Boundaries/Backend/Backend.csproj | 2 +- client/Boundaries/Backend/Program.cs | 5 +- .../Boundaries/Boundaries/Boundaries.csproj | 2 +- .../TestBoundaries/IntegrationTests.cs | 22 +++++ .../TestBoundaries/TestBoundaries.csproj | 5 +- .../Boundaries/TestBoundaries/TestFactory.cs | 85 ++++++++++++++----- .../TestOutputLoggerProvider.cs | 42 +++++++++ 7 files changed, 136 insertions(+), 27 deletions(-) create mode 100644 client/Boundaries/TestBoundaries/IntegrationTests.cs create mode 100644 client/Boundaries/TestBoundaries/TestOutputLoggerProvider.cs diff --git a/client/Boundaries/Backend/Backend.csproj b/client/Boundaries/Backend/Backend.csproj index ae50c99f..0026cdda 100644 --- a/client/Boundaries/Backend/Backend.csproj +++ b/client/Boundaries/Backend/Backend.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable diff --git a/client/Boundaries/Backend/Program.cs b/client/Boundaries/Backend/Program.cs index b0fa8a5e..cbcdffc6 100644 --- a/client/Boundaries/Backend/Program.cs +++ b/client/Boundaries/Backend/Program.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc; + var builder = WebApplication.CreateBuilder(args); builder.Services.AddEndpointsApiExplorer(); @@ -46,4 +47,6 @@ // Necessary for integration testing -public partial class Program { } \ No newline at end of file +namespace Backend{ + public partial class Program { } +} \ No newline at end of file diff --git a/client/Boundaries/Boundaries/Boundaries.csproj b/client/Boundaries/Boundaries/Boundaries.csproj index 30470bef..e5f74d8b 100644 --- a/client/Boundaries/Boundaries/Boundaries.csproj +++ b/client/Boundaries/Boundaries/Boundaries.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable diff --git a/client/Boundaries/TestBoundaries/IntegrationTests.cs b/client/Boundaries/TestBoundaries/IntegrationTests.cs new file mode 100644 index 00000000..1ea588ef --- /dev/null +++ b/client/Boundaries/TestBoundaries/IntegrationTests.cs @@ -0,0 +1,22 @@ +using Xunit.Abstractions; + +namespace TestBoundaries; + +public class IntegrationTests : IClassFixture +{ + private TestFactory _factory; + private ITestOutputHelper _testOutputHelper; + public IntegrationTests(TestFactory factory, ITestOutputHelper testOutputHelper) + { + _factory = factory; + _testOutputHelper = testOutputHelper; + var unused = _factory.CreateClient(); + } + + [Fact] + public void TestCreatePackage() + { + var client = _factory.CreateClient(); + + } +} \ No newline at end of file diff --git a/client/Boundaries/TestBoundaries/TestBoundaries.csproj b/client/Boundaries/TestBoundaries/TestBoundaries.csproj index bbb07287..c6a8db89 100644 --- a/client/Boundaries/TestBoundaries/TestBoundaries.csproj +++ b/client/Boundaries/TestBoundaries/TestBoundaries.csproj @@ -1,10 +1,10 @@ - net8.0 + net9.0 enable enable - + true false true @@ -25,6 +25,7 @@ + diff --git a/client/Boundaries/TestBoundaries/TestFactory.cs b/client/Boundaries/TestBoundaries/TestFactory.cs index 79e3218c..f702adcc 100644 --- a/client/Boundaries/TestBoundaries/TestFactory.cs +++ b/client/Boundaries/TestBoundaries/TestFactory.cs @@ -1,4 +1,5 @@ -using Boundaries; +using System.Reflection; +using Boundaries; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; @@ -6,33 +7,73 @@ using DotNet.Testcontainers.Containers; using DotNet.Testcontainers.Builders; using DotNet.Testcontainers.Configurations; +using Xunit.Abstractions; -public class TestFactory : WebApplicationFactory, IAsyncLifetime +public class TestFactory : WebApplicationFactory, IAsyncLifetime { - private readonly IContainer _rdfox; - public HttpClient? Client { get; private set; } + private ContainerBuilder _rdfoxBuilder; + + private IContainer _rdfoxContainer; + + private string hostname; + private int port; + // private readonly IContainer _initRdfoxDockerClient; + ITestOutputHelper _testOutputHelper; + private readonly string _outputFolderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? throw new InvalidOperationException(); + private string _tempRdfoxDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + private const string RdfoxUsername = "dexpi"; + private readonly string _rdfoxPassword = Guid.NewGuid().ToString("D"); public TestFactory() { + Directory.CreateDirectory(_tempRdfoxDirectory); + string filePath = Path.Combine(_tempRdfoxDirectory, "RDFox.versions"); + string content = "data-store-catalog 1\ndata-store-change-log 1\nendpoint.params 1\nrole-database 1\nserver.params 1"; + + File.WriteAllText(filePath, content); + + // This tries to be as close as possible to the actual RDFox docker setup in terraform/bravo-webapi/packer/rdfox_initdb.sh + // _initRdfoxDockerClient = new ContainerBuilder() + // .WithImage("oxfordsemantic/rdfox-init:7.3") + // .WithBindMount($"{_outputFolderPath}/../../../../../../", "/home/rdfox/data/", AccessMode.ReadOnly) + // .WithBindMount(_tempRdfoxDirectory, "/home/rdfox/.RDFox", AccessMode.ReadWrite) + // .WithCommand("-license.file", "/home/rdfox/data/RDFox.lic", "-persistence", "file-sequence", "-request-logger", "elf", "init") + // .WithEnvironment("RDFOX_ROLE", RdfoxUsername) + // .WithEnvironment("RDFOX_PASSWORD", _rdfoxPassword) + // .WithWaitStrategy(Wait.ForUnixContainer()) + // .WithCleanUp(false) + // .Build(); + // Set up an RDFox Testcontainer - _rdfox = new ContainerBuilder() - .WithImage("bravoacr.azurecr.io/oxfordsemantic/rdfox-init:7.2a") - //TODO : copy the rdfox lic and mount properly - test it out to see how it goes :)) - // Not sure if password and username is needed? Silly values is used in the BravoTestFacory - //.WithBindMount($"{_outputFolderPath}/TestData/RDFox.lic", "/opt/RDFox/RDFox.lic", AccessMode.ReadOnly) - //.WithBindMount(_tempRdfoxDirectory, "/home/rdfox/.RDFox", AccessMode.ReadWrite) - //.WithCommand("-persistence", "file-sequence", "-request-logger", "elf", "init") + _rdfoxBuilder = new ContainerBuilder() + .WithImage("oxfordsemantic/rdfox:7.3") + .WithBindMount($"{_outputFolderPath}/../../../../../../", "/home/rdfox/data/", AccessMode.ReadOnly) + .WithBindMount(_tempRdfoxDirectory, "/home/rdfox/.RDFox", AccessMode.ReadWrite) + .WithCommand("-license.file", "/home/rdfox/data/RDFox.lic", "-persistence", "off", "-request-logger", "elf", + "-sandbox-directory", "/home/rdfox/data", "daemon", "/home/rdfox/data/rdfox", "dexpi") .WithPortBinding(12110, true) - .WithCleanUp(true) - .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(12110)) - .Build(); + .WithEnvironment("RDFOX_ROLE", RdfoxUsername) + .WithEnvironment("RDFOX_PASSWORD", _rdfoxPassword) + .WithCleanUp(false) + .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(12110)); } + public void WithLogger(ITestOutputHelper testOutputHelper) + { + _testOutputHelper = testOutputHelper; + var logger = new TestOutputLoggerProvider(testOutputHelper); + _rdfoxBuilder = _rdfoxBuilder.WithLogger(logger.CreateLogger("dexpi")); + } + public async Task InitializeAsync() { - await _rdfox.StartAsync(); - Client = CreateClient(); + //await _initRdfoxDockerClient.StartAsync(); + _rdfoxContainer = _rdfoxBuilder.Build(); + await _rdfoxContainer.StartAsync(); + hostname = _rdfoxContainer.Hostname; + port = _rdfoxContainer.GetMappedPublicPort(12110); + return; } protected override void ConfigureWebHost(IWebHostBuilder builder) @@ -44,10 +85,10 @@ protected override void ConfigureWebHost(IWebHostBuilder builder) // Register a test-specific RdfoxApi instance services.AddSingleton(new RdfoxApi(new ConnectionSettings { - Host = "", - Port = 12210, - Username = "", - Password = "", + Host = hostname, + Port = port, + Username = RdfoxUsername, + Password = _rdfoxPassword, Datastore = "" })); }); @@ -55,7 +96,7 @@ protected override void ConfigureWebHost(IWebHostBuilder builder) public new async Task DisposeAsync() { - await _rdfox.DisposeAsync(); - Client?.Dispose(); + await _rdfoxContainer.DisposeAsync(); + //await _initRdfoxDockerClient.DisposeAsync(); } } diff --git a/client/Boundaries/TestBoundaries/TestOutputLoggerProvider.cs b/client/Boundaries/TestBoundaries/TestOutputLoggerProvider.cs new file mode 100644 index 00000000..04000893 --- /dev/null +++ b/client/Boundaries/TestBoundaries/TestOutputLoggerProvider.cs @@ -0,0 +1,42 @@ +using Microsoft.Extensions.Logging; +using Xunit.Abstractions; + +public class TestOutputLoggerProvider : ILoggerProvider +{ + private readonly ITestOutputHelper _testOutputHelper; + + public TestOutputLoggerProvider(ITestOutputHelper testOutputHelper) + { + _testOutputHelper = testOutputHelper; + } + + public ILogger CreateLogger(string categoryName) + { + return new TestOutputLogger(_testOutputHelper, categoryName); + } + + public void Dispose() + { + } + + private class TestOutputLogger : ILogger + { + private readonly ITestOutputHelper _testOutputHelper; + private readonly string _categoryName; + + public TestOutputLogger(ITestOutputHelper testOutputHelper, string categoryName) + { + _testOutputHelper = testOutputHelper; + _categoryName = categoryName; + } + + public IDisposable BeginScope(TState state) => null; + + public bool IsEnabled(LogLevel logLevel) => true; + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + _testOutputHelper.WriteLine($"{logLevel.ToString()}: {_categoryName} - {formatter(state, exception)}"); + } + } +} \ No newline at end of file From 87d4146307c143ec891c274b2771dd6fccd92806 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Fri, 7 Feb 2025 14:49:46 +0100 Subject: [PATCH 43/50] Working integration tests --- client/Boundaries/Backend/Backend.csproj | 4 +- .../Backend/Endpoints/BoundaryEndpoints.cs | 25 +---- .../CommissioningPackageEndpoints.cs | 2 +- client/Boundaries/Backend/Program.cs | 4 +- .../Boundaries/ConnectionSettings.cs | 18 +++- client/Boundaries/Boundaries/RdfoxApi.cs | 14 +-- .../TestBoundaries/IntegrationTests.cs | 84 +++++++++++++++- .../TestBoundaries/TestBoundaries.cs | 97 +++++++++++++++++++ .../TestBoundaries/TestBoundaries.csproj | 11 ++- .../Boundaries/TestBoundaries/TestFactory.cs | 50 ++++------ docker/backend/Dockerfile | 4 +- 11 files changed, 238 insertions(+), 75 deletions(-) create mode 100644 client/Boundaries/TestBoundaries/TestBoundaries.cs diff --git a/client/Boundaries/Backend/Backend.csproj b/client/Boundaries/Backend/Backend.csproj index 0026cdda..53e00b80 100644 --- a/client/Boundaries/Backend/Backend.csproj +++ b/client/Boundaries/Backend/Backend.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs b/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs index 0b23f5e4..5a8c6630 100644 --- a/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs +++ b/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs @@ -18,7 +18,8 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints) if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { - return Results.NotFound($"Commissioning package {packageId} not found."); + string? value = $"Commissioning package {packageId} not found."; + return Results.NotFound(); } var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, rdfoxApi); @@ -38,27 +39,7 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints) return Results.Ok(); }).WithTags("Boundary"); - - - // Add node as boundary - endpoints.MapPost("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => - { - packageId = Uri.UnescapeDataString(packageId); - nodeId = Uri.UnescapeDataString(nodeId); - - if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) - { - return Results.NotFound($"Commissioning package {packageId} not found."); - } - - var data = $@" - <{nodeId}> {PropertiesProvider.isBoundaryOf} <{packageId}> ."; - - await rdfoxApi.LoadData(data); - - return Results.Ok($"Triple with subject {packageId} and object {nodeId} inserted successfully."); - }).WithTags("Boundary"); - + // Remove node as boundary endpoints.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => diff --git a/client/Boundaries/Backend/Endpoints/CommissioningPackageEndpoints.cs b/client/Boundaries/Backend/Endpoints/CommissioningPackageEndpoints.cs index c7073807..19a06412 100644 --- a/client/Boundaries/Backend/Endpoints/CommissioningPackageEndpoints.cs +++ b/client/Boundaries/Backend/Endpoints/CommissioningPackageEndpoints.cs @@ -21,7 +21,7 @@ public static void MapCommissioningPackageEndpoints(this IEndpointRouteBuilder e await rdfoxApi.LoadData(data.ToString()); - return Results.Ok($"Commissioning package {commissioningPackage.Id} added successfully."); + return Results.Ok(); }).WithTags("Commissioning Package"); diff --git a/client/Boundaries/Backend/Program.cs b/client/Boundaries/Backend/Program.cs index cbcdffc6..c6f40ae6 100644 --- a/client/Boundaries/Backend/Program.cs +++ b/client/Boundaries/Backend/Program.cs @@ -20,8 +20,8 @@ { Host = "rdfox", Port = 12110, - Username = "admin", - Password = "admin", + Username = "guest", + Password = "guest", Datastore = "boundaries" }; diff --git a/client/Boundaries/Boundaries/ConnectionSettings.cs b/client/Boundaries/Boundaries/ConnectionSettings.cs index 502cdb37..bb35340d 100644 --- a/client/Boundaries/Boundaries/ConnectionSettings.cs +++ b/client/Boundaries/Boundaries/ConnectionSettings.cs @@ -1,4 +1,7 @@ -namespace Boundaries; +using System.Net.Http.Headers; +using System.Text; + +namespace Boundaries; public struct ConnectionSettings { @@ -7,4 +10,17 @@ public struct ConnectionSettings public string Username { get; set; } public string Password { get; set; } public string Datastore { get; set; } + + public AuthenticationHeaderValue GetRequestAuthHeader() + { + var credentials = $"{Username}:{Password}"; + var base64Credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials)); + return new AuthenticationHeaderValue("Basic", base64Credentials); + } + public HttpClient GetAuthenticatedClient() + { + var client = new HttpClient(); + client.DefaultRequestHeaders.Authorization = GetRequestAuthHeader(); + return client; + } } \ No newline at end of file diff --git a/client/Boundaries/Boundaries/RdfoxApi.cs b/client/Boundaries/Boundaries/RdfoxApi.cs index 7f42b4a3..a525be1e 100644 --- a/client/Boundaries/Boundaries/RdfoxApi.cs +++ b/client/Boundaries/Boundaries/RdfoxApi.cs @@ -21,7 +21,7 @@ public ConnectionSettings GetDefaultConnectionSettings() /// public async Task DeleteDatalog(string datalog) { - using (var client = new HttpClient()) + using (var client = conn.GetAuthenticatedClient()) { var uri = new Uri($"http://{conn.Host}:{conn.Port}/datastores/{conn.Datastore}/content?operation=delete-content"); var content = new StringContent(datalog, Encoding.UTF8, "application/x.datalog"); @@ -43,7 +43,7 @@ public async Task DeleteDatalog(string datalog) /// public async Task LoadDatalog(string datalog) { - using (var client = new HttpClient()) + using (var client = conn.GetAuthenticatedClient()) { var uri = new Uri($"http://{conn.Host}:{conn.Port}/datastores/{conn.Datastore}/content"); var content = new StringContent(datalog, Encoding.UTF8, "application/x.datalog"); @@ -66,7 +66,7 @@ public async Task LoadDatalog(string datalog) /// public async Task DeleteData(string data) { - using (var client = new HttpClient()) + using (var client = conn.GetAuthenticatedClient()) { var uri = new Uri($"http://{conn.Host}:{conn.Port}/datastores/{conn.Datastore}/content?operation=delete-content"); var content = new StringContent(data, Encoding.UTF8, "application/trig"); @@ -89,7 +89,7 @@ public async Task DeleteData(string data) /// public async Task LoadData(string data) { - using (var client = new HttpClient()) + using (var client = conn.GetAuthenticatedClient()) { var uri = new Uri($"http://{conn.Host}:{conn.Port}/datastores/{conn.Datastore}/content"); var content = new StringContent(data, Encoding.UTF8, "application/trig"); @@ -103,7 +103,7 @@ public async Task LoadData(string data) var response = await client.SendAsync(request); if (!response.IsSuccessStatusCode) throw new Exception(await response.Content.ReadAsStringAsync()); - response.EnsureSuccessStatusCode(); + } } @@ -115,7 +115,7 @@ public async Task LoadData(string data) /// public async Task QuerySparql( string query, string acceptHeader = "application/sparql-results+json") { - using (var client = new HttpClient()) + using (var client = conn.GetAuthenticatedClient()) { var uri = new Uri($"http://{conn.Host}:{conn.Port}/datastores/{conn.Datastore}/sparql"); var content = new StringContent(query, Encoding.UTF8, "application/sparql-query"); @@ -135,7 +135,7 @@ public async Task QuerySparql( string query, string acceptHeader = "appl public async Task AskSparql(string query) { - using (var client = new HttpClient()) + using (var client = conn.GetAuthenticatedClient()) { var uri = new Uri($"http://{conn.Host}:{conn.Port}/datastores/{conn.Datastore}/sparql"); var content = new StringContent(query, Encoding.UTF8, "application/sparql-query"); diff --git a/client/Boundaries/TestBoundaries/IntegrationTests.cs b/client/Boundaries/TestBoundaries/IntegrationTests.cs index 1ea588ef..48d50264 100644 --- a/client/Boundaries/TestBoundaries/IntegrationTests.cs +++ b/client/Boundaries/TestBoundaries/IntegrationTests.cs @@ -1,3 +1,6 @@ +using System.Net.Http.Json; +using Backend.Model; +using System.Text.Json; using Xunit.Abstractions; namespace TestBoundaries; @@ -14,9 +17,86 @@ public IntegrationTests(TestFactory factory, ITestOutputHelper testOutputHelper) } [Fact] - public void TestCreatePackage() + public async Task TestCreatePackage() { - var client = _factory.CreateClient(); + // Arrange + var client = _factory.CreateAuthenticatingClient(); + var commissioningPackage = new CommissioningPackage + { + Id = "package1", + Name = "Test Package", + Color = "Red" + }; + + // Act + // Act + var response = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); + + // Assert + if (!response.IsSuccessStatusCode) + { + var errorString = await response.Content.ReadAsStringAsync(); + _testOutputHelper.WriteLine($"Error: {response.StatusCode}"); + _testOutputHelper.WriteLine(errorString); + } + response.EnsureSuccessStatusCode(); + } + + [Fact] + public async Task TestGetAllPackages() + { + // Arrange + var client = _factory.CreateAuthenticatingClient(); + var commissioningPackage = new CommissioningPackage + { + Id = "package1", + Name = "Test Package", + Color = "Red" + }; + + var createresponse = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); + createresponse.EnsureSuccessStatusCode(); + + // Act + var response = await client.GetAsync("/commissioning-package/all"); + // Assert + if (!response.IsSuccessStatusCode) + { + var errorString = await response.Content.ReadAsStringAsync(); + _testOutputHelper.WriteLine($"Error: {response.StatusCode}"); + _testOutputHelper.WriteLine(errorString); + } + var package = await response.Content.ReadFromJsonAsync(); + response.EnsureSuccessStatusCode(); + } + + + [Fact] + public async Task TestGetAllPackageIds() + { + // Arrange + var client = _factory.CreateAuthenticatingClient(); + var commissioningPackage = new CommissioningPackage + { + Id = "package1", + Name = "Test Package", + Color = "Red" + }; + + var createresponse = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); + createresponse.EnsureSuccessStatusCode(); + // Act + var response = await client.GetAsync("/commissioning-package/ids"); + // Assert + if (!response.IsSuccessStatusCode) + { + var errorString = await response.Content.ReadAsStringAsync(); + _testOutputHelper.WriteLine($"Error: {response.StatusCode}"); + _testOutputHelper.WriteLine(errorString); + } + var stringResult = await response.Content.ReadAsStringAsync(); + var package = JsonSerializer.Deserialize>(stringResult); + response.EnsureSuccessStatusCode(); } } \ No newline at end of file diff --git a/client/Boundaries/TestBoundaries/TestBoundaries.cs b/client/Boundaries/TestBoundaries/TestBoundaries.cs new file mode 100644 index 00000000..dfe15ac4 --- /dev/null +++ b/client/Boundaries/TestBoundaries/TestBoundaries.cs @@ -0,0 +1,97 @@ +using System.Net.Http.Json; +using Backend.Model; +using Xunit; +using Xunit.Abstractions; +using FluentAssertions; + +namespace TestBoundaries; + +public class BoundaryIntegrationTests : IClassFixture +{ + private readonly TestFactory _factory; + private readonly ITestOutputHelper _testOutputHelper; + + public BoundaryIntegrationTests(TestFactory factory, ITestOutputHelper testOutputHelper) + { + _factory = factory; + _testOutputHelper = testOutputHelper; + var unused = _factory.CreateClient(); + } + + + [Fact] + public async Task TestAddBoundary() + { + // Arrange + var client = _factory.CreateAuthenticatingClient(); + var packageId = "packageX"; + var nodeId = "node1"; + + var commissioningPackage = new CommissioningPackage + { + Id = packageId, + Name = "Test Package", + Color = "Red" + }; + var responsePackage = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); + responsePackage.EnsureSuccessStatusCode(); + + // Act + var response = await client.PostAsync($"/commissioning-package/{packageId}/update-boundary/{nodeId}", null); + + // Assert + if (!response.IsSuccessStatusCode) + { + var errorString = await response.Content.ReadAsStringAsync(); + _testOutputHelper.WriteLine($"Error: {response.StatusCode}"); + _testOutputHelper.WriteLine(errorString); + } + response.EnsureSuccessStatusCode(); + } + + + [Fact] + public async Task TestAddBoundaryWithWrongPackage() + { + // Arrange + var client = _factory.CreateAuthenticatingClient(); + var packageId = $"package{Guid.NewGuid()}"; + var nodeId = "node1"; + + // Act + var response = await client.PostAsync($"/commissioning-package/{packageId}/update-boundary/{nodeId}", null); + + // Assert + response.StatusCode.Should().Be(System.Net.HttpStatusCode.NotFound); + } + + [Fact] + public async Task TestRemoveBoundary() + { + // Arrange + var client = _factory.CreateAuthenticatingClient(); + var packageId = $"package{Guid.NewGuid()}"; + var nodeId = "node1"; + + var commissioningPackage = new CommissioningPackage + { + Id = packageId, + Name = "Test Package", + Color = "Red" + }; + var responsePackage = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); + responsePackage.EnsureSuccessStatusCode(); + var addresponse = await client.PostAsync($"/commissioning-package/{packageId}/update-boundary/{nodeId}", null); + addresponse.EnsureSuccessStatusCode(); + + // Act + string nodeUri = $"/commissioning-package/{packageId}/boundary/{nodeId}"; + var message = new HttpRequestMessage() + { + Method = HttpMethod.Delete, + RequestUri = new Uri(client.BaseAddress ?? throw new Exception("Lacking client base adress"), nodeUri) + }; + var deleteresponse = await client.SendAsync(message); + deleteresponse.IsSuccessStatusCode.Should().BeTrue(); + } +} \ No newline at end of file diff --git a/client/Boundaries/TestBoundaries/TestBoundaries.csproj b/client/Boundaries/TestBoundaries/TestBoundaries.csproj index c6a8db89..3476896d 100644 --- a/client/Boundaries/TestBoundaries/TestBoundaries.csproj +++ b/client/Boundaries/TestBoundaries/TestBoundaries.csproj @@ -10,15 +10,16 @@ - - + + + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/client/Boundaries/TestBoundaries/TestFactory.cs b/client/Boundaries/TestBoundaries/TestFactory.cs index f702adcc..e2dc8388 100644 --- a/client/Boundaries/TestBoundaries/TestFactory.cs +++ b/client/Boundaries/TestBoundaries/TestFactory.cs @@ -1,4 +1,5 @@ -using System.Reflection; +using System.Net.Http.Headers; +using System.Reflection; using Boundaries; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; @@ -12,14 +13,13 @@ public class TestFactory : WebApplicationFactory, IAsyncLifetime { - private ContainerBuilder _rdfoxBuilder; - + private IContainer _rdfoxContainer; private string hostname; private int port; - // private readonly IContainer _initRdfoxDockerClient; - ITestOutputHelper _testOutputHelper; + + private readonly string _outputFolderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? throw new InvalidOperationException(); private string _tempRdfoxDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); private const string RdfoxUsername = "dexpi"; @@ -33,20 +33,7 @@ public TestFactory() File.WriteAllText(filePath, content); - // This tries to be as close as possible to the actual RDFox docker setup in terraform/bravo-webapi/packer/rdfox_initdb.sh - // _initRdfoxDockerClient = new ContainerBuilder() - // .WithImage("oxfordsemantic/rdfox-init:7.3") - // .WithBindMount($"{_outputFolderPath}/../../../../../../", "/home/rdfox/data/", AccessMode.ReadOnly) - // .WithBindMount(_tempRdfoxDirectory, "/home/rdfox/.RDFox", AccessMode.ReadWrite) - // .WithCommand("-license.file", "/home/rdfox/data/RDFox.lic", "-persistence", "file-sequence", "-request-logger", "elf", "init") - // .WithEnvironment("RDFOX_ROLE", RdfoxUsername) - // .WithEnvironment("RDFOX_PASSWORD", _rdfoxPassword) - // .WithWaitStrategy(Wait.ForUnixContainer()) - // .WithCleanUp(false) - // .Build(); - - // Set up an RDFox Testcontainer - _rdfoxBuilder = new ContainerBuilder() + _rdfoxContainer = new ContainerBuilder() .WithImage("oxfordsemantic/rdfox:7.3") .WithBindMount($"{_outputFolderPath}/../../../../../../", "/home/rdfox/data/", AccessMode.ReadOnly) .WithBindMount(_tempRdfoxDirectory, "/home/rdfox/.RDFox", AccessMode.ReadWrite) @@ -55,27 +42,29 @@ public TestFactory() .WithPortBinding(12110, true) .WithEnvironment("RDFOX_ROLE", RdfoxUsername) .WithEnvironment("RDFOX_PASSWORD", _rdfoxPassword) - .WithCleanUp(false) - .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(12110)); + .WithCleanUp(true) + .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(12110)) + .Build(); } - public void WithLogger(ITestOutputHelper testOutputHelper) - { - _testOutputHelper = testOutputHelper; - var logger = new TestOutputLoggerProvider(testOutputHelper); - _rdfoxBuilder = _rdfoxBuilder.WithLogger(logger.CreateLogger("dexpi")); - } + public async Task InitializeAsync() { - //await _initRdfoxDockerClient.StartAsync(); - _rdfoxContainer = _rdfoxBuilder.Build(); await _rdfoxContainer.StartAsync(); hostname = _rdfoxContainer.Hostname; port = _rdfoxContainer.GetMappedPublicPort(12110); return; } + public HttpClient CreateAuthenticatingClient(params string[] roles) + { + var client = CreateClient(); + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue(scheme: "TestAuthenticationScheme", + $"Bearer null"); + return client; + } protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.ConfigureServices(services => @@ -89,7 +78,7 @@ protected override void ConfigureWebHost(IWebHostBuilder builder) Port = port, Username = RdfoxUsername, Password = _rdfoxPassword, - Datastore = "" + Datastore = "boundaries" })); }); } @@ -97,6 +86,5 @@ protected override void ConfigureWebHost(IWebHostBuilder builder) public new async Task DisposeAsync() { await _rdfoxContainer.DisposeAsync(); - //await _initRdfoxDockerClient.DisposeAsync(); } } diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile index bf882bdd..465a35b4 100644 --- a/docker/backend/Dockerfile +++ b/docker/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /app COPY client/Boundaries/Backend/. ./Backend/ @@ -6,7 +6,7 @@ COPY client/Boundaries/Boundaries/. ./Boundaries/ RUN dotnet publish ./Backend -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime WORKDIR /app COPY --from=build /app/out ./ From ef7cc9c4e409e98ed70d4739050225f978b8f52d Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Fri, 7 Feb 2025 14:51:52 +0100 Subject: [PATCH 44/50] Updated workflow to dotnet 9 --- .github/workflows/rdf_tests.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rdf_tests.yml b/.github/workflows/rdf_tests.yml index ce9ed1c8..7849d347 100644 --- a/.github/workflows/rdf_tests.yml +++ b/.github/workflows/rdf_tests.yml @@ -7,7 +7,7 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 defaults: run: shell: bash @@ -16,6 +16,11 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Setup .NET + run: | + sudo add-apt-repository ppa:dotnet/backports + sudo apt-get update && sudo apt-get install -y dotnet-sdk-9.0 + - name: Set up JDK 19 uses: actions/setup-java@v4 with: From 60790333cee52f0e910b018334179db341227595 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Fri, 7 Feb 2025 14:55:20 +0100 Subject: [PATCH 45/50] dotnet correct install --- .github/workflows/pull_request_tester.yml | 6 +++--- .github/workflows/rdf_tests.yml | 5 ----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/.github/workflows/pull_request_tester.yml b/.github/workflows/pull_request_tester.yml index bd29cde7..2e0bb76d 100644 --- a/.github/workflows/pull_request_tester.yml +++ b/.github/workflows/pull_request_tester.yml @@ -16,9 +16,9 @@ jobs: uses: actions/checkout@v4 - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 8.0.x + run: | + sudo add-apt-repository ppa:dotnet/backports + sudo apt-get update && sudo apt-get install -y dotnet-sdk-9.0 - name: Restore dependencies run: dotnet restore ./client/Boundaries/Boundaries.sln diff --git a/.github/workflows/rdf_tests.yml b/.github/workflows/rdf_tests.yml index 7849d347..f35f4872 100644 --- a/.github/workflows/rdf_tests.yml +++ b/.github/workflows/rdf_tests.yml @@ -16,11 +16,6 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Setup .NET - run: | - sudo add-apt-repository ppa:dotnet/backports - sudo apt-get update && sudo apt-get install -y dotnet-sdk-9.0 - - name: Set up JDK 19 uses: actions/setup-java@v4 with: From 3186d82358d174aa791edaef2ff3b5c50e168274 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Fri, 7 Feb 2025 15:05:31 +0100 Subject: [PATCH 46/50] removed wrong file --- rml_mappings/graphics/graphic.trig | 3210 ---------------------------- 1 file changed, 3210 deletions(-) delete mode 100644 rml_mappings/graphics/graphic.trig diff --git a/rml_mappings/graphics/graphic.trig b/rml_mappings/graphics/graphic.trig deleted file mode 100644 index d36db2c8..00000000 --- a/rml_mappings/graphics/graphic.trig +++ /dev/null @@ -1,3210 +0,0 @@ -@prefix : . -@prefix asset: . -@prefix dexpi: . -@prefix graphic: . -@prefix imf: . -@prefix ql: . -@prefix rdf: . -@prefix rdfs: . -@prefix rml: . -@prefix rr: . -@prefix schema: . -@prefix xsd: . - -{ - _:C01_NOA1_MeasuringLineFunction-1_0_0_coordinate a graphic:Position; - graphic:x 4.12E2; - graphic:y 3.54E2 . - - _:C01_NOA1_MeasuringLineFunction-1_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_MeasuringLineFunction-1_0_0_coordinate; - rdf:rest _:C01_NOA1_MeasuringLineFunction-1_0_1_coordinateListLastElement . - - _:C01_NOA1_MeasuringLineFunction-1_0_1_coordinate a graphic:Position; - graphic:x 4.24E2; - graphic:y 3.54E2 . - - _:C01_NOA1_MeasuringLineFunction-1_0_1_coordinateListLastElement rdf:first _:C01_NOA1_MeasuringLineFunction-1_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_MeasuringLineFunction-1_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_MeasuringLineFunction-1_0_linestyle graphic:hasStroke _:C01_NOA1_MeasuringLineFunction-1_0_linestroke . - - _:C01_NOA1_MeasuringLineFunction-2_0_0_coordinate a graphic:Position; - graphic:x 3.01E2; - graphic:y 4.67999834195E2 . - - _:C01_NOA1_MeasuringLineFunction-2_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_MeasuringLineFunction-2_0_0_coordinate; - rdf:rest _:C01_NOA1_MeasuringLineFunction-2_0_1_coordinateListLastElement . - - _:C01_NOA1_MeasuringLineFunction-2_0_1_coordinate a graphic:Position; - graphic:x 3.01E2; - graphic:y 4.80999654278E2 . - - _:C01_NOA1_MeasuringLineFunction-2_0_1_coordinateListLastElement rdf:first _:C01_NOA1_MeasuringLineFunction-2_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_MeasuringLineFunction-2_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_MeasuringLineFunction-2_0_linestyle graphic:hasStroke _:C01_NOA1_MeasuringLineFunction-2_0_linestroke . - - _:C01_NOA1_MeasuringLineFunction-3_0_0_coordinate a graphic:Position; - graphic:x 4.0E2; - graphic:y 4.37E2 . - - _:C01_NOA1_MeasuringLineFunction-3_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_MeasuringLineFunction-3_0_0_coordinate; - rdf:rest _:C01_NOA1_MeasuringLineFunction-3_0_1_coordinateListLastElement . - - _:C01_NOA1_MeasuringLineFunction-3_0_1_coordinate a graphic:Position; - graphic:x 4.0E2; - graphic:y 4.61E2 . - - _:C01_NOA1_MeasuringLineFunction-3_0_1_coordinateListLastElement rdf:first _:C01_NOA1_MeasuringLineFunction-3_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_MeasuringLineFunction-3_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_MeasuringLineFunction-3_0_linestyle graphic:hasStroke _:C01_NOA1_MeasuringLineFunction-3_0_linestroke . - - _:C01_NOA1_MeasuringLineFunction-4_0_0_coordinate a graphic:Position; - graphic:x 6.07E2; - graphic:y 1.98E2 . - - _:C01_NOA1_MeasuringLineFunction-4_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_MeasuringLineFunction-4_0_0_coordinate; - rdf:rest _:C01_NOA1_MeasuringLineFunction-4_0_1_coordinateListLastElement . - - _:C01_NOA1_MeasuringLineFunction-4_0_1_coordinate a graphic:Position; - graphic:x 6.07E2; - graphic:y 2.16E2 . - - _:C01_NOA1_MeasuringLineFunction-4_0_1_coordinateListLastElement rdf:first _:C01_NOA1_MeasuringLineFunction-4_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_MeasuringLineFunction-4_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_MeasuringLineFunction-4_0_linestyle graphic:hasStroke _:C01_NOA1_MeasuringLineFunction-4_0_linestroke . - - _:C01_NOA1_MeasuringLineFunction-5_0_0_coordinate a graphic:Position; - graphic:x 7.5E2; - graphic:y 2.02E2 . - - _:C01_NOA1_MeasuringLineFunction-5_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_MeasuringLineFunction-5_0_0_coordinate; - rdf:rest _:C01_NOA1_MeasuringLineFunction-5_0_1_coordinateListLastElement . - - _:C01_NOA1_MeasuringLineFunction-5_0_1_coordinate a graphic:Position; - graphic:x 7.5E2; - graphic:y 2.16E2 . - - _:C01_NOA1_MeasuringLineFunction-5_0_1_coordinateListLastElement rdf:first _:C01_NOA1_MeasuringLineFunction-5_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_MeasuringLineFunction-5_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_MeasuringLineFunction-5_0_linestyle graphic:hasStroke _:C01_NOA1_MeasuringLineFunction-5_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-10_0_0_coordinate a graphic:Position; - graphic:x 3.61E2; - graphic:y 5.41E2 . - - _:C01_NOA1_PipingNetworkSegment-10_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-10_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-10_0_1_coordinateListElement . - - _:C01_NOA1_PipingNetworkSegment-10_0_1_coordinate a graphic:Position; - graphic:x 3.61E2; - graphic:y 5.58E2 . - - _:C01_NOA1_PipingNetworkSegment-10_0_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-10_0_1_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-10_0_2_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-10_0_2_coordinate a graphic:Position; - graphic:x 5.62E2; - graphic:y 5.58E2 . - - _:C01_NOA1_PipingNetworkSegment-10_0_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-10_0_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-10_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-10_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-10_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-11_0_0_coordinate a graphic:Position; - graphic:x 3.9E2; - graphic:y 3.29E2 . - - _:C01_NOA1_PipingNetworkSegment-11_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-11_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-11_0_1_coordinate a graphic:Position; - graphic:x 3.9E2; - graphic:y 3.08E2 . - - _:C01_NOA1_PipingNetworkSegment-11_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-11_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-11_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-11_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-11_1_0_coordinate a graphic:Position; - graphic:x 3.9E2; - graphic:y 3.0E2 . - - _:C01_NOA1_PipingNetworkSegment-11_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_1_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-11_1_1_coordinateListElement . - - _:C01_NOA1_PipingNetworkSegment-11_1_1_coordinate a graphic:Position; - graphic:x 3.9E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-11_1_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_1_1_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-11_1_2_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-11_1_2_coordinate a graphic:Position; - graphic:x 4.21E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-11_1_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_1_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-11_1_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-11_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-11_1_linestroke . - - _:C01_NOA1_PipingNetworkSegment-11_2_0_coordinate a graphic:Position; - graphic:x 4.29E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-11_2_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_2_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-11_2_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-11_2_1_coordinate a graphic:Position; - graphic:x 4.42E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-11_2_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-11_2_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-11_2_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-11_2_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-11_2_linestroke . - - _:C01_NOA1_PipingNetworkSegment-12_0_0_coordinate a graphic:Position; - graphic:x 5.02E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-12_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-12_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-12_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-12_0_1_coordinate a graphic:Position; - graphic:x 5.18E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-12_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-12_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-12_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-12_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-12_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-12_1_0_coordinate a graphic:Position; - graphic:x 5.26E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-12_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-12_1_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-12_1_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-12_1_1_coordinate a graphic:Position; - graphic:x 5.38E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-12_1_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-12_1_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-12_1_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-12_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-12_1_linestroke . - - _:C01_NOA1_PipingNetworkSegment-13_0_0_coordinate a graphic:Position; - graphic:x 7.14E2; - graphic:y 1.44E2 . - - _:C01_NOA1_PipingNetworkSegment-13_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-13_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-13_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-13_0_1_coordinate a graphic:Position; - graphic:x 7.14E2; - graphic:y 2.55E2 . - - _:C01_NOA1_PipingNetworkSegment-13_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-13_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-13_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-13_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-13_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-14_0_0_coordinate a graphic:Position; - graphic:x 6.62E2; - graphic:y 2.83E2 . - - _:C01_NOA1_PipingNetworkSegment-14_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-14_0_1_coordinateListElement . - - _:C01_NOA1_PipingNetworkSegment-14_0_1_coordinate a graphic:Position; - graphic:x 6.62E2; - graphic:y 2.99E2 . - - _:C01_NOA1_PipingNetworkSegment-14_0_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_0_1_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-14_0_2_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-14_0_2_coordinate a graphic:Position; - graphic:x 6.76E2; - graphic:y 2.99E2 . - - _:C01_NOA1_PipingNetworkSegment-14_0_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_0_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-14_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-14_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-14_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-14_1_0_coordinate a graphic:Position; - graphic:x 6.84E2; - graphic:y 2.99E2 . - - _:C01_NOA1_PipingNetworkSegment-14_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_1_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-14_1_1_coordinateListElement . - - _:C01_NOA1_PipingNetworkSegment-14_1_1_coordinate a graphic:Position; - graphic:x 7.32E2; - graphic:y 2.99E2 . - - _:C01_NOA1_PipingNetworkSegment-14_1_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_1_1_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-14_1_2_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-14_1_2_coordinate a graphic:Position; - graphic:x 7.32E2; - graphic:y 1.58E2 . - - _:C01_NOA1_PipingNetworkSegment-14_1_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-14_1_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-14_1_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-14_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-14_1_linestroke . - - _:C01_NOA1_PipingNetworkSegment-15_0_0_coordinate a graphic:Position; - graphic:x 7.32E2; - graphic:y 1.49E2 . - - _:C01_NOA1_PipingNetworkSegment-15_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-15_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-15_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-15_0_1_coordinate a graphic:Position; - graphic:x 7.32E2; - graphic:y 9.4E1 . - - _:C01_NOA1_PipingNetworkSegment-15_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-15_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-15_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-15_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-15_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-17_0_0_coordinate a graphic:Position; - graphic:x 5.66E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-17_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-17_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-17_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-17_0_1_coordinate a graphic:Position; - graphic:x 5.72E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-17_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-17_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-17_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-17_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-17_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-18_0_0_coordinate a graphic:Position; - graphic:x 5.72E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-18_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-18_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-18_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-18_0_1_coordinate a graphic:Position; - graphic:x 5.72E2; - graphic:y 1.69E2 . - - _:C01_NOA1_PipingNetworkSegment-18_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-18_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-18_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-18_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-18_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-19_0_0_coordinate a graphic:Position; - graphic:x 5.72E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-19_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-19_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-19_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-19_0_1_coordinate a graphic:Position; - graphic:x 5.87E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-19_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-19_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-19_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-19_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-19_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-20_0_0_coordinate a graphic:Position; - graphic:x 5.87E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-20_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-20_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-20_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-20_0_1_coordinate a graphic:Position; - graphic:x 6.07E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-20_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-20_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-20_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-20_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-20_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-21_0_0_coordinate a graphic:Position; - graphic:x 6.07E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-21_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-21_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-21_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-21_0_1_coordinate a graphic:Position; - graphic:x 6.07E2; - graphic:y 1.9E2 . - - _:C01_NOA1_PipingNetworkSegment-21_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-21_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-21_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-21_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-21_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-22_0_0_coordinate a graphic:Position; - graphic:x 6.07E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-22_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-22_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-22_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-22_0_1_coordinate a graphic:Position; - graphic:x 6.22E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-22_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-22_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-22_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-22_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-22_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-22_1_0_coordinate a graphic:Position; - graphic:x 6.3E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-22_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-22_1_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-22_1_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-22_1_1_coordinate a graphic:Position; - graphic:x 6.46E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-22_1_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-22_1_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-22_1_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-22_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-22_1_linestroke . - - _:C01_NOA1_PipingNetworkSegment-23_0_0_coordinate a graphic:Position; - graphic:x 6.46E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-23_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-23_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-23_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-23_0_1_coordinate a graphic:Position; - graphic:x 7.5E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-23_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-23_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-23_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-23_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-23_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-24_0_0_coordinate a graphic:Position; - graphic:x 7.5E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-24_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-24_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-24_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-24_0_1_coordinate a graphic:Position; - graphic:x 7.5E2; - graphic:y 1.94E2 . - - _:C01_NOA1_PipingNetworkSegment-24_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-24_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-24_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-24_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-24_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-25_0_0_coordinate a graphic:Position; - graphic:x 7.5E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-25_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-25_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-25_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-25_0_1_coordinate a graphic:Position; - graphic:x 7.68E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-25_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-25_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-25_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-25_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-25_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-26_0_0_coordinate a graphic:Position; - graphic:x 5.87E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-26_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-26_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-26_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-26_0_1_coordinate a graphic:Position; - graphic:x 5.87E2; - graphic:y 3.75E2 . - - _:C01_NOA1_PipingNetworkSegment-26_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-26_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-26_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-26_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-26_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-27_0_0_coordinate a graphic:Position; - graphic:x 5.83E2; - graphic:y 3.79E2 . - - _:C01_NOA1_PipingNetworkSegment-27_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-27_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-27_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-27_0_1_coordinate a graphic:Position; - graphic:x 4.12E2; - graphic:y 3.79E2 . - - _:C01_NOA1_PipingNetworkSegment-27_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-27_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-27_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-27_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-27_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-28_0_0_coordinate a graphic:Position; - graphic:x 6.46E2; - graphic:y 1.8E2 . - - _:C01_NOA1_PipingNetworkSegment-28_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-28_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-28_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-28_0_1_coordinate a graphic:Position; - graphic:x 6.46E2; - graphic:y 2.55E2 . - - _:C01_NOA1_PipingNetworkSegment-28_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-28_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-28_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-28_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-28_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-29_0_0_coordinate a graphic:Position; - graphic:x 6.46E2; - graphic:y 2.83E2 . - - _:C01_NOA1_PipingNetworkSegment-29_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-29_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-29_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-29_0_1_coordinate a graphic:Position; - graphic:x 6.46E2; - graphic:y 3.98E2 . - - _:C01_NOA1_PipingNetworkSegment-29_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-29_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-29_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-29_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-29_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-29_1_0_coordinate a graphic:Position; - graphic:x 6.46E2; - graphic:y 4.06E2 . - - _:C01_NOA1_PipingNetworkSegment-29_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-29_1_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-29_1_1_coordinateListElement . - - _:C01_NOA1_PipingNetworkSegment-29_1_1_coordinate a graphic:Position; - graphic:x 6.46E2; - graphic:y 4.14E2 . - - _:C01_NOA1_PipingNetworkSegment-29_1_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-29_1_1_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-29_1_2_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-29_1_2_coordinate a graphic:Position; - graphic:x 4.12E2; - graphic:y 4.14E2 . - - _:C01_NOA1_PipingNetworkSegment-29_1_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-29_1_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-29_1_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-29_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-29_1_linestroke . - - _:C01_NOA1_PipingNetworkSegment-30_0_0_coordinate a graphic:Position; - graphic:x 4.42E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-30_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-30_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-30_0_1_coordinate a graphic:Position; - graphic:x 4.54E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-30_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-30_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-30_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-30_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-30_1_0_coordinate a graphic:Position; - graphic:x 4.66E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-30_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_1_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-30_1_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-30_1_1_coordinate a graphic:Position; - graphic:x 4.76E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-30_1_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_1_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-30_1_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-30_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-30_1_linestroke . - - _:C01_NOA1_PipingNetworkSegment-30_2_0_coordinate a graphic:Position; - graphic:x 4.84E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-30_2_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_2_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-30_2_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-30_2_1_coordinate a graphic:Position; - graphic:x 4.98E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-30_2_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-30_2_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-30_2_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-30_2_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-30_2_linestroke . - - _:C01_NOA1_PipingNetworkSegment-31_0_0_coordinate a graphic:Position; - graphic:x 4.42E2; - graphic:y 1.72E2 . - - _:C01_NOA1_PipingNetworkSegment-31_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-31_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-31_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-31_0_1_coordinate a graphic:Position; - graphic:x 4.42E2; - graphic:y 1.56E2 . - - _:C01_NOA1_PipingNetworkSegment-31_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-31_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-31_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-31_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-31_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-3_0_0_coordinate a graphic:Position; - graphic:x 8.5E1; - graphic:y 3.56E2 . - - _:C01_NOA1_PipingNetworkSegment-3_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-3_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-3_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-3_0_1_coordinate a graphic:Position; - graphic:x 1.45E2; - graphic:y 3.56E2 . - - _:C01_NOA1_PipingNetworkSegment-3_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-3_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-3_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-3_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-3_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-4_0_0_coordinate a graphic:Position; - graphic:x 1.73E2; - graphic:y 3.64E2 . - - _:C01_NOA1_PipingNetworkSegment-4_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-4_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-4_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-4_0_1_coordinate a graphic:Position; - graphic:x 2.3E2; - graphic:y 3.64E2 . - - _:C01_NOA1_PipingNetworkSegment-4_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-4_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-4_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-4_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-4_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-5_0_0_coordinate a graphic:Position; - graphic:x 2.3E2; - graphic:y 3.8E2 . - - _:C01_NOA1_PipingNetworkSegment-5_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-5_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-5_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-5_0_1_coordinate a graphic:Position; - graphic:x 1.72E2; - graphic:y 3.8E2 . - - _:C01_NOA1_PipingNetworkSegment-5_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-5_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-5_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-5_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-5_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-6_0_0_coordinate a graphic:Position; - graphic:x 3.32E2; - graphic:y 3.64E2 . - - _:C01_NOA1_PipingNetworkSegment-6_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-6_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-6_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-6_0_1_coordinate a graphic:Position; - graphic:x 2.74E2; - graphic:y 3.64E2 . - - _:C01_NOA1_PipingNetworkSegment-6_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-6_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-6_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-6_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-6_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-7_0_0_coordinate a graphic:Position; - graphic:x 2.74E2; - graphic:y 3.8E2 . - - _:C01_NOA1_PipingNetworkSegment-7_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-7_0_1_coordinateListElement . - - _:C01_NOA1_PipingNetworkSegment-7_0_1_coordinate a graphic:Position; - graphic:x 2.92E2; - graphic:y 3.8E2 . - - _:C01_NOA1_PipingNetworkSegment-7_0_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_0_1_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-7_0_2_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-7_0_2_coordinate a graphic:Position; - graphic:x 2.92E2; - graphic:y 4.3E2 . - - _:C01_NOA1_PipingNetworkSegment-7_0_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_0_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-7_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-7_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-7_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-7_1_0_coordinate a graphic:Position; - graphic:x 2.92E2; - graphic:y 4.38E2 . - - _:C01_NOA1_PipingNetworkSegment-7_1_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_1_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-7_1_1_coordinateListElement . - - _:C01_NOA1_PipingNetworkSegment-7_1_1_coordinate a graphic:Position; - graphic:x 2.92E2; - graphic:y 4.67E2 . - - _:C01_NOA1_PipingNetworkSegment-7_1_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_1_1_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-7_1_2_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-7_1_2_coordinate a graphic:Position; - graphic:x 3.01E2; - graphic:y 4.67E2 . - - _:C01_NOA1_PipingNetworkSegment-7_1_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_1_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-7_1_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-7_1_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-7_1_linestroke . - - _:C01_NOA1_PipingNetworkSegment-7_2_0_coordinate a graphic:Position; - graphic:x 3.01E2; - graphic:y 4.67E2 . - - _:C01_NOA1_PipingNetworkSegment-7_2_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_2_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-7_2_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-7_2_1_coordinate a graphic:Position; - graphic:x 3.61E2; - graphic:y 4.67E2 . - - _:C01_NOA1_PipingNetworkSegment-7_2_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-7_2_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-7_2_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-7_2_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-7_2_linestroke . - - _:C01_NOA1_PipingNetworkSegment-8_0_0_coordinate a graphic:Position; - graphic:x 3.61E2; - graphic:y 4.67E2 . - - _:C01_NOA1_PipingNetworkSegment-8_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-8_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-8_0_1_coordinateListElement . - - _:C01_NOA1_PipingNetworkSegment-8_0_1_coordinate a graphic:Position; - graphic:x 3.8E2; - graphic:y 4.67E2 . - - _:C01_NOA1_PipingNetworkSegment-8_0_1_coordinateListElement rdf:first _:C01_NOA1_PipingNetworkSegment-8_0_1_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-8_0_2_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-8_0_2_coordinate a graphic:Position; - graphic:x 3.8E2; - graphic:y 4.37E2 . - - _:C01_NOA1_PipingNetworkSegment-8_0_2_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-8_0_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-8_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-8_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-8_0_linestroke . - - _:C01_NOA1_PipingNetworkSegment-9_0_0_coordinate a graphic:Position; - graphic:x 3.61E2; - graphic:y 4.67E2 . - - _:C01_NOA1_PipingNetworkSegment-9_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_PipingNetworkSegment-9_0_0_coordinate; - rdf:rest _:C01_NOA1_PipingNetworkSegment-9_0_1_coordinateListLastElement . - - _:C01_NOA1_PipingNetworkSegment-9_0_1_coordinate a graphic:Position; - graphic:x 3.61E2; - graphic:y 5.21E2 . - - _:C01_NOA1_PipingNetworkSegment-9_0_1_coordinateListLastElement rdf:first _:C01_NOA1_PipingNetworkSegment-9_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_PipingNetworkSegment-9_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_PipingNetworkSegment-9_0_linestyle graphic:hasStroke _:C01_NOA1_PipingNetworkSegment-9_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-10_0_0_coordinate a graphic:Position; - graphic:x 3.01E2; - graphic:y 4.93E2 . - - _:C01_NOA1_SignalConveyingFunction-10_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-10_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-10_0_1_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-10_0_1_coordinate a graphic:Position; - graphic:x 3.01E2; - graphic:y 5.01E2 . - - _:C01_NOA1_SignalConveyingFunction-10_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-10_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-10_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-10_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-10_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-13_0_0_coordinate a graphic:Position; - graphic:x 4.13E2; - graphic:y 2.12E2 . - - _:C01_NOA1_SignalConveyingFunction-13_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-13_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-13_0_1_coordinateListElement . - - _:C01_NOA1_SignalConveyingFunction-13_0_1_coordinate a graphic:Position; - graphic:x 4.25E2; - graphic:y 2.12E2 . - - _:C01_NOA1_SignalConveyingFunction-13_0_1_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-13_0_1_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-13_0_2_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-13_0_2_coordinate a graphic:Position; - graphic:x 4.25E2; - graphic:y 1.85E2 . - - _:C01_NOA1_SignalConveyingFunction-13_0_2_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-13_0_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-13_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-13_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-13_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-14_0_0_coordinate a graphic:Position; - graphic:x 4.25E2; - graphic:y 2.23E2 . - - _:C01_NOA1_SignalConveyingFunction-14_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-14_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-14_0_1_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-14_0_1_coordinate a graphic:Position; - graphic:x 4.25E2; - graphic:y 1.85E2 . - - _:C01_NOA1_SignalConveyingFunction-14_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-14_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-14_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-14_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-14_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-15_0_0_coordinate a graphic:Position; - graphic:x 4.41E2; - graphic:y 2.23E2 . - - _:C01_NOA1_SignalConveyingFunction-15_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-15_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-15_0_1_coordinateListElement . - - _:C01_NOA1_SignalConveyingFunction-15_0_1_coordinate a graphic:Position; - graphic:x 4.41E2; - graphic:y 2.12E2 . - - _:C01_NOA1_SignalConveyingFunction-15_0_1_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-15_0_1_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-15_0_2_coordinateListElement . - - _:C01_NOA1_SignalConveyingFunction-15_0_2_coordinate a graphic:Position; - graphic:x 4.25E2; - graphic:y 2.12E2 . - - _:C01_NOA1_SignalConveyingFunction-15_0_2_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-15_0_2_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-15_0_3_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-15_0_3_coordinate a graphic:Position; - graphic:x 4.25E2; - graphic:y 1.85E2 . - - _:C01_NOA1_SignalConveyingFunction-15_0_3_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-15_0_3_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-15_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-15_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-15_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-16_0_0_coordinate a graphic:Position; - graphic:x 6.8E2; - graphic:y 4.61E2 . - - _:C01_NOA1_SignalConveyingFunction-16_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-16_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-16_0_1_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-16_0_1_coordinate a graphic:Position; - graphic:x 6.8E2; - graphic:y 3.12E2 . - - _:C01_NOA1_SignalConveyingFunction-16_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-16_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-16_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-16_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-16_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-17_0_0_coordinate a graphic:Position; - graphic:x 4.06E2; - graphic:y 4.67E2 . - - _:C01_NOA1_SignalConveyingFunction-17_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-17_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-17_0_1_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-17_0_1_coordinate a graphic:Position; - graphic:x 6.74E2; - graphic:y 4.67E2 . - - _:C01_NOA1_SignalConveyingFunction-17_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-17_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-17_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-17_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-17_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-18_0_0_coordinate a graphic:Position; - graphic:x 7.5E2; - graphic:y 2.28E2 . - - _:C01_NOA1_SignalConveyingFunction-18_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-18_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-18_0_1_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-18_0_1_coordinate a graphic:Position; - graphic:x 7.5E2; - graphic:y 2.41E2 . - - _:C01_NOA1_SignalConveyingFunction-18_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-18_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-18_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-18_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-18_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-19_0_0_coordinate a graphic:Position; - graphic:x 7.5E2; - graphic:y 2.53E2 . - - _:C01_NOA1_SignalConveyingFunction-19_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-19_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-19_0_1_coordinateListElement . - - _:C01_NOA1_SignalConveyingFunction-19_0_1_coordinate a graphic:Position; - graphic:x 7.5E2; - graphic:y 4.02E2 . - - _:C01_NOA1_SignalConveyingFunction-19_0_1_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-19_0_1_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-19_0_2_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-19_0_2_coordinate a graphic:Position; - graphic:x 6.55E2; - graphic:y 4.02E2 . - - _:C01_NOA1_SignalConveyingFunction-19_0_2_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-19_0_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-19_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-19_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-19_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-1_0_0_coordinate a graphic:Position; - graphic:x 3.51E2; - graphic:y 5.31E2 . - - _:C01_NOA1_SignalConveyingFunction-1_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-1_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-1_0_1_coordinateListElement . - - _:C01_NOA1_SignalConveyingFunction-1_0_1_coordinate a graphic:Position; - graphic:x 3.31E2; - graphic:y 5.31E2 . - - _:C01_NOA1_SignalConveyingFunction-1_0_1_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-1_0_1_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-1_0_2_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-1_0_2_coordinate a graphic:Position; - graphic:x 3.31E2; - graphic:y 5.38E2 . - - _:C01_NOA1_SignalConveyingFunction-1_0_2_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-1_0_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-1_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-1_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-1_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-2_0_0_coordinate a graphic:Position; - graphic:x 3.36E2; - graphic:y 5.4E2 . - - _:C01_NOA1_SignalConveyingFunction-2_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-2_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-2_0_1_coordinateListElement . - - _:C01_NOA1_SignalConveyingFunction-2_0_1_coordinate a graphic:Position; - graphic:x 3.41E2; - graphic:y 5.4E2 . - - _:C01_NOA1_SignalConveyingFunction-2_0_1_coordinateListElement rdf:first _:C01_NOA1_SignalConveyingFunction-2_0_1_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-2_0_2_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-2_0_2_coordinate a graphic:Position; - graphic:x 3.41E2; - graphic:y 5.54E2 . - - _:C01_NOA1_SignalConveyingFunction-2_0_2_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-2_0_2_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-2_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-2_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-2_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-3_0_0_coordinate a graphic:Position; - graphic:x 3.26E2; - graphic:y 5.4E2 . - - _:C01_NOA1_SignalConveyingFunction-3_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-3_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-3_0_1_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-3_0_1_coordinate a graphic:Position; - graphic:x 3.17E2; - graphic:y 5.4E2 . - - _:C01_NOA1_SignalConveyingFunction-3_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-3_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-3_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-3_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-3_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-4_0_0_coordinate a graphic:Position; - graphic:x 4.36E2; - graphic:y 3.54E2 . - - _:C01_NOA1_SignalConveyingFunction-4_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-4_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-4_0_1_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-4_0_1_coordinate a graphic:Position; - graphic:x 4.64E2; - graphic:y 3.54E2 . - - _:C01_NOA1_SignalConveyingFunction-4_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-4_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-4_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-4_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-4_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-8_0_0_coordinate a graphic:Position; - graphic:x 4.76E2; - graphic:y 3.54E2 . - - _:C01_NOA1_SignalConveyingFunction-8_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-8_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-8_0_1_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-8_0_1_coordinate a graphic:Position; - graphic:x 7.68E2; - graphic:y 3.54E2 . - - _:C01_NOA1_SignalConveyingFunction-8_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-8_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-8_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-8_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-8_0_linestroke . - - _:C01_NOA1_SignalConveyingFunction-9_0_0_coordinate a graphic:Position; - graphic:x 2.56E2; - graphic:y 4.34E2 . - - _:C01_NOA1_SignalConveyingFunction-9_0_0_coordinateListFirstElement rdf:first _:C01_NOA1_SignalConveyingFunction-9_0_0_coordinate; - rdf:rest _:C01_NOA1_SignalConveyingFunction-9_0_1_coordinateListLastElement . - - _:C01_NOA1_SignalConveyingFunction-9_0_1_coordinate a graphic:Position; - graphic:x 2.79E2; - graphic:y 4.34E2 . - - _:C01_NOA1_SignalConveyingFunction-9_0_1_coordinateListLastElement rdf:first _:C01_NOA1_SignalConveyingFunction-9_0_1_coordinate; - rdf:rest rdf:nil . - - _:C01_NOA1_SignalConveyingFunction-9_0_linestroke a graphic:Stroke; - graphic:dasharray "none"; - graphic:width 2.5E-1 . - - _:C01_NOA1_SignalConveyingFunction-9_0_linestyle graphic:hasStroke _:C01_NOA1_SignalConveyingFunction-9_0_linestroke . - - _:C01_NOA1_extent a graphic:Extent; - graphic:maximumExtent _:C01_NOA1_maximumExtent; - graphic:minimumExtent _:C01_NOA1_minimumExtent . - - _:C01_NOA1_maximumExtent a graphic:Position; - graphic:x 8.41E2; - graphic:y 5.94E2 . - - _:C01_NOA1_minimumExtent a graphic:Position; - graphic:x 0.0E0; - graphic:y 0.0E0 . - - _:position_BallValve-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.22E2; - graphic:y 4.22E2 . - - _:position_BallValve-2_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 5.72E2; - graphic:y 4.29E2 . - - _:position_BallValve-3_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.26E2; - graphic:y 4.14E2 . - - _:position_BallValve-4_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 4.42E2; - graphic:y 4.42E2 . - - _:position_BlindFlange-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.7E2; - graphic:y 2.4E2 . - - _:position_ButterflyValve-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 3.9E2; - graphic:y 2.9E2 . - - _:position_CentrifugalPump-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.52E2; - graphic:y 4.22E2 . - - _:position_CheckValve-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.8E2; - graphic:y 4.22E2 . - - _:position_ControlledActuator-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 2.92E2; - graphic:y 1.6E2 . - - _:position_ControlledActuator-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.25E2; - graphic:y 4.22E2 . - - _:position_ControlledActuator-3_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.8E2; - graphic:y 2.95E2 . - - _:position_ControlledActuator-4_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 6.46E2; - graphic:y 1.92E2 . - - _:position_CustomHeatExchanger-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.82E2; - graphic:y 3.25E2 . - - _:position_CustomInlinePrimaryElement-1-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.85E2; - graphic:y 1.11E2 . - - _:position_CustomInlinePrimaryElement-1_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 3.01E2; - graphic:y 1.27E2 . - - _:position_CustomInlinePrimaryElement-2-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.69E2; - graphic:y 4.06E2 . - - _:position_CustomInlinePrimaryElement-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.6E2; - graphic:y 4.22E2 . - - _:position_CustomOperatedValve-1-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.41E2; - graphic:y 4.06E2 . - - _:position_CustomOperatedValve-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.25E2; - graphic:y 4.22E2 . - - _:position_CustomPipingComponent-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 3.9E2; - graphic:y 2.63E2 . - - _:position_CustomPipingComponent-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.32E2; - graphic:y 4.4E2 . - - _:position_ElectricHeater-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.51E2; - graphic:y 6.3E1 . - - _:position_Flange-10_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 3.61E2; - graphic:y 5.3E1 . - - _:position_Flange-11_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.38E2; - graphic:y 4.22E2 . - - _:position_Flange-12_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 7.14E2; - graphic:y 3.37E2 . - - _:position_Flange-13_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 6.62E2; - graphic:y 3.11E2 . - - _:position_Flange-14_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 4.0E2; - graphic:y 1.57E2 . - - _:position_Flange-15_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.64E2; - graphic:y 4.14E2 . - - _:position_Flange-16_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.1E2; - graphic:y 2.15E2 . - - _:position_Flange-17_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 6.46E2; - graphic:y 3.37E2 . - - _:position_Flange-18_position graphic:rotation 9.0E1; - graphic:x 6.46E2; - graphic:y 3.11E2; - a graphic:Position . - - _:position_Flange-19_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.1E2; - graphic:y 1.8E2 . - - _:position_Flange-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.1E2; - graphic:y 2.4E2 . - - _:position_Flange-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.45E2; - graphic:y 2.38E2 . - - _:position_Flange-3_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.71E2; - graphic:y 2.3E2 . - - _:position_Flange-4_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.3E2; - graphic:y 2.3E2 . - - _:position_Flange-5_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.3E2; - graphic:y 2.14E2 . - - _:position_Flange-6_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.72E2; - graphic:y 2.3E2 . - - _:position_Flange-7_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.72E2; - graphic:y 2.14E2 . - - _:position_Flange-8_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 3.8E2; - graphic:y 1.57E2 . - - _:position_Flange-9_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 3.61E2; - graphic:y 7.1E1 . - - _:position_FlowInPipeOffPageConnector-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.1E1; - graphic:y 2.38E2 . - - _:position_FlowOutPipeOffPageConnector-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.88E2; - graphic:y 4.14E2 . - - _:position_FlowOutSignalOffPageConnector-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.88E2; - graphic:y 2.4E2 . - - _:position_GateValve-1-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.76E2; - graphic:y 1.44E2 . - - _:position_GateValve-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 2.92E2; - graphic:y 1.6E2 . - - _:position_GateValve-2-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.96E2; - graphic:y 2.79E2 . - - _:position_GateValve-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.8E2; - graphic:y 2.95E2 . - - _:position_GateValve-3_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 6.07E2; - graphic:y 4.0E2 . - - _:position_GateValve-4_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 7.5E2; - graphic:y 3.96E2 . - - _:position_GateValve-5-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.62E2; - graphic:y 1.76E2 . - - _:position_GateValve-5_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 6.46E2; - graphic:y 1.92E2 . - - _:position_InstrumentationNodePosition-10_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.68E2; - graphic:y 2.4E2 . - - _:position_InstrumentationNodePosition-11_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.64E2; - graphic:y 2.4E2 . - - _:position_InstrumentationNodePosition-12_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.76E2; - graphic:y 2.4E2 . - - _:position_InstrumentationNodePosition-13_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.56E2; - graphic:y 1.6E2 . - - _:position_InstrumentationNodePosition-14_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.79E2; - graphic:y 1.6E2 . - - _:position_InstrumentationNodePosition-15_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.01E2; - graphic:y 1.01E2 . - - _:position_InstrumentationNodePosition-16_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.01E2; - graphic:y 9.3E1 . - - _:position_InstrumentationNodePosition-17_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.13E2; - graphic:y 3.82E2 . - - _:position_InstrumentationNodePosition-18_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.25E2; - graphic:y 3.71E2 . - - _:position_InstrumentationNodePosition-19_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.41E2; - graphic:y 3.71E2 . - - _:position_InstrumentationNodePosition-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.51E2; - graphic:y 6.3E1 . - - _:position_InstrumentationNodePosition-20_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.25E2; - graphic:y 4.09E2 . - - _:position_InstrumentationNodePosition-21_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.25E2; - graphic:y 4.09E2 . - - _:position_InstrumentationNodePosition-22_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.25E2; - graphic:y 4.09E2 . - - _:position_InstrumentationNodePosition-23_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.8E2; - graphic:y 1.33E2 . - - _:position_InstrumentationNodePosition-24_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.74E2; - graphic:y 1.27E2 . - - _:position_InstrumentationNodePosition-25_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.8E2; - graphic:y 2.82E2 . - - _:position_InstrumentationNodePosition-26_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.0E2; - graphic:y 1.57E2 . - - _:position_InstrumentationNodePosition-27_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.0E2; - graphic:y 1.33E2 . - - _:position_InstrumentationNodePosition-28_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.06E2; - graphic:y 1.27E2 . - - _:position_InstrumentationNodePosition-29_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.07E2; - graphic:y 3.96E2 . - - _:position_InstrumentationNodePosition-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.31E2; - graphic:y 5.6E1 . - - _:position_InstrumentationNodePosition-30_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 3.92E2 . - - _:position_InstrumentationNodePosition-31_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.07E2; - graphic:y 3.78E2 . - - _:position_InstrumentationNodePosition-32_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 3.78E2 . - - _:position_InstrumentationNodePosition-33_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 3.66E2 . - - _:position_InstrumentationNodePosition-34_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.55E2; - graphic:y 1.92E2 . - - _:position_InstrumentationNodePosition-35_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 3.41E2 . - - _:position_InstrumentationNodePosition-36_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 3.53E2 . - - _:position_InstrumentationNodePosition-37_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.01E2; - graphic:y 1.26000165805E2 . - - _:position_InstrumentationNodePosition-38_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.01E2; - graphic:y 1.1300034572200002E2 . - - _:position_InstrumentationNodePosition-3_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.26E2; - graphic:y 5.4E1 . - - _:position_InstrumentationNodePosition-4_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.36E2; - graphic:y 5.4E1 . - - _:position_InstrumentationNodePosition-5_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.41E2; - graphic:y 4.0E1 . - - _:position_InstrumentationNodePosition-6_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.17E2; - graphic:y 5.4E1 . - - _:position_InstrumentationNodePosition-7_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.12E2; - graphic:y 2.4E2 . - - _:position_InstrumentationNodePosition-8_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.24E2; - graphic:y 2.4E2 . - - _:position_InstrumentationNodePosition-9_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.36E2; - graphic:y 2.4E2 . - - _:position_Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 0.0E0; - graphic:y 0.0E0 . - - _:position_Nozzle-10_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 3.8E2; - graphic:y 1.63E2 . - - _:position_Nozzle-11_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 3.9E2; - graphic:y 2.57E2 . - - _:position_Nozzle-12_position a graphic:Position; - graphic:rotation 1.8E2; - graphic:x 3.74E2; - graphic:y 2.4E2 . - - _:position_Nozzle-13_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.06E2; - graphic:y 2.4E2 . - - _:position_Nozzle-14_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.06E2; - graphic:y 2.15E2 . - - _:position_Nozzle-15_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.06E2; - graphic:y 1.8E2 . - - _:position_Nozzle-16_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 4.0E2; - graphic:y 1.63E2 . - - _:position_Nozzle-17_position a graphic:Position; - graphic:rotation 1.8E2; - graphic:x 3.74E2; - graphic:y 2.12E2 . - - _:position_Nozzle-18_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.52E2; - graphic:y 4.22E2 . - - _:position_Nozzle-19_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.52E2; - graphic:y 4.14E2 . - - _:position_Nozzle-1_position a graphic:Position; - graphic:rotation 1.8E2; - graphic:x 1.51E2; - graphic:y 2.38E2 . - - _:position_Nozzle-20_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 6.46E2; - graphic:y 3.33E2 . - - _:position_Nozzle-21_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 6.46E2; - graphic:y 3.17E2 . - - _:position_Nozzle-22_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 6.62E2; - graphic:y 3.17E2 . - - _:position_Nozzle-23_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 7.14E2; - graphic:y 3.33E2 . - - _:position_Nozzle-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.59E2; - graphic:y 2.3E2 . - - _:position_Nozzle-3_position a graphic:Position; - graphic:rotation 1.8E2; - graphic:x 2.36E2; - graphic:y 2.3E2 . - - _:position_Nozzle-4_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.68E2; - graphic:y 2.14E2 . - - _:position_Nozzle-5_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.68E2; - graphic:y 2.3E2 . - - _:position_Nozzle-6_position a graphic:Position; - graphic:rotation 1.8E2; - graphic:x 2.36E2; - graphic:y 2.14E2 . - - _:position_Nozzle-8_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 3.61E2; - graphic:y 5.9E1 . - - _:position_Nozzle-9_position a graphic:Position; - graphic:rotation 9.0E1; - graphic:x 3.61E2; - graphic:y 6.7E1 . - - _:position_PipeReducer-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.0E2; - graphic:y 4.22E2 . - - _:position_PipeSlopeSymbol-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.6E2; - graphic:y 2.12E2 . - - _:position_PipingNetworkSystem-10-Label-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 3.87E2; - graphic:y 3.43E2 . - - _:position_PipingNetworkSystem-12-Label-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 7.11E2; - graphic:y 3.78E2 . - - _:position_PipingNetworkSystem-13-Label-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 7.29E2; - graphic:y 3.79E2 . - - _:position_PipingNetworkSystem-14-Label-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 7.29E2; - graphic:y 4.68E2 . - - _:position_PipingNetworkSystem-16-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.78E2; - graphic:y 4.1E2 . - - _:position_PipingNetworkSystem-17-Label-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 5.84E2; - graphic:y 3.56E2 . - - _:position_PipingNetworkSystem-18-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.15E2; - graphic:y 2.11E2 . - - _:position_PipingNetworkSystem-19-Label-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 6.43E2; - graphic:y 3.77E2 . - - _:position_PipingNetworkSystem-20-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.18E2; - graphic:y 1.76E2 . - - _:position_PipingNetworkSystem-3-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.11E2; - graphic:y 2.35E2 . - - _:position_PipingNetworkSystem-4-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.99E2; - graphic:y 2.27E2 . - - _:position_PipingNetworkSystem-5-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.04E2; - graphic:y 2.11E2 . - - _:position_PipingNetworkSystem-6-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.06E2; - graphic:y 2.27E2 . - - _:position_PipingNetworkSystem-7-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.28E2; - graphic:y 1.24E2 . - - _:position_PipingNetworkSystem-8-Label-1_position a graphic:Position; - graphic:rotation 2.7E2; - graphic:x 3.58E2; - graphic:y 1.01E2 . - - _:position_PipingNetworkSystem-9-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.43E2; - graphic:y 3.3E1 . - - _:position_PipingNode-100_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.72E2; - graphic:y 2.3E2 . - - _:position_PipingNode-101_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.32E2; - graphic:y 2.14E2 . - - _:position_PipingNode-102_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.61E2; - graphic:y 5.5E1 . - - _:position_PipingNode-103_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.61E2; - graphic:y 7.1E1 . - - _:position_PipingNode-104_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.8E2; - graphic:y 1.59E2 . - - _:position_PipingNode-105_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.9E2; - graphic:y 2.61E2 . - - _:position_PipingNode-106_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.7E2; - graphic:y 2.4E2 . - - _:position_PipingNode-107_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.1E2; - graphic:y 2.4E2 . - - _:position_PipingNode-108_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.1E2; - graphic:y 2.15E2 . - - _:position_PipingNode-109_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.1E2; - graphic:y 1.8E2 . - - _:position_PipingNode-10_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.32E2; - graphic:y 2.3E2 . - - _:position_PipingNode-110_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.0E2; - graphic:y 1.59E2 . - - _:position_PipingNode-111_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.4E2; - graphic:y 4.22E2 . - - _:position_PipingNode-112_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.64E2; - graphic:y 4.14E2 . - - _:position_PipingNode-113_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 3.37E2 . - - _:position_PipingNode-114_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 3.13E2 . - - _:position_PipingNode-115_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.62E2; - graphic:y 3.13E2 . - - _:position_PipingNode-116_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.14E2; - graphic:y 3.37E2 . - - _:position_PipingNode-117_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.42E2; - graphic:y 4.22E2 . - - _:position_PipingNode-118_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.42E2; - graphic:y 4.22E2 . - - _:position_PipingNode-119_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.42E2; - graphic:y 4.22E2 . - - _:position_PipingNode-11_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.3E2; - graphic:y 2.14E2 . - - _:position_PipingNode-120_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.42E2; - graphic:y 4.38E2 . - - _:position_PipingNode-121_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.42E2; - graphic:y 4.46E2 . - - _:position_PipingNode-12_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.32E2; - graphic:y 2.14E2 . - - _:position_PipingNode-13_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.72E2; - graphic:y 2.3E2 . - - _:position_PipingNode-14_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.74E2; - graphic:y 2.3E2 . - - _:position_PipingNode-15_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.92E2; - graphic:y 1.64E2 . - - _:position_PipingNode-16_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.92E2; - graphic:y 1.56E2 . - - _:position_PipingNode-17_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.01E2; - graphic:y 1.27E2 . - - _:position_PipingNode-18_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.01E2; - graphic:y 1.27E2 . - - _:position_PipingNode-19_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.61E2; - graphic:y 1.27E2 . - - _:position_PipingNode-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.7E2; - graphic:y 2.4E2 . - - _:position_PipingNode-20_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.61E2; - graphic:y 1.27E2 . - - _:position_PipingNode-21_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.61E2; - graphic:y 1.27E2 . - - _:position_PipingNode-22_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.72E2; - graphic:y 2.14E2 . - - _:position_PipingNode-23_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.74E2; - graphic:y 2.14E2 . - - _:position_PipingNode-24_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.8E2; - graphic:y 1.57E2 . - - _:position_PipingNode-25_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.8E2; - graphic:y 1.59E2 . - - _:position_PipingNode-26_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.61E2; - graphic:y 7.3E1 . - - _:position_PipingNode-27_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.61E2; - graphic:y 7.1E1 . - - _:position_PipingNode-28_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.61E2; - graphic:y 5.5E1 . - - _:position_PipingNode-29_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.61E2; - graphic:y 5.3E1 . - - _:position_PipingNode-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.1E2; - graphic:y 2.4E2 . - - _:position_PipingNode-30_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.9E2; - graphic:y 2.61E2 . - - _:position_PipingNode-31_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.9E2; - graphic:y 2.65E2 . - - _:position_PipingNode-32_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.9E2; - graphic:y 2.86E2 . - - _:position_PipingNode-33_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.9E2; - graphic:y 2.94E2 . - - _:position_PipingNode-34_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.21E2; - graphic:y 4.22E2 . - - _:position_PipingNode-35_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.29E2; - graphic:y 4.22E2 . - - _:position_PipingNode-36_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.54E2; - graphic:y 4.22E2 . - - _:position_PipingNode-37_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.66E2; - graphic:y 4.22E2 . - - _:position_PipingNode-38_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.76E2; - graphic:y 4.22E2 . - - _:position_PipingNode-39_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.84E2; - graphic:y 4.22E2 . - - _:position_PipingNode-3_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.12E2; - graphic:y 2.4E2 . - - _:position_PipingNode-40_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.98E2; - graphic:y 4.22E2 . - - _:position_PipingNode-41_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.02E2; - graphic:y 4.22E2 . - - _:position_PipingNode-42_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.02E2; - graphic:y 4.22E2 . - - _:position_PipingNode-43_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.02E2; - graphic:y 4.22E2 . - - _:position_PipingNode-44_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.18E2; - graphic:y 4.22E2 . - - _:position_PipingNode-45_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.26E2; - graphic:y 4.22E2 . - - _:position_PipingNode-46_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.38E2; - graphic:y 4.22E2 . - - _:position_PipingNode-47_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.4E2; - graphic:y 4.22E2 . - - _:position_PipingNode-48_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.14E2; - graphic:y 3.39E2 . - - _:position_PipingNode-49_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.14E2; - graphic:y 3.37E2 . - - _:position_PipingNode-4_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 8.5E1; - graphic:y 2.38E2 . - - _:position_PipingNode-50_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.62E2; - graphic:y 3.13E2 . - - _:position_PipingNode-51_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.62E2; - graphic:y 3.11E2 . - - _:position_PipingNode-52_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.76E2; - graphic:y 2.95E2 . - - _:position_PipingNode-53_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.84E2; - graphic:y 2.95E2 . - - _:position_PipingNode-54_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.32E2; - graphic:y 4.36E2 . - - _:position_PipingNode-55_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.32E2; - graphic:y 4.45E2 . - - _:position_PipingNode-56_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.0E2; - graphic:y 1.59E2 . - - _:position_PipingNode-57_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.0E2; - graphic:y 1.57E2 . - - _:position_PipingNode-58_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.64E2; - graphic:y 4.14E2 . - - _:position_PipingNode-59_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.66E2; - graphic:y 4.14E2 . - - _:position_PipingNode-5_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.45E2; - graphic:y 2.38E2 . - - _:position_PipingNode-60_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.72E2; - graphic:y 4.14E2 . - - _:position_PipingNode-61_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.72E2; - graphic:y 4.14E2 . - - _:position_PipingNode-62_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.72E2; - graphic:y 4.14E2 . - - _:position_PipingNode-63_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.72E2; - graphic:y 4.25E2 . - - _:position_PipingNode-64_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.72E2; - graphic:y 4.33E2 . - - _:position_PipingNode-65_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.87E2; - graphic:y 4.14E2 . - - _:position_PipingNode-66_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.87E2; - graphic:y 4.14E2 . - - _:position_PipingNode-67_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.87E2; - graphic:y 4.14E2 . - - _:position_PipingNode-68_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.07E2; - graphic:y 4.14E2 . - - _:position_PipingNode-69_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.07E2; - graphic:y 4.14E2 . - - _:position_PipingNode-6_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.47E2; - graphic:y 2.38E2 . - - _:position_PipingNode-70_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.07E2; - graphic:y 4.14E2 . - - _:position_PipingNode-71_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.07E2; - graphic:y 4.04E2 . - - _:position_PipingNode-72_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.22E2; - graphic:y 4.14E2 . - - _:position_PipingNode-73_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.3E2; - graphic:y 4.14E2 . - - _:position_PipingNode-74_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 4.14E2 . - - _:position_PipingNode-75_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 4.14E2 . - - _:position_PipingNode-76_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 4.14E2 . - - _:position_PipingNode-77_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 4.14E2 . - - _:position_PipingNode-78_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 4.14E2 . - - _:position_PipingNode-79_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 4.14E2 . - - _:position_PipingNode-7_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.71E2; - graphic:y 2.3E2 . - - _:position_PipingNode-80_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 4.0E2 . - - _:position_PipingNode-81_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.68E2; - graphic:y 4.14E2 . - - _:position_PipingNode-82_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.87E2; - graphic:y 2.19E2 . - - _:position_PipingNode-83_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.83E2; - graphic:y 2.15E2 . - - _:position_PipingNode-84_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.83E2; - graphic:y 2.15E2 . - - _:position_PipingNode-85_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.83E2; - graphic:y 2.15E2 . - - _:position_PipingNode-86_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.12E2; - graphic:y 2.15E2 . - - _:position_PipingNode-87_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.1E2; - graphic:y 2.15E2 . - - _:position_PipingNode-88_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 3.39E2 . - - _:position_PipingNode-89_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 3.37E2 . - - _:position_PipingNode-8_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.73E2; - graphic:y 2.3E2 . - - _:position_PipingNode-90_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 3.13E2 . - - _:position_PipingNode-91_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 3.11E2 . - - _:position_PipingNode-92_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 1.96E2 . - - _:position_PipingNode-93_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.46E2; - graphic:y 1.88E2 . - - _:position_PipingNode-94_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.12E2; - graphic:y 1.8E2 . - - _:position_PipingNode-95_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.1E2; - graphic:y 1.8E2 . - - _:position_PipingNode-96_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.47E2; - graphic:y 2.38E2 . - - _:position_PipingNode-97_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.71E2; - graphic:y 2.3E2 . - - _:position_PipingNode-98_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.32E2; - graphic:y 2.3E2 . - - _:position_PipingNode-99_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.72E2; - graphic:y 2.14E2 . - - _:position_PipingNode-9_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.3E2; - graphic:y 2.3E2 . - - _:position_PlateHeatExchanger-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.52E2; - graphic:y 2.22E2 . - - _:position_PressureVessel-1-Label-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.08E2; - graphic:y 2.54E2 . - - _:position_PressureVessel-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.9E2; - graphic:y 2.1E2 . - - _:position_ProcessInstrumentationFunction-10_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.01E2; - graphic:y 1.07E2 . - - _:position_ProcessInstrumentationFunction-11_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.01E2; - graphic:y 8.7E1 . - - _:position_ProcessInstrumentationFunction-12_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.07E2; - graphic:y 3.82E2 . - - _:position_ProcessInstrumentationFunction-13_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.25E2; - graphic:y 3.57E2 . - - _:position_ProcessInstrumentationFunction-14_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.41E2; - graphic:y 3.57E2 . - - _:position_ProcessInstrumentationFunction-15_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.8E2; - graphic:y 1.27E2 . - - _:position_ProcessInstrumentationFunction-16_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.0E2; - graphic:y 1.27E2 . - - _:position_ProcessInstrumentationFunction-17_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 6.07E2; - graphic:y 3.72E2 . - - _:position_ProcessInstrumentationFunction-18_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 3.72E2 . - - _:position_ProcessInstrumentationFunction-19_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 7.5E2; - graphic:y 3.47E2 . - - _:position_ProcessInstrumentationFunction-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.31E2; - graphic:y 5.4E1 . - - _:position_ProcessInstrumentationFunction-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.41E2; - graphic:y 2.6E1 . - - _:position_ProcessInstrumentationFunction-3_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 3.11E2; - graphic:y 5.4E1 . - - _:position_ProcessInstrumentationFunction-4_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.3E2; - graphic:y 2.4E2 . - - _:position_ProcessInstrumentationFunction-5_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.7E2; - graphic:y 2.4E2 . - - _:position_ProcessInstrumentationFunction-6_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.7E2; - graphic:y 2.48E2 . - - _:position_ProcessInstrumentationFunction-7_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.7E2; - graphic:y 2.5E2 . - - _:position_ProcessInstrumentationFunction-8_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 4.7E2; - graphic:y 2.34E2 . - - _:position_ProcessInstrumentationFunction-9_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 2.5E2; - graphic:y 1.6E2 . - - _:position_PropertyBreak-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.02E2; - graphic:y 4.22E2 . - - _:position_PropertyBreak-2_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.62E2; - graphic:y 2.05E2 . - - _:position_RotaryPump-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 1.59E2; - graphic:y 2.38E2 . - - _:position_SafetyValveOrFitting-1-Label-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.95E2; - graphic:y 2.01E2 . - - _:position_SafetyValveOrFitting-1_position a graphic:Position; - graphic:rotation 0.0E0; - graphic:x 5.87E2; - graphic:y 2.15E2 . - - a graphic:PID; - graphic:visualisedAs . - - asset:BallValve-1-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-12_1_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-12_1_linestyle . - - asset:BallValve-3-node2-connector graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-22_1_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-22_1_linestyle; - a graphic:Line . - - asset:ButterflyValve-1-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-11_1_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-11_1_linestyle . - - asset:CheckValve-1-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-30_2_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-30_2_linestyle . - - asset:ControlledActuator-1-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-9_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-9_0_linestyle . - - asset:ControlledActuator-2-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-13_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-13_0_linestyle . - - asset:ControlledActuator-2-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-14_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-14_0_linestyle . - - asset:ControlledActuator-2-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-15_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-15_0_linestyle . - - asset:ControlledActuator-3-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-16_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-16_0_linestyle . - - asset:ControlledActuator-4-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-19_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-19_0_linestyle . - - asset:CustomInlinePrimaryElement-1-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-7_2_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-7_2_linestyle . - - asset:CustomInlinePrimaryElement-1-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-2_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-2_0_linestyle . - - asset:CustomInlinePrimaryElement-2-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-30_1_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-30_1_linestyle . - - asset:CustomOperatedValve-1-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-11_2_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-11_2_linestyle . - - asset:CustomPipingComponent-1-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-11_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-11_0_linestyle . - - asset:CustomPipingComponent-2-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-14_1_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-14_1_linestyle . - - asset:ElectricHeater-1-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-1_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-1_0_linestyle . - - asset:Flange-1-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-1_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-1_0_linestyle . - - asset:Flange-13-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-14_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-14_0_linestyle . - - asset:Flange-14-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-3_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-3_0_linestyle . - - asset:Flange-15-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-17_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-17_0_linestyle . - - asset:Flange-18-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-29_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-29_0_linestyle . - - asset:Flange-3-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-4_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-4_0_linestyle . - - asset:Flange-7-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-7_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-7_0_linestyle . - - asset:FlowInPipeOffPageConnector-1-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-3_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-3_0_linestyle . - - asset:FlowOutPipeOffPageConnector-1-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-25_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-25_0_linestyle . - - asset:FlowOutSignalOffPageConnector-1-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-8_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-8_0_linestyle . - - asset:GateValve-1-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-7_1_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-7_1_linestyle . - - asset:GateValve-3-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-4_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-4_0_linestyle . - - asset:GateValve-4-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-5_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-5_0_linestyle . - - asset:GateValve-5-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-29_1_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-29_1_linestyle . - - asset:Nozzle-23-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-13_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-13_0_linestyle . - - asset:Nozzle-5-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-6_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-6_0_linestyle . - - asset:PipeTee-1-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-8_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-8_0_linestyle . - - asset:PipeTee-1-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-9_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-9_0_linestyle . - - asset:PipeTee-2-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-19_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-19_0_linestyle . - - asset:PipeTee-2-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-18_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-18_0_linestyle . - - asset:PipeTee-3-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-20_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-20_0_linestyle . - - asset:PipeTee-3-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-26_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-26_0_linestyle . - - asset:PipeTee-4-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-22_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-22_0_linestyle . - - asset:PipeTee-4-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-21_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-21_0_linestyle . - - asset:PipeTee-5-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-23_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-23_0_linestyle . - - asset:PipeTee-5-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-28_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-28_0_linestyle . - - asset:PipeTee-6-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-25_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-25_0_linestyle . - - asset:PipeTee-6-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-24_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-24_0_linestyle . - - asset:PipeTee-7-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-30_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-30_0_linestyle . - - asset:PipeTee-7-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-31_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-31_0_linestyle . - - asset:ProcessInstrumentationFunction-1-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-1_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-1_0_linestyle . - - asset:ProcessInstrumentationFunction-1-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-3_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-3_0_linestyle . - - asset:ProcessInstrumentationFunction-1-node3-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-2_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-2_0_linestyle . - - asset:ProcessInstrumentationFunction-10-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-10_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-10_0_linestyle . - - asset:ProcessInstrumentationFunction-10-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-2_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-2_0_linestyle . - - asset:ProcessInstrumentationFunction-11-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-10_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-10_0_linestyle . - - asset:ProcessInstrumentationFunction-12-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-13_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-13_0_linestyle . - - asset:ProcessInstrumentationFunction-13-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-14_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-14_0_linestyle . - - asset:ProcessInstrumentationFunction-14-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-15_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-15_0_linestyle . - - asset:ProcessInstrumentationFunction-15-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-16_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-16_0_linestyle . - - asset:ProcessInstrumentationFunction-15-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-17_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-17_0_linestyle . - - asset:ProcessInstrumentationFunction-16-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-3_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-3_0_linestyle . - - asset:ProcessInstrumentationFunction-16-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-17_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-17_0_linestyle . - - asset:ProcessInstrumentationFunction-17-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-4_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-4_0_linestyle . - - asset:ProcessInstrumentationFunction-18-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-5_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-5_0_linestyle . - - asset:ProcessInstrumentationFunction-18-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-18_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-18_0_linestyle . - - asset:ProcessInstrumentationFunction-19-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-19_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-19_0_linestyle . - - asset:ProcessInstrumentationFunction-19-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-18_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-18_0_linestyle . - - asset:ProcessInstrumentationFunction-2-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-2_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-2_0_linestyle . - - asset:ProcessInstrumentationFunction-3-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-3_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-3_0_linestyle . - - asset:ProcessInstrumentationFunction-4-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_MeasuringLineFunction-1_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_MeasuringLineFunction-1_0_linestyle . - - asset:ProcessInstrumentationFunction-4-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-4_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-4_0_linestyle . - - asset:ProcessInstrumentationFunction-5-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-4_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-4_0_linestyle . - - asset:ProcessInstrumentationFunction-5-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-8_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-8_0_linestyle . - - asset:ProcessInstrumentationFunction-9-node1-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_SignalConveyingFunction-9_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_SignalConveyingFunction-9_0_linestyle . - - asset:PropertyBreak-1-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-12_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-12_0_linestyle . - - asset:PropertyBreak-2-node2-connector a graphic:Line; - graphic:hasCoordinates _:C01_NOA1_PipingNetworkSegment-27_0_0_coordinateListFirstElement; - graphic:hasStyle _:C01_NOA1_PipingNetworkSegment-27_0_linestyle . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_BallValve-1_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_BallValve-2_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_BallValve-3_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_BallValve-4_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_BlindFlange-1_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_ButterflyValve-1_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_CentrifugalPump-1_position; - rdfs:label "D-20PA002" . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_CheckValve-1_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_CustomHeatExchanger-1_position; - rdfs:label "D-20HA002" . - - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_CustomInlinePrimaryElement-1_position . - - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_CustomInlinePrimaryElement-2_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_CustomOperatedValve-1_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_CustomPipingComponent-1_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_CustomPipingComponent-2_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_ElectricHeater-1_position; - rdfs:label "D-20FE001" . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-1_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-10_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-11_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-12_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-13_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-14_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-15_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-16_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-17_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-18_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-19_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-2_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-3_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-4_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-5_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-6_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-7_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-8_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_Flange-9_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_GateValve-1_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_GateValve-2_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_GateValve-3_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_GateValve-4_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_GateValve-5_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_PipeReducer-1_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_PlateHeatExchanger-1_position; - rdfs:label "D-20HA001" . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_PressureVessel-1_position; - rdfs:label "D-20VA001" . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_PropertyBreak-1_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_PropertyBreak-2_position . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_RotaryPump-1_position; - rdfs:label "D-20PA001" . - - a graphic:Symbol; - graphic:hasGraphics ; - graphic:hasPosition _:position_SafetyValveOrFitting-1_position . - - a graphic:Diagram; - graphic:hasExtent _:C01_NOA1_extent; - graphic:hasLine asset:BallValve-1-node2-connector, asset:BallValve-3-node2-connector, - asset:ButterflyValve-1-node2-connector, asset:CheckValve-1-node2-connector, asset:ControlledActuator-1-node1-connector, - asset:ControlledActuator-2-node1-connector, asset:ControlledActuator-2-node2-connector, - asset:ControlledActuator-2-node3-connector, asset:ControlledActuator-3-node1-connector, - asset:ControlledActuator-4-node1-connector, asset:CustomInlinePrimaryElement-1-node2-connector, - asset:CustomInlinePrimaryElement-1-node3-connector, asset:CustomInlinePrimaryElement-2-node2-connector, - asset:CustomOperatedValve-1-node2-connector, asset:CustomPipingComponent-1-node2-connector, - asset:CustomPipingComponent-2-node1-connector, asset:ElectricHeater-1-node1-connector, - asset:Flange-1-node3-connector, asset:Flange-13-node2-connector, asset:Flange-14-node3-connector, - asset:Flange-15-node2-connector, asset:Flange-18-node2-connector, asset:Flange-3-node2-connector, - asset:Flange-7-node2-connector, asset:FlowInPipeOffPageConnector-1-node1-connector, - asset:FlowOutPipeOffPageConnector-1-node1-connector, asset:FlowOutSignalOffPageConnector-1-node1-connector, - asset:GateValve-1-node2-connector, asset:GateValve-3-node2-connector, asset:GateValve-4-node2-connector, - asset:GateValve-5-node2-connector, asset:Nozzle-23-node1-connector, asset:Nozzle-5-node1-connector, - asset:PipeTee-1-node2-connector, asset:PipeTee-1-node3-connector, asset:PipeTee-2-node2-connector, - asset:PipeTee-2-node3-connector, asset:PipeTee-3-node2-connector, asset:PipeTee-3-node3-connector, - asset:PipeTee-4-node2-connector, asset:PipeTee-4-node3-connector, asset:PipeTee-5-node2-connector, - asset:PipeTee-5-node3-connector, asset:PipeTee-6-node2-connector, asset:PipeTee-6-node3-connector, - asset:PipeTee-7-node2-connector, asset:PipeTee-7-node3-connector, asset:ProcessInstrumentationFunction-1-node1-connector, - asset:ProcessInstrumentationFunction-1-node2-connector, asset:ProcessInstrumentationFunction-1-node3-connector, - asset:ProcessInstrumentationFunction-10-node1-connector, asset:ProcessInstrumentationFunction-10-node2-connector, - asset:ProcessInstrumentationFunction-11-node1-connector, asset:ProcessInstrumentationFunction-12-node1-connector, - asset:ProcessInstrumentationFunction-13-node1-connector, asset:ProcessInstrumentationFunction-14-node1-connector, - asset:ProcessInstrumentationFunction-15-node1-connector, asset:ProcessInstrumentationFunction-15-node2-connector, - asset:ProcessInstrumentationFunction-16-node1-connector, asset:ProcessInstrumentationFunction-16-node2-connector, - asset:ProcessInstrumentationFunction-17-node1-connector, asset:ProcessInstrumentationFunction-18-node1-connector, - asset:ProcessInstrumentationFunction-18-node2-connector, asset:ProcessInstrumentationFunction-19-node1-connector, - asset:ProcessInstrumentationFunction-19-node2-connector, asset:ProcessInstrumentationFunction-2-node1-connector, - asset:ProcessInstrumentationFunction-3-node1-connector, asset:ProcessInstrumentationFunction-4-node1-connector, - asset:ProcessInstrumentationFunction-4-node2-connector, asset:ProcessInstrumentationFunction-5-node1-connector, - asset:ProcessInstrumentationFunction-5-node2-connector, asset:ProcessInstrumentationFunction-9-node1-connector, - asset:PropertyBreak-1-node2-connector, asset:PropertyBreak-2-node2-connector; - graphic:hasSymbol , - , , - , , - , , - , , - , - , - , , - , , - , , - , , - , , - , , - , , - , , - , , - , , - , , - , , - , , - , , - , , - , , - , , - . -} From d9b7e8df6344342645c0550cf54996bac9cb3c4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Embla=20=C3=98ye?= Date: Mon, 10 Feb 2025 15:34:17 +0100 Subject: [PATCH 47/50] cleanup --- .../Backend/Endpoints/BoundaryEndpoints.cs | 5 +- client/Boundaries/Backend/Program.cs | 7 --- client/Boundaries/Backend/Utils/QueryUtils.cs | 1 - .../TestBoundaries/IntegrationTests.cs | 53 ++++++++----------- .../TestBoundaries/TestBoundaries.cs | 47 ++++++---------- .../Boundaries/TestBoundaries/TestFactory.cs | 40 ++++++-------- .../TestOutputLoggerProvider.cs | 2 + 7 files changed, 59 insertions(+), 96 deletions(-) diff --git a/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs b/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs index 5a8c6630..3aa7af86 100644 --- a/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs +++ b/client/Boundaries/Backend/Endpoints/BoundaryEndpoints.cs @@ -18,8 +18,7 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints) if (!await QueryUtils.CommissioningPackageExists(packageId, rdfoxApi)) { - string? value = $"Commissioning package {packageId} not found."; - return Results.NotFound(); + return Results.NotFound($"Commissioning package {packageId} not found."); } var isSelectedInternal = await QueryUtils.IsSelectedInternalOf(packageId, nodeId, rdfoxApi); @@ -39,7 +38,7 @@ public static void MapBoundaryEndpoints(this IEndpointRouteBuilder endpoints) return Results.Ok(); }).WithTags("Boundary"); - + // Remove node as boundary endpoints.MapDelete("/commissioning-package/{packageId}/boundary/{nodeId}", async (string packageId, string nodeId, [FromServices] IRdfoxApi rdfoxApi) => diff --git a/client/Boundaries/Backend/Program.cs b/client/Boundaries/Backend/Program.cs index c6f40ae6..b7c9cac2 100644 --- a/client/Boundaries/Backend/Program.cs +++ b/client/Boundaries/Backend/Program.cs @@ -1,12 +1,5 @@ using Boundaries; using Backend.Endpoints; -using System.Text; -using Backend.Utils; -using System.Text.Json; -using Backend.Model; -using Microsoft.AspNetCore.Mvc; - - var builder = WebApplication.CreateBuilder(args); diff --git a/client/Boundaries/Backend/Utils/QueryUtils.cs b/client/Boundaries/Backend/Utils/QueryUtils.cs index e2f92936..f690924a 100644 --- a/client/Boundaries/Backend/Utils/QueryUtils.cs +++ b/client/Boundaries/Backend/Utils/QueryUtils.cs @@ -1,7 +1,6 @@ using Backend.Model; using Boundaries; using System.Text.Json; -using static Boundaries.RdfoxApi; namespace Backend.Utils; diff --git a/client/Boundaries/TestBoundaries/IntegrationTests.cs b/client/Boundaries/TestBoundaries/IntegrationTests.cs index 48d50264..0f291d7f 100644 --- a/client/Boundaries/TestBoundaries/IntegrationTests.cs +++ b/client/Boundaries/TestBoundaries/IntegrationTests.cs @@ -5,22 +5,13 @@ namespace TestBoundaries; -public class IntegrationTests : IClassFixture +public class IntegrationTests(TestFactory factory, ITestOutputHelper testOutputHelper) : IClassFixture { - private TestFactory _factory; - private ITestOutputHelper _testOutputHelper; - public IntegrationTests(TestFactory factory, ITestOutputHelper testOutputHelper) - { - _factory = factory; - _testOutputHelper = testOutputHelper; - var unused = _factory.CreateClient(); - } - [Fact] public async Task TestCreatePackage() { // Arrange - var client = _factory.CreateAuthenticatingClient(); + var client = factory.CreateAuthenticatingClient(); var commissioningPackage = new CommissioningPackage { Id = "package1", @@ -28,7 +19,6 @@ public async Task TestCreatePackage() Color = "Red" }; - // Act // Act var response = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); @@ -36,17 +26,17 @@ public async Task TestCreatePackage() if (!response.IsSuccessStatusCode) { var errorString = await response.Content.ReadAsStringAsync(); - _testOutputHelper.WriteLine($"Error: {response.StatusCode}"); - _testOutputHelper.WriteLine(errorString); + testOutputHelper.WriteLine($"Error: {response.StatusCode}"); + testOutputHelper.WriteLine(errorString); } response.EnsureSuccessStatusCode(); } - + [Fact] public async Task TestGetAllPackages() { // Arrange - var client = _factory.CreateAuthenticatingClient(); + var client = factory.CreateAuthenticatingClient(); var commissioningPackage = new CommissioningPackage { Id = "package1", @@ -54,28 +44,28 @@ public async Task TestGetAllPackages() Color = "Red" }; - var createresponse = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); - createresponse.EnsureSuccessStatusCode(); - + var createResponse = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); + createResponse.EnsureSuccessStatusCode(); + // Act var response = await client.GetAsync("/commissioning-package/all"); + // Assert if (!response.IsSuccessStatusCode) { var errorString = await response.Content.ReadAsStringAsync(); - _testOutputHelper.WriteLine($"Error: {response.StatusCode}"); - _testOutputHelper.WriteLine(errorString); + testOutputHelper.WriteLine($"Error: {response.StatusCode}"); + testOutputHelper.WriteLine(errorString); } - var package = await response.Content.ReadFromJsonAsync(); + await response.Content.ReadFromJsonAsync(); response.EnsureSuccessStatusCode(); } - - + [Fact] public async Task TestGetAllPackageIds() { // Arrange - var client = _factory.CreateAuthenticatingClient(); + var client = factory.CreateAuthenticatingClient(); var commissioningPackage = new CommissioningPackage { Id = "package1", @@ -83,20 +73,21 @@ public async Task TestGetAllPackageIds() Color = "Red" }; - var createresponse = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); - createresponse.EnsureSuccessStatusCode(); - + var createResponse = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); + createResponse.EnsureSuccessStatusCode(); + // Act var response = await client.GetAsync("/commissioning-package/ids"); + // Assert if (!response.IsSuccessStatusCode) { var errorString = await response.Content.ReadAsStringAsync(); - _testOutputHelper.WriteLine($"Error: {response.StatusCode}"); - _testOutputHelper.WriteLine(errorString); + testOutputHelper.WriteLine($"Error: {response.StatusCode}"); + testOutputHelper.WriteLine(errorString); } var stringResult = await response.Content.ReadAsStringAsync(); - var package = JsonSerializer.Deserialize>(stringResult); + JsonSerializer.Deserialize>(stringResult); response.EnsureSuccessStatusCode(); } } \ No newline at end of file diff --git a/client/Boundaries/TestBoundaries/TestBoundaries.cs b/client/Boundaries/TestBoundaries/TestBoundaries.cs index dfe15ac4..af08bd6e 100644 --- a/client/Boundaries/TestBoundaries/TestBoundaries.cs +++ b/client/Boundaries/TestBoundaries/TestBoundaries.cs @@ -1,31 +1,19 @@ using System.Net.Http.Json; using Backend.Model; -using Xunit; using Xunit.Abstractions; using FluentAssertions; namespace TestBoundaries; -public class BoundaryIntegrationTests : IClassFixture +public class BoundaryIntegrationTests(TestFactory factory, ITestOutputHelper testOutputHelper) : IClassFixture { - private readonly TestFactory _factory; - private readonly ITestOutputHelper _testOutputHelper; - - public BoundaryIntegrationTests(TestFactory factory, ITestOutputHelper testOutputHelper) - { - _factory = factory; - _testOutputHelper = testOutputHelper; - var unused = _factory.CreateClient(); - } - - [Fact] public async Task TestAddBoundary() { // Arrange - var client = _factory.CreateAuthenticatingClient(); - var packageId = "packageX"; - var nodeId = "node1"; + var client = factory.CreateAuthenticatingClient(); + const string packageId = "packageX"; + const string nodeId = "node1"; var commissioningPackage = new CommissioningPackage { @@ -35,7 +23,7 @@ public async Task TestAddBoundary() }; var responsePackage = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); responsePackage.EnsureSuccessStatusCode(); - + // Act var response = await client.PostAsync($"/commissioning-package/{packageId}/update-boundary/{nodeId}", null); @@ -43,20 +31,19 @@ public async Task TestAddBoundary() if (!response.IsSuccessStatusCode) { var errorString = await response.Content.ReadAsStringAsync(); - _testOutputHelper.WriteLine($"Error: {response.StatusCode}"); - _testOutputHelper.WriteLine(errorString); + testOutputHelper.WriteLine($"Error: {response.StatusCode}"); + testOutputHelper.WriteLine(errorString); } response.EnsureSuccessStatusCode(); } - [Fact] public async Task TestAddBoundaryWithWrongPackage() { // Arrange - var client = _factory.CreateAuthenticatingClient(); + var client = factory.CreateAuthenticatingClient(); var packageId = $"package{Guid.NewGuid()}"; - var nodeId = "node1"; + const string nodeId = "node1"; // Act var response = await client.PostAsync($"/commissioning-package/{packageId}/update-boundary/{nodeId}", null); @@ -69,9 +56,9 @@ public async Task TestAddBoundaryWithWrongPackage() public async Task TestRemoveBoundary() { // Arrange - var client = _factory.CreateAuthenticatingClient(); + var client = factory.CreateAuthenticatingClient(); var packageId = $"package{Guid.NewGuid()}"; - var nodeId = "node1"; + const string nodeId = "node1"; var commissioningPackage = new CommissioningPackage { @@ -81,17 +68,17 @@ public async Task TestRemoveBoundary() }; var responsePackage = await client.PostAsJsonAsync("/commissioning-package", commissioningPackage); responsePackage.EnsureSuccessStatusCode(); - var addresponse = await client.PostAsync($"/commissioning-package/{packageId}/update-boundary/{nodeId}", null); - addresponse.EnsureSuccessStatusCode(); + var addResponse = await client.PostAsync($"/commissioning-package/{packageId}/update-boundary/{nodeId}", null); + addResponse.EnsureSuccessStatusCode(); // Act - string nodeUri = $"/commissioning-package/{packageId}/boundary/{nodeId}"; + var nodeUri = $"/commissioning-package/{packageId}/boundary/{nodeId}"; var message = new HttpRequestMessage() { Method = HttpMethod.Delete, - RequestUri = new Uri(client.BaseAddress ?? throw new Exception("Lacking client base adress"), nodeUri) + RequestUri = new Uri(client.BaseAddress ?? throw new Exception("Lacking client base address"), nodeUri) }; - var deleteresponse = await client.SendAsync(message); - deleteresponse.IsSuccessStatusCode.Should().BeTrue(); + var deleteResponse = await client.SendAsync(message); + deleteResponse.IsSuccessStatusCode.Should().BeTrue(); } } \ No newline at end of file diff --git a/client/Boundaries/TestBoundaries/TestFactory.cs b/client/Boundaries/TestBoundaries/TestFactory.cs index e2dc8388..e68e00f6 100644 --- a/client/Boundaries/TestBoundaries/TestFactory.cs +++ b/client/Boundaries/TestBoundaries/TestFactory.cs @@ -1,35 +1,31 @@ using System.Net.Http.Headers; using System.Reflection; using Boundaries; +using DotNet.Testcontainers.Builders; +using DotNet.Testcontainers.Configurations; +using DotNet.Testcontainers.Containers; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; -using Microsoft.VisualStudio.TestPlatform.TestHost; -using DotNet.Testcontainers.Containers; -using DotNet.Testcontainers.Builders; -using DotNet.Testcontainers.Configurations; -using Xunit.Abstractions; +namespace TestBoundaries; public class TestFactory : WebApplicationFactory, IAsyncLifetime { - - private IContainer _rdfoxContainer; + private readonly IContainer _rdfoxContainer; + private string _hostname; + private int _port; - private string hostname; - private int port; - - private readonly string _outputFolderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? throw new InvalidOperationException(); - private string _tempRdfoxDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + private readonly string _tempRdfoxDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); private const string RdfoxUsername = "dexpi"; private readonly string _rdfoxPassword = Guid.NewGuid().ToString("D"); public TestFactory() { Directory.CreateDirectory(_tempRdfoxDirectory); - string filePath = Path.Combine(_tempRdfoxDirectory, "RDFox.versions"); - string content = "data-store-catalog 1\ndata-store-change-log 1\nendpoint.params 1\nrole-database 1\nserver.params 1"; + var filePath = Path.Combine(_tempRdfoxDirectory, "RDFox.versions"); + const string content = "data-store-catalog 1\ndata-store-change-log 1\nendpoint.params 1\nrole-database 1\nserver.params 1"; File.WriteAllText(filePath, content); @@ -47,22 +43,18 @@ public TestFactory() .Build(); } - - public async Task InitializeAsync() { await _rdfoxContainer.StartAsync(); - hostname = _rdfoxContainer.Hostname; - port = _rdfoxContainer.GetMappedPublicPort(12110); - return; + _hostname = _rdfoxContainer.Hostname; + _port = _rdfoxContainer.GetMappedPublicPort(12110); } public HttpClient CreateAuthenticatingClient(params string[] roles) { var client = CreateClient(); client.DefaultRequestHeaders.Authorization = - new AuthenticationHeaderValue(scheme: "TestAuthenticationScheme", - $"Bearer null"); + new AuthenticationHeaderValue(scheme: "TestAuthenticationScheme", "Bearer null"); return client; } protected override void ConfigureWebHost(IWebHostBuilder builder) @@ -74,8 +66,8 @@ protected override void ConfigureWebHost(IWebHostBuilder builder) // Register a test-specific RdfoxApi instance services.AddSingleton(new RdfoxApi(new ConnectionSettings { - Host = hostname, - Port = port, + Host = _hostname, + Port = _port, Username = RdfoxUsername, Password = _rdfoxPassword, Datastore = "boundaries" @@ -87,4 +79,4 @@ protected override void ConfigureWebHost(IWebHostBuilder builder) { await _rdfoxContainer.DisposeAsync(); } -} +} \ No newline at end of file diff --git a/client/Boundaries/TestBoundaries/TestOutputLoggerProvider.cs b/client/Boundaries/TestBoundaries/TestOutputLoggerProvider.cs index 04000893..5cd273b7 100644 --- a/client/Boundaries/TestBoundaries/TestOutputLoggerProvider.cs +++ b/client/Boundaries/TestBoundaries/TestOutputLoggerProvider.cs @@ -1,6 +1,8 @@ using Microsoft.Extensions.Logging; using Xunit.Abstractions; +namespace TestBoundaries; + public class TestOutputLoggerProvider : ILoggerProvider { private readonly ITestOutputHelper _testOutputHelper; From 575889ddb464dd2fb17a1bfdfe1896d8a96509c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Embla=20=C3=98ye?= Date: Mon, 10 Feb 2025 15:35:54 +0100 Subject: [PATCH 48/50] add normalizeWhitespace --- .../TestBoundaries/DatalogCreatorTests.cs | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/client/Boundaries/TestBoundaries/DatalogCreatorTests.cs b/client/Boundaries/TestBoundaries/DatalogCreatorTests.cs index ef3c6b6c..c6af6567 100644 --- a/client/Boundaries/TestBoundaries/DatalogCreatorTests.cs +++ b/client/Boundaries/TestBoundaries/DatalogCreatorTests.cs @@ -1,3 +1,5 @@ +using System.Text.RegularExpressions; + namespace TestBoundaries; public class DatalogCreatorTests @@ -14,21 +16,25 @@ public void TestCreateDatalog() new IriTools.IriReference("https://assetid.equinor.com/plantx#PlateHeatExchanger-1"), new IriTools.IriReference("https://assetid.equinor.com/plantx#ReciprocatingPump-1") }); - Assert.Equal($$""" + var expected = $$""" + + <{{graphIri}}> [?node] :- + rdfs:label [?internal, "T4750"], + imf:connectedTo [?internal, ?node], + dexpi:PipingOrEquipment [?node]. + + <{{graphIri}}> [?node] :- + <{{graphIri}}> [?node1], + imf:connectedTo [?node1, ?node], + NOT FILTER(?node1 = ), + NOT FILTER(?node1 = ), + NOT FILTER(?node1 = ), + NOT FILTER(?node1 = ), + dexpi:PipingOrEquipment [?node]. + """; + + string NormalizeWhitespace(string input) => Regex.Replace(input, @"\s+", " ").Trim(); - <{{graphIri}}> [?node] :- - rdfs:label [?internal, "T4750"], - imf:connectedTo [?internal, ?node], - dexpi:PipingOrEquipment [?node]. - - <{{graphIri}}> [?node] :- - <{{graphIri}}> [?node1], - imf:connectedTo [?node1, ?node], - NOT FILTER(?node1 = ), - NOT FILTER(?node1 = ), - NOT FILTER(?node1 = ), - NOT FILTER(?node1 = ), - dexpi:PipingOrEquipment [?node]. - """, datalog); + Assert.Equal(NormalizeWhitespace(expected), NormalizeWhitespace(datalog)); } } \ No newline at end of file From 9c7a1429fe06b19d4fff2d77ee3079746eb2950c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Embla=20=C3=98ye?= Date: Mon, 10 Feb 2025 15:38:23 +0100 Subject: [PATCH 49/50] Delete unused Tests project --- client/Boundaries/Tests/Tests.csproj | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 client/Boundaries/Tests/Tests.csproj diff --git a/client/Boundaries/Tests/Tests.csproj b/client/Boundaries/Tests/Tests.csproj deleted file mode 100644 index 59286f02..00000000 --- a/client/Boundaries/Tests/Tests.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - - net8.0 - enable - enable - - false - true - - - - - - - - - - - - - - - From d0d4f99d87eac545ca1c2d2de3bf2053953ce379 Mon Sep 17 00:00:00 2001 From: Dag Hovland Date: Mon, 17 Feb 2025 08:31:19 +0100 Subject: [PATCH 50/50] Fixed rdfox integration test --- .github/workflows/pull_request_tester.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pull_request_tester.yml b/.github/workflows/pull_request_tester.yml index 2e0bb76d..e4988ef6 100644 --- a/.github/workflows/pull_request_tester.yml +++ b/.github/workflows/pull_request_tester.yml @@ -10,11 +10,14 @@ jobs: dotnet-tests: runs-on: ubuntu-latest name: ".NET Tests & Reports" - timeout-minutes: 5 + timeout-minutes: 10 steps: - name: Checkout uses: actions/checkout@v4 + - name: Download RDFox license key + run: echo "${{ secrets.RDFOX_LICENSE_CONTENT }}" > ./RDFox.lic + - name: Setup .NET run: | sudo add-apt-repository ppa:dotnet/backports @@ -29,3 +32,6 @@ jobs: - name: Test run: | dotnet test ./client/Boundaries/Boundaries.sln --no-build --verbosity normal + + - name: Delete license file + run: rm ./RDFox.lic \ No newline at end of file