armodel 1.3.0__py3-none-any.whl → 1.4.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- armodel/__init__.py +2 -1
- armodel/cli/arxml_dump_cli.py +8 -6
- armodel/cli/arxml_format_cli.py +72 -0
- armodel/cli/connector2xlsx_cli.py +75 -0
- armodel/cli/connector_update_cli.py +77 -0
- armodel/cli/swc_list_cli.py +2 -2
- armodel/data_models/__init__.py +0 -0
- armodel/data_models/sw_connector.py +22 -0
- armodel/lib/__init__.py +1 -1
- armodel/lib/sw_component.py +34 -0
- armodel/models/__init__.py +8 -2
- armodel/models/annotation.py +20 -0
- armodel/models/ar_object.py +184 -0
- armodel/models/ar_package.py +144 -14
- armodel/models/ar_ref.py +74 -8
- armodel/models/bsw_module_template.py +97 -25
- armodel/models/calibration.py +119 -0
- armodel/models/common_structure.py +203 -36
- armodel/models/communication.py +17 -0
- armodel/models/data_def_properties.py +16 -0
- armodel/models/data_dictionary.py +46 -9
- armodel/models/data_prototype.py +24 -5
- armodel/models/datatype.py +86 -19
- armodel/models/end_to_end_protection.py +67 -0
- armodel/models/general_structure.py +72 -17
- armodel/models/global_constraints.py +40 -0
- armodel/models/implementation.py +80 -32
- armodel/models/m2_msr.py +82 -6
- armodel/models/multilanguage_data.py +42 -0
- armodel/models/per_instance_memory.py +14 -0
- armodel/models/port_interface.py +27 -4
- armodel/models/port_prototype.py +48 -23
- armodel/models/record_layout.py +118 -0
- armodel/models/service_mapping.py +11 -0
- armodel/models/service_needs.py +48 -0
- armodel/models/sw_component.py +257 -43
- armodel/models/unit.py +14 -0
- armodel/parser/abstract_arxml_parser.py +248 -0
- armodel/parser/arxml_parser.py +1550 -648
- armodel/parser/connector_xlsx_parser.py +190 -0
- armodel/parser/excel_parser.py +18 -0
- armodel/report/__init__.py +1 -0
- armodel/report/connector_xls_report.py +76 -0
- armodel/report/excel_report.py +42 -0
- armodel/tests/__init__.py +0 -0
- armodel/tests/test_armodel/__init__.py +0 -0
- armodel/tests/test_armodel/models/__init__.py +0 -0
- armodel/tests/test_armodel/models/test_ar_object.py +152 -0
- armodel/tests/test_armodel/models/test_ar_package.py +294 -0
- armodel/tests/test_armodel/models/test_ar_ref.py +74 -0
- armodel/tests/test_armodel/models/test_bsw_module_template.py +46 -0
- armodel/tests/test_armodel/models/test_common_structure.py +73 -0
- armodel/tests/test_armodel/models/test_data_dictionary.py +29 -0
- armodel/tests/test_armodel/models/test_data_prototype.py +86 -0
- armodel/tests/test_armodel/models/test_datatype.py +239 -0
- armodel/tests/test_armodel/models/test_general_structure.py +50 -0
- armodel/tests/test_armodel/models/test_implementation.py +26 -0
- armodel/tests/test_armodel/models/test_m2_msr.py +77 -0
- armodel/tests/test_armodel/models/test_port_interface.py +198 -0
- armodel/tests/test_armodel/models/test_port_prototype.py +14 -0
- armodel/tests/test_armodel/parser/__init__.py +0 -0
- armodel/tests/test_armodel/parser/test_arxml_parser.py +15 -0
- armodel/tests/test_armodel/parser/test_parse_bswmd.py +192 -0
- armodel/tests/test_armodel/parser/test_sw_components.py +93 -0
- armodel/writer/__init__.py +1 -0
- armodel/writer/abstract_arxml_writer.py +123 -0
- armodel/writer/arxml_writer.py +1755 -0
- {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/METADATA +124 -4
- armodel-1.4.3.dist-info/RECORD +78 -0
- armodel-1.4.3.dist-info/entry_points.txt +7 -0
- armodel-1.3.0.dist-info/RECORD +0 -31
- armodel-1.3.0.dist-info/entry_points.txt +0 -4
- {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/LICENSE +0 -0
- {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/WHEEL +0 -0
- {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/top_level.txt +0 -0
armodel/__init__.py
CHANGED
armodel/cli/arxml_dump_cli.py
CHANGED
|
@@ -35,12 +35,12 @@ def show_type(indent: int, data_type: ImplementationDataType):
|
|
|
35
35
|
print("%s-Implementation Type: %s (%s)" % (" " * indent, data_type.short_name, data_type.parent.full_name))
|
|
36
36
|
print("%s : %s" % (" " * indent, data_type.category))
|
|
37
37
|
if (data_type.sw_data_def_props != None):
|
|
38
|
-
if (data_type.sw_data_def_props.
|
|
39
|
-
base_type_ref = data_type.sw_data_def_props.
|
|
38
|
+
if (data_type.sw_data_def_props.baseTypeRef != None):
|
|
39
|
+
base_type_ref = data_type.sw_data_def_props.baseTypeRef
|
|
40
40
|
print("%s : %s (%s)" % (" " * indent, base_type_ref.value, base_type_ref.dest))
|
|
41
41
|
|
|
42
|
-
if (data_type.sw_data_def_props.
|
|
43
|
-
implementation_data_type_ref = data_type.sw_data_def_props.
|
|
42
|
+
if (data_type.sw_data_def_props.implementationDataTypeRef != None):
|
|
43
|
+
implementation_data_type_ref = data_type.sw_data_def_props.implementationDataTypeRef
|
|
44
44
|
print("%s : %s (%s)" % (" " * indent, implementation_data_type_ref.value, implementation_data_type_ref.dest))
|
|
45
45
|
|
|
46
46
|
def show_data_type_mapping(indent: int, mapping_set: DataTypeMappingSet):
|
|
@@ -104,8 +104,8 @@ def show_bsw_internal_behavior(indent: int, behavior: BswInternalBehavior):
|
|
|
104
104
|
|
|
105
105
|
for event in behavior.getBswTimingEvents():
|
|
106
106
|
print("%s-%s" % (" " * (indent + 2), event.short_name))
|
|
107
|
-
print("%s-%s: %s" % (" " * (indent + 4), "StartsOnEventRef", event.
|
|
108
|
-
starts_on_event = document.find(event.
|
|
107
|
+
print("%s-%s: %s" % (" " * (indent + 4), "StartsOnEventRef", event.startsOnEventRef.value))
|
|
108
|
+
starts_on_event = document.find(event.startsOnEventRef.value) # type: BswModuleEntity
|
|
109
109
|
print("%s-%s: %s" % (" " * (indent + 4), "StartsOnEvent", starts_on_event.short_name))
|
|
110
110
|
print("%s-%s: %s" % (" " * (indent + 4), "ImplementedEntryRef", starts_on_event.implemented_entry_ref.value))
|
|
111
111
|
implemented_entry = document.find(starts_on_event.implemented_entry_ref.value) # type: BswModuleEntry
|
|
@@ -121,6 +121,8 @@ def show_bsw_module_description(indent: int, description: BswModuleDescription):
|
|
|
121
121
|
def show_ar_package(indent: int, ar_package: ARPackage):
|
|
122
122
|
print("%s-%s (Pkg)" % (" " * indent, ar_package.short_name))
|
|
123
123
|
|
|
124
|
+
for sub_package in ar_package.getARPackages():
|
|
125
|
+
show_ar_package(indent + 2, sub_package)
|
|
124
126
|
#for data_type in ar_package.getImplementationDataTypes():
|
|
125
127
|
# show_type(indent + 2, data_type)
|
|
126
128
|
#for mapping_set in ar_package.getDataTypeMappingSets():
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import pkg_resources
|
|
3
|
+
import logging
|
|
4
|
+
import sys
|
|
5
|
+
import os.path
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
from ..models.ar_package import AUTOSAR
|
|
9
|
+
from ..parser.arxml_parser import ARXMLParser
|
|
10
|
+
from ..parser.connector_xlsx_parser import ConnectorXlsReader
|
|
11
|
+
|
|
12
|
+
from ..lib import InputFileParser
|
|
13
|
+
from ..writer import ARXMLWriter
|
|
14
|
+
|
|
15
|
+
def main():
|
|
16
|
+
version = pkg_resources.require("armodel")[0].version
|
|
17
|
+
|
|
18
|
+
ap = argparse.ArgumentParser()
|
|
19
|
+
ap.add_argument("-v", "--verbose", required= False, help= "Print debug information", action= "store_true")
|
|
20
|
+
ap.add_argument("-w", "--warning", required= False, help= "Skip the error and report it as warning message", action= "store_true")
|
|
21
|
+
ap.add_argument("INPUT", help = "The path of AUTOSAR ARXML file")
|
|
22
|
+
ap.add_argument("OUTPUT", help = "The path of output ARXML file")
|
|
23
|
+
|
|
24
|
+
args = ap.parse_args()
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger()
|
|
27
|
+
|
|
28
|
+
formatter = logging.Formatter('[%(levelname)s] : %(message)s')
|
|
29
|
+
|
|
30
|
+
stdout_handler = logging.StreamHandler(sys.stderr)
|
|
31
|
+
stdout_handler.setFormatter(formatter)
|
|
32
|
+
|
|
33
|
+
base_path = os.path.dirname(args.OUTPUT)
|
|
34
|
+
log_file = os.path.join(base_path, 'arxml_format.log')
|
|
35
|
+
|
|
36
|
+
if os.path.exists(log_file):
|
|
37
|
+
os.remove(log_file)
|
|
38
|
+
|
|
39
|
+
file_handler = logging.FileHandler(log_file)
|
|
40
|
+
file_handler.setFormatter(formatter)
|
|
41
|
+
|
|
42
|
+
logger.setLevel(logging.DEBUG)
|
|
43
|
+
file_handler.setLevel(logging.DEBUG)
|
|
44
|
+
|
|
45
|
+
if args.verbose:
|
|
46
|
+
stdout_handler.setLevel(logging.DEBUG)
|
|
47
|
+
|
|
48
|
+
else:
|
|
49
|
+
stdout_handler.setLevel(logging.INFO)
|
|
50
|
+
|
|
51
|
+
logger.addHandler(file_handler)
|
|
52
|
+
logger.addHandler(stdout_handler)
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
options = {}
|
|
56
|
+
if args.warning:
|
|
57
|
+
options['warning'] = True
|
|
58
|
+
|
|
59
|
+
document = AUTOSAR().getInstance()
|
|
60
|
+
parser = ARXMLParser(options)
|
|
61
|
+
parser.load(args.INPUT, document)
|
|
62
|
+
|
|
63
|
+
writer = ARXMLWriter()
|
|
64
|
+
writer.save(args.OUTPUT, document)
|
|
65
|
+
|
|
66
|
+
except Exception as e:
|
|
67
|
+
#print(e)
|
|
68
|
+
logger.error(e)
|
|
69
|
+
raise e
|
|
70
|
+
|
|
71
|
+
if __name__ == "__main__":
|
|
72
|
+
main()
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import pkg_resources
|
|
3
|
+
import logging
|
|
4
|
+
import sys
|
|
5
|
+
import os.path
|
|
6
|
+
|
|
7
|
+
from armodel import AUTOSAR
|
|
8
|
+
from armodel.parser import ARXMLParser
|
|
9
|
+
|
|
10
|
+
from ..lib import InputFileParser
|
|
11
|
+
from ..report import ConnectorXlsReport
|
|
12
|
+
|
|
13
|
+
def main():
|
|
14
|
+
version = pkg_resources.require("armodel")[0].version
|
|
15
|
+
|
|
16
|
+
ap = argparse.ArgumentParser()
|
|
17
|
+
ap.add_argument("-v", "--verbose", required= False, help= "Print debug information", action= "store_true")
|
|
18
|
+
ap.add_argument("-w", "--warning", required= False, help= "Skip the error and report it as warning message", action= "store_true")
|
|
19
|
+
ap.add_argument("INPUT", help = "The path of AUTOSAR XML", nargs='+')
|
|
20
|
+
ap.add_argument("OUTPUT", help = "The path of output excel file")
|
|
21
|
+
|
|
22
|
+
args = ap.parse_args()
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger()
|
|
25
|
+
|
|
26
|
+
formatter = logging.Formatter('[%(levelname)s] : %(message)s')
|
|
27
|
+
|
|
28
|
+
stdout_handler = logging.StreamHandler(sys.stderr)
|
|
29
|
+
stdout_handler.setFormatter(formatter)
|
|
30
|
+
|
|
31
|
+
base_path = os.path.dirname(args.OUTPUT)
|
|
32
|
+
log_file = os.path.join(base_path, 'connector.log')
|
|
33
|
+
|
|
34
|
+
if os.path.exists(log_file):
|
|
35
|
+
os.remove(log_file)
|
|
36
|
+
|
|
37
|
+
file_handler = logging.FileHandler(log_file)
|
|
38
|
+
file_handler.setFormatter(formatter)
|
|
39
|
+
|
|
40
|
+
logger.setLevel(logging.DEBUG)
|
|
41
|
+
file_handler.setLevel(logging.DEBUG)
|
|
42
|
+
|
|
43
|
+
if args.verbose:
|
|
44
|
+
stdout_handler.setLevel(logging.DEBUG)
|
|
45
|
+
|
|
46
|
+
else:
|
|
47
|
+
stdout_handler.setLevel(logging.INFO)
|
|
48
|
+
|
|
49
|
+
logger.addHandler(file_handler)
|
|
50
|
+
logger.addHandler(stdout_handler)
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
parser = InputFileParser(args.INPUT)
|
|
54
|
+
filenames = parser.parse()
|
|
55
|
+
|
|
56
|
+
options = {}
|
|
57
|
+
if args.warning:
|
|
58
|
+
options['warning'] = True
|
|
59
|
+
|
|
60
|
+
document = AUTOSAR().getInstance()
|
|
61
|
+
parser = ARXMLParser(options)
|
|
62
|
+
|
|
63
|
+
for filename in filenames:
|
|
64
|
+
parser.load(filename, document)
|
|
65
|
+
|
|
66
|
+
writer = ConnectorXlsReport()
|
|
67
|
+
writer.import_data(document)
|
|
68
|
+
writer.write(args.OUTPUT)
|
|
69
|
+
|
|
70
|
+
except Exception as e:
|
|
71
|
+
#print(e)
|
|
72
|
+
raise e
|
|
73
|
+
|
|
74
|
+
if __name__ == "__main__":
|
|
75
|
+
main()
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import pkg_resources
|
|
3
|
+
import logging
|
|
4
|
+
import sys
|
|
5
|
+
import os.path
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
from ..models.ar_package import AUTOSAR
|
|
9
|
+
from ..parser.arxml_parser import ARXMLParser
|
|
10
|
+
from ..parser.connector_xlsx_parser import ConnectorXlsReader
|
|
11
|
+
|
|
12
|
+
from ..lib import InputFileParser
|
|
13
|
+
from ..writer import ARXMLWriter
|
|
14
|
+
|
|
15
|
+
def main():
|
|
16
|
+
version = pkg_resources.require("armodel")[0].version
|
|
17
|
+
|
|
18
|
+
ap = argparse.ArgumentParser()
|
|
19
|
+
ap.add_argument("-v", "--verbose", required= False, help= "Print debug information", action= "store_true")
|
|
20
|
+
ap.add_argument("-w", "--warning", required= False, help= "Skip the error and report it as warning message", action= "store_true")
|
|
21
|
+
ap.add_argument("INPUT", help = "The path of input ARXML file")
|
|
22
|
+
ap.add_argument("MAPPING", help = "The path of connector excel file which exports with connector2xlsx")
|
|
23
|
+
ap.add_argument("OUTPUT", help = "The path of output ARXML file")
|
|
24
|
+
|
|
25
|
+
args = ap.parse_args()
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger()
|
|
28
|
+
|
|
29
|
+
formatter = logging.Formatter('[%(levelname)s] : %(message)s')
|
|
30
|
+
|
|
31
|
+
stdout_handler = logging.StreamHandler(sys.stderr)
|
|
32
|
+
stdout_handler.setFormatter(formatter)
|
|
33
|
+
|
|
34
|
+
base_path = os.path.dirname(args.OUTPUT)
|
|
35
|
+
log_file = os.path.join(base_path, 'connector_update.log')
|
|
36
|
+
|
|
37
|
+
if os.path.exists(log_file):
|
|
38
|
+
os.remove(log_file)
|
|
39
|
+
|
|
40
|
+
file_handler = logging.FileHandler(log_file)
|
|
41
|
+
file_handler.setFormatter(formatter)
|
|
42
|
+
|
|
43
|
+
logger.setLevel(logging.DEBUG)
|
|
44
|
+
file_handler.setLevel(logging.DEBUG)
|
|
45
|
+
|
|
46
|
+
if args.verbose:
|
|
47
|
+
stdout_handler.setLevel(logging.DEBUG)
|
|
48
|
+
|
|
49
|
+
else:
|
|
50
|
+
stdout_handler.setLevel(logging.INFO)
|
|
51
|
+
|
|
52
|
+
logger.addHandler(file_handler)
|
|
53
|
+
logger.addHandler(stdout_handler)
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
options = {}
|
|
57
|
+
if args.warning:
|
|
58
|
+
options['warning'] = True
|
|
59
|
+
|
|
60
|
+
document = AUTOSAR().getInstance()
|
|
61
|
+
parser = ARXMLParser(options)
|
|
62
|
+
parser.load(args.INPUT, document)
|
|
63
|
+
|
|
64
|
+
reader = ConnectorXlsReader()
|
|
65
|
+
reader.read(args.MAPPING)
|
|
66
|
+
reader.update(document)
|
|
67
|
+
|
|
68
|
+
writer = ARXMLWriter()
|
|
69
|
+
writer.save(args.OUTPUT, document)
|
|
70
|
+
|
|
71
|
+
except Exception as e:
|
|
72
|
+
#print(e)
|
|
73
|
+
logger.error(e)
|
|
74
|
+
raise e
|
|
75
|
+
|
|
76
|
+
if __name__ == "__main__":
|
|
77
|
+
main()
|
armodel/cli/swc_list_cli.py
CHANGED
|
@@ -16,7 +16,7 @@ def main():
|
|
|
16
16
|
ap.add_argument("-v", "--verbose", required= False, help= "Print debug information", action= "store_true")
|
|
17
17
|
ap.add_argument("-f", "--format", required= False, help= "Specify the short or long name of Sw-C. [short|long]")
|
|
18
18
|
ap.add_argument("--filter", required= False, help = "Set the filter condition. [CompositionSwComponent]")
|
|
19
|
-
ap.add_argument("
|
|
19
|
+
ap.add_argument("INPUT", help = "The path of AUTOSAR XML", nargs='+')
|
|
20
20
|
|
|
21
21
|
args = ap.parse_args()
|
|
22
22
|
|
|
@@ -49,7 +49,7 @@ def main():
|
|
|
49
49
|
logger.addHandler(stdout_handler)
|
|
50
50
|
|
|
51
51
|
try:
|
|
52
|
-
parser = InputFileParser(args.
|
|
52
|
+
parser = InputFileParser(args.INPUT)
|
|
53
53
|
filenames = parser.parse()
|
|
54
54
|
|
|
55
55
|
document = AUTOSAR().getInstance()
|
|
File without changes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class SwConnectorData:
|
|
2
|
+
def __init__(self) -> None:
|
|
3
|
+
self.short_name = ""
|
|
4
|
+
|
|
5
|
+
class DelegationSwConnectorData(SwConnectorData):
|
|
6
|
+
def __init__(self) -> None:
|
|
7
|
+
super().__init__()
|
|
8
|
+
|
|
9
|
+
self.inner_swc = ""
|
|
10
|
+
self.inner_pport = ""
|
|
11
|
+
self.inner_rport = ""
|
|
12
|
+
self.outer_pport = ""
|
|
13
|
+
self.outer_rport = ""
|
|
14
|
+
|
|
15
|
+
class AssemblySwConnectorData(SwConnectorData):
|
|
16
|
+
def __init__(self) -> None:
|
|
17
|
+
super().__init__()
|
|
18
|
+
|
|
19
|
+
self.provider_swc= ""
|
|
20
|
+
self.pport = ""
|
|
21
|
+
self.requester_swc = ""
|
|
22
|
+
self.rport = ""
|
armodel/lib/__init__.py
CHANGED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from typing import List
|
|
4
|
+
from ..models import AUTOSAR, ARPackage, AtomicSwComponentType, CompositionSwComponentType
|
|
5
|
+
|
|
6
|
+
class SwComponentAnalyzer:
|
|
7
|
+
def __init__(self) -> None:
|
|
8
|
+
self.swcs = [] # type: List[AtomicSwComponentType]
|
|
9
|
+
|
|
10
|
+
def parse_pkg(self, parent: ARPackage):
|
|
11
|
+
for pkg in parent.getARPackages():
|
|
12
|
+
self.parse_pkg(pkg)
|
|
13
|
+
for swc in parent.getSwComponentTypes():
|
|
14
|
+
self.swcs.append(swc)
|
|
15
|
+
|
|
16
|
+
def import_data(self, document: AUTOSAR):
|
|
17
|
+
for pkg in document.getARPackages():
|
|
18
|
+
self.parse_pkg(pkg)
|
|
19
|
+
|
|
20
|
+
def print_out(self, option = {}):
|
|
21
|
+
logger = logging.getLogger()
|
|
22
|
+
|
|
23
|
+
logger.info("== SW-C LIST ==")
|
|
24
|
+
|
|
25
|
+
if option['filter'] == 'CompositionSwComponent':
|
|
26
|
+
swc_list = filter(lambda o: isinstance(o, CompositionSwComponentType), self.swcs)
|
|
27
|
+
else:
|
|
28
|
+
swc_list = self.swcs
|
|
29
|
+
|
|
30
|
+
for swc in sorted(swc_list, key = lambda o: o.short_name):
|
|
31
|
+
if option['format'] == 'long':
|
|
32
|
+
logger.info("%s" % swc.full_name)
|
|
33
|
+
else:
|
|
34
|
+
logger.info("%s" % swc.short_name)
|
armodel/models/__init__.py
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
from .annotation import *
|
|
2
|
+
from .ar_object import *
|
|
1
3
|
from .general_structure import *
|
|
2
4
|
from .common_structure import *
|
|
3
5
|
from .sw_component import *
|
|
4
|
-
from .ar_package import
|
|
6
|
+
from .ar_package import *
|
|
5
7
|
from .ar_ref import *
|
|
6
8
|
from .datatype import *
|
|
7
9
|
from .port_prototype import *
|
|
@@ -10,4 +12,8 @@ from .data_dictionary import *
|
|
|
10
12
|
from .port_interface import *
|
|
11
13
|
from .m2_msr import *
|
|
12
14
|
from .implementation import *
|
|
13
|
-
from .bsw_module_template import *
|
|
15
|
+
from .bsw_module_template import *
|
|
16
|
+
from .communication import *
|
|
17
|
+
from .calibration import *
|
|
18
|
+
from .global_constraints import *
|
|
19
|
+
from .unit import *
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
|
|
2
|
+
from abc import ABCMeta
|
|
3
|
+
|
|
4
|
+
from .multilanguage_data import MultilanguageLongName
|
|
5
|
+
from .ar_object import ARObject
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class GeneralAnnotation(ARObject, metaclass=ABCMeta):
|
|
9
|
+
def __init__(self):
|
|
10
|
+
if type(self) == ARObject:
|
|
11
|
+
raise NotImplementedError("GeneralAnnotation is an abstract class.")
|
|
12
|
+
|
|
13
|
+
self.label = None # type: MultilanguageLongName
|
|
14
|
+
|
|
15
|
+
super().__init__()
|
|
16
|
+
|
|
17
|
+
class Annotation(GeneralAnnotation):
|
|
18
|
+
def __init__(self):
|
|
19
|
+
super().__init__()
|
|
20
|
+
|
armodel/models/ar_object.py
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
from abc import ABCMeta
|
|
2
|
+
import re
|
|
3
|
+
from typing import Dict, List
|
|
4
|
+
|
|
5
|
+
import xml.etree.cElementTree as ET
|
|
6
|
+
|
|
2
7
|
|
|
3
8
|
class ARObject(metaclass=ABCMeta):
|
|
4
9
|
def __init__(self):
|
|
@@ -7,4 +12,183 @@ class ARObject(metaclass=ABCMeta):
|
|
|
7
12
|
|
|
8
13
|
self.parent = None # type: ARObject
|
|
9
14
|
self.checksum = None # type: str
|
|
15
|
+
|
|
10
16
|
self.timestamp = None # type: str
|
|
17
|
+
self.uuid = None # type: str
|
|
18
|
+
|
|
19
|
+
def getTagName(self, tag: str, nsmap: Dict) -> str:
|
|
20
|
+
return tag.replace("{%s}" % nsmap["xmlns"], "")
|
|
21
|
+
|
|
22
|
+
class ARType(metaclass=ABCMeta):
|
|
23
|
+
def __init__(self) -> None:
|
|
24
|
+
self.timestamp = None # type: str
|
|
25
|
+
self.uuid = None # type: str
|
|
26
|
+
self._value = None
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def value(self):
|
|
30
|
+
return self._value
|
|
31
|
+
|
|
32
|
+
@value.setter
|
|
33
|
+
def value(self, val):
|
|
34
|
+
self._value = val
|
|
35
|
+
|
|
36
|
+
def getValue(self):
|
|
37
|
+
return self.value
|
|
38
|
+
|
|
39
|
+
def setValue(self, val):
|
|
40
|
+
self.value = val
|
|
41
|
+
|
|
42
|
+
def getText(self) -> str:
|
|
43
|
+
return str(self)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ARLiteral(ARType):
|
|
47
|
+
def __init__(self) -> None:
|
|
48
|
+
super().__init__()
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def value(self) -> str:
|
|
52
|
+
if self._value is None:
|
|
53
|
+
return ""
|
|
54
|
+
return self._value
|
|
55
|
+
|
|
56
|
+
@value.setter
|
|
57
|
+
def value(self, val: any):
|
|
58
|
+
if isinstance(val, str):
|
|
59
|
+
self._value = val
|
|
60
|
+
else:
|
|
61
|
+
self._value = str(val)
|
|
62
|
+
|
|
63
|
+
def __str__(self) -> str:
|
|
64
|
+
return self.value
|
|
65
|
+
|
|
66
|
+
def upper(self) -> str:
|
|
67
|
+
return self.value.upper()
|
|
68
|
+
|
|
69
|
+
class ARNumerical(ARType):
|
|
70
|
+
def __init__(self) -> None:
|
|
71
|
+
super().__init__()
|
|
72
|
+
|
|
73
|
+
self._text = None # type: str
|
|
74
|
+
|
|
75
|
+
def _convertStringToNumberValue(self, value: str) -> int:
|
|
76
|
+
m = re.match(r"0x([0-9a-f]+)", value, re.I)
|
|
77
|
+
if (m):
|
|
78
|
+
return int(m.group(1), 16)
|
|
79
|
+
return int(value)
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def value(self) -> int:
|
|
83
|
+
return self._value
|
|
84
|
+
|
|
85
|
+
@value.setter
|
|
86
|
+
def value(self, val: any):
|
|
87
|
+
if isinstance(val, int):
|
|
88
|
+
self._value = val
|
|
89
|
+
elif isinstance(val, str):
|
|
90
|
+
self._text = val
|
|
91
|
+
self._value = self._convertStringToNumberValue(val)
|
|
92
|
+
else:
|
|
93
|
+
raise ValueError("Unsupported Type <%s>", type(val))
|
|
94
|
+
|
|
95
|
+
def __str__(self) -> str:
|
|
96
|
+
if self._text is not None:
|
|
97
|
+
return self._text
|
|
98
|
+
else:
|
|
99
|
+
return str(self._value)
|
|
100
|
+
|
|
101
|
+
class ARPositiveInteger(ARNumerical):
|
|
102
|
+
def __init__(self) -> None:
|
|
103
|
+
super().__init__()
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def value(self) -> int:
|
|
107
|
+
return self._value
|
|
108
|
+
|
|
109
|
+
@value.setter
|
|
110
|
+
def value(self, val: any):
|
|
111
|
+
if isinstance(val, int):
|
|
112
|
+
if val < 0:
|
|
113
|
+
raise ValueError("Invalid Positive Integer <%s>" % val)
|
|
114
|
+
self._value = val
|
|
115
|
+
elif isinstance(val, str):
|
|
116
|
+
self._text = val
|
|
117
|
+
self._value = self._convertStringToNumberValue(val)
|
|
118
|
+
else:
|
|
119
|
+
raise ValueError("Unsupported Type <%s>", type(val))
|
|
120
|
+
|
|
121
|
+
class ARFloat(ARType):
|
|
122
|
+
def __init__(self) -> None:
|
|
123
|
+
super().__init__()
|
|
124
|
+
|
|
125
|
+
self._text = None # type: str
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def value(self) -> float:
|
|
129
|
+
return self._value
|
|
130
|
+
|
|
131
|
+
@value.setter
|
|
132
|
+
def value(self, val: any):
|
|
133
|
+
if isinstance(val, float):
|
|
134
|
+
self._value = val
|
|
135
|
+
elif isinstance(val, int):
|
|
136
|
+
self._value = val * 1.0
|
|
137
|
+
elif isinstance(val, str):
|
|
138
|
+
self._text = val
|
|
139
|
+
self._value = float(val)
|
|
140
|
+
else:
|
|
141
|
+
raise ValueError("Unsupported Type <%s>", type(val))
|
|
142
|
+
|
|
143
|
+
def __str__(self) -> str:
|
|
144
|
+
if self._text is not None:
|
|
145
|
+
return self._text
|
|
146
|
+
else:
|
|
147
|
+
return str(self._value)
|
|
148
|
+
|
|
149
|
+
class ARBoolean(ARType):
|
|
150
|
+
def __init__(self) -> None:
|
|
151
|
+
super().__init__()
|
|
152
|
+
|
|
153
|
+
self._text = None
|
|
154
|
+
|
|
155
|
+
def _convertNumberToBoolean(self, value: int) -> bool:
|
|
156
|
+
if value == 0:
|
|
157
|
+
return False
|
|
158
|
+
return True
|
|
159
|
+
|
|
160
|
+
def _convertStringToBoolean(self, value: str) -> bool:
|
|
161
|
+
value = value.lower()
|
|
162
|
+
if value == "true":
|
|
163
|
+
return True
|
|
164
|
+
elif value == "false":
|
|
165
|
+
return False
|
|
166
|
+
else:
|
|
167
|
+
return self._convertNumberToBoolean(int(value))
|
|
168
|
+
|
|
169
|
+
@property
|
|
170
|
+
def value(self) -> int:
|
|
171
|
+
return self._value
|
|
172
|
+
|
|
173
|
+
@value.setter
|
|
174
|
+
def value(self, val: any):
|
|
175
|
+
if isinstance(val, bool):
|
|
176
|
+
self._value = val
|
|
177
|
+
elif isinstance(val, int):
|
|
178
|
+
self._value = self._convertNumberToBoolean(val)
|
|
179
|
+
self._text = str(val)
|
|
180
|
+
elif isinstance(val, str):
|
|
181
|
+
self._text = val
|
|
182
|
+
self._value = self._convertStringToBoolean(val)
|
|
183
|
+
else:
|
|
184
|
+
raise ValueError("Unsupported Type <%s>", type(val))
|
|
185
|
+
|
|
186
|
+
def __str__(self) -> str:
|
|
187
|
+
if self._text is not None:
|
|
188
|
+
return self._text
|
|
189
|
+
else:
|
|
190
|
+
if self._value:
|
|
191
|
+
return "true"
|
|
192
|
+
else:
|
|
193
|
+
return "false"
|
|
194
|
+
|