9
9
from .element import IdentifiableElement
10
10
from .exceptions import odxrequire
11
11
from .nameditemlist import NamedItemList
12
- from .odxlink import OdxDocFragment , OdxLinkDatabase , OdxLinkId , OdxLinkRef
12
+ from .odxlink import OdxDocFragment , OdxLinkDatabase , OdxLinkId , OdxLinkRef , resolve_snref
13
13
from .odxtypes import odxstr_to_bool
14
14
from .snrefcontext import SnRefContext
15
15
from .specialdatagroup import SpecialDataGroup
16
16
from .swvariable import SwVariable
17
+ from .table import Table
18
+ from .tablerow import TableRow
17
19
from .utils import dataclass_fields_asdict
18
20
from .variablegroup import VariableGroup
19
21
@@ -32,15 +34,30 @@ class DiagVariable(IdentifiableElement):
32
34
"""
33
35
34
36
admin_data : Optional [AdminData ]
35
- variable_group_ref : OdxLinkRef
37
+ variable_group_ref : Optional [ OdxLinkRef ]
36
38
sw_variables : List [SwVariable ]
39
+
40
+ # a diag variable must specify either COMM-RELATIONS or a
41
+ # reference to a table row
37
42
comm_relations : List [CommRelation ]
38
- #snref_to_tablerow: Optional[SnrefToTableRow] # TODO
43
+
44
+ # these are nested inside the SNREF-TO-TABLEROW tag
45
+ table_snref : Optional [str ]
46
+ table_row_snref : Optional [str ]
47
+
39
48
sdgs : List [SpecialDataGroup ]
40
49
is_read_before_write_raw : Optional [bool ]
41
50
42
51
@property
43
- def variable_group (self ) -> VariableGroup :
52
+ def table (self ) -> Optional [Table ]:
53
+ return self ._table
54
+
55
+ @property
56
+ def table_row (self ) -> Optional [TableRow ]:
57
+ return self ._table_row
58
+
59
+ @property
60
+ def variable_group (self ) -> Optional [VariableGroup ]:
44
61
return self ._variable_group
45
62
46
63
@property
@@ -52,8 +69,7 @@ def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) ->
52
69
kwargs = dataclass_fields_asdict (IdentifiableElement .from_et (et_element , doc_frags ))
53
70
54
71
admin_data = AdminData .from_et (et_element .find ("ADMIN-DATA" ), doc_frags )
55
- variable_group_ref = odxrequire (
56
- OdxLinkRef .from_et (et_element .find ("VARIABLE-GROUP-REF" ), doc_frags ))
72
+ variable_group_ref = OdxLinkRef .from_et (et_element .find ("VARIABLE-GROUP-REF" ), doc_frags )
57
73
sw_variables = NamedItemList ([
58
74
SwVariable .from_et (swv_elem , doc_frags )
59
75
for swv_elem in et_element .iterfind ("SW-VARIABLES/SW-VARIABLE" )
@@ -62,6 +78,16 @@ def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) ->
62
78
CommRelation .from_et (cr_elem , doc_frags )
63
79
for cr_elem in et_element .iterfind ("COMM-RELATIONS/COMM-RELATION" )
64
80
]
81
+
82
+ table_snref = None
83
+ table_row_snref = None
84
+ if (snref_to_tablerow_elem := et_element .find ("SNREF-TO-TABLEROW" )) is not None :
85
+ table_snref_elem = odxrequire (snref_to_tablerow_elem .find ("TABLE-SNREF" ))
86
+ table_snref = odxrequire (table_snref_elem .attrib .get ("SHORT-NAME" ))
87
+
88
+ table_row_snref_elem = odxrequire (snref_to_tablerow_elem .find ("TABLE-ROW-SNREF" ))
89
+ table_row_snref = odxrequire (table_row_snref_elem .attrib .get ("SHORT-NAME" ))
90
+
65
91
sdgs = [
66
92
SpecialDataGroup .from_et (sdge , doc_frags ) for sdge in et_element .iterfind ("SDGS/SDG" )
67
93
]
@@ -72,6 +98,8 @@ def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) ->
72
98
variable_group_ref = variable_group_ref ,
73
99
sw_variables = sw_variables ,
74
100
comm_relations = comm_relations ,
101
+ table_snref = table_snref ,
102
+ table_row_snref = table_row_snref ,
75
103
sdgs = sdgs ,
76
104
is_read_before_write_raw = is_read_before_write_raw ,
77
105
** kwargs )
@@ -91,7 +119,9 @@ def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
91
119
return result
92
120
93
121
def _resolve_odxlinks (self , odxlinks : OdxLinkDatabase ) -> None :
94
- self ._variable_group = odxlinks .resolve (self .variable_group_ref , VariableGroup )
122
+ self ._variable_group = None
123
+ if self .variable_group_ref is not None :
124
+ self ._variable_group = odxlinks .resolve (self .variable_group_ref , VariableGroup )
95
125
96
126
if self .admin_data is not None :
97
127
self .admin_data ._resolve_odxlinks (odxlinks )
@@ -111,3 +141,11 @@ def _resolve_snrefs(self, context: SnRefContext) -> None:
111
141
112
142
for cr in self .comm_relations :
113
143
cr ._resolve_snrefs (context )
144
+
145
+ self ._table = None
146
+ self ._table_row = None
147
+ if self .table_snref is not None :
148
+ ddds = odxrequire (context .diag_layer ).diag_data_dictionary_spec
149
+ self ._table = resolve_snref (self .table_snref , ddds .tables , Table )
150
+ self ._table_row = resolve_snref (
151
+ odxrequire (self .table_row_snref ), self ._table .table_rows , TableRow )
0 commit comments