diff --git a/src/containers/base_sequences.jl b/src/containers/base_sequences.jl index 782f47787d9f8aa248580743b7fe077557167be2..7a55a70fe137b241d6fb45ceadb584e5561ca43b 100644 --- a/src/containers/base_sequences.jl +++ b/src/containers/base_sequences.jl @@ -4,7 +4,7 @@ Defines [`BaseSequence`](@ref) and [`Sequence`](@ref) module BaseSequences import StaticArrays: SVector import JuMP: @constraint -import ...Variables: get_free_variable, VariableType, variables, set_simple_constraints!, make_generic, get_gradient, get_pulse, get_gradient, @defvar, add_cost_function! +import ...Variables: get_free_variable, VariableType, variables, set_simple_constraints!, make_generic, get_gradient, get_pulse, get_gradient, @defvar, add_cost_function!, base_variables import ...BuildSequences: global_scanner import ...Components: EventComponent, NoGradient, edge_times import ...Scanners: Scanner, B0 @@ -160,6 +160,29 @@ function Sequence(blocks::AbstractVector; name=:Sequence, scanner=nothing, vars. end Base.show(io::IO, ::Type{<:Sequence{S, N}}) where {S, N} = print(io, S, "{$N}") + +function Base.propertynames(seq::T) where {T <: Sequence} + f = Base.fieldnames(T) + var_names = [k for k in keys(base_variables(T)) if !(k in f)] + intermediate = (f..., var_names...) + part_names = [k for (k, _) in values(seq.blocks) if !isnothing(k) && !(k in intermediate)] + return (intermediate..., part_names...) +end + +function Base.getproperty(seq::T, v::Symbol) where T <: Sequence + if v in Base.fieldnames(T) + return getfield(seq, v) + end + vars = base_variables(T) + if v in keys(vars) + return vars[v](seq) + end + if v in [k for (k, _) in values(seq.blocks)] + return seq[v] + end + error("Type $(T) has no field, block, or variable $(v)") +end + B0(sequence::Sequence) = B0(sequence.scanner) Sequence(blocks...; kwargs...) = Sequence([blocks...]; kwargs...)