Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ift
starblade
Commits
a2eabd51
Commit
a2eabd51
authored
Mar 27, 2018
by
Jakob Knollmueller
Browse files
avoid errors in gui
parent
108c2be1
Changes
2
Hide whitespace changes
Inline
Side-by-side
gui_app.py
View file @
a2eabd51
...
...
@@ -2,7 +2,7 @@ import matplotlib
matplotlib
.
use
(
'agg'
)
# matplotlib.use('module://kivy.garden.matplotlib.backend_kivy')
from
point_separation
import
build_problem
,
problem_iteration
,
load_data
from
point_separation
import
build_
multi_
problem
,
multi_
problem_iteration
,
load_data
from
kivy.app
import
App
from
kivy.uix.widget
import
Widget
...
...
@@ -12,7 +12,7 @@ from kivy.uix.image import Image
from
kivy.properties
import
ObjectProperty
,
StringProperty
,
NumericProperty
from
kivy.uix.boxlayout
import
BoxLayout
from
kivy.clock
import
Clock
,
mainthread
from
os.path
import
sep
,
expanduser
,
isdir
,
dirname
from
os.path
import
sep
,
expanduser
,
isdir
,
dirname
,
join
from
kivy.garden.filebrowser
import
FileBrowser
from
kivy.utils
import
platform
...
...
@@ -31,12 +31,22 @@ class FloatInput(TextInput):
pat
=
re
.
compile
(
'[^0-9]'
)
def
insert_text
(
self
,
substring
,
from_undo
=
False
):
print
substring
pat
=
self
.
pat
if
'.'
in
self
.
text
:
s
=
re
.
sub
(
pat
,
''
,
substring
)
else
:
s
=
'.'
.
join
([
re
.
sub
(
pat
,
''
,
s
)
for
s
in
substring
.
split
(
'.'
,
1
)])
return
super
(
FloatInput
,
self
).
insert_text
(
s
,
from_undo
=
from_undo
)
class
IntInput
(
TextInput
):
pat
=
re
.
compile
(
'[^0-9]'
)
def
insert_text
(
self
,
substring
,
from_undo
=
False
):
pat
=
self
.
pat
s
=
re
.
sub
(
pat
,
''
,
substring
)
return
super
(
IntInput
,
self
).
insert_text
(
s
,
from_undo
=
from_undo
)
class
MyImage
(
BoxLayout
):
...
...
@@ -49,6 +59,9 @@ class MyImage(BoxLayout):
class
MyAlphaWidget
(
BoxLayout
):
alpha
=
NumericProperty
(
None
)
pass
class
IterationWidget
(
BoxLayout
):
iteration
=
NumericProperty
(
None
)
pass
class
ResultsPathWidget
(
BoxLayout
):
pass
...
...
@@ -93,12 +106,13 @@ class GlobalScreenManager(ScreenManager):
class
MainScreen
(
Screen
):
pass
class
StartScreen
(
Screen
):
pass
class
FileScreen
(
Screen
):
pass
class
PathScreen
(
Screen
):
pass
def
is_dir
(
self
,
directory
,
filename
):
return
isdir
(
join
(
directory
,
filename
))
class
MyWidget
(
BoxLayout
):
image_widget
=
ObjectProperty
(
None
)
...
...
@@ -108,13 +122,12 @@ class MyWidget(BoxLayout):
result_path
=
StringProperty
(
None
)
alpha
=
NumericProperty
(
None
)
class
StartWidget
(
BoxLayout
):
pass
class
MyPathBrowser
(
FileBrowser
):
pass
class
MyFileBrowser
(
FileBrowser
):
filters
=
[
'*.fits'
,
'*.png'
,
'*.jpg'
]
pass
...
...
@@ -130,10 +143,12 @@ class SeparatorApp(App):
power_image
=
StringProperty
(
None
)
vmin
=
None
vmax
=
None
iterations
=
5
myEnergy
=
None
iterations
=
3
user_path
=
''
reconstructing
=
False
data_loaded
=
False
def
build
(
self
):
self
.
set_default
()
self
.
trigger
=
0
...
...
@@ -167,34 +182,41 @@ class SeparatorApp(App):
self
.
data
=
load_data
(
self
.
data_path
)
self
.
vmin
=
np
.
log
(
self
.
data
.
min
())
self
.
max
=
np
.
log
(
self
.
data
.
max
())
self
.
plot_
array
(
np
.
log
(
self
.
data
),
'data.png'
)
self
.
plot_
data
(
)
self
.
set_data_loaded
(
True
)
self
.
set_data_image
()
self
.
update_plots
()
def
run_separation
(
self
):
if
not
self
.
reconstructing
:
if
not
self
.
reconstructing
and
self
.
data_loaded
:
threading
.
Thread
(
target
=
self
.
run_separation_thread
).
start
()
def
run_separation_thread
(
self
):
self
.
set_reconstructing
(
True
)
self
.
myEnergy
=
build_problem
(
self
.
data
,
self
.
alpha
)
self
.
plot_array
(
self
.
myEnergy
.
u
.
val
,
'points.png'
)
self
.
plot_array
(
self
.
myEnergy
.
s
.
val
,
'diffuse.png'
)
self
.
myEnergy
=
build_multi_problem
(
self
.
data
,
self
.
alpha
)
self
.
plot_components
(
self
.
path
)
self
.
set_image_paths
()
self
.
update_plots
()
for
i
in
range
(
self
.
iterations
):
self
.
myEnergy
=
problem_iteration
(
self
.
myEnergy
)
self
.
plot_array
(
self
.
myEnergy
.
u
.
val
,
'points.png'
)
self
.
plot_array
(
self
.
myEnergy
.
s
.
val
,
'diffuse.png'
)
self
.
myEnergy
=
multi_problem_iteration
(
self
.
myEnergy
)
self
.
plot_components
(
self
.
path
)
self
.
update_plots
()
self
.
set_reconstructing
(
False
)
def
save_results
(
self
,
path
):
def
save_results
(
self
):
if
self
.
myEnergy
is
not
None
:
self
.
root
.
current
=
'path'
def
select_path
(
self
,
path
):
self
.
result_path
=
path
[
0
]
threading
.
Thread
(
target
=
self
.
save_data_thread
).
start
()
self
.
root
.
current
=
'main'
def
save_data_thread
(
self
):
np
.
savetxt
(
self
.
result_path
+
'/points.csv'
,
np
.
exp
(
self
.
myEnergy
.
u
.
val
))
np
.
savetxt
(
self
.
result_path
+
'/diffus.csv'
,
np
.
exp
(
self
.
myEnergy
.
s
.
val
))
self
.
plot_components
(
self
.
result_path
)
def
set_result_path
(
self
,
path
):
self
.
result_path
=
path
...
...
@@ -204,6 +226,9 @@ class SeparatorApp(App):
@
mainthread
def
set_reconstructing
(
self
,
reconstructing
):
self
.
reconstructing
=
reconstructing
@
mainthread
def
set_data_loaded
(
self
,
loaded
):
self
.
data_loaded
=
loaded
def
set_data_path
(
self
,
path
):
self
.
data_path
=
path
...
...
@@ -216,13 +241,36 @@ class SeparatorApp(App):
self
.
points_image
=
self
.
path
+
'points.png'
self
.
diffuse_image
=
self
.
path
+
'diffuse.png'
def
plot_array
(
self
,
array
,
path
):
plt
.
imsave
(
path
,
array
,
vmin
=
self
.
vmin
,
vmax
=
self
.
vmax
)
def
plot_data
(
self
):
if
self
.
data
.
shape
[
0
]
==
1
:
plt
.
imsave
(
self
.
path
+
'data.png'
,
self
.
data
[
0
],
vmin
=
self
.
vmin
,
vmax
=
self
.
vmax
)
else
:
plt
.
imsave
(
self
.
path
+
'data.png'
,
self
.
data
/
255.
)
def
plot_components
(
self
,
path
):
diffuse
=
np
.
empty_like
(
self
.
data
)
points
=
np
.
empty_like
(
self
.
data
)
for
i
in
range
(
len
(
self
.
myEnergy
)):
diffuse
[...,
i
]
=
np
.
exp
(
self
.
myEnergy
[
i
].
s
.
val
)
points
[...,
i
]
=
np
.
exp
(
self
.
myEnergy
[
i
].
u
.
val
)
if
len
(
self
.
myEnergy
)
==
1
:
plt
.
imsave
(
path
+
'diffuse.png'
,
diffuse
[...,
0
],
vmin
=
self
.
vmin
,
vmax
=
self
.
vmax
)
plt
.
imsave
(
path
+
'points.png'
,
points
[...,
0
],
vmin
=
self
.
vmin
,
vmax
=
self
.
vmax
)
else
:
plt
.
imsave
(
self
.
path
+
'diffuse.png'
,
diffuse
/
255.
)
plt
.
imsave
(
self
.
path
+
'points.png'
,
points
/
255.
)
def
set_alpha
(
self
,
alpha
):
self
.
alpha
=
alpha
print
alpha
if
alpha
==
''
:
pass
else
:
self
.
alpha
=
alpha
def
set_iterations
(
self
,
iterations
):
if
iterations
==
''
:
pass
else
:
self
.
iterations
=
int
(
iterations
)
def
on_stop
(
self
):
self
.
stop
.
set
()
...
...
separator.kv
View file @
a2eabd51
...
...
@@ -27,10 +27,19 @@ TextInput:
text: unichr(945)
FloatInput
text: '1.5'
on_text: app.set_alpha(float(self.text))
on_text: app.set_alpha(self.text)
<IterationWidget>:
orientation: 'horizontal'
Label:
text: 'iterations'
IntInput
text: '3'
on_text: app.set_iterations(self.text)
<FloatInput>:
multiline: False
<IntInput>:
multiline: False
<MyImage>:
text: self.text
...
...
@@ -134,6 +143,8 @@ TextInput:
orientation: 'vertical'
MyAlphaWidget:
size_hint: 1,0.1
IterationWidget:
size_hint: 1,0.1
ActionWidget
...
...
@@ -148,7 +159,7 @@ TextInput:
on_press: app.run_separation()
Button:
text: 'save results'
on_press: app.
root.current = 'path'
on_press: app.
save_results()
<DisplayChoiceWidget>:
orientation: 'horizontal'
...
...
@@ -176,10 +187,6 @@ TextInput:
DisplayWidget:
id: image_widget
<StartWidget>:
Button:
text: 'load data'
on_press: app.root.current = 'file'
<MyPathBrowser>:
id: _filebrowser
...
...
@@ -188,37 +195,37 @@ TextInput:
<MyFileBrowser>:
<GlobalScreenManager>:
start: start
file: file
main: main
path: path
StartScreen:
id: start
name: 'start'
FileScreen:
id:file
name: 'file'
MainScreen:
id: main
name: 'main'
FileScreen:
id:file
name: 'file'
PathScreen:
id: path
name: 'path'
<StartScreen>:
StartWidget
<FileScreen>:
MyFileBrowser:
on_success: app.load_data(self.selection)
on_canceled: app.root.current = 'main'
<MainScreen>:
image_widget: image_widget
MyWidget:
id:image_widget
<PathScreen>:
MyPathBrowser
on_success: app.save_results(self.selection)
filters: [root.is_dir]
on_success: app.select_path(self.selection)
on_canceled: app.root.current = 'main'
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment