Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Scientific Software
MDANSE
Commits
b2652f2d
Commit
b2652f2d
authored
Apr 06, 2020
by
Remi Perenon
Browse files
Merge branch 'bugfix-plotter_issues' into 'develop'
Bugfix plotter issues See merge request
!61
parents
9e17e9d0
56083001
Pipeline
#7165
passed with stages
in 21 minutes and 48 seconds
Changes
3
Pipelines
1
Show whitespace changes
Inline
Side-by-side
CHANGELOG
View file @
b2652f2d
version 1.4.0
version 1.4.0
--------------
--------------
* FIXED issue #56 Layout on Windows differed from macOS and Linux (we keep Windows Layout: "Data" on top, "Plugins" below)
* FIXED issue #56 Layout on Windows differed from macOS and Linux (we keep Windows Layout: "Data" on top, "Plugins" below)
* FIXED issue #55 Plotter (1D, 2D, Plotter, NetCDF Plotter) had several issues (see https://code.ill.fr/scientific-software/mdanse/issues/55)
* FIXED issue #54 Some Gromacs trajectories cannot be opened (due to the presence of "M" dummy atoms)
* FIXED issue #54 Some Gromacs trajectories cannot be opened (due to the presence of "M" dummy atoms)
* FIXED issue #53 VASP NPT trajectories could not be opened
* FIXED issue #53 VASP NPT trajectories could not be opened
* FIXED issue #52 QVector circular lattice generator created an error
* FIXED issue #52 QVector circular lattice generator created an error
...
...
Src/GUI/Plugins/Plotter1D.py
View file @
b2652f2d
...
@@ -403,11 +403,11 @@ class Plotter1D(wx.Panel):
...
@@ -403,11 +403,11 @@ class Plotter1D(wx.Panel):
elif
scaleStr
==
'symlog'
:
elif
scaleStr
==
'symlog'
:
self
.
figure
.
gca
().
set_yscale
(
'symlog'
)
self
.
figure
.
gca
().
set_yscale
(
'symlog'
)
elif
scaleStr
==
'ln'
:
elif
scaleStr
==
'ln'
:
self
.
figure
.
gca
().
set_yscale
(
'log'
,
base
x
=
numpy
.
exp
(
1
))
self
.
figure
.
gca
().
set_yscale
(
'log'
,
base
y
=
numpy
.
exp
(
1
))
elif
scaleStr
==
'log 10'
:
elif
scaleStr
==
'log 10'
:
self
.
figure
.
gca
().
set_yscale
(
'log'
,
base
x
=
10
)
self
.
figure
.
gca
().
set_yscale
(
'log'
,
base
y
=
10
)
elif
scaleStr
==
'log 2'
:
elif
scaleStr
==
'log 2'
:
self
.
figure
.
gca
().
set_yscale
(
'log'
,
base
x
=
2
)
self
.
figure
.
gca
().
set_yscale
(
'log'
,
base
y
=
2
)
self
.
on_auto_fit
()
self
.
on_auto_fit
()
self
.
figure
.
canvas
.
draw
()
self
.
figure
.
canvas
.
draw
()
...
...
Src/GUI/Plugins/PlotterSettings.py
View file @
b2652f2d
...
@@ -23,6 +23,7 @@ class UnitsSettingsError(Error):
...
@@ -23,6 +23,7 @@ class UnitsSettingsError(Error):
class
UnitsSettingsDialog
():
class
UnitsSettingsDialog
():
def
checkUnits
(
self
,
oldUnit
,
newUnit
):
def
checkUnits
(
self
,
oldUnit
,
newUnit
):
if
oldUnit
!=
newUnit
:
try
:
try
:
magnitude
.
mg
(
1.
,
oldUnit
,
newUnit
).
toval
()
magnitude
.
mg
(
1.
,
oldUnit
,
newUnit
).
toval
()
except
magnitude
.
MagnitudeError
:
except
magnitude
.
MagnitudeError
:
...
@@ -34,7 +35,6 @@ class ImageSettingsDialog(wx.Dialog, UnitsSettingsDialog):
...
@@ -34,7 +35,6 @@ class ImageSettingsDialog(wx.Dialog, UnitsSettingsDialog):
wx
.
Dialog
.
__init__
(
self
,
parent
,
wx
.
ID_ANY
,
title
=
"Image Settings"
,
style
=
wx
.
DEFAULT_DIALOG_STYLE
|
wx
.
RESIZE_BORDER
|
wx
.
MINIMIZE_BOX
|
wx
.
MAXIMIZE_BOX
)
wx
.
Dialog
.
__init__
(
self
,
parent
,
wx
.
ID_ANY
,
title
=
"Image Settings"
,
style
=
wx
.
DEFAULT_DIALOG_STYLE
|
wx
.
RESIZE_BORDER
|
wx
.
MINIMIZE_BOX
|
wx
.
MAXIMIZE_BOX
)
self
.
parent
=
parent
self
.
parent
=
parent
self
.
build_dialog
()
self
.
build_dialog
()
self
.
Bind
(
wx
.
EVT_CLOSE
,
self
.
on_close
)
def
build_dialog
(
self
):
def
build_dialog
(
self
):
...
@@ -133,9 +133,7 @@ class ImageSettingsDialog(wx.Dialog, UnitsSettingsDialog):
...
@@ -133,9 +133,7 @@ class ImageSettingsDialog(wx.Dialog, UnitsSettingsDialog):
hsizer1
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
hsizer1
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
self
.
apply_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Apply"
)
self
.
apply_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Apply"
)
self
.
quit_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Quit"
)
hsizer1
.
Add
(
self
.
apply_button
,
0
,
wx
.
EXPAND
,
0
)
hsizer1
.
Add
(
self
.
apply_button
,
0
,
wx
.
EXPAND
,
0
)
hsizer1
.
Add
(
self
.
quit_button
,
0
,
wx
.
EXPAND
,
0
)
Sizer
.
Add
(
hsizer1
,
0
,
wx
.
ALIGN_RIGHT
|
wx
.
RIGHT
|
wx
.
ALL
,
5
)
Sizer
.
Add
(
hsizer1
,
0
,
wx
.
ALIGN_RIGHT
|
wx
.
RIGHT
|
wx
.
ALL
,
5
)
...
@@ -144,7 +142,6 @@ class ImageSettingsDialog(wx.Dialog, UnitsSettingsDialog):
...
@@ -144,7 +142,6 @@ class ImageSettingsDialog(wx.Dialog, UnitsSettingsDialog):
self
.
Layout
()
self
.
Layout
()
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
set_settings
,
self
.
apply_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
set_settings
,
self
.
apply_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
on_close
,
self
.
quit_button
)
self
.
get_settings
()
self
.
get_settings
()
...
@@ -188,9 +185,6 @@ class ImageSettingsDialog(wx.Dialog, UnitsSettingsDialog):
...
@@ -188,9 +185,6 @@ class ImageSettingsDialog(wx.Dialog, UnitsSettingsDialog):
self
.
parent
.
color_bar
.
update_normal
(
self
.
parent
.
ax
)
self
.
parent
.
color_bar
.
update_normal
(
self
.
parent
.
ax
)
self
.
parent
.
canvas
.
draw
()
self
.
parent
.
canvas
.
draw
()
def
on_close
(
self
,
event
=
None
):
self
.
MakeModal
(
False
)
self
.
Destroy
()
class
GeneralSettingsDialog
(
wx
.
Dialog
):
class
GeneralSettingsDialog
(
wx
.
Dialog
):
...
@@ -198,7 +192,6 @@ class GeneralSettingsDialog(wx.Dialog):
...
@@ -198,7 +192,6 @@ class GeneralSettingsDialog(wx.Dialog):
wx
.
Dialog
.
__init__
(
self
,
parent
,
wx
.
ID_ANY
,
title
=
"General Settings"
,
style
=
wx
.
DEFAULT_DIALOG_STYLE
|
wx
.
RESIZE_BORDER
|
wx
.
MINIMIZE_BOX
|
wx
.
MAXIMIZE_BOX
)
wx
.
Dialog
.
__init__
(
self
,
parent
,
wx
.
ID_ANY
,
title
=
"General Settings"
,
style
=
wx
.
DEFAULT_DIALOG_STYLE
|
wx
.
RESIZE_BORDER
|
wx
.
MINIMIZE_BOX
|
wx
.
MAXIMIZE_BOX
)
self
.
parent
=
parent
self
.
parent
=
parent
self
.
build_dialog
()
self
.
build_dialog
()
self
.
Bind
(
wx
.
EVT_CLOSE
,
self
.
on_close
)
def
build_dialog
(
self
):
def
build_dialog
(
self
):
self
.
legend_location_choice
=
[
'best'
,
'upper right'
,
'upper left'
,
\
self
.
legend_location_choice
=
[
'best'
,
'upper right'
,
'upper left'
,
\
...
@@ -291,9 +284,7 @@ class GeneralSettingsDialog(wx.Dialog):
...
@@ -291,9 +284,7 @@ class GeneralSettingsDialog(wx.Dialog):
hsizer5
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
hsizer5
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
self
.
apply_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Apply"
)
self
.
apply_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Apply"
)
self
.
quit_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Quit"
)
hsizer5
.
Add
(
self
.
apply_button
,
0
,
wx
.
ALIGN_CENTER_VERTICAL
|
wx
.
ALIGN_RIGHT
|
wx
.
ALIGN_RIGHT
,
0
)
hsizer5
.
Add
(
self
.
apply_button
,
0
,
wx
.
ALIGN_CENTER_VERTICAL
|
wx
.
ALIGN_RIGHT
|
wx
.
ALIGN_RIGHT
,
0
)
hsizer5
.
Add
(
self
.
quit_button
,
0
,
wx
.
ALIGN_CENTER_VERTICAL
|
wx
.
ALIGN_RIGHT
|
wx
.
ALIGN_RIGHT
,
0
)
Sizer
.
Add
(
sbsizer0
,
0
,
wx
.
EXPAND
|
wx
.
ALIGN_CENTER_VERTICAL
|
wx
.
ALL
,
5
)
Sizer
.
Add
(
sbsizer0
,
0
,
wx
.
EXPAND
|
wx
.
ALIGN_CENTER_VERTICAL
|
wx
.
ALL
,
5
)
Sizer
.
Add
(
sbsizer1
,
0
,
wx
.
EXPAND
|
wx
.
ALIGN_CENTER_VERTICAL
|
wx
.
ALL
,
5
)
Sizer
.
Add
(
sbsizer1
,
0
,
wx
.
EXPAND
|
wx
.
ALIGN_CENTER_VERTICAL
|
wx
.
ALL
,
5
)
...
@@ -305,7 +296,6 @@ class GeneralSettingsDialog(wx.Dialog):
...
@@ -305,7 +296,6 @@ class GeneralSettingsDialog(wx.Dialog):
self
.
Layout
()
self
.
Layout
()
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
set_settings
,
self
.
apply_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
set_settings
,
self
.
apply_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
on_close
,
self
.
quit_button
)
self
.
get_settings
()
self
.
get_settings
()
...
@@ -364,9 +354,6 @@ class GeneralSettingsDialog(wx.Dialog):
...
@@ -364,9 +354,6 @@ class GeneralSettingsDialog(wx.Dialog):
self
.
parent
.
canvas
.
draw
()
self
.
parent
.
canvas
.
draw
()
def
on_close
(
self
,
event
=
None
):
self
.
MakeModal
(
False
)
self
.
Destroy
()
class
AxesSettingsDialog
(
wx
.
Dialog
,
UnitsSettingsDialog
):
class
AxesSettingsDialog
(
wx
.
Dialog
,
UnitsSettingsDialog
):
...
@@ -375,7 +362,6 @@ class AxesSettingsDialog(wx.Dialog, UnitsSettingsDialog):
...
@@ -375,7 +362,6 @@ class AxesSettingsDialog(wx.Dialog, UnitsSettingsDialog):
wx
.
Dialog
.
__init__
(
self
,
parent
,
wx
.
ID_ANY
,
title
=
"Axes Settings"
,
style
=
wx
.
DEFAULT_DIALOG_STYLE
|
wx
.
RESIZE_BORDER
|
wx
.
MINIMIZE_BOX
|
wx
.
MAXIMIZE_BOX
)
wx
.
Dialog
.
__init__
(
self
,
parent
,
wx
.
ID_ANY
,
title
=
"Axes Settings"
,
style
=
wx
.
DEFAULT_DIALOG_STYLE
|
wx
.
RESIZE_BORDER
|
wx
.
MINIMIZE_BOX
|
wx
.
MAXIMIZE_BOX
)
self
.
parent
=
parent
self
.
parent
=
parent
self
.
build_dialog
()
self
.
build_dialog
()
self
.
Bind
(
wx
.
EVT_CLOSE
,
self
.
on_close
)
def
build_dialog
(
self
):
def
build_dialog
(
self
):
...
@@ -446,9 +432,7 @@ class AxesSettingsDialog(wx.Dialog, UnitsSettingsDialog):
...
@@ -446,9 +432,7 @@ class AxesSettingsDialog(wx.Dialog, UnitsSettingsDialog):
hsizer1
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
hsizer1
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
self
.
apply_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Apply"
)
self
.
apply_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Apply"
)
self
.
quit_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Quit"
)
hsizer1
.
Add
(
self
.
apply_button
,
0
,
wx
.
EXPAND
,
0
)
hsizer1
.
Add
(
self
.
apply_button
,
0
,
wx
.
EXPAND
,
0
)
hsizer1
.
Add
(
self
.
quit_button
,
0
,
wx
.
EXPAND
,
0
)
Sizer
.
Add
(
hsizer0
,
0
,
wx
.
EXPAND
|
wx
.
ALIGN_CENTER_VERTICAL
|
wx
.
ALL
,
5
)
Sizer
.
Add
(
hsizer0
,
0
,
wx
.
EXPAND
|
wx
.
ALIGN_CENTER_VERTICAL
|
wx
.
ALL
,
5
)
Sizer
.
Add
(
hsizer1
,
0
,
wx
.
ALIGN_RIGHT
|
wx
.
RIGHT
|
wx
.
ALL
,
5
)
Sizer
.
Add
(
hsizer1
,
0
,
wx
.
ALIGN_RIGHT
|
wx
.
RIGHT
|
wx
.
ALL
,
5
)
...
@@ -459,7 +443,6 @@ class AxesSettingsDialog(wx.Dialog, UnitsSettingsDialog):
...
@@ -459,7 +443,6 @@ class AxesSettingsDialog(wx.Dialog, UnitsSettingsDialog):
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
auto_fit
,
self
.
auto_fit_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
auto_fit
,
self
.
auto_fit_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
set_settings
,
self
.
apply_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
set_settings
,
self
.
apply_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
on_close
,
self
.
quit_button
)
self
.
get_settings
()
self
.
get_settings
()
...
@@ -515,9 +498,6 @@ class AxesSettingsDialog(wx.Dialog, UnitsSettingsDialog):
...
@@ -515,9 +498,6 @@ class AxesSettingsDialog(wx.Dialog, UnitsSettingsDialog):
self
.
Xmax
.
SetValue
(
str
(
self
.
parent
.
Xmax
))
self
.
Xmax
.
SetValue
(
str
(
self
.
parent
.
Xmax
))
self
.
Ymax
.
SetValue
(
str
(
self
.
parent
.
Ymax
))
self
.
Ymax
.
SetValue
(
str
(
self
.
parent
.
Ymax
))
def
on_close
(
self
,
event
=
None
):
self
.
MakeModal
(
False
)
self
.
Destroy
()
class
LinesSettingsDialog
(
wx
.
Dialog
):
class
LinesSettingsDialog
(
wx
.
Dialog
):
...
@@ -526,7 +506,6 @@ class LinesSettingsDialog(wx.Dialog):
...
@@ -526,7 +506,6 @@ class LinesSettingsDialog(wx.Dialog):
self
.
parent
=
parent
self
.
parent
=
parent
self
.
current_line
=
None
self
.
current_line
=
None
self
.
build_dialog
()
self
.
build_dialog
()
self
.
Bind
(
wx
.
EVT_CLOSE
,
self
.
on_close
)
def
build_dialog
(
self
):
def
build_dialog
(
self
):
...
@@ -573,9 +552,7 @@ class LinesSettingsDialog(wx.Dialog):
...
@@ -573,9 +552,7 @@ class LinesSettingsDialog(wx.Dialog):
hsizer1
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
hsizer1
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
self
.
apply_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Apply"
)
self
.
apply_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Apply"
)
self
.
quit_button
=
wx
.
Button
(
self
,
wx
.
ID_ANY
,
label
=
"Quit"
)
hsizer1
.
Add
(
self
.
apply_button
,
0
,
wx
.
EXPAND
,
0
)
hsizer1
.
Add
(
self
.
apply_button
,
0
,
wx
.
EXPAND
,
0
)
hsizer1
.
Add
(
self
.
quit_button
,
0
,
wx
.
EXPAND
,
0
)
Sizer
.
Add
(
bagSizer
,
0
,
wx
.
EXPAND
|
wx
.
ALL
,
5
)
Sizer
.
Add
(
bagSizer
,
0
,
wx
.
EXPAND
|
wx
.
ALL
,
5
)
Sizer
.
Add
(
hsizer1
,
0
,
wx
.
ALIGN_RIGHT
|
wx
.
RIGHT
|
wx
.
ALL
,
5
)
Sizer
.
Add
(
hsizer1
,
0
,
wx
.
ALIGN_RIGHT
|
wx
.
RIGHT
|
wx
.
ALL
,
5
)
...
@@ -586,7 +563,6 @@ class LinesSettingsDialog(wx.Dialog):
...
@@ -586,7 +563,6 @@ class LinesSettingsDialog(wx.Dialog):
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
delete_line
,
self
.
del_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
delete_line
,
self
.
del_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
set_settings
,
self
.
apply_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
set_settings
,
self
.
apply_button
)
self
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
on_close
,
self
.
quit_button
)
self
.
Bind
(
wx
.
EVT_LIST_ITEM_FOCUSED
,
self
.
on_select_item
,
self
.
lines
)
self
.
Bind
(
wx
.
EVT_LIST_ITEM_FOCUSED
,
self
.
on_select_item
,
self
.
lines
)
self
.
set_lines
()
self
.
set_lines
()
...
@@ -596,7 +572,11 @@ class LinesSettingsDialog(wx.Dialog):
...
@@ -596,7 +572,11 @@ class LinesSettingsDialog(wx.Dialog):
_id
=
0
_id
=
0
for
k
in
self
.
parent
.
plots
.
keys
():
for
k
in
self
.
parent
.
plots
.
keys
():
if
type
(
self
.
parent
.
plots
[
k
][
0
].
get_color
())
is
str
:
if
type
(
self
.
parent
.
plots
[
k
][
0
].
get_color
())
is
str
:
try
:
r
,
g
,
b
=
matplotlib
.
colors
.
colorConverter
.
colors
[
self
.
parent
.
plots
[
k
][
0
].
get_color
()]
r
,
g
,
b
=
matplotlib
.
colors
.
colorConverter
.
colors
[
self
.
parent
.
plots
[
k
][
0
].
get_color
()]
except
KeyError
:
color
=
self
.
parent
.
plots
[
k
][
0
].
get_color
().
lstrip
(
"#"
)
r
,
g
,
b
=
tuple
(
int
(
color
[
i
:
i
+
2
],
16
)
/
255.0
for
i
in
(
0
,
2
,
4
))
else
:
else
:
r
,
g
,
b
=
self
.
parent
.
plots
[
k
][
0
].
get_color
()
r
,
g
,
b
=
self
.
parent
.
plots
[
k
][
0
].
get_color
()
self
.
lines
.
InsertStringItem
(
index
=
_id
,
label
=
k
)
self
.
lines
.
InsertStringItem
(
index
=
_id
,
label
=
k
)
...
@@ -619,7 +599,11 @@ class LinesSettingsDialog(wx.Dialog):
...
@@ -619,7 +599,11 @@ class LinesSettingsDialog(wx.Dialog):
self
.
parent
.
figure
.
canvas
.
draw
()
self
.
parent
.
figure
.
canvas
.
draw
()
if
type
(
self
.
current_line
.
get_color
())
is
str
:
if
type
(
self
.
current_line
.
get_color
())
is
str
:
try
:
r
,
g
,
b
=
matplotlib
.
colors
.
colorConverter
.
colors
[
self
.
current_line
.
get_color
()]
r
,
g
,
b
=
matplotlib
.
colors
.
colorConverter
.
colors
[
self
.
current_line
.
get_color
()]
except
KeyError
:
color
=
self
.
current_line
.
get_color
().
lstrip
(
"#"
)
r
,
g
,
b
=
tuple
(
int
(
color
[
i
:
i
+
2
],
16
)
/
255.0
for
i
in
(
0
,
2
,
4
))
else
:
else
:
r
,
g
,
b
=
self
.
current_line
.
get_color
()
r
,
g
,
b
=
self
.
current_line
.
get_color
()
color
=
wx
.
Colour
(
int
(
r
*
255
),
int
(
g
*
255
),
int
(
b
*
255
))
color
=
wx
.
Colour
(
int
(
r
*
255
),
int
(
g
*
255
),
int
(
b
*
255
))
...
@@ -664,12 +648,3 @@ class LinesSettingsDialog(wx.Dialog):
...
@@ -664,12 +648,3 @@ class LinesSettingsDialog(wx.Dialog):
return
return
self
.
parent
.
delete_line
(
self
.
current_line
)
self
.
parent
.
delete_line
(
self
.
current_line
)
self
.
set_lines
()
self
.
set_lines
()
def
on_close
(
self
,
event
=
None
):
self
.
MakeModal
(
False
)
# unselect selection
if
self
.
parent
.
selectedLine
is
not
None
:
self
.
parent
.
selectedLine
.
set_alpha
(
1.0
)
self
.
parent
.
selectedLine
.
figure
.
canvas
.
draw
()
self
.
parent
.
selectedLine
=
None
self
.
Destroy
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a 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