From a12f90349e2aadfc2f9fbeee23276115099ead08 Mon Sep 17 00:00:00 2001 From: Daniel Thom Date: Fri, 31 Jan 2025 18:04:51 -0700 Subject: [PATCH] Add set_bus_number! --- src/PowerSystems.jl | 2 ++ src/base.jl | 22 ++++++++++++++++++++++ src/descriptors/power_system_structs.json | 3 ++- src/models/generated/ACBus.jl | 2 -- test/test_system.jl | 13 +++++++++++++ 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/PowerSystems.jl b/src/PowerSystems.jl index 1034e8db9c..b0c8e6e3d7 100644 --- a/src/PowerSystems.jl +++ b/src/PowerSystems.jl @@ -411,6 +411,8 @@ export create_poly_cost #export make_time_series export get_bus_numbers +export set_bus_number! +export set_number! # Remove this in v5.0. export get_name export set_name! export get_component_uuids diff --git a/src/base.jl b/src/base.jl index a7cadcba07..40d9c4e67b 100644 --- a/src/base.jl +++ b/src/base.jl @@ -2619,6 +2619,28 @@ function convert_component!( remove_component!(sys, old_load) end +""" +Set the number of a bus. +""" +function set_bus_number!(sys::System, bus::ACBus, number::Int) + if number in sys.bus_numbers + throw(ArgumentError("bus number $number is already stored in the system")) + end + bus.number = number + push!(sys.bus_numbers, number) + return +end + +function set_number!(bus::ACBus, number::Int) + Base.depwarn( + "This method will be removed in v5.0 because its use breaks system consistency" * + "checks. Please call `set_bus_number!(::System, bus, number)` instead.", + :set_number!, + ) + bus.number = number + return +end + # Use this function to avoid deepcopy of shared_system_references. function _copy_internal_for_conversion(component::Component) internal = get_internal(component) diff --git a/src/descriptors/power_system_structs.json b/src/descriptors/power_system_structs.json index 88c04ec7c9..5438533dc7 100644 --- a/src/descriptors/power_system_structs.json +++ b/src/descriptors/power_system_structs.json @@ -210,6 +210,7 @@ "name": "number", "comment": "A unique bus identification number (positive integer)", "null_value": "0", + "exclude_setter": true, "data_type": "Int" }, { @@ -17591,4 +17592,4 @@ ], "struct_validation_descriptors": [ ] -} \ No newline at end of file +} diff --git a/src/models/generated/ACBus.jl b/src/models/generated/ACBus.jl index 1afbf74fd0..cae678842b 100644 --- a/src/models/generated/ACBus.jl +++ b/src/models/generated/ACBus.jl @@ -123,8 +123,6 @@ get_ext(value::ACBus) = value.ext """Get [`ACBus`](@ref) `internal`.""" get_internal(value::ACBus) = value.internal -"""Set [`ACBus`](@ref) `number`.""" -set_number!(value::ACBus, val) = value.number = val """Set [`ACBus`](@ref) `bustype`.""" set_bustype!(value::ACBus, val) = value.bustype = val """Set [`ACBus`](@ref) `angle`.""" diff --git a/test/test_system.jl b/test/test_system.jl index f618544cd3..4a6c4fece6 100644 --- a/test/test_system.jl +++ b/test/test_system.jl @@ -614,3 +614,16 @@ end device2 = first(get_components(ThermalStandard, sys2)) @test_throws ArgumentError add_service!(device2, service1, sys2) end + +@testset "Test set_bus_number!" begin + sys = PSB.build_system(PSITestSystems, "test_RTS_GMLC_sys") + buses = collect(get_components(ACBus, sys)) + bus1 = buses[1] + bus2 = buses[2] + orig = get_number(bus1) + new_number = 9999999 + @test orig != new_number + set_bus_number!(sys, bus1, new_number) + @test get_number(bus1) == new_number + @test_throws ArgumentError set_bus_number!(sys, bus1, get_number(bus2)) +end