@@ -62,8 +62,23 @@ class _DiagramDescriptor(t.NamedTuple):
6262 target : etree ._Element
6363
6464
65+ def _iter_views (model : loader .Loader , / ) -> cabc .Iterator :
66+ # cf. C.XP_VIEWS
67+ for tree in model .trees .values ():
68+ if tree .fragment_type != loader .FragmentType .VISUAL :
69+ continue
70+ if tree .root .tag == helpers .TAG_XMI :
71+ roots = tree .root .iterchildren ()
72+ else :
73+ roots = iter ([tree .root ])
74+ for root in roots :
75+ if root .tag != f"{{{ _n .NAMESPACES ['viewpoint' ]} }}DAnalysis" :
76+ continue
77+ yield from root .iterchildren ("ownedViews" )
78+
79+
6580def enumerate_descriptors (
66- model : loader .MelodyLoader ,
81+ model : loader .Loader ,
6782 * ,
6883 viewpoint : str | None = None ,
6984) -> cabc .Iterator [DRepresentationDescriptor ]:
@@ -77,7 +92,7 @@ def enumerate_descriptors(
7792 Only return diagrams of the given viewpoint. If not given, all
7893 diagrams are returned.
7994 """
80- for view in model . xpath ( C . XP_VIEWS ):
95+ for view in _iter_views ( model ):
8196 if viewpoint and _viewpoint_of (view ) != viewpoint :
8297 continue
8398
@@ -89,7 +104,7 @@ def enumerate_descriptors(
89104 raise RuntimeError (
90105 f"Malformed diagram reference: { rep_path !r} "
91106 )
92- diag_root = model [ rep_path ]
107+ diag_root = model . follow_link ( d , rep_path )
93108 if diag_root .tag not in DIAGRAM_ROOTS :
94109 continue
95110
@@ -130,12 +145,12 @@ def parse_diagrams(
130145
131146
132147def _build_descriptor (
133- model : loader .MelodyLoader ,
148+ model : loader .Loader ,
134149 descriptor : DRepresentationDescriptor ,
135150) -> _DiagramDescriptor :
136151 assert isinstance (descriptor , etree ._Element )
137152
138- diag_root = model [ descriptor .attrib ["repPath" ]]
153+ diag_root = model . follow_link ( descriptor , descriptor .attrib ["repPath" ])
139154 styleclass = get_styleclass (descriptor )
140155 target = find_target (model , descriptor )
141156
@@ -151,7 +166,7 @@ def _build_descriptor(
151166
152167
153168def find_target (
154- model : loader .MelodyLoader , descriptor : DRepresentationDescriptor
169+ model : loader .Loader , descriptor : DRepresentationDescriptor
155170) -> etree ._Element :
156171 assert isinstance (descriptor , etree ._Element )
157172 target_anchors = list (descriptor .iterchildren ("target" ))
@@ -180,7 +195,7 @@ def get_styleclass(descriptor: DRepresentationDescriptor) -> str | None:
180195
181196
182197def parse_diagram (
183- model : loader .MelodyLoader ,
198+ model : loader .Loader ,
184199 descriptor : DRepresentationDescriptor ,
185200 ** params : t .Any ,
186201) -> diagram .Diagram :
@@ -255,7 +270,11 @@ def parse_diagram(
255270def _element_from_xml (ebd : C .ElementBuilder ) -> diagram .DiagramElement :
256271 """Construct a single diagram element from the model XML."""
257272 element = ebd .data_element .get ("element" )
258- tag = ebd .melodyloader [element ].tag if element else None
273+ tag = (
274+ ebd .melodyloader .follow_link (ebd .data_element , element ).tag
275+ if element
276+ else None
277+ )
259278 if element is not None and tag != "ownedRepresentationDescriptors" :
260279 factory = _semantic .from_xml
261280 else :
@@ -264,7 +283,7 @@ def _element_from_xml(ebd: C.ElementBuilder) -> diagram.DiagramElement:
264283
265284
266285def iter_visible (
267- model : loader .MelodyLoader ,
286+ model : loader .Loader ,
268287 descriptor : DRepresentationDescriptor ,
269288) -> cabc .Iterator [etree ._Element ]:
270289 r"""Iterate over all semantic elements that are visible in a diagram.
0 commit comments