boris-behav-obs 9.2.3__tar.gz → 9.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- boris_behav_obs-9.3.1/PKG-INFO +132 -0
- boris_behav_obs-9.3.1/boris/1.py +45 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/behav_coding_map_creator.py +131 -74
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/behaviors_coding_map.py +5 -4
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/connections.py +0 -1
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/core.py +11 -12
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/event_operations.py +6 -3
- boris_behav_obs-9.2.3/boris/map_creator.py → boris_behav_obs-9.3.1/boris/modifier_coding_map_creator.py +372 -220
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/version.py +2 -2
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/write_event.py +2 -0
- boris_behav_obs-9.3.1/boris_behav_obs.egg-info/PKG-INFO +132 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris_behav_obs.egg-info/SOURCES.txt +2 -1
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/pyproject.toml +3 -3
- boris_behav_obs-9.2.3/PKG-INFO +0 -33
- boris_behav_obs-9.2.3/boris_behav_obs.egg-info/PKG-INFO +0 -33
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/LICENSE.TXT +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/MANIFEST.in +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/README.TXT +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/README.md +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/__init__.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/__main__.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/about.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/add_modifier.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/add_modifier_ui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/advanced_event_filtering.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/analysis_plugins/__init__.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/analysis_plugins/number_of_occurences.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/analysis_plugins/number_of_occurences_by_independent_variable.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/analysis_plugins/time_budget.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/behavior_binary_table.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/boris_cli.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/cmd_arguments.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/coding_pad.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/config.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/config_file.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/converters.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/converters_ui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/cooccurence.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/core_qrc.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/core_ui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/db_functions.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/dev.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/dialog.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/duration_widget.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/edit_event.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/edit_event_ui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/events_cursor.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/events_snapshots.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/exclusion_matrix.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/export_events.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/export_observation.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/external_processes.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/geometric_measurement.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/gui_utilities.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/image_overlay.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/import_observations.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/irr.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/latency.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/measurement_widget.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/media_file.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/menu_options.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/modifiers_coding_map.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/mpv-1.0.3.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/mpv.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/mpv2.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/observation.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/observation_operations.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/observation_ui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/observations_list.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/otx_parser.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/param_panel.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/param_panel_ui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/player_dock_widget.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/plot_data_module.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/plot_events.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/plot_events_rt.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/plot_spectrogram_rt.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/plot_waveform_rt.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/plugins.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/portion/__init__.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/portion/const.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/portion/dict.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/portion/func.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/portion/interval.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/portion/io.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/preferences.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/preferences_ui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/project.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/project_functions.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/project_import_export.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/project_ui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/qrc_boris.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/qrc_boris5.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/select_modifiers.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/select_observations.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/select_subj_behav.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/state_events.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/subjects_pad.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/synthetic_time_budget.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/time_budget_functions.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/time_budget_widget.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/transitions.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/utilities.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/video_equalizer.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/video_equalizer_ui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/video_operations.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/view_df.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris/view_df_ui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris_behav_obs.egg-info/dependency_links.txt +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris_behav_obs.egg-info/entry_points.txt +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris_behav_obs.egg-info/requires.txt +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/boris_behav_obs.egg-info/top_level.txt +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/setup.cfg +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/tests/test_db_functions.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/tests/test_export_observation.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/tests/test_irr.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/tests/test_observation_gui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/tests/test_otx_parser.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/tests/test_preferences_gui.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/tests/test_project_functions.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/tests/test_time_budget.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/tests/test_utilities.py +0 -0
- {boris_behav_obs-9.2.3 → boris_behav_obs-9.3.1}/tests/test_utilities2.py +0 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: boris-behav-obs
|
|
3
|
+
Version: 9.3.1
|
|
4
|
+
Summary: BORIS - Behavioral Observation Research Interactive Software
|
|
5
|
+
Author-email: Olivier Friard <olivier.friard@unito.it>
|
|
6
|
+
License-Expression: GPL-3.0-only
|
|
7
|
+
Project-URL: Homepage, http://www.boris.unito.it
|
|
8
|
+
Project-URL: Documentation, https://boris.readthedocs.io/en/latest/
|
|
9
|
+
Project-URL: Change_log, https://github.com/olivierfriard/BORIS/wiki/BORIS-change-log-v.8
|
|
10
|
+
Project-URL: Source_code, https://github.com/olivierfriard/BORIS
|
|
11
|
+
Project-URL: Issues, https://github.com/olivierfriard/BORIS/issues
|
|
12
|
+
Classifier: Topic :: Scientific/Engineering
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Intended Audience :: Education
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Topic :: Scientific/Engineering
|
|
18
|
+
Requires-Python: >=3.12
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
License-File: LICENSE.TXT
|
|
21
|
+
Requires-Dist: exifread>=3.0.0
|
|
22
|
+
Requires-Dist: numpy>=1.26.4
|
|
23
|
+
Requires-Dist: matplotlib>=3.3.3
|
|
24
|
+
Requires-Dist: pandas>=2.2.2
|
|
25
|
+
Requires-Dist: tablib[cli,html,ods,pandas,xls,xlsx]>=3
|
|
26
|
+
Requires-Dist: pyreadr
|
|
27
|
+
Requires-Dist: pyside6==6.8.0.2
|
|
28
|
+
Requires-Dist: hachoir>=3.3.0
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: ruff; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest; extra == "dev"
|
|
32
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
|
|
35
|
+
BORIS (Behavioral Observation Research Interactive Software)
|
|
36
|
+
===============================================================
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+

