2121ConstraintKinds = Literal ["Plane" , "Point" , "Axis" ]
2222ExportLiterals = Literal ["STEP" , "XML" ]
2323
24+ PATH_DELIM = "/"
25+
2426# enitity selector grammar definiiton
2527def _define_grammar ():
2628
27- from pyparsing import Literal as Literal , Word , Optional , alphas , alphanums
29+ from pyparsing import (
30+ Literal as Literal ,
31+ Word ,
32+ Optional ,
33+ alphas ,
34+ alphanums ,
35+ delimitedList ,
36+ )
2837
2938 Separator = Literal ("@" ).suppress ()
3039 TagSeparator = Literal ("?" ).suppress ()
3140
32- Name = Word (alphas , alphanums + "_" ).setResultsName ("name" )
41+ Name = delimitedList (
42+ Word (alphas , alphanums + "_" ), PATH_DELIM , combine = True
43+ ).setResultsName ("name" )
3344 Tag = Word (alphas , alphanums + "_" ).setResultsName ("tag" )
3445 Selector = _selector_grammar .setResultsName ("selector" )
3546
@@ -234,6 +245,11 @@ def add(self, arg, **kwargs):
234245
235246 if isinstance (arg , Assembly ):
236247
248+ # enforce unique names
249+ name = kwargs ["name" ] if kwargs .get ("name" ) else arg .name
250+ if name in self .objects :
251+ raise ValueError ("Unique name is required" )
252+
237253 subassy = arg ._copy ()
238254
239255 subassy .loc = kwargs ["loc" ] if kwargs .get ("loc" ) else arg .loc
@@ -242,11 +258,10 @@ def add(self, arg, **kwargs):
242258 subassy .parent = self
243259
244260 self .children .append (subassy )
245- self .objects [subassy .name ] = subassy
246- self .objects .update (subassy .objects )
261+ self .objects .update (subassy ._flatten ())
247262
248263 else :
249- assy = Assembly (arg , ** kwargs )
264+ assy = self . __class__ (arg , ** kwargs )
250265 assy .parent = self
251266
252267 self .add (assy )
@@ -454,3 +469,17 @@ def traverse(self) -> Iterator[Tuple[str, "Assembly"]]:
454469 yield el
455470
456471 yield (self .name , self )
472+
473+ def _flatten (self , parents = []):
474+ """
475+ Generate a dict with all ancestors with keys indicating parent-child relations.
476+ """
477+
478+ rv = {}
479+
480+ for ch in self .children :
481+ rv .update (ch ._flatten (parents = parents + [self .name ]))
482+
483+ rv [PATH_DELIM .join (parents + [self .name ])] = self
484+
485+ return rv
0 commit comments