diff --git a/src/components/grid-layout/hooks/use-diagram-model.ts b/src/components/grid-layout/hooks/use-diagram-model.ts
index 1a5562a36d..0402a8173e 100644
--- a/src/components/grid-layout/hooks/use-diagram-model.ts
+++ b/src/components/grid-layout/hooks/use-diagram-model.ts
@@ -32,6 +32,7 @@ import { useSnackMessage } from '@gridsuite/commons-ui';
import { NodeType } from 'components/graph/tree-node.type';
import { isThereTooManyOpenedNadDiagrams, mergePositions } from '../cards/diagrams/diagram-utils';
import { DiagramMetadata } from '@powsybl/network-viewer';
+import { getBaseVoltagesConfigInfos } from 'utils/constants';
type UseDiagramModelProps = {
diagramTypes: DiagramType[];
@@ -304,6 +305,7 @@ export const useDiagramModel = ({ diagramTypes, onAddDiagram, onDiagramAlreadyEx
positions: diagram.positions,
nadPositionsGenerationMode:
networkVisuParams.networkAreaDiagramParameters.nadPositionsGenerationMode,
+ baseVoltagesConfigInfos: getBaseVoltagesConfigInfos(),
};
fetchOptions = {
method: 'POST',
@@ -311,6 +313,14 @@ export const useDiagramModel = ({ diagramTypes, onAddDiagram, onDiagramAlreadyEx
body: JSON.stringify(nadRequestInfos),
};
}
+ if (diagram.type === DiagramType.SUBSTATION || diagram.type === DiagramType.VOLTAGE_LEVEL) {
+ const sldRequestInfos = { baseVoltagesConfigInfos: getBaseVoltagesConfigInfos() };
+ fetchOptions = {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(sldRequestInfos),
+ };
+ }
setLoadingDiagrams((loadingDiagrams) => {
if (loadingDiagrams.includes(diagram.diagramUuid)) {
diff --git a/src/components/network/constants.ts b/src/components/network/constants.ts
index e7caf770a9..77f9ba6b1d 100644
--- a/src/components/network/constants.ts
+++ b/src/components/network/constants.ts
@@ -210,22 +210,3 @@ export const REGULATING_TERMINAL_TYPES = [
export const NUMBER = 'number';
export const ENUM = 'enum';
export const BOOLEAN = 'boolean';
-
-export interface VoltageLevelInterval {
- name: string;
- vlValue: number;
- minValue: number;
- maxValue: number;
-}
-
-export const BASE_VOLTAGES: VoltageLevelInterval[] = [
- { name: 'vl300to500', vlValue: 400, minValue: 300, maxValue: Infinity },
- { name: 'vl180to300', vlValue: 225, minValue: 180, maxValue: 300 },
- { name: 'vl120to180', vlValue: 150, minValue: 120, maxValue: 180 },
- { name: 'vl70to120', vlValue: 90, minValue: 70, maxValue: 120 },
- { name: 'vl50to70', vlValue: 63, minValue: 50, maxValue: 70 },
- { name: 'vl30to50', vlValue: 45, minValue: 30, maxValue: 50 },
- { name: 'vl0to30', vlValue: 20, minValue: 0, maxValue: 30 },
-];
-
-export const MAX_VOLTAGE = 500;
diff --git a/src/components/network/nominal-voltage-filter.tsx b/src/components/network/nominal-voltage-filter.tsx
index bb00dafc13..39b8fde7d7 100644
--- a/src/components/network/nominal-voltage-filter.tsx
+++ b/src/components/network/nominal-voltage-filter.tsx
@@ -9,8 +9,12 @@ import { useCallback, useEffect, useMemo, useState } from 'react';
import { Button, Checkbox, List, ListItem, ListItemButton, ListItemText, Paper, Tooltip } from '@mui/material';
import { FormattedMessage } from 'react-intl';
import { type MuiStyles } from '@gridsuite/commons-ui';
-import { BASE_VOLTAGES, MAX_VOLTAGE, VoltageLevelInterval } from './constants';
-import { getNominalVoltageIntervalName } from './utils/nominal-voltage-filter-utils';
+import {
+ BASE_VOLTAGES,
+ MAX_VOLTAGE,
+ VoltageLevelInterval,
+ getNominalVoltageIntervalNameByVoltageValue,
+} from 'utils/constants';
const styles = {
nominalVoltageZone: {
@@ -62,7 +66,7 @@ export default function NominalVoltageFilter({
useEffect(() => {
const newIntervals = BASE_VOLTAGES.map((interval) => {
const vlListValues = nominalVoltages.filter(
- (vnom) => getNominalVoltageIntervalName(vnom) === interval.name
+ (vnom) => getNominalVoltageIntervalNameByVoltageValue(vnom) === interval.name
);
return { ...interval, vlListValues, isChecked: true };
});
@@ -134,7 +138,7 @@ export default function NominalVoltageFilter({
diff --git a/src/components/network/utils/nominal-voltage-filter-utils.tsx b/src/components/network/utils/nominal-voltage-filter-utils.tsx
deleted file mode 100644
index 19c34301ab..0000000000
--- a/src/components/network/utils/nominal-voltage-filter-utils.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * Copyright (c) 2025, RTE (http://www.rte-france.com)
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-import { BASE_VOLTAGES } from '../constants';
-
-export const getNominalVoltageIntervalName = (voltageValue: number): string | undefined => {
- for (let interval of BASE_VOLTAGES) {
- if (voltageValue >= interval.minValue && voltageValue < interval.maxValue) {
- return interval.name;
- }
- }
-};
diff --git a/src/services/study/network.ts b/src/services/study/network.ts
index eedcc7e1d3..4dff33a479 100644
--- a/src/services/study/network.ts
+++ b/src/services/study/network.ts
@@ -79,6 +79,7 @@ export function getVoltageLevelSingleLineDiagram({
if (componentLibrary !== null) {
queryParams.append('componentLibrary', String(componentLibrary));
}
+ //baseVoltagesConfig
return (
getStudyUrlWithNodeUuidAndRootNetworkUuid(studyUuid, currentNodeUuid, currentRootNetworkUuid) +
'/network/voltage-levels/' +
@@ -236,6 +237,7 @@ export function getSubstationSingleLineDiagram({
if (componentLibrary !== null) {
queryParams.append('componentLibrary', String(componentLibrary));
}
+ //baseVoltagesConfig
return (
getStudyUrlWithNodeUuidAndRootNetworkUuid(studyUuid, currentNodeUuid, currentRootNetworkUuid) +
'/network/substations/' +
diff --git a/src/styles/dark-theme-css-vars.ts b/src/styles/dark-theme-css-vars.ts
index a7159b3783..fa38c0dc9f 100644
--- a/src/styles/dark-theme-css-vars.ts
+++ b/src/styles/dark-theme-css-vars.ts
@@ -5,6 +5,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
+import { DARK_THEME } from '@gridsuite/commons-ui';
+import { cssColors } from 'utils/colors';
+
export const darkThemeCssVars = {
'.nad-edge-infos text': {
stroke: '#292e33', // Border outside of the displayed values on lines. Same color as the background.
@@ -18,214 +21,5 @@ export const darkThemeCssVars = {
'.nad-textnode-highlight': {
backgroundColor: '#32373bd9', // same displayed color as #6c6c6c20 but with 0.85 opacity
},
- '.sld-vl0to30, .nad-vl0to30': {
- '--vl-color': '#CCC93A',
- },
- '.sld-vl0to30.sld-bus-1, .nad-vl0to30.nad-bus-1': {
- '--vl-color': '#5E835C',
- },
- '.sld-vl0to30.sld-bus-2, .nad-vl0to30.nad-bus-2': {
- '--vl-color': '#B1B46C',
- },
- '.sld-vl0to30.sld-bus-3, .nad-vl0to30.nad-bus-3': {
- '--vl-color': '#A156AA',
- },
- '.sld-vl0to30.sld-bus-4, .nad-vl0to30.nad-bus-4': {
- '--vl-color': '#CB3DDD',
- },
- '.sld-vl0to30.sld-bus-5, .nad-vl0to30.nad-bus-5': {
- '--vl-color': '#AC8AC2',
- },
- '.sld-vl0to30.sld-bus-6, .nad-vl0to30.nad-bus-6': {
- '--vl-color': '#734097',
- },
- '.sld-vl0to30.sld-bus-7, .nad-vl0to30.nad-bus-7': {
- '--vl-color': '#BCADCC',
- },
- '.sld-vl0to30.sld-bus-8, .nad-vl0to30.nad-bus-8': {
- '--vl-color': '#A246E0',
- },
- '.sld-vl0to30.sld-bus-9, .nad-vl0to30.nad-bus-9': {
- '--vl-color': '#C38CEB',
- },
- '.sld-vl30to50, .nad-vl30to50': {
- '--vl-color': '#EA8E9B',
- },
- '.sld-vl30to50.sld-bus-1, .nad-vl30to50.nad-bus-1': {
- '--vl-color': '#A43857',
- },
- '.sld-vl30to50.sld-bus-2, .nad-vl30to50.nad-bus-2': {
- '--vl-color': '#CEAAB0',
- },
- '.sld-vl30to50.sld-bus-3, .nad-vl30to50.nad-bus-3': {
- '--vl-color': '#459C63',
- },
- '.sld-vl30to50.sld-bus-4, .nad-vl30to50.nad-bus-4': {
- '--vl-color': '#00E266',
- },
- '.sld-vl30to50.sld-bus-5, .nad-vl30to50.nad-bus-5': {
- '--vl-color': '#A7B368',
- },
- '.sld-vl30to50.sld-bus-6, .nad-vl30to50.nad-bus-6': {
- '--vl-color': '#3F7340',
- },
- '.sld-vl30to50.sld-bus-7, .nad-vl30to50.nad-bus-7': {
- '--vl-color': '#C2CB92',
- },
- '.sld-vl30to50.sld-bus-8, .nad-vl30to50.nad-bus-8': {
- '--vl-color': '#218B21',
- },
- '.sld-vl30to50.sld-bus-9, .nad-vl30to50.nad-bus-9': {
- '--vl-color': '#58D058',
- },
- '.sld-vl50to70, .nad-vl50to70': {
- '--vl-color': '#D47DFF',
- },
- '.sld-vl50to70.sld-bus-1, .nad-vl50to70.nad-bus-1': {
- '--vl-color': '#C230D2',
- },
- '.sld-vl50to70.sld-bus-2, .nad-vl50to70.nad-bus-2': {
- '--vl-color': '#AB94BF',
- },
- '.sld-vl50to70.sld-bus-3, .nad-vl50to70.nad-bus-3': {
- '--vl-color': '#1F7620',
- },
- '.sld-vl50to70.sld-bus-4, .nad-vl50to70.nad-bus-4': {
- '--vl-color': '#C5ED3B',
- },
- '.sld-vl50to70.sld-bus-5, .nad-vl50to70.nad-bus-5': {
- '--vl-color': '#A7B368',
- },
- '.sld-vl50to70.sld-bus-6, .nad-vl50to70.nad-bus-6': {
- '--vl-color': '#697046',
- },
- '.sld-vl50to70.sld-bus-7, .nad-vl50to70.nad-bus-7': {
- '--vl-color': '#E1E444',
- },
- '.sld-vl50to70.sld-bus-8, .nad-vl50to70.nad-bus-8': {
- '--vl-color': '#AAAE50',
- },
- '.sld-vl50to70.sld-bus-9, .nad-vl50to70.nad-bus-9': {
- '--vl-color': '#D4D486',
- },
- '.sld-vl70to120, .nad-vl70to120': {
- '--vl-color': '#FF6100',
- },
- '.sld-vl70to120.sld-bus-1, .nad-vl70to120.nad-bus-1': {
- '--vl-color': '#B27153',
- },
- '.sld-vl70to120.sld-bus-2, .nad-vl70to120.nad-bus-2': {
- '--vl-color': '#C6A68B',
- },
- '.sld-vl70to120.sld-bus-3, .nad-vl70to120.nad-bus-3': {
- '--vl-color': '#25699D',
- },
- '.sld-vl70to120.sld-bus-4, .nad-vl70to120.nad-bus-4': {
- '--vl-color': '#0057F9',
- },
- '.sld-vl70to120.sld-bus-5, .nad-vl70to120.nad-bus-5': {
- '--vl-color': '#74AFEA',
- },
- '.sld-vl70to120.sld-bus-6, .nad-vl70to120.nad-bus-6': {
- '--vl-color': '#44679C',
- },
- '.sld-vl70to120.sld-bus-7, .nad-vl70to120.nad-bus-7': {
- '--vl-color': '#458BE8',
- },
- '.sld-vl70to120.sld-bus-8, .nad-vl70to120.nad-bus-8': {
- '--vl-color': '#2862AE',
- },
- '.sld-vl70to120.sld-bus-9, .nad-vl70to120.nad-bus-9': {
- '--vl-color': '#B0D4FE',
- },
- '.sld-vl120to180, .nad-vl120to180': {
- '--vl-color': '#29AFB0',
- },
- '.sld-vl120to180.sld-bus-1, .nad-vl120to180.nad-bus-1': {
- '--vl-color': '#336B6F',
- },
- '.sld-vl120to180.sld-bus-2, .nad-vl120to180.nad-bus-2': {
- '--vl-color': '#84C6CC',
- },
- '.sld-vl120to180.sld-bus-3, .nad-vl120to180.nad-bus-3': {
- '--vl-color': '#BA133C',
- },
- '.sld-vl120to180.sld-bus-4, .nad-vl120to180.nad-bus-4': {
- '--vl-color': '#FF8290',
- },
- '.sld-vl120to180.sld-bus-5, .nad-vl120to180.nad-bus-5': {
- '--vl-color': '#DAA8AD',
- },
- '.sld-vl120to180.sld-bus-6, .nad-vl120to180.nad-bus-6': {
- '--vl-color': '#97353A',
- },
- '.sld-vl120to180.sld-bus-7, .nad-vl120to180.nad-bus-7': {
- '--vl-color': '#EABCBD',
- },
- '.sld-vl120to180.sld-bus-8, .nad-vl120to180.nad-bus-8': {
- '--vl-color': '#EA2E33',
- },
- '.sld-vl120to180.sld-bus-9, .nad-vl120to180.nad-bus-9': {
- '--vl-color': '#EA6E72',
- },
- '.sld-vl180to300, .nad-vl180to300': {
- '--vl-color': '#00FF50',
- },
- '.sld-vl180to300.sld-bus-1, .nad-vl180to300.nad-bus-1': {
- '--vl-color': '#42954B',
- },
- '.sld-vl180to300.sld-bus-2, .nad-vl180to300.nad-bus-2': {
- '--vl-color': '#A7B27E',
- },
- '.sld-vl180to300.sld-bus-3, .nad-vl180to300.nad-bus-3': {
- '--vl-color': '#F57F17',
- },
- '.sld-vl180to300.sld-bus-4, .nad-vl180to300.nad-bus-4': {
- '--vl-color': '#A3715C',
- },
- '.sld-vl180to300.sld-bus-5, .nad-vl180to300.nad-bus-5': {
- '--vl-color': '#DBAB9D',
- },
- '.sld-vl180to300.sld-bus-6, .nad-vl180to300.nad-bus-6': {
- '--vl-color': '#885239',
- },
- '.sld-vl180to300.sld-bus-7, .nad-vl180to300.nad-bus-7': {
- '--vl-color': '#B39572',
- },
- '.sld-vl180to300.sld-bus-8, .nad-vl180to300.nad-bus-8': {
- '--vl-color': '#C94119',
- },
- '.sld-vl180to300.sld-bus-9, .nad-vl180to300.nad-bus-9': {
- '--vl-color': '#EABC45',
- },
- '.sld-vl300to500, .nad-vl300to500': {
- '--vl-color': '#FF0007',
- },
- '.sld-vl300to500.sld-bus-1, .nad-vl300to500.nad-bus-1': {
- '--vl-color': '#DD6484',
- },
- '.sld-vl300to500.sld-bus-2, .nad-vl300to500.nad-bus-2': {
- '--vl-color': '#FFBCBE',
- },
- '.sld-vl300to500.sld-bus-3, .nad-vl300to500.nad-bus-3': {
- '--vl-color': '#25699D',
- },
- '.sld-vl300to500.sld-bus-4, .nad-vl300to500.nad-bus-4': {
- '--vl-color': '#0057F9',
- },
- '.sld-vl300to500.sld-bus-5, .nad-vl300to500.nad-bus-5': {
- '--vl-color': '#74AFEA',
- },
- '.sld-vl300to500.sld-bus-6, .nad-vl300to500.nad-bus-6': {
- '--vl-color': '#44679C',
- },
- '.sld-vl300to500.sld-bus-7, .nad-vl300to500.nad-bus-7': {
- '--vl-color': '#458BE8',
- },
- '.sld-vl300to500.sld-bus-8, .nad-vl300to500.nad-bus-8': {
- '--vl-color': '#2862AE',
- },
- '.sld-vl300to500.sld-bus-9, .nad-vl300to500.nad-bus-9': {
- '--vl-color': '#B0D4FE',
- },
+ ...cssColors(DARK_THEME),
};
diff --git a/src/styles/light-theme-css-vars.ts b/src/styles/light-theme-css-vars.ts
index 9c3a96d364..4344967417 100644
--- a/src/styles/light-theme-css-vars.ts
+++ b/src/styles/light-theme-css-vars.ts
@@ -5,6 +5,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
+import { LIGHT_THEME } from '@gridsuite/commons-ui';
+import { cssColors } from 'utils/colors';
+
export const lightThemeCssVars = {
'.nad-edge-infos text': {
stroke: 'white', // Border outside of the displayed values on lines. Same color as the background.
@@ -21,214 +24,5 @@ export const lightThemeCssVars = {
'.nad-textnode-highlight': {
backgroundColor: '#f0f0f0cc', // same displayed color as #9c9c9c20 but with 0.8 opacity
},
- '.sld-vl0to30, .nad-vl0to30': {
- '--vl-color': '#ABAE28',
- },
- '.sld-vl0to30.sld-bus-1, .nad-vl0to30.nad-bus-1': {
- '--vl-color': '#69701B',
- },
- '.sld-vl0to30.sld-bus-2, .nad-vl0to30.nad-bus-2': {
- '--vl-color': '#D8D20A',
- },
- '.sld-vl0to30.sld-bus-3, .nad-vl0to30.nad-bus-3': {
- '--vl-color': '#A156AA',
- },
- '.sld-vl0to30.sld-bus-4, .nad-vl0to30.nad-bus-4': {
- '--vl-color': '#CB3DDD',
- },
- '.sld-vl0to30.sld-bus-5, .nad-vl0to30.nad-bus-5': {
- '--vl-color': '#A684BC',
- },
- '.sld-vl0to30.sld-bus-6, .nad-vl0to30.nad-bus-6': {
- '--vl-color': '#62188B',
- },
- '.sld-vl0to30.sld-bus-7, .nad-vl0to30.nad-bus-7': {
- '--vl-color': '#885CA8',
- },
- '.sld-vl0to30.sld-bus-8, .nad-vl0to30.nad-bus-8': {
- '--vl-color': '#A020F0',
- },
- '.sld-vl0to30.sld-bus-9, .nad-vl0to30.nad-bus-9': {
- '--vl-color': '#CC80FF',
- },
- '.sld-vl30to50, .nad-vl30to50': {
- '--vl-color': '#FF8290',
- },
- '.sld-vl30to50.sld-bus-1, .nad-vl30to50.nad-bus-1': {
- '--vl-color': '#E7173E',
- },
- '.sld-vl30to50.sld-bus-2, .nad-vl30to50.nad-bus-2': {
- '--vl-color': '#DAA8AD',
- },
- '.sld-vl30to50.sld-bus-3, .nad-vl30to50.nad-bus-3': {
- '--vl-color': '#459C63',
- },
- '.sld-vl30to50.sld-bus-4, .nad-vl30to50.nad-bus-4': {
- '--vl-color': '#00E266',
- },
- '.sld-vl30to50.sld-bus-5, .nad-vl30to50.nad-bus-5': {
- '--vl-color': '#A7B368',
- },
- '.sld-vl30to50.sld-bus-6, .nad-vl30to50.nad-bus-6': {
- '--vl-color': '#1A4D1B',
- },
- '.sld-vl30to50.sld-bus-7, .nad-vl30to50.nad-bus-7': {
- '--vl-color': '#C2CB92',
- },
- '.sld-vl30to50.sld-bus-8, .nad-vl30to50.nad-bus-8': {
- '--vl-color': '#218B21',
- },
- '.sld-vl30to50.sld-bus-9, .nad-vl30to50.nad-bus-9': {
- '--vl-color': '#58D058',
- },
- '.sld-vl50to70, .nad-vl50to70': {
- '--vl-color': '#A020F0',
- },
- '.sld-vl50to70.sld-bus-1, .nad-vl50to70.nad-bus-1': {
- '--vl-color': '#62188B',
- },
- '.sld-vl50to70.sld-bus-2, .nad-vl50to70.nad-bus-2': {
- '--vl-color': '#AC8AC2',
- },
- '.sld-vl50to70.sld-bus-3, .nad-vl50to70.nad-bus-3': {
- '--vl-color': '#1F7620',
- },
- '.sld-vl50to70.sld-bus-4, .nad-vl50to70.nad-bus-4': {
- '--vl-color': '#C5ED3B',
- },
- '.sld-vl50to70.sld-bus-5, .nad-vl50to70.nad-bus-5': {
- '--vl-color': '#A7B368',
- },
- '.sld-vl50to70.sld-bus-6, .nad-vl50to70.nad-bus-6': {
- '--vl-color': '#55591B',
- },
- '.sld-vl50to70.sld-bus-7, .nad-vl50to70.nad-bus-7': {
- '--vl-color': '#E5E845',
- },
- '.sld-vl50to70.sld-bus-8, .nad-vl50to70.nad-bus-8': {
- '--vl-color': '#ABAE28',
- },
- '.sld-vl50to70.sld-bus-9, .nad-vl50to70.nad-bus-9': {
- '--vl-color': '#DAD971',
- },
- '.sld-vl70to120, .nad-vl70to120': {
- '--vl-color': '#FF9D00',
- },
- '.sld-vl70to120.sld-bus-1, .nad-vl70to120.nad-bus-1': {
- '--vl-color': '#7E3109',
- },
- '.sld-vl70to120.sld-bus-2, .nad-vl70to120.nad-bus-2': {
- '--vl-color': '#C50',
- },
- '.sld-vl70to120.sld-bus-3, .nad-vl70to120.nad-bus-3': {
- '--vl-color': '#25699D',
- },
- '.sld-vl70to120.sld-bus-4, .nad-vl70to120.nad-bus-4': {
- '--vl-color': '#0057F9',
- },
- '.sld-vl70to120.sld-bus-5, .nad-vl70to120.nad-bus-5': {
- '--vl-color': '#74AFEA',
- },
- '.sld-vl70to120.sld-bus-6, .nad-vl70to120.nad-bus-6': {
- '--vl-color': '#1B3459',
- },
- '.sld-vl70to120.sld-bus-7, .nad-vl70to120.nad-bus-7': {
- '--vl-color': '#458BE8',
- },
- '.sld-vl70to120.sld-bus-8, .nad-vl70to120.nad-bus-8': {
- '--vl-color': '#2862AE',
- },
- '.sld-vl70to120.sld-bus-9, .nad-vl70to120.nad-bus-9': {
- '--vl-color': '#B0D4FE',
- },
- '.sld-vl120to180, .nad-vl120to180': {
- '--vl-color': '#00AFAE',
- },
- '.sld-vl120to180.sld-bus-1, .nad-vl120to180.nad-bus-1': {
- '--vl-color': '#0A6365',
- },
- '.sld-vl120to180.sld-bus-2, .nad-vl120to180.nad-bus-2': {
- '--vl-color': '#79CED4',
- },
- '.sld-vl120to180.sld-bus-3, .nad-vl120to180.nad-bus-3': {
- '--vl-color': '#A30E32',
- },
- '.sld-vl120to180.sld-bus-4, .nad-vl120to180.nad-bus-4': {
- '--vl-color': '#FF8290',
- },
- '.sld-vl120to180.sld-bus-5, .nad-vl120to180.nad-bus-5': {
- '--vl-color': '#DAA8AD',
- },
- '.sld-vl120to180.sld-bus-6, .nad-vl120to180.nad-bus-6': {
- '--vl-color': '#C30D33',
- },
- '.sld-vl120to180.sld-bus-7, .nad-vl120to180.nad-bus-7': {
- '--vl-color': '#E3BEC0',
- },
- '.sld-vl120to180.sld-bus-8, .nad-vl120to180.nad-bus-8': {
- '--vl-color': '#FF8290',
- },
- '.sld-vl120to180.sld-bus-9, .nad-vl120to180.nad-bus-9': {
- '--vl-color': '#FFCCD0',
- },
- '.sld-vl180to300, .nad-vl180to300': {
- '--vl-color': '#32B532',
- },
- '.sld-vl180to300.sld-bus-1, .nad-vl180to300.nad-bus-1': {
- '--vl-color': '#1E5D1F',
- },
- '.sld-vl180to300.sld-bus-2, .nad-vl180to300.nad-bus-2': {
- '--vl-color': '#A7B368',
- },
- '.sld-vl180to300.sld-bus-3, .nad-vl180to300.nad-bus-3': {
- '--vl-color': '#E47400',
- },
- '.sld-vl180to300.sld-bus-4, .nad-vl180to300.nad-bus-4': {
- '--vl-color': '#6B3A26',
- },
- '.sld-vl180to300.sld-bus-5, .nad-vl180to300.nad-bus-5': {
- '--vl-color': '#D69A88',
- },
- '.sld-vl180to300.sld-bus-6, .nad-vl180to300.nad-bus-6': {
- '--vl-color': '#7E3109',
- },
- '.sld-vl180to300.sld-bus-7, .nad-vl180to300.nad-bus-7': {
- '--vl-color': '#B78B58',
- },
- '.sld-vl180to300.sld-bus-8, .nad-vl180to300.nad-bus-8': {
- '--vl-color': '#C94119',
- },
- '.sld-vl180to300.sld-bus-9, .nad-vl180to300.nad-bus-9': {
- '--vl-color': '#FFC019',
- },
- '.sld-vl300to500, .nad-vl300to500': {
- '--vl-color': '#F00',
- },
- '.sld-vl300to500.sld-bus-1, .nad-vl300to500.nad-bus-1': {
- '--vl-color': '#920A0A',
- },
- '.sld-vl300to500.sld-bus-2, .nad-vl300to500.nad-bus-2': {
- '--vl-color': '#FF9494',
- },
- '.sld-vl300to500.sld-bus-3, .nad-vl300to500.nad-bus-3': {
- '--vl-color': '#25699D',
- },
- '.sld-vl300to500.sld-bus-4, .nad-vl300to500.nad-bus-4': {
- '--vl-color': '#0057F9',
- },
- '.sld-vl300to500.sld-bus-5, .nad-vl300to500.nad-bus-5': {
- '--vl-color': '#74AFEA',
- },
- '.sld-vl300to500.sld-bus-6, .nad-vl300to500.nad-bus-6': {
- '--vl-color': '#1B3459',
- },
- '.sld-vl300to500.sld-bus-7, .nad-vl300to500.nad-bus-7': {
- '--vl-color': '#458BE8',
- },
- '.sld-vl300to500.sld-bus-8, .nad-vl300to500.nad-bus-8': {
- '--vl-color': '#2862AE',
- },
- '.sld-vl300to500.sld-bus-9, .nad-vl300to500.nad-bus-9': {
- '--vl-color': '#B0D4FE',
- },
+ ...cssColors(LIGHT_THEME),
};
diff --git a/src/utils/colors.ts b/src/utils/colors.ts
index 00a26dee14..83ba6b584c 100644
--- a/src/utils/colors.ts
+++ b/src/utils/colors.ts
@@ -5,22 +5,56 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
-export function getNominalVoltageColor(nominalVoltage: number): number[] {
- if (nominalVoltage >= 300) {
- return [255, 0, 0];
- } else if (nominalVoltage >= 180 && nominalVoltage < 300) {
- return [34, 139, 34];
- } else if (nominalVoltage >= 120 && nominalVoltage < 180) {
- return [1, 175, 175];
- } else if (nominalVoltage >= 70 && nominalVoltage < 120) {
- return [204, 85, 0];
- } else if (nominalVoltage >= 50 && nominalVoltage < 70) {
- return [160, 32, 240];
- } else if (nominalVoltage >= 30 && nominalVoltage < 50) {
- return [255, 130, 144];
- } else {
- return [171, 175, 40];
- }
+import { DARK_THEME, LIGHT_THEME } from '@gridsuite/commons-ui';
+import {
+ BASE_VOLTAGES,
+ getNominalVoltageIntervalByIntervalName,
+ getNominalVoltageIntervalByVoltageValue,
+} from './constants';
+
+function parseRGB(stringRGB: string): number[] | undefined {
+ return stringRGB
+ .match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/)
+ ?.slice(1)
+ .map(Number);
}
+export const getColor = (
+ intervalName: string,
+ busNumber: number,
+ theme: string = DARK_THEME // use theme
+): string | undefined => {
+ const voltageInterval = getNominalVoltageIntervalByIntervalName(intervalName);
+ const bus = busNumber === 0 ? 'default' : 'bus-' + String(busNumber);
+ const color =
+ theme === LIGHT_THEME ? voltageInterval?.lightThemeColors[bus] : voltageInterval?.darkThemeColors[bus];
+ return color;
+};
+
+export const getNominalVoltageColor = (voltageValue: number): number[] | undefined => {
+ const color = getNominalVoltageIntervalByVoltageValue(voltageValue)?.mapColor;
+ return color ? parseRGB(color) : undefined;
+};
+
export const INVALID_LOADFLOW_OPACITY = 0.2;
+
+export const cssColors = (theme: string) => {
+ const css: Record = {};
+
+ for (const interval of BASE_VOLTAGES) {
+ const className = `.sld-${interval.name}, .nad-${interval.name}`;
+
+ const themeColors = theme === DARK_THEME ? interval.darkThemeColors : interval.lightThemeColors;
+ css[className] = { '--vl-color': themeColors.default };
+
+ for (let i = 1; i <= 9; i++) {
+ const key = `bus-${i}`;
+ const color = themeColors[key];
+ if (!color) continue;
+
+ const selector = `.sld-${interval.name}.sld-${key}, .nad-${interval.name}.nad-${key}`;
+ css[selector] = { '--vl-color': color };
+ }
+ }
+ return css;
+};
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
new file mode 100644
index 0000000000..283dfe0121
--- /dev/null
+++ b/src/utils/constants.ts
@@ -0,0 +1,298 @@
+/**
+ * Copyright (c) 2025, RTE (http://www.rte-france.com)
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+type ThemeColors = Record;
+export interface VoltageLevelInterval {
+ name: string;
+ vlValue: number;
+ minValue: number;
+ maxValue: number;
+ label: string;
+ mapColor: string;
+ darkThemeColors: ThemeColors;
+ lightThemeColors: ThemeColors;
+ profile: string;
+}
+
+export const BASE_VOLTAGES: VoltageLevelInterval[] = [
+ {
+ name: 'vl7',
+ vlValue: 400,
+ minValue: 300,
+ maxValue: 500,
+ label: '400 kV',
+ profile: 'Default',
+ mapColor: 'rgb(255, 0, 0)',
+ lightThemeColors: {
+ default: 'rgb(255, 0, 0)',
+ 'bus-1': 'rgb(146, 10, 10)',
+ 'bus-2': 'rgb(255, 148, 148)',
+ 'bus-3': 'rgb(37, 105, 157)',
+ 'bus-4': 'rgb(0, 87, 249)',
+ 'bus-5': 'rgb(116, 175, 234)',
+ 'bus-6': 'rgb(27, 52, 89)',
+ 'bus-7': 'rgb(69, 139, 232)',
+ 'bus-8': 'rgb(40, 98, 174)',
+ 'bus-9': 'rgb(176, 212, 254)',
+ },
+ darkThemeColors: {
+ default: 'rgb(255, 0, 7)',
+ 'bus-1': 'rgb(221, 100, 132)',
+ 'bus-2': 'rgb(255, 188, 190)',
+ 'bus-3': 'rgb(37, 105, 157)',
+ 'bus-4': 'rgb(0, 87, 249)',
+ 'bus-5': 'rgb(116, 175, 234)',
+ 'bus-6': 'rgb(68, 103, 156)',
+ 'bus-7': 'rgb(69, 139, 232)',
+ 'bus-8': 'rgb(40, 98, 174)',
+ 'bus-9': 'rgb(176, 212, 254)',
+ },
+ },
+ {
+ name: 'vl6',
+ vlValue: 225,
+ minValue: 200,
+ maxValue: 300,
+ label: '225 kV',
+ profile: 'Default',
+ mapColor: 'rgb(34, 139, 34)',
+ lightThemeColors: {
+ default: 'rgb(50, 181, 50)',
+ 'bus-1': 'rgb(30, 93, 31)',
+ 'bus-2': 'rgb(167, 179, 104)',
+ 'bus-3': 'rgb(228, 116, 0)',
+ 'bus-4': 'rgb(107, 58, 38)',
+ 'bus-5': 'rgb(214, 154, 136)',
+ 'bus-6': 'rgb(126, 49, 9)',
+ 'bus-7': 'rgb(183, 139, 88)',
+ 'bus-8': 'rgb(201, 65, 25)',
+ 'bus-9': 'rgb(255, 192, 25)',
+ },
+ darkThemeColors: {
+ default: 'rgb(0, 255, 80)',
+ 'bus-1': 'rgb(66, 149, 75)',
+ 'bus-2': 'rgb(167, 178, 126)',
+ 'bus-3': 'rgb(245, 127, 23)',
+ 'bus-4': 'rgb(163, 113, 92)',
+ 'bus-5': 'rgb(219, 171, 157)',
+ 'bus-6': 'rgb(136, 82, 57)',
+ 'bus-7': 'rgb(179, 149, 114)',
+ 'bus-8': 'rgb(201, 65, 25)',
+ 'bus-9': 'rgb(234, 188, 69)',
+ },
+ },
+ {
+ name: 'vl5',
+ vlValue: 150,
+ minValue: 100,
+ maxValue: 200,
+ label: '150 kV',
+ profile: 'Default',
+ mapColor: 'rgb(1, 175, 175)',
+ lightThemeColors: {
+ default: 'rgb(0, 175, 174)',
+ 'bus-1': 'rgb(10, 99, 101)',
+ 'bus-2': 'rgb(121, 206, 212)',
+ 'bus-3': 'rgb(163, 14, 50)',
+ 'bus-4': 'rgb(255, 130, 144)',
+ 'bus-5': 'rgb(218, 168, 173)',
+ 'bus-6': 'rgb(195, 13, 51)',
+ 'bus-7': 'rgb(227, 190, 192)',
+ 'bus-8': 'rgb(255, 130, 144)',
+ 'bus-9': 'rgb(255, 204, 208)',
+ },
+ darkThemeColors: {
+ default: 'rgb(41, 175, 176)',
+ 'bus-1': 'rgb(51, 107, 111)',
+ 'bus-2': 'rgb(132, 198, 204)',
+ 'bus-3': 'rgb(186, 19, 60)',
+ 'bus-4': 'rgb(255, 130, 144)',
+ 'bus-5': 'rgb(218, 168, 173)',
+ 'bus-6': 'rgb(151, 53, 58)',
+ 'bus-7': 'rgb(234, 188, 189)',
+ 'bus-8': 'rgb(234, 46, 51)',
+ 'bus-9': 'rgb(234, 110, 114)',
+ },
+ },
+ {
+ name: 'vl4',
+ vlValue: 90,
+ minValue: 70,
+ maxValue: 100,
+ label: '90 kV',
+ profile: 'Default',
+ mapColor: 'rgb(204, 85, 0)',
+ lightThemeColors: {
+ default: 'rgb(255, 157, 0)',
+ 'bus-1': 'rgb(126, 49, 9)',
+ 'bus-2': 'rgb(204, 85, 0)',
+ 'bus-3': 'rgb(37, 105, 157)',
+ 'bus-4': 'rgb(0, 87, 249)',
+ 'bus-5': 'rgb(116, 175, 234)',
+ 'bus-6': 'rgb(27, 52, 89)',
+ 'bus-7': 'rgb(69, 139, 232)',
+ 'bus-8': 'rgb(40, 98, 174)',
+ 'bus-9': 'rgb(176, 212, 254)',
+ },
+ darkThemeColors: {
+ default: 'rgb(255, 97, 0)',
+ 'bus-1': 'rgb(178, 113, 83)',
+ 'bus-2': 'rgb(198, 166, 139)',
+ 'bus-3': 'rgb(37, 105, 157)',
+ 'bus-4': 'rgb(0, 87, 249)',
+ 'bus-5': 'rgb(116, 175, 234)',
+ 'bus-6': 'rgb(68, 103, 156)',
+ 'bus-7': 'rgb(69, 139, 232)',
+ 'bus-8': 'rgb(40, 98, 174)',
+ 'bus-9': 'rgb(176, 212, 254)',
+ },
+ },
+ {
+ name: 'vl3',
+ vlValue: 63,
+ minValue: 50,
+ maxValue: 70,
+ label: '63 kV',
+ profile: 'Default',
+ mapColor: 'rgb(160, 32, 240)',
+ lightThemeColors: {
+ default: 'rgb(160, 32, 240)',
+ 'bus-1': 'rgb(98, 24, 139)',
+ 'bus-2': 'rgb(172, 138, 194)',
+ 'bus-3': 'rgb(31, 118, 32)',
+ 'bus-4': 'rgb(197, 237, 59)',
+ 'bus-5': 'rgb(167, 179, 104)',
+ 'bus-6': 'rgb(85, 89, 27)',
+ 'bus-7': 'rgb(229, 232, 69)',
+ 'bus-8': 'rgb(171, 174, 40)',
+ 'bus-9': 'rgb(218, 217, 113)',
+ },
+ darkThemeColors: {
+ default: 'rgb(212, 125, 255)',
+ 'bus-1': 'rgb(194, 48, 210)',
+ 'bus-2': 'rgb(171, 148, 191)',
+ 'bus-3': 'rgb(31, 118, 32)',
+ 'bus-4': 'rgb(197, 237, 59)',
+ 'bus-5': 'rgb(167, 179, 104)',
+ 'bus-6': 'rgb(105, 112, 70)',
+ 'bus-7': 'rgb(225, 228, 68)',
+ 'bus-8': 'rgb(170, 174, 80)',
+ 'bus-9': 'rgb(212, 212, 134)',
+ },
+ },
+ {
+ name: 'vl2',
+ vlValue: 42,
+ minValue: 40,
+ maxValue: 50,
+ label: '42 kV',
+ profile: 'Default',
+ mapColor: 'rgb(255, 130, 144)',
+ lightThemeColors: {
+ default: 'rgb(255, 130, 144)',
+ 'bus-1': 'rgb(231, 23, 62)',
+ 'bus-2': 'rgb(218, 168, 173)',
+ 'bus-3': 'rgb(69, 156, 99)',
+ 'bus-4': 'rgb(0, 226, 102)',
+ 'bus-5': 'rgb(167, 179, 104)',
+ 'bus-6': 'rgb(26, 77, 27)',
+ 'bus-7': 'rgb(194, 203, 146)',
+ 'bus-8': 'rgb(33, 139, 33)',
+ 'bus-9': 'rgb(88, 208, 88)',
+ },
+ darkThemeColors: {
+ default: 'rgb(234, 142, 155)',
+ 'bus-1': 'rgb(164, 56, 87)',
+ 'bus-2': 'rgb(206, 170, 176)',
+ 'bus-3': 'rgb(69, 156, 99)',
+ 'bus-4': 'rgb(0, 226, 102)',
+ 'bus-5': 'rgb(167, 179, 104)',
+ 'bus-6': 'rgb(63, 115, 64)',
+ 'bus-7': 'rgb(194, 203, 146)',
+ 'bus-8': 'rgb(33, 139, 33)',
+ 'bus-9': 'rgb(88, 208, 88)',
+ },
+ },
+ {
+ name: 'vl1',
+ vlValue: 20,
+ minValue: 0,
+ maxValue: 40,
+ label: 'HTA',
+ profile: 'Default',
+ mapColor: 'rgb(171, 175, 40)',
+ lightThemeColors: {
+ default: 'rgb(171, 174, 40)',
+ 'bus-1': 'rgb(105, 112, 27)',
+ 'bus-2': 'rgb(216, 210, 10)',
+ 'bus-3': 'rgb(161, 86, 170)',
+ 'bus-4': 'rgb(203, 61, 221)',
+ 'bus-5': 'rgb(166, 132, 188)',
+ 'bus-6': 'rgb(98, 24, 139)',
+ 'bus-7': 'rgb(136, 92, 168)',
+ 'bus-8': 'rgb(160, 32, 240)',
+ 'bus-9': 'rgb(204, 128, 255)',
+ },
+ darkThemeColors: {
+ default: 'rgb(204, 201, 58)',
+ 'bus-1': 'rgb(94, 131, 92)',
+ 'bus-2': 'rgb(177, 180, 108)',
+ 'bus-3': 'rgb(161, 86, 170)',
+ 'bus-4': 'rgb(203, 61, 221)',
+ 'bus-5': 'rgb(172, 138, 194)',
+ 'bus-6': 'rgb(115, 64, 151)',
+ 'bus-7': 'rgb(188, 173, 204)',
+ 'bus-8': 'rgb(162, 70, 224)',
+ 'bus-9': 'rgb(195, 140, 235)',
+ },
+ },
+];
+
+export const MAX_VOLTAGE = 500;
+
+export const getNominalVoltageIntervalByVoltageValue = (voltageValue: number): VoltageLevelInterval | undefined => {
+ for (let interval of BASE_VOLTAGES) {
+ if (voltageValue >= interval.minValue && voltageValue < interval.maxValue) {
+ return interval;
+ }
+ }
+};
+
+export const getNominalVoltageIntervalByIntervalName = (intervalName: string): VoltageLevelInterval | undefined => {
+ for (let interval of BASE_VOLTAGES) {
+ if (interval.name === intervalName) {
+ return interval;
+ }
+ }
+};
+
+export const getNominalVoltageIntervalNameByVoltageValue = (voltageValue: number): string | undefined => {
+ return getNominalVoltageIntervalByVoltageValue(voltageValue)?.name;
+};
+
+export interface BaseVoltages {
+ name: string;
+ minValue: number;
+ maxValue: number;
+ profile: string;
+}
+export interface BaseVoltagesConfigInfos {
+ baseVoltages: BaseVoltages[];
+ defaultProfile: string;
+}
+
+export const getBaseVoltagesConfigInfos = (): BaseVoltagesConfigInfos => {
+ return {
+ baseVoltages: BASE_VOLTAGES.map((vl) => ({
+ name: vl.name,
+ minValue: vl.minValue,
+ maxValue: vl.maxValue,
+ profile: 'Default',
+ })),
+ defaultProfile: 'Default',
+ };
+};