diff --git a/.commitlintrc.yml b/.commitlintrc.yml
new file mode 100644
index 0000000..ae711cf
--- /dev/null
+++ b/.commitlintrc.yml
@@ -0,0 +1,24 @@
+# SPDX-FileCopyrightText: Copyright DB InfraGO AG and the capellambse contributors
+# SPDX-License-Identifier: CC0-1.0
+rules:
+ body-leading-blank: [2, always]
+ footer-leading-blank: [2, always]
+ scope-case: [2, always, lower-case]
+ subject-case: [2, always, sentence-case]
+ subject-empty: [2, never]
+ subject-full-stop: [2, never, .]
+ subject-max-length: [2, always, 72]
+ type-empty: [2, never]
+ type-enum: [2, always, [
+ build,
+ chore,
+ ci,
+ docs,
+ feat,
+ fix,
+ merge,
+ perf,
+ refactor,
+ revert,
+ test,
+ ]]
diff --git a/.git_archival.txt b/.git_archival.txt
index 1c1d2e8..5a4899c 100644
--- a/.git_archival.txt
+++ b/.git_archival.txt
@@ -1,4 +1,4 @@
-Copyright DB Netz AG and contributors
+Copyright DB InfraGO AG and contributors
SPDX-License-Identifier: CC0-1.0
node: $Format:%H$
diff --git a/.gitattributes b/.gitattributes
index de62da1..e9dd5d5 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: CC0-1.0
* text=auto
diff --git a/.github/workflows/build-test-publish.yml b/.github/workflows/build-test-publish.yml
index 5b03088..5db9f4d 100644
--- a/.github/workflows/build-test-publish.yml
+++ b/.github/workflows/build-test-publish.yml
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: CC0-1.0
name: Build
@@ -18,11 +18,12 @@ jobs:
matrix:
os: [ubuntu-latest]
python_version:
- - "3.9"
- "3.10"
+ - "3.11"
+ - "3.12"
include:
- os: windows-latest
- python_version: "3.9"
+ python_version: "3.10"
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{matrix.python_version}}
@@ -55,7 +56,7 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v2
with:
- python-version: "3.9"
+ python-version: "3.10"
- name: Install dependencies
run: |-
python -m pip install -U pip
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 45fe026..8307775 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: CC0-1.0
name: Docs
@@ -18,7 +18,7 @@ jobs:
fetch-depth: 0
- uses: actions/setup-python@v2
with:
- python-version: "3.9"
+ python-version: "3.10"
- name: Upgrade pip
run: |
python -m pip install -U pip
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 1decfee..26dc57f 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: CC0-1.0
name: Lint
@@ -14,7 +14,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
- python-version: "3.9"
+ python-version: "3.10"
- name: Upgrade pip
run: |-
python -m pip install -U pip
@@ -30,7 +30,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
- python-version: "3.9"
+ python-version: "3.10"
- name: Upgrade pip
run: |-
python -m pip install -U pip
diff --git a/.github/workflows/pr-target.yml b/.github/workflows/pr-target.yml
new file mode 100644
index 0000000..ab7c0ae
--- /dev/null
+++ b/.github/workflows/pr-target.yml
@@ -0,0 +1,81 @@
+# SPDX-FileCopyrightText: Copyright DB InfraGO AG and the capellambse contributors
+# SPDX-License-Identifier: CC0-1.0
+
+name: Conventional Commits
+
+on:
+ pull_request_target:
+ types: [opened, synchronize]
+
+permissions:
+ contents: read
+ pull-requests: write
+
+jobs:
+ conventional-commits:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the base branch
+ # Commitlint will use the configuration that is checked out; i.e. in
+ # this case it will use the config from the PR's base branch, which
+ # must have already been approved by someone with repo write access.
+ #
+ # Because commitlint accepts arbitrary JavaScript as configuration,
+ # this is necessary to prevent code injection attacks. Combined with
+ # the `pull-requests: write` permission needed for posting comments,
+ # this could potentially allow an attacker to merge any code into any
+ # branch.
+ #
+ # However, it also means that (good) pull requests intended to change
+ # or extend the config will be validated against the old config, which
+ # may cause false errors.
+ uses: actions/checkout@v3
+ with:
+ ref: ${{ github.event.pull_request.base.ref }}
+
+ - name: Pull the PR
+ run: git fetch origin +${{ github.event.pull_request.head.sha }}
+
+ - name: Install commitlint
+ run: npm install -g @commitlint/cli
+
+ - name: Validate commit messages
+ id: conventional-commits
+ continue-on-error: true
+ env:
+ SHA_FROM: ${{ github.event.pull_request.base.sha }}
+ SHA_TO: ${{ github.event.pull_request.head.sha }}
+ run: |
+ delim="_EOF_$(uuidgen)"
+ echo "validation-result<<$delim" >> "$GITHUB_OUTPUT"
+ r=0
+ commitlint --from "$SHA_FROM" --to "$SHA_TO" >> "$GITHUB_OUTPUT" 2>&1 || r=$?
+ echo "$delim" >> "$GITHUB_OUTPUT"
+ exit $r
+
+ - name: Post comment if validation failed
+ if: steps.conventional-commits.outcome == "failure"
+ env:
+ GH_TOKEN: ${{ github.token }}
+ PR_NUMBER: ${{ github.event.pull_request.number }}
+ TEXT: |-
+ The pull request does not conform to the conventional commit specification. Please ensure that your commit messages follow the spec:
+
+
+
+ We also strongly recommend that you set up your development environment with pre-commit, as described in our [CONTRIBUTING guidelines](https://github.com/DSD-DBS/py-capellambse/blob/master/CONTRIBUTING.rst). This will run all the important checks right before you commit your changes, and avoids lengthy CI wait time and round trips.
+
+ The following commits failed to validate:
+
+ ```
+ ${{ steps.conventional-commits.outputs.validation-result }}
+ ```
+
+ Here are some examples of valid commit messages:
+
+ ```
+ feat(model): Add realized_states to State and Mode
+ fix(aird): Fix ZeroDivisionError with zero-sized circles
+ docs(readme): Update project description
+ ```
+ run: 'gh pr comment "$PR_NUMBER" -F - <<< "$TEXT"'
diff --git a/.gitignore b/.gitignore
index 975287e..6dddc2e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: CC0-1.0
# Byte-compiled / optimized / DLL files
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 7315f4a..1919daf 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,11 +1,11 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: CC0-1.0
default_install_hook_types: [commit-msg, pre-commit]
default_stages: [commit, merge-commit]
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.4.0
+ rev: v4.5.0
hooks:
- id: check-added-large-files
- id: check-ast
@@ -26,11 +26,11 @@ repos:
- id: fix-byte-order-marker
- id: trailing-whitespace
- repo: https://github.com/psf/black-pre-commit-mirror
- rev: 23.9.1
+ rev: 23.12.1
hooks:
- id: black
- repo: https://github.com/PyCQA/isort
- rev: 5.12.0
+ rev: 5.13.2
hooks:
- id: isort
- repo: https://github.com/PyCQA/docformatter
@@ -47,11 +47,11 @@ repos:
additional_dependencies:
- pydocstyle[toml]
- repo: https://github.com/pre-commit/mirrors-mypy
- rev: v1.5.1
+ rev: v1.8.0
hooks:
- id: mypy
- repo: https://github.com/Lucas-C/pre-commit-hooks
- rev: v1.4.2
+ rev: v1.5.4
hooks:
- id: insert-license
name: Insert license headers (shell-style comments)
@@ -98,6 +98,6 @@ repos:
hooks:
- id: reuse
- repo: https://github.com/qoomon/git-conventional-commits
- rev: v2.6.5
+ rev: v2.6.7
hooks:
- id: conventional-commits
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 3bd1561..fa1edc1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,5 +1,5 @@
@@ -32,10 +32,14 @@ pytest
We additionally recommend that you set up your editor / IDE as follows.
+- Indent with 4 spaces per level of indentation
- Indent with 4 spaces per level of indentation
+- Maximum line length of 79 (add a ruler / thin line / highlighting / ...)
- Maximum line length of 79 (add a ruler / thin line / highlighting / ...)
+- _If you use Visual Studio Code_: Consider using a platform which supports
+ third-party language servers more easily, and continue with the next point.
- _If you use Visual Studio Code_: Consider using a platform which supports
third-party language servers more easily, and continue with the next point.
@@ -51,19 +55,40 @@ We additionally recommend that you set up your editor / IDE as follows.
}
```
+ ```json
+ "[python]": {
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": true
+ }
+ }
+ ```
+
+ Note that the Pylance language server is not recommended, as it occasionally
+ causes false-positive errors for perfectly valid code.
Note that the Pylance language server is not recommended, as it occasionally
causes false-positive errors for perfectly valid code.
+- _If you do not use VSC_: Set up your editor to use the [python-lsp-server],
+ and make sure that the relevant plugins are installed. You can install
+ everything that's needed into the virtualenv with pip:
- _If you do not use VSC_: Set up your editor to use the [python-lsp-server],
and make sure that the relevant plugins are installed. You can install
everything that's needed into the virtualenv with pip:
+ [python-lsp-server]: https://github.com/python-lsp/python-lsp-server
[python-lsp-server]: https://github.com/python-lsp/python-lsp-server
```sh
pip install "python-lsp-server[pylint]" python-lsp-black pyls-isort pylsp-mypy
```
+ ```sh
+ pip install "python-lsp-server[pylint]" python-lsp-black pyls-isort pylsp-mypy
+ ```
+
+ This will provide as-you-type linting as well as automatic formatting on
+ save. Language server clients are available for a wide range of editors, from
+ Vim/Emacs to PyCharm/IDEA.
This will provide as-you-type linting as well as automatic formatting on
save. Language server clients are available for a wide range of editors, from
Vim/Emacs to PyCharm/IDEA.
@@ -74,27 +99,47 @@ We base our code style on a modified version of the
[Google style guide for Python code](https://google.github.io/styleguide/pyguide.html).
The key differences are:
+- **Docstrings**: The [Numpy style guide] applies here.
- **Docstrings**: The [Numpy style guide] applies here.
[numpy style guide]: https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard
+ [numpy style guide]: https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard
+ When writing docstrings for functions, use the imperative style, as per
+ [PEP-257]). For example, write "Do X and Y" instead of "Does X and Y".
When writing docstrings for functions, use the imperative style, as per
[PEP-257]). For example, write "Do X and Y" instead of "Does X and Y".
[pep-257]: https://peps.python.org/pep-0257/
+ [pep-257]: https://peps.python.org/pep-0257/
+- **Overridden methods**: If the documentation did not change from the base
+ class (i.e. the base class' method's docstring still applies without
+ modification), do not add a short docstring á la "See base class". This lets
+ automated tools pick up the full base class docstring instead, and is
+ therefore more useful in IDEs etc.
- **Overridden methods**: If the documentation did not change from the base
class (i.e. the base class' method's docstring still applies without
modification), do not add a short docstring á la "See base class". This lets
automated tools pick up the full base class docstring instead, and is
therefore more useful in IDEs etc.
+- **Linting**: Use [pylint] for static code analysis, and [mypy] for static
+ type checking.
- **Linting**: Use [pylint] for static code analysis, and [mypy] for static
type checking.
[pylint]: https://github.com/PyCQA/pylint
[mypy]: https://github.com/python/mypy
+ [pylint]: https://github.com/PyCQA/pylint
+ [mypy]: https://github.com/python/mypy
+- **Formatting**: Use [black] as code auto-formatter. The maximum line length
+ is 79, as per [PEP-8]. This setting should be automatically picked up from
+ the `pyproject.toml` file. The reason for the shorter line length is that it
+ avoids wrapping and overflows in side-by-side split views (e.g. diffs) if
+ there's also information displayed to the side of it (e.g. a tree view of the
+ modified files).
- **Formatting**: Use [black] as code auto-formatter. The maximum line length
is 79, as per [PEP-8]. This setting should be automatically picked up from
the `pyproject.toml` file. The reason for the shorter line length is that it
@@ -102,33 +147,42 @@ The key differences are:
there's also information displayed to the side of it (e.g. a tree view of the
modified files).
+ [black]: https://github.com/psf/black
+ [pep-8]: https://www.python.org/dev/peps/pep-0008/
[black]: https://github.com/psf/black
[pep-8]: https://www.python.org/dev/peps/pep-0008/
+ Be aware of the different line length of 72 for docstrings. We currently do
+ not have a satisfactory solution to automatically apply or enforce this.
Be aware of the different line length of 72 for docstrings. We currently do
not have a satisfactory solution to automatically apply or enforce this.
+ Note that, while you're encouraged to do so in general, it is not a hard
+ requirement to break up long strings into smaller parts. Additionally, never
+ break up strings that are presented to the user in e.g. log messages, as that
+ makes it significantly harder to grep for them.
Note that, while you're encouraged to do so in general, it is not a hard
requirement to break up long strings into smaller parts. Additionally, never
break up strings that are presented to the user in e.g. log messages, as that
makes it significantly harder to grep for them.
+ Use [isort] for automatic sorting of imports. Its settings should
+ automatically be picked up from the `pyproject.toml` file as well.
Use [isort] for automatic sorting of imports. Its settings should
automatically be picked up from the `pyproject.toml` file as well.
[isort]: https://github.com/PyCQA/isort
+ [isort]: https://github.com/PyCQA/isort
+- **Typing**: We do not make an exception for `typing` imports. Instead of
+ writing `from typing import SomeName`, use `import typing as t` and access
+ typing related classes like `t.TypedDict`.
- **Typing**: We do not make an exception for `typing` imports. Instead of
writing `from typing import SomeName`, use `import typing as t` and access
typing related classes like `t.TypedDict`.
- Use the new syntax and classes for typing introduced with Python 3.10 and available using
- `from __future__ import annotations` since Python 3.8.
-
- Be aware however that this only works in the context of annotations; the code
- still needs to run on Python 3.9! This means that in some (rare) cases, you _must_ use the
- old-style type hints.
+ Use the new syntax and classes for typing introduced with Python 3.10.
- Instead of `t.Tuple`, `t.List` etc. use the builtin classes `tuple`, `list`
etc.
@@ -140,13 +194,22 @@ The key differences are:
`t.Optional[...]` and always explicitly annotate where `None` is possible.
[pep-604-style unions]: https://www.python.org/dev/peps/pep-0604/
+ [pep-604-style unions]: https://www.python.org/dev/peps/pep-0604/
+- **Python style rules**: For conflicting parts, the [Black code style] wins.
+ If you have set up black correctly, you don't need to worry about this though
+ :)
- **Python style rules**: For conflicting parts, the [Black code style] wins.
If you have set up black correctly, you don't need to worry about this though
:)
[black code style]: https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html
+ [black code style]: https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html
+- When working with `dict`s, consider using `t.TypedDict` instead of a more
+ generic `dict[str, float|int|str]`-like annotation where possible, as the
+ latter is much less precise (often requiring additional `assert`s or
+ `isinstance` checks to pass) and can grow unwieldy very quickly.
- When working with `dict`s, consider using `t.TypedDict` instead of a more
generic `dict[str, float|int|str]`-like annotation where possible, as the
latter is much less precise (often requiring additional `assert`s or
@@ -154,3 +217,5 @@ The key differences are:
- Prefer `t.NamedTuple` over `collections.namedtuple`, because the former uses
a more convenient `class ...:` syntax and also supports type annotations.
+- Prefer `t.NamedTuple` over `collections.namedtuple`, because the former uses
+ a more convenient `class ...:` syntax and also supports type annotations.
diff --git a/LICENSES/.license_header.txt b/LICENSES/.license_header.txt
index c3fb022..dfb50dd 100644
--- a/LICENSES/.license_header.txt
+++ b/LICENSES/.license_header.txt
@@ -1,2 +1,6 @@
+<<<<<<< HEAD
Copyright DB Netz AG and contributors
+=======
+Copyright DB InfraGO AG and contributors
+>>>>>>> 40ef464 (feat: Make tree view draggable)
SPDX-License-Identifier: Apache-2.0
diff --git a/README.md b/README.md
index 6f3eed9..70e3862 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
@@ -8,7 +8,7 @@
![image](https://github.com/DSD-DBS/capella-ros-tools/actions/workflows/build-test-publish.yml/badge.svg)
![image](https://github.com/DSD-DBS/capella-ros-tools/actions/workflows/lint.yml/badge.svg)
-API and scripts to parse .msg files and convert them to Capella
+Tool for converting ROS messages from and to Capella models.
# Documentation
@@ -48,7 +48,7 @@ look at our [guidelines for contributors](CONTRIBUTING.md) for details.
This project is compliant with the
[REUSE Specification Version 3.0](https://git.fsfe.org/reuse/docs/src/commit/d173a27231a36e1a2a3af07421f5e557ae0fec46/spec.md).
-Copyright DB Netz AG, licensed under Apache 2.0 (see full text in
+Copyright DB InfraGO AG, licensed under Apache 2.0 (see full text in
[LICENSES/Apache-2.0.txt](LICENSES/Apache-2.0.txt))
Dot-files are licensed under CC0-1.0 (see full text in
diff --git a/capella_ros_tools/__init__.py b/capella_ros_tools/__init__.py
index c41de8b..b1ace6b 100644
--- a/capella_ros_tools/__init__.py
+++ b/capella_ros_tools/__init__.py
@@ -1,7 +1,6 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
"""The capella_ros_tools package."""
-
from importlib import metadata
try:
diff --git a/capella_ros_tools/__main__.py b/capella_ros_tools/__main__.py
index c40c1db..755444a 100644
--- a/capella_ros_tools/__main__.py
+++ b/capella_ros_tools/__main__.py
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
"""Main entry point into capella_ros_tools."""
@@ -10,8 +10,8 @@
import click
import capella_ros_tools
-from capella_ros_tools.display import app
from capella_ros_tools.scripts import capella2msg, msg2capella
+from capella_ros_tools.snapshot import app
@click.command()
@@ -27,9 +27,8 @@
default="c" if sys.stdin.isatty() else "a",
help="Default action when an element already exists: (c)heck, (k)eep, (o)verwrite, (a)bort.",
)
-@click.option("--port", "-p", type=int, help="Port for HTML display.")
+@click.option("--port", type=int, help="Port for HTML display.")
@click.option(
- "--in",
"-i",
"in_",
nargs=2,
@@ -38,8 +37,8 @@
help="Input file type and path.",
)
@click.option(
- "--out",
"-o",
+ "out",
nargs=2,
type=(
click.Choice(["capella", "messages"]),
@@ -49,8 +48,8 @@
help="Output file type and path.",
)
@click.option(
- "--layer",
"-l",
+ "layer",
type=click.Choice(["oa", "sa", "la", "pa"], case_sensitive=True),
required=True,
help="Layer to use.",
@@ -91,16 +90,18 @@ def cli(
input = (
input
if input.exists()
- else capellambse.filehandler.get_filehandler(input_path).rootdir
+ else capellambse.filehandler.get_filehandler(input_path)
)
msg_path, capella_path, convert_class = (
- (input, output, msg2capella.Converter)
+ (input.rootdir, output, msg2capella.Converter)
if input_type == "messages"
else (output, input, capella2msg.Converter)
)
- converter = convert_class(msg_path, capella_path, layer, action, no_deps)
+ converter: t.Any = convert_class(
+ msg_path, capella_path, layer, action, no_deps
+ )
converter.convert()
if port:
diff --git a/capella_ros_tools/modules/__init__.py b/capella_ros_tools/modules/__init__.py
index b4f5599..c253554 100644
--- a/capella_ros_tools/modules/__init__.py
+++ b/capella_ros_tools/modules/__init__.py
@@ -1,3 +1,3 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
-"""Capella_ros_tools modules."""
+"""The modules package."""
diff --git a/capella_ros_tools/modules/capella/__init__.py b/capella_ros_tools/modules/capella/__init__.py
index 1859e4d..2449cb0 100644
--- a/capella_ros_tools/modules/capella/__init__.py
+++ b/capella_ros_tools/modules/capella/__init__.py
@@ -1,6 +1,7 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
-"""Capella model definition."""
+"""The capella module."""
+
import typing as t
import capellambse
@@ -11,7 +12,7 @@ class EnumValue(t.NamedTuple):
type: str
name: str
- value: int
+ value: str
description: str
@@ -29,8 +30,8 @@ class ClassProperty(t.NamedTuple):
type_name: str
type_pkg_name: str
name: str
- min_card: float
- max_card: float
+ min_card: str
+ max_card: str
description: str
@@ -43,7 +44,7 @@ class ClassDef(t.NamedTuple):
class BaseCapellaModel:
- """Base class for capella model."""
+ """Base class for Capella model."""
def __init__(
self,
diff --git a/capella_ros_tools/modules/capella/parser.py b/capella_ros_tools/modules/capella/parser.py
index 3d779c2..da98504 100644
--- a/capella_ros_tools/modules/capella/parser.py
+++ b/capella_ros_tools/modules/capella/parser.py
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
"""Parser for Capella model."""
import typing as t
diff --git a/capella_ros_tools/modules/capella/serializer.py b/capella_ros_tools/modules/capella/serializer.py
index 9d39185..ff94cc2 100644
--- a/capella_ros_tools/modules/capella/serializer.py
+++ b/capella_ros_tools/modules/capella/serializer.py
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
"""Serializer for Capella model."""
import logging
@@ -13,7 +13,7 @@
class CapellaModel(BaseCapellaModel):
- """Capella model definition for serializing model."""
+ """Capella model definition for serialized model."""
def create_packages(
self, packages: list[str], package: t.Any = None
@@ -108,15 +108,15 @@ def create_enums(
return overlap
- def delete_enums(self, types: list, package: t.Any = None) -> None:
- """Delete types in Capella model."""
+ def delete_enums(self, enums: list, package: t.Any = None) -> None:
+ """Delete enums in Capella model."""
if package is None:
package = self.data
- for type in types:
+ for enum in enums:
try:
- package.datatypes.remove(type)
- logger.info("Deleted %s.", type.name)
+ package.datatypes.remove(enum)
+ logger.info("Deleted %s.", enum.name)
except ValueError:
pass
@@ -171,10 +171,10 @@ def create_properties(self, cls: ClassDef, package: t.Any):
type=superclass,
kind="ASSOCIATION",
min_card=capellambse.new_object(
- "LiteralNumericValue", value=1
+ "LiteralNumericValue", value="1"
),
max_card=capellambse.new_object(
- "LiteralNumericValue", value=1
+ "LiteralNumericValue", value="1"
),
)
self._set_cardinality(composition, prop)
diff --git a/capella_ros_tools/modules/messages/__init__.py b/capella_ros_tools/modules/messages/__init__.py
index ae0ea70..74e18ef 100644
--- a/capella_ros_tools/modules/messages/__init__.py
+++ b/capella_ros_tools/modules/messages/__init__.py
@@ -1,22 +1,26 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
-"""IDL Message definition.""" ""
+"""The messages module."""
+
import typing as t
class BaseTypeDef:
- """Type definition for a field or constant in a message."""
+ """Base type definition for a field or constant in a message."""
def __init__(
self,
name: str,
- array_size: float | None = None,
+ array_size: str | None = None,
pkg_name: str | None = None,
) -> None:
self.name = name
"""Name of the type."""
self.array_size = array_size
- """Max size of the array."""
+ """Max size of the array.
+
+ None: type is not an array
+ """
self.pkg_name = pkg_name
"""Name of the package the type is defined in.
@@ -62,7 +66,7 @@ def __init__(
class BaseMessageDef:
- """Definition of a message."""
+ """Base definition of a message."""
def __init__(
self,
@@ -85,7 +89,8 @@ def _repr_html_(self):
)
for field in self.fields:
fragments.append(
- f'
{field.type.pkg_name+"/" if field.type.pkg_name else ""}{field.type.name}{"[]" if field.type.array_size == float("inf") else f"[{field.type.array_size}]" if field.type.array_size else ""} {field.name} '
+ f" {field.type.pkg_name+'/' if field.type.pkg_name else ''}"
+ f"{field.type.name}{'[]' if field.type.array_size == '*' else f'[{field.type.array_size}]' if field.type.array_size else ''} {field.name} "
+ " ".join(field.annotations)
+ " "
)
@@ -109,7 +114,7 @@ def _repr_html_(self):
class BaseMessagePkgDef:
- """Definition of a message package."""
+ """Base definition of a message package."""
def __init__(self, name: str, messages: list, packages: list):
self.name = name
@@ -117,4 +122,10 @@ def __init__(self, name: str, messages: list, packages: list):
self.packages = packages
def _repr_html_(self):
- return f'{self.name} Messages {"".join([f"{msg.name} " for msg in self.messages])} Packages {"".join([f"{pkg.name} " for pkg in self.packages])} '
+ return (
+ f"{self.name} Messages "
+ f"{''.join([f'{msg.name} ' for msg in self.messages])}"
+ " Packages "
+ f"{''.join([f'{pkg.name} ' for pkg in self.packages])}"
+ " "
+ )
diff --git a/capella_ros_tools/modules/messages/parser.py b/capella_ros_tools/modules/messages/parser.py
index 4e615aa..fb647d0 100644
--- a/capella_ros_tools/modules/messages/parser.py
+++ b/capella_ros_tools/modules/messages/parser.py
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
"""Parser for IDL messages."""
import os
@@ -51,7 +51,7 @@
class TypeDef(BaseTypeDef):
- """Type definition for a field or constant in a message."""
+ """Type definition for a field or constant in a parsed message."""
def __init__(self, type_string: str) -> None:
super().__init__(type_string)
@@ -61,13 +61,12 @@ def __init__(self, type_string: str) -> None:
index = type_string.rindex("[")
array_size_string = type_string[index + 1 : -1]
if array_size_string:
- array_size_string = array_size_string.lstrip(
+ self.array_size = array_size_string.lstrip(
ARRAY_UPPER_BOUND_TOKEN
)
- self.array_size = float(array_size_string)
else:
# dynamic array
- self.array_size = float("inf")
+ self.array_size = "*"
type_string = type_string[:index]
@@ -83,7 +82,7 @@ def __init__(self, type_string: str) -> None:
def _extract_file_level_comments(message_string: str):
- """Extract comments at the beginning of the message file."""
+ """Extract comments at the beginning of the message."""
lines = message_string.splitlines()
if lines and not lines[0].strip():
lines = lines[1:]
@@ -100,18 +99,18 @@ def _extract_file_level_comments(message_string: str):
class MessageDef(BaseMessageDef):
- """Message definition for a ROS message."""
+ """Definition of a message for parsed messages."""
@classmethod
def from_msg_file(cls, msg_file: t.Any):
- """Create a message definition from a message file."""
+ """Create message definition from a .msg file."""
msg_name = msg_file.stem
message_string = msg_file.read_text()
return cls.from_msg_string(msg_name, message_string)
@classmethod
def from_msg_string(cls, msg_name: str, message_string: str):
- """Create a message definition from a message string."""
+ """Create message definition from a message string."""
message_comments, lines = _extract_file_level_comments(message_string)
msg = cls(msg_name, [], [], message_comments)
last_element: t.Any = msg
@@ -207,7 +206,7 @@ def _rename_enum(enum: EnumDef):
def _process_enums(msg):
- """Condense enums and renames them if necessary."""
+ """Condense enums and rename them if necessary."""
if len(msg.enums) == 0:
return
@@ -270,7 +269,7 @@ def _process_enums(msg):
def _process_comments(instance):
- """Condense comment lines and extracts special annotations."""
+ """Condense comment lines and extract special annotations."""
lines = instance.annotations
if not lines:
return
@@ -302,11 +301,11 @@ def _process_comments(instance):
class MessagePkgDef(BaseMessagePkgDef):
- """Message package definition for ROS message package."""
+ """Definition of a message package for parsed messages."""
@classmethod
def from_msg_folder(cls, package_name: str, msg_pkg_dir: t.Any):
- """Create a message package definition from folder."""
+ """Create MessagePkgDef from a folder of .msg files."""
msg_pkg = cls(package_name, [], [])
for msg_file in msg_pkg_dir.iterdir():
if msg_file.suffix == ".msg":
@@ -319,7 +318,7 @@ def from_msg_folder(cls, package_name: str, msg_pkg_dir: t.Any):
@classmethod
def from_pkg_folder(cls, root_dir: t.Any, root_dir_name: str = "root"):
- """Create a package package definition from a package folder."""
+ """Create MessagePkgDef from a folder of messagefolders."""
out = cls("", [], [])
for dir in root_dir.rglob("msg"):
out.packages.append(
diff --git a/capella_ros_tools/modules/messages/serializer.py b/capella_ros_tools/modules/messages/serializer.py
index 37206b6..6f5a18e 100644
--- a/capella_ros_tools/modules/messages/serializer.py
+++ b/capella_ros_tools/modules/messages/serializer.py
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
"""Serializer for IDL messages."""
from pathlib import Path
@@ -10,7 +10,7 @@
class MessageDef(BaseMessageDef):
- """Message definition for a ROS message."""
+ """Definition of a message for serialized messages."""
def to_msg_file(self, msg_file: Path):
"""Write message to file."""
@@ -39,7 +39,7 @@ def to_msg_string(self) -> str:
f"{(field.type.pkg_name + '/') if field.type.pkg_name else ''}"
)
msg_string += f"{field.type.name}"
- if field.type.array_size == float("inf"):
+ if field.type.array_size == "*":
msg_string += "[]"
elif field.type.array_size:
msg_string += f"[{field.type.array_size}]"
@@ -51,10 +51,10 @@ def to_msg_string(self) -> str:
class MessagePkgDef(BaseMessagePkgDef):
- """Message package definition for ROS message package."""
+ """Definition of message package for serialized messages."""
def to_msg_folder(self, msg_pkg_dir: Path):
- """Write message package to folder."""
+ """Write messages and packages to a folder of .msg files."""
msg_pkg_dir.mkdir(parents=True, exist_ok=True)
for msg in self.messages:
msg.to_msg_file(msg_pkg_dir / f"{msg.name}.msg")
@@ -62,7 +62,7 @@ def to_msg_folder(self, msg_pkg_dir: Path):
pkg.to_msg_folder(msg_pkg_dir / pkg.name)
def to_pkg_folder(self, pkg_dir: Path):
- """Write packages to folder."""
+ """Write packages to a folder of message folders."""
pkg_dir.mkdir(parents=True, exist_ok=True)
for pkg in self.packages:
pkg.to_msg_folder(pkg_dir / pkg.name / "msg")
diff --git a/capella_ros_tools/scripts/__init__.py b/capella_ros_tools/scripts/__init__.py
index 46ca00d..a999ec1 100644
--- a/capella_ros_tools/scripts/__init__.py
+++ b/capella_ros_tools/scripts/__init__.py
@@ -1,4 +1,3 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
-"""The scripts package.""" ""
-modules = ["capella2msg", "msg2capella"]
+"""The scripts package."""
diff --git a/capella_ros_tools/scripts/capella2msg.py b/capella_ros_tools/scripts/capella2msg.py
index a085ad8..1655b87 100644
--- a/capella_ros_tools/scripts/capella2msg.py
+++ b/capella_ros_tools/scripts/capella2msg.py
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
"""Convert Capella data to ROS messages."""
import typing as t
@@ -34,7 +34,7 @@
class Converter:
- """Convert Capella data to ROS messages."""
+ """Converter class for converting Capella data to ROS messages."""
def __init__(
self,
@@ -51,7 +51,6 @@ def __init__(
self.no_deps = no_deps
def _add_package(self, current_root: t.Any) -> MessagePkgDef:
- """Add package to message package definition."""
current_pkg_def = MessagePkgDef(current_root.name, [], [])
for cls in self.model.get_classes(current_root):
@@ -64,7 +63,9 @@ def _add_package(self, current_root: t.Any) -> MessagePkgDef:
CAPELLA_TYPE_TO_MSG[prop.type_name]
if prop.type_name in CAPELLA_TYPE_TO_MSG
else prop.type_name,
- None if prop.max_card == 1 else prop.max_card,
+ None
+ if prop.max_card == "1"
+ else prop.max_card,
None
if prop.type_pkg_name == current_pkg_def.name
else prop.type_pkg_name,
@@ -112,6 +113,6 @@ def _add_package(self, current_root: t.Any) -> MessagePkgDef:
return current_pkg_def
def convert(self) -> None:
- """Convert Capella data to ROS messages."""
+ """Start conversion."""
self.msgs.packages.append(self._add_package(self.model.data))
- self.msgs.to_pkg_folder(self.msg_path)
+ self.msgs.to_msg_folder(self.msg_path)
diff --git a/capella_ros_tools/scripts/msg2capella.py b/capella_ros_tools/scripts/msg2capella.py
index 010c5c9..5676ed1 100644
--- a/capella_ros_tools/scripts/msg2capella.py
+++ b/capella_ros_tools/scripts/msg2capella.py
@@ -1,6 +1,6 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
-"""Convert ROS messages to Capella data.""" ""
+"""Import ROS messages into Capella."""
import typing as t
import capellambse
@@ -42,7 +42,7 @@
class Converter:
- """Converts ROS messages to Capella data."""
+ """Converter class for importing ROS messages into Capella."""
def __init__(
self,
@@ -102,7 +102,7 @@ def _add_objects(
EnumValue(
MSG_TYPE_TO_CAPELLA.get(v.type.name) or v.type.name,
v.name,
- int(v.value),
+ v.value,
"\n".join(v.annotations),
)
for v in e.values
@@ -143,8 +143,8 @@ def _add_relations(self, current_pkg_def, current_root):
or f.type.name,
f.type.pkg_name,
f.name,
- min_card=0 if f.type.array_size else 1,
- max_card=f.type.array_size or 1,
+ min_card="0" if f.type.array_size else "1",
+ max_card=f.type.array_size or "1",
description="\n".join(f.annotations),
)
for f in msg.fields
@@ -159,7 +159,7 @@ def _add_relations(self, current_pkg_def, current_root):
self._add_relations(new_pkg_def, new_root)
def convert(self) -> None:
- """Convert ROS messages to Capella data."""
+ """Start conversion."""
current_root = self.model.data
if not self.no_deps:
diff --git a/capella_ros_tools/snapshot/__init__.py b/capella_ros_tools/snapshot/__init__.py
new file mode 100644
index 0000000..12e5d94
--- /dev/null
+++ b/capella_ros_tools/snapshot/__init__.py
@@ -0,0 +1,3 @@
+# Copyright DB InfraGO AG and contributors
+# SPDX-License-Identifier: Apache-2.0
+"""The snapshot package."""
diff --git a/capella_ros_tools/snapshot/app.py b/capella_ros_tools/snapshot/app.py
new file mode 100644
index 0000000..3cc5db0
--- /dev/null
+++ b/capella_ros_tools/snapshot/app.py
@@ -0,0 +1,68 @@
+# Copyright DB InfraGO AG and contributors
+# SPDX-License-Identifier: Apache-2.0
+"""FastAPI app for viewing current snapshot of a Capella model."""
+
+import typing as t
+from pathlib import Path
+
+import uvicorn
+from fastapi import FastAPI, Request
+from fastapi.responses import HTMLResponse
+from fastapi.staticfiles import StaticFiles
+from fastapi.templating import Jinja2Templates
+
+PATH = Path(__file__).parent
+
+
+app = FastAPI(title="Capella ROS Tools")
+app.mount(
+ "/static", StaticFiles(directory=PATH.joinpath("static")), name="static"
+)
+templates = Jinja2Templates(directory=PATH.joinpath("templates"))
+
+
+def get_type(xtype: str) -> str:
+ """Return type name from xtype."""
+ return xtype.rpartition(":")[2]
+
+
+templates.env.globals.update(get_type=get_type)
+
+
+@app.get("/", response_class=HTMLResponse)
+def root(request: Request):
+ """Display root data package."""
+ element = app.state.data_package
+ context = {
+ "request": request,
+ "element": element,
+ "get_type": get_type,
+ }
+ response = templates.TemplateResponse("package.html", context)
+ return response
+
+
+@app.get("/{type}/{uuid}", response_class=HTMLResponse)
+def view(request: Request, type: str, uuid: str):
+ """Display element by uuid."""
+ element = app.state.model.by_uuid(uuid)
+ template = type + ".html"
+
+ context = {
+ "request": request,
+ "element": element,
+ "get_type": get_type,
+ }
+ response = templates.TemplateResponse(template, context)
+ return response
+
+
+def start(model: t.Any, layer: str, port: int = 5000):
+ """Start the app.""" ""
+ app.state.model = model
+ app.state.data_package = getattr(model, layer).data_package
+ uvicorn.run(
+ app,
+ host="0.0.0.0",
+ port=port,
+ )
diff --git a/capella_ros_tools/snapshot/static/icons/favicon.ico b/capella_ros_tools/snapshot/static/icons/favicon.ico
new file mode 100644
index 0000000..a0c9c57
Binary files /dev/null and b/capella_ros_tools/snapshot/static/icons/favicon.ico differ
diff --git a/capella_ros_tools/snapshot/static/icons/favicon.ico.license b/capella_ros_tools/snapshot/static/icons/favicon.ico.license
new file mode 100644
index 0000000..f6f3181
--- /dev/null
+++ b/capella_ros_tools/snapshot/static/icons/favicon.ico.license
@@ -0,0 +1,2 @@
+# Copyright DB InfraGO AG and contributors
+# SPDX-License-Identifier: CC0-1.0
diff --git a/capella_ros_tools/snapshot/static/styles.css b/capella_ros_tools/snapshot/static/styles.css
new file mode 100644
index 0000000..a776e49
--- /dev/null
+++ b/capella_ros_tools/snapshot/static/styles.css
@@ -0,0 +1,152 @@
+/*
+ * Copyright DB InfraGO AG and contributors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --pink: #ffaccd;
+ --pink-dark: rgb(255, 0, 153);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --color-accent: var(--pink);
+ --color-accent-hover: var(--pink-dark);
+
+ --section-gap: 160px;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ font-weight: normal;
+}
+
+html,
+body {
+ width: 100vw;
+ height: 100vh;
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ display: flex;
+ flex-direction: row;
+ color: var(--color-text);
+ background: var(--color-background-soft);
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
+ Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue",
+ sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+ border-bottom: 3px solid var(--color-accent);
+}
+
+a:hover {
+ border-bottom-color: var(--color-accent-hover);
+}
+
+span {
+ white-space: pre-wrap;
+ display: inline-flex;
+ opacity: 0.75;
+}
+
+strong {
+ font-weight: 500;
+}
+
+main {
+ padding: 0.5rem 1rem;
+}
+
+main,
+aside {
+ max-height: 100%;
+ overflow-y: auto;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+}
+
+aside {
+ background-color: white;
+}
+
+aside > div {
+ height: 100%;
+ width: 100%;
+}
+
+table {
+ border-spacing: 0 1.5rem;
+}
+tr > td:first-child {
+ font-weight: bold;
+ text-align: right;
+ padding-right: 2rem;
+ white-space: nowrap;
+ width: 1%;
+}
+
+tr > td:last-child {
+ text-align: left;
+}
+
+ol {
+ padding: 0;
+ counter-reset: list;
+}
+ol > li {
+ list-style: none;
+ display: flex;
+}
+ol > li:before {
+ content: "[" counter(list) "] ";
+ counter-increment: list;
+ margin-right: 0.5em;
+}
+
+::-webkit-scrollbar {
+ display: none;
+}
+
+/* Media query for landscape mode */
+@media screen and (orientation: portrait) {
+ body {
+ display: flex;
+ flex-direction: column;
+ }
+}
diff --git a/capella_ros_tools/snapshot/templates/class.html b/capella_ros_tools/snapshot/templates/class.html
new file mode 100644
index 0000000..247fefe
--- /dev/null
+++ b/capella_ros_tools/snapshot/templates/class.html
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+ {{ element.name }} - Overview
+
+
+
+
+
+
+ {{ element.name }}
+ ({{ element.xtype }})
+
+
+
+ uuid
+ {{ element.uuid }}
+
+
+ parent
+ {{ element.parent._short_html_() }}
+
+
+ description
+
+ {{ element.description }}
+
+
+
+ properties
+
+
+ {% for prop in element.properties %}
+
+
+ Property "{{ prop.name
+ }}": {{prop.type.name}}
+ {{ prop.description }}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
diff --git a/capella_ros_tools/snapshot/templates/enum.html b/capella_ros_tools/snapshot/templates/enum.html
new file mode 100644
index 0000000..4a55fa9
--- /dev/null
+++ b/capella_ros_tools/snapshot/templates/enum.html
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+ {{ element.name }} - Overview
+
+
+
+
+
+
+ {{ element.name }}
+ ({{ element.xtype }})
+
+
+
+ uuid
+ {{ element.uuid }}
+
+
+ parent
+ {{ element.parent._short_html_() }}
+
+
+ description
+
+ {{ element.description }}
+
+
+
+ literals
+
+
+ {% for lit in element.literals %}
+
+ EnumerationLiteral "{{
+ lit.name }}": {{lit.value.type.name}} =
+ {{lit.value.value}}
+
+ {% endfor %}
+
+
+
+
+
+
+
diff --git a/capella_ros_tools/snapshot/templates/package.html b/capella_ros_tools/snapshot/templates/package.html
new file mode 100644
index 0000000..59975b4
--- /dev/null
+++ b/capella_ros_tools/snapshot/templates/package.html
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+ {{ element.name }} - Overview
+
+
+
+
+
+ {{ element.name }}
+ ({{ element.xtype }})
+
+
+
+ uuid
+ {{ element.uuid }}
+
+
+ parent
+ {{ element.parent._short_html_() }}
+
+
+ classes
+
+
+ {% for cls in element.classes %}
+
+ {{ cls._short_html_() }}
+
+ {% endfor %}
+
+
+
+
+ datatypes
+
+
+ {% for datatype in element.datatypes %} {% if
+ get_type(datatype.xtype) != 'Enumeration' %}
+
+ {{ datatype._short_html_() }}
+
+ {% endif %} {% endfor %}
+
+
+
+
+ enumeration
+
+
+ {% for enum in element.enumerations %}
+
+ {{ enum._short_html_() }}
+
+ {% endfor %}
+
+
+
+
+ packages
+
+
+ {% for pkg in element.packages %}
+
+ {{ pkg._short_html_() }}
+
+ {% endfor %}
+
+
+
+
+
+
+
diff --git a/docs/Makefile b/docs/Makefile
index fdfe666..3a2dfee 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: CC0-1.0
# Minimal makefile for Sphinx documentation
@@ -21,3 +21,19 @@ help:
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+
+# Auto-generate API documentation
+apidoc:
+ sphinx-apidoc --module-first --output-dir source/code --force ..
+
+clean-apidoc:
+ rm -rfv source/code
+
+.PHONY: apidoc clean-apidoc
+clean: clean-apidoc
+
+.PHONY: serve
+html: apidoc
+serve: html
+ cd build/html && exec python -m http.server --bind 127.0.0.1
diff --git a/docs/make.bat b/docs/make.bat
index ab614db..9f24710 100644
--- a/docs/make.bat
+++ b/docs/make.bat
@@ -1,5 +1,5 @@
@ECHO OFF
-REM Copyright DB Netz AG and contributors
+REM Copyright DB InfraGO AG and contributors
REM SPDX-License-Identifier: CC0-1.0
pushd %~dp0
diff --git a/docs/source/_static/github-logo.svg b/docs/source/_static/github-logo.svg
index a407b96..6305840 100644
--- a/docs/source/_static/github-logo.svg
+++ b/docs/source/_static/github-logo.svg
@@ -1,5 +1,5 @@
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 1925ae0..f114da7 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
"""Configuration file for Sphinx."""
@@ -36,6 +36,7 @@
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
+ "nbsphinx",
"sphinx.ext.autodoc",
"sphinx.ext.intersphinx",
"sphinx.ext.napoleon",
diff --git a/docs/source/examples/Import messages.ipynb b/docs/source/examples/Import messages.ipynb
new file mode 100644
index 0000000..163435a
--- /dev/null
+++ b/docs/source/examples/Import messages.ipynb
@@ -0,0 +1,938 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Import Messages"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import capellambse\n",
+ "from capella_ros_tools.scripts import msg2capella\n",
+ "from pathlib import Path"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "msg_path = capellambse.filehandler.get_filehandler(\"git+https://github.com/DSD-DBS/dsd-ros-msg-definitions-oss\").rootdir\n",
+ "capella_path = Path(\"data/empty_project_52\")\n",
+ "layer = \"la\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:capellambse.model:Cannot load PVMT extension: ValueError: Provided model does not have a PropertyValuePkg\n",
+ "WARNING:capellambse.model:Property values are not available in this model\n"
+ ]
+ }
+ ],
+ "source": [
+ "converter = msg2capella.Converter(msg_path, capella_path, layer, \"o\", False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package actionlib_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package diagnostic_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package geometry_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package nav_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package sensor_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package shape_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package std_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package stereo_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package trajectory_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package visualization_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum GoalStatusStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum GoalStatusStatus already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class GoalID.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class GoalStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class GoalStatusArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class GoalID already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class GoalStatus already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class GoalStatusArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum DiagnosticStatusLevel.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum DiagnosticStatusLevel already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class DiagnosticArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class DiagnosticStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class KeyValue.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class DiagnosticArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class DiagnosticStatus already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class KeyValue already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Accel.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class AccelStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class AccelWithCovariance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class AccelWithCovarianceStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Inertia.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class InertiaStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Point.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Point32.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class PointStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Polygon.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class PolygonStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Pose.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Pose2D.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class PoseArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class PoseStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class PoseWithCovariance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class PoseWithCovarianceStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Quaternion.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class QuaternionStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Transform.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class TransformStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Twist.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class TwistStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class TwistWithCovariance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class TwistWithCovarianceStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Vector3.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Vector3Stamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Wrench.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class WrenchStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Accel already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class AccelStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class AccelWithCovariance already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class AccelWithCovarianceStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Inertia already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class InertiaStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Point already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Point32 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class PointStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Polygon already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class PolygonStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Pose already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Pose2D already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class PoseArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class PoseStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class PoseWithCovariance already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class PoseWithCovarianceStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Quaternion already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class QuaternionStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Transform already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class TransformStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Twist already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class TwistStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class TwistWithCovariance already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class TwistWithCovarianceStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Vector3 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Vector3Stamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Wrench already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class WrenchStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class GridCells.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MapMetaData.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class OccupancyGrid.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Odometry.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Path.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class GridCells already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MapMetaData already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class OccupancyGrid already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Odometry already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Path already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum PowerSupplyStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum PowerSupplyHealth.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum PowerSupplyTechnology.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum Type.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum NavSatFixPositionCovarianceType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum Status.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum Service.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum PointFieldDatatype.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum RangeRadiationType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum PowerSupplyStatus already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum PowerSupplyHealth already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum PowerSupplyTechnology already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum Type already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum NavSatFixPositionCovarianceType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum Status already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum Service already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum PointFieldDatatype already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum RangeRadiationType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class BatteryState.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class CameraInfo.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ChannelFloat32.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class CompressedImage.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class FluidPressure.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Illuminance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Image.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Imu.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class JointState.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Joy.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class JoyFeedback.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class JoyFeedbackArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class LaserEcho.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class LaserScan.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MagneticField.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MultiDOFJointState.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MultiEchoLaserScan.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class NavSatFix.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class NavSatStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class PointCloud.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class PointCloud2.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class PointField.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Range.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class RegionOfInterest.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class RelativeHumidity.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Temperature.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class TimeReference.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class BatteryState already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class CameraInfo already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ChannelFloat32 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class CompressedImage already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class FluidPressure already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Illuminance already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Image already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Imu already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class JointState already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Joy already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class JoyFeedback already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class JoyFeedbackArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class LaserEcho already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class LaserScan already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MagneticField already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MultiDOFJointState already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MultiEchoLaserScan already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class NavSatFix already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class NavSatStatus already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class PointCloud already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class PointCloud2 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class PointField already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Range already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class RegionOfInterest already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class RelativeHumidity already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Temperature already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class TimeReference already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum SolidPrimitiveType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum Box.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum Cylinder.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum Cone.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum PrismHeight.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum SolidPrimitiveType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum Box already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum Cylinder already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum Cone already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum PrismHeight already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Mesh.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MeshTriangle.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Plane.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class SolidPrimitive.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Mesh already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MeshTriangle already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Plane already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class SolidPrimitive already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Bool.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Byte.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ByteMultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Char.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ColorRGBA.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Float32.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Float32MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Float64.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Float64MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Header.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Int16.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Int16MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Int32.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Int32MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Int64.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Int64MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Int8.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Int8MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MultiArrayDimension.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MultiArrayLayout.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class String.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class UInt16.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class UInt16MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class UInt32.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class UInt32MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class UInt64.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class UInt64MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class UInt8.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class UInt8MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Bool already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Byte already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ByteMultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Char already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ColorRGBA already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Float32 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Float32MultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Float64 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Float64MultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Header already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Int16 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Int16MultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Int32 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Int32MultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Int64 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Int64MultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Int8 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Int8MultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MultiArrayDimension already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MultiArrayLayout already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class String already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class UInt16 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class UInt16MultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class UInt32 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class UInt32MultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class UInt64 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class UInt64MultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class UInt8 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class UInt8MultiArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class DisparityImage.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class DisparityImage already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class JointTrajectory.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class JointTrajectoryPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MultiDOFJointTrajectory.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MultiDOFJointTrajectoryPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class JointTrajectory already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class JointTrajectoryPoint already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MultiDOFJointTrajectory already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MultiDOFJointTrajectoryPoint already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ImageMarkerId.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum InteractiveMarkerControlOrientationMode.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum InteractiveMarkerFeedbackEventType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum Mouse.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum InteractiveMarkerUpdateType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum MarkerId.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum MenuEntryCommandType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ImageMarkerId already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum InteractiveMarkerControlOrientationMode already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum InteractiveMarkerFeedbackEventType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum Mouse already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum InteractiveMarkerUpdateType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum MarkerId already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum MenuEntryCommandType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ImageMarker.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class InteractiveMarker.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class InteractiveMarkerControl.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class InteractiveMarkerFeedback.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class InteractiveMarkerInit.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class InteractiveMarkerPose.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class InteractiveMarkerUpdate.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Marker.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MarkerArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MenuEntry.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MeshFile.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class UVCoordinate.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ImageMarker already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class InteractiveMarker already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class InteractiveMarkerControl already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class InteractiveMarkerFeedback already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class InteractiveMarkerInit already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class InteractiveMarkerPose already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class InteractiveMarkerUpdate already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Marker already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MarkerArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MenuEntry already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MeshFile already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class UVCoordinate already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package action_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package builtin_interfaces.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package lifecycle_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package rcl_interfaces.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package rosgraph_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package service_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package statistics_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package test_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package type_description_interfaces.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum GoalStatusStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StatusCanceling.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StatusCanceled.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StatusAborted.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum GoalStatusStatus already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StatusCanceling already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StatusCanceled already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StatusAborted already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class GoalInfo.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class GoalStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class GoalStatusArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class GoalInfo already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class GoalStatus already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class GoalStatusArray already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Duration.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Time.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Duration already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Time already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StateId.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum PrimaryStateActive.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionStateConfiguring.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionStateShuttingdown.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionStateDeactivating.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionStateErrorprocessing.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionId.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionActivate.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionUnconfiguredShutdown.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionActiveShutdown.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionOnConfigure.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionOnCleanup.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionOnActivate.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionOnDeactivate.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionOnShutdown.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionOnError.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionCallbackFailure.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TransitionCallbackError.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StateId already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum PrimaryStateActive already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionStateConfiguring already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionStateShuttingdown already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionStateDeactivating already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionStateErrorprocessing already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionId already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionActivate already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionUnconfiguredShutdown already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionActiveShutdown already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionOnConfigure already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionOnCleanup already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionOnActivate already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionOnDeactivate already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionOnShutdown already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionOnError already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionCallbackFailure already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TransitionCallbackError already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class State.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Transition.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class TransitionDescription.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class TransitionEvent.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class State already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Transition already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class TransitionDescription already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class TransitionEvent already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum LogLevel.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum Error.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum Fatal.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum LoggerLevelType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ParameterType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum LogLevel already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum Error already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum Fatal already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum LoggerLevelType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ParameterType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class FloatingPointRange.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class IntegerRange.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ListParametersResult.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Log.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class LoggerLevel.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Parameter.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ParameterDescriptor.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ParameterEvent.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ParameterEventDescriptors.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ParameterValue.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class SetLoggerLevelsResult.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class SetParametersResult.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class FloatingPointRange already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class IntegerRange already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ListParametersResult already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Log already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class LoggerLevel already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Parameter already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ParameterDescriptor already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ParameterEvent already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ParameterEventDescriptors already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ParameterValue already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class SetLoggerLevelsResult already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class SetParametersResult already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Clock.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Clock already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ServiceEventInfoEventType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ServiceEventInfoEventType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ServiceEventInfo.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ServiceEventInfo already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StatisticDataType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StatisticDataType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MetricsMessage.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class StatisticDataPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MetricsMessage already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class StatisticDataPoint already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Builtins.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Builtins already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum FieldTypeTypeId 0.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum FieldType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum FieldTypeByte.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum FieldTypeFixed.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum FieldTypeBounded.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Deleted FieldType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldTypeTypeId 0 already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum FieldType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldTypeByte already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldTypeFixed already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldTypeBounded already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Field.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class FieldType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class IndividualTypeDescription.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class KeyValue.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class TypeDescription.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class TypeSource.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Field already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class FieldType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class IndividualTypeDescription already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class KeyValue already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class TypeDescription already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class TypeSource already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package unique_identifier_msgs.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class UUID.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class UUID already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for GoalID.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for GoalStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for GoalStatusArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for DiagnosticArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for DiagnosticStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for KeyValue.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Accel.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for AccelStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for AccelWithCovariance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for AccelWithCovarianceStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Inertia.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for InertiaStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Point.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Point32.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for PointStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Polygon.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for PolygonStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Pose.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Pose2D.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for PoseArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for PoseStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for PoseWithCovariance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for PoseWithCovarianceStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Quaternion.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for QuaternionStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Transform.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for TransformStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Twist.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for TwistStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for TwistWithCovariance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for TwistWithCovarianceStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Vector3.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Vector3Stamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Wrench.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for WrenchStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for GridCells.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MapMetaData.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for OccupancyGrid.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Odometry.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Path.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for BatteryState.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for CameraInfo.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ChannelFloat32.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for CompressedImage.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for FluidPressure.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Illuminance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Image.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Imu.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for JointState.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Joy.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for JoyFeedback.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for JoyFeedbackArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for LaserEcho.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for LaserScan.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MagneticField.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MultiDOFJointState.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MultiEchoLaserScan.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for NavSatFix.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for NavSatStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for PointCloud.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for PointCloud2.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for PointField.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Range.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for RegionOfInterest.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for RelativeHumidity.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Temperature.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for TimeReference.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Mesh.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MeshTriangle.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Plane.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for SolidPrimitive.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Bool.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Byte.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ByteMultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Char.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ColorRGBA.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Float32.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Float32MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Float64.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Float64MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Header.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Int16.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Int16MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Int32.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Int32MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Int64.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Int64MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Int8.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Int8MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MultiArrayDimension.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MultiArrayLayout.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for String.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for UInt16.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for UInt16MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for UInt32.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for UInt32MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for UInt64.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for UInt64MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for UInt8.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for UInt8MultiArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for DisparityImage.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for JointTrajectory.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for JointTrajectoryPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MultiDOFJointTrajectory.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MultiDOFJointTrajectoryPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ImageMarker.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for InteractiveMarker.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for InteractiveMarkerControl.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for InteractiveMarkerFeedback.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for InteractiveMarkerInit.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for InteractiveMarkerPose.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for InteractiveMarkerUpdate.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Marker.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MarkerArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MenuEntry.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MeshFile.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for UVCoordinate.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for GoalInfo.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for GoalStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for GoalStatusArray.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Duration.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Time.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for State.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Transition.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for TransitionDescription.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for TransitionEvent.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for FloatingPointRange.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for IntegerRange.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ListParametersResult.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Log.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for LoggerLevel.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Parameter.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ParameterDescriptor.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ParameterEvent.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ParameterEventDescriptors.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ParameterValue.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for SetLoggerLevelsResult.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for SetParametersResult.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Clock.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ServiceEventInfo.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MetricsMessage.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for StatisticDataPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Builtins.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Field.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for FieldType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for IndividualTypeDescription.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for KeyValue.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for TypeDescription.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for TypeSource.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for UUID.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package dsd_ros_messages.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package mission_control.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package sub_msg.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created package types.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class CoupledLocalization.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class CoupledLocalizationStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class CoupledLocalizationTupel.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class CoupledLocalizationTupelStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class EgoMotion.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class EgoMotionPath.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class EgoMotionPathStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class EgoMotionStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class GNSSLocalization.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class GNSSLocalizationStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class IMU.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class IMUStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MapMatchedLocalization.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MapMatchedLocalizationStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MapMatchedLocalizationTupel.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MapMatchedLocalizationTupelStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Objects.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ObjectsStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Odometry.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class OdometryStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class RailHorizon.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class RailHorizonStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class SensorInformation.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class SensorInformationStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class StaticObjects.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class StaticObjectsStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class CoupledLocalization already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class CoupledLocalizationStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class CoupledLocalizationTupel already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class CoupledLocalizationTupelStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class EgoMotion already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class EgoMotionPath already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class EgoMotionPathStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class EgoMotionStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class GNSSLocalization already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class GNSSLocalizationStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class IMU already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class IMUStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MapMatchedLocalization already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MapMatchedLocalizationStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MapMatchedLocalizationTupel already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MapMatchedLocalizationTupelStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Objects already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ObjectsStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Odometry already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class OdometryStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class RailHorizon already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class RailHorizonStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class SensorInformation already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class SensorInformationStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class StaticObjects already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class StaticObjectsStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ApplicationConfiguration.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ApplicationConfigurationStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ApplicationStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ApplicationStatusStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ApplicationVersion.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ApplicationVersionStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MissionProfile.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MissionProfileStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ApplicationConfiguration already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ApplicationConfigurationStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ApplicationStatus already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ApplicationStatusStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ApplicationVersion already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ApplicationVersionStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MissionProfile already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MissionProfileStamped already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Covariance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class FieldOfView.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ID.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class KeyValueMap.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class KeyValuePair.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class LocalizationIntegrity.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class MapMatchingIntegrity.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Object.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ObjectBase.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ObjectClassification.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class ObjectTracking.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Orientation.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Position.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Probability.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class RailHorizonData.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class SensorInformationEntry.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class SensorIntegrity.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Shape.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Topology.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Track.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class TrackPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created class Variance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Covariance already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class FieldOfView already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ID already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class KeyValueMap already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class KeyValuePair already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class LocalizationIntegrity already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class MapMatchingIntegrity already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Object already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ObjectBase already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ObjectClassification already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class ObjectTracking already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Orientation already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Position already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Probability already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class RailHorizonData already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class SensorInformationEntry already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class SensorIntegrity already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Shape already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Topology already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Track already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class TrackPoint already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Class Variance already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ApplicationModeTypes.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ApplicationStatusType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ApplicationStatusSubTypeUnknown.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum LocalizationIntegrityType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum LocalizationIntegrityTypeMotion.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum LocalizationIntegrityTypePosition.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum LocalizationIntegrityTypeDirection.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum MapMatchingIntegrityType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum MapMatchingInvalidType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum MapMatchingOrientationTypes.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ObjectMotionType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum DynamicObjectType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum DynamicObjectTypePedestrianType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StaticObjectClass.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StaticObjectClassVerticalType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StaticObjectClassBodyType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StaticObjectClassPlaneType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StaticObjectClassPlaneSubtype.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum StaticObjectClassCompositionType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum SensorIntegrityType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum SensorType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum SensorSubtype.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum SensorPosition.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum SensorSubposition.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypePlane.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypeBox.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypeCylinder.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypeCone.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypeVerticalStructureTopPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypeVerticalStructureBottomPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypeVerticalStructureWithRadiusTopPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypeVerticalStructureWithRadiusBottomPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypeHorizontalStructurePoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypeBodyStructure.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypePlaneStructurePoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeParameterIndicesTypeComposedStructureId.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TrackType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum TrackSubtype.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Deleted ShapeType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ApplicationModeTypes already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ApplicationStatusType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ApplicationStatusSubTypeUnknown already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum LocalizationIntegrityType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum LocalizationIntegrityTypeMotion already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum LocalizationIntegrityTypePosition already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum LocalizationIntegrityTypeDirection already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum MapMatchingIntegrityType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum MapMatchingInvalidType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum MapMatchingOrientationTypes already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ObjectMotionType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum DynamicObjectType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum DynamicObjectTypePedestrianType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StaticObjectClass already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StaticObjectClassVerticalType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StaticObjectClassBodyType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StaticObjectClassPlaneType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StaticObjectClassPlaneSubtype already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum StaticObjectClassCompositionType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum SensorIntegrityType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum SensorType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum SensorSubtype already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum SensorPosition already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum SensorSubposition already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypePlane already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypeBox already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypeCylinder already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypeCone already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypeVerticalStructureTopPoint already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypeVerticalStructureBottomPoint already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypeVerticalStructureWithRadiusTopPoint already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypeVerticalStructureWithRadiusBottomPoint already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypeHorizontalStructurePoint already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypeBodyStructure already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypePlaneStructurePoint already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeParameterIndicesTypeComposedStructureId already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created enum ShapeType.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum ShapeType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TrackType already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Enum TrackSubtype already exists.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for CoupledLocalization.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for CoupledLocalizationStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for CoupledLocalizationTupel.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for CoupledLocalizationTupelStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for EgoMotion.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for EgoMotionPath.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for EgoMotionPathStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for EgoMotionStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for GNSSLocalization.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for GNSSLocalizationStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for IMU.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for IMUStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MapMatchedLocalization.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MapMatchedLocalizationStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MapMatchedLocalizationTupel.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MapMatchedLocalizationTupelStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Objects.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ObjectsStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Odometry.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for OdometryStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for RailHorizon.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for RailHorizonStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for SensorInformation.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for SensorInformationStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for StaticObjects.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for StaticObjectsStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ApplicationConfiguration.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ApplicationConfigurationStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ApplicationStatus.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ApplicationStatusStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ApplicationVersion.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ApplicationVersionStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MissionProfile.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MissionProfileStamped.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Covariance.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for FieldOfView.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ID.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for KeyValueMap.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for KeyValuePair.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for LocalizationIntegrity.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for MapMatchingIntegrity.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Object.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ObjectBase.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ObjectClassification.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for ObjectTracking.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Orientation.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Position.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Probability.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for RailHorizonData.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for SensorInformationEntry.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for SensorIntegrity.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Shape.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Topology.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Track.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for TrackPoint.\n",
+ "INFO:capella_ros_tools.modules.capella.serializer:Created properties for Variance.\n"
+ ]
+ }
+ ],
+ "source": [
+ "converter.convert()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/source/examples/Import messages.ipynb.license b/docs/source/examples/Import messages.ipynb.license
new file mode 100644
index 0000000..f6f3181
--- /dev/null
+++ b/docs/source/examples/Import messages.ipynb.license
@@ -0,0 +1,2 @@
+# Copyright DB InfraGO AG and contributors
+# SPDX-License-Identifier: CC0-1.0
diff --git a/docs/source/examples/Parse messages.ipynb b/docs/source/examples/Parse messages.ipynb
index ff91330..a719013 100644
--- a/docs/source/examples/Parse messages.ipynb
+++ b/docs/source/examples/Parse messages.ipynb
@@ -1,6 +1,7 @@
{
"cells": [
{
+<<<<<<< HEAD
"cell_type": "code",
"execution_count": 1,
"metadata": {},
@@ -8,6 +9,12 @@
"source": [
"from capella_ros_tools.modules.messages.parser import MessageDef\n",
"from IPython.display import display"
+=======
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Parse Messages"
+>>>>>>> 40ef464 (feat: Make tree view draggable)
]
},
{
@@ -16,6 +23,7 @@
"metadata": {},
"outputs": [],
"source": [
+<<<<<<< HEAD
"msg_name = \"CameraInfo\"\n",
"msg_string = \"\"\"\n",
"# This message defines meta information for a camera. It should be in a\n",
@@ -150,20 +158,36 @@
"# full resolution (roi.width = width, roi.height = height).\n",
"RegionOfInterest roi\n",
"\"\"\""
+=======
+ "from capella_ros_tools.modules.messages.parser import MessageDef\n",
+ "from pathlib import Path\n",
+ "from IPython.display import display\n"
+>>>>>>> 40ef464 (feat: Make tree view draggable)
]
},
{
"cell_type": "code",
+<<<<<<< HEAD
"execution_count": 3,
+=======
+ "execution_count": 4,
+>>>>>>> 40ef464 (feat: Make tree view draggable)
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
+<<<<<<< HEAD
"CameraInfo # This message defines meta information for a camera. It should be in a # camera namespace on topic \"camera_info\" and accompanied by up to five # image topics named: # # image_raw - raw data from the camera driver, possibly Bayer encoded # image - monochrome, distorted # image_color - color, distorted # image_rect - monochrome, rectified # image_rect_color - color, rectified # # The image_pipeline contains packages (image_proc, stereo_image_proc) # for producing the four processed image topics from image_raw and # camera_info. The meaning of the camera parameters are described in # detail at http://www.ros.org/wiki/image_pipeline/CameraInfo. # # The image_geometry package provides a user-friendly interface to # common operations using this meta information. If you want to, e.g., # project a 3d point into image coordinates, we strongly recommend # using image_geometry. # # If the camera is uncalibrated, the matrices D, K, R, P should be left # zeroed out. In particular, clients may assume that K[0] == 0.0 # indicates an uncalibrated camera. ####################################################################### # Image acquisition info # ####################################################################### ####################################################################### # Calibration Parameters # ####################################################################### # These are fixed during camera calibration. Their values will be the # # same in all messages until the camera is recalibrated. Note that # # self-calibrating systems may \"recalibrate\" frequently. # # # # The internal parameters can be used to warp a raw (distorted) image # # to: # # 1. An undistorted image (requires D and K) # # 2. A rectified image (requires D, K, R) # # The projection matrix P projects 3D points into the rectified image.# ####################################################################### ####################################################################### # Operational Parameters # ####################################################################### # These define the image region actually captured by the camera # # driver. Although they affect the geometry of the output image, they # # may be changed freely without recalibrating the camera. # #######################################################################
Fields std_msgs/Header header # Time of image acquisition, camera coordinate frame ID # Header timestamp should be acquisition time of image # Header frame_id should be optical frame of camera # origin of frame should be optical center of camera # +x should point to the right in the image # +y should point down in the image # +z should point into the plane of the image uint32 height # The image dimensions with which the camera was calibrated. # Normally this will be the full camera resolution in pixels. uint32 width # The image dimensions with which the camera was calibrated. # Normally this will be the full camera resolution in pixels. string distortion_model # The distortion model used. Supported models are listed in # sensor_msgs/distortion_models.hpp. For most cameras, \"plumb_bob\" - a # simple model of radial and tangential distortion - is sufficent. float64[] d # The distortion parameters, size depending on the distortion model. # For \"plumb_bob\", the 5 parameters are: (k1, k2, t1, t2, k3). float64[9.0] k # Intrinsic camera matrix for the raw (distorted) images. # [fx 0 cx] # K = [ 0 fy cy] # [ 0 0 1] # Projects 3D points in the camera coordinate frame to 2D pixel # coordinates using the focal lengths (fx, fy) and principal point # (cx, cy). # 3x3 row-major matrix float64[9.0] r # Rectification matrix (stereo cameras only) # A rotation matrix aligning the camera coordinate system to the ideal # stereo image plane so that epipolar lines in both stereo images are # parallel. # 3x3 row-major matrix float64[12.0] p # Projection/camera matrix # [fx' 0 cx' Tx] # P = [ 0 fy' cy' Ty] # [ 0 0 1 0] # By convention, this matrix specifies the intrinsic (camera) matrix # of the processed (rectified) image. That is, the left 3x3 portion # is the normal camera intrinsic matrix for the rectified image. # It projects 3D points in the camera coordinate frame to 2D pixel # coordinates using the focal lengths (fx', fy') and principal point # (cx', cy') - these may differ from the values in K. # For monocular cameras, Tx = Ty = 0. Normally, monocular cameras will # also have R = the identity and P[1:3,1:3] = K. # For a stereo pair, the fourth column [Tx Ty 0]' is related to the # position of the optical center of the second camera in the first # camera's frame. We assume Tz = 0 so both cameras are in the same # stereo image plane. The first camera always has Tx = Ty = 0. For # the right (second) camera of a horizontal stereo pair, Ty = 0 and # Tx = -fx' * B, where B is the baseline between the cameras. # Given a 3D point [X Y Z]', the projection (x, y) of the point onto # the rectified image is given by: # [u v w]' = P * [X Y Z 1]' # x = u / w # y = v / w # This holds for both images of a stereo pair. # 3x4 row-major matrix uint32 binning_x # Binning refers here to any camera setting which combines rectangular # neighborhoods of pixels into larger \"super-pixels.\" It reduces the # resolution of the output image to # (width / binning_x) x (height / binning_y). # The default values binning_x = binning_y = 0 is considered the same # as binning_x = binning_y = 1 (no subsampling). uint32 binning_y # Binning refers here to any camera setting which combines rectangular # neighborhoods of pixels into larger \"super-pixels.\" It reduces the # resolution of the output image to # (width / binning_x) x (height / binning_y). # The default values binning_x = binning_y = 0 is considered the same # as binning_x = binning_y = 1 (no subsampling). RegionOfInterest roi # Region of interest (subwindow of full camera resolution), given in # full resolution (unbinned) image coordinates. A particular ROI # always denotes the same window of pixels on the camera sensor, # regardless of binning settings. # The default setting of roi (all values 0) is considered the same as # full resolution (roi.width = width, roi.height = height). Enums "
],
"text/plain": [
""
+=======
+ "CameraInfo # This message defines meta information for a camera. It should be in a # camera namespace on topic \"camera_info\" and accompanied by up to five # image topics named: # # image_raw - raw data from the camera driver, possibly Bayer encoded # image - monochrome, distorted # image_color - color, distorted # image_rect - monochrome, rectified # image_rect_color - color, rectified # # The image_pipeline contains packages (image_proc, stereo_image_proc) # for producing the four processed image topics from image_raw and # camera_info. The meaning of the camera parameters are described in # detail at http://www.ros.org/wiki/image_pipeline/CameraInfo. # # The image_geometry package provides a user-friendly interface to # common operations using this meta information. If you want to, e.g., # project a 3d point into image coordinates, we strongly recommend # using image_geometry. # # If the camera is uncalibrated, the matrices D, K, R, P should be left # zeroed out. In particular, clients may assume that K[0] == 0.0 # indicates an uncalibrated camera. ####################################################################### # Image acquisition info # ####################################################################### ####################################################################### # Calibration Parameters # ####################################################################### # These are fixed during camera calibration. Their values will be the # # same in all messages until the camera is recalibrated. Note that # # self-calibrating systems may \"recalibrate\" frequently. # # # # The internal parameters can be used to warp a raw (distorted) image # # to: # # 1. An undistorted image (requires D and K) # # 2. A rectified image (requires D, K, R) # # The projection matrix P projects 3D points into the rectified image.# ####################################################################### ####################################################################### # Operational Parameters # ####################################################################### # These define the image region actually captured by the camera # # driver. Although they affect the geometry of the output image, they # # may be changed freely without recalibrating the camera. # #######################################################################
Fields std_msgs/Header header # Time of image acquisition, camera coordinate frame ID # Header timestamp should be acquisition time of image # Header frame_id should be optical frame of camera # origin of frame should be optical center of camera # +x should point to the right in the image # +y should point down in the image # +z should point into the plane of the image uint32 height # The image dimensions with which the camera was calibrated. # Normally this will be the full camera resolution in pixels. uint32 width # The image dimensions with which the camera was calibrated. # Normally this will be the full camera resolution in pixels. string distortion_model # The distortion model used. Supported models are listed in # sensor_msgs/distortion_models.hpp. For most cameras, \"plumb_bob\" - a # simple model of radial and tangential distortion - is sufficent. float64[] d # The distortion parameters, size depending on the distortion model. # For \"plumb_bob\", the 5 parameters are: (k1, k2, t1, t2, k3). float64[9] k # Intrinsic camera matrix for the raw (distorted) images. # [fx 0 cx] # K = [ 0 fy cy] # [ 0 0 1] # Projects 3D points in the camera coordinate frame to 2D pixel # coordinates using the focal lengths (fx, fy) and principal point # (cx, cy). # 3x3 row-major matrix float64[9] r # Rectification matrix (stereo cameras only) # A rotation matrix aligning the camera coordinate system to the ideal # stereo image plane so that epipolar lines in both stereo images are # parallel. # 3x3 row-major matrix float64[12] p # Projection/camera matrix # [fx' 0 cx' Tx] # P = [ 0 fy' cy' Ty] # [ 0 0 1 0] # By convention, this matrix specifies the intrinsic (camera) matrix # of the processed (rectified) image. That is, the left 3x3 portion # is the normal camera intrinsic matrix for the rectified image. # It projects 3D points in the camera coordinate frame to 2D pixel # coordinates using the focal lengths (fx', fy') and principal point # (cx', cy') - these may differ from the values in K. # For monocular cameras, Tx = Ty = 0. Normally, monocular cameras will # also have R = the identity and P[1:3,1:3] = K. # For a stereo pair, the fourth column [Tx Ty 0]' is related to the # position of the optical center of the second camera in the first # camera's frame. We assume Tz = 0 so both cameras are in the same # stereo image plane. The first camera always has Tx = Ty = 0. For # the right (second) camera of a horizontal stereo pair, Ty = 0 and # Tx = -fx' * B, where B is the baseline between the cameras. # Given a 3D point [X Y Z]', the projection (x, y) of the point onto # the rectified image is given by: # [u v w]' = P * [X Y Z 1]' # x = u / w # y = v / w # This holds for both images of a stereo pair. # 3x4 row-major matrix uint32 binning_x # Binning refers here to any camera setting which combines rectangular # neighborhoods of pixels into larger \"super-pixels.\" It reduces the # resolution of the output image to # (width / binning_x) x (height / binning_y). # The default values binning_x = binning_y = 0 is considered the same # as binning_x = binning_y = 1 (no subsampling). uint32 binning_y # Binning refers here to any camera setting which combines rectangular # neighborhoods of pixels into larger \"super-pixels.\" It reduces the # resolution of the output image to # (width / binning_x) x (height / binning_y). # The default values binning_x = binning_y = 0 is considered the same # as binning_x = binning_y = 1 (no subsampling). RegionOfInterest roi # Region of interest (subwindow of full camera resolution), given in # full resolution (unbinned) image coordinates. A particular ROI # always denotes the same window of pixels on the camera sensor, # regardless of binning settings. # The default setting of roi (all values 0) is considered the same as # full resolution (roi.width = width, roi.height = height). Enums "
+ ],
+ "text/plain": [
+ ""
+>>>>>>> 40ef464 (feat: Make tree view draggable)
]
},
"metadata": {},
@@ -171,12 +195,17 @@
}
],
"source": [
+<<<<<<< HEAD
"msgs = MessageDef.from_msg_string(msg_name, msg_string)\n",
+=======
+ "msgs = MessageDef.from_msg_file(Path(\"data/example_msgs/CameraInfo.msg\"))\n",
+>>>>>>> 40ef464 (feat: Make tree view draggable)
"display(msgs)"
]
},
{
"cell_type": "code",
+<<<<<<< HEAD
"execution_count": 4,
"metadata": {},
"outputs": [],
@@ -206,16 +235,25 @@
},
{
"cell_type": "code",
+=======
+>>>>>>> 40ef464 (feat: Make tree view draggable)
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
+<<<<<<< HEAD
"DiagnosticStatus # This message holds the status of an individual component of the robot.
Fields byte level # Level of operation enumerated above. string name # A description of the test/component reporting. string message # A description of the status. string hardware_id # A hardware unique string. KeyValue[] values # An array of values associated with the status. Enums DiagnosticStatus # Possible levels of operations.byte OK = 0 byte WARN = 1 byte ERROR = 2 byte STALE = 3 "
],
"text/plain": [
""
+=======
+ "DiagnosticStatus # This message holds the status of an individual component of the robot.
Fields DiagnosticStatusLevel level # Level of operation enumerated above. string name # A description of the test/component reporting. string message # A description of the status. string hardware_id # A hardware unique string. KeyValue[] values # An array of values associated with the status. Enums DiagnosticStatusLevel # Possible levels of operations.byte OK = 0 byte WARN = 1 byte ERROR = 2 byte STALE = 3 "
+ ],
+ "text/plain": [
+ ""
+>>>>>>> 40ef464 (feat: Make tree view draggable)
]
},
"metadata": {},
@@ -223,7 +261,11 @@
}
],
"source": [
+<<<<<<< HEAD
"msgs = MessageDef.from_msg_string(msg_name, msg_string)\n",
+=======
+ "msgs = MessageDef.from_msg_file(Path(\"data/example_msgs/DiagnosticStatus.msg\"))\n",
+>>>>>>> 40ef464 (feat: Make tree view draggable)
"display(msgs)"
]
},
@@ -231,6 +273,7 @@
"cell_type": "code",
"execution_count": 6,
"metadata": {},
+<<<<<<< HEAD
"outputs": [],
"source": [
"msg_name = \"PointCloud2\"\n",
@@ -268,6 +311,8 @@
"cell_type": "code",
"execution_count": 7,
"metadata": {},
+=======
+>>>>>>> 40ef464 (feat: Make tree view draggable)
"outputs": [
{
"data": {
@@ -275,7 +320,11 @@
"PointCloud2 # This message holds a collection of N-dimensional points, which may # contain additional information such as normals, intensity, etc. The # point data is stored as a binary blob, its layout described by the # contents of the \"fields\" array. # # The point cloud data may be organized 2d (image-like) or 1d (unordered). # Point clouds organized as 2d images may be produced by camera depth sensors # such as stereo or time-of-flight.
Fields std_msgs/Header header # Time of sensor data acquisition, and the coordinate frame ID (for 3d points). uint32 height # 2D structure of the point cloud. If the cloud is unordered, height is # 1 and width is the length of the point cloud. uint32 width # 2D structure of the point cloud. If the cloud is unordered, height is # 1 and width is the length of the point cloud. PointField[] fields # Describes the channels and their layout in the binary data blob. bool is_bigendian # Is this data bigendian? uint32 point_step # Length of a point in bytes uint32 row_step # Length of a row in bytes uint8[] data # Actual point data, size is (row_step*height) bool is_dense # True if there are no invalid points Enums "
],
"text/plain": [
+<<<<<<< HEAD
""
+=======
+ ""
+>>>>>>> 40ef464 (feat: Make tree view draggable)
]
},
"metadata": {},
@@ -283,7 +332,11 @@
}
],
"source": [
+<<<<<<< HEAD
"msgs = MessageDef.from_msg_string(msg_name, msg_string)\n",
+=======
+ "msgs = MessageDef.from_msg_file(Path(\"data/example_msgs/PointCloud2.msg\"))\n",
+>>>>>>> 40ef464 (feat: Make tree view draggable)
"display(msgs)"
]
}
diff --git a/docs/source/examples/Parse messages.ipynb.license b/docs/source/examples/Parse messages.ipynb.license
index 6605644..f6f3181 100644
--- a/docs/source/examples/Parse messages.ipynb.license
+++ b/docs/source/examples/Parse messages.ipynb.license
@@ -1,2 +1,2 @@
-SPDX-FileCopyrightText: Copyright DB Netz AG and the capellambse contributors
-SPDX-License-Identifier: Apache-2.0
+# Copyright DB InfraGO AG and contributors
+# SPDX-License-Identifier: CC0-1.0
diff --git a/docs/source/examples/data/empty_project_52/.project.license b/docs/source/examples/data/empty_project_52/.project.license
index 6605644..02c8c23 100644
--- a/docs/source/examples/data/empty_project_52/.project.license
+++ b/docs/source/examples/data/empty_project_52/.project.license
@@ -1,2 +1,2 @@
-SPDX-FileCopyrightText: Copyright DB Netz AG and the capellambse contributors
+Copyright DB InfraGO AG and contributors
SPDX-License-Identifier: Apache-2.0
diff --git a/docs/source/examples/data/empty_project_52/empty_project_52.afm.license b/docs/source/examples/data/empty_project_52/empty_project_52.afm.license
index 6605644..02c8c23 100644
--- a/docs/source/examples/data/empty_project_52/empty_project_52.afm.license
+++ b/docs/source/examples/data/empty_project_52/empty_project_52.afm.license
@@ -1,2 +1,2 @@
-SPDX-FileCopyrightText: Copyright DB Netz AG and the capellambse contributors
+Copyright DB InfraGO AG and contributors
SPDX-License-Identifier: Apache-2.0
diff --git a/docs/source/examples/data/empty_project_52/empty_project_52.aird.license b/docs/source/examples/data/empty_project_52/empty_project_52.aird.license
index 6605644..02c8c23 100644
--- a/docs/source/examples/data/empty_project_52/empty_project_52.aird.license
+++ b/docs/source/examples/data/empty_project_52/empty_project_52.aird.license
@@ -1,2 +1,2 @@
-SPDX-FileCopyrightText: Copyright DB Netz AG and the capellambse contributors
+Copyright DB InfraGO AG and contributors
SPDX-License-Identifier: Apache-2.0
diff --git a/docs/source/examples/data/empty_project_52/empty_project_52.capella.license b/docs/source/examples/data/empty_project_52/empty_project_52.capella.license
index 6605644..1efec84 100644
--- a/docs/source/examples/data/empty_project_52/empty_project_52.capella.license
+++ b/docs/source/examples/data/empty_project_52/empty_project_52.capella.license
@@ -1,2 +1,6 @@
+<<<<<<< HEAD
SPDX-FileCopyrightText: Copyright DB Netz AG and the capellambse contributors
+=======
+Copyright DB InfraGO AG and contributors
+>>>>>>> 40ef464 (feat: Make tree view draggable)
SPDX-License-Identifier: Apache-2.0
diff --git a/docs/source/examples/data/example_msgs/CameraInfo.msg b/docs/source/examples/data/example_msgs/CameraInfo.msg
new file mode 100644
index 0000000..0c75a90
--- /dev/null
+++ b/docs/source/examples/data/example_msgs/CameraInfo.msg
@@ -0,0 +1,134 @@
+# Copyright DB InfraGO AG and contributors
+# SPDX-License-Identifier: CC0-1.0
+#
+# This message defines meta information for a camera. It should be in a
+# camera namespace on topic "camera_info" and accompanied by up to five
+# image topics named:
+#
+# image_raw - raw data from the camera driver, possibly Bayer encoded
+# image - monochrome, distorted
+# image_color - color, distorted
+# image_rect - monochrome, rectified
+# image_rect_color - color, rectified
+#
+# The image_pipeline contains packages (image_proc, stereo_image_proc)
+# for producing the four processed image topics from image_raw and
+# camera_info. The meaning of the camera parameters are described in
+# detail at http://www.ros.org/wiki/image_pipeline/CameraInfo.
+#
+# The image_geometry package provides a user-friendly interface to
+# common operations using this meta information. If you want to, e.g.,
+# project a 3d point into image coordinates, we strongly recommend
+# using image_geometry.
+#
+# If the camera is uncalibrated, the matrices D, K, R, P should be left
+# zeroed out. In particular, clients may assume that K[0] == 0.0
+# indicates an uncalibrated camera.
+
+#######################################################################
+# Image acquisition info #
+#######################################################################
+
+# Time of image acquisition, camera coordinate frame ID
+std_msgs/Header header # Header timestamp should be acquisition time of image
+ # Header frame_id should be optical frame of camera
+ # origin of frame should be optical center of camera
+ # +x should point to the right in the image
+ # +y should point down in the image
+ # +z should point into the plane of the image
+
+
+#######################################################################
+# Calibration Parameters #
+#######################################################################
+# These are fixed during camera calibration. Their values will be the #
+# same in all messages until the camera is recalibrated. Note that #
+# self-calibrating systems may "recalibrate" frequently. #
+# #
+# The internal parameters can be used to warp a raw (distorted) image #
+# to: #
+# 1. An undistorted image (requires D and K) #
+# 2. A rectified image (requires D, K, R) #
+# The projection matrix P projects 3D points into the rectified image.#
+#######################################################################
+
+# The image dimensions with which the camera was calibrated.
+# Normally this will be the full camera resolution in pixels.
+uint32 height
+uint32 width
+
+# The distortion model used. Supported models are listed in
+# sensor_msgs/distortion_models.hpp. For most cameras, "plumb_bob" - a
+# simple model of radial and tangential distortion - is sufficent.
+string distortion_model
+
+# The distortion parameters, size depending on the distortion model.
+# For "plumb_bob", the 5 parameters are: (k1, k2, t1, t2, k3).
+float64[] d
+
+# Intrinsic camera matrix for the raw (distorted) images.
+# [fx 0 cx]
+# K = [ 0 fy cy]
+# [ 0 0 1]
+# Projects 3D points in the camera coordinate frame to 2D pixel
+# coordinates using the focal lengths (fx, fy) and principal point
+# (cx, cy).
+float64[9] k # 3x3 row-major matrix
+
+# Rectification matrix (stereo cameras only)
+# A rotation matrix aligning the camera coordinate system to the ideal
+# stereo image plane so that epipolar lines in both stereo images are
+# parallel.
+float64[9] r # 3x3 row-major matrix
+
+# Projection/camera matrix
+# [fx' 0 cx' Tx]
+# P = [ 0 fy' cy' Ty]
+# [ 0 0 1 0]
+# By convention, this matrix specifies the intrinsic (camera) matrix
+# of the processed (rectified) image. That is, the left 3x3 portion
+# is the normal camera intrinsic matrix for the rectified image.
+# It projects 3D points in the camera coordinate frame to 2D pixel
+# coordinates using the focal lengths (fx', fy') and principal point
+# (cx', cy') - these may differ from the values in K.
+# For monocular cameras, Tx = Ty = 0. Normally, monocular cameras will
+# also have R = the identity and P[1:3,1:3] = K.
+# For a stereo pair, the fourth column [Tx Ty 0]' is related to the
+# position of the optical center of the second camera in the first
+# camera's frame. We assume Tz = 0 so both cameras are in the same
+# stereo image plane. The first camera always has Tx = Ty = 0. For
+# the right (second) camera of a horizontal stereo pair, Ty = 0 and
+# Tx = -fx' * B, where B is the baseline between the cameras.
+# Given a 3D point [X Y Z]', the projection (x, y) of the point onto
+# the rectified image is given by:
+# [u v w]' = P * [X Y Z 1]'
+# x = u / w
+# y = v / w
+# This holds for both images of a stereo pair.
+float64[12] p # 3x4 row-major matrix
+
+
+#######################################################################
+# Operational Parameters #
+#######################################################################
+# These define the image region actually captured by the camera #
+# driver. Although they affect the geometry of the output image, they #
+# may be changed freely without recalibrating the camera. #
+#######################################################################
+
+# Binning refers here to any camera setting which combines rectangular
+# neighborhoods of pixels into larger "super-pixels." It reduces the
+# resolution of the output image to
+# (width / binning_x) x (height / binning_y).
+# The default values binning_x = binning_y = 0 is considered the same
+# as binning_x = binning_y = 1 (no subsampling).
+uint32 binning_x
+uint32 binning_y
+
+# Region of interest (subwindow of full camera resolution), given in
+# full resolution (unbinned) image coordinates. A particular ROI
+# always denotes the same window of pixels on the camera sensor,
+# regardless of binning settings.
+# The default setting of roi (all values 0) is considered the same as
+# full resolution (roi.width = width, roi.height = height).
+RegionOfInterest roi
diff --git a/docs/source/examples/data/example_msgs/DiagnosticStatus.msg b/docs/source/examples/data/example_msgs/DiagnosticStatus.msg
new file mode 100644
index 0000000..7ebc47c
--- /dev/null
+++ b/docs/source/examples/data/example_msgs/DiagnosticStatus.msg
@@ -0,0 +1,21 @@
+# Copyright DB InfraGO AG and contributors
+# SPDX-License-Identifier: CC0-1.0
+#
+# This message holds the status of an individual component of the robot.
+
+# Possible levels of operations.
+byte OK=0
+byte WARN=1
+byte ERROR=2
+byte STALE=3
+
+# Level of operation enumerated above.
+byte level
+# A description of the test/component reporting.
+string name
+# A description of the status.
+string message
+# A hardware unique string.
+string hardware_id
+# An array of values associated with the status.
+KeyValue[] values
diff --git a/docs/source/examples/data/example_msgs/PointCloud2.msg b/docs/source/examples/data/example_msgs/PointCloud2.msg
new file mode 100644
index 0000000..1353f3f
--- /dev/null
+++ b/docs/source/examples/data/example_msgs/PointCloud2.msg
@@ -0,0 +1,29 @@
+# Copyright DB InfraGO AG and contributors
+# SPDX-License-Identifier: CC0-1.0
+#
+# This message holds a collection of N-dimensional points, which may
+# contain additional information such as normals, intensity, etc. The
+# point data is stored as a binary blob, its layout described by the
+# contents of the "fields" array.
+#
+# The point cloud data may be organized 2d (image-like) or 1d (unordered).
+# Point clouds organized as 2d images may be produced by camera depth sensors
+# such as stereo or time-of-flight.
+
+# Time of sensor data acquisition, and the coordinate frame ID (for 3d points).
+std_msgs/Header header
+
+# 2D structure of the point cloud. If the cloud is unordered, height is
+# 1 and width is the length of the point cloud.
+uint32 height
+uint32 width
+
+# Describes the channels and their layout in the binary data blob.
+PointField[] fields
+
+bool is_bigendian # Is this data bigendian?
+uint32 point_step # Length of a point in bytes
+uint32 row_step # Length of a row in bytes
+uint8[] data # Actual point data, size is (row_step*height)
+
+bool is_dense # True if there are no invalid points
diff --git a/docs/source/examples/data/melody_model_60/.project b/docs/source/examples/data/melody_model_60/.project
new file mode 100644
index 0000000..f147def
--- /dev/null
+++ b/docs/source/examples/data/melody_model_60/.project
@@ -0,0 +1,11 @@
+
+
+ 6_0
+
+
+
+
+
+
+
+
diff --git a/docs/source/examples/data/melody_model_60/.project.license b/docs/source/examples/data/melody_model_60/.project.license
new file mode 100644
index 0000000..62a1749
--- /dev/null
+++ b/docs/source/examples/data/melody_model_60/.project.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Copyright DB InfraGO AG
+SPDX-License-Identifier: Apache-2.0
diff --git a/docs/source/examples/data/melody_model_60/Melody Model Test.afm b/docs/source/examples/data/melody_model_60/Melody Model Test.afm
new file mode 100644
index 0000000..0540ecf
--- /dev/null
+++ b/docs/source/examples/data/melody_model_60/Melody Model Test.afm
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/docs/source/examples/data/melody_model_60/Melody Model Test.afm.license b/docs/source/examples/data/melody_model_60/Melody Model Test.afm.license
new file mode 100644
index 0000000..62a1749
--- /dev/null
+++ b/docs/source/examples/data/melody_model_60/Melody Model Test.afm.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Copyright DB InfraGO AG
+SPDX-License-Identifier: Apache-2.0
diff --git a/docs/source/examples/data/melody_model_60/Melody Model Test.aird b/docs/source/examples/data/melody_model_60/Melody Model Test.aird
new file mode 100644
index 0000000..5b672cf
--- /dev/null
+++ b/docs/source/examples/data/melody_model_60/Melody Model Test.aird
@@ -0,0 +1,13006 @@
+
+
+
+ Melody%20Model%20Test.afm
+ Melody%20Model%20Test.capella
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ labelSize
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ uid
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ strokeColor
+ size
+ routingStyle
+
+
+
+
+
+
+
+
+
+ strokeColor
+ size
+ routingStyle
+
+
+
+
+
+
+
+
+
+ strokeColor
+ size
+ routingStyle
+
+
+
+
+
+
+
+
+
+ color
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ color
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ borderColor
+ borderSize
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ borderColor
+ borderSize
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ labelAlignment
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ borderColor
+ borderSize
+ labelColor
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ labelFormat
+ strike_through
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ labelFormat
+ underline
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ labelFormat
+ borderColor
+ borderSize
+ labelColor
+ italic
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ labelAlignment
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ borderColor
+ borderSize
+
+
+
+
+
+
+
+
+
+
+ strokeColor
+ size
+ routingStyle
+
+
+
+
+
+
+
+
+
+ strokeColor
+ size
+
+
+
+
+
+
+
+
+
+ strokeColor
+ size
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ strokeColor
+ size
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ backgroundColor
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lineStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ bold
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ size
+ routingStyle
+ strokeColor
+
+
+
+
+
+
+
+
+
+
+ size
+ routingStyle
+ strokeColor
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ color
+
+
+
+
+
+
+
+
+ strokeColor
+ size
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ routingStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+ italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ labelColor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ backgroundColor
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LOCATION
+ KEEP_SIZE
+ KEEP_RATIO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lineStyle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/source/examples/data/melody_model_60/Melody Model Test.aird.license b/docs/source/examples/data/melody_model_60/Melody Model Test.aird.license
new file mode 100644
index 0000000..62a1749
--- /dev/null
+++ b/docs/source/examples/data/melody_model_60/Melody Model Test.aird.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Copyright DB InfraGO AG
+SPDX-License-Identifier: Apache-2.0
diff --git a/docs/source/examples/data/melody_model_60/Melody Model Test.capella b/docs/source/examples/data/melody_model_60/Melody Model Test.capella
new file mode 100644
index 0000000..ec3c9cc
--- /dev/null
+++ b/docs/source/examples/data/melody_model_60/Melody Model Test.capella
@@ -0,0 +1,3124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A test spec.
+ capella:linkedText
+
+
+
+
+
+ This is a test context.<a href="0e0164c3-076e-42c1-8f82-7a43ab84385c"/>
+ capella:linkedText
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The actor lives in a world where predators exist
+AND
+A <a href="e6e4d30c-4d80-4899-8d8d-1350239c15a7"/> is near the actor
+ capella:linkedText
+
+
+
+
+ The predator no longer exists
+OR
+The predator is far away
+ capella:linkedText
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <a href="dd2d0dab-a35f-4104-91e5-b412f35cba15"/>
+ capella:linkedText
+
+
+
+
+ The actor feels sated
+ capella:linkedText
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Spot a huntable animal
+ capella:linkedText
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Actor feels well rested
+ capella:linkedText
+
+
+
+
+
+
+ Actor feels sated
+ capella:linkedText
+
+
+
+
+
+
+ Food is cooked
+ capella:linkedText
+
+
+
+
+
+
+ Revenge
+ capella:linkedText
+
+
+
+
+
+
+ No revenge
+ capella:linkedText
+
+
+
+
+
+
+ Success
+ capella:linkedText
+
+
+
+
+
+
+ Hunt failed
+ capella:linkedText
+
+
+
+
+
+
+ Reached safety
+ capella:linkedText
+
+
+
+
+
+
+ Hunt ended
+
+ capella:linkedText
+ 2
+
+
+
+
+
+
+ Actor feels hungry
+ self.hunger >= 0.8
+ capella:linkedText
+ Python
+
+
+
+
+
+
+ Actor gets too old
+ capella:linkedText
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is a test context.
+ capella:linkedText
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Actor feels well rested
+ capella:linkedText
+
+
+
+
+
+
+
+ Actor feels sated
+ capella:linkedText
+
+
+
+
+
+
+
+ Food is cooked
+ capella:linkedText
+
+
+
+
+
+
+
+ Revenge
+ capella:linkedText
+
+
+
+
+
+
+
+ No revenge
+ capella:linkedText
+
+
+
+
+
+
+
+ Success
+ capella:linkedText
+
+
+
+
+
+
+
+ Hunt failed
+ capella:linkedText
+
+
+
+
+
+
+
+ Reached safety
+ capella:linkedText
+
+
+
+
+
+
+
+ Hunt ended
+ capella:linkedText
+
+
+
+
+
+
+
+ Actor feels hungry
+ capella:linkedText
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <a href="a0159943-264f-4a97-a245-565fb6bf9db4"/>
+ capella:linkedText
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ capella:linkedText
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ capella:linkedText
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/source/examples/data/melody_model_60/Melody Model Test.capella.license b/docs/source/examples/data/melody_model_60/Melody Model Test.capella.license
new file mode 100644
index 0000000..62a1749
--- /dev/null
+++ b/docs/source/examples/data/melody_model_60/Melody Model Test.capella.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Copyright DB InfraGO AG
+SPDX-License-Identifier: Apache-2.0
diff --git a/docs/source/howtos/howtos.rst b/docs/source/howtos/howtos.rst
new file mode 100644
index 0000000..74cbcc0
--- /dev/null
+++ b/docs/source/howtos/howtos.rst
@@ -0,0 +1,52 @@
+..
+ Copyright DB InfraGO AG and contributors
+ SPDX-License-Identifier: Apache-2.0
+
+.. _howtos:
+
+*******
+Examples
+*******
+
+This section contains a collection of examples that demonstrate how to use the library.
+
+Using the CLI
+=============
+
+Importing ROS2 Messages:
+------------------------
+.. code-block:: bash
+
+ $ python -m capella_ros_tools -i messages docs/source/examples/data/example_msgs -o capella docs/source/examples/data/empty_project_52 -l la --port 5000 --exists-action=k --no-deps
+
+Exporting Capella Models
+------------------------
+.. code-block:: bash
+
+ $ python -m capella_ros_tools -i capella docs/source/examples/data/melody_model_60 -l la -o messages docs/source/examples/data/example_msgs --port 5000
+
+Import ROS2 Messages from Git Repository:
+------------------------
+.. code-block:: bash
+
+ $ python -m capella_ros_tools -i messages git+https://github.com/DSD-DBS/dsd-ros-msg-definitions-oss -o capella docs/source/examples/data/empty_project_52 -l la --port 5000 --exists-action=k --no-deps
+
+Export Capella Models from Git Repository:
+------------------------
+.. code-block:: bash
+
+ $ python -m capella_ros_tools -i capella git+https://github.com/DSD-DBS/coffee-machine -l la -o messages docs/source/examples/data/coffee_msgs --port 5000
+
+
+Using the Python API
+====================
+
+In this section you can view dedicated tutorial-notebooks that demonstrate how to use the library.
+
+.. toctree::
+ :maxdepth: 4
+ :caption: How tos:
+ :numbered:
+ :glob:
+
+ ../examples/*
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 8e45b65..52eade7 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -1,14 +1,52 @@
..
- Copyright DB Netz AG and contributors
+ Copyright DB InfraGO AG and contributors
SPDX-License-Identifier: Apache-2.0
-Welcome to capella-ros-tools's documentation!
-=============================================
+
+*****************************
+Welcome to the Capella ROS Tools documentation!
+*****************************
+
+Overview
+========
+
+.. image:: https://img.shields.io/badge/license-Apache%202-blue.svg
+ :target:
+
+.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
+ :target: https://github.com/psf/black
+ :alt: Black
+
+**Date**: |today| **Version**: |Version|
+
+Capella ROS Tools is a command-line application written in Python, designed to facilitate the seamless integration of ROS2 and Capella MBSE tools. Key features include:
+
+* generate ROS2 message files (.msg) from Capella models
+* generate Capella elements and objects from ROS2 message files
+* support input sources through both local file paths and Git repositories
+* disply snapshots of Capella model elements in a tree structure
+
+If you want a quickstart at how to use this tool, head right into the
+:ref:`Usage section `.
+
.. toctree::
:maxdepth: 2
:caption: Contents:
+.. toctree::
+ :maxdepth: 3
+ :caption: Usage
+
+ usage/usage
+
+
+.. toctree::
+ :caption: Examples
+ :titlesonly:
+
+ howtos/howtos
+
.. toctree::
:maxdepth: 3
:caption: API reference
diff --git a/docs/source/usage/usage.rst b/docs/source/usage/usage.rst
new file mode 100644
index 0000000..9a1d58a
--- /dev/null
+++ b/docs/source/usage/usage.rst
@@ -0,0 +1,23 @@
+..
+ Copyright DB InfraGO AG and contributors
+ SPDX-License-Identifier: Apache-2.0
+
+.. _howtos:
+
+*****
+Usage
+*****
+
+This section describes how to use the Capella ROS Tools CLI.
+
+Importing ROS2 Messages:
+------------------------
+.. code-block:: bash
+
+ $ python -m capella_ros_tools -i messages -o capella -l --port= --exists-action= --no-deps
+
+Exporting Capella Models
+------------------------
+.. code-block:: bash
+
+ $ python -m capella_ros_tools -i capella -l -o messages --port
diff --git a/pyproject.toml b/pyproject.toml
index e1ae6cd..704b9af 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
[build-system]
@@ -9,12 +9,12 @@ build-backend = "setuptools.build_meta"
dynamic = ["version"]
name = "capella-ros-tools"
-description = "API and scripts to parse .msg files and convert them to Capella"
+description = "Tool for converting ROS messages from and to Capella models."
readme = "README.md"
-requires-python = ">=3.9, <3.12"
+requires-python = ">=3.10, <3.13"
license = { text = "Apache-2.0" }
authors = [
- { name = "DB Netz AG" },
+ { name = "DB InfraGO AG" },
]
keywords = []
classifiers = [
@@ -23,9 +23,9 @@ classifiers = [
"Natural Language :: English",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
]
dependencies = [
"click",
@@ -53,7 +53,7 @@ test = [
[tool.black]
line-length = 79
-target-version = ["py39"]
+target-version = ["py310"]
[tool.coverage.run]
branch = true
@@ -203,3 +203,4 @@ include = ["capella_ros_tools", "capella_ros_tools.*"]
[tool.setuptools_scm]
# This section must exist for setuptools_scm to work
+local_scheme = "no-local-version"
diff --git a/tests/test_capella_ros_tools.py b/tests/test_capella_ros_tools.py
index 17bcb5d..29b3e25 100644
--- a/tests/test_capella_ros_tools.py
+++ b/tests/test_capella_ros_tools.py
@@ -1,4 +1,4 @@
-# Copyright DB Netz AG and contributors
+# Copyright DB InfraGO AG and contributors
# SPDX-License-Identifier: Apache-2.0
import capella_ros_tools