diff --git a/demo/nad-created.html b/demo/nad-created.html
index 036e2631..fa654400 100644
--- a/demo/nad-created.html
+++ b/demo/nad-created.html
@@ -113,6 +113,7 @@
Network Area Diagram SVGs created from diagram metadata
Edge info with double arrows from metadata
+
Custom style provider
diff --git a/packages/network-viewer-core/src/network-area-diagram-viewer/edge-router.ts b/packages/network-viewer-core/src/network-area-diagram-viewer/edge-router.ts
index 58ac197f..f229b097 100644
--- a/packages/network-viewer-core/src/network-area-diagram-viewer/edge-router.ts
+++ b/packages/network-viewer-core/src/network-area-diagram-viewer/edge-router.ts
@@ -17,11 +17,17 @@ import { HalfEdge, LabelData } from './diagram-types';
export class EdgeRouter {
diagramMetadata: DiagramMetadata;
svgParameters: SvgParameters;
+ // points of each half edge of edges
edgePoints: Record = {};
+ // data (position and arrow angle) for side infos of each half edge of edges
edgeSideData: Record = {};
+ // label data (angle, internal and external shift and style) for side infos of each half edge of edges
edgeSideLabelData: Record = {};
+ // data (position and arrow angle) for middle infos of edges
edgeMiddleData: Record = {};
+ // label data (angle, internal and external shift and style) for middle infos of edges
edgeMiddleLabelData: Record = {};
+ // points of 3wt edges
threeWTEdgePoints: Record = {};
nodeAngles: Record = {};
@@ -176,29 +182,32 @@ export class EdgeRouter {
const node2Angles: number[] = this.nodeAngles[edge.node2] ?? [];
node2Angles.push(angle2);
this.nodeAngles[edge.node2] = node2Angles;
- this.storeEdgeInfos(edge, halfEdges);
+ this.storeEdgeInfos(edge, halfEdges, false);
}
- private storeEdgeInfos(edge: EdgeMetadata, halfEdges: HalfEdge[] | null[]) {
+ private storeEdgeInfos(edge: EdgeMetadata, halfEdges: HalfEdge[] | null[], isLoop: boolean) {
if (edge.edgeInfo1 || edge.edgeInfo2) {
- this.storeEdgeSideData(edge.svgId, halfEdges);
+ this.storeEdgeSideData(edge.svgId, halfEdges, isLoop);
}
if (edge.edgeInfoMiddle) {
this.storeEdgeMiddleData(edge.svgId, halfEdges);
}
}
- private storeEdgeSideData(edgeId: string, halfEdges: HalfEdge[] | null[]) {
+ // given an edge id and 2 half edges, store data for edge side infos
+ // the isLoop parameter is needed because the computation of the position of edge side info
+ // is different if we are dealing with loop edges
+ private storeEdgeSideData(edgeId: string, halfEdges: HalfEdge[] | null[], isLoop: boolean) {
if (!halfEdges[0] || !halfEdges[1]) {
return;
}
this.edgeSideData[edgeId] = [
[
- HalfEdgeUtils.getInfoPoint(halfEdges[0], this.svgParameters),
+ isLoop ? halfEdges[0].edgePoints[1] : HalfEdgeUtils.getInfoPoint(halfEdges[0], this.svgParameters),
HalfEdgeUtils.getArrowRotation(halfEdges[0]),
],
[
- HalfEdgeUtils.getInfoPoint(halfEdges[1], this.svgParameters),
+ isLoop ? halfEdges[1].edgePoints[1] : HalfEdgeUtils.getInfoPoint(halfEdges[1], this.svgParameters),
HalfEdgeUtils.getArrowRotation(halfEdges[1]),
],
];
@@ -366,7 +375,7 @@ export class EdgeRouter {
return;
}
this.edgePoints[edge.svgId] = [halfEdges[0].edgePoints, halfEdges[1].edgePoints];
- this.storeEdgeInfos(edge, halfEdges);
+ this.storeEdgeInfos(edge, halfEdges, true);
}
private storeThreeWtEdges(edgesMap: Record) {
diff --git a/packages/network-viewer-core/src/network-area-diagram-viewer/half-edge-utils.test.ts b/packages/network-viewer-core/src/network-area-diagram-viewer/half-edge-utils.test.ts
index f2d3e198..cbd8abb8 100644
--- a/packages/network-viewer-core/src/network-area-diagram-viewer/half-edge-utils.test.ts
+++ b/packages/network-viewer-core/src/network-area-diagram-viewer/half-edge-utils.test.ts
@@ -494,20 +494,22 @@ test('getHalfEdges', () => {
expect(halfEdges[0]).not.toBeNull();
if (halfEdges[0]) {
expect(halfEdges[0].edgePoints.length).toBe(3);
- expect(round(halfEdges[0].edgePoints[0].x)).toBeCloseTo(-220.63);
- expect(round(halfEdges[0].edgePoints[0].y)).toBeCloseTo(22.08);
- expect(round(halfEdges[0].edgePoints[1].x)).toBeCloseTo(-173.6);
- expect(round(halfEdges[0].edgePoints[1].y)).toBeCloseTo(-1.26);
+ expect(halfEdges[0].side).toBe('1');
+ expect(round(halfEdges[0].edgePoints[0].x)).toBeCloseTo(117.43);
+ expect(round(halfEdges[0].edgePoints[0].y)).toBeCloseTo(43.39);
+ expect(round(halfEdges[0].edgePoints[1].x)).toBeCloseTo(73.7);
+ expect(round(halfEdges[0].edgePoints[1].y)).toBeCloseTo(14.33);
expect(round(halfEdges[0].edgePoints[2].x)).toBeCloseTo(-49.95);
expect(round(halfEdges[0].edgePoints[2].y)).toBeCloseTo(6.53);
}
expect(halfEdges[1]).not.toBeNull();
if (halfEdges[1]) {
expect(halfEdges[1].edgePoints.length).toBe(3);
- expect(round(halfEdges[1].edgePoints[0].x)).toBeCloseTo(117.43);
- expect(round(halfEdges[1].edgePoints[0].y)).toBeCloseTo(43.39);
- expect(round(halfEdges[1].edgePoints[1].x)).toBeCloseTo(73.7);
- expect(round(halfEdges[1].edgePoints[1].y)).toBeCloseTo(14.33);
+ expect(halfEdges[1].side).toBe('2');
+ expect(round(halfEdges[1].edgePoints[0].x)).toBeCloseTo(-220.63);
+ expect(round(halfEdges[1].edgePoints[0].y)).toBeCloseTo(22.08);
+ expect(round(halfEdges[1].edgePoints[1].x)).toBeCloseTo(-173.6);
+ expect(round(halfEdges[1].edgePoints[1].y)).toBeCloseTo(-1.26);
expect(round(halfEdges[1].edgePoints[2].x)).toBeCloseTo(-49.95);
expect(round(halfEdges[1].edgePoints[2].y)).toBeCloseTo(6.53);
}
diff --git a/packages/network-viewer-core/src/network-area-diagram-viewer/half-edge-utils.ts b/packages/network-viewer-core/src/network-area-diagram-viewer/half-edge-utils.ts
index 47452f5b..465268b0 100644
--- a/packages/network-viewer-core/src/network-area-diagram-viewer/half-edge-utils.ts
+++ b/packages/network-viewer-core/src/network-area-diagram-viewer/half-edge-utils.ts
@@ -23,7 +23,14 @@ import {
isTransformerEdge,
radToDeg,
} from './diagram-utils';
-import { getBusNodeMetadata, getEdgePoints, getEdgeType, getNodeMetadata, getNodeRadius } from './metadata-utils';
+import {
+ getBusNodeMetadata,
+ getEdgePoints,
+ getEdgeType,
+ getNodeMetadata,
+ getNodeRadius,
+ samePosition,
+} from './metadata-utils';
import { HalfEdge, LabelData } from './diagram-types';
import { getPathPoints, getTransform } from './svg-utils';
@@ -278,7 +285,7 @@ export function getHalfEdges(
edge.bendingPoints
);
const halfEdge1: HalfEdge = {
- side: '1',
+ side: samePosition(node1, point1) ? '1' : '2',
fork: groupedEdgesCount > 1,
busOuterRadius: nodeRadius1.busOuterRadius,
voltageLevelRadius: nodeRadius1.voltageLevelRadius,
@@ -286,14 +293,14 @@ export function getHalfEdges(
edgePoints: edgePoints[0],
};
const halfEdge2: HalfEdge = {
- side: '2',
+ side: samePosition(node2, point2) ? '2' : '1',
fork: groupedEdgesCount > 1,
busOuterRadius: nodeRadius2.busOuterRadius,
voltageLevelRadius: nodeRadius2.voltageLevelRadius,
edgeInfoId: edge.edgeInfo2?.svgId,
edgePoints: edgePoints[1],
};
- return [halfEdge1, halfEdge2];
+ return [samePosition(node1, point1) ? halfEdge1 : halfEdge2, samePosition(node2, point2) ? halfEdge2 : halfEdge1];
}
export function getHalfEdgesLoop(
diff --git a/packages/network-viewer-core/src/network-area-diagram-viewer/metadata-utils.test.ts b/packages/network-viewer-core/src/network-area-diagram-viewer/metadata-utils.test.ts
index d7f540b5..f5170c8f 100644
--- a/packages/network-viewer-core/src/network-area-diagram-viewer/metadata-utils.test.ts
+++ b/packages/network-viewer-core/src/network-area-diagram-viewer/metadata-utils.test.ts
@@ -594,3 +594,16 @@ test('getEdgeType', () => {
expect(MetadataUtils.getEdgeType(edge)).toBe(EdgeType.TWO_WINDINGS_TRANSFORMER);
expect(MetadataUtils.getStringEdgeType(edge)).toBe('TWO_WINDINGS_TRANSFORMER');
});
+
+test('samePosition', () => {
+ const node: NodeMetadata = {
+ svgId: '4',
+ equipmentId: 'VL',
+ x: 100,
+ y: 100,
+ };
+ expect(MetadataUtils.samePosition(node, new Point(100, 100))).toBe(true);
+ expect(MetadataUtils.samePosition(node, new Point(90, 100))).toBe(false);
+ expect(MetadataUtils.samePosition(node, new Point(100, 90))).toBe(false);
+ expect(MetadataUtils.samePosition(node, new Point(90, 90))).toBe(false);
+});
diff --git a/packages/network-viewer-core/src/network-area-diagram-viewer/metadata-utils.ts b/packages/network-viewer-core/src/network-area-diagram-viewer/metadata-utils.ts
index 4cccf34e..611abefd 100644
--- a/packages/network-viewer-core/src/network-area-diagram-viewer/metadata-utils.ts
+++ b/packages/network-viewer-core/src/network-area-diagram-viewer/metadata-utils.ts
@@ -411,3 +411,7 @@ export function isBoundaryNode(node: NodeMetadata): boolean {
export function getNodeType(node: NodeMetadata): NodeType {
return node.type === undefined ? NodeType.UNKNOWN : (NodeTypeMapping[node.type] ?? NodeType.UNKNOWN);
}
+
+export function samePosition(node: NodeMetadata, point: Point): boolean {
+ return point.x == node.x && point.y == node.y;
+}
diff --git a/packages/network-viewer-core/src/network-area-diagram-viewer/svg-writer.test.ts b/packages/network-viewer-core/src/network-area-diagram-viewer/svg-writer.test.ts
index 0e395b7b..4f9c70c8 100644
--- a/packages/network-viewer-core/src/network-area-diagram-viewer/svg-writer.test.ts
+++ b/packages/network-viewer-core/src/network-area-diagram-viewer/svg-writer.test.ts
@@ -7,14 +7,21 @@
*/
import '../../../../global.d.ts';
-import IEE14CdfNetworkMetadata from '../resources/test-data/nad-ieee14cdf-solved_metadata.json';
+
+import IEEE14CdfNetworkMetadata from '../resources/test-data/nad-ieee14cdf-solved_metadata.json';
import FourSubstationsNetworkCustomStyleMetadata from '../resources/test-data/nad-four-substations_custom_metadata.json';
+import EurostagNetworkMetadata from '../resources/test-data/nad-eurostag-tutorial-example1_metadata.json';
+import IEEE9NetworkMetadata from '../resources/test-data/nad-ieee9-zeroimpedance-cdf_metadata.json';
+import FourSubstationsNetworkMetadata from '../resources/test-data/nad-four-substations_metadata.json';
+import IEEE9NetworkMiddleArrowsMetadata from '../resources/test-data/nad-ieee9-zeroimpedance-cdf-middle-arrow_metadata.json';
+import FourSubstationsNetworkMultipleLabelsMetadata from '../resources/test-data/nad-four-substations-multiple-labels_metadata.json';
+import DoubleArrowsNetworkMetadata from '../resources/test-data/nad-double-arrows-with-middle-values_metadata.json';
import { SvgWriter } from './svg-writer';
import { getSvgFromFile } from './test-utils';
-test('testIEE14CdfNetwork', () => {
- const actual = new SvgWriter(IEE14CdfNetworkMetadata).getSvg({ width: 0, height: 0 });
+test('testIEEE14CdfNetwork', () => {
+ const actual = new SvgWriter(IEEE14CdfNetworkMetadata).getSvg({ width: 0, height: 0 });
const expected = getSvgFromFile('../resources/test-data/nad-ieee14cdf-solved.svg');
expect(actual).toEqualSvg(expected, { epsilon: 0.1 });
});
@@ -24,3 +31,39 @@ test('testFourSubstationsNetworkCustomStyle', () => {
const expected = getSvgFromFile('../resources/test-data/nad-four-substations_custom.svg');
expect(actual).toEqualSvg(expected, { epsilon: 0.1 });
});
+
+test('testEurostagNetwork', () => {
+ const actual = new SvgWriter(EurostagNetworkMetadata).getSvg({ width: 0, height: 0 });
+ const expected = getSvgFromFile('../resources/test-data/nad-eurostag-tutorial-example1.svg');
+ expect(actual).toEqualSvg(expected, { epsilon: 0.1 });
+});
+
+test('testIEEE9Network', () => {
+ const actual = new SvgWriter(IEEE9NetworkMetadata).getSvg({ width: 0, height: 0 });
+ const expected = getSvgFromFile('../resources/test-data/nad-ieee9-zeroimpedance-cdf.svg');
+ expect(actual).toEqualSvg(expected, { epsilon: 0.1 });
+});
+
+test('testFourSubstationsNetwork', () => {
+ const actual = new SvgWriter(FourSubstationsNetworkMetadata).getSvg({ width: 0, height: 0 });
+ const expected = getSvgFromFile('../resources/test-data/nad-four-substations.svg');
+ expect(actual).toEqualSvg(expected, { epsilon: 0.1 });
+});
+
+test('testIEEE9NetworkMiddleArrows', () => {
+ const actual = new SvgWriter(IEEE9NetworkMiddleArrowsMetadata).getSvg({ width: 0, height: 0 });
+ const expected = getSvgFromFile('../resources/test-data/nad-ieee9-zeroimpedance-cdf-middle-arrow.svg');
+ expect(actual).toEqualSvg(expected, { epsilon: 0.1 });
+});
+
+test('testFourSubstationsNetworkMultipleLabelsNetwork', () => {
+ const actual = new SvgWriter(FourSubstationsNetworkMultipleLabelsMetadata).getSvg({ width: 0, height: 0 });
+ const expected = getSvgFromFile('../resources/test-data/nad-four-substations-multiple-labels.svg');
+ expect(actual).toEqualSvg(expected, { epsilon: 0.1 });
+});
+
+test('testDoubleArrowsNetwork', () => {
+ const actual = new SvgWriter(DoubleArrowsNetworkMetadata).getSvg({ width: 0, height: 0 });
+ const expected = getSvgFromFile('../resources/test-data/nad-double-arrows-with-middle-values.svg');
+ expect(actual).toEqualSvg(expected, { epsilon: 0.1 });
+});
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-double-arrows-with-middle-values.svg b/packages/network-viewer-core/src/resources/test-data/nad-double-arrows-with-middle-values.svg
new file mode 100644
index 00000000..860e16cb
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-double-arrows-with-middle-values.svg
@@ -0,0 +1,73 @@
+
+
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-double-arrows-with-middle-values_metadata.json b/packages/network-viewer-core/src/resources/test-data/nad-double-arrows-with-middle-values_metadata.json
new file mode 100644
index 00000000..29e3f645
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-double-arrows-with-middle-values_metadata.json
@@ -0,0 +1,188 @@
+{
+ "layoutParameters" : {
+ "textNodesForceLayout" : false,
+ "textNodeFixedShift" : {
+ "x" : 100.0,
+ "y" : -40.0
+ },
+ "maxSteps" : 1000,
+ "timeoutSeconds" : 15.0,
+ "textNodeEdgeConnectionYShift" : 25.0,
+ "injectionsAdded" : false,
+ "scaleFactor" : 1.0
+ },
+ "svgParameters" : {
+ "diagramPadding" : {
+ "left" : 200.0,
+ "top" : 200.0,
+ "right" : 200.0,
+ "bottom" : 200.0
+ },
+ "insertNameDesc" : false,
+ "svgWidthAndHeightAdded" : false,
+ "cssLocation" : "EXTERNAL_NO_IMPORT",
+ "sizeConstraint" : "FIXED_SCALE",
+ "fixedWidth" : -1,
+ "fixedHeight" : -1,
+ "fixedScale" : 0.2,
+ "arrowShift" : 30.0,
+ "arrowLabelShift" : 19.0,
+ "converterStationWidth" : 70.0,
+ "voltageLevelCircleRadius" : 30.0,
+ "fictitiousVoltageLevelCircleRadius" : 15.0,
+ "transformerCircleRadius" : 20.0,
+ "nodeHollowWidth" : 15.0,
+ "edgesForkLength" : 80.0,
+ "edgesForkAperture" : 60.0,
+ "edgeStartShift" : 0.0,
+ "unknownBusNodeExtraRadius" : 10.0,
+ "loopDistance" : 120.0,
+ "loopEdgesAperture" : 60.0,
+ "loopControlDistance" : 40.0,
+ "edgeInfoAlongEdge" : true,
+ "interAnnulusSpace" : 5.0,
+ "svgPrefix" : "",
+ "arrowPathIn" : "M-10 -10 H10 L0 10z",
+ "arrowPathOut" : "M-10 10 H10 L0 -10z",
+ "languageTag" : "en",
+ "voltageValuePrecision" : 1,
+ "powerValuePrecision" : 0,
+ "angleValuePrecision" : 1,
+ "currentValuePrecision" : 0,
+ "percentageValuePrecision" : 0,
+ "pstArrowHeadSize" : 8.0,
+ "undefinedValueSymbol" : "",
+ "highlightGraph" : false,
+ "injectionAperture" : 10.0,
+ "injectionEdgeLength" : 145.0,
+ "injectionCircleRadius" : 25.0,
+ "voltageLevelLegendsIncluded" : true,
+ "edgeInfosIncluded" : true,
+ "doubleArrowShiftFactorArrows" : 1.5,
+ "doubleArrowShiftFactorText" : 1.8
+ },
+ "busNodes" : [ {
+ "svgId" : "3",
+ "equipmentId" : "vl_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "0",
+ "legend" : " kV / °",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "7",
+ "equipmentId" : "vl2_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "4",
+ "legend" : " kV / °",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "9",
+ "equipmentId" : "dl1",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "8",
+ "classes" : [ "nad-bus-0" ]
+ } ],
+ "nodes" : [ {
+ "svgId" : "0",
+ "equipmentId" : "vl",
+ "x" : -94.84,
+ "y" : -119.74,
+ "legendSvgId" : "1",
+ "legendEdgeSvgId" : "2",
+ "legendHeader" : [ "vl" ],
+ "classes" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "4",
+ "equipmentId" : "vl2",
+ "x" : -432.32,
+ "y" : 17.46,
+ "legendSvgId" : "5",
+ "legendEdgeSvgId" : "6",
+ "legendHeader" : [ "vl2" ],
+ "classes" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "8",
+ "equipmentId" : "dl1",
+ "x" : 194.24,
+ "y" : 101.91,
+ "type" : "BOUNDARY",
+ "classes" : [ "nad-boundary-node", "nad-vl300to500" ]
+ } ],
+ "edges" : [ {
+ "svgId" : "10",
+ "equipmentId" : "dl1",
+ "node1" : "0",
+ "node2" : "8",
+ "busNode1" : "3",
+ "busNode2" : "9",
+ "type" : "BoundaryLineEdge",
+ "edgeInfo1" : {
+ "svgId" : "11",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "OUT",
+ "directionB" : "OUT",
+ "labelA" : "50",
+ "labelB" : "100"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "12",
+ "equipmentId" : "hvdc",
+ "node1" : "0",
+ "node2" : "4",
+ "busNode1" : "3",
+ "busNode2" : "7",
+ "type" : "HvdcLineVscEdge",
+ "edgeInfo1" : {
+ "svgId" : "13",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "OUT",
+ "directionB" : "OUT",
+ "labelA" : "50",
+ "labelB" : "100"
+ },
+ "edgeInfo2" : {
+ "svgId" : "14",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "OUT",
+ "directionB" : "OUT",
+ "labelA" : "75",
+ "labelB" : "300"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "15",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "OUT",
+ "directionB" : "OUT",
+ "labelA" : "50",
+ "labelB" : "100"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ } ],
+ "textNodes" : [ {
+ "svgId" : "1",
+ "equipmentId" : "vl",
+ "vlNode" : "0",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "5",
+ "equipmentId" : "vl2",
+ "vlNode" : "4",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ } ]
+}
\ No newline at end of file
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-eurostag-tutorial-example1.svg b/packages/network-viewer-core/src/resources/test-data/nad-eurostag-tutorial-example1.svg
new file mode 100644
index 00000000..9432387d
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-eurostag-tutorial-example1.svg
@@ -0,0 +1,100 @@
+
+
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-eurostag-tutorial-example1_metadata.json b/packages/network-viewer-core/src/resources/test-data/nad-eurostag-tutorial-example1_metadata.json
new file mode 100644
index 00000000..7865046d
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-eurostag-tutorial-example1_metadata.json
@@ -0,0 +1,243 @@
+{
+ "layoutParameters" : {
+ "textNodesForceLayout" : false,
+ "textNodeFixedShift" : {
+ "x" : 100.0,
+ "y" : -40.0
+ },
+ "maxSteps" : 1000,
+ "timeoutSeconds" : 15.0,
+ "textNodeEdgeConnectionYShift" : 25.0,
+ "injectionsAdded" : false,
+ "scaleFactor" : 1.0
+ },
+ "svgParameters" : {
+ "diagramPadding" : {
+ "left" : 200.0,
+ "top" : 200.0,
+ "right" : 200.0,
+ "bottom" : 200.0
+ },
+ "insertNameDesc" : false,
+ "svgWidthAndHeightAdded" : false,
+ "cssLocation" : "EXTERNAL_NO_IMPORT",
+ "sizeConstraint" : "FIXED_SCALE",
+ "fixedWidth" : -1,
+ "fixedHeight" : -1,
+ "fixedScale" : 0.2,
+ "arrowShift" : 30.0,
+ "arrowLabelShift" : 19.0,
+ "converterStationWidth" : 70.0,
+ "voltageLevelCircleRadius" : 30.0,
+ "fictitiousVoltageLevelCircleRadius" : 15.0,
+ "transformerCircleRadius" : 20.0,
+ "nodeHollowWidth" : 15.0,
+ "edgesForkLength" : 80.0,
+ "edgesForkAperture" : 60.0,
+ "edgeStartShift" : 0.0,
+ "unknownBusNodeExtraRadius" : 10.0,
+ "loopDistance" : 120.0,
+ "loopEdgesAperture" : 60.0,
+ "loopControlDistance" : 40.0,
+ "edgeInfoAlongEdge" : true,
+ "interAnnulusSpace" : 5.0,
+ "svgPrefix" : "",
+ "arrowPathIn" : "M-10 -10 H10 L0 10z",
+ "arrowPathOut" : "M-10 10 H10 L0 -10z",
+ "languageTag" : "en",
+ "voltageValuePrecision" : 1,
+ "powerValuePrecision" : 0,
+ "angleValuePrecision" : 1,
+ "currentValuePrecision" : 0,
+ "percentageValuePrecision" : 0,
+ "pstArrowHeadSize" : 8.0,
+ "undefinedValueSymbol" : "",
+ "highlightGraph" : false,
+ "injectionAperture" : 10.0,
+ "injectionEdgeLength" : 145.0,
+ "injectionCircleRadius" : 25.0,
+ "voltageLevelLegendsIncluded" : true,
+ "edgeInfosIncluded" : true,
+ "doubleArrowShiftFactorArrows" : 1.5,
+ "doubleArrowShiftFactorText" : 1.8
+ },
+ "busNodes" : [ {
+ "svgId" : "3",
+ "equipmentId" : "VLGEN_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "0",
+ "legend" : " kV / °",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "7",
+ "equipmentId" : "VLHV1_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "4",
+ "legend" : " kV / °",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "11",
+ "equipmentId" : "VLHV2_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "8",
+ "legend" : " kV / °",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "15",
+ "equipmentId" : "VLLOAD_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "12",
+ "legend" : " kV / °",
+ "classes" : [ "nad-bus-0" ]
+ } ],
+ "nodes" : [ {
+ "svgId" : "0",
+ "equipmentId" : "VLGEN",
+ "x" : -452.59,
+ "y" : -274.01,
+ "legendSvgId" : "1",
+ "legendEdgeSvgId" : "2",
+ "legendHeader" : [ "VLGEN" ],
+ "classes" : [ "nad-vl0to30" ]
+ }, {
+ "svgId" : "4",
+ "equipmentId" : "VLHV1",
+ "x" : -245.26,
+ "y" : 34.3,
+ "legendSvgId" : "5",
+ "legendEdgeSvgId" : "6",
+ "legendHeader" : [ "VLHV1" ],
+ "classes" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "8",
+ "equipmentId" : "VLHV2",
+ "x" : 140.33,
+ "y" : 58.61,
+ "legendSvgId" : "9",
+ "legendEdgeSvgId" : "10",
+ "legendHeader" : [ "VLHV2" ],
+ "classes" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "12",
+ "equipmentId" : "VLLOAD",
+ "x" : 430.9,
+ "y" : -174.05,
+ "legendSvgId" : "13",
+ "legendEdgeSvgId" : "14",
+ "legendHeader" : [ "VLLOAD" ],
+ "classes" : [ "nad-vl120to180" ]
+ } ],
+ "edges" : [ {
+ "svgId" : "16",
+ "equipmentId" : "NGEN_NHV1",
+ "node1" : "0",
+ "node2" : "4",
+ "busNode1" : "3",
+ "busNode2" : "7",
+ "type" : "TwoWtEdge",
+ "edgeInfoMiddle" : {
+ "svgId" : "17",
+ "infoTypeA" : "Name",
+ "labelA" : "NGEN_NHV1"
+ },
+ "classes1" : [ "nad-vl0to30" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "18",
+ "equipmentId" : "NHV1_NHV2_1",
+ "node1" : "4",
+ "node2" : "8",
+ "busNode1" : "7",
+ "busNode2" : "11",
+ "type" : "LineEdge",
+ "edgeInfoMiddle" : {
+ "svgId" : "19",
+ "infoTypeA" : "Name",
+ "labelA" : "NHV1_NHV2_1"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "20",
+ "equipmentId" : "NHV1_NHV2_2",
+ "node1" : "4",
+ "node2" : "8",
+ "busNode1" : "7",
+ "busNode2" : "11",
+ "type" : "LineEdge",
+ "edgeInfoMiddle" : {
+ "svgId" : "21",
+ "infoTypeA" : "Name",
+ "labelA" : "NHV1_NHV2_2"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "22",
+ "equipmentId" : "NHV1_NHV2_3",
+ "node1" : "8",
+ "node2" : "4",
+ "busNode1" : "11",
+ "busNode2" : "7",
+ "type" : "LineEdge",
+ "edgeInfoMiddle" : {
+ "svgId" : "23",
+ "infoTypeA" : "Name",
+ "labelA" : "NHV1_NHV2_3"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "24",
+ "equipmentId" : "NHV2_NLOAD",
+ "node1" : "8",
+ "node2" : "12",
+ "busNode1" : "11",
+ "busNode2" : "15",
+ "type" : "TwoWtEdge",
+ "edgeInfoMiddle" : {
+ "svgId" : "25",
+ "infoTypeA" : "Name",
+ "labelA" : "NHV2_NLOAD"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl120to180" ]
+ } ],
+ "textNodes" : [ {
+ "svgId" : "1",
+ "equipmentId" : "VLGEN",
+ "vlNode" : "0",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "5",
+ "equipmentId" : "VLHV1",
+ "vlNode" : "4",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "9",
+ "equipmentId" : "VLHV2",
+ "vlNode" : "8",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "13",
+ "equipmentId" : "VLLOAD",
+ "vlNode" : "12",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ } ]
+}
\ No newline at end of file
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-four-substations-multiple-labels.svg b/packages/network-viewer-core/src/resources/test-data/nad-four-substations-multiple-labels.svg
new file mode 100644
index 00000000..ba6611be
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-four-substations-multiple-labels.svg
@@ -0,0 +1,178 @@
+
+
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-four-substations-multiple-labels_metadata.json b/packages/network-viewer-core/src/resources/test-data/nad-four-substations-multiple-labels_metadata.json
new file mode 100644
index 00000000..d4a4863d
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-four-substations-multiple-labels_metadata.json
@@ -0,0 +1,367 @@
+{
+ "layoutParameters" : {
+ "textNodesForceLayout" : false,
+ "textNodeFixedShift" : {
+ "x" : 100.0,
+ "y" : -40.0
+ },
+ "maxSteps" : 1000,
+ "timeoutSeconds" : 15.0,
+ "textNodeEdgeConnectionYShift" : 25.0,
+ "injectionsAdded" : false,
+ "scaleFactor" : 1.0
+ },
+ "svgParameters" : {
+ "diagramPadding" : {
+ "left" : 200.0,
+ "top" : 200.0,
+ "right" : 200.0,
+ "bottom" : 200.0
+ },
+ "insertNameDesc" : false,
+ "svgWidthAndHeightAdded" : false,
+ "cssLocation" : "EXTERNAL_NO_IMPORT",
+ "sizeConstraint" : "FIXED_SCALE",
+ "fixedWidth" : -1,
+ "fixedHeight" : -1,
+ "fixedScale" : 0.2,
+ "arrowShift" : 30.0,
+ "arrowLabelShift" : 19.0,
+ "converterStationWidth" : 70.0,
+ "voltageLevelCircleRadius" : 30.0,
+ "fictitiousVoltageLevelCircleRadius" : 15.0,
+ "transformerCircleRadius" : 20.0,
+ "nodeHollowWidth" : 15.0,
+ "edgesForkLength" : 80.0,
+ "edgesForkAperture" : 60.0,
+ "edgeStartShift" : 0.0,
+ "unknownBusNodeExtraRadius" : 10.0,
+ "loopDistance" : 120.0,
+ "loopEdgesAperture" : 60.0,
+ "loopControlDistance" : 40.0,
+ "edgeInfoAlongEdge" : true,
+ "interAnnulusSpace" : 5.0,
+ "svgPrefix" : "",
+ "arrowPathIn" : "M-10 -10 H10 L0 10z",
+ "arrowPathOut" : "M-10 10 H10 L0 -10z",
+ "languageTag" : "en",
+ "voltageValuePrecision" : 1,
+ "powerValuePrecision" : 0,
+ "angleValuePrecision" : 1,
+ "currentValuePrecision" : 0,
+ "percentageValuePrecision" : 0,
+ "pstArrowHeadSize" : 8.0,
+ "undefinedValueSymbol" : "",
+ "highlightGraph" : false,
+ "injectionAperture" : 10.0,
+ "injectionEdgeLength" : 145.0,
+ "injectionCircleRadius" : 25.0,
+ "voltageLevelLegendsIncluded" : true,
+ "edgeInfosIncluded" : true,
+ "doubleArrowShiftFactorArrows" : 1.5,
+ "doubleArrowShiftFactorText" : 1.8
+ },
+ "busNodes" : [ {
+ "svgId" : "3",
+ "equipmentId" : "S1VL1_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "0",
+ "legend" : "224.6 kV / 2.3°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "7",
+ "equipmentId" : "S1VL2_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "4",
+ "legend" : "400.0 kV / 0.0°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "11",
+ "equipmentId" : "S2VL1_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "8",
+ "legend" : "408.8 kV / 0.7°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "15",
+ "equipmentId" : "S3VL1_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "12",
+ "legend" : "400.0 kV / 0.0°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "19",
+ "equipmentId" : "S4VL1_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "16",
+ "legend" : "400.0 kV / -1.1°",
+ "classes" : [ "nad-bus-0" ]
+ } ],
+ "nodes" : [ {
+ "svgId" : "0",
+ "equipmentId" : "S1VL1",
+ "x" : -220.4,
+ "y" : -515.14,
+ "legendSvgId" : "1",
+ "legendEdgeSvgId" : "2",
+ "legendHeader" : [ "S1VL1" ],
+ "classes" : [ "nad-vl180to300" ]
+ }, {
+ "svgId" : "4",
+ "equipmentId" : "S1VL2",
+ "x" : -152.34,
+ "y" : -133.8,
+ "legendSvgId" : "5",
+ "legendEdgeSvgId" : "6",
+ "legendHeader" : [ "S1VL2" ],
+ "classes" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "8",
+ "equipmentId" : "S2VL1",
+ "x" : -162.93,
+ "y" : 231.51,
+ "legendSvgId" : "9",
+ "legendEdgeSvgId" : "10",
+ "legendHeader" : [ "S2VL1" ],
+ "classes" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "12",
+ "equipmentId" : "S3VL1",
+ "x" : 171.13,
+ "y" : 91.69,
+ "legendSvgId" : "13",
+ "legendEdgeSvgId" : "14",
+ "legendHeader" : [ "S3VL1" ],
+ "classes" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "16",
+ "equipmentId" : "S4VL1",
+ "x" : 497.34,
+ "y" : 302.31,
+ "legendSvgId" : "17",
+ "legendEdgeSvgId" : "18",
+ "legendHeader" : [ "S4VL1" ],
+ "classes" : [ "nad-vl300to500" ]
+ } ],
+ "edges" : [ {
+ "svgId" : "20",
+ "equipmentId" : "TWT",
+ "node1" : "0",
+ "node2" : "4",
+ "busNode1" : "3",
+ "busNode2" : "7",
+ "type" : "PstEdge",
+ "edgeInfo1" : {
+ "svgId" : "21",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "IN",
+ "directionB" : "IN",
+ "labelA" : "-10",
+ "labelB" : "-80"
+ },
+ "edgeInfo2" : {
+ "svgId" : "22",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "OUT",
+ "directionB" : "OUT",
+ "labelA" : "5",
+ "labelB" : "80"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "23",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "TWT",
+ "labelB" : "207"
+ },
+ "classes1" : [ "nad-vl180to300" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "24",
+ "equipmentId" : "HVDC2",
+ "node1" : "4",
+ "node2" : "12",
+ "busNode1" : "7",
+ "busNode2" : "15",
+ "type" : "HvdcLineLccEdge",
+ "edgeInfo1" : {
+ "svgId" : "25",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "81"
+ },
+ "edgeInfo2" : {
+ "svgId" : "26",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-79"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "27",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "labelA" : "LCC1"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "28",
+ "equipmentId" : "HVDC1",
+ "node1" : "4",
+ "node2" : "8",
+ "busNode1" : "7",
+ "busNode2" : "11",
+ "type" : "HvdcLineVscEdge",
+ "edgeInfo1" : {
+ "svgId" : "29",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "IN",
+ "directionB" : "OUT",
+ "labelA" : "-512",
+ "labelB" : "10"
+ },
+ "edgeInfo2" : {
+ "svgId" : "30",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "IN",
+ "directionB" : "IN",
+ "labelA" : "-120",
+ "labelB" : "-10"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "31",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "VSC1",
+ "labelB" : "739"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "32",
+ "equipmentId" : "LINE_S2S3",
+ "node1" : "8",
+ "node2" : "12",
+ "busNode1" : "11",
+ "busNode2" : "15",
+ "type" : "LineEdge",
+ "edgeInfo1" : {
+ "svgId" : "33",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "OUT",
+ "directionB" : "OUT",
+ "labelA" : "190",
+ "labelB" : "110"
+ },
+ "edgeInfo2" : {
+ "svgId" : "34",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "IN",
+ "directionB" : "IN",
+ "labelA" : "-185",
+ "labelB" : "-110"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "35",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "LINE_S2S3",
+ "labelB" : "310"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "36",
+ "equipmentId" : "LINE_S3S4",
+ "node1" : "12",
+ "node2" : "16",
+ "busNode1" : "15",
+ "busNode2" : "19",
+ "type" : "LineEdge",
+ "edgeInfo1" : {
+ "svgId" : "37",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "OUT",
+ "directionB" : "OUT",
+ "labelA" : "2",
+ "labelB" : "240"
+ },
+ "edgeInfo2" : {
+ "svgId" : "38",
+ "infoTypeA" : "ReactivePower",
+ "infoTypeB" : "ActivePower",
+ "directionA" : "OUT",
+ "directionB" : "IN",
+ "labelA" : "3",
+ "labelB" : "-240"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "39",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "LINE_S3S4",
+ "labelB" : "346"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ } ],
+ "textNodes" : [ {
+ "svgId" : "1",
+ "equipmentId" : "S1VL1",
+ "vlNode" : "0",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "5",
+ "equipmentId" : "S1VL2",
+ "vlNode" : "4",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "9",
+ "equipmentId" : "S2VL1",
+ "vlNode" : "8",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "13",
+ "equipmentId" : "S3VL1",
+ "vlNode" : "12",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "17",
+ "equipmentId" : "S4VL1",
+ "vlNode" : "16",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ } ]
+}
\ No newline at end of file
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-four-substations.svg b/packages/network-viewer-core/src/resources/test-data/nad-four-substations.svg
new file mode 100644
index 00000000..61e203a5
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-four-substations.svg
@@ -0,0 +1,139 @@
+
+
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-four-substations_metadata.json b/packages/network-viewer-core/src/resources/test-data/nad-four-substations_metadata.json
new file mode 100644
index 00000000..35c76957
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-four-substations_metadata.json
@@ -0,0 +1,303 @@
+{
+ "layoutParameters" : {
+ "textNodesForceLayout" : false,
+ "textNodeFixedShift" : {
+ "x" : 100.0,
+ "y" : -40.0
+ },
+ "maxSteps" : 1000,
+ "timeoutSeconds" : 15.0,
+ "textNodeEdgeConnectionYShift" : 25.0,
+ "injectionsAdded" : false,
+ "scaleFactor" : 1.0
+ },
+ "svgParameters" : {
+ "diagramPadding" : {
+ "left" : 200.0,
+ "top" : 200.0,
+ "right" : 200.0,
+ "bottom" : 200.0
+ },
+ "insertNameDesc" : false,
+ "svgWidthAndHeightAdded" : false,
+ "cssLocation" : "EXTERNAL_NO_IMPORT",
+ "sizeConstraint" : "FIXED_SCALE",
+ "fixedWidth" : -1,
+ "fixedHeight" : -1,
+ "fixedScale" : 0.2,
+ "arrowShift" : 30.0,
+ "arrowLabelShift" : 19.0,
+ "converterStationWidth" : 70.0,
+ "voltageLevelCircleRadius" : 30.0,
+ "fictitiousVoltageLevelCircleRadius" : 15.0,
+ "transformerCircleRadius" : 20.0,
+ "nodeHollowWidth" : 15.0,
+ "edgesForkLength" : 80.0,
+ "edgesForkAperture" : 60.0,
+ "edgeStartShift" : 0.0,
+ "unknownBusNodeExtraRadius" : 10.0,
+ "loopDistance" : 120.0,
+ "loopEdgesAperture" : 60.0,
+ "loopControlDistance" : 40.0,
+ "edgeInfoAlongEdge" : true,
+ "interAnnulusSpace" : 5.0,
+ "svgPrefix" : "",
+ "arrowPathIn" : "M-10 -10 H10 L0 10z",
+ "arrowPathOut" : "M-10 10 H10 L0 -10z",
+ "languageTag" : "en",
+ "voltageValuePrecision" : 1,
+ "powerValuePrecision" : 0,
+ "angleValuePrecision" : 1,
+ "currentValuePrecision" : 0,
+ "percentageValuePrecision" : 0,
+ "pstArrowHeadSize" : 8.0,
+ "undefinedValueSymbol" : "",
+ "highlightGraph" : false,
+ "injectionAperture" : 10.0,
+ "injectionEdgeLength" : 145.0,
+ "injectionCircleRadius" : 25.0,
+ "voltageLevelLegendsIncluded" : true,
+ "edgeInfosIncluded" : true,
+ "doubleArrowShiftFactorArrows" : 1.5,
+ "doubleArrowShiftFactorText" : 1.8
+ },
+ "busNodes" : [ {
+ "svgId" : "3",
+ "equipmentId" : "S1VL1_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "0",
+ "legend" : "224.6 kV / 2.3°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "7",
+ "equipmentId" : "S1VL2_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "4",
+ "legend" : "400.0 kV / 0.0°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "11",
+ "equipmentId" : "S2VL1_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "8",
+ "legend" : "408.8 kV / 0.7°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "15",
+ "equipmentId" : "S3VL1_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "12",
+ "legend" : "400.0 kV / 0.0°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "19",
+ "equipmentId" : "S4VL1_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "16",
+ "legend" : "400.0 kV / -1.1°",
+ "classes" : [ "nad-bus-0" ]
+ } ],
+ "nodes" : [ {
+ "svgId" : "0",
+ "equipmentId" : "S1VL1",
+ "x" : -220.4,
+ "y" : -515.14,
+ "legendSvgId" : "1",
+ "legendEdgeSvgId" : "2",
+ "legendHeader" : [ "S1VL1" ],
+ "classes" : [ "nad-vl180to300" ]
+ }, {
+ "svgId" : "4",
+ "equipmentId" : "S1VL2",
+ "x" : -152.34,
+ "y" : -133.8,
+ "legendSvgId" : "5",
+ "legendEdgeSvgId" : "6",
+ "legendHeader" : [ "S1VL2" ],
+ "classes" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "8",
+ "equipmentId" : "S2VL1",
+ "x" : -162.93,
+ "y" : 231.51,
+ "legendSvgId" : "9",
+ "legendEdgeSvgId" : "10",
+ "legendHeader" : [ "S2VL1" ],
+ "classes" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "12",
+ "equipmentId" : "S3VL1",
+ "x" : 171.13,
+ "y" : 91.69,
+ "legendSvgId" : "13",
+ "legendEdgeSvgId" : "14",
+ "legendHeader" : [ "S3VL1" ],
+ "classes" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "16",
+ "equipmentId" : "S4VL1",
+ "x" : 497.34,
+ "y" : 302.31,
+ "legendSvgId" : "17",
+ "legendEdgeSvgId" : "18",
+ "legendHeader" : [ "S4VL1" ],
+ "classes" : [ "nad-vl300to500" ]
+ } ],
+ "edges" : [ {
+ "svgId" : "20",
+ "equipmentId" : "TWT",
+ "node1" : "0",
+ "node2" : "4",
+ "busNode1" : "3",
+ "busNode2" : "7",
+ "type" : "PstEdge",
+ "edgeInfo1" : {
+ "svgId" : "21",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-80"
+ },
+ "edgeInfo2" : {
+ "svgId" : "22",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "80"
+ },
+ "classes1" : [ "nad-vl180to300" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "23",
+ "equipmentId" : "HVDC2",
+ "node1" : "4",
+ "node2" : "12",
+ "busNode1" : "7",
+ "busNode2" : "15",
+ "type" : "HvdcLineLccEdge",
+ "edgeInfo1" : {
+ "svgId" : "24",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "81"
+ },
+ "edgeInfo2" : {
+ "svgId" : "25",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-79"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "26",
+ "equipmentId" : "HVDC1",
+ "node1" : "4",
+ "node2" : "8",
+ "busNode1" : "7",
+ "busNode2" : "11",
+ "type" : "HvdcLineVscEdge",
+ "edgeInfo1" : {
+ "svgId" : "27",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "10"
+ },
+ "edgeInfo2" : {
+ "svgId" : "28",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-10"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "29",
+ "equipmentId" : "LINE_S2S3",
+ "node1" : "8",
+ "node2" : "12",
+ "busNode1" : "11",
+ "busNode2" : "15",
+ "type" : "LineEdge",
+ "edgeInfo1" : {
+ "svgId" : "30",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "110"
+ },
+ "edgeInfo2" : {
+ "svgId" : "31",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-110"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ }, {
+ "svgId" : "32",
+ "equipmentId" : "LINE_S3S4",
+ "node1" : "12",
+ "node2" : "16",
+ "busNode1" : "15",
+ "busNode2" : "19",
+ "type" : "LineEdge",
+ "edgeInfo1" : {
+ "svgId" : "33",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "240"
+ },
+ "edgeInfo2" : {
+ "svgId" : "34",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-240"
+ },
+ "classes1" : [ "nad-vl300to500" ],
+ "classes2" : [ "nad-vl300to500" ]
+ } ],
+ "textNodes" : [ {
+ "svgId" : "1",
+ "equipmentId" : "S1VL1",
+ "vlNode" : "0",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "5",
+ "equipmentId" : "S1VL2",
+ "vlNode" : "4",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "9",
+ "equipmentId" : "S2VL1",
+ "vlNode" : "8",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "13",
+ "equipmentId" : "S3VL1",
+ "vlNode" : "12",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "17",
+ "equipmentId" : "S4VL1",
+ "vlNode" : "16",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ } ]
+}
\ No newline at end of file
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf-middle-arrow.svg b/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf-middle-arrow.svg
new file mode 100644
index 00000000..cbcfbee0
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf-middle-arrow.svg
@@ -0,0 +1,172 @@
+
+
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf-middle-arrow_metadata.json b/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf-middle-arrow_metadata.json
new file mode 100644
index 00000000..01b6097f
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf-middle-arrow_metadata.json
@@ -0,0 +1,423 @@
+{
+ "layoutParameters" : {
+ "textNodesForceLayout" : false,
+ "textNodeFixedShift" : {
+ "x" : 100.0,
+ "y" : -40.0
+ },
+ "maxSteps" : 1000,
+ "timeoutSeconds" : 15.0,
+ "textNodeEdgeConnectionYShift" : 25.0,
+ "injectionsAdded" : false,
+ "scaleFactor" : 1.0
+ },
+ "svgParameters" : {
+ "diagramPadding" : {
+ "left" : 200.0,
+ "top" : 200.0,
+ "right" : 200.0,
+ "bottom" : 200.0
+ },
+ "insertNameDesc" : false,
+ "svgWidthAndHeightAdded" : false,
+ "cssLocation" : "EXTERNAL_NO_IMPORT",
+ "sizeConstraint" : "FIXED_SCALE",
+ "fixedWidth" : -1,
+ "fixedHeight" : -1,
+ "fixedScale" : 0.2,
+ "arrowShift" : 30.0,
+ "arrowLabelShift" : 19.0,
+ "converterStationWidth" : 70.0,
+ "voltageLevelCircleRadius" : 30.0,
+ "fictitiousVoltageLevelCircleRadius" : 15.0,
+ "transformerCircleRadius" : 20.0,
+ "nodeHollowWidth" : 15.0,
+ "edgesForkLength" : 80.0,
+ "edgesForkAperture" : 60.0,
+ "edgeStartShift" : 0.0,
+ "unknownBusNodeExtraRadius" : 10.0,
+ "loopDistance" : 120.0,
+ "loopEdgesAperture" : 60.0,
+ "loopControlDistance" : 40.0,
+ "edgeInfoAlongEdge" : true,
+ "interAnnulusSpace" : 5.0,
+ "svgPrefix" : "",
+ "arrowPathIn" : "M-10 -10 H10 L0 10z",
+ "arrowPathOut" : "M-10 10 H10 L0 -10z",
+ "languageTag" : "en",
+ "voltageValuePrecision" : 1,
+ "powerValuePrecision" : 0,
+ "angleValuePrecision" : 1,
+ "currentValuePrecision" : 0,
+ "percentageValuePrecision" : 0,
+ "pstArrowHeadSize" : 8.0,
+ "undefinedValueSymbol" : "",
+ "highlightGraph" : false,
+ "injectionAperture" : 10.0,
+ "injectionEdgeLength" : 145.0,
+ "injectionCircleRadius" : 25.0,
+ "voltageLevelLegendsIncluded" : true,
+ "edgeInfosIncluded" : true,
+ "doubleArrowShiftFactorArrows" : 1.5,
+ "doubleArrowShiftFactorText" : 1.8
+ },
+ "busNodes" : [ {
+ "svgId" : "3",
+ "equipmentId" : "VL2_0",
+ "nbNeighbours" : 2,
+ "index" : 0,
+ "vlNode" : "0",
+ "legend" : "102.5 kV / 8.2°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "5",
+ "equipmentId" : "VL2_2",
+ "nbNeighbours" : 2,
+ "index" : 1,
+ "vlNode" : "0",
+ "legend" : "101.9 kV / 2.6°",
+ "classes" : [ "nad-bus-2" ]
+ }, {
+ "svgId" : "4",
+ "equipmentId" : "VL2_1",
+ "nbNeighbours" : 2,
+ "index" : 2,
+ "vlNode" : "0",
+ "legend" : "101.9 kV / 2.6°",
+ "classes" : [ "nad-bus-1" ]
+ }, {
+ "svgId" : "9",
+ "equipmentId" : "VL3_0",
+ "nbNeighbours" : 1,
+ "index" : 0,
+ "vlNode" : "6",
+ "legend" : "102.5 kV / 6.0°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "10",
+ "equipmentId" : "VL3_1",
+ "nbNeighbours" : 1,
+ "index" : 1,
+ "vlNode" : "6",
+ "legend" : "103.3 kV / 3.3°",
+ "classes" : [ "nad-bus-1" ]
+ }, {
+ "svgId" : "14",
+ "equipmentId" : "VL5_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "11",
+ "legend" : "99.3 kV / -4.4°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "18",
+ "equipmentId" : "VL1_0",
+ "nbNeighbours" : 1,
+ "index" : 0,
+ "vlNode" : "15",
+ "legend" : "104.0 kV / 0.0°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "19",
+ "equipmentId" : "VL1_1",
+ "nbNeighbours" : 1,
+ "index" : 1,
+ "vlNode" : "15",
+ "legend" : "102.5 kV / -2.2°",
+ "classes" : [ "nad-bus-1" ]
+ }, {
+ "svgId" : "23",
+ "equipmentId" : "VL6_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "20",
+ "legend" : "101.1 kV / -3.2°",
+ "classes" : [ "nad-bus-0" ]
+ } ],
+ "nodes" : [ {
+ "svgId" : "0",
+ "equipmentId" : "VL2",
+ "x" : -214.48,
+ "y" : -93.81,
+ "legendSvgId" : "1",
+ "legendEdgeSvgId" : "2",
+ "legendHeader" : [ "VL2" ],
+ "classes" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "6",
+ "equipmentId" : "VL3",
+ "x" : -216.54,
+ "y" : 296.32,
+ "legendSvgId" : "7",
+ "legendEdgeSvgId" : "8",
+ "legendHeader" : [ "VL3" ],
+ "classes" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "11",
+ "equipmentId" : "VL5",
+ "x" : 109.34,
+ "y" : -313.91,
+ "legendSvgId" : "12",
+ "legendEdgeSvgId" : "13",
+ "legendHeader" : [ "VL5" ],
+ "classes" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "15",
+ "equipmentId" : "VL1",
+ "x" : 427.7,
+ "y" : -499.68,
+ "invisible" : true,
+ "legendSvgId" : "16",
+ "legendEdgeSvgId" : "17",
+ "legendHeader" : [ "VL1" ],
+ "classes" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "20",
+ "equipmentId" : "VL6",
+ "x" : 17.25,
+ "y" : 589.32,
+ "invisible" : true,
+ "legendSvgId" : "21",
+ "legendEdgeSvgId" : "22",
+ "legendHeader" : [ "VL6" ],
+ "classes" : [ "nad-vl70to120" ]
+ } ],
+ "edges" : [ {
+ "svgId" : "24",
+ "equipmentId" : "L7-5-0",
+ "node1" : "0",
+ "node2" : "11",
+ "busNode1" : "4",
+ "busNode2" : "14",
+ "type" : "LineEdge",
+ "edgeInfo1" : {
+ "svgId" : "25",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "78"
+ },
+ "edgeInfo2" : {
+ "svgId" : "26",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-76"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "27",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "L7-5-0",
+ "labelB" : "444"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "28",
+ "equipmentId" : "L7-8-0",
+ "node1" : "0",
+ "node2" : "0",
+ "busNode1" : "4",
+ "busNode2" : "5",
+ "type" : "LineEdge",
+ "edgeInfo1" : {
+ "svgId" : "29",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "85"
+ },
+ "edgeInfo2" : {
+ "svgId" : "30",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-85"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "31",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "L7-8-0",
+ "labelB" : "488"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "32",
+ "equipmentId" : "L9-8-0",
+ "node1" : "6",
+ "node2" : "0",
+ "busNode1" : "10",
+ "busNode2" : "5",
+ "type" : "LineEdge",
+ "edgeInfo1" : {
+ "svgId" : "33",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "15"
+ },
+ "edgeInfo2" : {
+ "svgId" : "34",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-15"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "35",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "L9-8-0",
+ "labelB" : "83"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "36",
+ "equipmentId" : "T7-2-0",
+ "node1" : "0",
+ "node2" : "0",
+ "busNode1" : "4",
+ "busNode2" : "3",
+ "type" : "TwoWtEdge",
+ "edgeInfo1" : {
+ "svgId" : "37",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-163"
+ },
+ "edgeInfo2" : {
+ "svgId" : "38",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "163"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "39",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "T7-2-0",
+ "labelB" : "923"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "40",
+ "equipmentId" : "L9-6-0",
+ "node1" : "6",
+ "node2" : "20",
+ "busNode1" : "10",
+ "busNode2" : "23",
+ "type" : "LineEdge",
+ "invisible2" : true,
+ "edgeInfo1" : {
+ "svgId" : "41",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "70"
+ },
+ "edgeInfo2" : {
+ "svgId" : "42",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-68"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "43",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "L9-6-0",
+ "labelB" : "405"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "44",
+ "equipmentId" : "T9-3-0",
+ "node1" : "6",
+ "node2" : "6",
+ "busNode1" : "10",
+ "busNode2" : "9",
+ "type" : "TwoWtEdge",
+ "edgeInfo1" : {
+ "svgId" : "45",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-85"
+ },
+ "edgeInfo2" : {
+ "svgId" : "46",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "85"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "47",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "T9-3-0",
+ "labelB" : "484"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "48",
+ "equipmentId" : "L5-4-0",
+ "node1" : "11",
+ "node2" : "15",
+ "busNode1" : "14",
+ "busNode2" : "19",
+ "type" : "LineEdge",
+ "invisible2" : true,
+ "edgeInfo1" : {
+ "svgId" : "49",
+ "infoTypeB" : "ActivePower",
+ "direction" : "IN",
+ "labelB" : "-49"
+ },
+ "edgeInfo2" : {
+ "svgId" : "50",
+ "infoTypeB" : "ActivePower",
+ "direction" : "OUT",
+ "labelB" : "49"
+ },
+ "edgeInfoMiddle" : {
+ "svgId" : "51",
+ "infoTypeA" : "Name",
+ "infoTypeB" : "Current",
+ "direction" : "OUT",
+ "labelA" : "L5-4-0",
+ "labelB" : "364"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ } ],
+ "textNodes" : [ {
+ "svgId" : "1",
+ "equipmentId" : "VL2",
+ "vlNode" : "0",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "7",
+ "equipmentId" : "VL3",
+ "vlNode" : "6",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "12",
+ "equipmentId" : "VL5",
+ "vlNode" : "11",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ } ]
+}
\ No newline at end of file
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf.svg b/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf.svg
new file mode 100644
index 00000000..a76a28e9
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf.svg
@@ -0,0 +1,110 @@
+
+
diff --git a/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf_metadata.json b/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf_metadata.json
new file mode 100644
index 00000000..97686ef8
--- /dev/null
+++ b/packages/network-viewer-core/src/resources/test-data/nad-ieee9-zeroimpedance-cdf_metadata.json
@@ -0,0 +1,318 @@
+{
+ "layoutParameters" : {
+ "textNodesForceLayout" : false,
+ "textNodeFixedShift" : {
+ "x" : 100.0,
+ "y" : -40.0
+ },
+ "maxSteps" : 1000,
+ "timeoutSeconds" : 15.0,
+ "textNodeEdgeConnectionYShift" : 25.0,
+ "injectionsAdded" : false,
+ "scaleFactor" : 1.0
+ },
+ "svgParameters" : {
+ "diagramPadding" : {
+ "left" : 200.0,
+ "top" : 200.0,
+ "right" : 200.0,
+ "bottom" : 200.0
+ },
+ "insertNameDesc" : false,
+ "svgWidthAndHeightAdded" : false,
+ "cssLocation" : "EXTERNAL_NO_IMPORT",
+ "sizeConstraint" : "FIXED_SCALE",
+ "fixedWidth" : -1,
+ "fixedHeight" : -1,
+ "fixedScale" : 0.2,
+ "arrowShift" : 30.0,
+ "arrowLabelShift" : 19.0,
+ "converterStationWidth" : 70.0,
+ "voltageLevelCircleRadius" : 30.0,
+ "fictitiousVoltageLevelCircleRadius" : 15.0,
+ "transformerCircleRadius" : 20.0,
+ "nodeHollowWidth" : 15.0,
+ "edgesForkLength" : 80.0,
+ "edgesForkAperture" : 60.0,
+ "edgeStartShift" : 0.0,
+ "unknownBusNodeExtraRadius" : 10.0,
+ "loopDistance" : 120.0,
+ "loopEdgesAperture" : 60.0,
+ "loopControlDistance" : 40.0,
+ "edgeInfoAlongEdge" : true,
+ "interAnnulusSpace" : 5.0,
+ "svgPrefix" : "",
+ "arrowPathIn" : "M-10 -10 H10 L0 10z",
+ "arrowPathOut" : "M-10 10 H10 L0 -10z",
+ "languageTag" : "en",
+ "voltageValuePrecision" : 1,
+ "powerValuePrecision" : 0,
+ "angleValuePrecision" : 1,
+ "currentValuePrecision" : 0,
+ "percentageValuePrecision" : 0,
+ "pstArrowHeadSize" : 8.0,
+ "undefinedValueSymbol" : "",
+ "highlightGraph" : false,
+ "injectionAperture" : 10.0,
+ "injectionEdgeLength" : 145.0,
+ "injectionCircleRadius" : 25.0,
+ "voltageLevelLegendsIncluded" : true,
+ "edgeInfosIncluded" : true,
+ "doubleArrowShiftFactorArrows" : 1.5,
+ "doubleArrowShiftFactorText" : 1.8
+ },
+ "busNodes" : [ {
+ "svgId" : "3",
+ "equipmentId" : "VL2_0",
+ "nbNeighbours" : 2,
+ "index" : 0,
+ "vlNode" : "0",
+ "legend" : "102.5 kV / 9.3°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "5",
+ "equipmentId" : "VL2_2",
+ "nbNeighbours" : 2,
+ "index" : 1,
+ "vlNode" : "0",
+ "legend" : "101.5 kV / 0.7°",
+ "classes" : [ "nad-bus-2" ]
+ }, {
+ "svgId" : "4",
+ "equipmentId" : "VL2_1",
+ "nbNeighbours" : 2,
+ "index" : 2,
+ "vlNode" : "0",
+ "legend" : "102.5 kV / 3.7°",
+ "classes" : [ "nad-bus-1" ]
+ }, {
+ "svgId" : "9",
+ "equipmentId" : "VL3_0",
+ "nbNeighbours" : 1,
+ "index" : 0,
+ "vlNode" : "6",
+ "legend" : "102.5 kV / 4.7°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "10",
+ "equipmentId" : "VL3_1",
+ "nbNeighbours" : 1,
+ "index" : 1,
+ "vlNode" : "6",
+ "legend" : "103.2 kV / 2.0°",
+ "classes" : [ "nad-bus-1" ]
+ }, {
+ "svgId" : "14",
+ "equipmentId" : "VL6_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "11",
+ "legend" : "101.2 kV / -3.7°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "18",
+ "equipmentId" : "VL1_0",
+ "nbNeighbours" : 1,
+ "index" : 0,
+ "vlNode" : "15",
+ "legend" : "104.0 kV / 0.0°",
+ "classes" : [ "nad-bus-0" ]
+ }, {
+ "svgId" : "19",
+ "equipmentId" : "VL1_1",
+ "nbNeighbours" : 1,
+ "index" : 1,
+ "vlNode" : "15",
+ "legend" : "102.5 kV / -2.2°",
+ "classes" : [ "nad-bus-1" ]
+ }, {
+ "svgId" : "23",
+ "equipmentId" : "VL5_0",
+ "nbNeighbours" : 0,
+ "index" : 0,
+ "vlNode" : "20",
+ "legend" : "99.5 kV / -4.0°",
+ "classes" : [ "nad-bus-0" ]
+ } ],
+ "nodes" : [ {
+ "svgId" : "0",
+ "equipmentId" : "VL2",
+ "x" : 73.67,
+ "y" : 333.18,
+ "legendSvgId" : "1",
+ "legendEdgeSvgId" : "2",
+ "legendHeader" : [ "VL2" ],
+ "classes" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "6",
+ "equipmentId" : "VL3",
+ "x" : -231.89,
+ "y" : 82.3,
+ "legendSvgId" : "7",
+ "legendEdgeSvgId" : "8",
+ "legendHeader" : [ "VL3" ],
+ "classes" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "11",
+ "equipmentId" : "VL6",
+ "x" : -206.52,
+ "y" : -309.9,
+ "legendSvgId" : "12",
+ "legendEdgeSvgId" : "13",
+ "legendHeader" : [ "VL6" ],
+ "classes" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "15",
+ "equipmentId" : "VL1",
+ "x" : 57.4,
+ "y" : -578.13,
+ "invisible" : true,
+ "legendSvgId" : "16",
+ "legendEdgeSvgId" : "17",
+ "legendHeader" : [ "VL1" ],
+ "classes" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "20",
+ "equipmentId" : "VL5",
+ "x" : 429.14,
+ "y" : 451.05,
+ "invisible" : true,
+ "legendSvgId" : "21",
+ "legendEdgeSvgId" : "22",
+ "legendHeader" : [ "VL5" ],
+ "classes" : [ "nad-vl70to120" ]
+ } ],
+ "edges" : [ {
+ "svgId" : "24",
+ "equipmentId" : "L7-5-0",
+ "node1" : "0",
+ "node2" : "20",
+ "busNode1" : "4",
+ "busNode2" : "23",
+ "type" : "LineEdge",
+ "invisible2" : true,
+ "edgeInfoMiddle" : {
+ "svgId" : "25",
+ "infoTypeA" : "Name",
+ "labelA" : "L7-5-0"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "26",
+ "equipmentId" : "L7-8-0",
+ "node1" : "0",
+ "node2" : "0",
+ "busNode1" : "4",
+ "busNode2" : "5",
+ "type" : "LineEdge",
+ "edgeInfoMiddle" : {
+ "svgId" : "27",
+ "infoTypeA" : "Name",
+ "labelA" : "L7-8-0"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "28",
+ "equipmentId" : "L9-8-0",
+ "node1" : "6",
+ "node2" : "0",
+ "busNode1" : "10",
+ "busNode2" : "5",
+ "type" : "LineEdge",
+ "edgeInfoMiddle" : {
+ "svgId" : "29",
+ "infoTypeA" : "Name",
+ "labelA" : "L9-8-0"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "30",
+ "equipmentId" : "T7-2-0",
+ "node1" : "0",
+ "node2" : "0",
+ "busNode1" : "4",
+ "busNode2" : "3",
+ "type" : "TwoWtEdge",
+ "edgeInfoMiddle" : {
+ "svgId" : "31",
+ "infoTypeA" : "Name",
+ "labelA" : "T7-2-0"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "32",
+ "equipmentId" : "L9-6-0",
+ "node1" : "6",
+ "node2" : "11",
+ "busNode1" : "10",
+ "busNode2" : "14",
+ "type" : "LineEdge",
+ "edgeInfoMiddle" : {
+ "svgId" : "33",
+ "infoTypeA" : "Name",
+ "labelA" : "L9-6-0"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "34",
+ "equipmentId" : "T9-3-0",
+ "node1" : "6",
+ "node2" : "6",
+ "busNode1" : "10",
+ "busNode2" : "9",
+ "type" : "TwoWtEdge",
+ "edgeInfoMiddle" : {
+ "svgId" : "35",
+ "infoTypeA" : "Name",
+ "labelA" : "T9-3-0"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ }, {
+ "svgId" : "36",
+ "equipmentId" : "L6-4-0",
+ "node1" : "11",
+ "node2" : "15",
+ "busNode1" : "14",
+ "busNode2" : "19",
+ "type" : "LineEdge",
+ "invisible2" : true,
+ "edgeInfoMiddle" : {
+ "svgId" : "37",
+ "infoTypeA" : "Name",
+ "labelA" : "L6-4-0"
+ },
+ "classes1" : [ "nad-vl70to120" ],
+ "classes2" : [ "nad-vl70to120" ]
+ } ],
+ "textNodes" : [ {
+ "svgId" : "1",
+ "equipmentId" : "VL2",
+ "vlNode" : "0",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "7",
+ "equipmentId" : "VL3",
+ "vlNode" : "6",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ }, {
+ "svgId" : "12",
+ "equipmentId" : "VL6",
+ "vlNode" : "11",
+ "shiftX" : 100.0,
+ "shiftY" : -40.0,
+ "connectionShiftX" : 100.0,
+ "connectionShiftY" : -15.0
+ } ]
+}
\ No newline at end of file