MakieOrg / Makie.jl

Interactive data visualizations and plotting in Julia
https://docs.makie.org/stable
MIT License
2.4k stars 307 forks source link

DimensionMismatch error when changing image with the same size but different dimensions #2643

Closed pzabka closed 9 months ago

pzabka commented 1 year ago

A DimensionMismatch error occurs when updating an image with the same size but different dimensions as the previous one. Using an image with a different size ( using sizeof(img) ) doesn't cause the problem.

MWE:

using GLMakie

A = rand(Float64, (20, 20))
B = rand(Float64, (20, 10))
C = rand(Float64, (10, 20))

fig = Figure()
img = Observable(A)
fig[1,1] = GLMakie.Axis(fig, aspect = DataAspect())
image!(img)
fig[2,1] = button1 = Button(fig, label = "press first (works)")
fig[3,1] = button2 = Button(fig, label = "press second (error)")

on(button1.clicks) do _
    img[] = B
end
on(button2.clicks) do _
    img[] = C
end

fig

Error Stacktrace:

Error in callback:
DimensionMismatch: asigning a (10, 20) to a (20, 10) location
Stacktrace:
  [1] checkdimensions
    @ ...\Julia\.julia\packages\GLMakie\6Blp9\src\GLAbstraction\AbstractGPUArray.jl:19 [inlined]
  [2] setindex!
    @ ...\Julia\.julia\packages\GLMakie\6Blp9\src\GLAbstraction\AbstractGPUArray.jl:49 [inlined]
  [3] update!(A::GLMakie.GLAbstraction.Texture{Float32, 2}, value::Matrix{Float32})
    @ GLMakie.GLAbstraction ...\Julia\.julia\packages\GLMakie\6Blp9\src\GLAbstraction\AbstractGPUArray.jl:72
  [4] (::GLMakie.GLAbstraction.var"#11#13"{GLMakie.GLAbstraction.Texture{Float32, 2}})(new_data::Matrix{Float32})
    @ GLMakie.GLAbstraction ...\Julia\.julia\packages\GLMakie\6Blp9\src\GLAbstraction\AbstractGPUArray.jl:197
  [5] #invokelatest#2
    @ .\essentials.jl:729 [inlined]
  [6] invokelatest
    @ .\essentials.jl:726 [inlined]
  [7] notify
    @ ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:169 [inlined]
  [8] setindex!(observable::Observable, val::Any)
    @ Observables ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:86
  [9] (::Observables.MapCallback)(value::Any)
    @ Observables ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:431
 [10] #invokelatest#2
    @ .\essentials.jl:729 [inlined]
 [11] invokelatest
    @ .\essentials.jl:726 [inlined]
 [12] notify
    @ ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:169 [inlined]
 [13] setindex!(observable::Observable, val::Any)
    @ Observables ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:86
 [14] (::Observables.MapCallback)(value::Any)
    @ Observables ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:431
 [15] #invokelatest#2
    @ .\essentials.jl:729 [inlined]
 [16] invokelatest
    @ .\essentials.jl:726 [inlined]
 [17] notify
    @ ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:169 [inlined]
 [18] setindex!(observable::Observable, val::Any)
    @ Observables ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:86
 [19] (::Makie.var"#168#170"{Attributes, Observable{Tuple{StepRangeLen{Float32, Float64, Float64, Int64}, StepRangeLen{Float32, Float64, Float64, Int64}, Matrix{Float32}}}, DataType})(kwargs::Tuple{}, args::Matrix{Float64})
    @ Makie ...\Julia\.julia\packages\Makie\Za3LL\src\interfaces.jl:334
 [20] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Base .\essentials.jl:729
 [21] invokelatest(::Any, ::Any, ::Vararg{Any})
    @ Base .\essentials.jl:726
 [22] (::Observables.OnAny)(value::Any)
    @ Observables ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:415
 [23] #invokelatest#2
    @ .\essentials.jl:729 [inlined]
 [24] invokelatest
    @ .\essentials.jl:726 [inlined]
 [25] notify
    @ ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:169 [inlined]
 [26] setindex!(observable::Observable, val::Any)
    @ Observables ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:86
 [27] (::var"#15#16")(#unused#::Int64)
    @ Main ...\src\mwe_error.jl:18
 [28] #invokelatest#2
    @ .\essentials.jl:729 [inlined]
 [29] invokelatest
    @ .\essentials.jl:726 [inlined]
 [30] notify
    @ ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:169 [inlined]
 [31] setindex!(observable::Observable, val::Any)
    @ Observables ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:86
 [32] (::Makie.var"#1634#1644"{Button, Observable{Symbol}})(#unused#::MouseEvent)
    @ Makie ...\Julia\.julia\packages\Makie\Za3LL\src\makielayout\blocks\button.jl:68
 [33] (::Makie.var"#1106#1107"{Makie.var"#1634#1644"{Button, Observable{Symbol}}})(event::MouseEvent)
    @ Makie ...\Julia\.julia\packages\Makie\Za3LL\src\makielayout\mousestatemachine.jl:86
 [34] #invokelatest#2
    @ .\essentials.jl:729 [inlined]
 [35] invokelatest
    @ .\essentials.jl:726 [inlined]
 [36] notify
    @ ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:169 [inlined]
 [37] setindex!
    @ ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:86 [inlined]
 [38] (::Makie.var"#1176#1178"{Scene, Base.RefValue{Bool}, Base.RefValue{Union{Nothing, Makie.Mouse.Button}}, Base.RefValue{Float64}, Base.RefValue{Float64}, Base.RefValue{Bool}, Base.RefValue{Bool}, Base.RefValue{Union{Nothing, Makie.Mouse.Button}}, Base.RefValue{Bool}, Base.RefValue{Point{2, Float32}}, Base.RefValue{Point{2, Float32}}, Base.RefValue{Makie.Mouse.Action}, Observable{MouseEvent}, Float64, Module})(event::Makie.MouseButtonEvent)    @ Makie ...\Julia\.julia\packages\Makie\Za3LL\src\makielayout\mousestatemachine.jl:256
 [39] #invokelatest#2
    @ .\essentials.jl:729 [inlined]
 [40] invokelatest
    @ .\essentials.jl:726 [inlined]
 [41] notify
    @ ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:169 [inlined]
 [42] setindex!
    @ ...\Julia\.julia\packages\Observables\PHGQ8\src\Observables.jl:86 [inlined]
 [43] (::GLMakie.var"#mousebuttons#143"{Observable{Makie.MouseButtonEvent}})(window::GLFW.Window, button::GLFW.MouseButton, action::GLFW.Action, mods::Int32)
    @ GLMakie ...\Julia\.julia\packages\GLMakie\6Blp9\src\events.jl:101
 [44] _MouseButtonCallbackWrapper(window::GLFW.Window, button::GLFW.MouseButton, action::GLFW.Action, mods::Int32)
    @ GLFW ...\Julia\.julia\packages\GLFW\BWxfF\src\callback.jl:43
 [45] PollEvents
    @ ...\Julia\.julia\packages\GLFW\BWxfF\src\glfw3.jl:620 [inlined]
 [46] pollevents(screen::GLMakie.Screen{GLFW.Window})
    @ GLMakie ...\Julia\.julia\packages\GLMakie\6Blp9\src\screen.jl:408
 [47] on_demand_renderloop(screen::GLMakie.Screen{GLFW.Window})
    @ GLMakie ...\Julia\.julia\packages\GLMakie\6Blp9\src\screen.jl:834
 [48] renderloop(screen::GLMakie.Screen{GLFW.Window})
    @ GLMakie ...\Julia\.julia\packages\GLMakie\6Blp9\src\screen.jl:858
 [49] (::GLMakie.var"#65#66"{GLMakie.Screen{GLFW.Window}})()
    @ GLMakie .\task.jl:484
pzabka commented 9 months ago

fixed with https://github.com/MakieOrg/Makie.jl/pull/3456