Skip to content
GitLab
Menu
Why GitLab
Pricing
Contact Sales
Explore
Why GitLab
Pricing
Contact Sales
Explore
Sign in
Get free trial
You need to sign in or sign up before continuing.
Commits on Source (2)
chore(formatting): ran black to format sources
· 6f294094
Daniel Seiller
authored
Oct 23, 2019
6f294094
feat(tests): Add pytest.ini for pytest-qt
· eb43ca88
Daniel Seiller
authored
Oct 23, 2019
eb43ca88
Expand all
Hide whitespace changes
Inline
Side-by-side
build_gui.py
View file @
eb43ca88
...
...
@@ -12,5 +12,5 @@ for root, folders, files in os.walk(ui_path):
outfile
,
ext
=
os
.
path
.
splitext
(
file
)
if
ext
==
"
.ui
"
:
outfile
=
outfile
+
"
.py
"
print
(
file
,
"
->
"
,
outfile
)
print
(
file
,
"
->
"
,
outfile
)
SP
.
check_call
([
"
pyuic5
"
,
"
--from-imports
"
,
"
-o
"
,
outfile
,
file
])
ed_lrr_gui/config.py
View file @
eb43ca88
...
...
@@ -11,22 +11,35 @@ config_file.touch()
cfg
=
profig
.
Config
(
str
(
config_file
),
strict
=
True
)
cfg
.
init
(
"
history.bodies_url
"
,
[
"
https://www.edsm.net/dump/bodies.json
"
],
"
path_list
"
,
comment
=
"
history of bodies.json urls
"
)
cfg
.
init
(
"
history.systems_url
"
,
[
"
https://www.edsm.net/dump/systemsWithCoordinates.json
"
],
"
path_list
"
,
comment
=
"
history of systems.json urls
"
)
cfg
.
init
(
"
history.bodies_url
"
,
[
"
https://www.edsm.net/dump/bodies.json
"
],
"
path_list
"
,
comment
=
"
history of bodies.json urls
"
,
)
cfg
.
init
(
"
history.systems_url
"
,
[
"
https://www.edsm.net/dump/systemsWithCoordinates.json
"
],
"
path_list
"
,
comment
=
"
history of systems.json urls
"
,
)
cfg
.
init
(
"
history.bodies_path
"
,
[
os
.
path
.
join
(
config_dir
,
"
data
"
,
"
bodies.json
"
)],
[
os
.
path
.
join
(
config_dir
,
"
data
"
,
"
bodies.json
"
)],
"
path_list
"
,
comment
=
"
history of bodies.json download paths
"
,
)
cfg
.
init
(
"
history.systems_path
"
,
[
os
.
path
.
join
(
config_dir
,
"
data
"
,
"
systemsWithCoordinates.json
"
)],
[
os
.
path
.
join
(
config_dir
,
"
data
"
,
"
systemsWithCoordinates.json
"
)],
"
path_list
"
,
comment
=
"
history of systems.json download paths
"
,
)
cfg
.
init
(
"
history.stars_csv_path
"
,
[
os
.
path
.
join
(
config_dir
,
"
data
"
,
"
stars.csv
"
)],
"
path_list
"
,
comment
=
"
history of paths for stars.csv
"
"
history.stars_csv_path
"
,
[
os
.
path
.
join
(
config_dir
,
"
data
"
,
"
stars.csv
"
)],
"
path_list
"
,
comment
=
"
history of paths for stars.csv
"
,
)
cfg
.
init
(
"
route.range
"
,
7.56
,
comment
=
"
jump range
"
)
cfg
.
init
(
"
route.primary
"
,
False
,
comment
=
"
only route through primary stars
"
)
...
...
@@ -40,7 +53,7 @@ cfg.init("route.prune.steps", 5, comment="number of steps before path gets prune
cfg
.
init
(
"
route.greediness
"
,
0.5
,
comment
=
"
A* greediness
"
)
cfg
.
init
(
"
folders.data_dir
"
,
os
.
path
.
join
(
config_dir
,
"
data
"
),
comment
=
"
Data directory
"
)
cfg
.
init
(
"
GUI.theme
"
,
'
dark
'
,
comment
=
"
GUI theme to use
"
)
cfg
.
init
(
"
GUI.theme
"
,
"
dark
"
,
comment
=
"
GUI theme to use
"
)
cfg
.
sync
()
ed_lrr_gui/gui/main.py
View file @
eb43ca88
...
...
@@ -114,8 +114,8 @@ class PreprocessJob(Job):
self
.
start
()
def
handle_progess
(
self
,
state
):
sent
=
object
()
if
state
.
get
(
"
return
"
,
sent
)
!=
sent
:
sent
=
object
()
if
state
.
get
(
"
return
"
,
sent
)
!=
sent
:
self
.
progress_dialog
.
close
()
return
msg
=
"
Processed: {}/{}
"
.
format
(
...
...
@@ -142,12 +142,12 @@ class RouterJob(Job):
self
.
progress_dialog
.
canceled
.
connect
(
self
.
cancel
)
self
.
progress_dialog
.
show
()
self
.
start
()
self
.
state
=
{}
self
.
state
=
{}
def
handle_progess
(
self
,
state
):
sent
=
object
()
if
state
.
get
(
"
return
"
,
sent
)
!=
sent
:
print
(
state
[
'
return
'
])
sent
=
object
()
if
state
.
get
(
"
return
"
,
sent
)
!=
sent
:
print
(
state
[
"
return
"
])
self
.
progress_dialog
.
close
()
route_win
=
WRoute
(
self
.
main_window
,
state
[
"
return
"
])
return
...
...
@@ -249,7 +249,7 @@ class App(QApplication):
class
WRoute
(
Ui_diag_route
):
def
__init__
(
self
,
main_window
,
hops
):
super
().
__init__
()
self
.
route
=
hops
self
.
route
=
hops
dialog
=
QDialog
(
main_window
)
self
.
setupUi
(
dialog
)
for
n
,
item
in
enumerate
(
hops
):
...
...
@@ -262,7 +262,7 @@ class WRoute(Ui_diag_route):
item
[
"
system
"
],
"
{body} ({star_type})
"
.
format
(
**
item
),
str
(
item
[
"
distance
"
]),
"
<NotImplemented>
"
,
# Jump distance
"
<NotImplemented>
"
,
# Jump distance
],
)
item
.
setFlags
(
item
.
flags
()
&
~
Qt
.
ItemIsDropEnabled
)
...
...
ed_lrr_gui/html_export.py
View file @
eb43ca88
This diff is collapsed.
Click to expand it.
ed_lrr_gui/web/__main__.py
View file @
eb43ca88
from
flask
import
Flask
,
jsonify
from
flask
import
Flask
,
jsonify
import
uuid
import
json
from
webargs
import
fields
,
validate
from
webargs
import
fields
,
validate
from
webargs.flaskparser
import
use_args
from
flask_sqlalchemy
import
SQLAlchemy
from
sqlalchemy_utils
import
Timestamp
,
generic_repr
from
sqlalchemy_utils
import
Timestamp
,
generic_repr
from
sqlalchemy.ext.declarative
import
declarative_base
from
sqlalchemy.orm
import
scoped_session
,
sessionmaker
,
relationship
,
backref
from
sqlalchemy.types
import
Float
,
String
,
Boolean
from
sqlalchemy.types
import
Float
,
String
,
Boolean
app
=
Flask
(
__name__
)
app
.
config
[
'
SQLALCHEMY_DATABASE_URI
'
]
=
'
sqlite:///jobs.db
'
app
.
config
[
'
SQLALCHEMY_TRACK_MODIFICATIONS
'
]
=
False
app
=
Flask
(
__name__
)
app
.
config
[
"
SQLALCHEMY_DATABASE_URI
"
]
=
"
sqlite:///jobs.db
"
app
.
config
[
"
SQLALCHEMY_TRACK_MODIFICATIONS
"
]
=
False
db
=
SQLAlchemy
(
app
)
db
=
SQLAlchemy
(
app
)
@generic_repr
class
Job
(
db
.
Model
,
Timestamp
):
id
=
db
.
Column
(
db
.
String
,
default
=
lambda
:
str
(
uuid
.
uuid4
()),
primary_key
=
True
)
jump_range
=
db
.
Column
(
db
.
Float
,
nullable
=
False
)
mode
=
db
.
Column
(
db
.
String
,
default
=
"
bfs
"
)
class
Job
(
db
.
Model
,
Timestamp
):
id
=
db
.
Column
(
db
.
String
,
default
=
lambda
:
str
(
uuid
.
uuid4
()),
primary_key
=
True
)
jump_range
=
db
.
Column
(
db
.
Float
,
nullable
=
False
)
mode
=
db
.
Column
(
db
.
String
,
default
=
"
bfs
"
)
systems
=
db
.
Column
(
db
.
String
)
permute
=
db
.
Column
(
db
.
String
,
default
=
None
,
nullable
=
True
)
primary
=
db
.
Column
(
db
.
Boolean
,
default
=
False
)
factor
=
db
.
Column
(
db
.
Float
,
default
=
0.5
)
done
=
db
.
Column
(
db
.
DateTime
,
nullable
=
True
,
default
=
None
)
started
=
db
.
Column
(
db
.
DateTime
,
nullable
=
True
,
default
=
None
)
progress
=
db
.
Column
(
db
.
Float
,
default
=
0.0
)
permute
=
db
.
Column
(
db
.
String
,
default
=
None
,
nullable
=
True
)
primary
=
db
.
Column
(
db
.
Boolean
,
default
=
False
)
factor
=
db
.
Column
(
db
.
Float
,
default
=
0.5
)
done
=
db
.
Column
(
db
.
DateTime
,
nullable
=
True
,
default
=
None
)
started
=
db
.
Column
(
db
.
DateTime
,
nullable
=
True
,
default
=
None
)
progress
=
db
.
Column
(
db
.
Float
,
default
=
0.0
)
#============================================================
#
============================================================
@classmethod
def
new
(
cls
,
**
kwargs
):
obj
=
cls
(
**
kwargs
)
def
new
(
cls
,
**
kwargs
):
obj
=
cls
(
**
kwargs
)
db
.
session
.
add
(
obj
)
db
.
session
.
commit
()
print
(
obj
)
...
...
@@ -40,19 +41,21 @@ class Job(db.Model,Timestamp):
@property
def
dict
(
self
):
ret
=
{}
ret
=
{}
for
col
in
self
.
__table__
.
columns
:
ret
[
col
.
name
]
=
getattr
(
self
,
col
.
name
)
ret
[
'
systems
'
]
=
json
.
loads
(
ret
[
'
systems
'
])
ret
[
col
.
name
]
=
getattr
(
self
,
col
.
name
)
ret
[
"
systems
"
]
=
json
.
loads
(
ret
[
"
systems
"
])
return
ret
@dict.setter
def
set_dict
(
self
,
*
args
,
**
kwargs
):
def
set_dict
(
self
,
*
args
,
**
kwargs
):
raise
NotImplementedError
db
.
create_all
()
db
.
session
.
commit
()
@app.errorhandler
(
422
)
@app.errorhandler
(
400
)
def
handle_error
(
err
):
...
...
@@ -63,25 +66,35 @@ def handle_error(err):
else
:
return
jsonify
({
"
errors
"
:
messages
}),
err
.
code
@app.route
(
"
/route
"
,
methods
=
[
"
GET
"
,
"
POST
"
])
@use_args
({
"
jump_range
"
:
fields
.
Float
(
required
=
True
),
"
mode
"
:
fields
.
String
(
missing
=
"
bfs
"
,
validate
=
validate
.
OneOf
([
"
bfs
"
,
"
greedy
"
,
"
a-star
"
])),
"
systems
"
:
fields
.
DelimitedList
(
fields
.
String
,
required
=
True
),
"
permute
"
:
fields
.
String
(
missing
=
None
,
validate
=
validate
.
OneOf
([
"
all
"
,
"
keep_first
"
,
"
keep_last
"
,
"
keep_both
"
])),
"
primary
"
:
fields
.
Boolean
(
missing
=
False
),
"
factor
"
:
fields
.
Float
(
missing
=
0.5
)
})
@app.route
(
"
/route
"
,
methods
=
[
"
GET
"
,
"
POST
"
])
@use_args
(
{
"
jump_range
"
:
fields
.
Float
(
required
=
True
),
"
mode
"
:
fields
.
String
(
missing
=
"
bfs
"
,
validate
=
validate
.
OneOf
([
"
bfs
"
,
"
greedy
"
,
"
a-star
"
])
),
"
systems
"
:
fields
.
DelimitedList
(
fields
.
String
,
required
=
True
),
"
permute
"
:
fields
.
String
(
missing
=
None
,
validate
=
validate
.
OneOf
([
"
all
"
,
"
keep_first
"
,
"
keep_last
"
,
"
keep_both
"
]),
),
"
primary
"
:
fields
.
Boolean
(
missing
=
False
),
"
factor
"
:
fields
.
Float
(
missing
=
0.5
),
}
)
def
route
(
args
):
args
[
'
systems
'
]
=
json
.
dumps
(
args
[
'
systems
'
])
for
k
,
v
in
args
.
items
():
print
(
k
,
v
)
return
jsonify
({
'
id
'
:
Job
.
new
(
**
args
).
id
})
args
[
"
systems
"
]
=
json
.
dumps
(
args
[
"
systems
"
])
for
k
,
v
in
args
.
items
():
print
(
k
,
v
)
return
jsonify
({
"
id
"
:
Job
.
new
(
**
args
).
id
})
@app.route
(
"
/status/<uuid:job_id>
"
)
def
status
(
job_id
):
job
=
db
.
session
.
query
(
Job
).
get_or_404
(
str
(
job_id
))
job
=
db
.
session
.
query
(
Job
).
get_or_404
(
str
(
job_id
))
return
jsonify
(
job
.
dict
)
if
__name__
==
"
__main__
"
:
app
.
run
(
host
=
"
0.0.0.0
"
,
port
=
3777
,
debug
=
True
)
\ No newline at end of file
if
__name__
==
"
__main__
"
:
app
.
run
(
host
=
"
0.0.0.0
"
,
port
=
3777
,
debug
=
True
)
icon/make.py
View file @
eb43ca88
import
svgwrite
import
random
import
time
from
math
import
factorial
,
sin
,
cos
,
pi
from
math
import
factorial
,
sin
,
cos
,
pi
from
itertools
import
permutations
import
tsp
as
m_tsp
def
dist
(
p1
,
p2
):
return
dist2
(
p1
,
p2
)
**
0.5
def
dist
(
p1
,
p2
):
return
dist2
(
p1
,
p2
)
**
0.5
def
dist2
(
p1
,
p2
):
diff
=
0
for
a
,
b
in
zip
(
p1
,
p2
):
diff
+=
(
a
-
b
)
**
2
def
dist2
(
p1
,
p2
):
diff
=
0
for
a
,
b
in
zip
(
p1
,
p2
):
diff
+=
(
a
-
b
)
**
2
return
diff
def
tsp
(
points
):
res
=
[]
res
=
[]
for
idx
in
m_tsp
.
tsp
(
points
)[
1
]:
res
.
append
(
points
[
idx
])
return
res
def
make_points
(
n
,
size
,
min_dist
=
0
):
min_dist
*=
min_dist
points
=
[]
while
len
(
points
)
<
n
:
px
,
py
=
random
.
random
(),
random
.
random
()
px
*=
size
/
2
py
*=
size
/
2
px
+=
70
py
+=
70
valid
=
True
def
make_points
(
n
,
size
,
min_dist
=
0
):
min_dist
*=
min_dist
points
=
[]
while
len
(
points
)
<
n
:
px
,
py
=
random
.
random
(),
random
.
random
()
px
*=
size
/
2
py
*=
size
/
2
px
+=
70
py
+=
70
valid
=
True
for
p
in
points
:
if
dist2
(
p
,(
px
,
py
))
<
min_dist
:
valid
=
False
if
dist2
(
p
,
(
px
,
py
))
<
min_dist
:
valid
=
False
break
if
valid
:
points
.
append
((
px
,
py
))
print
(
"
{}/{}
"
.
format
(
len
(
points
),
n
))
points
.
append
((
px
,
py
))
print
(
"
{}/{}
"
.
format
(
len
(
points
),
n
))
return
points
def
generate
(
seed
,
name
=
None
,
small
=
False
):
sd
=
1
def
generate
(
seed
,
name
=
None
,
small
=
False
):
sd
=
1
if
small
:
sd
=
2
sd
=
2
random
.
seed
(
seed
)
w
=
2
max_rings
=
3
num_points
=
5
min_dist
=
10
+
10
+
20
*
(
max_rings
+
1
)
base_r
=
10
ring_step
=
lambda
v
:
10
+
v
*
10
size
=
1000
w
=
2
max_rings
=
3
num_points
=
5
min_dist
=
10
+
10
+
20
*
(
max_rings
+
1
)
base_r
=
10
ring_step
=
lambda
v
:
10
+
v
*
10
size
=
1000
if
name
is
None
:
name
=
seed
dwg
=
svgwrite
.
Drawing
(
filename
=
"
out/{}.svg
"
.
format
(
name
))
name
=
seed
dwg
=
svgwrite
.
Drawing
(
filename
=
"
out/{}.svg
"
.
format
(
name
))
dwg
.
defs
.
add
(
dwg
.
style
(
"
.background { fill: #222; }
"
))
dwg
.
add
(
dwg
.
rect
(
size
=
(
'
100%
'
,
'
100%
'
),
class_
=
'
background
'
))
dwg
.
add
(
dwg
.
rect
(
size
=
(
"
100%
"
,
"
100%
"
),
class_
=
"
background
"
))
print
(
"
Generating points...
"
)
color
=
"
#eee
"
pos
=
make_points
(
num_points
,
size
,
min_dist
=
min_dist
)
color
=
"
#eee
"
pos
=
make_points
(
num_points
,
size
,
min_dist
=
min_dist
)
print
(
"
TSP...
"
)
pos
=
tsp
(
pos
)
for
(
x1
,
y1
),(
x2
,
y2
)
in
zip
(
pos
,
pos
[
1
:]):
pos
=
tsp
(
pos
)
for
(
x1
,
y1
),
(
x2
,
y2
)
in
zip
(
pos
,
pos
[
1
:]):
if
small
:
x1
/=
sd
x2
/=
sd
y1
/=
sd
y2
/=
sd
line
=
dwg
.
add
(
dwg
.
line
((
x1
,
y1
),(
x2
,
y2
),
stroke_width
=
w
,
stroke
=
color
))
x1
/=
sd
x2
/=
sd
y1
/=
sd
y2
/=
sd
line
=
dwg
.
add
(
dwg
.
line
((
x1
,
y1
),
(
x2
,
y2
),
stroke_width
=
w
,
stroke
=
color
))
for
(
px
,
py
)
in
pos
:
base_r
=
3
for
(
px
,
py
)
in
pos
:
base_r
=
3
if
small
:
base_r
=
5
px
/=
sd
py
/=
sd
if
random
.
random
()
>
0.8
:
dwg
.
add
(
dwg
.
circle
((
px
,
py
),
r
=
base_r
+
random
.
random
()
*
base_r
,
stroke_width
=
w
,
stroke
=
'
#0ae
'
)).
fill
(
'
#0ae
'
)
base_r
=
5
px
/=
sd
py
/=
sd
if
random
.
random
()
>
0.8
:
dwg
.
add
(
dwg
.
circle
(
(
px
,
py
),
r
=
base_r
+
random
.
random
()
*
base_r
,
stroke_width
=
w
,
stroke
=
"
#0ae
"
,
)
).
fill
(
"
#0ae
"
)
else
:
dwg
.
add
(
dwg
.
circle
((
px
,
py
),
r
=
base_r
+
random
.
random
()
*
base_r
,
stroke_width
=
w
,
stroke
=
color
)).
fill
(
color
)
r
=
base_r
for
_
in
range
(
random
.
randint
(
1
,
max_rings
)):
dwg
.
add
(
dwg
.
circle
(
(
px
,
py
),
r
=
base_r
+
random
.
random
()
*
base_r
,
stroke_width
=
w
,
stroke
=
color
,
)
).
fill
(
color
)
r
=
base_r
for
_
in
range
(
random
.
randint
(
1
,
max_rings
)):
if
small
:
random
.
random
()
random
.
random
()
random
.
random
()
continue
r
+=
ring_step
(
random
.
random
())
ring_col
=
color
if
random
.
random
()
>
0.75
:
ring_col
=
"
#ea0
"
circ
=
dwg
.
add
(
dwg
.
circle
((
px
,
py
),
r
=
r
,
stroke_width
=
w
,
stroke
=
ring_col
))
circ
.
fill
(
color
,
opacity
=
0
)
d
=
random
.
random
()
*
pi
*
2
dx
=
cos
(
d
)
dy
=
sin
(
d
)
m
=
random
.
random
()
moon
=
dwg
.
add
(
dwg
.
circle
((
px
+
dx
*
r
,
py
+
dy
*
r
),
r
=
2
+
2
*
m
,
stroke_width
=
w
,
stroke
=
ring_col
))
r
+=
ring_step
(
random
.
random
())
ring_col
=
color
if
random
.
random
()
>
0.75
:
ring_col
=
"
#ea0
"
circ
=
dwg
.
add
(
dwg
.
circle
((
px
,
py
),
r
=
r
,
stroke_width
=
w
,
stroke
=
ring_col
))
circ
.
fill
(
color
,
opacity
=
0
)
d
=
random
.
random
()
*
pi
*
2
dx
=
cos
(
d
)
dy
=
sin
(
d
)
m
=
random
.
random
()
moon
=
dwg
.
add
(
dwg
.
circle
(
(
px
+
dx
*
r
,
py
+
dy
*
r
),
r
=
2
+
2
*
m
,
stroke_width
=
w
,
stroke
=
ring_col
,
)
)
moon
.
fill
(
ring_col
)
dwg
.
save
()
seed
=
-
4
generate
(
seed
,
"
icon_1
"
,
small
=
False
)
generate
(
seed
,
"
icon_1_small
"
,
small
=
True
)
seed
=
-
4
generate
(
seed
,
"
icon_1
"
,
small
=
False
)
generate
(
seed
,
"
icon_1_small
"
,
small
=
True
)
pytest.ini
0 → 100644
View file @
eb43ca88
[pytest]
qt_api
=
pyqt5
\ No newline at end of file