diff --git a/MPIViewers/Project.toml b/MPIViewers/Project.toml new file mode 100644 index 0000000..936d763 --- /dev/null +++ b/MPIViewers/Project.toml @@ -0,0 +1,64 @@ +name = "MPIViewers" +uuid = "8bda2715-69d8-46f6-8f4f-eacbc82b6e08" +authors = ["Tobias Knopp "] +version = "0.1.0" + +[deps] +Cairo = "159f3aea-2a34-519c-b102-8c37f9878175" +CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" +DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab" +FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +Gtk4 = "9db2cae5-386f-4011-9d63-a5602296539b" +Gtk4Makie = "478199e7-b407-4926-87ea-7196203a28d8" +Graphics = "a2bd30eb-e257-5431-a919-1863eab51364" +HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" +ImageUtils = "8ad4436d-4835-5a14-8bce-3ae014d2950b" +Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" +LoggingExtras = "e6f89c97-d47a-5376-807f-9c37f3926c36" +MPIFiles = "371237a9-e6c1-5201-9adb-3d8cfa78fa9f" +MPIReco = "e4246700-6248-511e-8146-a1d1f47669d2" +MPISphericalHarmonics = "2527f7a4-0af4-4016-a944-036fbac19de9" +NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" +Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +Reexport = "189a3867-3050-52da-a836-e630ba90ab69" +SphericalHarmonicExpansions = "504afa71-bae7-47b4-8ec9-3851161806ac" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[compat] +Cairo = "1.0" +Colors = "0.12" +FFTW = "1.3" +FileIO = "1.6" +Graphics = "1.1" +HDF5 = "0.15, 0.16" +ImageUtils = "0.2" +Images = "0.23, 0.24, 0.25" +LoggingExtras = ">= 0.4.2" +MPIFiles = "0.15, 0.16" +MPIReco = "0.7" +MPISphericalHarmonics = "0.0.10" +Reexport = "1.0" +CairoMakie = "0.12" +julia = "1.10" +Gtk4 = "0.7" +Gtk4Makie = "0.2, 0.3" + + +[extras] +HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[targets] +test = ["Test", "HTTP"] diff --git a/MPIViewers/src/3DViewer/3DViewer.jl b/MPIViewers/src/3DViewer/3DViewer.jl new file mode 100644 index 0000000..0733ae1 --- /dev/null +++ b/MPIViewers/src/3DViewer/3DViewer.jl @@ -0,0 +1,51 @@ +abstract type Abstract3DViewerMode end +modeName(m::Abstract3DViewerMode) = string(typeof(m)) + +#= + At the moment it is not possible to update a GtkMakieWidget with new plots. + This means we either have to create a new GtkMakieWidget to update the plot + or we hook into the observables of the plots. + + The second approach breaks for certain plots, for example for isovolumes (if the isovalue changed). +=# +abstract type Abstract3DViewerModeRedrawType end +struct ObservableRedraw <: Abstract3DViewerModeRedrawType end +struct WidgetRedraw <: Abstract3DViewerModeRedrawType end +redrawType(::Abstract3DViewerMode) = ObservableRedraw() + +include("3DViewerWidget.jl") +include("VolumeMode.jl") +include("SectionalMode.jl") +include("IsoSurfaceMode.jl") + +function updateData!(m::Abstract3DViewerMode, arr) + # NOP +end + +function showData!(gm::Gtk4Makie.GtkGLMakie, mode, data; kwargs...) + fig = Figure() + lscene = LScene(fig[1,1]) + res = showData!(WidgetRedraw(), lscene, mode, data; kwargs...) + push!(gm, fig) + return res +end + +export DataViewer3D, DataViewer3DWidget +mutable struct DataViewer3D + w::Gtk4.GtkWindowLeaf + dvw::DataViewer3DWidget +end + +function DataViewer3D(imFG; kwargs...) + dv = DataViewer3D(; kwargs...) + updateData!(dv.dvw,imFG) + return dv +end + +function DataViewer3D(; kwargs...) + w = GtkWindow("Data Viewer 3D",800,600) + dw = DataViewer3DWidget(; kwargs...) + push!(w,dw) + show(w) + return DataViewer3D(w,dw) +end \ No newline at end of file diff --git a/MPIViewers/src/3DViewer/3DViewerWidget.jl b/MPIViewers/src/3DViewer/3DViewerWidget.jl new file mode 100644 index 0000000..d2e136c --- /dev/null +++ b/MPIViewers/src/3DViewer/3DViewerWidget.jl @@ -0,0 +1,202 @@ +mutable struct DataViewer3DWidget{A, C} <: Gtk4.GtkGrid + handle::Ptr{Gtk4.GObject} + lscene::LScene + scene::Scene + axis::A + cam::C + gm::Gtk4Makie.GtkGLMakie + # Controls + controlGrid::GtkGrid + modeCb::GtkComboBoxText + modeOpt::GtkMenuButton + frameAdj::GtkAdjustment + channelAdj::GtkAdjustment + cmapCb::GtkComboBoxText + cmin::GtkScaleButton + cmax::GtkScaleButton + # Data + data::AbstractArray + # Mode + modes::Vector{<:Abstract3DViewerMode} +end + +function DataViewer3DWidget(; modes = [VolumeMode, SectionalMode, IsoSurfaceMode]) + grid = GtkGrid() + handle = grid.handle + + # Setup the controls + controls = GtkGrid() + controls.column_spacing = 5 + controls.row_spacing = 5 + + # Mode selection + # We have to initialize the modeBox and the options later + # Once the viewer exits we can initialize the modes with the viewer as parent + # And then fill out our options + modeBox = GtkComboBoxText() + controls[1, 1] = GtkLabel("Mode") + controls[1, 2] = modeBox + modeOptions = GtkMenuButton() + controls[2, 1] = GtkLabel("Options") + controls[2, 2] = modeOptions + controls[3, 1:2] = GtkSeparator(:v) + + # Frame/Time Selection + frameAdj = GtkAdjustment(1, 1, 1, 1, 1, 1) + frameSlider = GtkSpinButton(frameAdj, 1, 0) + controls[4, 1] = GtkLabel("Frames") + controls[4, 2] = frameSlider + channelAdj = GtkAdjustment(1, 1, 1, 1, 1, 1) + channelSlider = GtkSpinButton(channelAdj, 1, 0) + controls[5, 1] = GtkLabel("Channels") + controls[5, 2] = channelSlider + controls[6, 1:2] = GtkSeparator(:v) + + # Colormap Selection + colormapBox = GtkComboBoxText() + cmaps = important_cmaps() + foreach(cm -> push!(colormapBox, cm), cmaps) + controls[7, 1] = GtkLabel("Colormap") + controls[7, 2] = colormapBox + colormapBox.active = 5 # viridis + cmin = GtkScaleButton(0, 99, 1, ["audio-volume-low"]) + cmax = GtkScaleButton(1, 100, 1, ["audio-volume-high"]) + cmin.value = 0 + cmax.value = 100 + controls[8, 1] = GtkLabel("Min") + controls[8, 2] = cmin + controls[9, 1] = GtkLabel("Max") + controls[9, 2] = cmax + + grid[1, 1] = controls + + # Setup the 3D viewing widget + fig = Figure() + lscene = LScene(fig[1,1]) + scene = lscene.scene + cam = scene.camera_controls + axis = first(scene.plots) # Initial plot is an axis for LScene + gm = GtkMakieWidget() + push!(gm, fig) + + grid[1, 2] = gm + + viewer = DataViewer3DWidget(handle, lscene, scene, axis, cam, gm, controls, modeBox, modeOptions, frameAdj, channelAdj, colormapBox, cmin, cmax, [], Abstract3DViewerMode[]) + + # Initialize the modes + modes = map(mode -> mode(viewer), modes) + for mode in modes + push!(modeBox, modeName(mode)) + end + modeBox.active = 0 + modeOptions.popover = popover(first(modes)) + viewer.modes = modes + + initCallbacks(viewer) + + return viewer +end + +function initCallbacks(m::DataViewer3DWidget) + signal_connect(m.modeCb, "changed") do widget + foreach(mode -> mode.active = false, m.modes) + mode = m.modes[m.modeCb.active + 1] + mode.active = true + m.modeOpt.popover = popover(mode) + showData!(WidgetRedraw(), m) + end + + signal_connect(m.frameAdj, "value_changed") do widget + showData!(m) + end + signal_connect(m.channelAdj, "value_changed") do widget + showData!(m) + end + + signal_connect(m.cmapCb, "changed") do widget + showData!(m) + end + + signal_connect(m.cmin, "value_changed") do widget, val + showData!(m) + end + signal_connect(m.cmax, "value_changed") do widget, val + showData!(m) + end +end + + +function updateData!(m::DataViewer3DWidget, file::Union{MDFFile, String}) + imMeta = loadRecoData(file) + updateData!(m, imMeta) +end + +# TODO handle 3 and 4 dim ImageMeta +function updateData!(m::DataViewer3DWidget, imMeta::ImageMeta{T, 5}) where T + m.data = imMeta + m.frameAdj.upper = size(m.data, 5) + m.channelAdj.upper = size(m.data, 1) + map(mode -> updateData!(mode, m.data), m.modes) + showData!(WidgetRedraw(), m) +end + +function updateData!(m::DataViewer3DWidget, array::AbstractArray{T, 5}) where T + m.data = array + m.frameAdj.upper = size(m.data, 5) + m.channelAdj.upper = size(m.data, 1) + m.cmin = 0 + m.cmax = 100 + map(mode -> updateData!(mode, m.data), m.modes) + showData!(WidgetRedraw(), m) +end + +function prepareData(m::DataViewer3DWidget) + frame = round(Int64, m.frameAdj.value) + channel = round(Int64, m.channelAdj.value) + data = ustrip.(m.data[channel, :, :, :, frame]) + return data +end + +function prepareDrawKwargs(m::DataViewer3DWidget) + dict = Dict{Symbol, Any}() + max = maximum(m.data) + cmin = (m.cmin.value/100) * max + cmax = (m.cmax.value/100) * max + dict[:cparams] = ColoringParams(cmin, cmax, Gtk4.active_text(m.cmapCb)) + return dict +end + +showData!(m::DataViewer3DWidget) = showData!(redrawType(m.modes[m.modeCb.active + 1]), m) + +function showData!(::WidgetRedraw, m::DataViewer3DWidget) + # Prepare new GtkMakieWidget + delete!(m, m[1, 2]) + m.gm = GtkMakieWidget() + m[1, 2] = m.gm + + mode = m.modes[m.modeCb.active + 1] + data = prepareData(m) + kwargs = prepareDrawKwargs(m) + lscene = showData!(m.gm, mode, data; kwargs...) + + m.lscene = lscene + m.scene = lscene.scene + m.axis = first(m.scene.plots) + + # Set the camera to the old position + eyeposition = m.cam.eyeposition[] + upvector = m.cam.upvector[] + lookat = m.cam.lookat[] + m.cam = m.scene.camera_controls + update_cam!(m.scene, eyeposition, lookat, upvector) + return nothing +end + +function showData!(re::ObservableRedraw, m::DataViewer3DWidget) + # TODO move these into a function + mode = m.modes[m.modeCb.active + 1] + data = prepareData(m) + kwargs = prepareDrawKwargs(m) + showData!(re, m.lscene, mode, data; kwargs...) + return nothing +end diff --git a/MPIViewers/src/3DViewer/IsoSurfaceMode.jl b/MPIViewers/src/3DViewer/IsoSurfaceMode.jl new file mode 100644 index 0000000..aa74488 --- /dev/null +++ b/MPIViewers/src/3DViewer/IsoSurfaceMode.jl @@ -0,0 +1,77 @@ +export IsoSurfaceMode + + +mutable struct IsoSurfaceMode{P} <: Abstract3DViewerMode + pop::GtkPopover + parent::P + active::Bool + isoAdj::GtkAdjustment + isoMin::GtkLabel + isoMax::GtkLabel + isorange::GtkEntry +end +function IsoSurfaceMode(parent::P) where P + pop = GtkPopover() + grid = GtkGrid() + grid[1, 1] = GtkLabel("Iso Value:") + minLabel = GtkLabel("0.0") + maxLabel = GtkLabel("1.0") + adj = GtkAdjustment(0.5, 0.0, 1.0, 0.05, 0.05, 0.05) + scale = GtkScale(:h, adj) + scale.hexpand = true + grid[2, 1] = minLabel + grid[3, 1] = scale + grid[4, 1] = maxLabel + + grid[1, 2] = GtkLabel("Iso Range:") + range = GtkEntry() + range.text = "0.05" + grid[2:4, 2] = range + + + pop.child = grid + + mode = IsoSurfaceMode(pop, parent, false, adj, minLabel, maxLabel, range) + + initCallbacks!(mode) + + return mode +end + +function initCallbacks!(mode::IsoSurfaceMode) + signal_connect(mode.isoAdj, "value_changed") do widget + if mode.active + showData!(WidgetRedraw(), mode.parent) + end + end + signal_connect(mode.isorange, "changed") do widget + if mode.active + showData!(WidgetRedraw(), mode.parent) + end + end +end + +modeName(m::IsoSurfaceMode) = "Iso Surface" +popover(m::IsoSurfaceMode) = m.pop +redrawType(::IsoSurfaceMode) = WidgetRedraw() + + +function updateData!(m::IsoSurfaceMode, data) + min, max = extrema(data) + m.isoAdj.upper = max + m.isoAdj.lower = min + m.isoAdj.step_increment = (max - min) / 100 + m.isoMin.label = string(min) + m.isoMax.label = string(max) +end + +function showData!(re, scene::LScene, mode::IsoSurfaceMode, data; kwargs...) + showData!(re, scene.scene, mode, data; kwargs...) + return scene +end +function showData!(::WidgetRedraw, scene::Scene, mode::IsoSurfaceMode, data; kwargs...) + isovalue = mode.isoAdj.value + isoRange = parse(Float64, mode.isorange.text) + volume!(scene, data; algorithm=:iso, isovalue=isovalue, isorange=isoRange) + return scene +end diff --git a/MPIViewers/src/3DViewer/ObliqueSliceMode.jl b/MPIViewers/src/3DViewer/ObliqueSliceMode.jl new file mode 100644 index 0000000..e25c602 --- /dev/null +++ b/MPIViewers/src/3DViewer/ObliqueSliceMode.jl @@ -0,0 +1,74 @@ +export ObliqueSliceMode + +# Based on https://discourse.julialang.org/t/oblique-slices-in-makie/83879/12 + +mutable struct ObliqueSliceMode{P} <: Abstract3DViewerMode + pop::GtkPopover + parent::P + active::Bool + algBox::GtkComboBoxText + algorithms::Vector{Symbol} +end +function ObliqueSliceMode(parent::P) where P + algoStrings = ["Absorption", "Additive RGBA", "Absorption RGBA", "MIP"] + algoSymbols = [:absorption, :additive, :absorptionrgba, :mip] + box = GtkComboBoxText() + foreach(algo -> push!(box, algo), algoStrings) + box.active = 3 + + pop = GtkPopover() + grid = GtkGrid() + grid[1, 1] = GtkLabel("Algorithm") + grid[1, 2] = box + + pop.child = grid + + mode = ObliqueSliceMode(pop, parent, false, box, algoSymbols) + + initCallbacks!(mode) + + return mode +end + +function initCallbacks!(mode::ObliqueSliceMode) + signal_connect(mode.algBox, "changed") do widget + if mode.active + showData!(WidgetRedraw(), mode.parent) + end + end +end + +modeName(m::ObliqueSliceMode) = "Oblique Slice" +popover(m::ObliqueSliceMode) = m.pop + +function showData!(re, scene::LScene, mode::ObliqueSliceMode, data; kwargs...) + showData!(re, scene.scene, mode, data; kwargs...) + return scene +end +function showData!(::WidgetRedraw, scene::Scene, mode::ObliqueSliceMode, data; cparams = ColoringParams(extrema(data)..., "viridis"), kwargs...) + algo = mode.algorithms[mode.algBox.active + 1] + cmap = to_colormap(Symbol(cparams.cmap)) + cmap[1] = RGBA(0.0, 0.0, 0.0, 0.0) + volume!(scene, data; algorithm=algo, colormap=cmap, colorrange = (cparams.cmin, cparams.cmax)) + return scene +end +function showData!(::ObservableRedraw, scene::Scene, mode::ObliqueSliceMode, data; cparams = ColoringParams(extrema(data)..., "viridis"), kwargs...) + # TODO robust + plt = scene.plots[2] + cmap = to_colormap(Symbol(cparams.cmap)) + cmap[1] = RGBA(0.0, 0.0, 0.0, 0.0) + plt.colormap[] = cmap + plt.colorrange[] = (cparams.cmin, cparams.cmax) + plt[4][] = data + return scene +end + + +function distance_to_plane(P, point, normal) + return dot(P - point, normal) +end + +function isinplane(P, point, normal; rtol=1e-3) + d = distance_to_plane(P, point, normal) + return isapprox(1 + d, 1; rtol=rtol) # more precise when compare to 1 +end \ No newline at end of file diff --git a/MPIViewers/src/3DViewer/SectionalMode.jl b/MPIViewers/src/3DViewer/SectionalMode.jl new file mode 100644 index 0000000..764f0dc --- /dev/null +++ b/MPIViewers/src/3DViewer/SectionalMode.jl @@ -0,0 +1,121 @@ + +export SectionalMode + +mutable struct SectionalMode{P} <: Abstract3DViewerMode + pop::GtkPopover + parent::P + active::Bool + yzAdj::GtkAdjustment + xzAdj::GtkAdjustment + xyAdj::GtkAdjustment + yzToggler::GtkCheckButton + xzToggler::GtkCheckButton + xyToggler::GtkCheckButton +end + +function SectionalMode(parent::P) where P + pop = GtkPopover() + yzAdj = GtkAdjustment(1, 1, 1, 1, 1, 1) + xzAdj = GtkAdjustment(1, 1, 1, 1, 1, 1) + xyAdj = GtkAdjustment(1, 1, 1, 1, 1, 1) + yzToggler = GtkCheckButton("Visible") + xzToggler = GtkCheckButton("Visible") + xyToggler = GtkCheckButton("Visible") + + grid = GtkGrid() + grid[1, 1] = GtkLabel("xy") + grid[1, 2] = GtkSpinButton(xyAdj, 1, 0) + grid[1, 3] = xyToggler + + grid[2, 1] = GtkLabel("xz") + grid[2, 2] = GtkSpinButton(xzAdj, 1, 0) + grid[2, 3] = xzToggler + + grid[3, 1] = GtkLabel("yz") + grid[3, 2] = GtkSpinButton(yzAdj, 1, 0) + grid[3, 3] = yzToggler + + pop.child = grid + mode = SectionalMode(pop, parent, false, yzAdj, xzAdj, xyAdj, yzToggler, xzToggler, xyToggler) + + initCallbacks!(mode) + + return mode +end + +modeName(m::SectionalMode) = "Volume Slices" +popover(m::SectionalMode) = m.pop + +function initCallbacks!(mode::SectionalMode) + signal_connect(mode.yzAdj, "value_changed") do widget + if mode.active + showData!(ObservableRedraw(), mode.parent) + end + end + signal_connect(mode.xzAdj, "value_changed") do widget + if mode.active + showData!(ObservableRedraw(), mode.parent) + end + end + signal_connect(mode.xyAdj, "value_changed") do widget + if mode.active + showData!(ObservableRedraw(), mode.parent) + end + end + + signal_connect(mode.yzToggler, "toggled") do widget + if mode.active + showData!(ObservableRedraw(), mode.parent) + end + end + signal_connect(mode.xzToggler, "toggled") do widget + if mode.active + showData!(ObservableRedraw(), mode.parent) + end + end + signal_connect(mode.xyToggler, "toggled") do widget + if mode.active + showData!(ObservableRedraw(), mode.parent) + end + end +end + +function updateData!(m::SectionalMode, data5D::AbstractArray{T, 5}) where T + m.yzAdj.upper = size(data5D, 2) + m.xzAdj.upper = size(data5D, 3) + m.xyAdj.upper = size(data5D, 4) + m.yzToggler.active = true + m.xzToggler.active = true + m.xyToggler.active = true +end + +function showData!(re, scene::LScene, mode::SectionalMode, data; kwargs...) + showData!(re, scene.scene, mode, data; kwargs...) + return scene +end +function showData!(::WidgetRedraw, scene::Scene, mode::SectionalMode, data; cparams = ColoringParams(extrema(data)..., "viridis"), kwargs...) + cmap = to_colormap(Symbol(cparams.cmap)) + plt = volumeslices!(scene, map(i -> 1:i, size(data))..., data; bbox_visible = false, colormap=cmap, colorrange = (cparams.cmin, cparams.cmax)) + plt.heatmap_xy[].visible = Observable{Any}(true) + plt.heatmap_xz[].visible = Observable{Any}(true) + plt.heatmap_yz[].visible = Observable{Any}(true) + return scene +end +function showData!(::ObservableRedraw, scene::Scene, mode::SectionalMode, data; cparams = ColoringParams(extrema(data)..., "viridis"), kwargs...) + # TODO robust plot selection + cmap = to_colormap(Symbol(cparams.cmap)) + plt = scene.plots[2] + plt[1] = 1:size(data, 1) + plt[2] = 1:size(data, 2) + plt[3] = 1:size(data, 3) + plt[4] = data + plt.update_xz[](Int64(mode.xzAdj.value)) + plt.update_xy[](Int64(mode.xyAdj.value)) + plt.update_yz[](Int64(mode.yzAdj.value)) + plt.heatmap_xy[].visible[] = mode.xyToggler.active + plt.heatmap_xz[].visible[] = mode.xzToggler.active + plt.heatmap_yz[].visible[] = mode.yzToggler.active + plt.colormap[] = cmap + plt.colorrange[] = (cparams.cmin, cparams.cmax) + return scene +end \ No newline at end of file diff --git a/MPIViewers/src/3DViewer/VolumeMode.jl b/MPIViewers/src/3DViewer/VolumeMode.jl new file mode 100644 index 0000000..ae869fb --- /dev/null +++ b/MPIViewers/src/3DViewer/VolumeMode.jl @@ -0,0 +1,63 @@ +export VolumeMode + + +mutable struct VolumeMode{P} <: Abstract3DViewerMode + pop::GtkPopover + parent::P + active::Bool + algBox::GtkComboBoxText + algorithms::Vector{Symbol} +end +function VolumeMode(parent::P) where P + algoStrings = ["Absorption", "Additive RGBA", "Absorption RGBA", "MIP"] + algoSymbols = [:absorption, :additive, :absorptionrgba, :mip] + box = GtkComboBoxText() + foreach(algo -> push!(box, algo), algoStrings) + box.active = 3 + + pop = GtkPopover() + grid = GtkGrid() + grid[1, 1] = GtkLabel("Algorithm") + grid[1, 2] = box + + pop.child = grid + + mode = VolumeMode(pop, parent, false, box, algoSymbols) + + initCallbacks!(mode) + + return mode +end + +function initCallbacks!(mode::VolumeMode) + signal_connect(mode.algBox, "changed") do widget + if mode.active + showData!(WidgetRedraw(), mode.parent) + end + end +end + +modeName(m::VolumeMode) = "Volume" +popover(m::VolumeMode) = m.pop + +function showData!(re, scene::LScene, mode::VolumeMode, data; kwargs...) + showData!(re, scene.scene, mode, data; kwargs...) + return scene +end +function showData!(::WidgetRedraw, scene::Scene, mode::VolumeMode, data; cparams = ColoringParams(extrema(data)..., "viridis"), kwargs...) + algo = mode.algorithms[mode.algBox.active + 1] + cmap = to_colormap(Symbol(cparams.cmap)) + cmap[1] = RGBA(0.0, 0.0, 0.0, 0.0) + volume!(scene, data; algorithm=algo, colormap=cmap, colorrange = (cparams.cmin, cparams.cmax)) + return scene +end +function showData!(::ObservableRedraw, scene::Scene, mode::VolumeMode, data; cparams = ColoringParams(extrema(data)..., "viridis"), kwargs...) + # TODO robust + plt = scene.plots[2] + cmap = to_colormap(Symbol(cparams.cmap)) + cmap[1] = RGBA(0.0, 0.0, 0.0, 0.0) + plt.colormap[] = cmap + plt.colorrange[] = (cparams.cmin, cparams.cmax) + plt[4][] = data + return scene +end diff --git a/src/Viewer/BaseViewer.jl b/MPIViewers/src/BaseViewer.jl similarity index 93% rename from src/Viewer/BaseViewer.jl rename to MPIViewers/src/BaseViewer.jl index 1cd4f47..dd1adef 100644 --- a/src/Viewer/BaseViewer.jl +++ b/MPIViewers/src/BaseViewer.jl @@ -1,5 +1,3 @@ -using Gtk4, Cairo - export baseViewer, baseViewerStandAlone, updateView, drawMIP mutable struct BaseViewerWidget @@ -23,7 +21,7 @@ end getindex(m::BaseViewerWidget, w::AbstractString) = Gtk4.G_.get_object(m.builder, w) function baseViewer() - uifile = joinpath(@__DIR__,"..","builder","baseViewer.ui") + uifile = joinpath(@__DIR__,"builder","baseViewer.ui") b = GtkBuilder(uifile) m = BaseViewerWidget(b, nothing,nothing,nothing) w = m["parentGrid"] diff --git a/src/Viewer/DataViewer/DataViewer.jl b/MPIViewers/src/DataViewer/DataViewer.jl similarity index 99% rename from src/Viewer/DataViewer/DataViewer.jl rename to MPIViewers/src/DataViewer/DataViewer.jl index 6b023b2..23facdb 100644 --- a/src/Viewer/DataViewer/DataViewer.jl +++ b/MPIViewers/src/DataViewer/DataViewer.jl @@ -64,7 +64,7 @@ include("Drawing.jl") function DataViewerWidget() - uifile = joinpath(@__DIR__,"..","..","builder","dataviewer.ui") + uifile = joinpath(@__DIR__,"..","builder","dataviewer.ui") b = GtkBuilder(uifile) mainBox = Gtk4.G_.get_object(b, "boxDataViewer") @@ -321,7 +321,7 @@ end function updateData!(m::DataViewerWidget, data::ImageMeta{T,5}, dataBG=nothing; params=nothing, ampPhase=false) where T #try m.updating = true - numChan = size(data,Axis{:color}) + numChan = size(data,ImageUtils.Axis{:color}) visible(m["mbFusion"], dataBG != nothing) visible(m["lbFusion"], dataBG != nothing) @@ -478,7 +478,7 @@ function showData(m::DataViewerWidget) dat = vec(data_) fig, ax, l_ = CairoMakie.lines(1:length(dat), dat, - figure = (; resolution = (1000, 800), fontsize = 12), + figure = (; size = (1000, 800), fontsize = 12), color = CairoMakie.RGBf(colors[1]...)) CairoMakie.autolimits!(ax) diff --git a/src/Viewer/DataViewer/Drawing.jl b/MPIViewers/src/DataViewer/Drawing.jl similarity index 98% rename from src/Viewer/DataViewer/Drawing.jl rename to MPIViewers/src/DataViewer/Drawing.jl index dbcba3a..9d70ff0 100644 --- a/src/Viewer/DataViewer/Drawing.jl +++ b/MPIViewers/src/DataViewer/Drawing.jl @@ -192,8 +192,8 @@ function drawImageCairo(c, image, isDrawSectionalLines, isDrawAxes, xsec, ysec, @guarded Gtk4.draw(c) do widget #c = reshape(c,size(c,1), size(c,2)) ctx = getgc(c) - h = height(ctx) - w = width(ctx) + h = Gtk4.height(ctx) + w = Gtk4.width(ctx) im = copy(reverse(arraydata(convert(ImageMeta{RGB{N0f8}},image)),dims=1)) xsec_ = !flipX ? xsec : (size(im,2)-xsec+1) @@ -232,8 +232,8 @@ function drawImageCairo(c, image, isDrawSectionalLines, isDrawAxes, xsec, ysec, w = widget(controller) ctx = getgc(w) reveal(w) - h = height(ctx) - w = width(ctx) + h = Gtk4.height(ctx) + w = Gtk4.width(ctx) xx = x / w*size(image,2) + 0.5 yy = y / h*size(image,1) + 0.5 xx = !flipX ? xx : (size(image,2)-xx+1) @@ -246,8 +246,8 @@ end ## Draw coordinate system function drawAxes(ctx,slide; rgb=[1,1,1]) - h = height(ctx) - w = width(ctx) + h = Gtk4.height(ctx) + w = Gtk4.width(ctx) center = h/40 if slide == "xy" @@ -324,7 +324,7 @@ end function showProfile(m::DataViewerWidget, data, xLabel::String, yLabel::String) f, ax, l = CairoMakie.lines(1:length(data), data, - figure = (; resolution = (1000, 800), figure_padding=4, fontsize = 12), + figure = (; size = (1000, 800), figure_padding=4, fontsize = 12), axis = (; title = "Profile"), color = CairoMakie.RGBf(colors[1]...)) diff --git a/src/Viewer/DataViewer/Export.jl b/MPIViewers/src/DataViewer/Export.jl similarity index 100% rename from src/Viewer/DataViewer/Export.jl rename to MPIViewers/src/DataViewer/Export.jl diff --git a/src/GtkUtils.jl b/MPIViewers/src/GtkUtils.jl similarity index 89% rename from src/GtkUtils.jl rename to MPIViewers/src/GtkUtils.jl index ad48c1c..38d5643 100644 --- a/src/GtkUtils.jl +++ b/MPIViewers/src/GtkUtils.jl @@ -1,18 +1,13 @@ -using Cairo, Colors - -using Graphics - - function Base.copy!(ctx::CairoContext, img::AbstractArray{C}) where C<:Union{Colorant,Number} Cairo.save(ctx) Cairo.reset_transform(ctx) - image(ctx, image_surface(img), 0, 0, width(ctx), height(ctx)) - restore(ctx) + Cairo.image(ctx, image_surface(img), 0, 0, Gtk4.width(ctx), Gtk4.height(ctx)) + Cairo.restore(ctx) end Base.copy!(c::GtkCanvas, img) = copy!(getgc(c), img) function Base.fill!(c::GtkCanvas, color::Colorant) ctx = getgc(c) - w, h = width(c), height(c) + w, h = Gtk4.width(c), Gtk4.height(c) rectangle(ctx, 0, 0, w, h) set_source(ctx, color) fill(ctx) @@ -32,7 +27,7 @@ function drawonto(canvas, figure) @guarded draw(canvas) do _ scene = figure.scene CairoMakie.resize!(scene, Gtk4.width(canvas), Gtk4.height(canvas)) - config = CairoMakie.ScreenConfig(1.0, 1.0, :good, true, false) + config = CairoMakie.ScreenConfig(1.0, 1.0, :good, true, false, nothing) screen = CairoMakie.Screen(scene, config, Gtk4.cairo_surface(canvas)) CairoMakie.cairo_draw(screen, scene) end diff --git a/MPIViewers/src/MPIViewers.jl b/MPIViewers/src/MPIViewers.jl new file mode 100644 index 0000000..e147425 --- /dev/null +++ b/MPIViewers/src/MPIViewers.jl @@ -0,0 +1,98 @@ +module MPIViewers + +using Reexport + +# Data Handling +@reexport using MPIFiles +@reexport using MPIReco +@reexport using MPISphericalHarmonics +using SphericalHarmonicExpansions +using Unitful +using MPISphericalHarmonics.NLsolve +using FFTW +using Statistics + +# File Handling +#using DelimtedFiles +using DataFrames +using CSV + +# Visualization +using CairoMakie +using Colors +using Gtk4 +using Gtk4Makie +using Gtk4.G_, Gtk4.GLib +using Cairo +using Images +using ImageUtils +using ImageUtils: converttometer, ColoringParams, makeAxisArray, Axis + + +import Base: getindex +import MPIFiles: addReco, getVisu, addVisu + +function object_(builder::GtkBuilder,name::AbstractString, T::Type)::T + return convert(T,ccall((:gtk_builder_get_object,Gtk4.libgtk),Ptr{Gtk4.GObject},(Ptr{Gtk4.GObject},Ptr{UInt8}),builder,name)) +end + +function imToVecIm(image::ImageMeta) + out = ImageMeta[] + for i=1:size(image,1) + I = getindex(image, i, ntuple(x->:,ndims(image)-1)...) + push!(out, I) + end + return out +end + +macro guard(ex) + return :(try; begin $(ex) end; catch e; showError(e); end) +end + +macro idle_add_guarded(ex) + quote + g_idle_add() do + try + $(esc(ex)) + catch err + @warn("Error in @guarded callback", exception=(err, catch_backtrace())) + end + return false + end + end +end + +const colors = [(0/255,73/255,146/255), # UKE blau +(239/255,123/255,5/255), # Orange (dunkel) +(138/255,189/255,36/255), # GrĂ¼n +(178/255,34/255,41/255), # Rot +(170/255,156/255,143/255), # Mocca +(87/255,87/255,86/255), # Schwarz (Schrift) +(255/255,223/255,0/255), # Gelb +(104/255,195/255,205/255), # "TUHH" +(45/255,198/255,214/255), # TUHH +(193/255,216/255,237/255)] + +function showError(ex) + exTrunc = first(string(ex), 500) + if length(string(ex)) > 500 + exTrunc *="..." + end + str = string("Something went wrong!\n", exTrunc) + d = info_dialog(()-> nothing, str) + d.modal = true +end + +export updateData, updateData!, showData, showData! + +include("GtkUtils.jl") +include("BaseViewer.jl") +include("SimpleDataViewer.jl") +include("DataViewer/DataViewer.jl") +include("RawDataViewer.jl") +include("SpectrogramViewer.jl") +include("SFViewerWidget.jl") +include("MagneticFieldViewer/MagneticFieldViewer.jl") +include("3DViewer/3DViewer.jl") + +end # module MPIViewers \ No newline at end of file diff --git a/src/Viewer/MagneticFieldViewer/Export.jl b/MPIViewers/src/MagneticFieldViewer/Export.jl similarity index 100% rename from src/Viewer/MagneticFieldViewer/Export.jl rename to MPIViewers/src/MagneticFieldViewer/Export.jl diff --git a/src/Viewer/MagneticFieldViewer/MagneticFieldViewer.jl b/MPIViewers/src/MagneticFieldViewer/MagneticFieldViewer.jl similarity index 99% rename from src/Viewer/MagneticFieldViewer/MagneticFieldViewer.jl rename to MPIViewers/src/MagneticFieldViewer/MagneticFieldViewer.jl index 8d3ba49..9847df0 100644 --- a/src/Viewer/MagneticFieldViewer/MagneticFieldViewer.jl +++ b/MPIViewers/src/MagneticFieldViewer/MagneticFieldViewer.jl @@ -1,4 +1,4 @@ -export MagneticFieldViewer +export MagneticFieldViewer, MagneticFieldViewerWidget, FieldViewerWidget mutable struct FieldViewerWidget <: Gtk4.GtkBox handle::Ptr{Gtk4.GObject} @@ -53,7 +53,7 @@ function MagneticFieldViewer(filename::Union{AbstractString,MagneticFieldCoeffic end function FieldViewerWidget() - uifile = joinpath(@__DIR__,"..","..","builder","magneticFieldViewer.ui") + uifile = joinpath(@__DIR__,"..","builder","magneticFieldViewer.ui") b = GtkBuilder(uifile) mainBox = G_.get_object(b, "boxFieldViewer") diff --git a/src/Viewer/MagneticFieldViewer/Plotting.jl b/MPIViewers/src/MagneticFieldViewer/Plotting.jl similarity index 100% rename from src/Viewer/MagneticFieldViewer/Plotting.jl rename to MPIViewers/src/MagneticFieldViewer/Plotting.jl diff --git a/src/Viewer/MagneticFieldViewer/TikzExport.jl b/MPIViewers/src/MagneticFieldViewer/TikzExport.jl similarity index 100% rename from src/Viewer/MagneticFieldViewer/TikzExport.jl rename to MPIViewers/src/MagneticFieldViewer/TikzExport.jl diff --git a/src/Viewer/RawDataViewer.jl b/MPIViewers/src/RawDataViewer.jl similarity index 98% rename from src/Viewer/RawDataViewer.jl rename to MPIViewers/src/RawDataViewer.jl index 2383a47..b9adbe5 100644 --- a/src/Viewer/RawDataViewer.jl +++ b/MPIViewers/src/RawDataViewer.jl @@ -1,5 +1,4 @@ -import Base: getindex - +export RawDataWidget mutable struct RawDataWidget <: Gtk4.GtkBox handle::Ptr{Gtk4.GObject} builder::GtkBuilder @@ -21,7 +20,7 @@ getindex(m::RawDataWidget, w::AbstractString) = Gtk4.G_.get_object(m.builder, w) function RawDataWidget(filenameConfig=nothing) @info "Starting RawDataWidget" - uifile = joinpath(@__DIR__,"..","builder","rawDataViewer.ui") + uifile = joinpath(@__DIR__,"builder","rawDataViewer.ui") b = GtkBuilder(uifile) mainBox = Gtk4.G_.get_object(b, "boxRawViewer") @@ -401,7 +400,7 @@ end end fTD, axTD, lTD1 = CairoMakie.lines(timePoints[steps], dataCompressed[:,1], - figure = (; figure_padding=4, resolution = (1000, 800), fontsize = 11), + figure = (; figure_padding=4, size = (1000, 800), fontsize = 11), axis = (; title = "Time Domain"), color = CairoMakie.RGBf(colors[1]...), label = labels_[1]) @@ -450,7 +449,7 @@ end end fFD, axFD, lFD1 = CairoMakie.lines(freq[stepsFr],freqDataCompressed[:,1], - figure = (; figure_padding=4, resolution = (1000, 800), fontsize = 11), + figure = (; figure_padding=4, size = (1000, 800), fontsize = 11), axis = (; title = "Frequency Domain", yscale=log10), color = CairoMakie.RGBf(colors[1]...), label=labels_[1]) diff --git a/src/Viewer/SFViewerWidget.jl b/MPIViewers/src/SFViewerWidget.jl similarity index 98% rename from src/Viewer/SFViewerWidget.jl rename to MPIViewers/src/SFViewerWidget.jl index ae66736..cf87d90 100644 --- a/src/Viewer/SFViewerWidget.jl +++ b/MPIViewers/src/SFViewerWidget.jl @@ -1,8 +1,4 @@ -export SFViewer - -import Base: getindex - - +export SFViewerWidget, SFViewer mutable struct SFViewerWidget <: Gtk4.GtkPaned handle::Ptr{Gtk4.GObject} builder::GtkBuilder @@ -41,7 +37,7 @@ function SFViewer(filename::AbstractString) end function SFViewerWidget() - uifile = joinpath(@__DIR__,"..","builder","mpiLab.ui") + uifile = joinpath(@__DIR__,"..", "..", "src", "builder","mpiLab.ui") # very hack since ui file is in other package b = GtkBuilder(uifile) mainBox = GtkPaned(:h) @@ -256,7 +252,7 @@ function updateSF(m::SFViewerWidget) end fFD, axFD, lFD1 = CairoMakie.lines(m.frequencies[stepsFr], snrCompressed, - figure = (; resolution = (1000, 800), fontsize = 12), + figure = (; size = (1000, 800), fontsize = 12), axis = (; title = "SNR", yscale=log10), color = CairoMakie.RGBf(colors[1]...)) CairoMakie.scatter!(axFD, [m.frequencies[freq]], [m.SNR[freq,recChan,period]], diff --git a/src/Viewer/SimpleDataViewer.jl b/MPIViewers/src/SimpleDataViewer.jl similarity index 96% rename from src/Viewer/SimpleDataViewer.jl rename to MPIViewers/src/SimpleDataViewer.jl index 1c0da76..ffd7958 100644 --- a/src/Viewer/SimpleDataViewer.jl +++ b/MPIViewers/src/SimpleDataViewer.jl @@ -1,5 +1,3 @@ -using Gtk4, Cairo - export SimpleDataViewer, SimpleDataViewerWidget, simpleDrawImageCairo function SimpleDataViewer() @@ -24,7 +22,7 @@ getindex(m::SimpleDataViewerWidget, w::AbstractString) = Gtk4.G_.get_object(m.bu function SimpleDataViewerWidget() - uifile = joinpath(@__DIR__,"..","builder","simpleDataViewer.ui") + uifile = joinpath(@__DIR__,"builder","simpleDataViewer.ui") b = GtkBuilder(uifile) mainBox = Gtk4.G_.get_object(b, "boxSimpleDataViewer") m = SimpleDataViewerWidget( mainBox.handle, b, nothing, nothing) diff --git a/src/Viewer/SpectrogramViewer.jl b/MPIViewers/src/SpectrogramViewer.jl similarity index 98% rename from src/Viewer/SpectrogramViewer.jl rename to MPIViewers/src/SpectrogramViewer.jl index 53f7472..fc4c13a 100644 --- a/src/Viewer/SpectrogramViewer.jl +++ b/MPIViewers/src/SpectrogramViewer.jl @@ -1,6 +1,4 @@ -import Base: getindex - -export SpectrogramViewer +export SpectrogramViewer, SpectrogramWidget mutable struct SpectrogramWidget <: Gtk4.GtkBox handle::Ptr{Gtk4.GObject} @@ -37,7 +35,7 @@ end function SpectrogramWidget(filenameConfig=nothing) @info "Starting SpectrogramWidget" - uifile = joinpath(@__DIR__,"..","builder","spectrogramViewer.ui") + uifile = joinpath(@__DIR__,"builder","spectrogramViewer.ui") b = GtkBuilder(uifile) mainBox = Gtk4.G_.get_object(b, "boxSpectrogramViewer") @@ -538,7 +536,7 @@ end steps = minTP:sp_:maxTP fTD, axTD, lTD1 = CairoMakie.lines(timePoints[steps], data_[steps], - figure = (; figure_padding=4, resolution = (1000, 800), fontsize = 10), + figure = (; figure_padding=4, size = (1000, 800), fontsize = 10), axis = (; title = "Time Domain"), color = CairoMakie.RGBf(colors[1]...)) @@ -563,7 +561,7 @@ end stepsFr = minFr:spFr:maxFr fFD, axFD, lFD1 = CairoMakie.lines(freq[stepsFr],freqdata[stepsFr,patch], - figure = (; figure_padding=4, resolution = (1000, 800), fontsize = 10), + figure = (; figure_padding=4, size = (1000, 800), fontsize = 10), axis = (; title = "Frequency Domain", yscale=log10), color = CairoMakie.RGBf(colors[1]...)) diff --git a/src/builder/baseViewer.ui b/MPIViewers/src/builder/baseViewer.ui similarity index 100% rename from src/builder/baseViewer.ui rename to MPIViewers/src/builder/baseViewer.ui diff --git a/src/builder/dataviewer.ui b/MPIViewers/src/builder/dataviewer.ui similarity index 100% rename from src/builder/dataviewer.ui rename to MPIViewers/src/builder/dataviewer.ui diff --git a/src/builder/magneticFieldViewer.ui b/MPIViewers/src/builder/magneticFieldViewer.ui similarity index 100% rename from src/builder/magneticFieldViewer.ui rename to MPIViewers/src/builder/magneticFieldViewer.ui diff --git a/src/builder/rawDataViewer.ui b/MPIViewers/src/builder/rawDataViewer.ui similarity index 100% rename from src/builder/rawDataViewer.ui rename to MPIViewers/src/builder/rawDataViewer.ui diff --git a/src/builder/simpleDataViewer.ui b/MPIViewers/src/builder/simpleDataViewer.ui similarity index 100% rename from src/builder/simpleDataViewer.ui rename to MPIViewers/src/builder/simpleDataViewer.ui diff --git a/src/builder/spectrogramViewer.ui b/MPIViewers/src/builder/spectrogramViewer.ui similarity index 100% rename from src/builder/spectrogramViewer.ui rename to MPIViewers/src/builder/spectrogramViewer.ui diff --git a/MPIViewers/src/interface.jl b/MPIViewers/src/interface.jl new file mode 100644 index 0000000..e69de29 diff --git a/Project.toml b/Project.toml index a5ae1e8..d1179ac 100644 --- a/Project.toml +++ b/Project.toml @@ -15,6 +15,7 @@ FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" Graphics = "a2bd30eb-e257-5431-a919-1863eab51364" Gtk4 = "9db2cae5-386f-4011-9d63-a5602296539b" +Gtk4Makie = "478199e7-b407-4926-87ea-7196203a28d8" HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" ImageUtils = "8ad4436d-4835-5a14-8bce-3ae014d2950b" Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" @@ -26,6 +27,7 @@ MPIFiles = "371237a9-e6c1-5201-9adb-3d8cfa78fa9f" MPIMeasurements = "a874a27a-e9a7-503d-98b6-bf61df4bb725" MPIReco = "e4246700-6248-511e-8146-a1d1f47669d2" MPISphericalHarmonics = "2527f7a4-0af4-4016-a944-036fbac19de9" +MPIViewers = "8bda2715-69d8-46f6-8f4f-eacbc82b6e08" NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" @@ -47,14 +49,19 @@ HDF5 = "0.15, 0.16" ImageUtils = "0.2" Images = "0.23, 0.24, 0.25" LoggingExtras = ">= 0.4.2" -MPIFiles = "0.15" -MPIMeasurements = "0.5" -MPIReco = "0.5" +MPIFiles = "0.15, 0.16" +MPIMeasurements = "0.5, 0.6" +MPIViewers = "0.1" +MPIReco = "0.7" MPISphericalHarmonics = "0.0.10" Reexport = "0.2,1.0" -CairoMakie = "0.10.2" -julia = "1.7" -Gtk4 = "0.4.2" +CairoMakie = "0.12" +julia = "1.11" +Gtk4 = "0.7" +Gtk4Makie = "0.3" + +[sources] +MPIViewers = {path = "./MPIViewers"} [extras] HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" diff --git a/src/LCRMeter.jl b/src/LCRMeter.jl index f887784..edd41fe 100755 --- a/src/LCRMeter.jl +++ b/src/LCRMeter.jl @@ -211,7 +211,7 @@ function sweepAndShow(m::LCRMeterUI) @info m.datay f1, ax1, l1 = CairoMakie.lines(freq, x_list, - figure = (; resolution = (1000, 800), fontsize = 12), + figure = (; size = (1000, 800), fontsize = 12), axis = (; title = "What is this"), color = CairoMakie.RGBf(colors[1]...)) @@ -223,7 +223,7 @@ function sweepAndShow(m::LCRMeterUI) ax1.ylabel = ylabel1 f2, ax2, l2 = CairoMakie.lines(freq, y_list, - figure = (; resolution = (1000, 800), fontsize = 12), + figure = (; size = (1000, 800), fontsize = 12), axis = (; title = "What is this"), color = CairoMakie.RGBf(colors[1]...)) diff --git a/src/MPIUI.jl b/src/MPIUI.jl index 852623a..84c6950 100644 --- a/src/MPIUI.jl +++ b/src/MPIUI.jl @@ -21,14 +21,18 @@ using NLsolve # for MagneticFieldViewer: findFFP() using DataFrames, CSV # for MagneticFieldViewer: export as csv using Unitful import CairoMakie +using Gtk4Makie ENV["MPILIB_UI"] = "Nothing" @reexport using MPIMeasurements @reexport using MPIReco +@reexport using MPIViewers using MPIReco.RegularizedLeastSquares -using ImageUtils: makeAxisArray +import MPIViewers: updateData!, showData!, updateData, showData + +using ImageUtils: makeAxisArray, Axis using Gtk4, Gtk4.G_, Gtk4.GLib using Cairo @@ -117,8 +121,6 @@ const colors = [(0/255,73/255,146/255), # UKE blau include("LogMessagesWidget.jl") -include("GtkUtils.jl") -include("Viewer/Viewer.jl") include("Reconstruction/OfflineRecoWidget.jl") include("Protocol/ProtocolWidget.jl") include("SFBrowser.jl") diff --git a/src/OnlineReco/OnlineReco.jl b/src/OnlineReco/OnlineReco.jl index ff15d9a..e633ba3 100755 --- a/src/OnlineReco/OnlineReco.jl +++ b/src/OnlineReco/OnlineReco.jl @@ -158,7 +158,7 @@ function onlineReco(bSF::MPIFile, b::MPIFile; proj="MIP", ### f, ax, l = CairoMakie.lines(1:length(profile), profile, - figure = (; resolution = (1000, 800), fontsize = 12), + figure = (; size = (1000, 800), fontsize = 12), # axis = (; title = "What is this"), color = CairoMakie.RGBf(colors[1]...)) diff --git a/src/Viewer/Viewer.jl b/src/Viewer/Viewer.jl deleted file mode 100644 index 9dacb40..0000000 --- a/src/Viewer/Viewer.jl +++ /dev/null @@ -1,7 +0,0 @@ -include("BaseViewer.jl") -include("SimpleDataViewer.jl") -include("DataViewer/DataViewer.jl") -include("RawDataViewer.jl") -include("SpectrogramViewer.jl") -include("SFViewerWidget.jl") -include("MagneticFieldViewer/MagneticFieldViewer.jl")