Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
S
soitool
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
bachelor-paa-bittet
soitool
Commits
4de29fa1
Commit
4de29fa1
authored
5 years ago
by
Thomas Holene Løkkeborg
Browse files
Options
Downloads
Patches
Plain Diff
#54 tester for modulsortering + SOI tar nå moduler utenfra
parent
b893aa55
No related branches found
Branches containing commit
No related tags found
1 merge request
!28
#54 Rectpack for reorganisering av moduler + litt black
Pipeline
#74442
failed
5 years ago
Stage: lint
Stage: test
Stage: deploy
Changes
3
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
soitool/soi.py
+8
-29
8 additions, 29 deletions
soitool/soi.py
soitool/soi_workspace_widget.py
+41
-3
41 additions, 3 deletions
soitool/soi_workspace_widget.py
test/test_soi.py
+145
-0
145 additions, 0 deletions
test/test_soi.py
with
194 additions
and
32 deletions
soitool/soi.py
+
8
−
29
View file @
4de29fa1
...
...
@@ -11,7 +11,6 @@ from rectpack import (
skyline
,
guillotine
,
)
from
soitool.modules.module_table
import
TableModule
# functions to sort modules by different criteria
...
...
@@ -158,6 +157,10 @@ class SOI:
Currently the following are implemented:
'
none
'
,
'
area
'
,
'
width
'
,
'
height
'
. Please refer to the STRING_TO_ALGORITHM_INITIAL_SORT
variable.
modules : list of modules
initial modules of SOI
attachments : list of attachment modules
initial attachment modules of SOI
"""
...
...
@@ -207,6 +210,8 @@ class SOI:
algorithm_bin
=
"
BFF
"
,
algorithm_pack
=
"
MaxRectsBl
"
,
algorithm_sort
=
"
area
"
,
modules
=
[],
attachments
=
[],
):
# populate date-related arguments if they are not supplied by the user
...
...
@@ -230,6 +235,8 @@ class SOI:
self
.
classification
=
classification
self
.
orientation
=
orientation
self
.
placement_strategy
=
placement_strategy
self
.
modules
=
modules
self
.
attachments
=
attachments
# the following propertiese are relevant when self.placement_strategy
# is "auto". They are used by rectpack
...
...
@@ -240,34 +247,6 @@ class SOI:
# functions to call after reorganization
self
.
reorganization_listeners
=
[]
# NOTE
# * test modules, just to have something show up on screen
# * not valid until reorganize has been run, as the positions must be
# updated
self
.
modules
=
[
{
"
widget
"
:
TableModule
(),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
1
,
"
name
"
:
"
Tabell1
"
},
},
{
"
widget
"
:
TableModule
(),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
1
,
"
name
"
:
"
Tabell2
"
},
},
{
"
widget
"
:
TableModule
(),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
2
,
"
name
"
:
"
Tabell3
"
},
},
]
# NOTE
# test attachments, just to have something show up on screen
self
.
attachments
=
[
{
"
widget
"
:
TableModule
(),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
2
,
"
name
"
:
"
Tabell1
"
},
}
]
self
.
reorganize
()
def
add_reorganization_listener
(
self
,
function
):
...
...
This diff is collapsed.
Click to expand it.
soitool/soi_workspace_widget.py
+
41
−
3
View file @
4de29fa1
...
...
@@ -3,12 +3,18 @@
Meant for use inside of tabs in our program.
"""
from
PySide2.QtWidgets
import
QWidget
,
QHBoxLayout
,
QVBoxLayout
,
QPushButton
,
\
QLabel
from
PySide2.QtWidgets
import
(
QWidget
,
QHBoxLayout
,
QVBoxLayout
,
QPushButton
,
QLabel
,
)
from
soitool.soi
import
SOI
,
ModuleType
from
soitool.module_list
import
ModuleList
from
soitool.inline_editable_soi_view
import
InlineEditableSOIView
from
soitool.setup_settings
import
Setup
from
soitool.modules.module_table
import
TableModule
class
SOIWorkspaceWidget
(
QWidget
):
...
...
@@ -21,7 +27,39 @@ class SOIWorkspaceWidget(QWidget):
def
__init__
(
self
):
super
().
__init__
()
self
.
soi
=
SOI
()
# NOTE
# * test modules, just to have something show up on screen
# * not valid until reorganize has been run, as the positions must be
# updated
initial_modules
=
[
{
"
widget
"
:
TableModule
(),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
1
,
"
name
"
:
"
Tabell1
"
},
},
{
"
widget
"
:
TableModule
(),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
1
,
"
name
"
:
"
Tabell2
"
},
},
{
"
widget
"
:
TableModule
(),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
2
,
"
name
"
:
"
Tabell3
"
},
},
]
# NOTE
# test attachments, just to have something show up on screen
initial_attachments
=
[
{
"
widget
"
:
TableModule
(),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
2
,
"
name
"
:
"
Tabell1
"
},
}
]
self
.
soi
=
SOI
(
modules
=
initial_modules
,
attachments
=
initial_attachments
)
self
.
soi
.
reorganize
()
self
.
layout_wrapper
=
QHBoxLayout
()
self
.
layout_sidebar
=
QVBoxLayout
()
...
...
This diff is collapsed.
Click to expand it.
test/test_soi.py
0 → 100644
+
145
−
0
View file @
4de29fa1
"""
Test the soi module.
To view the SOI during manual testing the following snippet is useful:
```python
self.soi.reorganize()
view = InlineEditableSOIView(self.soi)
view.show()
app.exec_()
```
"""
import
unittest
from
PySide2.QtWidgets
import
QApplication
,
QWidget
from
PySide2
import
QtGui
from
PySide2.QtGui
import
QPalette
,
QColor
from
soitool.soi
import
SOI
from
soitool.modules.module_base
import
ModuleBase
if
isinstance
(
QtGui
.
qApp
,
type
(
None
)):
app
=
QApplication
([])
else
:
app
=
QtGui
.
qApp
class
Meta
(
type
(
ModuleBase
),
type
(
QWidget
)):
"""
Used as a metaclass to enable multiple inheritance.
"""
class
TestModule
(
ModuleBase
,
QWidget
,
metaclass
=
Meta
):
"""
A simple module of given width, height and color for testing.
"""
def
__init__
(
self
,
color
,
width
,
height
,
*
args
,
**
kwargs
):
super
(
TestModule
,
self
).
__init__
(
*
args
,
**
kwargs
)
self
.
setAutoFillBackground
(
True
)
palette
=
self
.
palette
()
palette
.
setColor
(
QPalette
.
Window
,
QColor
(
color
))
self
.
setPalette
(
palette
)
self
.
setGeometry
(
0
,
0
,
width
,
height
)
def
get_size
(
self
):
"""
Override.
"""
size
=
self
.
size
()
return
size
.
width
(),
size
.
height
()
def
set_pos
(
self
,
pos
):
"""
Override.
"""
self
.
move
(
pos
)
def
render_onto_pdf
(
self
):
"""
Not used.
"""
raise
NotImplementedError
()
# The modules below have sizes that make the ideal for testing.
# Sorting them by width should yield
# 1. wide_module
# 2. big_module
# 3. tall_module
# Sorting them by height should yield
# 1. tall_module
# 2. big_module
# 3. wide_module
# And sorting them by area should yield
# 1. big_module
# 2. tall_module
# 3. wide_module
# Note that when sorting by area the two modules 'tall_module' and
# 'wide_module' have the same area, but 'tall_module' should come first
# because sorting should be stable
# https://en.wikipedia.org/wiki/Category:Stable_sorts
# FIXME the only meta information necessary here is "name", if we assume
# automatic sorting..
TEST_MODULES
=
[
{
"
widget
"
:
TestModule
(
"
red
"
,
100
,
400
),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
1
,
"
name
"
:
"
tall_module
"
},
},
{
"
widget
"
:
TestModule
(
"
blue
"
,
400
,
100
),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
1
,
"
name
"
:
"
wide_module
"
},
},
{
"
widget
"
:
TestModule
(
"
orange
"
,
300
,
300
),
"
meta
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
page
"
:
1
,
"
name
"
:
"
big_module
"
},
},
]
class
TestSOI
(
unittest
.
TestCase
):
"""
TestCase for the SOI class.
"""
def
setUp
(
self
):
"""
Prepare SOI to test on.
"""
self
.
soi
=
SOI
(
modules
=
TEST_MODULES
,
attachments
=
TEST_MODULES
,
algorithm_sort
=
"
none
"
,
)
def
sort_modules_and_assert_order
(
self
,
sorting_algorithm
,
expected_order
):
"""
Sort the SOI modules using algorithm and expect order.
This function was created to reduce code-duplication only.
Parameters
----------
sorting_algorithm : str
name of sorting algorithm to pass to the SOI
expected_order : list of string names
names of modules in the expected order
"""
self
.
soi
.
algorithm_sort
=
sorting_algorithm
self
.
soi
.
sort_modules
()
self
.
assertEqual
(
expected_order
,
[
module
[
"
meta
"
][
"
name
"
]
for
module
in
self
.
soi
.
modules
],
f
"
Modules should have expected order when sorting algorithm is
"
"
set to
'
{sorting_algorithm}
'"
,
)
def
test_sort_modules_none
(
self
):
"""
Test sort algorithm
'
none
'
.
"""
self
.
sort_modules_and_assert_order
(
"
none
"
,
[
"
tall_module
"
,
"
wide_module
"
,
"
big_module
"
]
)
def
test_sort_modules_width
(
self
):
"""
Test sort algorithm
'
width
'
.
"""
self
.
sort_modules_and_assert_order
(
"
width
"
,
[
"
wide_module
"
,
"
big_module
"
,
"
tall_module
"
]
)
def
test_sort_modules_height
(
self
):
"""
Test sort algorithm
'
height
'
.
"""
self
.
sort_modules_and_assert_order
(
"
height
"
,
[
"
tall_module
"
,
"
big_module
"
,
"
wide_module
"
]
)
def
test_sort_modules_area
(
self
):
"""
Test sort algorithm
'
area
'
.
"""
self
.
sort_modules_and_assert_order
(
"
area
"
,
[
"
big_module
"
,
"
tall_module
"
,
"
wide_module
"
]
)
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
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!
Save comment
Cancel
Please
register
or
sign in
to comment