Skip to content

Commit 992d40b

Browse files
add topology.WithIdentifierTopology
1 parent 186f559 commit 992d40b

File tree

3 files changed

+114
-0
lines changed

3 files changed

+114
-0
lines changed

nutils/topology.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1986,6 +1986,44 @@ def refined(self):
19861986
def basis(self, name, *args, **kwargs):
19871987
return function.asarray([1.])
19881988

1989+
class WithIdentifierTopology(Topology):
1990+
'''A topology that appends an :class:`nutils.transform.Identifier` to the ``transforms`` and ``opposites`` of another topology.
1991+
1992+
Parameters
1993+
----------
1994+
parent : :class:`Topology`
1995+
The parent topology.
1996+
token : :class:`object`
1997+
An immutable token that will be used to create the
1998+
:class:`nutils.transform.Identifier`.
1999+
'''
2000+
2001+
@types.apply_annotations
2002+
def __init__(self, parent:stricttopology, token):
2003+
self._parent = parent
2004+
self._token = token
2005+
super().__init__(parent.references,
2006+
transformseq.WithIdentifierTransforms(parent.transforms, token),
2007+
transformseq.WithIdentifierTransforms(parent.opposites, token))
2008+
2009+
def basis(self, *args, **kwargs):
2010+
return function.WithTransformsBasis(self._parent.basis(*args, **kwargs), self.transforms)
2011+
2012+
@property
2013+
def refined(self):
2014+
return WithIdentifierTopology(self._parent.refined, self._token)
2015+
2016+
@property
2017+
def boundary(self):
2018+
return WithIdentifierTopology(self._parent.boundary, self._token)
2019+
2020+
@property
2021+
def interfaces(self):
2022+
return WithIdentifierTopology(self._parent.interfaces, self._token)
2023+
2024+
def getitem(self, item):
2025+
return WithIdentifierTopology(self._parent.getitem(item), self._token)
2026+
19892027
class PatchBoundary(types.Singleton):
19902028

19912029
__slots__ = 'id', 'dim', 'side', 'reverse', 'transpose'

nutils/transformseq.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,72 @@ def index_with_tail(self, trans):
807807
iderived = self._derived_transforms.index(tail[0])
808808
return iparent*len(self._derived_transforms) + iderived, tail[1:]
809809

810+
class WithIdentifierTransforms(Transforms):
811+
'''A sequence that appends a :class:`nutils.transform.Identifier` to all transforms of another sequence.
812+
813+
Parameters
814+
----------
815+
parent : :class:`Transforms`
816+
The parent transforms.
817+
token : :class:`object`
818+
An immutable token that will be used to create the
819+
:class:`nutils.transform.Identifier`.
820+
'''
821+
822+
@types.apply_annotations
823+
def __init__(self, parent:stricttransforms, token):
824+
self._parent = parent
825+
self._token = token
826+
super().__init__(parent.fromdims)
827+
828+
def __len__(self):
829+
return len(self._parent)
830+
831+
def __getitem__(self, index):
832+
parent_trans = self._parent[index]
833+
if isinstance(parent_trans, Transforms):
834+
return WithIdentifierTransforms(parent_trans, self._token)
835+
else:
836+
return parent_trans + (transform.Identifier(parent_trans[-1].fromdims, self._token),)
837+
838+
def __iter__(self):
839+
for parent_trans in self._parent:
840+
yield parent_trans + (transform.Identifier(parent_trans[-1].fromdims, self._token),)
841+
842+
def _remove_identifier(self, trans):
843+
if not trans:
844+
raise ValueError
845+
for i, item in enumerate(trans):
846+
if isinstance(item, transform.Identifier) and item.token == self._token:
847+
return trans[:i] + trans[i+1:]
848+
raise ValueError
849+
850+
def index_with_tail(self, trans):
851+
return self._parent.index_with_tail(self._remove_identifier(trans))
852+
853+
def index(self, trans):
854+
return self._parent.index(self._remove_identifier(trans))
855+
856+
def contains_with_tail(self, trans):
857+
try:
858+
head = self._remove_identifier(trans)
859+
except ValueError:
860+
return False
861+
return self._parent.contains_with_tail(head)
862+
863+
def contains(self, trans):
864+
try:
865+
head = self._remove_identifier(trans)
866+
except ValueError:
867+
return False
868+
return self._parent.contains(head)
869+
870+
def refined(self, references):
871+
return WithIdentifierTransforms(self._parent.refined(references), self._token)
872+
873+
def edges(self, references):
874+
return WithIdentifierTransforms(self._parent.edges(references), self._token)
875+
810876
class ProductTransforms(Transforms):
811877
'''The product of two :class:`Transforms` objects.
812878

tests/test_transformseq.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,16 @@ def setUp(self):
216216
self.checkrefs = nutils.elementseq.asreferences([line]*4, 1)
217217
self.checkfromdims = 1
218218

219+
class WithIdentifierTransforms(TestCase, Common, Edges):
220+
def setUp(self):
221+
parent = nutils.transformseq.PlainTransforms([(x1,s0),(x1,s1),(x1,s2),(x1,s3)], fromdims=1)
222+
self.seq = nutils.transformseq.WithIdentifierTransforms(parent, 'token')
223+
token = nutils.transform.Identifier(1, 'token')
224+
self.check = (x1,s0,token),(x1,s1,token),(x1,s2,token),(x1,s3,token)
225+
self.checkmissing = (x1,s0,nutils.transform.Identifier(1, 'other')),
226+
self.checkrefs = nutils.elementseq.asreferences([line]*4, 1)
227+
self.checkfromdims = 1
228+
219229
class ChainedTransforms(TestCase, Common, Edges):
220230
def setUp(self):
221231
self.seq = nutils.transformseq.ChainedTransforms([nutils.transformseq.PlainTransforms([(x1,s0),(x1,s1)], fromdims=1), nutils.transformseq.PlainTransforms([(x1,s2),(x1,s3)], fromdims=1)])

0 commit comments

Comments
 (0)