Skip to content

Commit 74f0112

Browse files
committed
ENH: Hacky mixin to make surface CaretDataFiles implement TriangularMesh
1 parent f712dfc commit 74f0112

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

nibabel/cifti2/caretspec.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@
1717
[1]: https://groups.google.com/a/humanconnectome.org/g/hcp-users/c/EGuwdaTVFuw/m/tg7a_-7mAQAJ
1818
"""
1919
import xml.etree.ElementTree as et
20+
from urllib.parse import urlparse
2021

21-
from .. import xmlutils as xml
22-
from ..caret import CaretMetaData
22+
import nibabel as nb
23+
from nibabel import pointset as ps
24+
from nibabel import xmlutils as xml
25+
from nibabel.caret import CaretMetaData
2326

2427

2528
class CaretSpecDataFile(xml.XmlSerializable):
@@ -56,6 +59,9 @@ def __init__(self, structure=None, data_file_type=None, selected=None, uri=None)
5659
self.selected = selected
5760
self.uri = uri
5861

62+
if data_file_type == 'SURFACE':
63+
self.__class__ = SurfaceDataFile
64+
5965
def _to_xml_element(self):
6066
data_file = xml.Element('DataFile')
6167
data_file.attrib['Structure'] = str(self.structure)
@@ -68,6 +74,35 @@ def __repr__(self):
6874
return self.to_xml().decode()
6975

7076

77+
class SurfaceDataFile(ps.TriangularMesh, CaretSpecDataFile):
78+
_gifti = None
79+
_coords = None
80+
_triangles = None
81+
82+
def _get_gifti(self):
83+
if self._gifti is None:
84+
parts = urlparse(self.uri)
85+
if parts.scheme == 'file':
86+
self._gifti = nb.load(parts.path)
87+
elif parts.scheme == '':
88+
self._gifti = nb.load(self.uri)
89+
else:
90+
self._gifti = nb.GiftiImage.from_url(self.uri)
91+
return self._gifti
92+
93+
def get_triangles(self, name=None):
94+
if self._triangles is None:
95+
gifti = self._get_gifti()
96+
self._triangles = gifti.agg_data('triangle')
97+
return self._triangles
98+
99+
def get_coords(self, name=None):
100+
if self._coords is None:
101+
gifti = self._get_gifti()
102+
self._coords = gifti.agg_data('pointset')
103+
return self._coords
104+
105+
71106
class CaretSpecFile(xml.XmlSerializable):
72107
"""Class for CaretSpecFile XML documents
73108

0 commit comments

Comments
 (0)