|
|
40
|
+
|
|
41
|
+
BORIS is an easy-to-use event logging software for video/audio coding or live observations.
|
|
42
|
+
|
|
43
|
+
BORIS is a free and open-source software available for GNU/Linux and Windows.
|
|
44
|
+
You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to run the last version of BORIS are available, see [BORIS on MacOS](https://www.boris.unito.it/download_mac).
|
|
45
|
+
|
|
46
|
+
It provides also some analysis tools like time budget and some plotting functions.
|
|
47
|
+
|
|
48
|
+
The BORIS paper has more than [ citations](https://www.boris.unito.it/citations) in peer-reviewed scientific publications.
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
See the official [BORIS web site](https://www.boris.unito.it).
|
|
54
|
+
|
|
55
|
+
[](https://www.python.org)
|
|
56
|
+

|
|
57
|
+

|
|
58
|
+
[](https://pepy.tech/project/boris-behav-obs)
|
|
59
|
+

|
|
60
|
+
[](https://pypi.org/project/boris-behav-obs/)
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# Documentation
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
The [user guide](https://www.boris.unito.it/user_guide/) provides a good starting point for learning how to use BORIS.
|
|
71
|
+
|
|
72
|
+
Some [video tutorials](https://www.boris.unito.it/video_tutorials/) are available.
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# Bug reports and feature requests
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
To search for bugs, report them or request a feature, please use the github tracker:
|
|
82
|
+
https://github.com/olivierfriard/BORIS/issues
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# Citing BORIS
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
Please acknowledge and cite the use of this software and its authors when
|
|
92
|
+
results are used in publications or published elsewhere. You can use the
|
|
93
|
+
following BibTex entry
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
@article {MEE3:MEE312584,
|
|
97
|
+
author = {Friard, Olivier and Gamba, Marco},
|
|
98
|
+
title = {BORIS: a free, versatile open-source event-logging software for video/audio coding and live observations},
|
|
99
|
+
journal = {Methods in Ecology and Evolution},
|
|
100
|
+
issn = {2041-210X},
|
|
101
|
+
url = {http://dx.doi.org/10.1111/2041-210X.12584},
|
|
102
|
+
doi = {10.1111/2041-210X.12584},
|
|
103
|
+
pages = {1324--1330},
|
|
104
|
+
year = {2016},
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
You can also send us a nice postcard! See the [user testimonials](https://www.boris.unito.it/postcards).
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# Licence
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
This program is distributed in the hope that it will be useful,
|
|
121
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
122
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
123
|
+
GNU General Public License for more details.
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
Distributed with a [GPL v.3 license](LICENSE.TXT).
|
|
127
|
+
|
|
128
|
+
Copyright (C) 2012-2024 Olivier Friard
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from PIL import Image, ImageDraw, ImageFont
|
|
3
|
+
import mpv
|
|
4
|
+
|
|
5
|
+
player = mpv.MPV()
|
|
6
|
+
|
|
7
|
+
player.loop = True
|
|
8
|
+
player.play('/home/olivier/gdrive_sync/src/python/generate_video_test/video1.mp4')
|
|
9
|
+
player.wait_until_playing()
|
|
10
|
+
|
|
11
|
+
font = ImageFont.truetype('DejaVuSans.ttf', 40)
|
|
12
|
+
|
|
13
|
+
overlay = player.create_image_overlay()
|
|
14
|
+
|
|
15
|
+
img = Image.new('RGBA', (400, 150), (255, 255, 255, 0))
|
|
16
|
+
d = ImageDraw.Draw(img)
|
|
17
|
+
d.text((10, 10), 'Hello World', font=font, fill=(0, 255, 255, 128))
|
|
18
|
+
#d.text((10, 60), f't={ts:.3f}', font=font, fill=(255, 0, 255, 255))
|
|
19
|
+
|
|
20
|
+
pos = 100
|
|
21
|
+
|
|
22
|
+
overlay.update(img, pos=(2*pos, pos))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
while not player.core_idle:
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
'''
|
|
30
|
+
for pos in range(0, 500, 5):
|
|
31
|
+
ts = player.time_pos
|
|
32
|
+
if ts is None:
|
|
33
|
+
break
|
|
34
|
+
|
|
35
|
+
img = Image.new('RGBA', (400, 150), (255, 255, 255, 0))
|
|
36
|
+
d = ImageDraw.Draw(img)
|
|
37
|
+
d.text((10, 10), 'Hello World', font=font, fill=(0, 255, 255, 128))
|
|
38
|
+
d.text((10, 60), f't={ts:.3f}', font=font, fill=(255, 0, 255, 255))
|
|
39
|
+
|
|
40
|
+
overlay.update(img, pos=(2*pos, pos))
|
|
41
|
+
time.sleep(0.05)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
overlay.remove()
|
|
45
|
+
'''
|
|
@@ -114,14 +114,14 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
114
114
|
self.openMapAction.setStatusTip("Open a behaviors coding map")
|
|
115
115
|
self.openMapAction.triggered.connect(self.openMap)
|
|
116
116
|
|
|
117
|
-
self.saveMapAction = QAction(QIcon(), "&Save the
|
|
117
|
+
self.saveMapAction = QAction(QIcon(), "&Save the behavior coding map", self)
|
|
118
118
|
self.saveMapAction.setShortcut("Ctrl+S")
|
|
119
|
-
self.saveMapAction.setStatusTip("Save the
|
|
119
|
+
self.saveMapAction.setStatusTip("Save the behavior coding map")
|
|
120
120
|
self.saveMapAction.setEnabled(False)
|
|
121
121
|
self.saveMapAction.triggered.connect(self.saveMap_clicked)
|
|
122
122
|
|
|
123
|
-
self.saveAsMapAction = QAction(QIcon(), "Save the
|
|
124
|
-
self.saveAsMapAction.setStatusTip("Save the
|
|
123
|
+
self.saveAsMapAction = QAction(QIcon(), "Save the behavior coding map as ...", self)
|
|
124
|
+
self.saveAsMapAction.setStatusTip("Save the behavior coding map as ...")
|
|
125
125
|
self.saveAsMapAction.setEnabled(False)
|
|
126
126
|
self.saveAsMapAction.triggered.connect(self.saveAsMap_clicked)
|
|
127
127
|
|
|
@@ -131,6 +131,11 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
131
131
|
self.mapNameAction.setEnabled(False)
|
|
132
132
|
self.mapNameAction.triggered.connect(self.mapName_clicked)
|
|
133
133
|
|
|
134
|
+
self.resizeAction = QAction(QIcon(), "Resize the image", self)
|
|
135
|
+
self.resizeAction.setStatusTip("Resize the image")
|
|
136
|
+
self.resizeAction.setEnabled(False)
|
|
137
|
+
self.resizeAction.triggered.connect(self.resize_clicked)
|
|
138
|
+
|
|
134
139
|
self.addToProject = QAction(QIcon(), "Add coding map to project", self)
|
|
135
140
|
self.addToProject.setStatusTip("Add coding map to project")
|
|
136
141
|
self.addToProject.setEnabled(False)
|
|
@@ -149,16 +154,13 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
149
154
|
fileMenu.addSeparator()
|
|
150
155
|
fileMenu.addAction(self.mapNameAction)
|
|
151
156
|
fileMenu.addSeparator()
|
|
157
|
+
fileMenu.addAction(self.resizeAction)
|
|
158
|
+
fileMenu.addSeparator()
|
|
152
159
|
fileMenu.addAction(self.addToProject)
|
|
153
160
|
fileMenu.addSeparator()
|
|
154
161
|
fileMenu.addAction(self.exitAction)
|
|
155
162
|
|
|
156
163
|
splitter1 = QSplitter(Qt.Vertical)
|
|
157
|
-
"""
|
|
158
|
-
splitter1.addWidget(splitter1)
|
|
159
|
-
splitter1.addWidget(bottom)
|
|
160
|
-
"""
|
|
161
|
-
"""vlayout_list = QVBoxLayout()"""
|
|
162
164
|
|
|
163
165
|
self.view = self.View(self)
|
|
164
166
|
self.view.mousePress.connect(self.viewMousePressEvent)
|
|
@@ -168,7 +170,6 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
168
170
|
vlayout_list.addWidget(QLabel("Defined area"))
|
|
169
171
|
|
|
170
172
|
self.area_list = QListWidget(self)
|
|
171
|
-
# self.area_list.setMaximumHeight(120)
|
|
172
173
|
self.area_list.itemClicked.connect(self.area_list_item_click)
|
|
173
174
|
vlayout_list.addWidget(self.area_list)
|
|
174
175
|
w = QWidget()
|
|
@@ -177,10 +178,6 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
177
178
|
splitter1.setSizes([300, 100])
|
|
178
179
|
splitter1.setStretchFactor(2, 8)
|
|
179
180
|
|
|
180
|
-
self.btLoad = QPushButton("Load bitmap", self)
|
|
181
|
-
self.btLoad.clicked.connect(self.loadBitmap)
|
|
182
|
-
self.btLoad.setVisible(False)
|
|
183
|
-
|
|
184
181
|
hlayout_cmd = QHBoxLayout()
|
|
185
182
|
|
|
186
183
|
self.btNewArea = QPushButton("New behavior area", self)
|
|
@@ -249,16 +246,9 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
249
246
|
frame.setLayout(vlayout_frame)
|
|
250
247
|
|
|
251
248
|
vlayout = QVBoxLayout()
|
|
252
|
-
"""
|
|
253
|
-
vlayout.addWidget(self.view)
|
|
254
|
-
vlayout.addWidget(QLabel("Defined area"))
|
|
255
|
-
vlayout.addWidget(self.area_list)
|
|
256
|
-
"""
|
|
257
|
-
vlayout.addWidget(splitter1)
|
|
258
|
-
"""vlayout.addLayout(vlayout_view_list)"""
|
|
259
249
|
|
|
250
|
+
vlayout.addWidget(splitter1)
|
|
260
251
|
vlayout.addWidget(frame)
|
|
261
|
-
vlayout.addWidget(self.btLoad)
|
|
262
252
|
|
|
263
253
|
main_widget = QWidget(self)
|
|
264
254
|
main_widget.setLayout(vlayout)
|
|
@@ -305,19 +295,21 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
305
295
|
|
|
306
296
|
self.selectedPolygon.setPen(QPen(QColor(255, 0, 0, 255), 2, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
|
|
307
297
|
|
|
308
|
-
self.lb.setVisible(True)
|
|
309
298
|
self.leAreaCode.setText(ac)
|
|
310
|
-
self.leAreaCode.setVisible(True)
|
|
311
|
-
self.btEditAreaCode.setVisible(True)
|
|
312
299
|
|
|
313
|
-
|
|
300
|
+
for widget in (
|
|
301
|
+
self.lb,
|
|
302
|
+
self.leAreaCode,
|
|
303
|
+
self.btEditAreaCode,
|
|
304
|
+
self.btDeleteArea,
|
|
305
|
+
self.btColor,
|
|
306
|
+
self.slAlpha,
|
|
307
|
+
):
|
|
308
|
+
widget.setVisible(True)
|
|
314
309
|
|
|
315
310
|
self.areaColor = self.selectedPolygon.brush().color()
|
|
316
311
|
self.btColor.setStyleSheet(f"QWidget {{background-color:{self.selectedPolygon.brush().color().name()}}}")
|
|
317
|
-
self.
|
|
318
|
-
|
|
319
|
-
self.slAlpha.setValue(int(self.selectedPolygon.brush().color().alpha() / 255 * 100))
|
|
320
|
-
self.slAlpha.setVisible(True)
|
|
312
|
+
self.slAlpha.setValue(int(self.areaColor.alpha() / 255 * 100))
|
|
321
313
|
|
|
322
314
|
def edit_area_code(self):
|
|
323
315
|
"""
|
|
@@ -369,9 +361,7 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
369
361
|
cd.setWindowFlags(Qt.WindowStaysOnTopHint)
|
|
370
362
|
cd.setOptions(QColorDialog.DontUseNativeDialog)
|
|
371
363
|
|
|
372
|
-
|
|
373
|
-
# if col.isValid():
|
|
374
|
-
if cd.exec_():
|
|
364
|
+
if cd.exec():
|
|
375
365
|
self.areaColor = cd.currentColor()
|
|
376
366
|
self.btColor.setStyleSheet(f"QWidget {{background-color:{self.areaColor.name()}}}")
|
|
377
367
|
self.areaColor.setAlpha(int(self.slAlpha.value() / 100 * 255))
|
|
@@ -440,30 +430,29 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
440
430
|
self.selectedPolygon = None
|
|
441
431
|
self.selectedPolygonMemBrush = None
|
|
442
432
|
|
|
433
|
+
print(self.polygonsList2)
|
|
434
|
+
idx = 0
|
|
443
435
|
for areaCode, pg in self.polygonsList2:
|
|
444
436
|
if pg.contains(test):
|
|
445
437
|
self.selectedPolygon = pg
|
|
446
|
-
|
|
447
438
|
self.selectedPolygonMemBrush = self.selectedPolygon.brush()
|
|
448
|
-
|
|
449
439
|
self.selectedPolygon.setPen(QPen(QColor(255, 0, 0, 255), 2, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
|
|
450
|
-
|
|
451
|
-
self.lb.setVisible(True)
|
|
452
440
|
self.leAreaCode.setText(areaCode)
|
|
453
|
-
self.leAreaCode.setVisible(True)
|
|
454
|
-
# self.leAreaCode.setEnabled(False)
|
|
455
|
-
self.btEditAreaCode.setVisible(True)
|
|
456
441
|
|
|
457
|
-
self.btDeleteArea
|
|
442
|
+
for widget in (self.lb, self.leAreaCode, self.btEditAreaCode, self.btColor, self.slAlpha, self.btDeleteArea):
|
|
443
|
+
widget.setVisible(True)
|
|
458
444
|
|
|
459
445
|
self.areaColor = self.selectedPolygon.brush().color()
|
|
460
446
|
self.btColor.setStyleSheet(f"QWidget {{background-color:{self.selectedPolygon.brush().color().name()}}}")
|
|
461
|
-
self.btColor.setVisible(True)
|
|
462
447
|
|
|
463
|
-
self.slAlpha.setValue(int(self.
|
|
464
|
-
|
|
448
|
+
self.slAlpha.setValue(int(self.areaColor.alpha() / 255 * 100))
|
|
449
|
+
|
|
450
|
+
# select area in list widget
|
|
451
|
+
item = self.area_list.item(idx)
|
|
452
|
+
self.area_list.setCurrentItem(item)
|
|
465
453
|
|
|
466
454
|
break
|
|
455
|
+
idx += 1
|
|
467
456
|
|
|
468
457
|
if not self.selectedPolygon:
|
|
469
458
|
self.leAreaCode.setVisible(False)
|
|
@@ -489,6 +478,20 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
489
478
|
self.view.scene().removeItem(self.view.elList[-1])
|
|
490
479
|
self.view.elList = self.view.elList[0:-1]
|
|
491
480
|
|
|
481
|
+
# middle button automatically close the polygon
|
|
482
|
+
if (event.buttons() & Qt.MiddleButton) and not self.closedPolygon:
|
|
483
|
+
line = QGraphicsLineItem(QLineF(self.view._start, QPoint(self.view.points[0][0], self.view.points[0][1])))
|
|
484
|
+
line.setPen(QPen(designColor, penWidth, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
|
|
485
|
+
|
|
486
|
+
self.view.scene().addItem(line)
|
|
487
|
+
self.view.elList.append(line)
|
|
488
|
+
|
|
489
|
+
self.statusBar().showMessage("Area completed")
|
|
490
|
+
|
|
491
|
+
# create polygon
|
|
492
|
+
add_polygon()
|
|
493
|
+
return
|
|
494
|
+
|
|
492
495
|
# add line item
|
|
493
496
|
if event.buttons() == Qt.LeftButton and not self.closedPolygon:
|
|
494
497
|
if self.view._start:
|
|
@@ -642,9 +645,6 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
642
645
|
|
|
643
646
|
self.loadBitmap()
|
|
644
647
|
|
|
645
|
-
# self.btLoad.setVisible(True)
|
|
646
|
-
# self.statusBar().showMessage('Click "Load bitmap" button to select and load a bitmap into the viewer')
|
|
647
|
-
|
|
648
648
|
def openMap(self):
|
|
649
649
|
"""
|
|
650
650
|
open a coding map from file
|
|
@@ -667,7 +667,7 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
667
667
|
)
|
|
668
668
|
|
|
669
669
|
if not fileName:
|
|
670
|
-
|
|
670
|
+
return
|
|
671
671
|
try:
|
|
672
672
|
self.codingMap = json.loads(open(fileName, "r").read())
|
|
673
673
|
except Exception:
|
|
@@ -676,6 +676,7 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
676
676
|
|
|
677
677
|
if "coding_map_type" not in self.codingMap or self.codingMap["coding_map_type"] != "BORIS behaviors coding map":
|
|
678
678
|
QMessageBox.critical(self, cfg.programName, f"The file {fileName} is not a BORIS behaviors coding map.")
|
|
679
|
+
return
|
|
679
680
|
|
|
680
681
|
self.cancelMap()
|
|
681
682
|
|
|
@@ -707,7 +708,6 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
707
708
|
newPolygon.append(QPoint(p[0], p[1]))
|
|
708
709
|
|
|
709
710
|
# draw polygon
|
|
710
|
-
"""polygon = QGraphicsPolygonItem(None, None) if QT_VERSION_STR[0] == "4" else QGraphicsPolygonItem()"""
|
|
711
711
|
polygon = QGraphicsPolygonItem()
|
|
712
712
|
polygon.setPolygon(newPolygon)
|
|
713
713
|
clr = QColor()
|
|
@@ -720,12 +720,15 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
720
720
|
self.polygonsList2.append([areaCode, polygon])
|
|
721
721
|
|
|
722
722
|
self.btNewArea.setVisible(True)
|
|
723
|
-
self.btLoad.setVisible(False)
|
|
724
723
|
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
724
|
+
for action in (
|
|
725
|
+
self.saveMapAction,
|
|
726
|
+
self.saveAsMapAction,
|
|
727
|
+
self.addToProject,
|
|
728
|
+
self.mapNameAction,
|
|
729
|
+
self.resizeAction,
|
|
730
|
+
):
|
|
731
|
+
action.setEnabled(True)
|
|
729
732
|
|
|
730
733
|
self.update_area_list()
|
|
731
734
|
|
|
@@ -811,7 +814,7 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
811
814
|
|
|
812
815
|
def newArea(self):
|
|
813
816
|
if not self.bitmapFileName:
|
|
814
|
-
QMessageBox.critical(self, cfg.programName, "
|
|
817
|
+
QMessageBox.critical(self, cfg.programName, "An image must be loaded before to define areas")
|
|
815
818
|
return
|
|
816
819
|
|
|
817
820
|
if self.selectedPolygon:
|
|
@@ -832,7 +835,7 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
832
835
|
self.btDeleteArea.setVisible(False)
|
|
833
836
|
|
|
834
837
|
self.statusBar().showMessage(
|
|
835
|
-
("Click on bitmap to set the vertices of the area with the mouse
|
|
838
|
+
("Click on bitmap to set the vertices of the area with the mouse (right click will cancel the last point)")
|
|
836
839
|
)
|
|
837
840
|
|
|
838
841
|
def saveArea(self):
|
|
@@ -840,7 +843,7 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
840
843
|
QMessageBox.critical(
|
|
841
844
|
self,
|
|
842
845
|
cfg.programName,
|
|
843
|
-
("You must close your area before saving it.\
|
|
846
|
+
("You must close your area before saving it.\nThe last vertex must correspond to the first one."),
|
|
844
847
|
)
|
|
845
848
|
|
|
846
849
|
if len(self.view.points) < 3:
|
|
@@ -858,14 +861,15 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
858
861
|
|
|
859
862
|
# draw polygon
|
|
860
863
|
self.closedPolygon.setBrush(QBrush(self.areaColor, Qt.SolidPattern))
|
|
861
|
-
# self.polygonsList2[self.leAreaCode.text()] = self.closedPolygon
|
|
862
864
|
self.polygonsList2.append([self.leAreaCode.text(), self.closedPolygon])
|
|
863
865
|
|
|
864
|
-
self.
|
|
866
|
+
self.flagNewArea = None
|
|
867
|
+
self.closedPolygon = None
|
|
865
868
|
self.view._start = 0
|
|
866
|
-
self.view.points
|
|
869
|
+
self.view.points = []
|
|
870
|
+
self.view.elList = []
|
|
867
871
|
|
|
868
|
-
for widget in
|
|
872
|
+
for widget in (
|
|
869
873
|
self.btSaveArea,
|
|
870
874
|
self.btCancelAreaCreation,
|
|
871
875
|
self.lb,
|
|
@@ -875,18 +879,18 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
875
879
|
self.slAlpha,
|
|
876
880
|
self.btDeleteArea,
|
|
877
881
|
self.btNewArea,
|
|
878
|
-
|
|
882
|
+
):
|
|
879
883
|
widget.setVisible(False)
|
|
880
884
|
|
|
881
885
|
self.btNewArea.setVisible(True)
|
|
882
886
|
|
|
883
887
|
self.leAreaCode.setText("")
|
|
884
888
|
|
|
889
|
+
self.update_area_list()
|
|
890
|
+
|
|
885
891
|
self.flag_map_changed = True
|
|
886
892
|
self.statusBar().showMessage("New area saved", 5000)
|
|
887
893
|
|
|
888
|
-
self.update_area_list()
|
|
889
|
-
|
|
890
894
|
def cancelAreaCreation(self):
|
|
891
895
|
if self.closedPolygon:
|
|
892
896
|
self.view.scene().removeItem(self.closedPolygon)
|
|
@@ -945,18 +949,15 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
945
949
|
self.view._start = 0
|
|
946
950
|
self.view.points = []
|
|
947
951
|
self.flagNewArea = False
|
|
948
|
-
self.btSaveArea.setVisible(False)
|
|
949
|
-
self.lb.setVisible(False)
|
|
950
952
|
|
|
951
|
-
self.btColor.
|
|
952
|
-
|
|
953
|
+
for widget in (self.btSaveArea, self.lb, self.btColor, self.slAlpha, self.leAreaCode, self.btDeleteArea):
|
|
954
|
+
widget.setVisible(False)
|
|
955
|
+
|
|
953
956
|
self.btNewArea.setVisible(True)
|
|
954
957
|
|
|
955
|
-
self.leAreaCode.setVisible(False)
|
|
956
958
|
self.leAreaCode.setText("")
|
|
957
959
|
self.btEditAreaCode.setVisible(False)
|
|
958
960
|
|
|
959
|
-
self.btDeleteArea.setVisible(False)
|
|
960
961
|
self.statusBar().showMessage("")
|
|
961
962
|
|
|
962
963
|
self.update_area_list()
|
|
@@ -967,16 +968,22 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
967
968
|
"""
|
|
968
969
|
self.flagNewArea = False
|
|
969
970
|
self.polygonsList2 = []
|
|
971
|
+
self.closedPolygon = None
|
|
972
|
+
self.selectedPolygon = None
|
|
973
|
+
self.area_list.clear()
|
|
970
974
|
self.view.scene().clear()
|
|
971
|
-
self.btLoad.setVisible(False)
|
|
972
975
|
self.btDeleteArea.setVisible(False)
|
|
973
976
|
self.btNewArea.setVisible(False)
|
|
974
977
|
self.saveMapAction.setEnabled(False)
|
|
975
978
|
self.saveAsMapAction.setEnabled(False)
|
|
976
979
|
self.addToProject.setEnabled(False)
|
|
977
980
|
self.mapNameAction.setEnabled(False)
|
|
981
|
+
self.resizeAction.setEnabled(False)
|
|
978
982
|
self.statusBar().showMessage("")
|
|
979
983
|
|
|
984
|
+
self.btNewArea.setVisible(True)
|
|
985
|
+
self.btNewArea.setEnabled(True)
|
|
986
|
+
|
|
980
987
|
self.flag_map_changed = False
|
|
981
988
|
|
|
982
989
|
def loadBitmap(self):
|
|
@@ -1017,16 +1024,59 @@ class BehaviorsMapCreatorWindow(QMainWindow):
|
|
|
1017
1024
|
|
|
1018
1025
|
self.btNewArea.setVisible(True)
|
|
1019
1026
|
|
|
1020
|
-
self.btLoad.setVisible(False)
|
|
1021
1027
|
self.saveMapAction.setEnabled(True)
|
|
1022
1028
|
self.saveAsMapAction.setEnabled(True)
|
|
1023
1029
|
self.addToProject.setEnabled(True)
|
|
1024
1030
|
self.mapNameAction.setEnabled(True)
|
|
1031
|
+
self.resizeAction.setEnabled(True)
|
|
1025
1032
|
|
|
1026
1033
|
self.statusBar().showMessage("""Click "New behavior area" to create a new behavior area""")
|
|
1027
1034
|
|
|
1028
1035
|
self.flag_map_changed = True
|
|
1029
1036
|
|
|
1037
|
+
def resize_clicked(self):
|
|
1038
|
+
"""
|
|
1039
|
+
resize the bitmap
|
|
1040
|
+
"""
|
|
1041
|
+
|
|
1042
|
+
if self.polygonsList2:
|
|
1043
|
+
if (
|
|
1044
|
+
dialog.MessageDialog(
|
|
1045
|
+
"BORIS - Behaviors map creator",
|
|
1046
|
+
"The map contains modifiers. Erase all modifiers",
|
|
1047
|
+
(cfg.NO, cfg.YES),
|
|
1048
|
+
)
|
|
1049
|
+
== cfg.NO
|
|
1050
|
+
):
|
|
1051
|
+
return
|
|
1052
|
+
|
|
1053
|
+
integer, ok = QInputDialog.getInt(
|
|
1054
|
+
self, "Resize image", "New horizontal size (in pixels)", value=self.pixmap.size().width(), minValue=100, maxValue=3048, step=10
|
|
1055
|
+
)
|
|
1056
|
+
if not ok:
|
|
1057
|
+
return
|
|
1058
|
+
|
|
1059
|
+
self.cancelMap()
|
|
1060
|
+
|
|
1061
|
+
h = int(self.pixmap.size().width() / (self.pixmap.size().width() / integer))
|
|
1062
|
+
|
|
1063
|
+
self.pixmap = self.pixmap.scaled(integer, h, Qt.KeepAspectRatio)
|
|
1064
|
+
|
|
1065
|
+
self.view.scene().clear()
|
|
1066
|
+
self.view.setSceneRect(0, 0, self.pixmap.size().width(), self.pixmap.size().height())
|
|
1067
|
+
pixitem = QGraphicsPixmapItem(self.pixmap)
|
|
1068
|
+
pixitem.setPos(0, 0)
|
|
1069
|
+
self.view.scene().addItem(pixitem)
|
|
1070
|
+
|
|
1071
|
+
QMessageBox.information(
|
|
1072
|
+
self,
|
|
1073
|
+
cfg.programName,
|
|
1074
|
+
(
|
|
1075
|
+
f"The bitmap was resized to {self.pixmap.size().width()}x{self.pixmap.size().height()} pixels\n"
|
|
1076
|
+
"The original file was not modified"
|
|
1077
|
+
),
|
|
1078
|
+
)
|
|
1079
|
+
|
|
1030
1080
|
|
|
1031
1081
|
def behaviors_coding_map_creator(self):
|
|
1032
1082
|
"""
|
|
@@ -1034,7 +1084,9 @@ def behaviors_coding_map_creator(self):
|
|
|
1034
1084
|
"""
|
|
1035
1085
|
|
|
1036
1086
|
if not self.project:
|
|
1037
|
-
QMessageBox.warning(
|
|
1087
|
+
QMessageBox.warning(
|
|
1088
|
+
self, cfg.programName, "Create or open a project first", QMessageBox.Ok | QMessageBox.Default, QMessageBox.NoButton
|
|
1089
|
+
)
|
|
1038
1090
|
return
|
|
1039
1091
|
|
|
1040
1092
|
codes_list = [self.pj[cfg.ETHOGRAM][key][cfg.BEHAVIOR_CODE] for key in self.pj[cfg.ETHOGRAM]]
|
|
@@ -1053,6 +1105,11 @@ if __name__ == "__main__":
|
|
|
1053
1105
|
|
|
1054
1106
|
app = QApplication(sys.argv)
|
|
1055
1107
|
window = BehaviorsMapCreatorWindow(["North zone", "East zone", "South zone", "West zone"])
|
|
1108
|
+
window.bcm_list = []
|
|
1056
1109
|
window.resize(cfg.CODING_MAP_RESIZE_W, cfg.CODING_MAP_RESIZE_H)
|
|
1110
|
+
screen_geometry = app.primaryScreen().geometry()
|
|
1111
|
+
center_x = (screen_geometry.width() - window.width()) // 2
|
|
1112
|
+
center_y = (screen_geometry.height() - window.height()) // 2
|
|
1113
|
+
window.move(center_x, center_y)
|
|
1057
1114
|
window.show()
|
|
1058
|
-
sys.exit(app.
|
|
1115
|
+
sys.exit(app.exec())
|
|
@@ -20,6 +20,9 @@ This file is part of BORIS.
|
|
|
20
20
|
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
+
import json
|
|
24
|
+
import binascii
|
|
25
|
+
|
|
23
26
|
from PySide6.QtGui import QMouseEvent, QPixmap, QPolygonF, QColor, QBrush, QPen
|
|
24
27
|
from PySide6.QtCore import Qt, Signal, QEvent, QPoint
|
|
25
28
|
from PySide6.QtWidgets import (
|
|
@@ -38,12 +41,10 @@ from PySide6.QtWidgets import (
|
|
|
38
41
|
QApplication,
|
|
39
42
|
)
|
|
40
43
|
|
|
41
|
-
import json
|
|
42
|
-
import binascii
|
|
43
44
|
from . import config as cfg
|
|
44
45
|
|
|
45
|
-
codeSeparator = ","
|
|
46
|
-
penWidth = 0
|
|
46
|
+
codeSeparator: str = ","
|
|
47
|
+
penWidth: int = 0
|
|
47
48
|
penStyle = Qt.NoPen
|
|
48
49
|
|
|
49
50
|
|