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', + }; +};