Skip to content

Commit ffc5611

Browse files
ayolabSlimane AMAR
andauthored
Add limit violition highlighting in NAD and SLD (#848)
Signed-off-by: Ayoub LABIDI <[email protected]> Co-authored-by: Slimane AMAR <[email protected]>
1 parent 19f6095 commit ffc5611

File tree

7 files changed

+136
-42
lines changed

7 files changed

+136
-42
lines changed

src/main/java/org/gridsuite/study/server/controller/StudyController.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ public ResponseEntity<Void> duplicateSubtree(@Parameter(description = "The study
369369
@Operation(summary = "get the voltage level diagram for the given network and voltage level")
370370
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The svg"),
371371
@ApiResponse(responseCode = "404", description = "The voltage level has not been found")})
372-
public ResponseEntity<byte[]> getVoltageLevelDiagram(
372+
public ResponseEntity<byte[]> generateVoltageLevelDiagram(
373373
@PathVariable("studyUuid") UUID studyUuid,
374374
@PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
375375
@PathVariable("nodeUuid") UUID nodeUuid,
@@ -390,7 +390,7 @@ public ResponseEntity<byte[]> getVoltageLevelDiagram(
390390
.sldDisplayMode(sldDisplayMode)
391391
.language(language)
392392
.build();
393-
byte[] result = studyService.getVoltageLevelSvg(
393+
byte[] result = studyService.generateVoltageLevelSvg(
394394
voltageLevelId,
395395
diagramParameters,
396396
nodeUuid,
@@ -403,7 +403,7 @@ public ResponseEntity<byte[]> getVoltageLevelDiagram(
403403
@Operation(summary = "get the voltage level diagram for the given network and voltage level")
404404
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The svg and metadata"),
405405
@ApiResponse(responseCode = "404", description = "The voltage level has not been found")})
406-
public ResponseEntity<String> getVoltageLevelDiagramAndMetadata(
406+
public ResponseEntity<String> generateVoltageLevelDiagramAndMetadata(
407407
@PathVariable("studyUuid") UUID studyUuid,
408408
@PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
409409
@PathVariable("nodeUuid") UUID nodeUuid,
@@ -424,7 +424,7 @@ public ResponseEntity<String> getVoltageLevelDiagramAndMetadata(
424424
.sldDisplayMode(sldDisplayMode)
425425
.language(language)
426426
.build();
427-
String result = studyService.getVoltageLevelSvgAndMetadata(
427+
String result = studyService.generateVoltageLevelSvgAndMetadata(
428428
voltageLevelId,
429429
diagramParameters,
430430
nodeUuid,
@@ -1135,7 +1135,7 @@ public ResponseEntity<String> getShortCircuitParameters(@PathVariable("studyUuid
11351135
@Operation(summary = "get the substation diagram for the given network and substation")
11361136
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The svg"),
11371137
@ApiResponse(responseCode = "404", description = "The substation has not been found")})
1138-
public ResponseEntity<byte[]> getSubstationDiagram(
1138+
public ResponseEntity<byte[]> generateSubstationDiagram(
11391139
@PathVariable("studyUuid") UUID studyUuid,
11401140
@PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
11411141
@PathVariable("nodeUuid") UUID nodeUuid,
@@ -1155,7 +1155,7 @@ public ResponseEntity<byte[]> getSubstationDiagram(
11551155
.componentLibrary(componentLibrary)
11561156
.language(language)
11571157
.build();
1158-
byte[] result = studyService.getSubstationSvg(substationId,
1158+
byte[] result = studyService.generateSubstationSvg(substationId,
11591159
diagramParameters, substationLayout, nodeUuid, rootNetworkUuid);
11601160
return result != null ? ResponseEntity.ok().contentType(MediaType.APPLICATION_XML).body(result) :
11611161
ResponseEntity.noContent().build();
@@ -1165,7 +1165,7 @@ public ResponseEntity<byte[]> getSubstationDiagram(
11651165
@Operation(summary = "get the substation diagram for the given network and substation")
11661166
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The svg and metadata"),
11671167
@ApiResponse(responseCode = "404", description = "The substation has not been found")})
1168-
public ResponseEntity<String> getSubstationDiagramAndMetadata(
1168+
public ResponseEntity<String> generateSubstationDiagramAndMetadata(
11691169
@PathVariable("studyUuid") UUID studyUuid,
11701170
@PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
11711171
@PathVariable("nodeUuid") UUID nodeUuid,
@@ -1185,7 +1185,7 @@ public ResponseEntity<String> getSubstationDiagramAndMetadata(
11851185
.componentLibrary(componentLibrary)
11861186
.language(language)
11871187
.build();
1188-
String result = studyService.getSubstationSvgAndMetadata(
1188+
String result = studyService.generateSubstationSvgAndMetadata(
11891189
substationId,
11901190
diagramParameters,
11911191
substationLayout,
@@ -1198,12 +1198,12 @@ public ResponseEntity<String> getSubstationDiagramAndMetadata(
11981198
@PostMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network-area-diagram", produces = MediaType.APPLICATION_JSON_VALUE)
11991199
@Operation(summary = "get the network area diagram for the given network and voltage levels")
12001200
@ApiResponse(responseCode = "200", description = "The svg")
1201-
public ResponseEntity<String> getNetworkAreaDiagram(
1201+
public ResponseEntity<String> generateNetworkAreaDiagram(
12021202
@PathVariable("studyUuid") UUID studyUuid,
12031203
@PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
12041204
@PathVariable("nodeUuid") UUID nodeUuid,
1205-
@RequestBody String nadRequestInfos) {
1206-
String result = studyService.getNetworkAreaDiagram(nodeUuid, rootNetworkUuid, nadRequestInfos);
1205+
@RequestBody Map<String, Object> nadRequestInfos) {
1206+
String result = studyService.generateNetworkAreaDiagram(nodeUuid, rootNetworkUuid, nadRequestInfos);
12071207
return result != null ? ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(result) :
12081208
ResponseEntity.noContent().build();
12091209
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* Copyright (c) 2025 RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package org.gridsuite.study.server.dto;
8+
9+
/**
10+
* @author Ayoub LABIDI <ayoub.labidi at rte-france.com>
11+
*/
12+
13+
public record CurrentLimitViolationInfos(
14+
String equipmentId,
15+
String limitName
16+
) {
17+
}

src/main/java/org/gridsuite/study/server/service/LoadFlowService.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,21 @@ public List<LimitViolationInfos> getLimitViolations(UUID resultUuid, String filt
269269
return result;
270270
}
271271

272+
public List<LimitViolationInfos> getCurrentLimitViolations(UUID resultUuid) {
273+
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + LOADFLOW_API_VERSION + "/results/{resultUuid}/current-limit-violations");
274+
String path = uriComponentsBuilder.buildAndExpand(resultUuid).toUriString();
275+
try {
276+
ResponseEntity<List<LimitViolationInfos>> responseEntity = restTemplate.exchange(loadFlowServerBaseUri + path, HttpMethod.GET, null, new ParameterizedTypeReference<>() {
277+
});
278+
return responseEntity.getBody();
279+
} catch (HttpStatusCodeException e) {
280+
if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) {
281+
throw new StudyException(LOADFLOW_NOT_FOUND);
282+
}
283+
throw e;
284+
}
285+
}
286+
272287
public LoadFlowParametersInfos getLoadFlowParameters(UUID parametersUuid) {
273288

274289
String path = UriComponentsBuilder.fromPath(DELIMITER + LOADFLOW_API_VERSION + PARAMETERS_URI)

src/main/java/org/gridsuite/study/server/service/SingleLineDiagramService.java

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.gridsuite.study.server.dto.DiagramParameters;
1717
import org.gridsuite.study.server.dto.diagramgridlayout.diagramlayout.NetworkAreaDiagramLayoutDetails;
1818
import org.gridsuite.study.server.dto.diagramgridlayout.nad.NadConfigInfos;
19+
import org.gridsuite.study.server.dto.CurrentLimitViolationInfos;
1920
import org.springframework.beans.factory.annotation.Value;
2021
import org.springframework.core.ParameterizedTypeReference;
2122
import org.springframework.http.*;
@@ -28,6 +29,7 @@
2829
import org.springframework.web.util.UriComponentsBuilder;
2930

3031
import java.util.List;
32+
import java.util.Map;
3133
import java.util.Objects;
3234
import java.util.UUID;
3335

@@ -72,7 +74,7 @@ public List<String> getAvailableSvgComponentLibraries() {
7274
}).getBody();
7375
}
7476

75-
public byte[] getVoltageLevelSvg(UUID networkUuid, String variantId, String voltageLevelId, DiagramParameters diagramParameters) {
77+
public byte[] generateVoltageLevelSvg(UUID networkUuid, String variantId, String voltageLevelId, DiagramParameters diagramParameters, List<CurrentLimitViolationInfos> limitViolations) {
7678
var uriComponentsBuilder = UriComponentsBuilder
7779
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/svg/{networkUuid}/{voltageLevelId}")
7880
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
@@ -86,9 +88,14 @@ public byte[] getVoltageLevelSvg(UUID networkUuid, String variantId, String volt
8688
.buildAndExpand(networkUuid, voltageLevelId)
8789
.toUriString();
8890

91+
HttpHeaders headers = new HttpHeaders();
92+
headers.setContentType(MediaType.APPLICATION_JSON);
93+
94+
HttpEntity<List<CurrentLimitViolationInfos>> httpEntity = new HttpEntity<>(limitViolations, headers);
95+
8996
byte[] result;
9097
try {
91-
result = restTemplate.getForObject(singleLineDiagramServerBaseUri + path, byte[].class);
98+
result = restTemplate.postForObject(singleLineDiagramServerBaseUri + path, httpEntity, byte[].class);
9299
} catch (HttpStatusCodeException e) {
93100
if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) {
94101
throw new StudyException(SVG_NOT_FOUND, VOLTAGE_LEVEL + voltageLevelId + NOT_FOUND);
@@ -99,7 +106,7 @@ public byte[] getVoltageLevelSvg(UUID networkUuid, String variantId, String volt
99106
return result;
100107
}
101108

102-
public String getVoltageLevelSvgAndMetadata(UUID networkUuid, String variantId, String voltageLevelId, DiagramParameters diagramParameters) {
109+
public String generateVoltageLevelSvgAndMetadata(UUID networkUuid, String variantId, String voltageLevelId, DiagramParameters diagramParameters, List<CurrentLimitViolationInfos> limitViolations) {
103110
var uriComponentsBuilder = UriComponentsBuilder
104111
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION
105112
+ "/svg-and-metadata/{networkUuid}/{voltageLevelId}")
@@ -111,9 +118,14 @@ public String getVoltageLevelSvgAndMetadata(UUID networkUuid, String variantId,
111118
.queryParam(LANGUAGE, diagramParameters.getLanguage());
112119
addParameters(diagramParameters, uriComponentsBuilder, variantId);
113120

121+
HttpHeaders headers = new HttpHeaders();
122+
headers.setContentType(MediaType.APPLICATION_JSON);
123+
124+
HttpEntity<List<CurrentLimitViolationInfos>> httpEntity = new HttpEntity<>(limitViolations, headers);
114125
String result;
115126
try {
116-
result = restTemplate.getForObject(singleLineDiagramServerBaseUri + uriComponentsBuilder.build().toUriString(), String.class, networkUuid, voltageLevelId);
127+
var path = uriComponentsBuilder.buildAndExpand(networkUuid, voltageLevelId).toUriString();
128+
result = restTemplate.postForObject(singleLineDiagramServerBaseUri + path, httpEntity, String.class);
117129
} catch (HttpStatusCodeException e) {
118130
if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) {
119131
throw new StudyException(SVG_NOT_FOUND, VOLTAGE_LEVEL + voltageLevelId + NOT_FOUND);
@@ -124,7 +136,7 @@ public String getVoltageLevelSvgAndMetadata(UUID networkUuid, String variantId,
124136
return result;
125137
}
126138

127-
public byte[] getSubstationSvg(UUID networkUuid, String variantId, String substationId, DiagramParameters diagramParameters, String substationLayout) {
139+
public byte[] generateSubstationSvg(UUID networkUuid, String variantId, String substationId, DiagramParameters diagramParameters, String substationLayout, List<CurrentLimitViolationInfos> limitViolations) {
128140
var uriComponentsBuilder = UriComponentsBuilder
129141
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/substation-svg/{networkUuid}/{substationId}")
130142
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
@@ -136,8 +148,12 @@ public byte[] getSubstationSvg(UUID networkUuid, String variantId, String substa
136148
var path = uriComponentsBuilder.buildAndExpand(networkUuid, substationId).toUriString();
137149

138150
byte[] result;
151+
HttpHeaders headers = new HttpHeaders();
152+
headers.setContentType(MediaType.APPLICATION_JSON);
153+
154+
HttpEntity<List<CurrentLimitViolationInfos>> httpEntity = new HttpEntity<>(limitViolations, headers);
139155
try {
140-
result = restTemplate.getForObject(singleLineDiagramServerBaseUri + path, byte[].class);
156+
result = restTemplate.postForObject(singleLineDiagramServerBaseUri + path, httpEntity, byte[].class);
141157
} catch (HttpStatusCodeException e) {
142158
if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) {
143159
throw new StudyException(SVG_NOT_FOUND, "Substation " + substationId + NOT_FOUND);
@@ -148,7 +164,7 @@ public byte[] getSubstationSvg(UUID networkUuid, String variantId, String substa
148164
return result;
149165
}
150166

151-
public String getSubstationSvgAndMetadata(UUID networkUuid, String variantId, String substationId, DiagramParameters diagramParameters, String substationLayout) {
167+
public String generateSubstationSvgAndMetadata(UUID networkUuid, String variantId, String substationId, DiagramParameters diagramParameters, String substationLayout, List<CurrentLimitViolationInfos> limitViolations) {
152168
var uriComponentsBuilder = UriComponentsBuilder
153169
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/substation-svg-and-metadata/{networkUuid}/{substationId}")
154170
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
@@ -160,8 +176,12 @@ public String getSubstationSvgAndMetadata(UUID networkUuid, String variantId, St
160176
addParameters(diagramParameters, uriComponentsBuilder, variantId);
161177

162178
String result;
179+
HttpHeaders headers = new HttpHeaders();
180+
headers.setContentType(MediaType.APPLICATION_JSON);
181+
182+
HttpEntity<List<CurrentLimitViolationInfos>> httpEntity = new HttpEntity<>(limitViolations, headers);
163183
try {
164-
result = restTemplate.getForEntity(singleLineDiagramServerBaseUri + uriComponentsBuilder.build().toUriString(), String.class, networkUuid, substationId).getBody();
184+
result = restTemplate.postForEntity(singleLineDiagramServerBaseUri + uriComponentsBuilder.build().toUriString(), httpEntity, String.class, networkUuid, substationId).getBody();
165185
} catch (HttpStatusCodeException e) {
166186
if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) {
167187
throw new StudyException(SVG_NOT_FOUND, "Substation " + substationId + NOT_FOUND);
@@ -172,7 +192,7 @@ public String getSubstationSvgAndMetadata(UUID networkUuid, String variantId, St
172192
return result;
173193
}
174194

175-
public String getNetworkAreaDiagram(UUID networkUuid, String variantId, String nadRequestInfos) {
195+
public String generateNetworkAreaDiagram(UUID networkUuid, String variantId, Map<String, Object> nadRequestInfos) {
176196
var uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION +
177197
"/network-area-diagram/{networkUuid}");
178198
if (!StringUtils.isBlank(variantId)) {
@@ -184,7 +204,7 @@ public String getNetworkAreaDiagram(UUID networkUuid, String variantId, String n
184204

185205
var headers = new HttpHeaders();
186206
headers.setContentType(MediaType.APPLICATION_JSON);
187-
HttpEntity<String> request = new HttpEntity<>(nadRequestInfos, headers);
207+
HttpEntity<Map<String, Object>> request = new HttpEntity<>(nadRequestInfos, headers);
188208

189209
try {
190210
return restTemplate.postForObject(singleLineDiagramServerBaseUri + path, request, String.class);

0 commit comments

Comments
 (0)