diff --git a/rosidl2capella/__main__.py b/rosidl2capella/__main__.py index 9202995..20331d1 100644 --- a/rosidl2capella/__main__.py +++ b/rosidl2capella/__main__.py @@ -4,7 +4,9 @@ import click import rosidl2capella -from rosidl2capella.msg2capella import msg2capella +from rosidl2capella.capella2msg import capella2msg + +# from rosidl2capella.msg2capella import msg2capella @click.command() @@ -18,4 +20,5 @@ def main(): if __name__ == "__main__": - msg2capella() + # msg2capella() + capella2msg() diff --git a/rosidl2capella/capella2msg.py b/rosidl2capella/capella2msg.py new file mode 100644 index 0000000..57b0547 --- /dev/null +++ b/rosidl2capella/capella2msg.py @@ -0,0 +1,113 @@ +# Copyright DB Netz AG and contributors +# SPDX-License-Identifier: Apache-2.0 +"""CLI for importing .msg to capella model.""" +import sys +from pathlib import Path + +import click + +import rosidl2capella +from rosidl2capella.modules import BASIC_TYPES, ROS_INTERFACES +from rosidl2capella.modules.parse_capella import ParseCapella +from rosidl2capella.modules.serialize_message import ( + SerializeMessageDef, + SerializeMessagesPkg, +) + + +class Capella2Msg: + """Class for converting capella model to .msg files.""" + + def __init__(self, path_to_capella_model, layer, overlap) -> None: + self.parser = ParseCapella(path_to_capella_model, layer) + self.overlap = overlap + + def add_package(self, current_root): + """Add package to message package.""" + out = SerializeMessagesPkg({}, {}) + + messages = self.parser.get_classes(current_root) + types = self.parser.get_types(current_root) + + out.messages = { + msg_name: SerializeMessageDef(msg_name, desc, props) + for msg_name, (desc, props) in (messages | types).items() + } + out.packages = { + pkg_name: self.add_package(current_root.packages.by_name(pkg_name)) + for pkg_name in self.parser.get_packages(current_root) + } + return out + + +@click.command() +@click.version_option( + version=rosidl2capella.__version__, + prog_name="rosidl2capella", + message="%(prog)s %(version)s", +) +@click.argument( + "path-to-msgs-root", + type=click.Path( + file_okay=False, + readable=True, + resolve_path=True, + path_type=Path, + ), + required=True, +) +@click.argument( + "path-to-capella-model", + type=click.Path( + exists=True, + readable=True, + resolve_path=True, + path_type=str, + ), + required=True, +) +@click.argument( + "layer", + type=click.Choice(["oa", "sa", "la", "pa"], case_sensitive=False), + required=True, +) +@click.option( + "-o", + "--overlap", + type=click.Choice( + ["keep", "overwrite", "ask", "abort"], case_sensitive=False + ), + default="ask" if sys.stdin.isatty() else "abort", +) +@click.option("--debug", is_flag=True) +def capella2msg( + path_to_msgs_root, path_to_capella_model, layer, overlap, debug +): + """Convert capella model to .msg files.""" + converter = Capella2Msg(path_to_capella_model, layer, overlap) + current_root = converter.parser.data + + messages = converter.parser.get_classes(current_root) + types = converter.parser.get_types(current_root) + + packages = converter.parser.get_packages(current_root) + packages.discard(BASIC_TYPES) + packages.discard(ROS_INTERFACES) + + root = SerializeMessagesPkg({}, {}) + root.messages = { + msg_name: SerializeMessageDef(msg_name, desc, props) + for msg_name, (desc, props) in (messages | types).items() + } + + root.packages = { + pkg_name: converter.add_package( + current_root.packages.by_name(pkg_name) + ) + for pkg_name in packages + } + + if debug: + click.echo(root) + else: + root.to_msg_folder(path_to_msgs_root) diff --git a/rosidl2capella/modules/parse_capella.py b/rosidl2capella/modules/parse_capella.py index aab1ee4..54351c8 100644 --- a/rosidl2capella/modules/parse_capella.py +++ b/rosidl2capella/modules/parse_capella.py @@ -3,7 +3,7 @@ """Class definition for Capella model parser.""" import typing as t -from . import BaseCapella, EnumValue, MsgProp +from . import ROS_INTERFACES, BaseCapella, EnumValue, MsgProp class ParseCapella(BaseCapella): @@ -20,8 +20,12 @@ def get_classes(self, package: t.Any) -> dict[str, t.Any]: props = [ MsgProp( prop.name, - prop.type.name, - "", + prop.type.name + if prop.type.__class__.__name__ != "Enumeration" + else "uint8", + prop.type.parent.name + if prop.type.parent.parent.name == ROS_INTERFACES + else "", prop.min_card.value, prop.max_card.value, prop.description, @@ -38,7 +42,7 @@ def get_types(self, package: t.Any) -> dict[str, t.Any]: props = [ EnumValue( prop.name, - prop.type.name, + prop.value.type.name if prop.value.type else "uint8", prop.value.value, prop.description, ) diff --git a/rosidl2capella/modules/parse_message.py b/rosidl2capella/modules/parse_message.py index 5de0778..d4c6b26 100644 --- a/rosidl2capella/modules/parse_message.py +++ b/rosidl2capella/modules/parse_message.py @@ -7,13 +7,9 @@ from . import EnumValue, MessageDef, MessagesPkg, MsgProp -RE_TNC = re.compile( - r"^([A-Za-z0-9\[\]\/_]+).*?([A-Za-z0-9_]+)(?:.*?# ([^\n]+))?" -) -RE_ENUM = re.compile( - r"^([A-Za-z0-9]+).*?([A-Za-z0-9_]+).*?= ([0-9]+)(?:.*?# ([^\n]+))?" -) -RE_COMMENT = re.compile(r"cf. ([a-zA-Z0-9_]+)(?:, ([a-zA-Z0-9_]+))?") +RE_TNC = re.compile(r"^([A-Za-z0-9\[\]\/_]+)\s+(\w+)(?:\s+#\s*(.+))?$") +RE_ENUM = re.compile(r"^(\w+)\s+(\w+)\s*=\s*(\d+)\s*(?:#\s*(.+))?$") +RE_COMMENT = re.compile(r"cf.\s+(\w+)(?:,\s+(\w+))?") class ParseMessageDef(MessageDef): diff --git a/rosidl2capella/modules/serialize_capella.py b/rosidl2capella/modules/serialize_capella.py index e8619e3..c6d430f 100644 --- a/rosidl2capella/modules/serialize_capella.py +++ b/rosidl2capella/modules/serialize_capella.py @@ -11,6 +11,11 @@ class SerializeCapella(BaseCapella): """Serializer for Capella model.""" + def __init__(self, path_to_capella_model: str, layer: str) -> None: + super().__init__(path_to_capella_model, layer) + self.create_packages({BASIC_TYPES}, self.data) + self.basic_types = self.data.packages.by_name(BASIC_TYPES) + def create_packages(self, packages: set[str], package: t.Any) -> None: """Create packages in Capella model.""" for package_name in packages: @@ -61,10 +66,13 @@ def create_types( property = type.owned_literals.create( "EnumerationLiteral", name=prop.name, - description=description, + description=prop.comment, ) + self.create_basic_types({prop.type}) property.value = capellambse.new_object( - "LiteralNumericValue", value=float(prop.value) + "LiteralNumericValue", + value=float(prop.value), + type=self.basic_types.datatypes.by_name(prop.type), ) return overlap @@ -76,14 +84,12 @@ def delete_types(self, types: list, package: t.Any) -> None: except KeyError: pass - def create_basic_types( - self, basic_types: set[str], package: t.Any - ) -> list: + def create_basic_types(self, basic_types: set[str]) -> list: """Create basic types in Capella model.""" overlap = [] for basic_type in basic_types: try: - overlap.append(package.datatypes.by_name(basic_type)) + overlap.append(self.basic_types.datatypes.by_name(basic_type)) except KeyError: if basic_type in ["string", "char"]: type = "StringType" @@ -91,7 +97,7 @@ def create_basic_types( type = "BooleanType" else: type = "NumericType" - package.datatypes.create(type, name=basic_type) + self.basic_types.datatypes.create(type, name=basic_type) return overlap def create_composition( @@ -154,9 +160,7 @@ def _find_type(self, type_name: str, package: t.Any) -> t.Any: except KeyError: pass try: - return self.data.packages.by_name(BASIC_TYPES).datatypes.by_name( - type_name - ) + return self.basic_types.datatypes.by_name(type_name) except KeyError: return None diff --git a/rosidl2capella/modules/serialize_message.py b/rosidl2capella/modules/serialize_message.py new file mode 100644 index 0000000..177106e --- /dev/null +++ b/rosidl2capella/modules/serialize_message.py @@ -0,0 +1,51 @@ +# Copyright DB Netz AG and contributors +# SPDX-License-Identifier: Apache-2.0 +"""Serializer for ROS messages.""" + +from pathlib import Path + +from . import MessageDef, MessagesPkg + + +class SerializeMessageDef(MessageDef): + """Serializer for message files.""" + + def to_msg_file(self, file: Path) -> None: + """Write message definition to message file.""" + description = "# " + self.description.replace("\n", "\n# ") + "\n" + props = "\n".join( + f"{p.typedir+'/' if p.typedir else ''}{p.type}" + f"{'[]' if p.min != p.max else ''} {p.name}\t" + f"{'# ' if p.comment else ''}{p.comment}" + for p in self.props + ) + file.write_text(description + "\n" + props) + + def to_type_file(self, file: Path) -> None: + """Write message definition to message file.""" + description = "# " + self.description.replace("\n", "\n# ") + "\n" + props = "\n".join( + f"{p.type} {file.stem + '_' + p.name}\t= {p.value}\t" + f"{'# ' if p.comment else ''}{p.comment}" + for p in self.props + ) + file.write_text(description + "\n" + props) + + +class SerializeMessagesPkg(MessagesPkg): + """Serializer for message packages.""" + + def to_msg_folder(self, path_to_pkg_root: Path) -> None: + """Write message package to message package.""" + path_to_pkg_root.mkdir(parents=True, exist_ok=True) + for msg_name, msg in self.messages.items(): + msg_file = path_to_pkg_root.joinpath(msg_name + ".msg") + if path_to_pkg_root.name == "types": + msg.to_type_file(msg_file) + else: + msg.to_msg_file(msg_file) + + for pkg_name, pkg in self.packages.items(): + new_path = path_to_pkg_root.joinpath(pkg_name) + new_path.mkdir(parents=True, exist_ok=True) + pkg.to_msg_folder(new_path) diff --git a/rosidl2capella/msg2capella.py b/rosidl2capella/msg2capella.py index f1932d2..a0937f0 100644 --- a/rosidl2capella/msg2capella.py +++ b/rosidl2capella/msg2capella.py @@ -7,7 +7,7 @@ import click import rosidl2capella -from rosidl2capella.modules import BASIC_TYPES, ROS_INTERFACES +from rosidl2capella.modules import ROS_INTERFACES from rosidl2capella.modules.parse_message import ParseMessagesPkg from rosidl2capella.modules.serialize_capella import SerializeCapella @@ -32,7 +32,10 @@ def add_objects(self, messages, packages, current_root): ) ) - overlap = func[0](messages, current_root) + overlap = func[0]( + {msg_name: msg.as_struct for msg_name, msg in messages.items()}, + current_root, + ) if overlap and self.overlap == "abort": click.echo( @@ -47,32 +50,29 @@ def add_objects(self, messages, packages, current_root): ) ): func[1]([cls], current_root) - func[0]({cls.name: messages[cls.name]}, current_root) + func[0]({cls.name: messages[cls.name].as_struct}, current_root) - for pkg_name, (new_messages, new_packages) in packages.items(): - new_root = self.serializer.data.packages.by_name(pkg_name) - self.add_objects(new_messages, new_packages, new_root) + for pkg_name, pkg in packages.items(): + new_root = current_root.packages.by_name(pkg_name) + self.add_objects(pkg.messages, pkg.packages, new_root) def add_relations(self, messages, packages, current_root): """Add relations to capella model.""" if current_root.name == "types": return - for class_name, (_, props) in messages.items(): - for prop in props: + for class_name, cls in messages.items(): + for prop in cls.props: if not self.serializer.create_composition( class_name, prop, current_root ): while not self.serializer.create_attribute( class_name, prop, current_root ): - self.serializer.create_basic_types( - {prop.type}, - self.serializer.data.packages.by_name(BASIC_TYPES), - ) + self.serializer.create_basic_types({prop.type}) - for pkg_name, (new_messages, new_packages) in packages.items(): - new_root = self.serializer.data.packages.by_name(pkg_name) - self.add_relations(new_messages, new_packages, new_root) + for pkg_name, pkg in packages.items(): + new_root = current_root.packages.by_name(pkg_name) + self.add_relations(pkg.messages, pkg.packages, new_root) @click.command() @@ -96,7 +96,6 @@ def add_relations(self, messages, packages, current_root): "path-to-capella-model", type=click.Path( exists=True, - file_okay=False, readable=True, resolve_path=True, path_type=str, @@ -125,18 +124,16 @@ def msg2capella( ros_interfaces = ParseMessagesPkg.from_pkg_folders( Path(__file__).joinpath("ros_interfaces") - ).as_structs + ) - messages, packages = ParseMessagesPkg.from_msg_folder( - path_to_msgs_root - ).as_structs - packages |= {ROS_INTERFACES: ros_interfaces} | {BASIC_TYPES: ({}, {})} + msg = ParseMessagesPkg.from_msg_folder(path_to_msgs_root) + msg.packages |= {ROS_INTERFACES: ros_interfaces} current_root = converter.serializer.data - converter.add_objects(messages, packages, current_root) + converter.add_objects(msg.messages, msg.packages, current_root) - converter.add_relations(messages, packages, current_root) + converter.add_relations(msg.messages, msg.packages, current_root) if debug: click.echo(converter.serializer.data) diff --git a/tests/data/model/ros_msgs.capella b/tests/data/model/ros_msgs.capella index 2967327..db4693b 100644 --- a/tests/data/model/ros_msgs.capella +++ b/tests/data/model/ros_msgs.capella @@ -202,111 +202,128 @@ id="bd10fade-2ac9-41bf-a42b-05cbb751d274" name="Interfaces"/> <ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg" id="4ada90cb-13d8-4140-b92f-d8206a56bdae" name="Data"> - <ownedAssociations id="e59e1d70-33d3-4c39-afc1-0b5e783d2412" navigableMembers="#922be465-af53-42b6-a084-220c5195a449" + <ownedAssociations id="c3854a66-ff63-4ea5-a3ee-e254187396a2" navigableMembers="" xsi:type="org.polarsys.capella.core.data.information:Association"> - <ownedMembers id="8c7bb91b-6854-4efd-8f29-41aabafc7a2c" abstractType="#74cad8af-42d6-4018-8cb8-48faa5bd3508" + <ownedMembers id="3e9aaa18-fb22-437a-987f-ed2bfaf56490" aggregationKind="ASSOCIATION" + xsi:type="org.polarsys.capella.core.data.information:Property"> + <ownedMinCard id="ba5ff7f6-8313-4623-9408-168d86093076" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="e2576427-42db-4c41-8f1c-fdf33d4ccf18" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + </ownedMembers> + </ownedAssociations> + <ownedAssociations id="5f59bd8a-1fed-4c38-990d-fc3d1180bc1d" navigableMembers="" + xsi:type="org.polarsys.capella.core.data.information:Association"> + <ownedMembers id="1e411ff7-d07a-40e3-a2a4-505d45b7c82c" aggregationKind="ASSOCIATION" + xsi:type="org.polarsys.capella.core.data.information:Property"> + <ownedMinCard id="94a0959f-8807-4720-a76c-78ae076bf23c" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="b7da75d5-fa71-4340-ba82-67a602dfba5b" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + </ownedMembers> + </ownedAssociations> + <ownedAssociations id="6ca93ccb-bd99-42a0-b383-467627adf666" navigableMembers="#25306537-c3f9-453a-9f3a-3e826567ca8d" + xsi:type="org.polarsys.capella.core.data.information:Association"> + <ownedMembers id="d7c1f6a7-ddd6-4c0d-8485-ab8c35f25d22" abstractType="#45464dbe-7366-404c-b898-99d85f312a52" aggregationKind="ASSOCIATION" xsi:type="org.polarsys.capella.core.data.information:Property"> - <ownedMinCard id="1f12d3b9-2308-42ba-a5b1-58b0215b8789" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - <ownedMaxCard id="678c3377-ac0f-405c-800a-4e9a81536a1d" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMinCard id="15d3767e-bf62-4b44-838d-d7c5b26b8500" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="8f728903-989a-493e-aa52-152952ee2785" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> </ownedMembers> </ownedAssociations> - <ownedAssociations id="4c637540-0efc-4e2d-bb66-1d73d51418b6" navigableMembers="#9be17831-3fef-41b0-9e60-f7f7c9785d24" + <ownedAssociations id="c7a443d1-01ee-40c7-ac81-32556c5c9b02" navigableMembers="#69dbdb75-c1cb-49c8-a87f-d69e25a9edb2" xsi:type="org.polarsys.capella.core.data.information:Association"> - <ownedMembers id="c15e9e0d-f31a-4577-a1c4-88ff1baf96a8" abstractType="#50c62fcc-c176-4d58-855d-2a6dbae2ef47" + <ownedMembers id="ffe6d110-e857-4b47-8266-d89574aa4564" abstractType="#21a3fbe8-ae95-4c53-8bf5-699a69a43e2c" aggregationKind="ASSOCIATION" xsi:type="org.polarsys.capella.core.data.information:Property"> - <ownedMinCard id="d3dd7861-22c8-4b9d-a965-31228434f383" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - <ownedMaxCard id="36fab63e-2b0a-4b64-ba9b-842eba2599ed" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMinCard id="4b4bb30a-ffc9-4b98-b07d-9d1a46127d30" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="cf6a7962-8681-4b23-bae5-1b798fbaa756" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> </ownedMembers> </ownedAssociations> - <ownedClasses id="74cad8af-42d6-4018-8cb8-48faa5bd3508" name="UInt64MultiArray" + <ownedClasses id="45464dbe-7366-404c-b898-99d85f312a52" name="UInt64MultiArray" description="Copyright DB Netz AG and contributors
SPDX-License-Identifier: Apache-2.0" xsi:type="org.polarsys.capella.core.data.information:Class"> - <ownedFeatures id="922be465-af53-42b6-a084-220c5195a449" name="layout" abstractType="#50c62fcc-c176-4d58-855d-2a6dbae2ef47" + <ownedFeatures id="25306537-c3f9-453a-9f3a-3e826567ca8d" name="layout" abstractType="#21a3fbe8-ae95-4c53-8bf5-699a69a43e2c" aggregationKind="COMPOSITION" description="specification of data layout" xsi:type="org.polarsys.capella.core.data.information:Property"> - <ownedMinCard id="73edaf06-abae-4fbe-81fc-96779981060c" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - <ownedMaxCard id="77ec61a4-e2be-4310-94f4-4967a0dad114" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMinCard id="926b3781-98f6-40af-91de-c11c37612147" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="db2bdbe9-eb14-4b55-8040-1a5124b39bfb" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> </ownedFeatures> - <ownedFeatures id="7b05385f-dc24-4926-b19c-679e528bcb89" name="data" abstractType="#80c47907-accf-481e-a5e9-c0b8f66fe463" + <ownedFeatures id="6c9dc8f6-75b6-4a42-a500-6d65d0ee4b8c" name="data" abstractType="#458c3c69-6e88-42f0-a852-52eb56cf2382" aggregationKind="COMPOSITION" description="array of data" xsi:type="org.polarsys.capella.core.data.information:Property"> - <ownedMinCard id="2cb52f5d-8df8-403d-9b4a-d35108a02c62" value="0" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - <ownedMaxCard id="d54e2fd0-8c56-4646-b414-570c2cd2ada1" value="*" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMinCard id="9436a8ba-2133-4b0a-aa21-0195eb71a1a2" value="0" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="8d4d10a9-6ca3-42a3-b212-fd9562f6d3ce" value="*" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> </ownedFeatures> </ownedClasses> - <ownedClasses id="50c62fcc-c176-4d58-855d-2a6dbae2ef47" name="MultiArrayLayout" + <ownedClasses id="21a3fbe8-ae95-4c53-8bf5-699a69a43e2c" name="MultiArrayLayout" description="Copyright DB Netz AG and contributors
SPDX-License-Identifier: Apache-2.0" xsi:type="org.polarsys.capella.core.data.information:Class"> - <ownedFeatures id="9be17831-3fef-41b0-9e60-f7f7c9785d24" name="dim" abstractType="#bad23d52-7a7b-4356-8e14-98297b196f16" + <ownedFeatures id="69dbdb75-c1cb-49c8-a87f-d69e25a9edb2" name="dim" abstractType="#ef3b07c4-ae0d-4f42-b5d8-dcecca089479" aggregationKind="COMPOSITION" description="Array of dimension properties" xsi:type="org.polarsys.capella.core.data.information:Property"> - <ownedMinCard id="1dee0821-b398-4983-b1a7-3ecc30af3fb2" value="0" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - <ownedMaxCard id="1e2aa8ed-c645-41a4-8bcc-c3d6c7c38c6c" value="*" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMinCard id="ba86dfac-38c8-40a4-ba3d-970c52f84659" value="0" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="7c19ba5f-b72f-410b-8ab9-b95efd326b04" value="*" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> </ownedFeatures> - <ownedFeatures id="c8ee63d4-9f78-4422-97a3-c7b5a9873c6b" name="data_offset" - abstractType="#dc69adb1-9a90-4fc7-9cd5-746204dd36b8" aggregationKind="COMPOSITION" + <ownedFeatures id="97810d47-0a77-4b88-9fd2-44ca3eac61dd" name="data_offset" + abstractType="#958123ef-280b-470a-b0ee-c0cfcfa867b4" aggregationKind="COMPOSITION" description="cf. ObjectTypes, OBJECT_MOTION_TYPE_XXX" xsi:type="org.polarsys.capella.core.data.information:Property"> - <ownedMinCard id="a3984753-5717-4edd-b2a0-b7359cbe67a6" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - <ownedMaxCard id="82417d71-f349-4cfa-9838-3afa4f3d4440" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMinCard id="ddabd8d6-65c2-413a-a7b5-c86c38168e67" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="aef75792-1c3a-4cba-9564-3b38a9613e9d" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> </ownedFeatures> </ownedClasses> - <ownedDataPkgs id="ce4f7f9b-0901-4481-83d8-04e255f17687" name="sub_msgs" xsi:type="org.polarsys.capella.core.data.information:DataPkg"> - <ownedClasses id="bad23d52-7a7b-4356-8e14-98297b196f16" name="MultiArrayDimension" - description="Copyright DB Netz AG and contributors
SPDX-License-Identifier: Apache-2.0" - xsi:type="org.polarsys.capella.core.data.information:Class"> - <ownedFeatures id="339802aa-361d-4abd-9758-676d0e35ae85" name="label" - abstractType="#bf2b60f2-40f6-4e4b-8250-2c367e39094b" aggregationKind="COMPOSITION" - description="label of given dimension" xsi:type="org.polarsys.capella.core.data.information:Property"> - <ownedMinCard id="0236c44a-1471-42e5-9f3b-4bb0efce5038" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - <ownedMaxCard id="63a50fb5-ad2a-4192-86be-310692b96817" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - </ownedFeatures> - <ownedFeatures id="11822ae5-ce84-4a68-beb8-be61b22c93f8" name="size" abstractType="#0287566e-0171-438f-8383-57239944e605" - aggregationKind="COMPOSITION" description="size of given dimension (in type units)" - xsi:type="org.polarsys.capella.core.data.information:Property"> - <ownedMinCard id="46e621e8-00cd-4a23-a7e0-59b248041754" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - <ownedMaxCard id="6b99c9d4-66b4-440b-8736-cc5d6aa1d101" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - </ownedFeatures> - <ownedFeatures id="b789143c-26f7-4703-b9a8-3c4e020d29e3" name="stride" - abstractType="#0287566e-0171-438f-8383-57239944e605" aggregationKind="COMPOSITION" - description="stride of given dimension" xsi:type="org.polarsys.capella.core.data.information:Property"> - <ownedMinCard id="a5585b9a-9e5b-445b-a307-fac3eb5c5a84" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - <ownedMaxCard id="c6eb6b04-4c81-4035-a838-cd1a0efa48e5" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> - </ownedFeatures> - </ownedClasses> - </ownedDataPkgs> - <ownedDataPkgs id="32a19632-30f8-443b-9e30-36ee23726324" name="ros_interfaces" - xsi:type="org.polarsys.capella.core.data.information:DataPkg"/> - <ownedDataPkgs id="bca4f223-25e5-4163-a7b5-6187ee138563" name="basic_types" + <ownedDataPkgs id="99f20875-01e3-4a7b-95bd-a571c1ce963e" name="basic_types" xsi:type="org.polarsys.capella.core.data.information:DataPkg"> - <ownedDataTypes id="80c47907-accf-481e-a5e9-c0b8f66fe463" name="uint64" + <ownedDataTypes id="7e259dd9-4176-4399-aaaa-4a17b063d1c2" name="uint8" xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"/> + <ownedDataTypes id="458c3c69-6e88-42f0-a852-52eb56cf2382" name="uint64" xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"/> - <ownedDataTypes id="bf2b60f2-40f6-4e4b-8250-2c367e39094b" name="string" + <ownedDataTypes id="30da896a-795a-4c48-be7b-7e11e2093281" name="string" xsi:type="org.polarsys.capella.core.data.information.datatype:StringType"/> - <ownedDataTypes id="0287566e-0171-438f-8383-57239944e605" name="uint32" + <ownedDataTypes id="451b29cd-8229-4c0f-ab30-0674aa8959ff" name="uint32" xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"/> </ownedDataPkgs> - <ownedDataPkgs id="c123006a-d406-4903-84f8-da90cda7417e" name="types" xsi:type="org.polarsys.capella.core.data.information:DataPkg"> - <ownedDataTypes id="1b962b85-393f-46aa-ae12-e7fb368ecbcd" description="SPDX-FileCopyrightText: Copyright DB Netz AG
SPDX-License-Identifier: Apache-2.0" + <ownedDataPkgs id="70d28569-0e5d-4503-af3f-ab56215e64cc" name="types" xsi:type="org.polarsys.capella.core.data.information:DataPkg"> + <ownedDataTypes id="d15a2c57-4d8d-4b30-bb1b-00ee0a097938" description="SPDX-FileCopyrightText: Copyright DB Netz AG
SPDX-License-Identifier: Apache-2.0" xsi:type="org.polarsys.capella.core.data.information.datatype:Enumeration"/> - <ownedDataTypes id="dc69adb1-9a90-4fc7-9cd5-746204dd36b8" name="OBJECT_MOTION_TYPE" + <ownedDataTypes id="958123ef-280b-470a-b0ee-c0cfcfa867b4" name="OBJECT_MOTION_TYPE" description="SPDX-FileCopyrightText: Copyright DB Netz AG
SPDX-License-Identifier: Apache-2.0" xsi:type="org.polarsys.capella.core.data.information.datatype:Enumeration"> - <ownedLiterals id="8962f10f-1a5b-4ea5-a084-b71b92fbdf3d" name="UNDEFINED" - description="SPDX-FileCopyrightText: Copyright DB Netz AG
SPDX-License-Identifier: Apache-2.0" + <ownedLiterals id="0b5ba164-a9e2-48ea-b14d-a145402d33bd" name="UNDEFINED" xsi:type="org.polarsys.capella.core.data.information.datavalue:EnumerationLiteral"> - <domainValue id="c3a89d92-f5ac-45b3-9515-ba3413c1846a" value="0" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <domainValue id="0c2ba4bd-3016-401e-a5e8-7deddce01965" value="0" abstractType="#7e259dd9-4176-4399-aaaa-4a17b063d1c2" + xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> </ownedLiterals> - <ownedLiterals id="25222b56-e2ca-4ffa-96c9-b823066564c2" name="STATIC" - description="SPDX-FileCopyrightText: Copyright DB Netz AG
SPDX-License-Identifier: Apache-2.0" + <ownedLiterals id="3014c482-7300-47ff-9f55-f4e823ca262f" name="STATIC" xsi:type="org.polarsys.capella.core.data.information.datavalue:EnumerationLiteral"> - <domainValue id="f9967889-a9ec-417a-a931-f87498c28416" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <domainValue id="fd655c30-6bde-4447-8493-d1f840f57379" value="1" abstractType="#7e259dd9-4176-4399-aaaa-4a17b063d1c2" + xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> </ownedLiterals> - <ownedLiterals id="98789413-3750-4217-bba9-79301237590e" name="DYNAMIC" - description="SPDX-FileCopyrightText: Copyright DB Netz AG
SPDX-License-Identifier: Apache-2.0" + <ownedLiterals id="182b38d5-bc8a-4c15-bee7-2e59d5dc3386" name="DYNAMIC" xsi:type="org.polarsys.capella.core.data.information.datavalue:EnumerationLiteral"> - <domainValue id="bd98d138-d752-496b-8356-814fca771443" value="2" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <domainValue id="550e6bce-982a-4216-b0f5-c1807c92a166" value="2" abstractType="#7e259dd9-4176-4399-aaaa-4a17b063d1c2" + xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> </ownedLiterals> </ownedDataTypes> </ownedDataPkgs> + <ownedDataPkgs id="400ad643-97f1-4483-8cf1-294481d8c599" name="ros_interfaces" + xsi:type="org.polarsys.capella.core.data.information:DataPkg"/> + <ownedDataPkgs id="91c12c9a-0a3e-485d-b597-b18b4cbc809d" name="sub_msgs" xsi:type="org.polarsys.capella.core.data.information:DataPkg"> + <ownedClasses id="ef3b07c4-ae0d-4f42-b5d8-dcecca089479" name="MultiArrayDimension" + description="Copyright DB Netz AG and contributors
SPDX-License-Identifier: Apache-2.0" + xsi:type="org.polarsys.capella.core.data.information:Class"> + <ownedFeatures id="dd23942b-ac66-4817-af2b-93ef9d648a58" name="label" + abstractType="#30da896a-795a-4c48-be7b-7e11e2093281" aggregationKind="COMPOSITION" + description="label of given dimension" xsi:type="org.polarsys.capella.core.data.information:Property"> + <ownedMinCard id="14d5a6e6-eaf5-4c4f-a512-a9ce41ad6107" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="979be9ad-26dd-48b3-98fb-65f32f6d4b91" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + </ownedFeatures> + <ownedFeatures id="76636610-4e7a-4c5a-bbfc-22f15dd34d11" name="size" abstractType="#451b29cd-8229-4c0f-ab30-0674aa8959ff" + aggregationKind="COMPOSITION" description="size of given dimension (in type units)" + xsi:type="org.polarsys.capella.core.data.information:Property"> + <ownedMinCard id="a9d18bfb-86b3-4bd4-9719-8ca587ee8253" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="98189d64-1bcf-477e-8077-c272d9087afa" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + </ownedFeatures> + <ownedFeatures id="3de6c3ba-1440-4602-be37-93d7fb956e27" name="stride" + abstractType="#451b29cd-8229-4c0f-ab30-0674aa8959ff" aggregationKind="COMPOSITION" + description="stride of given dimension" xsi:type="org.polarsys.capella.core.data.information:Property"> + <ownedMinCard id="0361995f-81e9-4906-a4d9-88ce7749d016" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + <ownedMaxCard id="eee85b53-9044-4db0-a92a-e94e86c6d90b" value="1" xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"/> + </ownedFeatures> + </ownedClasses> + </ownedDataPkgs> </ownedDataPkg> <ownedLogicalComponentPkg xsi:type="org.polarsys.capella.core.data.la:LogicalComponentPkg" id="a4f76d7e-fd81-45a9-9f18-b12272aeccb5" name="Structure">