Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
73d794dfb8 | ||
|
|
dd77c548d2 | ||
|
|
022afabd30 | ||
|
|
ce17123325 | ||
|
|
f2346df4e5 | ||
|
|
94c659ba6d | ||
|
|
9c0298bad0 | ||
|
|
602b21fe9d | ||
|
|
30803fc017 | ||
|
|
749eceefc4 | ||
|
|
57f6f0fbef | ||
|
|
e061617c34 | ||
|
|
eb09ecd7c7 | ||
|
|
06a1542613 | ||
|
|
82a8f2ae89 | ||
|
|
7d0fe9cb85 | ||
|
|
1af876ac8f | ||
|
|
718a28c0da | ||
|
|
a2a375cb5c | ||
|
|
466d8d6c86 | ||
|
|
e77b3dcf4d | ||
|
|
b6d1eef2a1 | ||
|
|
20cb5fdde5 | ||
|
|
2f574e8c03 | ||
|
|
9d8531a85b | ||
|
|
fee122cf33 | ||
|
|
f42ed06d4f | ||
|
|
a8126f0bed | ||
|
|
2c4685f594 | ||
|
|
8b0f98d25b | ||
|
|
dd2e6e8603 | ||
|
|
a0f4818e26 | ||
|
|
af23c10566 | ||
|
|
d7096dad80 | ||
|
|
1d2b1f0307 | ||
|
|
9945b43713 | ||
|
|
4124e1dd4e | ||
|
|
d86b5584fb | ||
|
|
1c01e981e0 | ||
|
|
8a6ddf677c | ||
|
|
5d4481dbb0 | ||
|
|
786770cff2 | ||
|
|
572b573d2f | ||
|
|
15bd870140 | ||
|
|
b101d1992d | ||
|
|
b013204f88 | ||
|
|
b3c5353dd6 | ||
|
|
0ecf536cda | ||
|
|
f2124615ba | ||
|
|
49ade9d9c6 | ||
|
|
045312921e | ||
|
|
39f58b9e03 | ||
|
|
a0467b8d8e | ||
|
|
4945156d9a | ||
|
|
97b2de46ac | ||
|
|
e8d7281626 | ||
|
|
979da8b170 | ||
|
|
ac4a913be3 | ||
|
|
31a30f380f | ||
|
|
87dacfbf76 | ||
|
|
b02895e5fc | ||
|
|
486ac60ea0 | ||
|
|
a3b6507a15 | ||
|
|
75bc15f071 | ||
|
|
0b9280a8df | ||
|
|
677656f669 | ||
|
|
a8ab8b2314 | ||
|
|
62bb262b96 | ||
|
|
8463206f8e | ||
|
|
1cf6f8d31b | ||
|
|
a0bd4a6812 | ||
|
|
efc907fb0c | ||
|
|
be0903de9e | ||
|
|
20361971da | ||
|
|
cefa78270a | ||
|
|
1f5eb1790b | ||
|
|
84335d0032 | ||
|
|
cb74f8e302 | ||
|
|
78bd21b197 | ||
|
|
24bba6d24c | ||
|
|
0edddbb0c2 | ||
|
|
a11af0845b | ||
|
|
3b71bce0b0 | ||
|
|
434ff5e346 | ||
|
|
f7239fc9a9 | ||
|
|
7e13611bc5 | ||
|
|
78feab8949 | ||
|
|
f692e5a127 | ||
|
|
fbd843cb54 | ||
|
|
e4c7e5abeb | ||
|
|
8d521c1b1f | ||
|
|
1be7fce116 | ||
|
|
5ab81dc732 | ||
|
|
72e0d87f77 | ||
|
|
923e8caf84 | ||
|
|
e8d47ffca1 | ||
|
|
2c32d093d0 | ||
|
|
ba6d7ac3f5 | ||
|
|
64ea5e341c | ||
|
|
a0ea0d8ca0 | ||
|
|
29404babcf | ||
|
|
3b1fd091f1 | ||
|
|
cd7d5be748 | ||
|
|
97e368312e | ||
|
|
28af77fcfc | ||
|
|
3ed6e2dd7d | ||
|
|
4c00c3209b | ||
|
|
c656eae2f3 | ||
|
|
456dc28c1b | ||
|
|
238204d280 | ||
|
|
55aec445b1 | ||
|
|
7f622927ff | ||
|
|
8384a10c2d | ||
|
|
619fa0c968 | ||
|
|
1fab46e67f | ||
|
|
727ec3fe46 | ||
|
|
a0e4ffdb5c | ||
|
|
9b8a66e3da | ||
|
|
9944cf3adf | ||
|
|
286079fe68 | ||
|
|
d492b04402 | ||
|
|
818409f675 | ||
|
|
9dd131142e | ||
|
|
f828d11f40 | ||
|
|
532639b820 | ||
|
|
0865a58632 | ||
|
|
0eb0e160e9 | ||
|
|
7126431f9f | ||
|
|
5a8baeff4c | ||
|
|
a2801aff41 | ||
|
|
76432120c4 | ||
|
|
3ce741ac2b | ||
|
|
ce1456cb92 | ||
|
|
f8cd3451ea | ||
|
|
cb84ca87c6 | ||
|
|
e1995f9d1b | ||
|
|
7f0b1489a2 | ||
|
|
aa2019be02 | ||
|
|
1ac78b5b82 | ||
|
|
847a3d5eec | ||
|
|
1a208ddd25 | ||
|
|
07c53e9a3d | ||
|
|
b600f5029e | ||
|
|
5f767f3fee | ||
|
|
8db7892f8c | ||
|
|
b325bf4bff | ||
|
|
5d355e9892 | ||
|
|
3b20a811cb | ||
|
|
73cc441edb | ||
|
|
7770a88aa0 | ||
|
|
f06caa32bc | ||
|
|
fb8198fe8f | ||
|
|
3dad15ac11 | ||
|
|
790fcfa66a | ||
|
|
d108d7c163 | ||
|
|
7ce3721b48 | ||
|
|
d0bfbcb4d1 | ||
|
|
2aadc75f2c | ||
|
|
8bf42c7d2d | ||
|
|
de13c01673 | ||
|
|
ca96ee2fce | ||
|
|
68f626f1ef | ||
|
|
570fac30c5 | ||
|
|
1f0be98649 | ||
|
|
e91590feec | ||
|
|
597b6d682f | ||
|
|
9c8d41efb8 | ||
|
|
a06e01c6de | ||
|
|
186c46f52c | ||
|
|
7679b8b47d | ||
|
|
c14f1cf473 | ||
|
|
6ce8336c26 | ||
|
|
c46b249c8c | ||
|
|
67008b67d8 | ||
|
|
9c1beef6b6 | ||
|
|
5eb7a143fa | ||
|
|
fc04059d86 | ||
|
|
0082f0502a | ||
|
|
e7dc4bb609 | ||
|
|
fb86e4bcef | ||
|
|
632908f59a | ||
|
|
4a7fa12eaa | ||
|
|
109fcf19c1 | ||
|
|
3229da030b | ||
|
|
4b052fa66d | ||
|
|
3c6ebd09bd | ||
|
|
af1b84afe2 | ||
|
|
45dbd7db5a | ||
|
|
a7699d6546 | ||
|
|
55c83cb026 | ||
|
|
deb211bdb7 | ||
|
|
8a5e5c3fb4 | ||
|
|
2a1640f7dc | ||
|
|
535aac8144 | ||
|
|
00cc5ee44e | ||
|
|
f0b882b576 | ||
|
|
8ed45aecfb | ||
|
|
77605e8701 | ||
|
|
b4c8242133 | ||
|
|
06e01e5ac8 | ||
|
|
ff22c32c24 | ||
|
|
95eb999493 | ||
|
|
7d729a8e9e | ||
|
|
c750a3cd88 | ||
|
|
adf6e03bc9 | ||
|
|
0466ce947f | ||
|
|
7abb670f66 | ||
|
|
55d7a8a254 | ||
|
|
e051455e23 | ||
|
|
4b5b97bbb2 | ||
|
|
1573508f75 | ||
|
|
018b0d8b9d | ||
|
|
47d7fa46d8 | ||
|
|
21e5400ff3 | ||
|
|
bb77e0f413 | ||
|
|
c5851a3569 | ||
|
|
93f27f61e7 | ||
|
|
7d40e07dfb | ||
|
|
5ab71de988 | ||
|
|
d7254472f0 | ||
|
|
245542ce4d | ||
|
|
31891d0970 | ||
|
|
3cc9ec157e | ||
|
|
9aa00fac15 | ||
|
|
2a2ba8c6aa | ||
|
|
db4cbe66c1 | ||
|
|
087dab5ed1 | ||
|
|
69c32e5c0d | ||
|
|
14ad697565 | ||
|
|
d2a6b07e0c | ||
|
|
853b141153 | ||
|
|
12a6b49f97 | ||
|
|
06c1d00f22 | ||
|
|
8c0d7a3904 | ||
|
|
9b5590047d | ||
|
|
46d9e3c119 | ||
|
|
bb7c9adbb8 | ||
|
|
5f4ef05c6e | ||
|
|
5bbbff2550 | ||
|
|
8f637c52cd | ||
|
|
f826e7641c | ||
|
|
400067c364 | ||
|
|
92311b65fb | ||
|
|
05ecf8bcb6 | ||
|
|
1f991302e5 | ||
|
|
f3f0532f74 | ||
|
|
3a9e5728c6 | ||
|
|
2a97b62603 | ||
|
|
64146f5afa | ||
|
|
e52130b627 | ||
|
|
a2583944d9 | ||
|
|
4c6c149d4a | ||
|
|
9835ee9dbe | ||
|
|
755d0520a6 | ||
|
|
08c55218fa | ||
|
|
352bff564c | ||
|
|
313a51219a | ||
|
|
c2d2884794 | ||
|
|
32a47bcee0 | ||
|
|
b5890437de | ||
|
|
b0af924cfc | ||
|
|
915d445561 | ||
|
|
070264647f | ||
|
|
ab1f58c2cc | ||
|
|
d6bc72c3c1 | ||
|
|
4e2aec6c35 | ||
|
|
2375a1abcb | ||
|
|
ab4da63029 | ||
|
|
ab384b464b | ||
|
|
d2de1089d6 | ||
|
|
b76b6cf835 | ||
|
|
a92eae867b | ||
|
|
0a86e0a719 | ||
|
|
7800ab05b2 | ||
|
|
032d3786bf | ||
|
|
db65f8d646 | ||
|
|
3a66b8e053 | ||
|
|
8a1716d5e2 | ||
|
|
abe4c1bc9a | ||
|
|
84b882f8b8 | ||
|
|
c3fc818037 | ||
|
|
57ff8312f3 | ||
|
|
68511bd3eb | ||
|
|
ba4fe80b50 | ||
|
|
b7d728a86e | ||
|
|
1e751d6afc | ||
|
|
aaf98308f7 | ||
|
|
3e322165f5 | ||
|
|
1c201b5f8c | ||
|
|
abe1be18b2 | ||
|
|
983562f7b8 | ||
|
|
1c9d0dd86f | ||
|
|
22a057d6e3 | ||
|
|
e92fd1f05b | ||
|
|
9a45c6582c | ||
|
|
3e3af62713 | ||
|
|
c93875729a | ||
|
|
3288591cc3 | ||
|
|
8f21cea345 | ||
|
|
4e9886dba8 | ||
|
|
cb91368b32 | ||
|
|
17b1151490 | ||
|
|
6083992914 | ||
|
|
70ed79076d | ||
|
|
31f2e9b071 | ||
|
|
b0ffb24a2e | ||
|
|
30e87695ea | ||
|
|
429d5d4d0d | ||
|
|
7b23db5abd | ||
|
|
5c8809f542 | ||
|
|
9bcbfd2512 | ||
|
|
1e7991f68d | ||
|
|
b29dab4d6b | ||
|
|
d2a5cb2d60 | ||
|
|
7b090d56d8 | ||
|
|
bcf610a29e | ||
|
|
55001644d2 | ||
|
|
eef4e9f672 | ||
|
|
3de7f92e8a | ||
|
|
d4c44a292c | ||
|
|
90bea73c11 | ||
|
|
a603c19d0e | ||
|
|
c3eb31d348 | ||
|
|
1b730836e4 | ||
|
|
4c65e994a3 | ||
|
|
ede503f6fe | ||
|
|
24d35993e9 | ||
|
|
d6651fc3c5 | ||
|
|
6671e3def0 | ||
|
|
6662862b43 | ||
|
|
500bac9929 | ||
|
|
5e6a8c8334 | ||
|
|
4f27a465c4 | ||
|
|
f490a3b2c2 | ||
|
|
9ae4955344 | ||
|
|
b89da4b061 | ||
|
|
b974ead0dc | ||
|
|
0427436df6 | ||
|
|
4319b2fad8 | ||
|
|
0fb150be19 | ||
|
|
6d0984f5fc | ||
|
|
b708fe283c | ||
|
|
74d59b43ac | ||
|
|
c6c14afca2 | ||
|
|
282e34b9e0 | ||
|
|
1eb75e24e7 | ||
|
|
be8592f096 | ||
|
|
4d88fbbbd2 | ||
|
|
70ffbfa4f3 | ||
|
|
c987bc2f80 | ||
|
|
7b8a848c61 | ||
|
|
0c5457a5f2 | ||
|
|
6aa6059974 | ||
|
|
98f247688e | ||
|
|
51f9d916e0 | ||
|
|
8a9386ffc5 | ||
|
|
bcd44dad84 | ||
|
|
ac96985c71 | ||
|
|
b98f487f3c | ||
|
|
42917f14ef | ||
|
|
938c62430f | ||
|
|
6132ae66da | ||
|
|
a02c7023e5 | ||
|
|
d15aa22131 | ||
|
|
19009d1637 | ||
|
|
4dbaf5f68e | ||
|
|
af2b1c66c9 | ||
|
|
3488e1fb83 | ||
|
|
f26d750fbf | ||
|
|
6e6c8956b9 | ||
|
|
80a426bc4f | ||
|
|
93da01c7ce | ||
|
|
55c4c86c23 | ||
|
|
82b16dc8de | ||
|
|
8078b6febb | ||
|
|
8a43dc936a | ||
|
|
7d1fbe9ce9 | ||
|
|
38a1cf9712 | ||
|
|
102039385a | ||
|
|
e780a65007 | ||
|
|
b8505ff218 | ||
|
|
20fec6461a | ||
|
|
d66e18b113 | ||
|
|
55fe666dac | ||
|
|
3554814c86 | ||
|
|
fd75e94824 | ||
|
|
70cc605b56 | ||
|
|
0779b8df16 | ||
|
|
ecc30c2d92 | ||
|
|
80840396aa | ||
|
|
c536081dea | ||
|
|
87a488e790 | ||
|
|
90647e25dd | ||
|
|
01c6e29dd5 | ||
|
|
1eac0972ac | ||
|
|
ce087f5330 | ||
|
|
9e06245860 | ||
|
|
4b9cedb444 | ||
|
|
a99c4328fc | ||
|
|
07b4b5b783 | ||
|
|
13be26443b | ||
|
|
ce993900d1 | ||
|
|
f604dd321e | ||
|
|
e0ac54ec0a | ||
|
|
8273c00881 | ||
|
|
4da7b456bb | ||
|
|
7498751ee3 | ||
|
|
a8b0306afe | ||
|
|
2dd133d5e5 | ||
|
|
e67c048b18 | ||
|
|
10b6808037 | ||
|
|
2d3e85f531 |
@@ -0,0 +1,2 @@
|
||||
|
||||
github: [pybricks]
|
||||
@@ -1,14 +1,14 @@
|
||||
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
|
||||
|
||||
name: Python package
|
||||
name: Build Python package and docs
|
||||
|
||||
on: [ push, pull_request ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.8, 3.9]
|
||||
@@ -32,6 +32,12 @@ jobs:
|
||||
- name: Build package
|
||||
run: poetry build
|
||||
- name: Lint docs
|
||||
run: poetry run doc8 --extension .inc
|
||||
- name: Build html docs
|
||||
run: poetry run doc8
|
||||
- name: Build html docs for Read the Docs
|
||||
run: poetry run make -C doc html
|
||||
- name: Instal IDE docs dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install dvisvgm preview-latex-style texlive texlive-fonts-extra texlive-latex-extra
|
||||
- name: Build html docs for Pybricks Code IDE
|
||||
run: poetry run make -C doc html TAG=ide
|
||||
@@ -0,0 +1,38 @@
|
||||
name: Release @pybricks/ide-docs
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '@pybricks/ide-docs/**'
|
||||
|
||||
jobs:
|
||||
publish_ide_docs:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Ubuntu packages
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y dvisvgm preview-latex-style texlive texlive-fonts-extra texlive-latex-extra
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
pip install poetry
|
||||
poetry run python -m pip install --upgrade pip
|
||||
poetry run python -m pip install --upgrade setuptools
|
||||
poetry install
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: '14.x'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
- run: yarn build
|
||||
working-directory: npm/ide-docs
|
||||
- run: yarn publish
|
||||
working-directory: npm/ide-docs
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
|
||||
@@ -0,0 +1,22 @@
|
||||
name: Release to PyPI
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build_and_publish:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.8
|
||||
- uses: abatilo/actions-poetry@v2.0.0
|
||||
with:
|
||||
poetry-version: 1.1.6
|
||||
- run: poetry install
|
||||
- run: poetry build
|
||||
- run: poetry publish
|
||||
env:
|
||||
POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_TOKEN }}
|
||||
@@ -1,6 +1,3 @@
|
||||
[submodule "pybricks-projects"]
|
||||
path = pybricks-projects
|
||||
url = https://github.com/pybricks/pybricks-projects
|
||||
[submodule "media/ev3dev-media"]
|
||||
path = media/ev3dev-media
|
||||
url = https://github.com/ev3dev/ev3dev-media.git
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# .readthedocs.yaml
|
||||
# Read the Docs configuration file
|
||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
||||
#
|
||||
# Settings in the readthedocs online dashboard will be ignored.
|
||||
|
||||
# Required
|
||||
version: 2
|
||||
|
||||
# Build documentation in the doc/main directory with Sphinx
|
||||
sphinx:
|
||||
configuration: doc/main/conf.py
|
||||
|
||||
# Build your docs in additional formats such as PDF
|
||||
formats:
|
||||
- pdf
|
||||
|
||||
# Set the version of Python and requirements required to build the docs
|
||||
python:
|
||||
version: 3.8
|
||||
install:
|
||||
- requirements: rtd-requirements.txt
|
||||
@@ -6,7 +6,7 @@
|
||||
"python.linting.enabled": true,
|
||||
"python.languageServer": "Pylance",
|
||||
"files.associations": {"*.inc": "restructuredtext"},
|
||||
"restructuredtext.confPath": "${workspaceFolder}/doc/api",
|
||||
"restructuredtext.confPath": "${workspaceFolder}/doc/main",
|
||||
"spellright.language": [
|
||||
"en_US"
|
||||
],
|
||||
|
||||
@@ -15,7 +15,7 @@ builtins
|
||||
cdot
|
||||
Celcius
|
||||
cityhub
|
||||
cplushub
|
||||
technichub
|
||||
de
|
||||
dev
|
||||
en
|
||||
|
||||
@@ -2,11 +2,92 @@
|
||||
|
||||
<!-- refer to https://keepachangelog.com/en/1.0.0/ for guidance -->
|
||||
|
||||
## 2.0.0.post2
|
||||
## 3.1.0 - 2021-12-16
|
||||
|
||||
### Added
|
||||
- Added this changelog.
|
||||
- Added maximum voltage setter for `DCMotor` and `Motor`.
|
||||
- Documented `DriveBase.curve()` method.
|
||||
|
||||
### Changed
|
||||
- Removed `duty` setting from `Control.limits` method.
|
||||
- Removed `integral_range` setting from `Control.pid` method.
|
||||
|
||||
### Fixed
|
||||
- Fixed code completion for `DCMotor` and `Motor` classes in MS Python VS Code extension.
|
||||
- Fixed missing `DCMotor` type in `ev3devices`.
|
||||
- Fixed link to Color Light Matrix page.
|
||||
- Fixed link to Inventor Hub page.
|
||||
|
||||
## 3.1.0rc1 - 2021-11-19
|
||||
|
||||
### Added
|
||||
- Added `ColorLightMatrix` class.
|
||||
- Added `LWP3Device` class.
|
||||
|
||||
**NOTE: version number after this point were from JavaScript package and do
|
||||
not correspond to Pybricks firmware version numbers.**
|
||||
|
||||
## 1.6.0 - 2021-08-30
|
||||
|
||||
### Added
|
||||
- MicroPython module documentation.
|
||||
- Examples for hub system functions including stop button and shutdown.
|
||||
|
||||
### Changed
|
||||
- Build IDE docs as main docs with minor changes, instead of a completely
|
||||
separate build.
|
||||
- Moved motor control documentation to the motor page.
|
||||
|
||||
## 1.5.0 - 2021-07-01
|
||||
|
||||
### Added
|
||||
- Documentation for Powered Up Remote Control.
|
||||
|
||||
## 1.4.0 - 2021-06-23
|
||||
|
||||
### Added
|
||||
- Enabled beta content that was hidden for the 3.0 release.
|
||||
- Added notice about using the latest beta version.
|
||||
|
||||
## 1.3.3 - 2021-05-21
|
||||
|
||||
### Changed
|
||||
- Match example snippet styling to IDE.
|
||||
- Add more examples.
|
||||
|
||||
## 1.3.2 - 2021-04-26
|
||||
|
||||
## Changed
|
||||
- Theme style fixes.
|
||||
- Example code fixes
|
||||
- Match doc version to firmware version.
|
||||
|
||||
## 1.3.1 - 2021-04-12
|
||||
|
||||
### Changed
|
||||
- Upgrade sphinx and rtd-theme to fix style issues.
|
||||
|
||||
## 1.3.0 - 2021-04-12
|
||||
|
||||
### Removed
|
||||
- Removed features which not be in the official 3.0 release. These features
|
||||
are still in beta. They'll come back in future releases once tested.
|
||||
|
||||
## 1.2.0 - 2021-04-09
|
||||
|
||||
### Changed
|
||||
- Moved installation guide to external site.
|
||||
|
||||
## 1.1.1 - 2021-02-14
|
||||
|
||||
### Added
|
||||
- Added installation guide.
|
||||
- Various documentation fixes.
|
||||
|
||||
## 1.1.0 - 2021-01-28
|
||||
|
||||
### Added
|
||||
- Scrollbar styling.
|
||||
|
||||
## 1.0.0 - 2021-01-25
|
||||
|
||||
### Added
|
||||
- Sphinx build output.
|
||||
|
||||
@@ -20,20 +20,23 @@ will actually be implemented.
|
||||
|
||||
- Commit messages have a one-line subject, a blank line and a multiline body:
|
||||
|
||||
prefix: subject
|
||||
prefix: Subject of the change.
|
||||
|
||||
body...
|
||||
|
||||
- Use a prefix to categorize the change. Usually this is the path the the file
|
||||
being changed.
|
||||
- If it is a documentation change, it can be shortened to `doc/<file>` (omit
|
||||
`api` from the path).
|
||||
- If it is an API change (in the `pybricks` folder), write `api/<file>`
|
||||
instead of `pybricks/<file>`.
|
||||
- The subject briefly describes _what_ was changed, e.g. `fix typo`.
|
||||
- Use a prefix to categorize the change:
|
||||
- Use the import path as the prefix whenever possible. Examples:
|
||||
- pybricks.tools: Add StopWatch class.
|
||||
- pybricks.tools: Reorganize RST files.
|
||||
- pybricks.tools.StopWatch: Fix return type.
|
||||
- pybricks.tools.wait: Add example of waiting.
|
||||
- pybricks.pupdevices: Fix all sensor class ports.
|
||||
- umath.sin: Fix spelling of Hypotenuse.
|
||||
- If an import path makes no sense, just use the file path without extensions:
|
||||
- .vscode/settings: Fix file associations.
|
||||
- The subject briefly describes _what_ was changed. Use a short full sentence as in the examples above.
|
||||
- The body describes _why_ the change was made, e.g. `The word "sensor" was
|
||||
spelled incorrectly`.
|
||||
- See the [commit history][commits] for more examples.
|
||||
|
||||
[commits]: https://github.com/pybricks/pybricks-api/commits/master
|
||||
|
||||
@@ -59,15 +62,24 @@ Build docs:
|
||||
|
||||
# Linux
|
||||
poetry run make -C doc html
|
||||
xdg-open doc/api/build/html/index.html
|
||||
xdg-open doc/main/build/html/index.html
|
||||
|
||||
# macOS
|
||||
poetry run make -C doc html
|
||||
open doc/api/build/html/index.html
|
||||
open doc/main/build/html/index.html
|
||||
|
||||
# Windows (PowerShell)
|
||||
poetry run doc\make.bat html
|
||||
Invoke-Item doc\api\build\html\index.html
|
||||
Invoke-Item doc\main\build\html\index.html
|
||||
|
||||
Building IDE docs variant:
|
||||
|
||||
# Linux/macOS
|
||||
poetry run make -C doc html TAG=ide
|
||||
|
||||
# Windows (PowerShell)
|
||||
$env:TAG="ide"
|
||||
poetry run doc\make.bat html
|
||||
|
||||
Linting:
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018-2020 The Pybricks Authors
|
||||
Copyright (c) 2018-2021 The Pybricks Authors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -5,12 +5,13 @@
|
||||
SPHINXOPTS = -W
|
||||
SPHINXBUILD = sphinx-build
|
||||
SPHINXPROJ = Pybricks
|
||||
SOURCEDIR = api
|
||||
SOURCEDIR = main
|
||||
BUILDDIR = "$(SOURCEDIR)"/build
|
||||
TAG = main
|
||||
|
||||
# Put it first so that "make" without argument is like "make help".
|
||||
help:
|
||||
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) -t $(TAG) $(O)
|
||||
|
||||
.PHONY: help Makefile
|
||||
|
||||
@@ -21,4 +22,4 @@ diagrams:
|
||||
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||
%: Makefile
|
||||
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) -t $(TAG) $(O)
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Pybricks documentation build configuration file
|
||||
#
|
||||
import os
|
||||
|
||||
# General information about the project.
|
||||
project = 'pybricks-micropython'
|
||||
copyright = '2018-2020 The Pybricks Authors'
|
||||
author = ''
|
||||
|
||||
_TITLE = 'Pybricks Modules and Examples'
|
||||
_DISCLAIMER = 'LEGO, the LEGO logo, MINDSTORMS and the MINDSTORMS EV3 logo are\
|
||||
trademarks and/or copyrights of the LEGO Group of companies \
|
||||
which does not sponsor, authorize or endorse this site.'
|
||||
|
||||
html_logo = '../common/images/pybricks-logo-rtd.png'
|
||||
latex_logo = '../common/images/pybricks-logo-large.png'
|
||||
|
||||
exec(open(os.path.abspath("../common/conf.py")).read())
|
||||
@@ -1,11 +0,0 @@
|
||||
0 Name: pupmotors
|
||||
0 Author: Pybricks {laurens@pybricks.com}
|
||||
0 !LICENSE MIT
|
||||
1 15 -420 -56 -250 1 0 0 0 1 0 0 0 1 26910.dat
|
||||
1 15 10 -80 140 1 0 0 0 1 0 0 0 1 28738.dat
|
||||
1 71 -270 -40 630 1 0 0 0 1 0 0 0 1 22127.dat
|
||||
1 15 200 -96 600 -1 0 0 0 1 0 0 0 -1 28739.dat
|
||||
1 15 470 -16 -90 1 0 0 0 1 0 0 0 1 45601p02.dat
|
||||
1 15 -800 -40 360 1 0 0 0 1 0 0 0 1 95646c01.dat
|
||||
1 15 -1160 32 -310 1 0 0 0 1 0 0 0 1 53788c01.dat
|
||||
1 71 -1340 -40 430 1 0 0 0 1 0 0 0 1 87576c01.dat
|
||||
@@ -1,8 +0,0 @@
|
||||
0 Name: pupmotors
|
||||
0 Author: Pybricks {laurens@pybricks.com}
|
||||
0 !LICENSE MIT
|
||||
1 15 430 -96 190 0 0 1 1 0 0 0 1 0 54675c01.dat
|
||||
1 15 410 -72 30 0 0 1 1 0 0 0 1 0 54696c01.dat
|
||||
1 71 230 -144 0 1 0 0 0 1 0 0 0 1 22169c01.dat
|
||||
1 71 40 -216 0 1 0 0 0 1 0 0 0 1 22172c01.dat
|
||||
1 15 -140 -320 80 1 0 0 0 1 0 0 0 1 26913c01.dat
|
||||
|
Before Width: | Height: | Size: 576 KiB |
@@ -1,12 +0,0 @@
|
||||
0 Name: pupmotors
|
||||
0 Author: Pybricks {laurens@pybricks.com}
|
||||
0 !LICENSE MIT
|
||||
1 15 600 -280 240 -1 0 0 0 -1 0 0 0 1 37316c01.dat
|
||||
1 15 60 -272 160 -1 0 0 0 -1 0 0 0 1 37312c01.dat
|
||||
1 15 -400 -280 240 -1 0 0 0 -1 0 0 0 1 37308c01.dat
|
||||
1 0 -400 -310 -374 -1 0 0 0 -1 0 0 0 1 u9218c01.dat
|
||||
1 15 -400 -320 -410 0 0 1 0 1 0 -1 0 0 20841.dat
|
||||
1 15 630 -320 -420 1 0 0 0 1 0 0 0 1 26912.dat
|
||||
1 0 630 -310 -384 -1 0 0 0 -1 0 0 0 1 u9218c01.dat
|
||||
1 15 60 -320 -430 0 0 1 0 1 0 -1 0 0 20844.dat
|
||||
1 0 60 -310 -394 -1 0 0 0 -1 0 0 0 1 u9218c01.dat
|
||||
@@ -1,32 +0,0 @@
|
||||
Working with vectors
|
||||
====================
|
||||
|
||||
Scalars and Vectors
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. _scalar:
|
||||
|
||||
scalar
|
||||
--------------
|
||||
|
||||
TODO
|
||||
|
||||
.. _vector:
|
||||
|
||||
vector
|
||||
--------------
|
||||
|
||||
TODO
|
||||
|
||||
Robot reference frame
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. _robotframe:
|
||||
|
||||
Robot reference frame
|
||||
----------------------
|
||||
|
||||
TODO (explanation, diagram, etc)::
|
||||
* X: To the right
|
||||
* Y: forward
|
||||
* Z: upward
|
||||
@@ -1,18 +0,0 @@
|
||||
:mod:`hubs <pybricks.hubs>` -- Programmable Hubs
|
||||
================================================
|
||||
|
||||
.. module:: pybricks.hubs
|
||||
|
||||
.. _fig_hubs:
|
||||
|
||||
Select your programmable hub using the buttons below.
|
||||
|
||||
.. content-tabs::
|
||||
|
||||
.. tab-container:: ev3brick
|
||||
:title: EV3 Brick
|
||||
|
||||
.. figure:: ../api/images/ev3brick.png
|
||||
:height: 15 em
|
||||
|
||||
.. include:: hubs_ev3brick.inc
|
||||
@@ -1,230 +0,0 @@
|
||||
.. autoclass:: pybricks.hubs.EV3Brick
|
||||
:no-members:
|
||||
|
||||
.. rubric:: Using the buttons
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.buttons.pressed
|
||||
|
||||
.. rubric:: Using the brick status light
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.light.on
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example**
|
||||
|
||||
**Example: Turn the light on and change the color.**
|
||||
|
||||
.. literalinclude::
|
||||
../../pybricks-projects/snippets/ev3/light_color/main.py
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.light.off
|
||||
|
||||
.. rubric:: Using the speaker
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.speaker.beep
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.speaker.play_notes
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide musical note format**
|
||||
|
||||
Each note is a string with the following format:
|
||||
|
||||
- The first character is the name of the note, ``A`` to ``G``
|
||||
or ``R`` for a rest.
|
||||
- Note names can also include an accidental ``#`` (sharp) or
|
||||
``b`` (flat). ``B#``/``Cb`` and ``E#``/``Fb`` are not
|
||||
allowed.
|
||||
- The note name is followed by the octave number ``2``
|
||||
to ``8``. For example ``C4`` is middle C. The octave changes
|
||||
to the next number at the note C, for example, ``B3`` is the
|
||||
note below middle C (``C4``).
|
||||
- The octave is followed by ``/`` and a number that indicates
|
||||
the size of the note. For example ``/4`` is a quarter note,
|
||||
``/8`` is an eighth note and so on.
|
||||
- This can optionally followed by a ``.`` to make a dotted
|
||||
note. Dotted notes are 1-1/2 times as long as notes without a
|
||||
dot.
|
||||
- The note can optionally end with a ``_`` which is a tie or a
|
||||
slur. This causes there to be no pause between this note and
|
||||
the next note.
|
||||
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.speaker.play_file
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.speaker.say
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.speaker.set_speech_options
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide available languages and voices**
|
||||
|
||||
You can choose the following languages:
|
||||
|
||||
- ``'af'``: Afrikaans
|
||||
- ``'an'``: Aragonese
|
||||
- ``'bg'``: Bulgarian
|
||||
- ``'bs'``: Bosnian
|
||||
- ``'ca'``: Catalan
|
||||
- ``'cs'``: Czech
|
||||
- ``'cy'``: Welsh
|
||||
- ``'da'``: Danish
|
||||
- ``'de'``: German
|
||||
- ``'el'``: Greek
|
||||
- ``'en'``: English (default)
|
||||
- ``'en-gb'``: English (United Kingdom)
|
||||
- ``'en-sc'``: English (Scotland)
|
||||
- ``'en-uk-north'``: English (United Kingdom, Northern)
|
||||
- ``'en-uk-rp'``:
|
||||
English (United Kingdom, Received Pronunciation)
|
||||
- ``'en-uk-wmids'``: English (United Kingdom, West Midlands)
|
||||
- ``'en-us'``: English (United States)
|
||||
- ``'en-wi'``: English (West Indies)
|
||||
- ``'eo'``: Esperanto
|
||||
- ``'es'``: Spanish
|
||||
- ``'es-la'``: Spanish (Latin America)
|
||||
- ``'et'``: Estonian
|
||||
- ``'fa'``: Persian
|
||||
- ``'fa-pin'``: Persian
|
||||
- ``'fi'``: Finnish
|
||||
- ``'fr-be'``: French (Belgium)
|
||||
- ``'fr-fr'``: French (France)
|
||||
- ``'ga'``: Irish
|
||||
- ``'grc'``: Greek
|
||||
- ``'hi'``: Hindi
|
||||
- ``'hr'``: Croatian
|
||||
- ``'hu'``: Hungarian
|
||||
- ``'hy'``: Armenian
|
||||
- ``'hy-west'``: Armenian (Western)
|
||||
- ``'id'``: Indonesian
|
||||
- ``'is'``: Icelandic
|
||||
- ``'it'``: Italian
|
||||
- ``'jbo'``: Lojban
|
||||
- ``'ka'``: Georgian
|
||||
- ``'kn'``: Kannada
|
||||
- ``'ku'``: Kurdish
|
||||
- ``'la'``: Latin
|
||||
- ``'lfn'``: Lingua Franca Nova
|
||||
- ``'lt'``: Lithuanian
|
||||
- ``'lv'``: Latvian
|
||||
- ``'mk'``: Macedonian
|
||||
- ``'ml'``: Malayalam
|
||||
- ``'ms'``: Malay
|
||||
- ``'ne'``: Nepali
|
||||
- ``'nl'``: Dutch
|
||||
- ``'no'``: Norwegian
|
||||
- ``'pa'``: Punjabi
|
||||
- ``'pl'``: Polish
|
||||
- ``'pt-br'``: Portuguese (Brazil)
|
||||
- ``'pt-pt'``: Portuguese (Portugal)
|
||||
- ``'ro'``: Romanian
|
||||
- ``'ru'``: Russian
|
||||
- ``'sk'``: Slovak
|
||||
- ``'sq'``: Albanian
|
||||
- ``'sr'``: Serbian
|
||||
- ``'sv'``: Swedish
|
||||
- ``'sw'``: Swahili
|
||||
- ``'ta'``: Tamil
|
||||
- ``'tr'``: Turkish
|
||||
- ``'vi'``: Vietnamese
|
||||
- ``'vi-hue'``: Vietnamese (Hue)
|
||||
- ``'vi-sgn'``: Vietnamese (Saigon)
|
||||
- ``'zh'``: Mandarin Chinese
|
||||
- ``'zh-yue'``: Cantonese Chinese
|
||||
|
||||
You can choose the following voices:
|
||||
|
||||
- ``'f1'``: female variant 1
|
||||
- ``'f2'``: female variant 2
|
||||
- ``'f3'``: female variant 3
|
||||
- ``'f4'``: female variant 4
|
||||
- ``'f5'``: female variant 5
|
||||
- ``'m1'``: male variant 1
|
||||
- ``'m2'``: male variant 2
|
||||
- ``'m3'``: male variant 3
|
||||
- ``'m4'``: male variant 4
|
||||
- ``'m5'``: male variant 5
|
||||
- ``'m6'``: male variant 6
|
||||
- ``'m7'``: male variant 7
|
||||
- ``'croak'``: croak
|
||||
- ``'whisper'``: whisper
|
||||
- ``'whisperf'``: female whisper
|
||||
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.speaker.set_volume
|
||||
|
||||
|
||||
.. rubric:: Using the screen
|
||||
|
||||
.. |this image| replace:: the screen
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.clear
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.draw_text
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.print
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example**
|
||||
|
||||
**Example: Say hello... in several ways.**
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\begin{CJK}{UTF8}{gbsn}
|
||||
|
||||
.. literalinclude::
|
||||
../../pybricks-projects/snippets/ev3/screen_print/main.py
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\end{CJK}
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.set_font
|
||||
|
||||
**Example:** See example in :meth:`print`.
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.load_image
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example**
|
||||
|
||||
**Example: Show an image on the screen.**
|
||||
|
||||
.. literalinclude::
|
||||
../../pybricks-projects/snippets/ev3/screen_image/main.py
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.draw_image
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.draw_pixel
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.draw_line
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example**
|
||||
|
||||
**Example: Draw some shapes on the screen.**
|
||||
|
||||
.. literalinclude::
|
||||
../../pybricks-projects/snippets/ev3/screen_draw/main.py
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.draw_box
|
||||
|
||||
**Example:** See example in :meth:`draw_line`.
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.draw_circle
|
||||
|
||||
**Example:** See example in :meth:`draw_line`.
|
||||
|
||||
.. autoattribute:: pybricks.hubs::EV3Brick.screen.width
|
||||
|
||||
.. autoattribute:: pybricks.hubs::EV3Brick.screen.height
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.screen.save
|
||||
|
||||
|
||||
.. rubric:: Using the battery
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.battery.voltage
|
||||
|
||||
.. automethod:: pybricks.hubs::EV3Brick.battery.current
|
||||
|
Before Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 669 KiB |
|
Before Width: | Height: | Size: 61 KiB |
@@ -1,73 +0,0 @@
|
||||
Welcome to Pybricks!
|
||||
==================================================================
|
||||
|
||||
This documentation has everything you need to install Pybricks and
|
||||
run your first scripts.
|
||||
|
||||
|
||||
**Step 1: Install Pybricks**
|
||||
|
||||
To get started, go to the :doc:`EV3 Quick Start <start_ev3>`.
|
||||
|
||||
|
||||
**Step 2: Start coding!**
|
||||
|
||||
After you've followed the installation steps for your hub,
|
||||
check out the Pybricks modules in the left hand menu to see what
|
||||
you can do.
|
||||
|
||||
**Step 3: Share what you made (or ask for help!)**
|
||||
|
||||
Got questions or issues? Please share your
|
||||
findings on our `support page`_ so we can make Pybricks even better.
|
||||
*Thank you!*
|
||||
|
||||
|
||||
.. _support page: https://github.com/pybricks/support/issues/
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: Table of Contents
|
||||
:hidden:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: Pybricks
|
||||
:hidden:
|
||||
|
||||
Home Page <https://pybricks.com>
|
||||
Downloads <https://pybricks.com/downloads/>
|
||||
Example Projects <https://github.com/pybricks/pybricks-projects>
|
||||
Support <https://github.com/pybricks/support/issues/>
|
||||
About Pybricks <https://pybricks.com/about/>
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: Getting started
|
||||
:hidden:
|
||||
|
||||
start_ev3
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: Pybricks Modules
|
||||
:hidden:
|
||||
|
||||
hubs
|
||||
ev3devices
|
||||
nxtdevices
|
||||
iodevices
|
||||
parameters
|
||||
tools
|
||||
robotics
|
||||
media
|
||||
messaging
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: Engineering Extras
|
||||
:hidden:
|
||||
|
||||
signaltypes
|
||||
motors
|
||||
.. frames
|
||||
@@ -1,27 +0,0 @@
|
||||
:mod:`iodevices <pybricks.iodevices>` -- Generic I/O Devices
|
||||
============================================================
|
||||
|
||||
.. automodule:: pybricks.iodevices
|
||||
:no-members:
|
||||
|
||||
.. note::
|
||||
|
||||
This module provides classes to interact with unofficial motors, sensors,
|
||||
and other custom electronics. You should only connect custom electronics
|
||||
or unofficial devices if you know what you are doing. Proceed with caution.
|
||||
|
||||
LUMP Device
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
.. figure:: ../api/images/sensor_lump.png
|
||||
:width: 80 %
|
||||
|
||||
.. autoclass:: pybricks.iodevices.LUMPDevice
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<h1>EV3 Only</h1>
|
||||
|
||||
The classes listed below are **only available on the EV3**.
|
||||
|
||||
.. include:: iodevices_ev3.inc
|
||||
@@ -1,151 +0,0 @@
|
||||
Analog Sensor
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
.. figure:: ../api/images/sensor_rj12_brown.png
|
||||
:width: 25 %
|
||||
|
||||
.. autoclass:: pybricks.iodevices.AnalogSensor
|
||||
|
||||
I2C Device
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
.. figure:: ../api/images/sensor_rj12_bluegreen.png
|
||||
:width: 25 %
|
||||
|
||||
.. autoclass:: pybricks.iodevices.I2CDevice
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example**
|
||||
|
||||
**Example: Read and write to an I2C device.**
|
||||
|
||||
.. literalinclude:: ../../pybricks-projects/snippets/ev3/i2c_basics/main.py
|
||||
|
||||
.. _i2caddress:
|
||||
|
||||
I2C Addresses
|
||||
---------------
|
||||
I2C addresses are 7-bit values. However, most vendors who make LEGO compatible
|
||||
sensors provide an 8-bit address in their documentation.
|
||||
To use those addresses, you must shift them by 1 bit.
|
||||
For example, if the documented address is ``0xD2``, you can do
|
||||
``address = 0xD2 >> 1``.
|
||||
|
||||
Advanced I2C Commands
|
||||
---------------------
|
||||
Some rudimentary I2C devices do not require a register argument or even any
|
||||
data. You can achieve this behavior as shown in the examples below.
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example**
|
||||
|
||||
**Example: Advanced I2C read and write techniques.**
|
||||
|
||||
.. literalinclude:: ../../pybricks-projects/snippets/ev3/i2c_extra/main.py
|
||||
|
||||
**Additional technical resources**
|
||||
|
||||
The ``I2CDevice`` class methods call functions from the Linux SMBus driver.
|
||||
To find out which commands are called under the hood, check the
|
||||
`Pybricks source code`_.
|
||||
More details about using I2C without MicroPython can be found on
|
||||
the `ev3dev I2C`_ page.
|
||||
|
||||
.. _ev3dev I2C: http://docs.ev3dev.org/projects/lego-linux-drivers/en/ev3dev-stretch/i2c.html
|
||||
.. _Pybricks source code: https://github.com/pybricks/pybricks-micropython
|
||||
|
||||
|
||||
UART Device
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
.. figure:: ../api/images/sensor_rj12_gray.png
|
||||
:width: 25 %
|
||||
|
||||
.. autoclass:: pybricks.iodevices.UARTDevice
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example**
|
||||
|
||||
**Example: Read and write to a UART device.**
|
||||
|
||||
.. literalinclude::
|
||||
../../pybricks-projects/snippets/ev3/uart_basics/main.py
|
||||
|
||||
DC Motor
|
||||
^^^^^^^^^^^^
|
||||
|
||||
.. figure:: ../api/images/rcxmotor.png
|
||||
:width: 40 %
|
||||
|
||||
.. autoclass:: pybricks._common.DCMotor
|
||||
:noindex:
|
||||
:no-members:
|
||||
|
||||
.. automethod:: pybricks._common.DCMotor.dc
|
||||
:noindex:
|
||||
|
||||
.. automethod:: pybricks._common.DCMotor.stop
|
||||
:noindex:
|
||||
|
||||
Ev3dev sensors
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. figure:: ../api/images/sensor_ev3dev.png
|
||||
:width: 70 %
|
||||
|
||||
EV3 MicroPython is built on top of ev3dev, which means that a sensor
|
||||
may be supported even if it is not listed in this documentation. If so, you can
|
||||
use it with the ``Ev3devSensor`` class. This is easier and faster than using
|
||||
the custom device classes given above.
|
||||
|
||||
To check whether you can use the ``Ev3devSensor`` class:
|
||||
|
||||
* Plug the sensor into your EV3 Brick.
|
||||
* Go to the main menu of the EV3 Brick.
|
||||
* Select `Device Browser` and then `Sensors`.
|
||||
* If your sensor shows up, you can use it.
|
||||
|
||||
Now select your sensor from the menu and choose `set mode`. This shows all
|
||||
available modes for this sensor. You can use these mode names as the ``mode``
|
||||
setting below.
|
||||
|
||||
To learn more about compatible devices and what each mode does,
|
||||
visit the `ev3dev sensors`_ page.
|
||||
|
||||
.. autoclass:: pybricks.iodevices.Ev3devSensor
|
||||
:no-members:
|
||||
|
||||
.. autoattribute:: pybricks.iodevices.Ev3devSensor.sensor_index
|
||||
:annotation:
|
||||
|
||||
.. autoattribute:: pybricks.iodevices.Ev3devSensor.port_index
|
||||
:annotation:
|
||||
|
||||
.. automethod:: pybricks.iodevices.Ev3devSensor.read
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example: Reading values with the Ev3devSensor class**
|
||||
|
||||
**Example**
|
||||
|
||||
In this example we use the LEGO MINDSTORMS EV3 Color Sensor with the raw
|
||||
RGB mode. This gives uncalibrated red, green, and blue reflection values.
|
||||
|
||||
.. literalinclude::
|
||||
../../pybricks-projects/snippets/ev3/ev3devsensor/main.py
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example: Extending the Ev3devSensor class**
|
||||
|
||||
**Example**
|
||||
|
||||
This example shows how to extend the ``Ev3devSensor`` class by accessing
|
||||
additional features found in the Linux system folder for this device.
|
||||
|
||||
.. literalinclude::
|
||||
../../pybricks-projects/snippets/ev3/ev3devsensor/class_example.py
|
||||
|
||||
.. _ev3dev sensors: http://docs.ev3dev.org/projects/lego-linux-drivers/en/ev3dev-stretch/sensors.html
|
||||
.. _Mode name: http://docs.ev3dev.org/projects/lego-linux-drivers/en/ev3dev-stretch/sensor_data.html
|
||||
.. _lego-sensor: http://docs.ev3dev.org/projects/lego-linux-drivers/en/ev3dev-stretch/sensors.html#the-lego-sensor-subsytem
|
||||
.. _lego-port: http://docs.ev3dev.org/projects/lego-linux-drivers/en/ev3dev-stretch/ports.html#the-lego-port-subsystem
|
||||
@@ -1,137 +0,0 @@
|
||||
More about Motors
|
||||
===========================================
|
||||
|
||||
.. Motor Tips & Tricks
|
||||
.. ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. The difference between ``run_angle`` and ``run_target``
|
||||
.. -------------------------------------------------------
|
||||
|
||||
.. *TODO*
|
||||
|
||||
.. .. _absangles:
|
||||
|
||||
.. Absolute angles
|
||||
.. ----------------------------
|
||||
|
||||
.. .. todo::
|
||||
|
||||
.. This section will be included in a future release.
|
||||
|
||||
.. .. _stalled:
|
||||
|
||||
.. Using stall detection
|
||||
.. ---------------------
|
||||
|
||||
.. .. todo::
|
||||
|
||||
.. This section will be included in a future release.
|
||||
|
||||
.. When a motor cannot move any further despite using the maximally allowed
|
||||
.. torque we say that the motor is stalled. Something could be blocking the
|
||||
.. motor, or the load is just too heavy. For example, if you manually hold
|
||||
.. the motor shaft still while the motor is busy executing a command, the
|
||||
.. motor will stall.
|
||||
|
||||
.. What can I do with stall detection?
|
||||
.. +++++++++++++++++++++++++++++++++++
|
||||
|
||||
.. Stall detection is useful to detect that a motor can't move any further.
|
||||
.. This can be used to detect an endpoint of a mechanism. For example, you
|
||||
.. can detect whether a robotic hand is fully closed, because the gripper
|
||||
.. motor simply can't go further. This way, you don't need a touch or light
|
||||
.. sensor to detect this.
|
||||
|
||||
.. *TODO: How, what, why. Explain run_until_stalled. Rack & pinion example.*
|
||||
|
||||
.. When is a motor stalled?
|
||||
.. ++++++++++++++++++++++++
|
||||
|
||||
.. TODO
|
||||
|
||||
.. .. _gears:
|
||||
|
||||
.. Using gears
|
||||
.. -----------------
|
||||
|
||||
.. .. todo::
|
||||
|
||||
.. This section will be included in a future release.
|
||||
|
||||
.. Many LEGO robots use mechanisms with gears to change the speed and torque
|
||||
.. output of a motor. Let's consider the following dial mechanism.
|
||||
|
||||
.. *TODO: INSERT PICTURE OF MOTOR WITH 12z gear AND 36z gear.*
|
||||
|
||||
.. This gear train slows down the dial on the output axle by a factor of 3.
|
||||
.. Therefore, if you want to rotate the dial by 90 degrees, the motor has to
|
||||
.. rotate by 270 degrees. To turn at 200 degrees per second, the motor has to
|
||||
.. turn at 600 degrees per second, and so on.
|
||||
|
||||
.. To avoid using this factor 3 everywhere in your program, you can use the
|
||||
.. `gears` setting of the ``Motor`` object, as shown in this example::
|
||||
|
||||
.. # This example uses the EV3 brick, but the same
|
||||
.. # technique applies to other programmable hubs.
|
||||
.. ev3 = EV3Brick()
|
||||
|
||||
.. # Initialize the motor. See picture above.
|
||||
.. dial = Motor(Port.C, Direction.COUNTERCLOCKWISE, gears=[12, 36])
|
||||
|
||||
.. # Turn the dial by 90-degrees
|
||||
.. dial.run_angle(500, 90)
|
||||
|
||||
.. # Print the dial angle
|
||||
.. print(dial.angle())
|
||||
|
||||
.. # Turn the dial back to the original position
|
||||
.. dial.run_target(500, 0)
|
||||
|
||||
.. When you use any of the other methods, the same scaling is applied. For
|
||||
.. example, you can print the angle of the dial as shown above. This will print
|
||||
.. 90 (approximately), even though the motor has turned 270 degrees.
|
||||
|
||||
.. Notice that there is no magic going on. It is just a convenient scaling
|
||||
.. function. This helps you organize your code. For example, if you change
|
||||
.. your mechanism to use different gears, you only have to change the first
|
||||
.. line of this example.
|
||||
|
||||
.. _control:
|
||||
|
||||
The Control Class
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
The ``Motor`` class uses PID control to accurately track your commanded target
|
||||
angles. Similarly, the ``DriveBase`` class uses two of such controllers:
|
||||
one to control the heading and one to control the traveled distance.
|
||||
|
||||
You can change the control settings through the following attributes, which are
|
||||
instances of the ``Control`` class given below.:
|
||||
|
||||
- ``Motor.control``
|
||||
- ``DriveBase.heading_control``
|
||||
- ``DriveBase.distance_control``
|
||||
|
||||
You can only change the settings while the controller is stopped. For example,
|
||||
you can set the settings at the beginning of your program. Alternatively, first
|
||||
call ``stop()`` to make your ``Motor`` or ``DriveBase`` stop, and then change
|
||||
the settings.
|
||||
|
||||
.. autoclass:: pybricks._common.Control
|
||||
:no-members:
|
||||
|
||||
.. rubric:: Status
|
||||
|
||||
.. automethod:: pybricks._common.Control.done
|
||||
|
||||
.. automethod:: pybricks._common.Control.stalled
|
||||
|
||||
.. rubric:: Settings
|
||||
|
||||
.. automethod:: pybricks._common.Control.limits
|
||||
|
||||
.. automethod:: pybricks._common.Control.pid
|
||||
|
||||
.. automethod:: pybricks._common.Control.target_tolerances
|
||||
|
||||
.. automethod:: pybricks._common.Control.stall_tolerances
|
||||
@@ -1,12 +0,0 @@
|
||||
EV3 Quick Start
|
||||
########################
|
||||
|
||||
.. include:: start_ev3_install.inc
|
||||
|
||||
.. include:: start_ev3_brick.inc
|
||||
|
||||
.. include:: start_ev3_run.inc
|
||||
|
||||
.. include:: start_ev3_linux.inc
|
||||
|
||||
.. include:: start_ev3_upgrade.inc
|
||||
@@ -1,81 +0,0 @@
|
||||
Using the EV3 Brick
|
||||
===================
|
||||
|
||||
Make sure the EV3 Brick is turned off. Insert the microSD card you prepared
|
||||
into the microSD card slot on the EV3 Brick, as shown in :numref:`fig_sd`.
|
||||
|
||||
.. _fig_sd:
|
||||
|
||||
.. figure:: ../api/images/sd_label.png
|
||||
:width: 75 %
|
||||
:alt: sd
|
||||
:align: center
|
||||
|
||||
Inserting the flashed microSD card into the EV3 Brick
|
||||
|
||||
|
||||
Turning the EV3 Brick on and off
|
||||
-----------------------------------------------------------
|
||||
|
||||
Turn on the EV3 Brick by pressing the dark gray center button.
|
||||
|
||||
The boot process may take several minutes. While booting, the EV3 Brick status
|
||||
light turns orange and blinks intermittently, and you'll see a lot of text on
|
||||
the EV3 screen. The EV3 Brick is ready for use when the status light turns
|
||||
green.
|
||||
|
||||
To turn the EV3 Brick off, open the shutdown menu with the back button, and
|
||||
then select *Power Off* using the center button, as shown
|
||||
in :numref:`fig_onoff`.
|
||||
|
||||
.. _fig_onoff:
|
||||
|
||||
.. figure:: ../api/images/onoff_label.png
|
||||
:width: 65 %
|
||||
:alt: onoff
|
||||
:align: center
|
||||
|
||||
Turning the EV3 Brick off
|
||||
|
||||
Viewing motor and sensor values
|
||||
-----------------------------------------------------------
|
||||
|
||||
When you're not running a program, you can view motor and sensor values using
|
||||
the device browser, as shown in :numref:`fig_devicebrowser`.
|
||||
|
||||
.. _fig_devicebrowser:
|
||||
|
||||
.. figure:: ../api/images/devicebrowser_label.png
|
||||
:width: 100 %
|
||||
:alt: devicebrowser
|
||||
:align: center
|
||||
|
||||
Viewing motor and sensor values
|
||||
|
||||
Running a program without a computer
|
||||
-----------------------------------------------------------
|
||||
|
||||
You can run previously downloaded programs directly from the EV3 Brick.
|
||||
|
||||
To do so, find the program using the *file browser* on the EV3 screen and press
|
||||
the center button key to start the program as shown in :numref:`fig_manualrun`.
|
||||
|
||||
.. _fig_manualrun:
|
||||
|
||||
.. figure:: ../api/images/manualrun_label.png
|
||||
:width: 100 %
|
||||
:alt: manualrun
|
||||
:align: center
|
||||
|
||||
Starting a program using the buttons on the EV3 Brick
|
||||
|
||||
Going back to the original firmware
|
||||
-----------------------------------------------------------
|
||||
|
||||
You can go back to the LEGO® firmware and your LEGO programs at any time. To
|
||||
do so:
|
||||
|
||||
1. Turn the EV3 Brick off as shown above.
|
||||
2. Wait for the screen and brick status light to turn off.
|
||||
3. Remove the microSD card.
|
||||
4. Turn the EV3 on.
|
||||
@@ -1,5 +0,0 @@
|
||||
.. _EV3 MicroPython microSD card image: https://pybricks.com/downloads
|
||||
|
||||
1. Download the `EV3 MicroPython microSD card image`_ and save it in a
|
||||
convenient location. This file is approximately 360 MB. You do **not** need
|
||||
to unzip the file.
|
||||
@@ -1,115 +0,0 @@
|
||||
Installation
|
||||
===================
|
||||
|
||||
This page guides you through the steps to collect and install everything you
|
||||
need to start programming.
|
||||
|
||||
What do you need?
|
||||
-----------------------------------------------------------
|
||||
|
||||
To get started, you'll need:
|
||||
|
||||
- A Windows 10 or Mac OS computer
|
||||
- Internet access and administrator access
|
||||
|
||||
This is required during the installation only. You will not need special
|
||||
access to write and run programs later on.
|
||||
|
||||
- A microSD card
|
||||
|
||||
You'll need a card with a minimum capacity of 4GB and a maximum capacity
|
||||
of 32GB. This type of microSD card is also known as microSDHC. We recommend
|
||||
cards with Application Performance Class A1.
|
||||
|
||||
- A microSD card slot or card reader in your computer
|
||||
|
||||
If your computer does not have a (micro)SD card slot, you can use an
|
||||
external USB (micro)SD card reader.
|
||||
|
||||
- A mini-USB cable, like the one included with your EV3 set
|
||||
|
||||
The typical configuration of this equipment is summarized
|
||||
in :numref:`fig_overview`.
|
||||
|
||||
.. _fig_overview:
|
||||
|
||||
.. figure:: ../api/images/overview_label.png
|
||||
:width: 90 %
|
||||
:alt: overview
|
||||
:align: center
|
||||
|
||||
Setup overview
|
||||
|
||||
Preparing your computer
|
||||
-----------------------------------------------------------
|
||||
|
||||
You'll write your MicroPython programs using Visual Studio Code. Follow the
|
||||
steps below to download, install, and configure this application:
|
||||
|
||||
1. Download `Visual Studio Code <https://code.visualstudio.com/Download>`_.
|
||||
2. Follow the on-screen instructions to install the application.
|
||||
3. Launch Visual Studio Code.
|
||||
4. Open the extensions tab.
|
||||
5. Install the EV3 MicroPython extension as shown in :numref:`fig_store`.
|
||||
|
||||
.. _fig_store:
|
||||
|
||||
.. figure:: ../api/images/store_label.png
|
||||
:alt: store
|
||||
:align: center
|
||||
|
||||
Installing the extension from the Visual Studio Code marketplace
|
||||
|
||||
.. _prepsdcard:
|
||||
|
||||
Preparing the microSD card
|
||||
-----------------------------------------------------------
|
||||
|
||||
To make it possible to run MicroPython programs on your EV3 Brick, you'll now
|
||||
learn how to install the required tools on your microSD card.
|
||||
|
||||
If the microSD card contains files you want to keep, make sure to create a
|
||||
backup of its contents first.
|
||||
See :ref:`managing files on the EV3 <managefiles>` to learn how to backup your
|
||||
previous MicroPython programs if necessary.
|
||||
|
||||
*This process erases everything on your microSD card, including any previous
|
||||
MicroPython programs on it.*
|
||||
|
||||
|
||||
To install the MicroPython tools on your microSD card:
|
||||
|
||||
.. include:: start_ev3_download.inc
|
||||
|
||||
2. Download and install a microSD card flashing tool
|
||||
such as `Etcher <https://www.balena.io/etcher/>`_.
|
||||
3. Insert the microSD card into your computer or card reader.
|
||||
4. Launch the flashing tool and follow the steps on your screen to install
|
||||
the file you have just downloaded. If you use Etcher, you can follow the
|
||||
instructions below, as shown in :numref:`fig_etcher`.
|
||||
|
||||
a. Select the EV3 MicroPython microSD card image file you have just
|
||||
downloaded.
|
||||
b. Select your microSD card. Make sure that the device and size correspond
|
||||
to your microSD card.
|
||||
c. Start the flashing process. This may take several minutes. Do not remove
|
||||
the card until the flashing process is complete.
|
||||
|
||||
.. _fig_etcher:
|
||||
|
||||
.. figure:: ../api/images/etcher_label.png
|
||||
:width: 85 %
|
||||
:alt: etcher
|
||||
:align: center
|
||||
|
||||
Using Etcher to flash the EV3 MicroPython microSD card image
|
||||
|
||||
Updating the microSD card
|
||||
-----------------------------------------------------------
|
||||
|
||||
To update the microSD card, download a new image file using the link above and
|
||||
flash it to the microSD card as described above. Be sure
|
||||
to :ref:`back up any MicroPython programs you want to save <managefiles>`.
|
||||
|
||||
You do not need to erase the contents of the microSD card first. This is done
|
||||
automatically when you flash the new image file.
|
||||
@@ -1,110 +0,0 @@
|
||||
Accessing advanced EV3 features
|
||||
===============================
|
||||
|
||||
MicroPython runs on top of `ev3dev`_, which is a specific version of Linux.
|
||||
Linux is an *operating system*. (Other popular operating
|
||||
systems are Microsoft Windows and Apple macOS.) This means that your EV3 is
|
||||
almost like a real computer, just much smaller.
|
||||
|
||||
.. note::
|
||||
|
||||
*If you just want to write MicroPython programs, you can skip the
|
||||
remaining sections.*
|
||||
|
||||
The remaining sections are aimed at curious users who want go beyond
|
||||
MicroPython and access some of the other built-in features of Linux and
|
||||
ev3dev.
|
||||
|
||||
The Linux command line
|
||||
-----------------------------------------
|
||||
|
||||
Although your EV3 Brick is quite like a real computer, you do not interact with
|
||||
it using a big screen and a mouse. Instead, you can access files and programs
|
||||
on it using the *command line*. It is also called the *terminal*.
|
||||
|
||||
Follow the steps in :numref:`fig_terminal` to access the command line. Now
|
||||
you can enter commands by typing them in and pressing enter.
|
||||
|
||||
.. _fig_terminal:
|
||||
|
||||
.. figure:: ../api/images/terminal_label.png
|
||||
:width: 100 %
|
||||
:alt: files
|
||||
:align: center
|
||||
|
||||
Opening the Linux command line and running the ``ls`` command.
|
||||
|
||||
**Running basic commands**
|
||||
|
||||
For example, if you type the following command and press enter::
|
||||
|
||||
ls
|
||||
|
||||
then you will see the contents of the current folder. :numref:`fig_terminal`
|
||||
shows the result: it listed the project folder of the ``getting_started``
|
||||
project that we just ran.
|
||||
|
||||
If you type the following command and press enter::
|
||||
|
||||
exit
|
||||
|
||||
then the command line will be closed. Alternatively, click the garbage icon
|
||||
shown in :numref:`fig_terminal`.
|
||||
|
||||
You can copy text from the command line by selecting it and
|
||||
then pressing ``ctrl`` ``shift`` ``c``.
|
||||
You can paste text into the command line
|
||||
using ``ctrl`` ``shift`` ``v``.
|
||||
|
||||
**Running commands as an administrator**
|
||||
|
||||
Some commands require a password to run. This is similar to administrative
|
||||
tasks on your computer or tablet, such as installing a new app. These commands
|
||||
work like any other command, but you add ``sudo`` in front of
|
||||
them.
|
||||
|
||||
As an exercise, you can run the following command to turn the EV3 Brick off::
|
||||
|
||||
sudo poweroff
|
||||
|
||||
You will be prompted for a password. Type ``maker`` and then press ``Enter``.
|
||||
|
||||
.. warning::
|
||||
|
||||
Only run commands with ``sudo`` if you know what you are doing.
|
||||
|
||||
**Learning more about the command line**
|
||||
|
||||
To learn more about the command line and many of the available commands, we
|
||||
recommend reading the beginner-friendly free ebook
|
||||
called `The Linux Command Line`_.
|
||||
|
||||
To learn more about ev3dev-specific tips and tricks, visit the `ev3dev`_
|
||||
website.
|
||||
|
||||
.. _hostname:
|
||||
|
||||
Changing the EV3 Brick name
|
||||
-----------------------------------------------------------
|
||||
|
||||
When you search for your EV3 using Visual Studio Code, you see all EV3 Bricks
|
||||
listed by their name. By default, all EV3 Bricks are named *ev3dev*. Follow
|
||||
these steps to change that name:
|
||||
|
||||
1. Open Visual Studio Code and connect to your EV3 as usual.
|
||||
2. Read the steps above about running commands as an administrator.
|
||||
3. Think of a good name. In this example, we'll
|
||||
call it ``autonomous-vehicle2``
|
||||
4. Enter the following command and press enter::
|
||||
|
||||
sudo hostnamectl set-hostname autonomous-vehicle2
|
||||
|
||||
5. Reboot the EV3 Brick for the change to take effect.
|
||||
6. You may need to reboot your computer as well.
|
||||
|
||||
EV3 Brick names should only contain lowercase letters ``a`` through ``z``,
|
||||
the digits ``0`` through ``9``, and the hyphen ``-``. It must start with a
|
||||
letter or digit. It cannot include spaces or other symbols.
|
||||
|
||||
.. _ev3dev: https://www.ev3dev.org/
|
||||
.. _The Linux Command Line: http://linuxcommand.org/tlcl.php
|
||||
@@ -1,166 +0,0 @@
|
||||
Creating and running programs
|
||||
=============================
|
||||
|
||||
Now that you've set up your computer and EV3 Brick, you're ready to start
|
||||
writing programs.
|
||||
|
||||
To make it easier to create and manage your programs, let's first have a quick
|
||||
look at how MicroPython projects and programs for your EV3 robots are
|
||||
organized.
|
||||
|
||||
Programs are organized into *project folders*, as shown in
|
||||
:numref:`fig_projectstructure`. A project folder is a directory on your
|
||||
computer that contains the main program (**main.py**) and other optional
|
||||
scripts or files. This project folder and all of its contents will be copied
|
||||
to the EV3 Brick, where the main program will be run.
|
||||
|
||||
This page shows you how to create such a project and how to transfer it to the
|
||||
EV3 Brick.
|
||||
|
||||
.. _fig_projectstructure:
|
||||
|
||||
.. figure:: ../api/images/projectstructure_label.png
|
||||
:width: 100 %
|
||||
:alt: projectstructure
|
||||
:align: center
|
||||
|
||||
A project contains a program called **main.py** and optional resources like
|
||||
sounds or MicroPython modules.
|
||||
|
||||
|
||||
Creating a new project
|
||||
-----------------------------------------------------------
|
||||
|
||||
To create a new project, open the EV3 MicroPython tab and
|
||||
click *create a new project*, as shown in :numref:`fig_newproject`. Enter a
|
||||
project name in the text field that appears and press *Enter*. When prompted,
|
||||
choose a location for this program and confirm by clicking *choose folder*.
|
||||
|
||||
.. _fig_newproject:
|
||||
|
||||
.. figure:: ../api/images/newproject_label.png
|
||||
:width: 100 %
|
||||
:alt: newproject
|
||||
:align: center
|
||||
|
||||
Creating a new project. This example is called *getting_started*, but you
|
||||
can choose any name.
|
||||
|
||||
When you create a new project, it already includes a file called *main.py*. To
|
||||
see its contents and to modify it, open it from the file browser as shown in
|
||||
:numref:`fig_projectoverview`. This is where you'll write your programs.
|
||||
|
||||
If you are new to MicroPython programming, we recommend that you keep the
|
||||
existing code in place and add your code to it.
|
||||
|
||||
.. _fig_projectoverview:
|
||||
|
||||
.. figure:: ../api/images/projectoverview_label.png
|
||||
:width: 100 %
|
||||
:alt: projectoverview
|
||||
:align: center
|
||||
|
||||
Opening the default *main.py* program.
|
||||
|
||||
Opening an existing project
|
||||
-----------------------------------------------------------
|
||||
|
||||
To open a project you created previously, click *File* and click
|
||||
*Open Folder*, as shown in :numref:`fig_existingproject`. Next, navigate to
|
||||
your previously created project folder and click *OK*. You can also open your
|
||||
recently used projects using the *Open Recent* menu option.
|
||||
|
||||
.. _fig_existingproject:
|
||||
|
||||
.. figure:: ../api/images/existingproject_label.png
|
||||
:width: 75 %
|
||||
:alt: existingproject
|
||||
:align: center
|
||||
|
||||
Opening a previously created project.
|
||||
|
||||
|
||||
Connecting to the EV3 Brick with Visual Studio Code
|
||||
-----------------------------------------------------------
|
||||
|
||||
To be able to transfer your code to the EV3 Brick, you'll first need to
|
||||
connect the EV3 Brick to your computer with the mini-USB cable and configure
|
||||
the connection with Visual Studio Code. To do so:
|
||||
|
||||
- Turn the EV3 Brick on
|
||||
- Connect the EV3 Brick to your computer with the mini-USB cable
|
||||
- Configure the USB connection as shown in :numref:`fig_connecting`.
|
||||
|
||||
.. _fig_connecting:
|
||||
|
||||
.. figure:: ../api/images/connecting_label.png
|
||||
:width: 100 %
|
||||
:alt: connecting
|
||||
:align: center
|
||||
|
||||
Configuring the USB connection between the computer and the EV3 Brick
|
||||
|
||||
Downloading and running a program
|
||||
-----------------------------------------------------------
|
||||
|
||||
You can press the F5 key to run the program. Alternatively, you can start it
|
||||
manually by going to the *debug* tab and clicking the green start arrow, as
|
||||
shown in :numref:`fig_running`.
|
||||
|
||||
When the program starts, a pop-up toolbar allows you to stop the program if
|
||||
necessary. You can also stop the program at any time using the back button on
|
||||
the EV3 Brick.
|
||||
|
||||
If your program produces any output with the ``print`` command, this is shown
|
||||
in the output window.
|
||||
|
||||
.. _fig_running:
|
||||
|
||||
.. figure:: ../api/images/running_label.png
|
||||
:width: 100 %
|
||||
:alt: running
|
||||
:align: center
|
||||
|
||||
Running a program
|
||||
|
||||
Expanding the example program
|
||||
-----------------------------------------------------------
|
||||
|
||||
Now that you've run the basic code template, you can expand the program to
|
||||
make a motor move. First, attach a Large Motor to Port B on the EV3 Brick,
|
||||
as shown in :numref:`fig_firstprogram`.
|
||||
|
||||
.. _fig_firstprogram:
|
||||
|
||||
.. figure:: ../api/images/firstprogram_label.png
|
||||
:width: 100 %
|
||||
:alt: firstprogram
|
||||
:align: center
|
||||
|
||||
The EV3 Brick with a Large Motor attached to port B.
|
||||
|
||||
Next, edit *main.py* to make it look like this:
|
||||
|
||||
.. literalinclude::
|
||||
../../pybricks-projects/snippets/ev3/getting_started/main.py
|
||||
|
||||
This program makes your robot beep, rotate the motor, and beep again with a
|
||||
higher pitched tone. Run the program to make sure that it works as expected.
|
||||
|
||||
.. _managefiles:
|
||||
|
||||
Managing files on the EV3 Brick
|
||||
-----------------------------------------------------------
|
||||
|
||||
After you've downloaded a project to the EV3 Brick, you can run, delete, or
|
||||
back up programs stored on it using the device browser as shown in
|
||||
:numref:`fig_files`.
|
||||
|
||||
.. _fig_files:
|
||||
|
||||
.. figure:: ../api/images/files_label.png
|
||||
:width: 100 %
|
||||
:alt: files
|
||||
:align: center
|
||||
|
||||
Using the EV3 device browser to manage files on your EV3 Brick
|
||||
@@ -1,248 +0,0 @@
|
||||
Upgrading from v1.0 to v2.0
|
||||
===============================
|
||||
|
||||
*EV3 MicroPython version 2.0 was released on May 18, 2020.*
|
||||
|
||||
This section is for users who have previously used LEGO MINDSTORMS EV3
|
||||
MicroPython v1.0. We'll explain what's changed and how you can upgrade to
|
||||
benefit from the latest improvements.
|
||||
|
||||
If you are a new user and you just got started using version 2.0, you may skip
|
||||
this section.
|
||||
|
||||
Upgrading the microSD Card
|
||||
-----------------------------------------
|
||||
|
||||
To upgrade, download the latest microSD card file and install it using the
|
||||
standard :ref:`instructions <prepsdcard>`.
|
||||
|
||||
Note that this will erase all your existing files on the SD Card. Before you
|
||||
upgrade, make sure that you still have all your projects on your computer.
|
||||
If not, you can upload files back to your computer using
|
||||
:ref:`these instructions <managefiles>`.
|
||||
|
||||
As with any software update, *be careful about when you update*. For example,
|
||||
if you developed your code using version v1.0 and you are halfway into your
|
||||
robotics competition season, you may want to stick with v1.0 for now.
|
||||
|
||||
|
||||
Upgrading your existing programs
|
||||
-----------------------------------------
|
||||
|
||||
Most changes in v2.0 are *new* features, like support for additional sensors.
|
||||
Naturally, this will not affect your existing code.
|
||||
However, some changes were made to existing features to improve performance.
|
||||
|
||||
All originally documented features in v1.0 will still work after you upgrade.
|
||||
This means that most programs originally made for v1.0 will work with the v2.0
|
||||
microSD card image without any changes.
|
||||
|
||||
To try this, simply download and run your original code as you did before.
|
||||
|
||||
However, it is recommended that you upgrade both the microSD card and your
|
||||
programs at the same time to ensure everything works as expected.
|
||||
|
||||
The new EV3Brick() class replaces the ev3brick module
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Version 2.0 introduces the :class:`EV3Brick() <pybricks.hubs.EV3Brick>` class.
|
||||
You can use it instead of the old ``ev3brick`` module. The old ``ev3brick``
|
||||
module can still be used, but it is no longer recommended or documented.
|
||||
|
||||
The :class:`EV3Brick() <pybricks.hubs.EV3Brick>` class improves the speed and
|
||||
reliability of the EV3 screen and the EV3 speaker. It also adds functionality
|
||||
like speech and drawing shapes. The default
|
||||
font size is also bigger to make it easier to read text on the screen.
|
||||
|
||||
You can use
|
||||
the following table as a starting point to upgrade your scripts. See the
|
||||
:class:`EV3Brick() <pybricks.hubs.EV3Brick>` class documentation for
|
||||
complete details of all methods and arguments.
|
||||
|
||||
.. list-table::
|
||||
|
||||
* - **Action**
|
||||
- **v1.0**
|
||||
- **v2.0**
|
||||
|
||||
* - | Initialize
|
||||
| your EV3
|
||||
- ::
|
||||
|
||||
from pybricks import ev3brick as brick
|
||||
- ::
|
||||
|
||||
from pybricks.hubs import EV3Brick
|
||||
|
||||
ev3 = EV3Brick()
|
||||
|
||||
* - | Light on
|
||||
- ::
|
||||
|
||||
brick.light(Color.RED)
|
||||
- ::
|
||||
|
||||
ev3.light.on(Color.RED)
|
||||
|
||||
* - | Light off
|
||||
- ::
|
||||
|
||||
brick.light(None)
|
||||
- ::
|
||||
|
||||
ev3.light.off()
|
||||
|
||||
* - | Read
|
||||
| Buttons
|
||||
- ::
|
||||
|
||||
if Button.LEFT in brick.buttons():
|
||||
print("Left is pressed.")
|
||||
- ::
|
||||
|
||||
if Button.LEFT in ev3.buttons.pressed():
|
||||
print("Left is pressed.")
|
||||
|
||||
* - | Play a
|
||||
| beep
|
||||
- ::
|
||||
|
||||
brick.sound.beep()
|
||||
- ::
|
||||
|
||||
ev3.speaker.beep()
|
||||
|
||||
* - | Play a
|
||||
| sound file
|
||||
- ::
|
||||
|
||||
brick.sound.file(SoundFile.HELLO)
|
||||
- ::
|
||||
|
||||
ev3.speaker.play_file(SoundFile.HELLO)
|
||||
|
||||
* - | Text to
|
||||
| speech
|
||||
-
|
||||
- ::
|
||||
|
||||
ev3.speaker.say("I can say anything!")
|
||||
|
||||
* - | Play
|
||||
| notes
|
||||
-
|
||||
- ::
|
||||
|
||||
ev3.speaker.play_notes(['C4/4', 'G4/4'])
|
||||
|
||||
* - | Write text
|
||||
| at a given
|
||||
| position
|
||||
- ::
|
||||
|
||||
brick.display.text("Hello!", (50, 60))
|
||||
- ::
|
||||
|
||||
ev3.screen.draw_text(50, 60, "Hello!")
|
||||
|
||||
* - | Write text
|
||||
| and scroll
|
||||
| automatically
|
||||
- ::
|
||||
|
||||
brick.display.text("Hello")
|
||||
brick.display.text("world!")
|
||||
- ::
|
||||
|
||||
ev3.screen.print("Hello")
|
||||
ev3.screen.print("world!")
|
||||
|
||||
* - | Change font
|
||||
| size
|
||||
-
|
||||
- ::
|
||||
|
||||
from pybricks.media.ev3dev import Font
|
||||
|
||||
big_font = Font(size=24)
|
||||
ev3.screen.set_font(big_font)
|
||||
|
||||
* - | Display an
|
||||
| image on
|
||||
| the screen
|
||||
- ::
|
||||
|
||||
from pybricks.parameters import ImageFile
|
||||
|
||||
brick.display.image(ImageFile.QUESTION_MARK)
|
||||
- ::
|
||||
|
||||
from pybricks.media.ev3dev import ImageFile
|
||||
|
||||
ev3.screen.load_image(ImageFile.Question_MARK)
|
||||
|
||||
* - | Draw shapes
|
||||
| on the screen
|
||||
-
|
||||
- ::
|
||||
|
||||
ev3.screen.draw_line(30, 30, 30, 100)
|
||||
ev3.screen.draw_box(50, 30, 90, 60)
|
||||
ev3.screen.draw_circle(70, 90, 20, fill=True)
|
||||
|
||||
* - | Read
|
||||
| battery
|
||||
| voltage
|
||||
- ::
|
||||
|
||||
brick.battery.voltage()
|
||||
- ::
|
||||
|
||||
ev3.battery.voltage()
|
||||
|
||||
|
||||
Other internal changes to existing features
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Most methods of the :class:`Motor() <pybricks.ev3devices.Motor>` class now
|
||||
have ``Stop.HOLD`` as the default instead of ``Stop.COAST``. This improves
|
||||
accuracy in most applications. You can still select ``Stop.COAST`` if you
|
||||
like.
|
||||
- The internal PID controllers for the motors are more accurate than before.
|
||||
If you give a motor command when it is already running, it smoothly adjusts
|
||||
the speed to the newly given command. This works even if you keep
|
||||
adjusting the speed in a fast loop.
|
||||
- Methods to configure motor settings have changed. You can change settings
|
||||
using the :doc:`control <motors>` attribute now. The old settings setters
|
||||
continue to exist in the implementation, but they are no longer documented.
|
||||
- So-called Python *keyword arguments* are now supported. Previously, you
|
||||
could only enter the argument *values*. For example:
|
||||
|
||||
::
|
||||
|
||||
my_motor.run_angle(500, 90, Stop.HOLD, False)
|
||||
|
||||
This is still possible. But you can now choose to omit optional arguments
|
||||
and specify others with *keywords*. This can make your code easier to read.
|
||||
For example:
|
||||
|
||||
::
|
||||
|
||||
my_motor.run_angle(500, 90, wait=False)
|
||||
- It is no longer necessary to import ``pybricks.tools.print``. The ``print``
|
||||
function is now built-in. It works just like Python or MicroPython.
|
||||
- Most parameters in the :mod:`parameters <pybricks.parameters>` now have a
|
||||
specific type and representation. For example, suppose you measure a color
|
||||
and print the result. If you do ``print(Color.RED)``, you will see the
|
||||
parameter instead of a technical number.
|
||||
- Sound and image files have moved to a dedicated :doc:`media <media>` module.
|
||||
Importing them from the old location will continue to work in this release,
|
||||
to make sure existing scripts will still work.
|
||||
|
||||
**Installing an older version of the Visual Studio Code extension**
|
||||
|
||||
The Visual Studio Code extension and this documentation are updated
|
||||
automatically. You can still use your existing scripts with the updated
|
||||
extension. If you absolutely wish to keep the old version, look for the EV3
|
||||
extension on the extension tab, click the gear icon, and
|
||||
click *install another version*.
|
||||
@@ -1,89 +0,0 @@
|
||||
:mod:`tools <pybricks.tools>` -- Timing and Data logging
|
||||
========================================================
|
||||
|
||||
.. automodule:: pybricks.tools
|
||||
:no-members:
|
||||
|
||||
.. autofunction:: wait
|
||||
|
||||
.. autoclass:: pybricks.tools.StopWatch
|
||||
:no-members:
|
||||
|
||||
.. automethod:: pybricks.tools.StopWatch.time
|
||||
|
||||
.. automethod:: pybricks.tools.StopWatch.pause
|
||||
|
||||
.. automethod:: pybricks.tools.StopWatch.resume
|
||||
|
||||
.. automethod:: pybricks.tools.StopWatch.reset
|
||||
|
||||
.. autoclass:: pybricks.tools.DataLog
|
||||
:no-members:
|
||||
|
||||
.. automethod:: pybricks.tools.DataLog.log
|
||||
|
||||
By default, this class creates a ``csv`` file on the EV3 brick with the
|
||||
name ``log`` and the current date and time. For example, if you
|
||||
use this class on 13 February 2020 on 10:07 and 44.431260
|
||||
seconds, the file is called ``log_2020_02_13_10_07_44_431260.csv``.
|
||||
|
||||
See :ref:`managing files on the EV3 <managefiles>` to learn how to upload
|
||||
the log file back to your computer.
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example: Logging and visualizing measurements**
|
||||
|
||||
|
||||
|
||||
**Example**
|
||||
|
||||
This example shows how to log the angle of a rotating wheel as time passes.
|
||||
|
||||
.. literalinclude:: ../../pybricks-projects/snippets/ev3/datalog/main.py
|
||||
|
||||
In this example, the generated file has the following contents::
|
||||
|
||||
time, angle
|
||||
3, 0
|
||||
108, 6
|
||||
212, 30
|
||||
316, 71
|
||||
419, 124
|
||||
523, 176
|
||||
628, 228
|
||||
734, 281
|
||||
838, 333
|
||||
942, 385
|
||||
|
||||
When you upload the file to your computer as shown above, you can open it
|
||||
in a spreadsheet editor. You can then generate a graph of the data, as
|
||||
shown in :numref:`fig_datalog_graph`.
|
||||
|
||||
In this example, we see that the motor angle changes slowly at first. Then
|
||||
the angle begins to change faster, and the graph becomes a straight line.
|
||||
This means that the motor has reached a constant speed. You can verify that
|
||||
the angle increases by 500 degrees per second.
|
||||
|
||||
.. _fig_datalog_graph:
|
||||
|
||||
.. figure:: ../api/images/datalog_graph.png
|
||||
:width: 100 %
|
||||
|
||||
Original file contents (left) and a generated graph (right).
|
||||
|
||||
|
||||
.. toggle-header::
|
||||
:header: **Show/hide example: Using the optional arguments**
|
||||
|
||||
**Example**
|
||||
|
||||
This example shows how to log data beyond just numbers. It also shows how
|
||||
you can use the optional arguments of the ``DataLog`` class to choose the
|
||||
file name and extension.
|
||||
|
||||
In this example, ``timestamp=False``, which means that the date and time
|
||||
are not added to the file name. This can be convenient because the file
|
||||
name will always be the same. However, this means that the contents of
|
||||
``my_file.txt`` will be overwritten every time you run this script.
|
||||
|
||||
.. literalinclude:: ../../pybricks-projects/snippets/ev3/datalog_extra/main.py
|
||||
@@ -0,0 +1,42 @@
|
||||
|
||||
/* These styles only apply to the ide build */
|
||||
|
||||
.wy-breadcrumbs li.wy-breadcrumbs-aside {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Scrollbar styling to match Pybricks Code. */
|
||||
/* https://github.com/pybricks/pybricks-code/blob/master/src/index.scss */
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
.bp3-dark ::-webkit-scrollbar-track {
|
||||
background: #293742;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: #e8e8e8;
|
||||
}
|
||||
|
||||
.bp3-dark ::-webkit-scrollbar-thumb {
|
||||
border-color: #293742;
|
||||
background: #a7b6c2;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
border-width: 3px;
|
||||
border-style: solid;
|
||||
border-radius: 8px;
|
||||
border-color: #e8e8e8;
|
||||
background: #5c7080;
|
||||
}
|
||||
|
||||
.bp3-dark ::-webkit-scrollbar-thumb:hover {
|
||||
background: #f5f8fa;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: #182026;
|
||||
}
|
||||
@@ -26,17 +26,6 @@ span.caption-number:after {
|
||||
margin-bottom: 24px !important;
|
||||
}
|
||||
|
||||
/*
|
||||
sphinx-contrib contentui sets max-width to none,
|
||||
giving a very wide page which makes text hard to
|
||||
read. This sets it to a finite value.
|
||||
*/
|
||||
@media screen and (min-width: 1300px) {
|
||||
.wy-nav-content {
|
||||
max-width: 800px;
|
||||
}
|
||||
}
|
||||
|
||||
/* decorate external links in navigation side bar */
|
||||
.wy-nav-side a.reference.external:after {
|
||||
font-family: FontAwesome;
|
||||
@@ -46,3 +35,9 @@ span.caption-number:after {
|
||||
font-size: 60%;
|
||||
margin: 0 0.2em;
|
||||
}
|
||||
|
||||
/* don't show external link on figures */
|
||||
/* https://github.com/readthedocs/sphinx_rtd_theme/pull/494#issuecomment-354063112 */
|
||||
.figure > a.reference.external::after {
|
||||
content: none !important;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
// Since Pybricks Code is an "app", all external links get opened in new tab/window
|
||||
// https://stackoverflow.com/a/62742435/1976323
|
||||
$(document).ready(function () {
|
||||
$('a[href^="http://"], a[href^="https://"]').not('a[class*=internal]').attr('target', '_blank');
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends '!footer.html' %}
|
||||
|
||||
{% block extrafooter %}
|
||||
<div class="disclaimer">{{ disclaimer }}</div>
|
||||
{% if disclaimer %}<div class="disclaimer">{{ disclaimer }}</div>{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -20,17 +20,18 @@
|
||||
# flake8: noqa
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
from docutils import nodes
|
||||
from docutils.parsers.rst.directives import flag
|
||||
from docutils.parsers.rst import Directive
|
||||
from sphinx.application import Sphinx
|
||||
from sphinx.domains.python import PyClassmember, PythonDomain
|
||||
import toml
|
||||
|
||||
TOP_DIR = os.path.abspath(os.path.join('..', '..'))
|
||||
sys.path.insert(0, TOP_DIR)
|
||||
sys.path.insert(0, os.path.join(TOP_DIR, 'src'))
|
||||
sys.path.append(os.path.abspath('../common/extensions'))
|
||||
|
||||
from pybricks.hubs import EV3Brick # noqa E402
|
||||
from pybricks.media.ev3dev import Image # noqa E402
|
||||
@@ -56,7 +57,10 @@ extensions = [
|
||||
'sphinx.ext.napoleon',
|
||||
'sphinx.ext.todo',
|
||||
'sphinx.ext.mathjax',
|
||||
'sphinxcontrib.contentui',
|
||||
'color',
|
||||
'classlink',
|
||||
'requirements',
|
||||
'requirements-static',
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
@@ -75,10 +79,10 @@ master_doc = 'index'
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = _pyproject["tool"]["poetry"]["version"]
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = version
|
||||
release = "v" + _pyproject["tool"]["poetry"]["version"]
|
||||
# The short X.Y version.
|
||||
version = re.match(r'(v\d+\.\d+)', release)[0]
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
@@ -88,7 +92,7 @@ release = version
|
||||
language = None
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
pygments_style = 'xcode'
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
todo_include_todos = True
|
||||
@@ -125,10 +129,27 @@ nitpick_ignore = [
|
||||
('py:exc', 'ValueError'),
|
||||
]
|
||||
|
||||
# not sure why, but this is needed for typing.IO in uselect
|
||||
nitpick_ignore.append(('py:class', 'IO'))
|
||||
|
||||
# Workaround until change below is released.
|
||||
# https://github.com/sphinx-doc/sphinx/commit/86091934db5ec593b4b0c982b7f08f3231ef995b
|
||||
nitpick_ignore.extend([
|
||||
('py:class', '0'),
|
||||
('py:class', '1'),
|
||||
('py:class', '2'),
|
||||
('py:class', '3'),
|
||||
('py:class', 'big'),
|
||||
('py:class', 'little'),
|
||||
])
|
||||
|
||||
# -- Autodoc options ------------------------------------------------------
|
||||
|
||||
autodoc_member_order = 'bysource'
|
||||
autodoc_default_flags = ['members', 'undoc-members']
|
||||
autodoc_default_options = {
|
||||
'members': True,
|
||||
'undoc-members': True,
|
||||
}
|
||||
autoclass_content = 'both' # This ensures init arguments are not ignored
|
||||
add_module_names = False # Hide module name
|
||||
|
||||
@@ -238,7 +259,27 @@ latex_documents = [
|
||||
author, 'manual'),
|
||||
]
|
||||
|
||||
# -- Options for manual page output ---------------------------------------
|
||||
# -- Content control -----------------------------------------------------
|
||||
|
||||
|
||||
exclude_patterns = [
|
||||
'ev3devices.rst',
|
||||
'hubs/ev3brick.rst',
|
||||
'hubs/primehub.rst',
|
||||
'geometry.rst',
|
||||
'iodevices/analogsensor.rst',
|
||||
'iodevices/dcmotor.rst',
|
||||
'iodevices/ev3devsensor.rst',
|
||||
'iodevices/i2cdevice.rst',
|
||||
'iodevices/lumpdevice.rst',
|
||||
'iodevices/lwp3device.rst',
|
||||
'iodevices/uartdevice.rst',
|
||||
'media.rst',
|
||||
'messaging.rst',
|
||||
'nxtdevices.rst',
|
||||
'tools/datalog.rst'
|
||||
]
|
||||
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
@@ -267,7 +308,7 @@ class AvailabilityDirective(Directive):
|
||||
option_spec = {
|
||||
'movehub': flag,
|
||||
'cityhub': flag,
|
||||
'cplushub': flag,
|
||||
'technichub': flag,
|
||||
'ev3dev-stretch': flag,
|
||||
}
|
||||
|
||||
@@ -284,44 +325,3 @@ def setup(app: Sphinx):
|
||||
|
||||
|
||||
# -- Python domain hacks ---------------------------------------------------
|
||||
|
||||
real_get_signature_prefix = PyClassmember.get_signature_prefix
|
||||
|
||||
|
||||
def get_signature_prefix(self, sig):
|
||||
# hacks for battery and light
|
||||
if sig.count('.') >= 2:
|
||||
return ''
|
||||
return real_get_signature_prefix(self, sig)
|
||||
|
||||
|
||||
PyClassmember.get_signature_prefix = get_signature_prefix
|
||||
|
||||
|
||||
# HACK: For certain hub attributes, we list the class members of the attributes
|
||||
# class as if the attribute was a nested class so that readers don't have to
|
||||
# skip around the docs as much. To make this work, we replace the attribute
|
||||
# values with the type and override PythonDomain.find_obj so that references
|
||||
# still work.
|
||||
|
||||
base_find_obj = PythonDomain.find_obj
|
||||
|
||||
|
||||
def find_obj(self, env, modname, classname, name, type, searchmode=0):
|
||||
if modname == 'pybricks.hubs':
|
||||
if classname == 'screen':
|
||||
if name.startswith('Font.') or name == 'Font':
|
||||
modname = 'pybricks.media.ev3dev'
|
||||
elif name.startswith('Image.') or name == 'Image':
|
||||
modname = 'pybricks.media.ev3dev'
|
||||
else:
|
||||
classname = 'EV3Brick.screen'
|
||||
elif classname == 'speaker':
|
||||
classname = 'EV3Brick.speaker'
|
||||
return base_find_obj(self, env, modname, classname, name, type, searchmode)
|
||||
|
||||
|
||||
PythonDomain.find_obj = find_obj
|
||||
|
||||
EV3Brick.screen = Image
|
||||
EV3Brick.speaker = Speaker
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
from docutils import nodes
|
||||
from docutils.parsers.rst import Directive
|
||||
|
||||
|
||||
class PybricksClasslinkDirective(Directive):
|
||||
|
||||
required_arguments = 1
|
||||
optional_arguments = 1
|
||||
|
||||
def run(self):
|
||||
# Get link and name from sphinx-directive
|
||||
name = self.arguments[0]
|
||||
link = name if len(self.arguments) == 1 else self.arguments[1]
|
||||
|
||||
html = (
|
||||
'<a href="{0}.html">'.format(link.lower()) +
|
||||
'<dl class="py class">' +
|
||||
'<dt>' +
|
||||
'<em class="property">class </em>' +
|
||||
'<code class="sig-name descname">' + name + '</code>' +
|
||||
'</dt>' +
|
||||
'<dd></dd>' +
|
||||
'</dl>' +
|
||||
'</a>'
|
||||
)
|
||||
|
||||
# Return the node
|
||||
node = nodes.raw('', html, format="html")
|
||||
return [node]
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_directive_to_domain('py', 'pybricks-classlink', PybricksClasslinkDirective)
|
||||
@@ -0,0 +1,43 @@
|
||||
from docutils import nodes
|
||||
from docutils.parsers.rst import Directive
|
||||
from pybricks.parameters import Color
|
||||
from colorsys import hsv_to_rgb
|
||||
|
||||
|
||||
class PybricksColorDirective(Directive):
|
||||
|
||||
required_arguments = 1
|
||||
|
||||
def run(self):
|
||||
# Get color name from sphinx-directive
|
||||
name = self.arguments[0]
|
||||
|
||||
# Get Color class attribute
|
||||
color = getattr(Color, name)
|
||||
|
||||
# Convert HSV to RGB
|
||||
r, g, b = hsv_to_rgb(color.h/360, color.s/100, color.v/100)
|
||||
|
||||
# Convert RGB to HEX
|
||||
rgbhex = '#{0:02x}{1:02x}{2:02x}'.format(
|
||||
round(r*255),
|
||||
round(g*255),
|
||||
round(b*255)
|
||||
)
|
||||
|
||||
# Render a small block of the given color
|
||||
css = "background-color: {0}; color: {0}; width: 50px;".format(rgbhex)
|
||||
|
||||
if name == "WHITE":
|
||||
css += "border-style: solid; border-width: 0.5px;" + \
|
||||
"border-color: #666666;"
|
||||
|
||||
html = '<div id="test" style="{0}">_</div>'.format(css)
|
||||
|
||||
# Return the node
|
||||
node = nodes.raw('', html, format="html")
|
||||
return [node]
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_directive_to_domain('py', 'pybricks-color', PybricksColorDirective)
|
||||
@@ -0,0 +1,101 @@
|
||||
from os import path, makedirs
|
||||
|
||||
from docutils import nodes
|
||||
from docutils.parsers.rst import Directive
|
||||
|
||||
from sphinx.util.osutil import copyfile
|
||||
|
||||
# Base feature set.
|
||||
FEATURES_SMALL = set()
|
||||
|
||||
# Medium feature set.
|
||||
FEATURES_MEDIUM = FEATURES_SMALL | {
|
||||
'pybricks-geometry',
|
||||
'pybricks-iodevices',
|
||||
'stm32-extra',
|
||||
'stm32-float',
|
||||
}
|
||||
|
||||
# Large feature set.
|
||||
FEATURES_LARGE = FEATURES_MEDIUM | set()
|
||||
|
||||
# Features per hub.
|
||||
HUB_FEATURES = {
|
||||
'movehub': {'movehub'} | FEATURES_SMALL,
|
||||
'cityhub': {'cityhub'} | FEATURES_MEDIUM,
|
||||
'technichub': {'technichub'} | FEATURES_MEDIUM,
|
||||
'primehub': {'primehub', 'inventorhub'} | FEATURES_LARGE,
|
||||
'inventorhub': {'primehub', 'inventorhub'} | FEATURES_LARGE,
|
||||
}
|
||||
|
||||
|
||||
class PybricksRequirementsStaticDirective(Directive):
|
||||
|
||||
required_arguments = 0
|
||||
optional_arguments = 10
|
||||
|
||||
def run(self):
|
||||
|
||||
# Copy required resources to static
|
||||
# CC BY-SA 4.0 via https://stackoverflow.com/a/63728208
|
||||
env = self.state.document.settings.env
|
||||
|
||||
destdir = path.join(env.app.builder.outdir, '_images')
|
||||
if not path.exists(destdir):
|
||||
makedirs(destdir)
|
||||
|
||||
for hub in HUB_FEATURES:
|
||||
for compat in ("true", "false"):
|
||||
uri = 'compat_{0}_{1}_label.png'.format(hub, compat)
|
||||
src_uri = path.join(env.app.builder.srcdir, 'images', uri)
|
||||
build_uri = path.join(env.app.builder.outdir, '_images', uri)
|
||||
copyfile(src_uri, build_uri)
|
||||
|
||||
# Get requirements from sphinx-directive.
|
||||
requirements = set(self.arguments)
|
||||
|
||||
# Cell with image of a hub.
|
||||
hub_cell = """
|
||||
<th><div class="align-default">
|
||||
<img alt="" src="{0}_images/compat_{1}_{2}_label.png">
|
||||
</div></th>
|
||||
"""
|
||||
|
||||
# Determine how far up the tree we are to set correct image path.
|
||||
current_document = env.docname
|
||||
depth = len(current_document.split("/")) - 1
|
||||
depth_path = "../" * depth
|
||||
|
||||
# Table row with hub images.
|
||||
compat_row = "".join([
|
||||
hub_cell.format(
|
||||
depth_path,
|
||||
hub,
|
||||
"true" if requirements <= features else "false")
|
||||
for hub, features in HUB_FEATURES.items()
|
||||
])
|
||||
|
||||
# Generate full table.
|
||||
html = """
|
||||
<div class="wy-table-responsive">
|
||||
<table class="docutils align-default">
|
||||
<tbody>
|
||||
<tr>
|
||||
{0}
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
""".format(compat_row)
|
||||
|
||||
# Return the node.
|
||||
node = nodes.raw('', html, format="html")
|
||||
return [node]
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_directive_to_domain(
|
||||
'py',
|
||||
'pybricks-requirements-static',
|
||||
PybricksRequirementsStaticDirective
|
||||
)
|
||||
@@ -0,0 +1,44 @@
|
||||
/*MIT License
|
||||
|
||||
Copyright (c) 2017 Robert, https://github.com/ulrobix/sphinxcontrib-contentui
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE. */
|
||||
|
||||
.toggle-header {
|
||||
display: block;
|
||||
float: right;
|
||||
clear: both;
|
||||
cursor: pointer;
|
||||
}
|
||||
.toggle-header p {display: inline;}
|
||||
.toggle-header strong {color: #2980b9 }
|
||||
|
||||
.toggle-header:after {
|
||||
content: "Compatibility ▼";
|
||||
}
|
||||
|
||||
.toggle-header.open:after {
|
||||
content: "▲";
|
||||
}
|
||||
|
||||
.toggle-content {
|
||||
display: none;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/*MIT License
|
||||
|
||||
Copyright (c) 2017 Robert, https://github.com/ulrobix/sphinxcontrib-contentui
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE. */
|
||||
|
||||
$(function() {
|
||||
/**
|
||||
* Toggle logic
|
||||
*/
|
||||
$('.toggle-content').hide()
|
||||
$('.toggle-header').click(function () {
|
||||
$(this).toggleClass("open");
|
||||
$(this).next('.toggle-content').toggle('400');
|
||||
})
|
||||
});
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
# MIT License
|
||||
|
||||
# Copyright (c) 2017 Robert, https://github.com/ulrobix/sphinxcontrib-requirements
|
||||
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
|
||||
|
||||
import os
|
||||
from docutils.parsers.rst import Directive, directives
|
||||
from docutils import nodes
|
||||
from docutils.statemachine import StringList
|
||||
from sphinx.util.osutil import copyfile
|
||||
from sphinx.util import logging
|
||||
|
||||
|
||||
CSS_FILE = 'requirements.css'
|
||||
JS_FILE = 'requirements.js'
|
||||
|
||||
|
||||
class PybricksRequirementsDirective(Directive):
|
||||
has_content = True
|
||||
option_spec = {'header': directives.unchanged}
|
||||
|
||||
required_arguments = 0
|
||||
optional_arguments = 10
|
||||
|
||||
def run(self):
|
||||
node = nodes.container()
|
||||
node['classes'].append('toggle-content')
|
||||
|
||||
par = nodes.container()
|
||||
par['classes'].append('toggle-header')
|
||||
|
||||
content = '.. pybricks-requirements-static:: ' + " ".join(self.arguments)
|
||||
|
||||
self.state.nested_parse(StringList([content]), self.content_offset, node)
|
||||
|
||||
return [par, node]
|
||||
|
||||
|
||||
def add_assets(app):
|
||||
app.add_css_file(CSS_FILE)
|
||||
app.add_js_file(JS_FILE)
|
||||
|
||||
|
||||
def copy_assets(app, exception):
|
||||
if app.builder.name not in ['html', 'readthedocs'] or exception:
|
||||
return
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.info('Copying requirements stylesheet/javascript... ', nonl=True)
|
||||
dest = os.path.join(app.builder.outdir, '_static', CSS_FILE)
|
||||
source = os.path.join(os.path.abspath(os.path.dirname(__file__)), CSS_FILE)
|
||||
copyfile(source, dest)
|
||||
dest = os.path.join(app.builder.outdir, '_static', JS_FILE)
|
||||
source = os.path.join(os.path.abspath(os.path.dirname(__file__)), JS_FILE)
|
||||
copyfile(source, dest)
|
||||
logger.info('done')
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_directive('pybricks-requirements', PybricksRequirementsDirective)
|
||||
app.connect('builder-inited', add_assets)
|
||||
app.connect('build-finished', copy_assets)
|
||||
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Pybricks documentation build configuration file
|
||||
#
|
||||
import os
|
||||
|
||||
# General information about the project.
|
||||
project = 'pybricks'
|
||||
copyright = '2018-2021 The Pybricks Authors'
|
||||
author = ''
|
||||
|
||||
_TITLE = 'Pybricks Modules and Examples'
|
||||
_DISCLAIMER = 'LEGO, the LEGO logo, MINDSTORMS and the MINDSTORMS EV3 logo are\
|
||||
trademarks and/or copyrights of the LEGO Group of companies \
|
||||
which does not sponsor, authorize or endorse this site.'
|
||||
|
||||
html_favicon = '../common/images/favicon.ico'
|
||||
html_logo = '../common/images/pybricks-logo-rtd.png'
|
||||
latex_logo = '../common/images/pybricks-logo-large.png'
|
||||
|
||||
# Build main docs for RTD by default.
|
||||
# Since tags cannot be passed via the TAG make variable on read the docs,
|
||||
# add it manually.
|
||||
if os.environ.get('READTHEDOCS', None) == 'True':
|
||||
tags.add('main') # noqa F821
|
||||
|
||||
|
||||
# Addtional configuration of the IDE docs
|
||||
if 'ide' in tags.tags: # noqa F821
|
||||
_DISCLAIMER = ''
|
||||
html_show_copyright = False
|
||||
html_show_sphinx = False
|
||||
html_css_files = ['css/ide.css']
|
||||
html_js_files = ['js/ide.js']
|
||||
|
||||
imgmath_image_format = 'svg'
|
||||
imgmath_use_preview = True # requires Sphinx v3
|
||||
imgmath_latex_preamble = r'''
|
||||
\usepackage{newtxsf}
|
||||
'''
|
||||
|
||||
exec(open(os.path.abspath("../common/conf.py")).read())
|
||||
|
||||
# Addtional configuration of the IDE docs
|
||||
if 'ide' in tags.tags: # noqa F821
|
||||
|
||||
extensions.remove('sphinx.ext.mathjax') # noqa F821
|
||||
extensions.append('sphinx.ext.imgmath') # noqa F821
|
||||
html_theme_options['prev_next_buttons_location'] = None # noqa F821
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,104 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150"
|
||||
height="135"
|
||||
viewBox="0 0 39.687499 35.718751"
|
||||
version="1.1"
|
||||
id="svg887"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="compat_cityhub_false.svg">
|
||||
<defs
|
||||
id="defs881">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1545">
|
||||
<rect
|
||||
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect1547"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="-25.390602"
|
||||
y="312.93103" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="10.681815"
|
||||
inkscape:cy="89.597718"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1172"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata884">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-261.28123)">
|
||||
<rect
|
||||
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect819"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="3.5527137e-15"
|
||||
y="261.28122" />
|
||||
<image
|
||||
sodipodi:absref="../images/cityhub.png"
|
||||
xlink:href="../images/cityhub.png"
|
||||
style="stroke-width:5.6583333"
|
||||
width="30.908323"
|
||||
height="31.75"
|
||||
preserveAspectRatio="none"
|
||||
id="image1470"
|
||||
x="5.2042809"
|
||||
y="263.16479" />
|
||||
<g
|
||||
id="g862"
|
||||
transform="matrix(0.84064533,0,0,0.84993509,-12.416361,243.07822)"
|
||||
style="stroke-width:1.18304348">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path856"
|
||||
d="m 51.33389,24.998882 5.622395,5.622396"
|
||||
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 56.956285,24.998882 51.33389,30.621278"
|
||||
id="path858"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
@@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150"
|
||||
height="135"
|
||||
viewBox="0 0 39.687499 35.718751"
|
||||
version="1.1"
|
||||
id="svg887"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="compat_cityhub_true.svg">
|
||||
<defs
|
||||
id="defs881">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1545">
|
||||
<rect
|
||||
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect1547"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="-25.390602"
|
||||
y="312.93103" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="10.681815"
|
||||
inkscape:cy="89.597718"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1172"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata884">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-261.28123)">
|
||||
<rect
|
||||
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect819"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="4.4408921e-16"
|
||||
y="261.28122" />
|
||||
<image
|
||||
sodipodi:absref="../images/cityhub.png"
|
||||
xlink:href="../images/cityhub.png"
|
||||
style="stroke-width:5.6583333"
|
||||
width="30.908323"
|
||||
height="31.75"
|
||||
preserveAspectRatio="none"
|
||||
id="image1470"
|
||||
x="5.2042809"
|
||||
y="263.16479" />
|
||||
<path
|
||||
style="fill:none;stroke:#84ba4c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 31.147057,265.82725 1.011052,2.9815 3.622948,-4.60003"
|
||||
id="path854"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
@@ -0,0 +1,104 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150"
|
||||
height="135"
|
||||
viewBox="0 0 39.687499 35.718751"
|
||||
version="1.1"
|
||||
id="svg887"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="compat_inventorhub_false.svg">
|
||||
<defs
|
||||
id="defs881">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1545">
|
||||
<rect
|
||||
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect1547"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="-25.390602"
|
||||
y="312.93103" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="10.681815"
|
||||
inkscape:cy="89.597718"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1172"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata884">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-261.28123)">
|
||||
<rect
|
||||
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect819"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="0"
|
||||
y="261.28122" />
|
||||
<image
|
||||
sodipodi:absref="../images/inventorhub.png"
|
||||
xlink:href="../images/inventorhub.png"
|
||||
style="stroke-width:5.92592621"
|
||||
width="34.915073"
|
||||
height="35.71875"
|
||||
preserveAspectRatio="none"
|
||||
id="image1481"
|
||||
x="2.6458333"
|
||||
y="261.28122" />
|
||||
<g
|
||||
id="g862"
|
||||
transform="matrix(0.84064533,0,0,0.84993509,-12.416361,243.07822)"
|
||||
style="stroke-width:1.18304348">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path856"
|
||||
d="m 51.33389,24.998882 5.622395,5.622396"
|
||||
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 56.956285,24.998882 51.33389,30.621278"
|
||||
id="path858"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
@@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150"
|
||||
height="135"
|
||||
viewBox="0 0 39.687499 35.718751"
|
||||
version="1.1"
|
||||
id="svg887"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="compat_inventorhub_true.svg">
|
||||
<defs
|
||||
id="defs881">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1545">
|
||||
<rect
|
||||
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect1547"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="-25.390602"
|
||||
y="312.93103" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="10.681815"
|
||||
inkscape:cy="89.597718"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1172"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata884">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-261.28123)">
|
||||
<rect
|
||||
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect819"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="3.5527137e-15"
|
||||
y="261.28122" />
|
||||
<image
|
||||
sodipodi:absref="../images/inventorhub.png"
|
||||
xlink:href="../images/inventorhub.png"
|
||||
style="stroke-width:5.92592621"
|
||||
width="34.915073"
|
||||
height="35.71875"
|
||||
preserveAspectRatio="none"
|
||||
id="image1481"
|
||||
x="2.6458333"
|
||||
y="261.28122" />
|
||||
<path
|
||||
style="fill:none;stroke:#84ba4c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 31.147057,265.82725 1.011052,2.9815 3.622948,-4.60003"
|
||||
id="path854"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
@@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150"
|
||||
height="135"
|
||||
viewBox="0 0 39.687499 35.718751"
|
||||
version="1.1"
|
||||
id="svg887"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="compat_movehub_false.svg">
|
||||
<defs
|
||||
id="defs881">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1545">
|
||||
<rect
|
||||
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect1547"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="-25.390602"
|
||||
y="312.93103" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="10.681815"
|
||||
inkscape:cy="89.597718"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1172"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata884">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-261.28123)">
|
||||
<rect
|
||||
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect819"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="3.5527137e-15"
|
||||
y="261.28122" />
|
||||
<image
|
||||
sodipodi:absref="../images/movehub.png"
|
||||
xlink:href="../images/movehub.png"
|
||||
transform="translate(25.390602,-51.6498)"
|
||||
clip-path="url(#clipPath1545)"
|
||||
style="stroke-width:5.92592621"
|
||||
width="40.183594"
|
||||
height="35.71875"
|
||||
preserveAspectRatio="none"
|
||||
id="image1492"
|
||||
x="-25.506657"
|
||||
y="312.93103" />
|
||||
<g
|
||||
id="g862"
|
||||
transform="matrix(0.84064533,0,0,0.84993509,-12.416361,243.07822)"
|
||||
style="stroke-width:1.18304348">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path856"
|
||||
d="m 51.33389,24.998882 5.622395,5.622396"
|
||||
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 56.956285,24.998882 51.33389,30.621278"
|
||||
id="path858"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
@@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150"
|
||||
height="135"
|
||||
viewBox="0 0 39.687499 35.718751"
|
||||
version="1.1"
|
||||
id="svg887"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="compat_movehub_true.svg">
|
||||
<defs
|
||||
id="defs881">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1545">
|
||||
<rect
|
||||
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect1547"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="-25.390602"
|
||||
y="312.93103" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="69.775738"
|
||||
inkscape:cy="79.243654"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1172"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata884">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-261.28123)">
|
||||
<rect
|
||||
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect819"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="7.1054274e-15"
|
||||
y="261.28122" />
|
||||
<image
|
||||
sodipodi:absref="../images/movehub.png"
|
||||
xlink:href="../images/movehub.png"
|
||||
transform="translate(25.390602,-51.6498)"
|
||||
clip-path="url(#clipPath1545)"
|
||||
style="stroke-width:5.92592621"
|
||||
width="40.183594"
|
||||
height="35.71875"
|
||||
preserveAspectRatio="none"
|
||||
id="image1492"
|
||||
x="-25.506657"
|
||||
y="312.93103" />
|
||||
<path
|
||||
style="fill:none;stroke:#84ba4c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 31.147057,265.82725 1.011052,2.9815 3.622948,-4.60003"
|
||||
id="path854"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1,104 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150"
|
||||
height="135"
|
||||
viewBox="0 0 39.687499 35.718751"
|
||||
version="1.1"
|
||||
id="svg887"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="compat_primehub_false.svg">
|
||||
<defs
|
||||
id="defs881">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1545">
|
||||
<rect
|
||||
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect1547"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="-25.390602"
|
||||
y="312.93103" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="10.681815"
|
||||
inkscape:cy="89.597718"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1172"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata884">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-261.28123)">
|
||||
<rect
|
||||
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect819"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="0"
|
||||
y="261.28122" />
|
||||
<image
|
||||
sodipodi:absref="../images/primehub.png"
|
||||
xlink:href="../images/primehub.png"
|
||||
style="stroke-width:5.92592621"
|
||||
width="34.915073"
|
||||
height="35.71875"
|
||||
preserveAspectRatio="none"
|
||||
id="image1503"
|
||||
x="2.6458333"
|
||||
y="261.28122" />
|
||||
<g
|
||||
id="g862"
|
||||
transform="matrix(0.84064533,0,0,0.84993509,-12.416361,243.07822)"
|
||||
style="stroke-width:1.18304348">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path856"
|
||||
d="m 51.33389,24.998882 5.622395,5.622396"
|
||||
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 56.956285,24.998882 51.33389,30.621278"
|
||||
id="path858"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
@@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150"
|
||||
height="135"
|
||||
viewBox="0 0 39.687499 35.718751"
|
||||
version="1.1"
|
||||
id="svg887"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="compat_primehub_true.svg">
|
||||
<defs
|
||||
id="defs881">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1545">
|
||||
<rect
|
||||
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect1547"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="-25.390602"
|
||||
y="312.93103" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="10.681815"
|
||||
inkscape:cy="89.597718"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1172"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata884">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-261.28123)">
|
||||
<rect
|
||||
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect819"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="0"
|
||||
y="261.28122" />
|
||||
<image
|
||||
sodipodi:absref="../images/primehub.png"
|
||||
xlink:href="../images/primehub.png"
|
||||
style="stroke-width:5.92592621"
|
||||
width="34.915073"
|
||||
height="35.71875"
|
||||
preserveAspectRatio="none"
|
||||
id="image1503"
|
||||
x="2.6458333"
|
||||
y="261.28122" />
|
||||
<path
|
||||
style="fill:none;stroke:#84ba4c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 31.147057,265.82725 1.011052,2.9815 3.622948,-4.60003"
|
||||
id="path854"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
@@ -0,0 +1,104 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150"
|
||||
height="135"
|
||||
viewBox="0 0 39.687499 35.718751"
|
||||
version="1.1"
|
||||
id="svg887"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="compat_technichub_false.svg">
|
||||
<defs
|
||||
id="defs881">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1545">
|
||||
<rect
|
||||
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect1547"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="-25.390602"
|
||||
y="312.93103" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="10.681815"
|
||||
inkscape:cy="89.597718"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1172"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata884">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-261.28123)">
|
||||
<rect
|
||||
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect819"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="0"
|
||||
y="261.28122" />
|
||||
<image
|
||||
sodipodi:absref="../images/technichub.png"
|
||||
xlink:href="../images/technichub.png"
|
||||
style="stroke-width:5.92592621"
|
||||
width="35.71875"
|
||||
height="35.71875"
|
||||
preserveAspectRatio="none"
|
||||
id="image1514"
|
||||
x="2.1503351"
|
||||
y="261.28122" />
|
||||
<g
|
||||
id="g862"
|
||||
transform="matrix(0.84064533,0,0,0.84993509,-12.416361,243.07822)"
|
||||
style="stroke-width:1.18304348">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path856"
|
||||
d="m 51.33389,24.998882 5.622395,5.622396"
|
||||
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 56.956285,24.998882 51.33389,30.621278"
|
||||
id="path858"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
@@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150"
|
||||
height="135"
|
||||
viewBox="0 0 39.687499 35.718751"
|
||||
version="1.1"
|
||||
id="svg887"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="compat_technichub_true.svg">
|
||||
<defs
|
||||
id="defs881">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1545">
|
||||
<rect
|
||||
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect1547"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="-25.390602"
|
||||
y="312.93103" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="51.592993"
|
||||
inkscape:cy="94.901019"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1853"
|
||||
inkscape:window-height="1145"
|
||||
inkscape:window-x="67"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata884">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-261.28123)">
|
||||
<rect
|
||||
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect819"
|
||||
width="39.6875"
|
||||
height="35.71875"
|
||||
x="0"
|
||||
y="261.28122" />
|
||||
<image
|
||||
sodipodi:absref="../images/technichub.png"
|
||||
xlink:href="../images/technichub.png"
|
||||
y="261.28122"
|
||||
x="2.1503351"
|
||||
id="image1514"
|
||||
preserveAspectRatio="none"
|
||||
height="35.71875"
|
||||
width="35.71875"
|
||||
style="stroke-width:5.92592621" />
|
||||
<path
|
||||
style="fill:none;stroke:#84ba4c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 31.147057,265.82725 1.011052,2.9815 3.622948,-4.60003"
|
||||
id="path854"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
@@ -0,0 +1,14 @@
|
||||
0 Name: hubs.ldr
|
||||
0 Author: Pybricks {laurens@pybricks.com}
|
||||
0 !LICENSE MIT
|
||||
0 ROTATION CENTER 0 0 0 1 "Custom"
|
||||
0 ROTATION CONFIG 0 0
|
||||
1 15 -20 -56 320 1 0 0 0 1 0 0 0 1 26910.dat
|
||||
1 15 -330 -80 110 0 0 1 0 1 0 -1 0 0 28738.dat
|
||||
1 71 -310 -40 390 1 0 0 0 1 0 0 0 1 22127.dat
|
||||
1 15 260 -16 90 1 0 0 0 1 0 0 0 1 45601p02.dat
|
||||
1 3 440 -16 10 1 0 0 0 1 0 0 0 1 45601c01.dat
|
||||
1 3 780 -16 -310 1 0 0 0 1 0 0 0 1 45601c01.dat
|
||||
1 15 -930 -40 360 1 0 0 0 1 0 0 0 1 95646c01.dat
|
||||
1 15 -1490 32 350 1 0 0 0 1 0 0 0 1 53788c01.dat
|
||||
0
|
||||
@@ -0,0 +1,11 @@
|
||||
0 Name: hubsoverview.ldr
|
||||
0 Author: Pybricks {laurens@pybricks.com}
|
||||
0 !LICENSE MIT
|
||||
0 ROTATION CENTER 0 0 0 1 "Custom"
|
||||
0 ROTATION CONFIG 0 0
|
||||
1 15 90 -56 300 1 0 0 0 1 0 0 0 1 26910.dat
|
||||
1 15 -150 -80 300 1 0 0 0 1 0 0 0 1 28738.dat
|
||||
1 71 -360 -40 120 -1 0 0 0 1 0 0 0 -1 22127.dat
|
||||
1 15 -160 -16 -40 1 0 0 0 1 0 0 0 1 45601p02.dat
|
||||
1 3 50 -16 -140 1 0 0 0 1 0 0 0 1 45601c01.dat
|
||||
0
|
||||
@@ -0,0 +1,40 @@
|
||||
0 Name: imu.ldr
|
||||
0 Author: Pybricks {laurens@pybricks.com}
|
||||
0 !LICENSE MIT
|
||||
0 ROTATION CENTER 0 0 0 1 "Custom"
|
||||
0 ROTATION CONFIG 0 0
|
||||
1 3 -80 -20 160 0 0 1 0 1 0 -1 0 0 45601c01.dat
|
||||
1 322 0 20 70 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
1 322 -160 20 70 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
1 322 0 20 250 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
1 322 -160 20 250 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
0 WRITE Type in the comment
|
||||
1 3 720 -80 170 0 0 -1 0 -1 0 -1 0 0 45601c01.dat
|
||||
1 322 800 20 80 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
1 322 640 20 80 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
1 322 800 20 260 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
1 322 640 20 260 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
0 WRITE Type in the comment
|
||||
1 3 720 -70 -630 0 1 0 0 0 -1 -1 0 0 45601c01.dat
|
||||
1 322 770 20 -720 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
1 322 610 20 -720 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
1 322 770 20 -540 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
1 322 610 20 -540 1 0 0 0 1 0 0 0 1 39367p01.dat
|
||||
0 WRITE Type in the comment
|
||||
0 WRITE Type in the comment
|
||||
0 MLCAD BTG Group name
|
||||
1 71 -230 60 -780 0 0 1 -1 0 0 0 -1 0 55615.dat
|
||||
0 MLCAD BTG Group name
|
||||
1 4 -90 60 -800 0 0 1 -1 0 0 0 -1 0 32278.dat
|
||||
0 MLCAD BTG Group name
|
||||
1 2 -250 60 -640 0 1 0 -1 0 0 0 0 1 32278.dat
|
||||
0 MLCAD BTG Group name
|
||||
1 71 -230 40 -780 0 0 1 0 1 0 -1 0 0 55615.dat
|
||||
0 MLCAD BTG Group name
|
||||
1 1 -250 -100 -780 0 1 0 0 0 -1 -1 0 0 32278.dat
|
||||
0 GROUP 5 Group name
|
||||
1 15 -20 90 -570 0 0 -1 0 -1 0 -1 0 0 3811.dat
|
||||
1 15 720 90 -570 0 0 -1 0 -1 0 -1 0 0 3811.dat
|
||||
1 15 -30 90 190 0 0 -1 0 -1 0 -1 0 0 3811.dat
|
||||
1 15 720 90 190 0 0 -1 0 -1 0 -1 0 0 3811.dat
|
||||
0
|
||||
|
After Width: | Height: | Size: 654 KiB |
@@ -0,0 +1,412 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
width="1250"
|
||||
height="720"
|
||||
viewBox="0 0 1250 720"
|
||||
sodipodi:docname="imuexamples.svg"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)">
|
||||
<image
|
||||
sodipodi:absref="imuexamples.png"
|
||||
xlink:href="imuexamples.png"
|
||||
y="0"
|
||||
x="0"
|
||||
id="image872"
|
||||
preserveAspectRatio="none"
|
||||
height="720"
|
||||
width="1250.0001"
|
||||
style="stroke-width:3.19999957" />
|
||||
<metadata
|
||||
id="metadata8">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs6">
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="marker8272"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend">
|
||||
<path
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path8270"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker6790"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always">
|
||||
<path
|
||||
id="path6788"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="marker5128"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
inkscape:collect="always">
|
||||
<path
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path5126"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath860">
|
||||
<rect
|
||||
style="fill:#6ab0de;fill-opacity:1;stroke:#6ab0de;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect862"
|
||||
width="589.10107"
|
||||
height="96.333336"
|
||||
x="235.33333"
|
||||
y="-236.00002" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath1040">
|
||||
<rect
|
||||
style="fill:#1e1e1e;fill-opacity:1;stroke:none;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect1042"
|
||||
width="128.5101"
|
||||
height="19.934668"
|
||||
x="827.15656"
|
||||
y="74.666672" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#fcfcfc"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1853"
|
||||
inkscape:window-height="1145"
|
||||
id="namedview4"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.75000002"
|
||||
inkscape:cx="643.10407"
|
||||
inkscape:cy="459.26885"
|
||||
inkscape:window-x="67"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
inkscape:snap-global="false" />
|
||||
<rect
|
||||
style="opacity:1;fill:#e7f2fa;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect1090"
|
||||
width="88.926552"
|
||||
height="42.092525"
|
||||
x="415.71399"
|
||||
y="513.96191" />
|
||||
<rect
|
||||
style="opacity:1;fill:#6ab0de;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect1092"
|
||||
width="88.926552"
|
||||
height="4"
|
||||
x="415.71399"
|
||||
y="513.96191" />
|
||||
<text
|
||||
id="text1096"
|
||||
y="544.38055"
|
||||
x="423.85089"
|
||||
style="font-style:normal;font-weight:normal;font-size:24.19441986px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#404140;fill-opacity:1;stroke:none;stroke-width:0.60486054"
|
||||
xml:space="preserve"><tspan
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#404140;fill-opacity:1;stroke-width:0.60486054"
|
||||
y="544.38055"
|
||||
x="423.85089"
|
||||
id="tspan1094"
|
||||
sodipodi:role="line">Y: Left</tspan></text>
|
||||
<rect
|
||||
y="519.35236"
|
||||
x="773.67474"
|
||||
height="42.092525"
|
||||
width="148.7303"
|
||||
id="rect875"
|
||||
style="opacity:1;fill:#e7f2fa;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<rect
|
||||
y="519.35236"
|
||||
x="773.67474"
|
||||
height="4"
|
||||
width="148.7303"
|
||||
id="rect877"
|
||||
style="opacity:1;fill:#6ab0de;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:24.19441986px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#404140;fill-opacity:1;stroke:none;stroke-width:0.60486054"
|
||||
x="783.47827"
|
||||
y="549.93768"
|
||||
id="text881"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan879"
|
||||
x="783.47827"
|
||||
y="549.93768"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#404140;fill-opacity:1;stroke-width:0.60486054">X: Forward</tspan></text>
|
||||
<rect
|
||||
style="opacity:1;fill:#e7f2fa;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect883"
|
||||
width="84.926552"
|
||||
height="42.092525"
|
||||
x="613.005"
|
||||
y="435.9295" />
|
||||
<rect
|
||||
style="opacity:1;fill:#6ab0de;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect885"
|
||||
width="84.926552"
|
||||
height="4"
|
||||
x="613.005"
|
||||
y="435.9295" />
|
||||
<text
|
||||
id="text889"
|
||||
y="466.51483"
|
||||
x="626.14191"
|
||||
style="font-style:normal;font-weight:normal;font-size:24.19441986px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#404140;fill-opacity:1;stroke:none;stroke-width:0.60486054"
|
||||
xml:space="preserve"><tspan
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#404140;fill-opacity:1;stroke-width:0.60486054"
|
||||
y="466.51483"
|
||||
x="626.14191"
|
||||
id="tspan887"
|
||||
sodipodi:role="line">Z: Up</tspan></text>
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4694"
|
||||
d="M 814.16733,68.128379 C 812.90144,125.87929 718.05656,283.01422 674.91202,173.29441"
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<rect
|
||||
style="opacity:1;fill:#e7f2fa;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4696"
|
||||
width="224.77599"
|
||||
height="42.092525"
|
||||
x="746.64636"
|
||||
y="31.371185" />
|
||||
<rect
|
||||
style="opacity:1;fill:#6ab0de;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4698"
|
||||
width="224.77599"
|
||||
height="4"
|
||||
x="746.64636"
|
||||
y="31.371185" />
|
||||
<text
|
||||
id="text4702"
|
||||
y="61.956482"
|
||||
x="756.44995"
|
||||
style="font-style:normal;font-weight:normal;font-size:24.19441986px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#404140;fill-opacity:1;stroke:none;stroke-width:0.60486054"
|
||||
xml:space="preserve"><tspan
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#404140;fill-opacity:1;stroke-width:0.60486054"
|
||||
y="61.956482"
|
||||
x="756.44995"
|
||||
id="tspan4700"
|
||||
sodipodi:role="line">top_side = -Axis.Z</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 588.78088,131.62753 C 602.71447,261.13607 408.36126,182.49627 438.30137,83.694259"
|
||||
id="path4704"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<rect
|
||||
y="46.682903"
|
||||
x="354.89914"
|
||||
height="42.092525"
|
||||
width="244.42542"
|
||||
id="rect4684"
|
||||
style="opacity:1;fill:#e7f2fa;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<rect
|
||||
y="46.682903"
|
||||
x="354.89914"
|
||||
height="4"
|
||||
width="244.42542"
|
||||
id="rect4686"
|
||||
style="opacity:1;fill:#6ab0de;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:24.19441986px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#404140;fill-opacity:1;stroke:none;stroke-width:0.60486054"
|
||||
x="364.70273"
|
||||
y="77.268227"
|
||||
id="text4690"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4688"
|
||||
x="364.70273"
|
||||
y="77.268227"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#404140;fill-opacity:1;stroke-width:0.60486054">front_side = -Axis.X</tspan></text>
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4716"
|
||||
d="m 980.70246,244.86037 c 22.58974,-82.56389 91.04754,17.95479 125.63244,-75.14241"
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<rect
|
||||
style="opacity:1;fill:#e7f2fa;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4718"
|
||||
width="232.75874"
|
||||
height="42.092525"
|
||||
x="1002.7154"
|
||||
y="152.06769" />
|
||||
<rect
|
||||
style="opacity:1;fill:#6ab0de;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4720"
|
||||
width="232.75874"
|
||||
height="4"
|
||||
x="1002.7154"
|
||||
y="152.06769" />
|
||||
<text
|
||||
id="text4724"
|
||||
y="182.65302"
|
||||
x="1012.519"
|
||||
style="font-style:normal;font-weight:normal;font-size:24.19441986px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#404140;fill-opacity:1;stroke:none;stroke-width:0.60486054"
|
||||
xml:space="preserve"><tspan
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#404140;fill-opacity:1;stroke-width:0.60486054"
|
||||
y="182.65302"
|
||||
x="1012.519"
|
||||
id="tspan4722"
|
||||
sodipodi:role="line">front_side = Axis.Z</tspan></text>
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4736"
|
||||
d="M 1032.9329,450.74191 C 947.09947,493.10021 907.59636,422.33393 942.18123,329.23673"
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<rect
|
||||
y="431.80176"
|
||||
x="1020.7235"
|
||||
height="42.092525"
|
||||
width="223.09496"
|
||||
id="rect4728"
|
||||
style="opacity:1;fill:#e7f2fa;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<rect
|
||||
y="431.80176"
|
||||
x="1020.7235"
|
||||
height="4"
|
||||
width="223.09496"
|
||||
id="rect4730"
|
||||
style="opacity:1;fill:#6ab0de;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:24.19441986px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#404140;fill-opacity:1;stroke:none;stroke-width:0.60486054"
|
||||
x="1028.8771"
|
||||
y="462.38702"
|
||||
id="text4734"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4732"
|
||||
x="1028.8771"
|
||||
y="462.38702"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#404140;fill-opacity:1;stroke-width:0.60486054">top_side = -Axis.X</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 281.59646,261.93718 c -22.58969,-82.56389 -41.04752,14.62146 -75.63239,-78.47574"
|
||||
id="path4738"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<rect
|
||||
y="167.09308"
|
||||
x="109.27574"
|
||||
height="42.092525"
|
||||
width="215.38545"
|
||||
id="rect4740"
|
||||
style="opacity:1;fill:#e7f2fa;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<rect
|
||||
y="167.09308"
|
||||
x="109.27574"
|
||||
height="4"
|
||||
width="215.38545"
|
||||
id="rect4742"
|
||||
style="opacity:1;fill:#6ab0de;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:24.19441986px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#404140;fill-opacity:1;stroke:none;stroke-width:0.60486054"
|
||||
x="119.07937"
|
||||
y="197.67841"
|
||||
id="text4746"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4744"
|
||||
x="119.07937"
|
||||
y="197.67841"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#404140;fill-opacity:1;stroke-width:0.60486054">top_side = Axis.Z</tspan></text>
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4758"
|
||||
d="m 420.02759,339.6125 c 9.12433,-59.47413 -33.03745,-120.40753 -79.74207,-81.45106"
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<rect
|
||||
style="opacity:1;fill:#e7f2fa;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4750"
|
||||
width="234.44266"
|
||||
height="42.092525"
|
||||
x="404.79791"
|
||||
y="314.1073" />
|
||||
<rect
|
||||
style="opacity:1;fill:#6ab0de;fill-opacity:1;stroke:none;stroke-width:2.13333321;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4752"
|
||||
width="234.44266"
|
||||
height="4"
|
||||
x="404.79791"
|
||||
y="314.1073" />
|
||||
<text
|
||||
id="text4756"
|
||||
y="344.69263"
|
||||
x="414.6015"
|
||||
style="font-style:normal;font-weight:normal;font-size:24.19441986px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#404140;fill-opacity:1;stroke:none;stroke-width:0.60486054"
|
||||
xml:space="preserve"><tspan
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#404140;fill-opacity:1;stroke-width:0.60486054"
|
||||
y="344.69263"
|
||||
x="414.6015"
|
||||
id="tspan4754"
|
||||
sodipodi:role="line">front_side = Axis.X</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5128)"
|
||||
d="M 601.65481,535.63708 V 437.18765"
|
||||
id="path5118"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6786"
|
||||
d="M 736.87546,624.06352 822.93347,573.9822"
|
||||
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6790)" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker8272)"
|
||||
d="M 528.06103,622.66606 432.1922,566.71727"
|
||||
id="path8268"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 292 KiB After Width: | Height: | Size: 292 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |