How to Draw Circuits using Circuits.jl

Hi all,

I want to draw this

Capture d’écran_2022-09-19_22-01-52

I want to try Circuits.jl and try simple example first, but unable to use it, I do not know how to plot it, or is my code is wrong…

using Circuits, Plots

c = @circuit a:(0,0) --> Inductor(9e-3) --> b:(0,1) --> Resistor(11) --> c:(1,1) --> Capacitor(1.455e-6) --> d:(1,0)

plot(c)

Cannot convert Circuit to series data for plotting

Stacktrace:
** [1] error(s::String)**
** @ Base ./error.jl:33**
** [2] _prepare_series_data(x::Circuit)**
** @ RecipesPipeline ~/.julia/packages/RecipesPipeline/OXGmH/src/series.jl:8**
** [3] _series_data_vector(x::Circuit, plotattributes::Dict{Symbol, Any})**
** @ RecipesPipeline ~/.julia/packages/RecipesPipeline/OXGmH/src/series.jl:35**
** [4] macro expansion**
** @ ~/.julia/packages/RecipesPipeline/OXGmH/src/series.jl:135 [inlined]**
** [5] apply_recipe(plotattributes::AbstractDict{Symbol, Any}, #unused#::Type{RecipesPipeline.SliceIt}, x::Any, y::Any, z::Any)**
** @ RecipesPipeline ~/.julia/packages/RecipesBase/qpxEX/src/RecipesBase.jl:289**
** [6] _process_userrecipes!(plt::Any, plotattributes::Any, args::Any)**
** @ RecipesPipeline ~/.julia/packages/RecipesPipeline/OXGmH/src/user_recipe.jl:36**
** [7] recipe_pipeline!(plt::Any, plotattributes::Any, args::Any)**
** @ RecipesPipeline ~/.julia/packages/RecipesPipeline/OXGmH/src/RecipesPipeline.jl:70**
** [8] _plot!(plt::Plots.Plot, plotattributes::Any, args::Any)**
** @ Plots ~/.julia/packages/Plots/FCUr0/src/plot.jl:231**
** [9] plot(args::Any; kw::Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}})**
** @ Plots ~/.julia/packages/Plots/FCUr0/src/plot.jl:106**
** [10] plot(args::Any)**
** @ Plots ~/.julia/packages/Plots/FCUr0/src/plot.jl:100**
** [11] top-level scope**
** @ In[11]:5**
** [12] eval**
** @ ./boot.jl:373 [inlined]**
** [13] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)**
** @ Base ./loading.jl:1196**

Then another tryout:

c = @circuit begin
    b:(0,0) --> VoltageSource(3) --> (1,0) --> Resistor(4) --> Inductor(2) --> (1,1) --> a:(0,1)
    :a --> Capacitor(1) // Inductor(4) --> :b
end

show(io,mime,c,shownodes=true)

LoadError: Coordinate // doesn’t exist
in expression starting at In[12]:1

Stacktrace:
** [1] error(s::String)**
** @ Base ./error.jl:33**
** [2] push_stuff!(e::Symbol, coord::Dict{Union{Int64, Symbol}, Union{Expr, Symbol}}, comp::Vector{Expr})**
** @ Circuits ~/.julia/packages/Circuits/0lstw/src/Circuits.jl:177**
** [3] push_stuff!(e::Expr, coord::Dict{Union{Int64, Symbol}, Union{Expr, Symbol}}, comp::Vector{Expr})**
** @ Circuits ~/.julia/packages/Circuits/0lstw/src/Circuits.jl:146**
** [4] push_stuff!(e::Expr, coord::Dict{Union{Int64, Symbol}, Union{Expr, Symbol}}, comp::Vector{Expr})**
** @ Circuits ~/.julia/packages/Circuits/0lstw/src/Circuits.jl:120**
** [5] push_stuff!(e::Expr, coord::Dict{Union{Int64, Symbol}, Union{Expr, Symbol}}, comp::Vector{Expr})**
** @ Circuits ~/.julia/packages/Circuits/0lstw/src/Circuits.jl:121**
** [6] generate_circuit(arg::Expr)**
** @ Circuits ~/.julia/packages/Circuits/0lstw/src/Circuits.jl:90**
** [7] var"@circuit"(source::LineNumberNode, module::Module, args::Vararg{Any})**
** @ Circuits ~/.julia/packages/Circuits/0lstw/src/Circuits.jl:77**
** [8] eval**
** @ ./boot.jl:373 [inlined]**
** [9] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)**
** @ Base ./loading.jl:1196**

Can anyone help me on this? Thanks~!!

If you only want to draw it, i think you’d better use the underlying circuitikz (for TikZ). I see no advantage is approaching it through an additional Julia layer.

1 Like

Alright then, thanks for this

I see a bunch of benefits here such as automating generating circuit images. Having an abstract Julia representation would be useful for generating visual circuit diagrams for practice problems. However that is possible through

show(io::IO,::MIME"text/circuitikz",c::Circuit)

which might be a better answer how to plot a circuit.